※ RFC 5780의 Discovery Process 섹션에서 일부 발췌
소스 포트 선정 (Source Port Selection)
application(client)에서 포트를 선정할 때 두가지 선행조건을 갖추길 권함
- 선정된 소스 포트를 항상 사용 가능하게 할 것
- 최대한 기존에 사용하지 않은 포트를 (되도록)랜덤하게 선정할 것
- 사용했던 포트라도 최소한 15분 이상 지나서 사용
- 본 기술 특성 상 포트의 기존 상태에 따라 일관적이지 못한 결과가 나올 수 있기 때문
이 선행조건 달성이 간단치 않기 때문에 아래의 가이드라인을 따르고, 이를 통해 문제 발생의 *가능도(likelihood)를 줄이길 바람
- well-known 포트 이용과 고정값 포트 이용을 금함
- 랜덤성을 부여하는 것이 좋고, 추천 범위는
- 32768~49151 : 32768부터 IANA 등록 포트 범위 끝까지
- 49152~65535 : IANA Dynamic/Private 포트 범위
- 어떤 OS는(embedded OS 등) application 실행 시 마다 같은 포트를 할당할 수 있으므로, 직접 포트 선정 로직을 작성하는 것도 도움
- 랜덤성을 부여하는 것이 좋고, 추천 범위는
- application이 여러개의 포트가 필요하다면, 현 시점에 하나만 필요하다고 해도 모두 미리 할당 받아 놓도록 함
*가능도(likelihood) : 확률(probability)과는 구분되는 용어. 자세한 건 이 포스트 참고
STUN 서버를 이용한 UDP연결상태 검사 (Checking for UDP Connectivity with the STUN Server)
client가 STUN서버에 BINDING을 시도한 후 응답을 받았다면 연결 상태에 문제가 없음. 받지 못했다면 연결이 불성립했다는 의미이고, 이 후의 테스트는 불가능함. 이 테스트는 STUN 규격(RFC8489)을 따름
NAT 매핑 특성 판별 (Determining NAT Mapping Behavior)
최대 3단계의 테스트를 진행
- 1단계 - UDP연결상태검사 실시
- 진행 불가 조건
- 응답을 받지 못했다면 진행 불가
- OTHER-ADDRESS 속성이 응답에 포함되어 있지 않다면 진행 불가
- Endpoint-Independent Mapping 판별 완료 조건
- XOR-MAPPED-ADDRESS 속성값이 내 로컬IP와 같을 경우 판별 완료
- 분석자주) 실제에서 이럴 일은 없다고 봐도 무방
- 그 외에는 2단계 진행
- 진행 불가 조건
- 2단계 - OTHER-ADDRESS의 IP정보와 1단계 때 사용한 포트를 조합하여 UDP연결상태검사 실시
- 분석자주) 주의 사항
- 1단계에 이용한 클라이언트 포트를 그대로 이용해야 함
- OTHER-ADDRESS의 IP가 1단계 서버 IP와 동일할 경우에는 2단계 진행 불가하며 바로 3단계 진행
- 이는 규격을 벗어난 경우 임을 주의
- Endpoint-Independent Mapping 판별 완료 조건
- 응답의 XOR-MAPPED-ADDRESS 값이 1단계와 동일한 경우
- 그 외에는 3단계 진행
- 분석자주) 주의 사항
- 3단계 - 1단계의 OTHER-ADDRESS IP/Port를 모두 이용하여 UDP연결상태검사 실시
- 분석자 주) 규격 밖이지만, 서버에 따라 아래의 두개의 조건이 가능하기에 분기 필요
- 규격 외 1) 2단계에서 서버로부터의 응답이 없었을 경우
- 규격 외 2로 fallthrough
- OTHER-ADDRESS의 IP가
- 규격) 1단계 서버 IP와 다를 경우
- 응답의 XOR-MAPPED-ADDRESS 값에 대해
- 2단계의 그 값과 동일할 경우 Address-Dependent Mapping
- 2단계의 그 값과 다를 경우 Address and Port-Dependent Mapping
- 응답의 XOR-MAPPED-ADDRESS 값에 대해
- 규격 외 2) 1단계 서버 IP와 동일할 경우 (2단계 진행 없이 fallthrough한 상태)
- 응답의 XOR-MAPPED-ADDRESS 값에 대해
- 1단계의 그 값과 동일할 경우 판단 불가
- 다만, Endpoint-Independent Mapping으로 낙관적 판단은 가능(부정확)
- 1단계의 그 값과 다를 경우 Port-Dependent Mapping
- Address and Port-Dependent Mapping으로 볼 수도 있음
- 1단계의 그 값과 동일할 경우 판단 불가
- 응답의 XOR-MAPPED-ADDRESS 값에 대해
- 규격) 1단계 서버 IP와 다를 경우
NAT 필터링 특성 판별 (Determining NAT Filtering Behavior)
최대 3단계의 테스트를 진행
- 1단계 - UDP연결상태검사 실시
- 진행 불가 조건
- 응답을 받지 못했다면 진행 불가
- OTHER-ADDRESS 속성이 응답에 포함되어 있지 않다면 진행 불가
- 그 외에는 2단계 진행
- 진행 불가 조건
- 2단계 - 1단계 때 통신한 서버 주소에 다시 UDP연결상태검사 실시
- 테스트 시 BINDING 요청 내에 CHANGE-REQUEST 속성 추가 필수 (속성 값은 OTHER-ADDRESS의 IP/Port를 모두 이용하기 위해 change-ip, change-port 모두 true)
- Endpoint-Independent Filtering 판별 완료 조건
- 응답이 수신되어야 하고, 송신자가 1단계 서버가 아닌 OTHER-ADDRESS에 기재된 주소인 경우
- 그 외에는 3단계 진행
- 분석자 주, 규격 外) OTHER-ADDRESS의 IP가 1단계의 IP와 동일한 경우
- STUN서버에 따라 이를 제공하는 경우가 있음
- 3단계를 진행할 의미가 없으므로, Port-Dependent Filtering(규격 아님)으로 판별하거나
- 부정확하지만 Address and Port-Dependent Filtering으로 결정할 수도 있겠음
- 분석자 주, 규격 外) OTHER-ADDRESS의 IP가 1단계의 IP와 동일한 경우
- 3단계 - 1단계 서버에 이용하여 UDP연결상태검사 실시
- 테스트 시 BINDING 요청 내에 CHANGE-REQUEST 속성 추가 필수 (속성 값은 1단계의 OTHER-ADDRESS 값 중 Port 값만 이용)
- Address-Dependent Filtering 판별 완료 조건
- 응답이 수신된 경우
- Address and Port-Dependent Filtering 판별 완료 조건
- 응답 미수신
결론
매핑 테스트의 시행 결과가 Endpoint-Independent Mapping NAT일 경우에만 홀펀칭(hole punching)이 가능
Filtering 종류에 따라서는 홀펀칭 방식이 조금 달라질 수 있음(추후 포스팅 예정)
NAT 특성은 시시각각 변할 수 있으므로, P2P 오버레이 유지보수를 위해 항시 상태 감시 필요
아래 포스트와 연관됨