지원 스레드는 “대칭형 NAT이니 여기서 VPN은 동작하지 않는다”는 단정으로 끝나고, 그다음 클라이언트가 이유 없이 세 번 재설치된다. 이 라벨은 아무도 묻지 않은 질문에 답하기 때문에 해롭다. 고정 서버로 외부 연결을 하는 클라이언트는 첫 패킷을 보내는 순간 매핑을 만들고, 응답은 거의 모든 네트워크가 구현하는 규칙에 따라 되돌아오도록 허용된다. 엔드포인트 의존 매핑이 실제로 복잡하게 만드는 것은 두 피어가 동시에 서로에게 도달하려는 경우이며, 그것은 다른 시험이다.

하나의 라벨 뒤에 두 가지 질문이 숨어 있다

첫 번째 질문은 이 네트워크 뒤의 호스트가 알려진 공인 주소와 포트로 세션을 열 수 있는가이다. 터널 클라이언트에게 그것은 정상적인 경우이고, 답은 거의 항상 예이다. 라우터는 내부 출발지를 기록하고 외부 포트를 할당하며, 응답이 내부에서 시작된 세션에 속하므로 통과시킨다.

두 번째 질문은 서로 다른 네트워크 뒤의 두 호스트가 중간에 서버 없이 공통 경로를 찾아 서로에게 보낼 수 있는가이다. 그것은 각 네트워크가 그 외부 포트를 어떻게 할당하는지에 달려 있고, 매핑 동작이 중요해지는 곳은 거기뿐이다.

둘을 혼동하면 전형적인 오진이 생긴다: 피어 투 피어 기능이 실패하고, 누군가 NAT 유형 시험을 돌리고, 최악의 분류를 본 뒤 일반 터널도 동작할 수 없다고 결론짓는다. 실패한 것은 터널이 아니었다.

매핑과 필터링은 별개의 속성이다

RFC 용어는 공급업체가 쓰는 이름보다 정확하고, 논쟁을 정리해 주므로 티켓에 옮길 가치가 있다. 매핑은 외부 포트가 어떻게 할당되는가이다. 필터링은 어떤 인바운드 패킷이 통과하도록 허용되는가이다. 한쪽은 엄격하고 다른 쪽은 관대한 네트워크가 있을 수 있고, 그 조합이야말로 피어 투 피어 프로토콜이 견뎌야 하는 것이다.

BehaviourWhat it meansEffect on a direct peer path
Endpoint-independent mappingOne external port for every destinationDiscovery works if the port is advertised
Address-dependent mappingNew port per remote addressWorks only if both sides probe the same pair
Address-and-port-dependentNew port per remote address and portUsually needs a relay

세 번째 행은 대부분의 소비자용 라우터와 이동통신사가 대칭형이라고 부르는 것이다. 라벨은 할당만을 기술한다는 점에 유의하라. 그런 매핑과 관대한 필터링을 가진 네트워크도 방금 할당한 포트로 들어오는 패킷을 여전히 받아들일 수 있어서, 홀 펀칭이 어떤 곳에서는 성공하고 어떤 곳에서는 실패한다.

필터링에는 고유한 세 가지 경우와 각각의 이름이 있다. “주소와 포트 의존 필터링”을 뜻하면서 티켓에 “대칭형 NAT”이라고 적으면 다음 사람을 설명서의 잘못된 장으로 보내게 된다. 둘은 시험에서 다르게 동작하므로 이 실수는 관념적인 것이 아니다.

이름을 붙이지 말고 매핑을 측정하라

통제하는 모든 UDP 서비스의 서버 측에서 할당된 포트를 직접 관찰할 수 있다. 공인 호스트에서 캡처를 시작하고 클라이언트에서 보낸 뒤, 패킷이 도착한 출발지 포트를 읽어라.

sudo tcpdump -ni eth0 -c 10 'udp port 51820'
sudo wg show wg0 endpoints
sudo conntrack -L -p udp --dport 51820

엔드포인트 행은 세 가지 중 가장 유용하다 — WireGuard가 각 피어에게서 마지막으로 받은 주소와 포트를 기록하기 때문이다. 그 포트를 클라이언트가 사용한다고 생각하는 포트와 비교하라. 어떤 변환이든 일어나면 둘은 달라지며, 중요한 질문은 그 값이 안정적으로 유지되는가이다.

두 번째 목적지 포트나 두 번째 서버를 상대로 관찰을 반복하고 다시 비교하라. 외부 포트가 목적지마다 달라지면 매핑은 주소와 포트에 의존한다. 같은 값으로 남으면 네트워크가 하나의 매핑을 주는 것이고 탐색에는 기회가 있다.

STUN 기반 도구는 같은 분류를 한 단계로 보고하며, 네트워크가 공인 STUN 서버로의 아웃바운드 UDP를 허용할 때 사용해도 된다. 허용하지 않을 때는 위의 캡처 방법이 여전히 동작하고 이미 통제하는 호스트 외에는 아무것도 요구하지 않는다.

실패에 맞는 해결책을 고르라

실패하는 기능이 피어 투 피어라면 지원되는 답은 릴레이, 두 피어가 도달할 수 있는 랑데부 서비스, 또는 다른 토폴로지이다. TURN은 바로 이 때문에 존재하며, 자체 릴레이를 포함한 제품은 일부 네트워크가 적대적일 것을 예상한다고 말해 준다.

실패하는 기능이 일반 터널이라면 매핑 동작은 문제가 아니며 위의 어느 것도 적용되지 않는다. 클라이언트가 실제로 보내는지, 서버가 패킷을 보는지, 응답이 돌아오는지 확인하라. 그 순서는 세 가지 관찰이며 라우터의 NAT 분류를 알 필요가 전혀 없다.

동작하지 않는 것은 무언가 연결될 때까지 로컬 포트 변경을 흩뿌리는 일이다. 클라이언트의 출발지 포트를 바꾸는 것은 네트워크가 매핑을 할당하는 방식을 바꾸지 않는다. 다섯 번째 시도의 우연한 성공은 거짓 양성이며, 몇 달 동안 해결책으로 인용될 것이다.

판정이 아니라 구조를 기록하라

유용한 메모는 어떤 프로토콜인지, 세션이 어느 방향으로 시작되는지, 경로에 릴레이가 있는지, 회선에서 무엇을 관찰했는지를 적는다. “대칭형 NAT이라 동작하지 않는다”는 쓸모없다 — 터널에 대해 틀렸고 동시에 피어 경로에 대해 아무것도 알려주지 않기 때문이다.

시험했다면 측정한 포트 안정성과 필터링 동작을 포함하라. 그 두 사실은 다른 사람이 전체 조사를 반복하지 않고도 새 기능이 그 네트워크에서 동작할지 예측하게 해 준다. 또한 도움말 페이지마다 조금씩 다른 의미를 지니는 공급업체 분류보다 오래 간다.

마지막으로, 이것을 작성할 때 RFC 4787 용어를 손에 두라. 정확한 용어를 쓰는 비용은 문장 하나이며, 다음 독자가 같은 오진을 반복하지 않게 막아 준다 — 메모를 쓰는 목적이 바로 그것이다.

관련 글