UDP 홀 펀칭

**UDP 홀 펀칭**(UDP hole punching)은 네트워크 주소 변환 (NAT) 애플리케이션에서 NAT를 통과하는 사용자 데이터그램 프로토콜 (UDP) 패킷 스트림을 유지하는 데 일반적으로 사용되는 기술이다. NAT 통과 기술은 일반적으로 인터넷에서 사설망에 연결된 호스트가 관련된 클라이언트-클라이언트 네트워킹 애플리케이션, 특히 P2P, Direct Client-to-Client (DCC) 및 Voice over Internet Protocol (VoIP) 배포에서 필요하다.

UDP 홀 펀칭은 하나 이상의 네트워크 주소 변환기를 통해 통신하는 두 호스트 간의 연결을 설정한다. 일반적으로 공용 전송 네트워크의 제3자 호스트를 사용하여 통신 호스트 간의 직접 통신에 사용될 수 있는 UDP 포트 상태를 설정한다. 포트 상태가 성공적으로 설정되고 호스트가 통신하면, 포트 상태는 일반 통신 트래픽으로 유지되거나, 장기간 통신이 없을 경우 일반적으로 비어 있는 UDP 패킷 또는 최소한의 비간섭 콘텐츠를 포함하는 keep-alive 패킷으로 유지될 수 있다.

## 개요
UDP 홀 펀칭은 네트워크 주소 변환기를 사용하여 사설망에 있는 인터넷 호스트 간에 양방향 UDP 연결을 설정하는 방법이다. 이 기술은 NAT 작동 특성이 표준화되어 있지 않기 때문에 모든 시나리오 또는 모든 유형의 NAT에 적용할 수 있는 것은 아니다.

NAT를 통해 인터넷에 연결된 사설망 내에서 네트워크 연결을 사용하는 호스트는 일반적으로 Session Traversal Utilities for NAT (STUN) 방법 또는 상호 연결 확립 (ICE)을 사용하여 통신 피어가 필요로 하는 NAT의 공용 주소를 결정한다. 이 과정에서 공용 네트워크의 다른 호스트가 포트 매핑 및 기타 UDP 포트 상태를 설정하는 데 사용되며, 이는 애플리케이션 호스트 간의 직접 통신에 유효하다고 가정된다. UDP 상태는 일반적으로 수십 초에서 몇 분 범위의 짧은 시간 후에 만료되고, 이 과정에서 UDP 포트가 닫히기 때문에 UDP 홀 펀칭은 주기적인 Keep-alive 패킷 전송을 사용하여 각 패킷이 NAT의 UDP 상태 머신에서 수명 카운터를 갱신한다.

UDP 홀 펀칭은 대기업 네트워크에서 발견되는 대칭형 NAT 장치(양방향 NAT라고도 함)에서는 작동하지 않는다. 대칭형 NAT에서는 알려진 STUN 서버와의 연결과 관련된 NAT의 매핑이 알려진 서버로부터 데이터를 수신하는 것으로 제한되므로 알려진 서버가 보는 NAT 매핑은 엔드포인트에 유용한 정보가 아니다.

다소 더 정교한 접근 방식에서는 두 호스트 모두 여러 번의 시도를 사용하여 서로에게 보내기 시작한다. 제한적 콘 NAT에서는 다른 호스트에서 온 첫 번째 패킷이 차단된다. 그 후 NAT 장치는 다른 머신으로 패킷을 보낸 기록을 가지게 되며, 이 IP 주소와 포트 번호에서 오는 모든 패킷을 통과시킨다. 이 기술은 P2P 소프트웨어 및 VoIP 전화 통신에서 널리 사용된다. 또한 UDP를 통해 작동하는 가상사설망의 구축을 지원하는 데 사용될 수도 있다. 동일한 기술은 때때로 전송 제어 프로토콜 (TCP) 연결로 확장되지만, TCP 연결 스트림이 애플리케이션이 아닌 호스트 OS에 의해 제어되고 시퀀스 번호가 무작위로 선택되기 때문에 성공률은 낮다. 따라서 시퀀스 번호 검사를 수행하는 NAT 장치는 패킷이 기존 연결과 관련이 있다고 간주하지 않고 삭제한다.

300px|섬네일|right|alt=UDP 홀 펀칭 메시지 시퀀스 차트|서버 S를 사용하여 통신을 설정하는 데 도움을 받는 피어 A와 B의 메시지 시퀀스 차트
## 흐름
A와 B는 각각 자신의 사설망에 있는 내부 IP 주소 iAddrA와 iAddrB를 가진 두 호스트이다. NA와 NB는 각각 외부 IP 주소 eAddrA와 eAddrB를 가진 두 NAT 장치이다. S는 알려진 IP 주소를 가진 공용 서버이다.
# A와 B는 각각 S와 UDP 대화를 시작한다. NAT 장치 NA와 NB는 UDP 변환 상태를 생성하고 임시 외부 포트 번호 ePortA와 ePortB를 할당한다.
# S는 UDP 패킷을 검사하여 NA와 NB가 사용한 소스 포트(외부 NAT 포트 ePortA와 ePortB)를 얻는다.
# S는 B에게 eAddrA:ePortA 값을 알리고, A에게 eAddrB:ePortB 값을 알린다.
# A는 eAddrB:ePortB로 패킷을 보내고, B는 eAddrA:ePortA로 패킷을 보낸다(반드시 동시에 또는 특정 순서로 보낼 필요는 없다).
#* 이 패킷들이 사설망을 떠날 때, 각 NAT 장치는 변환 테이블에 항목을 추가한다:
#** NA는 A의 패킷을 검사하고 이미 항목 (iAddrA, iPortA, eAddrA, ePortA)이 존재하지만 목적지가 다르다(S). NA는 A (iAddrA)에서 B (eAddrB)로 전송되는 트래픽에 대해 동일한 변환으로 새 항목을 생성한다.
#** NB는 B의 패킷을 검사하고 이미 항목 (iAddrB, iPortB, eAddrB, ePortB)이 존재하지만 목적지가 다르다(S). NB는 B (iAddrB)에서 A (eAddrA)로 전송되는 트래픽에 대해 동일한 변환으로 새 항목을 생성한다.
#* 원격 패킷 도착 시 각 NAT의 변환 테이블 상태에 따라:
#** 새로운 항목이 B의 패킷이 도착하기 전에 NA의 변환 테이블에 이미 추가되었다면 NA는 B의 패킷을 통과시키지만, 그렇지 않으면 삭제한다.
#** 새로운 항목이 A의 패킷이 도착하기 전에 NB의 변환 테이블에 이미 추가되었다면 NB는 A의 패킷을 통과시키지만, 그렇지 않으면 삭제한다.
# 양쪽 NAT에 해당 튜플이 추가되면 NAT에 "홀"이 "펀칭"되어 두 호스트가 직접 통신할 수 있게 된다.
* 두 호스트 모두 제한적 콘 NAT 또는 대칭형 NAT를 사용하는 경우 외부 NAT 포트는 S와 함께 사용된 포트와 다를 것이다. 일부 라우터에서는 외부 포트가 순차적으로 선택되므로 근처 포트를 추측하여 대화를 설정할 수 있다.

## 같이 보기
* 하마치
* 하이퍼넷
* ICMP 홀 펀칭
* TCP 홀 펀칭
* 홀 펀칭 (네트워킹)
* WebRTC
* 포트 제어 프로토콜 (PCP)
* 테레도 터널링

## 각주

## 외부 링크
* Peer-to-Peer Communication Across Network Address Translators, PDF 홀 펀칭 과정에 대한 자세한 설명을 포함
* STUNT NAT 및 TCP를 통한 UDP의 단순 트래버설
* 네트워크 주소 변환 및 P2P 애플리케이션 (NATP2P)

분류:네트워크 보안