NAT
Network Address Translation, 보통 '공유기' 라는 이름으로 익숙하게 알려져있다.
말 네트워크 주소를 번역 (변환) 해준다. (일종의 라우터)
NAT는 다수의 디바이스로 구성된 어떤 local network(집)에서 외부 인터넷으로 나가는 유일한 통로역할을 한다.
외부 인터넷의 관점에서 보면, 해당하는 local network(집)로 들어가는 유일한 통로로 NAT 밖에 보이지 않는다.
즉, 집에서 여러 인터넷 디바이스를 사용하고 싶은데, 인터넷은 하나의 회선만 사용하고 싶을 때 NAT(공유기)를 사용할 수 있다.
또한 밖에서는 하나의 IPv4 주소만 가지고 있는 것처럼 보이기 때문에 내부 네트워크를 감추는 효과도 있다.
local network 에서는 다시 각각의 디바이스를 구분하기 위한 별도의 IP주소를 갖고 있다.
이렇게 내부에서만 사용하는 IP주소를 private 주소라고 하는데, 위 그림에 보이는 10.0.0 이 대표적인 private 주소 중 하나이며, 이 주소는 public 인터넷에서는 절대 사용할 수 없다.
따라서 만약 목적지가 10.0.0 과 같이 구성되면 이런 목적지는 이해할 수 없는 목적지 주소라고 판단해서 패킷을 보내지 않는다.
외부에서 볼 때는 내부 네트워크에 연결된 모든 디바이스가 다 같은 IP주소를 쓰는 것처럼 보인다.
하나의 IP주소밖에 없으니 지금 보고있는 IP주소가 어떤 디바이스를 가리키는 지도 당연히 모른다.
만약 local network에 있는 어떤 호스트에서 외부에 있는 어떤 서버와 통신을 하고 싶어한다면,
NAT는 local network에 있는 호스트에서 나온 트래픽에 대해, 그 디바이스를 위한 새로운 주소를 만들어준다.
물론 어떤 디바이스에서 나온 트래픽이라도 모두 (위 그림에서 라면) 138.76.29.7 이라는 IP주소를 source address로 해서 인터넷에 돌아다닐 것이다.
그런데 실제로 어떤 어플리케이션이 응답을 보낼 때, 결국에는 내부 네트워크에서 어떤 호스트가 보낸 요청인지를 구분해야 할텐데, 모두 같은 IP주소를 사용한다면 어떻게 구분할 수 있을까?
이때 사용하는 꼼수가 바로 포트이다. 같은 IP주소 하에서 포트번호로 디바이스를 구분하는 것이다.
(사실은 반칙이다. 원래 포트번호는 디바이스를 구분하는 용도가 아니라, 호스트에서 돌아가는 프로세스를 구분하는 용도로 쓰자고 약속했었기 때문이다. 물론 돌아가기만 하면 되니까 대부분은 신경쓰지 않는다.)
응답은 결국 NAT장비로 들어오게 되는데, NAT장비가 포트번호를 보고 최종 목적지가 어떤 호스트인지를 확인한다.
즉, NAT 장비가 패킷들을 디먹스 하는 것이고, 이때 사용하는 자료구조가 포트번호다.
private 주소는 10.0.0 ( = 10/8) 말고도, 172.16/12, 192.168/16 prefix 와 같은 서브넷들이 있다.
만약 회사 규모가 크지 않다, 집에서 구성한다 라고 하면 192.168 prefix를 이용해서 프라이빗 네트워크를 구성할 수 있다.
NAT 사용시 얻는 장점
이렇게 NAT를 통하면 얻을 수 있는 장점이 4가지가 있다.
1. 하나의 IP주소로 여러 디바이스를 인터넷에 연결할 수 있게 된다.
그래서 NAT는 IPv4 에서 IPv6로 주소 체계가 바뀌는 것을 막는데 아주 큰 역할을 한다.
(IPv6를 설계한 사람들은 이걸 싫어한다고 한다.. 얘 때문에 6버전으로 못가고 있기 때문.. 과격한 사람들은 NAT 장비의 사용을 금지해야 한다고 까지 말하는데 현실적으로 가능할리는 없다.)
2. NAT를 사용하면 그 내부 네트워크는 외부에서 보는 네트워크가 아니기 때문에 내가 마음대로, 수시로 바꿔도 외부에 그 변경 정보를 알릴 필요가 없다.
3. ISP를 바꾸더라도, 바뀌는 부분은 오로지 NAT이고, 그 NAT를 통해 부여되는 IP주소만 바뀌기 때문에 ISP를 바꾸기가 쉽다.
4. 보안 측면에서도 외부에서는 내부 네트워크에 침입하려면 반드시 NAT를 거쳐야 하기 때문에, 내부 구조를 숨길수 있어 유리하다.
NAT 동작 과정
outgoing datagram : 내부 네트워크에서 외부 네트워크로 패킷을 내보내는 과정에서는 IP헤더에 있는 source IP 주소와 포트번호를 바꿔서 내보낸다. (port 는 물론 IP 데이터에 있는 TCP/UDP의 헤더에 있을 것이다.)
그러면 외부 네트워크에 있는 서버는 새로운 IP, port로 응답을 보낼 것이다.
NAT가 외부 네트워크에 있는 서버로부터 뭔가 응답을 받으면, 이 응답을 다시 내부 네트워크에 있는 호스트에게 전달해야 한다. 이때 외부 네트워크에서 보낸 응답에 기록된 port 를 보고 내부 네트워크에 있는 어떤 호스트의 어떤 포트번호로 전달해야하는지를 파악해서 다시 IP 헤더를 수정한 뒤 내부 네트워크의 적절한 호스트에게 전송한다.
이를 위해서 NAT는 내부적으로 외부에서 받은 (NAT IP주소, port) 와, (내부 네트워크의 IP주소, port) 가 매핑된 테이블을 유지해야 한다. 이 테이블을 NAT translation table 이라고 한다.
예시
그림과 같은 구조의 네트워크가 있다고 해보자.
내부 네트워크의 10.0.0.1 호스트의 3345 port 어플리케이션이 메세지를 만들어서 외부 네트워크를 목적지로 하는 곳에 요청을 보낸다.
이 요청은 먼저 NAT 로 들어온다.
NAT 는 받은 데이터그램의 헤더에 자신의 IP주소와 새로운 port 가 들어가도록 바꾸고, 바꾸기 이전의 주소 데이터를 NAT translation table에 저장한다. 그리고 인터넷에서 사용할 수 있는 정보로 바뀐 패킷을 다시 외부로 보낸다.
외부에서 응답이 오면, 그 응답은 NAT가 설정한 IP와 port 를 가리켜서 들어올 것이다.
NAT는 이 정보를 보고 NAT translation table에 기록해둔 정보에 일치하는 데이터를 찾아 패킷을 바꿔서 다시 LAN으로 보내준다.
라우터는 이렇게 16bit 포트 번호가 허용하는 범위 내에서 얼마든지 멀티플 디바이스를 디먹스할 수 있다.
그래서 이론적으로는 3000개 정도의 디바이스를 하나의 IP주소로 관리한다고 하면 성능에서는 심각한 문제가 있을지 몰라도 가능은하다. (포트번호의 가짓수만해도 2^16 이기 때문에..)
NAT는 사실 논란이 많은 장비이다.
라우터는 Layer 3의 장치이기 때문에, NAT는 보통 라우터에 같이 구현된다.
(그래서 공유기는 라우터에 NAT 기능이 들어간 것이다.)
그래서 원래는 공유기니까 3계층까지만 처리해야 한다.
그런데 실제로는 4계층 port 번호를 NAT가 마음대로 조작한다.
그래서 어떤 사람들은 이게 규칙에 맞지 않는다고 말한다.
이런 사람들은 NAT를 쓸 게 아니라, 빨리 IPv6로 넘어가야한다고 말한다.
NAT가 end-to-end argument를 위반하고 있기 때문이다.
(end-to-end argument는 간단히 말해, intelligence가 있는 작업은 end 시스템 (= host, 즉, 클라이언트나 서버) 에서 하는 게 맞다는 주장이다.)
NAT가 문제가 되는 다른 점은, 만약 내가 서버를 돌리고 싶다면, NAT 장비 안에서 서버를 돌리는 것은 굉장히 곤란하다.
NAT 장비 안에서 서버가 돌아가는 머신은 로컬 IP주소 (private IP주소) 를 갖고 있는 머신인데, 실제로 외부에 보일 때는 NAT 장비에 할당된 IP주소로 보이기 때문에, 서버로 요청이 들어올 때마다 매번 NAT 장비를 통해서 들어오도록 해야 한다.
그리고 NAT 장비의 테이블 내용중에 이 서버에 해당하는 포트 넘버는 다른 호스트에게 할당하면 안되고, 계속 그 테이블에 남아있어야 한다. (서버는 24시간 구동되는 것이 기본이기 때문이다.)
따라서 NAT 내부에서 서버를 돌리는 것은 가능은 하지만 적합하지는 않다.
그럼에도 NAT는 자주 사용된다.
일반 사용자들은 저렴한 비용에 인터넷을 이용할 수만 있따면 이런 네트워크 원칙을 신경쓸 필요가 없기 때문이다.
특히 cellular 네트워크에서는 4g, 5g 변환을 할 때 체계가 다른 부분을 NAT가 중간에서 맞춰주는 역할도 수행한다.
'CS > 컴퓨터 네트워크' 카테고리의 다른 글
[컴퓨터 네트워크] 30. Network Layer (6) : Generalized Forwarding (0) | 2024.06.06 |
---|---|
[컴퓨터 네트워크] 29. Network Layer (5) : IPv6 (0) | 2024.06.06 |
[컴퓨터 네트워크] 27. Network Layer (3) : IP (0) | 2024.06.05 |
[컴퓨터 네트워크] 26. Network Layer (2) : 라우터 (0) | 2024.06.03 |
[컴퓨터 네트워크] 25. Network Layer (1) : 개요 (0) | 2024.06.02 |