사설망의 탄생
Private Network(사설망)는 IPv4 중 특정 대역을 공인 인터넷이 아닌 가정, 기업 등의 한정된 공간에서 사용하는 네트워크를 의미한다.
사설망에 소속된 IP인 사설 IP 대역은 오로지 사설망(내부망) 에서만 사용 가능하기 때문에 공인망(외부망, 인터넷) 에서는 사용할 수 없다.
사설 IP는 사설망에만 해당한다면 어디에서나 사용 가능하다.
일반적으로 집에서 사용하는 컴퓨터, IPTV, 스마트폰 등은 공유기가 할당해주는 사설 IP를 사용한다.
기업도 마찬가지이다. 스위치나 라우터, 방화벽과 같은 네트워크 장비 혹은 비슷한 장비에 사설 IP와 서브넷 마스크를 지정하고 게이트웨이로 사용하며 이에 연결된 컴퓨터에 사설 IP를 할당한다.
이렇게 사설망과 공인망이 사용하는 IP에 따라 분리되면서 공인망과 사설망의 경계에서 별도의 조치를 취해야 할 필요성이 생겼다.
사설망에서 공인 인터넷으로 나가고자 할 ㅐ 자신의 출발지 IP(Source IP)를 사설 IP 그대로 쓸 수가 없기 때문이다.
사설 IP는 사설망에서만 사용하도록 규정된 만큼 공인 인터넷에서 사설 IP를 쓸 수가 없다.
당연한게 사설 IP는 사설망이라면 어디서든 쓸 수 있기 때문에 자신의 IP(Source IP)를 사설 IP로 유지한 채 공인 네트워크로 나간다면
해당 패킷은 자신이 왔던 길을 찾지 못한 채 영영 돌아오지 못할 것이다.
자신의 IP와 같은 사설 IP를 쓰는 곳은 수도 없이 많을테니까.
그렇기에 사설 IP를 공인 IP로 변환할 필요가 있다.
이에 IP를 변환하기 위한 방법을 고안한 것이 바로 Network Address Translation(NAT) 이다.
NAT의 정의
NAT는 IP 주소 혹은 IP 패킷의 TCP/UDP Port 숫자를 변환 및 재기록하여 네트워크 트래픽을 주고받는 기술을 의미한다.
지금까지 설명한 내용을 바탕으로 적용해보자면 사설망에서 공인망으로, 공인망에서 사설망으로 통신하고자 할 때 공인망/사설망에서 사용하는 IP로 변환하는 것을 의미한다.
여기서 IP 주소 뿐만 아니라 IP 패킷의 TCP/UDP Port 숫자를 변환한다고 하는 것은 실제로 NAT 의미가 IP 주소 뿐만 아니라 Port까지 변환시켜 사용하는 것을 포함하기 때문이다.
이를 Port Address Translation(PAT) 라고도 부른다.
먼저 NAT의 예시를 살펴보자.
사용자 1(10.0.0.2)이 공유기를 통해 공인망에 존재하는 웹 서버(125.200.50.100:80)에 접속하려고 한다.
사용자 1은 사설 IP를 보유하고 있기 때문에 공인망으로 나아가기 위해서는 자신의 사설 IP를 공인 IP로 반드시 변환(NAT)해야 한다.
그리고 이를 NAT Device(이하 NAT 장비, 공유기 등)가 수행한다.
사용자가 웹 서버에 접속하기 위해 NAT 장비(Gateway)에 패킷을 보내는데 IP/Port 정보는 위 표와 같다.
- (1) 이를 받아든 NAT 장비가 자신에게 허용된 규칙을 확인하고 공인망의 웹서버에게 보내기 위해 사용자의 사설 IP를 자신의 공인 IP로 변환하여 웹서버에게 전달한다.
- 정확히 말하면 공인망에 맞닿아 있는 NAT Device의 인터페이스 IP로 변환하는 것이다.
- (2) 웹서버가 사용자가 보낸 요청을 처리하고 응답을 사용자에게 보낸다.
- 그러기 위해서는 출발지와 목저지가 뒤바뀌어야 한다.
- (3) 응답 패킷을 받아든 NAT 장비가 과거 사용자가 보낸 요청에 대한 응답임을 기억(Stateful)한다.
- (4) 그리고 목적지 IP를 공인 IP에서 사용자의 실제 사설 IP로 변환하여 전달한다.
근데 여기서 문제가 하나 발생한다.
NAT 장비에 할당된 공인 IP는 하나이지만 사용자는 2명이라고 가정해보자.
사용자 1이 자신의 출발 포트를 9999로 지정하여 NAT 장비에 전송했음을 위 과정을 통해 알 수 있었다.
그런데 동시에 사용자 2도 자신의 출발 포트를 9999로 설정하여 전송한다면 어떻게 될까?
패킷이 공인망으로 나갈 때는 상관 없겠지만 되돌아올 때(reply) 문제가 발생할 수 있다.
왜냐하면 목적지가 공인 IP이고 포트는 9999인데 이게 사용자 1인지 사용자 2인지 구분할 길이 없다는 거다.
이에 사용되는 것이 위에서 말한 PAT(Port Address Translation) 이다.
애초에 사용자 1과 사용자 2로부터 패킷을 전달받아 사용자의 IP에 대해 NAT 장비가 NAT를 실시할 때 출발지 포트를 임의로 변경하는 것이다
가령 사용자 1의 출발지 포트를 10000으로 바꾸고, 사용자 2의 출발지 포트를 20000으로 바꾼다면?
공인 IP는 하나이지만 사용자마다 포트로 구분할 수 있으니 문제가 해결된다.
Session Table & Stateful
NAT를 수행하는 네트워크 장비의 종류는 매우 다양하다.
주로 관문 역할(Gateway)을 하는 네트워크 장비가 주로 NAT를 수행한다.
가정에서는 공유기가 내부망과 공인망의 경계에서 NAT를 실시하며, 기업에서는 과거 라우터가 이 역할을 자주 맡았으나 요즘에는 방화벽, VPN, L4 스위치 등이 이 역할을 조금 더 많이 수행한다고 한다.
공인망에 노출되는 관문에 해당하는 장비인만큼 보안 기능을 곁들인 장비가 맡는 것이다.
NAT를 수행하는 장비들은 자신에게 설정된 규칙(Rule)에 따라 허용/거부를 판단하고, NAT를 실시하고 이를 기록해둔다.
이를 수행하는 장비들을 보통 Session 장비 라고 부르며, NAT를 실시한 내역을 기록한 테이블을 Session Table 이라고 부른다.