Blog on Iterating

UDP Hole Punching

10장. NAT Traversal과 UDP Hole Punching

먼저 NAT부터 이해해야 합니다.

가정용 공유기는 여러 내부 장치가 하나의 공인 IP를 공유할 수 있도록 주소와 포트를 변환합니다.

예를 들어 집 PC가 외부로 통신하면 공유기는 다음과 같은 임시 매핑을 만들 수 있습니다.

192.168.0.10:41641 ↔ 공인IP:55001

공유기는 이 매핑을 이용해 해당 통신의 인바운드 패킷을 적절한 내부 장치로 전달합니다.

여기서 중요한 개념이 두 가지 있습니다.

  • NAT Mapping: 공인 주소와 내부 주소의 변환 관계

  • NAT Filtering: 어떤 외부 주소에서 오는 패킷을 허용할지 결정하는 조건

가정용 공유기는 보통 NAT와 Stateful 방화벽 기능을 함께 제공합니다.

UDP Hole Punching은 무엇인가요?

두 장치가 서로를 향해 UDP 패킷을 보내 각 공유기에 동적인 매핑과 통신 상태가 형성되도록 시도하는 기술입니다.

예를 들어 다음과 같습니다.

  1. 노트북 A가 집 서버 B를 향해 UDP 패킷을 전송합니다.

  2. A의 공유기가 매핑과 통신 상태를 생성합니다.

  3. 집 서버 B도 노트북 A를 향해 UDP 패킷을 전송합니다.

  4. B의 공유기도 매핑과 통신 상태를 생성합니다.

  5. 각 NAT의 조건이 맞으면 양방향 패킷이 통과합니다.

이때 수동으로 포트포워딩 규칙을 만들지 않아도 될 수 있습니다.

포트포워딩 정책을 우회하거나 무력화하는 것이 아닙니다.

공유기가 원래 제공하는 동적인 NAT 및 상태 추적 기능을 이용하는 것입니다.

다만 NAT의 종류와 방화벽 정책에 따라 Direct 연결이 실패할 수도 있습니다.

그때 DERP 같은 중계 경로가 필요합니다.

Q. 아웃바운드 연결을 만들었는데 어떻게 인바운드 데이터가 들어오나요?

TCP 연결은 수립된 후 양방향으로 데이터를 주고받을 수 있습니다.

예를 들어 집 서버가 DERP 서버의 TCP 443 포트로 연결을 시작했다고 가정하겠습니다.

연결이 성립하면 DERP 서버도 같은 TCP 연결을 통해 집 서버로 데이터를 보낼 수 있습니다.

이때 집 서버의 공유기나 Stateful 방화벽은 해당 패킷이 이미 허용된 통신에 속한다는 사실을 알고 있습니다.

따라서 새로운 외부 연결을 무조건 허용한 것이 아닙니다.

기존에 허용된 통신을 통해 반대 방향의 데이터를 수신하는 것입니다.

AWS Security Group에서도 같은 개념을 볼 수 있습니다.

Security Group은 Stateful이므로 허용된 연결의 응답 트래픽은 반대 방향의 별도 허용 규칙이 없어도 통과할 수 있습니다.

반대로 Stateless 방화벽은 양방향에 필요한 규칙을 각각 고려해야 합니다.