NAT(Network Address Translator)에 관해..
NAT를 단순히 Private IP <-> Public IP 변환 기술이라 알고 있었는데
파면 팔수록 절대로 단순하지 않은 녀석이더군요.
C/S(Client and Server) 통신에서는 그닥 문제가 없지만
P2P(Peer To Peer) 통신에서는 어느 한쪽이라도 NAT 네트워크에 위치해있으면 골치아파 집니다.
이때는 UDP 홀펀칭(Hole Puntching)이라는 게 필요하구요.
UDP 홀펀칭이란 서로간에 UDP 패킷을 주고받고하여 NAT 장비의 라우팅테이블을 작성하는 기술입니다.
여기서 NAT 장비가 테이블을 필요로 하는 이유는 Private IP가 외부로 광고되지 않기 때문입니다.
다시말해 NAT 외부에서 오는 패킷은 Private IP를 목적지로 가질 수 없습니다.
(특이한 예로, Cisco 라우터는 RIP에 Private 네트워크를 등록시 Private도 외부에 광고합니다)
또한 NAT는 종류마다 테이블 값과 포워딩 방식이 조금씩 다른데, NAT 기술은 크게 4가지로 분류할 수 있습니다.
1. Full Cone
2. Restricted Cone
3. Port Restricted Cone
4. Symmetric Cone
여기서 Full Cone이 제일 일반적이며, Full Cone에서만 (테이블이 존재할시) 외부에서 NAT 내부로 첫 패킷을 보낼 수 있습니다. 다시말해 외부에서 먼저 연결 설정을 할 수 있다는 뜻입니다.
※ Full, Restricted Port Restricted Cone에서 NAT가 지정하는 포트는 1개입니다.
- 내부에서 외부로 패킷을 쏘면 NAT는 "출발지(내부) IP / 출발지(내부) 포트"를 기록하고
출발지(내부) 포트를 NAT가 지정한 포트로 변경하여 외부로 보냅니다.
외부에서 NAT가 지정한 포트로 패킷이 오면, NAT는 무조건 해당 내부호스트로 패킷을 포워딩합니다.
2. Restricted Cone
- 내부에서 외부로 패킷을 쏘면 NAT는 "도착지(외부) IP / 출발지(내부) IP / 출발지(내부) 포트"를 기록하고
출발지(내부) 포트를 NAT가 지정한 포트로 변경하여 외부로 보냅니다.
- 외부에서 NAT가 지정한 포트로 패킷이 오면, 출발지(외부) IP가 테이블에 있는 외부 IP와 동일한 경우
NAT는 해당 내부호스트로 패킷을 포워딩합니다.
3. Port Restricted Cone
- 내부에서 외부로 패킷을 쏘면 NAT는 "도착지(외부) IP / 도착지(외부) 포트 / 출발지(내부) IP / 출발지(내부) 포트"를 기록하고, 출발지(내부) 포트를 NAT가 지정한 포트로 변경하여 외부로 보냅니다.
- 외부에서 NAT가 지정한 포트로 패킷이 오면 "출발지(외부) IP / 출발지(외부) 포트"가
테이블에 있는 "외부 IP / 외부 포트"와 동일한 경우, NAT는 해당 내부호스트로 패킷을 포워딩합니다.
4. Symmetric Cone
- Port Restricted Cone과 비슷하지만, 내부에서 외부로 패킷을 쏠 때
"도착지(외부) IP"나 "도착지(외부) 포트"가 기존의 테이블값과 다를 경우, NAT는 다른 포트를 통해 패킷을 외부로 보냅니다. 즉, NAT가 지정하는 포트는 여러개 일 수 있습니다.
Full Cone에서는 외부 IP를 가리지 않기 때문에 테이블이 존재하는 한, 외부에서 먼저 패킷을 보낼 수 있습니다.
단, NAT의 포트번호는 상대방이 알고있거나 잘 알려져있는 번호(ex. 20, 80)여야 겠죠.
테이블은 NAT에서 Static으로 설정하거나 내부호스트가 더미패킷을 꾸준히 보내주면 됩니다.
그러나 나머지 Cone들은 외부에서 NAT로 패킷이 오면, 출발지(외부) IP를 보기 때문에
외부에서 먼저 연결 설정을 할 수가 없습니다. 테이블이 없기 때문이죠.
Full Cone에서의 문제점은 엉뚱한 내부호스트로 패킷을 포워딩 할 수 있다는 것입니다.
각 호스트들은 모두 80번 포트로 www를 열어 놓았으며, NAT 또한 80번 포트를 지정하였다.
각 호스트들은 NAT의 테이블을 유지시키기 위해 일정 시간마다 더미 패킷을 쏘아보낸다.
이때 외부에서 NAT 80번 포트로 패킷이 오면 NAT는 어느 호스트로 패킷을 보내야 할까?
- Cisco 패킷 트레이서 5.0에서는 무조건 Private IP가 높은 호스트로 보내버리더군요.
sol) Full Cone에서는 PAT나 포트트리깅 같은 다중포트 지정으로 내부호스트를 구분해주는 것이 좋다.
이러한 방법은 호스트마다 포트를 달리 부여함으로써 Full Cone에서의 모호함을 줄일 수 있다.
제가 제대로 이해하고 있는지 모르겠네요;
설마 없겠지만, Full Cone 외의 방식의 공유기가 있을 수도 있으니 구입하실 때 알아보는 것도 좋을 것 같습니다.
참고자료 :
Extreme NDL (Network Development Lab) - Proposal for P2P System
GPG (Game Programming Gems) Study Forum - (네트웍 및 멀티플레이어) UDP 홀펀칭을 할 때에..
Network Working Group - RFC 2663, 2694
출처 : http://www.inter6.com/tt/index.php?pl=123
'Computer > Network' 카테고리의 다른 글
TIME_WAIT를 남기지 않는 세션종료 (Graceful Shutdown) (0) | 2014.06.02 |
---|---|
NAT 종류 (0) | 2012.05.04 |