Tech Study/Network2025. 1. 10. 03:04

RFC 5780Discovery 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
      • 규격 외 2) 1단계 서버 IP와 동일할 경우 (2단계 진행 없이 fallthrough한 상태)
        • 응답의 XOR-MAPPED-ADDRESS 값에 대해
          • 1단계의 그 값과 동일할 경우 판단 불가
            • 다만, Endpoint-Independent Mapping으로 낙관적 판단은 가능(부정확)
          • 1단계의 그 값과 다를 경우 Port-Dependent Mapping
            • Address and Port-Dependent Mapping으로 볼 수도 있음

 

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으로 결정할 수도 있겠음
  • 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 오버레이 유지보수를 위해 항시 상태 감시 필요

아래 포스트와 연관됨

https://swjman.tistory.com/168

https://swjman.tistory.com/14

Posted by JMAN