1P by neo 2달전 | ★ favorite | 댓글과 토론

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 장치가 더 친절하게 작동하도록 요청할 수 있음.