앱을 SOCKS 포트로 향하게 하는 것은 브라우저에서는 작동하고 게임에서는 실패하며, 그 이유는 구성이 아닙니다. SOCKS5는 여러 명령을 정의하고 구현은 그중 일부만 지원해도 되지만, Tor의 인터페이스는 스트림 연결과 이름 해석을 받아들이며 임의의 데이터그램 전달은 받지 않습니다. UDP를 보내고 프록시가 중계하기를 기대하는 클라이언트는 서버가 구현하지 않은 명령을 요구하는 것입니다. 아래 절차는 이를 몇 분 안에 확인한 뒤 실제로 작동할 수 있는 전송을 고릅니다.

앱이 실제로 무엇을 보내는지 확인하십시오

프로토콜 이름이 아니라 전송을 식별하는 것에서 시작하십시오. 음성 클라이언트는 HTTPS로 로그인한 뒤 미디어를 UDP로 나를 수 있고, 게임은 TCP로 인증하고 UDP로 플레이할 수 있으며, 파일 전송은 제어에 TCP를, 검색에 UDP를 쓸 수 있습니다. 처음 두 동작은 로그인이 성공해도 통화가 계속 실패할 때까지 똑같아 보이므로 “연결되었다”는 앱 전체가 작동한다는 증거가 아닙니다. 일부 클라이언트는 스스로 UDP에서 TCP로 되돌아가며, 이 때문에 부분적으로 작동하는 세션이 차단된 전송이 아니라 불안정한 네트워크처럼 보입니다.

실패하는 부분에 대해 목적지 포트와 전송을 적어 두십시오. 그 한 줄이 프록시가 애초에 도움이 될 수 있는지 결정합니다.

Tor의 SOCKS 인터페이스가 받아들이는 것

Tor는 스트림 연결을 위해 SOCKS5 CONNECT 명령을, 이름 해석을 위해 확장 명령을 구현하므로 브라우저가 변경 없이 이를 통과합니다. 클라이언트가 데이터그램을 전달을 위해 프록시에 넘길 수 있게 하는 UDP ASSOCIATE는 Tor가 제공하는 것에 포함되지 않습니다. 확장에 대한 문서는 프로젝트의 SOCKS 확장 명세에 있으며 짧습니다. 데이터그램 명령이 없는 것은 의도적이며, 임의의 UDP를 중계하면 네트워크에 설계된 적 없는 전달 역할을 주게 됩니다.

이는 WireGuard에도 같은 답입니다. WireGuard는 설계상 UDP이며 TCP 대체 경로가 없으므로 SOCKS 포트로 향하게 하는 지원 경로는 없고, 그렇다고 주장하는 것은 두 도구 어느 쪽의 기능도 아닌 자체적인 신뢰와 유지 관리 이야기를 가진 래퍼입니다.

OpenVPN은 부분적 예외인데, TCP 위로 터널링하도록 구성할 수 있고 SOCKS 프록시 옵션을 이해하기 때문입니다. 그래도 TCP용으로 구성된 서버와 성능 및 지문에 대한 의식적인 결정이 필요하므로 호환성 수정이 아니라 설계 선택입니다.

점검을 순서대로 실행하십시오

먼저 프록시가 스트림에 대해 작동하는지 확인하여 나중의 실패가 도달할 수 없는 포트 탓으로 돌아가지 않게 하십시오. 그다음 앱 자체의 트래픽을 확인하고 실제로 어떤 소켓을 여는지 관찰하십시오.

curl --socks5-hostname 127.0.0.1:9050 -sS https://check.torproject.org/api/ip
ss -tupn | grep 9050
ss -aun | grep -E ':(3478|5060|27015)\b'

첫 명령이 성공하고 둘째 줄에서 스트림이 성립하면 프록시 경로가 설계대로 작동하는 것입니다. 셋째 명령은 앱에 속한 로컬 데이터그램 소켓을 찾으며, 클라이언트가 그것을 열고 원격 주소로 직접 보낸다면 프록시에 한 번도 묻지 않은 것이고 어떤 프록시 설정도 그것을 바꾸지 못합니다. 첫 단계에서 실패하면 두 결함이 동시에 남아 아무도 조치할 수 없는 보고서가 되므로, 앱을 조사하기 전에 멈추고 프록시 경로를 고치십시오.

되돌리고 올바른 도구를 선택하십시오

UDP 클라이언트를 SOCKS 포트로 향하게 했던 프록시 환경 변수나 앱별 프록시 설정은 남겨 두면 이후 테스트가 모호해지므로 제거하십시오. 복사본에서 이전 구성을 복원하고 앱을 다시 시작하여 원래 동작이 돌아오는지 확인해 비교가 깨끗하게 하십시오. 검증하지 않은 롤백은 상태가 바뀌었다는 희망일 뿐입니다.

UDP로 남아야 하는 전송에는 보통 VPN이 더 적합한데, 앱에 프록시 프로토콜을 말하라고 요구하지 않고 패킷을 나르는 대신 전혀 다른 익명성 속성을 치릅니다. 각 도구는 문서화된 용도로 사용하고 둘 사이의 다리는 자체 검토가 필요한 별도 시스템으로 다루십시오. 최종 보고서에 어느 계층이 어느 전송을 나르는지 적어 두어 다음 사람이 다른 앱으로 같은 경계를 다시 발견하지 않게 하십시오.

관련 글