GN⁺: NAT Traversal 작동 방식 (2020)
(tailscale.com)NAT 트래버설의 작동 원리
-
기본 문제: 두 기계 간의 피어 투 피어 연결을 설정하는 문제를 다룸. Tailscale의 경우, WireGuard® 터널을 설정하고자 함. 이 기술은 WebRTC, VoIP 전화, 비디오 게임 등 다양한 분야에서 사용됨.
-
UDP 기반 프로토콜: NAT 트래버설을 위해 UDP 기반 프로토콜이 필요함. TCP를 사용할 수도 있지만, 복잡성이 증가하고 커널 커스터마이징이 필요할 수 있음.
-
네트워크 소켓의 직접 제어: 네트워크 패킷을 보내고 받는 소켓에 대한 직접 제어가 필요함. 기존 네트워크 라이브러리를 사용하여 NAT를 통과할 수 없음.
-
로컬 프록시 사용: 직접 소켓 액세스가 어려운 경우, 로컬 프록시를 사용하여 NAT 트래버설과 패킷 릴레이를 수행할 수 있음.
방화벽 이해하기
-
상태 저장 방화벽: 대부분의 NAT 장치는 상태 저장 방화벽을 포함하며, 이는 과거에 본 패킷을 기억하고 새로운 패킷 처리에 활용함.
-
UDP 트래픽 규칙: 방화벽은 이전에 본 아웃바운드 패킷과 일치하는 인바운드 UDP 패킷을 허용함.
-
방화벽 대처: 모든 방화벽이 동일한 방향을 향하고 있는 경우, 클라이언트/서버 통신을 재발명한 것과 같음. 그러나 두 클라이언트가 직접 통신하려고 할 때 문제가 발생함.
방화벽 우회
-
방화벽 재구성 없이 해결: 방화벽을 재구성하지 않고도 문제를 해결할 수 있는 방법이 필요함. UDP 패킷이 올바른 소스와 목적지를 가지고 있다면, 응답으로 보이는 패킷은 허용됨.
-
정보 공유: 피어들이 상대방의 ip:port 정보를 사전에 알고 있어야 함. 이를 위해 조정 서버를 사용하여 ip:port 정보를 동기화함.
NAT의 본질
-
NAT 장치: NAT 장치는 패킷을 변경하며, 특히 소스 NAT(SNAT)가 문제를 일으킴. 이는 여러 기기를 인터넷에 연결하기 위해 사용됨.
-
NAT 탐색: NAT 장치가 패킷을 변경하기 때문에, 두 피어가 상대방의 ip:port를 알지 못함. STUN 프로토콜을 사용하여 NAT 탐색을 지원함.
STUN과 NAT 탐색
-
STUN 프로토콜: NAT된 클라이언트가 인터넷의 서버와 통신할 때, 서버는 NAT 장치가 생성한 공용 ip:port를 볼 수 있음. STUN 서버는 클라이언트에게 이 정보를 제공함.
-
제한 사항: STUN은 일부 경우에만 작동하며, 특히 보안 장치로 광고되는 NAT 게이트웨이에서는 실패할 가능성이 높음.
추가적인 해결책
-
릴레이 사용: 직접 연결이 실패할 경우, 양쪽이 방해받지 않고 통신할 수 있는 릴레이를 사용하여 패킷을 전달함.
-
DERP 프로토콜: Tailscale은 DERP(Detoured Encrypted Routing Protocol)를 사용하여 데이터를 릴레이하고, NAT 탐색을 지원함.
-
포트 매핑 프로토콜: UPnP IGD, NAT-PMP, PCP와 같은 포트 매핑 프로토콜을 사용하여 NAT 장치가 더 친절하게 작동하도록 요청할 수 있음.