Java DatagramSocket i przekazywanie UDP przez SOCKS5
Zrozum, dlaczego gniazdo UDP w Javie wymaga implementacji SOCKS5 UDP, nawet gdy połączenia TCP korzystają już z SOCKS.
Twoje żądanie HTTP w Javie działa przez SOCKS, ale funkcja UDP nadal wysyła ruch bezpośrednio lub kończy się niepowodzeniem. Ustawienie właściwości SOCKS maszyny JVM nie daje DatagramSocket implementacji SOCKS5 UDP.
API DatagramSocket wysyła i odbiera datagramy adresowane do punktów końcowych sieci. Jej metoda connect() wybiera partnera dla tego gniazda. Nie prowadzi negocjacji SOCKS z partnerem.
Trasa UDP przez SOCKS5 wymaga dodatkowej pracy
SOCKS5 definiuje skojarzenie UDP ustanawiane przez połączenie sterujące TCP. Następnie klient wymienia hermetyzowane datagramy z adresem przekazywania podanym przez proxy. Każdy hermetyzowany komunikat określa swoje miejsce docelowe. Implementacja klienta musi obsługiwać tę ramkę oraz czas życia połączenia sterującego.
Skierowanie zwykłego gniazda UDP na port nasłuchu TCP proxy pomija te kroki. Wysyłanie surowych datagramów aplikacji na ten adres nie zastępuje skojarzenia.
Wybierz bibliotekę lub funkcję aplikacji, która jawnie obsługuje przekazywanie UDP przez SOCKS5, i potwierdź, że serwer również je obsługuje. Biblioteka reklamująca obsługę SOCKS może implementować tylko TCP CONNECT. Specyfikacja protokołu rozróżnia te polecenia.
Przekazywanie UDP potrzebuje też użytecznej ścieżki
Udane połączenie TCP z proxy ustanawia tylko ścieżkę sterującą. Zapory lub zachowanie NAT nadal mogą zakłócać datagramy wysyłane do przekazywania. Zbierz zwrócony punkt końcowy przekazywania i dowolny błąd przekazywania, zanim uznasz, że miejsce docelowe aplikacji jest offline.
Na koniec obsługa transportu SOCKS nie dodaje gwarancji dostarczania do UDP. Własne limity czasu aplikacji, obsługa strat i ograniczenia rozmiaru komunikatów nadal obowiązują po zmianie trasy.