SIP 전화 등등의 서비스는 NAT 환경 안에 있는 터미널과 연결을 유지하기 위한 트릭이 필요하다.
대표적인 것이 UDP 홀펀칭, STUN, TURN 등이 있다. UDP를 쏴서 NAT 테이블이 지워지지 않도록 한다.
UDP 홀펀칭은 예상대로 신뢰성은 좀 떨어진다.
http://pdos.csail.mit.edu/papers/p2pnat.pdf
2005년 논문이긴 하지만 다양한 라우터에서 테스트 결과 82%의 성공률이다.
TCP는 더 떨어진다. 내용을 다 읽어보진 않았는데..
아마도 stateful의 복잡도에 기인하는 것 같다.
이때 NAT 기기의 특성이 중요한데, 테이블을 유지하고, 아웃바운드로부터 들어오는 것에 대한 제약에 따라 cone 방식이 나뉜다.
Full cone, symmetric NAT 등으로 검색해보면 자료가 나온다.
대부분 풀콘 일 것 같지만 iptimes만 해도 콘 방식을 몇 가지로 쓰는 것 같다.
온라인 게임시 NAT 1, 2, 3, 4 유형이 뜨는데. 대부분 이 문제다. 게이머끼리 P2P로 UDP 세션을 유지하려 할 때 서로 각자의 NAT 안에 있으면 아웃바운드 포트가 문제가 된다. NAT 테이블 갱신 주기는 제조사 마음이다.
위 논문에서는 비관적 접근을 취했을 때 20초 안에 재사용이 일어나야 한다고 적었다.
물론 테이블 수명이 너무 길어도 문제다. 단말이 바뀐후 dhcp에 의해 앞 쪽 ip를 부여 받았을 경우 NAT가 알 방법이 없다.
가정용 공유기가 아닌 라우터들은 하루도 간다. 물론 이것도 UDP 세션의 경우는 수십 초만 준다.
저수준의 트릭을 쓰자면 ARP가 문제가 된다. 윈도우는 최대 10분이면 ARP 테이블을 플러싱 한다. 통신이 없으면 2분 후에는 날아간다.
물론 OS 기능이므로 설정은 바꿀 수가 있지만. 리눅스는 1분인데 ip reachable 일 때만 갱신한다.
게임쪽에서는 UDP에 의한 P2P가 주류다. 속도상 어쩔 수 없다.
반면 UDP 세션의 수명은 매우 짧으므로 액션이 없을 때도 통신을 취해야 한다.
만약 릴레잉 서버가 필요한 구조라 치면 이 통신량이 너무 많아진다. 세션을 순회하면서 살리는 방법은 대규모에는 적용할 수 없을 것 같다.
뭐 당근.. 리던던시나 페일오버 트릭이 껴들어 갈 수 밖에 없을 것이다. UDP를 넘들이 쓰지 않는 방식으로 트리키하게 쓰면 또 문제를 일으킬 가능성이 있다. UDP 체크썸 공격이나 UDP 플러딩 공격은 쉬운 ddos 공격 유형이다.
p2p 논문, arp의 수명, NAT 기술, 시스코 NAT 테이블 lifetime, NAT 로드 밸런싱, 스카이프 어드민 문서, NAT의 cone , Traversal using IPv6 and Teredo, 홀펀칭, NAT cone과 홀펀칭, UDP 공격 유형, STUNT, RTP, STUN, NAT 테이블 유지 트릭들을 검색.
URL을 유실했으므로 필요할 때 찾자.