NAT(Network Address Translation)

1 분 소요

인터넷에서 사용할 수 있는 IP 주소는 한정적이기 때문에 내부 네트워크에서는 RFC 1918에서 지정한 세 개의 사설 IP 주소 대역을 사용한다.

  • 10.0.0.0 ~ 10.255.255.255 (10/8)
  • 172.16.0.0 ~ 172.31.255.255 (172.16/12)
  • 192.168.0.0 ~ 192.168.255.255(192.168/16)

이 사설 IP 대역은 LAN 내에서만 사용되며 외부와 통신할 수 없다. 사설 IP를 사용하는 Host가 인터넷에 연결되기 위해서는 NAT(Network Address Translation)을 사용해야한다.

NAT는 정적, 동적 및 PAT(Port Address Translation)이 있다.

  • 정적 NAT는 관리자가 지정한 사설 IP - 공인 IP 테이블을 사용해 주소 매핑(사설IP-공인IP)을 한다.
  • 동적 NAT는 공인 IP Pool을 관리하며 동적으로 내부 Host에 공인 IP를 할당해 주소 매핑을 한다.
  • PAT는 NAT 장비가 매 연결마다 Port 번호를 식별자로 사용해 하나의 공인 IP를 여러 Host에 매핑한다.

여기서는 가장 많이 쓰이는 PAT의 예제만 볼 것 이다.

TCP 수신 윈도우

위 그림에서 192.168.1.2 ~ 192.168.1.4는 NAT 장비에 의해 외부에서 모두 67.210.97.1로 보여진다. 각각의 연결은 유일한 Port 번호를 통해 NAT 장비에서 제어된다.

예를 들어 192.168.1.2 PC가 173.194.67.102 Server로 Ping을 보내는 경우 NAT 장비의 Table에 포트 번호 18로 매핑되고 src ip가 67.210.97.1로 변경되어 외부로 전달된다. 여기서 ICMP는 포트가 없기 때문에 ICMP 헤더의 id 필드의 값을 포트로 대신 사용한다. 마찬가지로 173.194.67.102 Server가 전송하는 ICMP Reply는 id값이 18임으로 NAT에 의해 192.168.1.2 PC로 전달된다.

좀 더 직관적인 이해를 위해 HTTP의 예를 들면, 192.168.1.2:5555 -> google.com:80으로 HTTP GET Request를 보낼 경우 NAT는 Table에 아래와 같이 매핑되어 관리된다.

Protocol Local IP:Port Global IP:Port
TCP 192.168.1.2:5555 67.210.97.1:5555

즉 NAT에 의해 외부로 나가는 192.168.1.2:5555인 패킷들은 67.210.97.1:5555로 변경되어 전송되고, 외부에서 들어오는 패킷중 목적지가 67.210.97.1:5555인 패킷들은 192.168.1.2로 전달된다.

이를 위해서는 NAT가 TCP 세그먼트 및 IP 데이터 그램의 헤더를 변경할 수 있어야 한다. 또한 이는 TCP 시퀀스 번호를 변경할 수 있기 때문에 이에 대한 조절도 가능해야 한다.

더불어 ICMP 등 Port를 사용하지 않는 특수한 경우에 대처할 수 있어야 한다. FTP처럼 클라이언트가 FTP PORT 명령어로 주소와 포트를 변경할 수 있는 프로토콜에 대해서도 동작해야 한다. (TCP 세그먼트를 FTP로 인식해야 한다.) 때문에 프로토콜 Body에 포트 번호에 대한 정보를 담고 있는 비표준 프로콜에서 오작동할 가능성도 있다.

이러한 복잡성에도 NAT는 잘 동작하기 때문에 현재 매우 널리 사용되고 있다.

References

  • https://accedian.com/enterprises/blog/tcp-receive-window-everything-need-know/
  • Effective TCP/IP Programming, Jon C. Snader