Java HTTP 요청은 SOCKS를 통해 동작하지만, UDP 기능은 여전히 트래픽을 직접 보내거나 실패합니다. JVM의 SOCKS 속성을 설정해도 DatagramSocket에 SOCKS5 UDP 구현이 생기지는 않습니다.

DatagramSocket API는 네트워크 엔드포인트로 주소가 지정된 데이터그램을 보내고 받습니다. 그 connect() 메서드는 해당 소켓의 상대를 선택합니다. 상대와 SOCKS 협상을 수행하지는 않습니다.

SOCKS5 UDP 경로에는 추가 작업이 필요합니다

SOCKS5는 TCP 제어 연결 위에 설정되는 UDP 연관을 정의합니다. 그런 다음 클라이언트는 프록시가 제공한 릴레이 주소와 캡슐화된 데이터그램을 주고받습니다. 캡슐화된 각 메시지는 목적지를 식별합니다. 클라이언트 구현은 그 프레이밍과 제어 연결의 수명을 처리해야 합니다.

일반 UDP 소켓을 프록시의 TCP 수신 포트로 향하게 하면 그 단계들을 건너뜁니다. 애플리케이션의 원시 데이터그램을 그 주소로 보내는 것은 연관을 대신하지 못합니다.

SOCKS5 UDP 릴레이를 명시적으로 지원하는 라이브러리나 애플리케이션 기능을 선택하고, 서버도 이를 지원하는지 확인하십시오. SOCKS 지원을 내세우는 라이브러리가 TCP CONNECT만 구현했을 수 있습니다. 프로토콜 명세는 이 명령들을 구분합니다.

UDP 릴레이에는 사용 가능한 경로도 필요합니다

프록시로의 TCP 연결 성공은 제어 경로만 설정합니다. 방화벽이나 NAT 동작은 릴레이로 보내는 데이터그램을 여전히 방해할 수 있습니다. 애플리케이션 목적지가 오프라인이라고 결론짓기 전에 반환된 릴레이 엔드포인트와 모든 릴레이 오류를 수집하십시오.

마지막으로 SOCKS 전송 지원은 UDP에 전달 보장을 추가하지 않습니다. 경로가 바뀐 뒤에도 애플리케이션 자체의 타임아웃, 손실 처리, 메시지 크기 제약은 그대로 적용됩니다.

관련 글