NAT(Network Address Translation, 네트워크 주소 변환)는 내부 망에는 사설 IP주소를 사용하지만, 외부(인터넷)과의 통신에서는 공인 IP를 사용하는 것이다.
IPv4의 크기는 2^32bits로 약 42억만큼 할당할 수 있다. (서브넷을 고려한다면 실제 가용한건 훨씬 모자라다.) 그러나 전 세계 인터넷에 연결되어 있는 장비의 수는 약 250억개이다. IPv4의 부족 문제를 해결하기 위한 것으로 IPv6가 있는데 NAT 또한 해결책이 될 수 있다.
NAT를 적절히만 사용한다면, 하나의 공인 IP만으로 다수의 호스트를 사용할 수 있다. 보통 DHCP와 함께 사용된다.
외부로 공개되는 IP는 단 하나로 외부에서는 내부의 사설IP를 알기 힘들다. IP 변환 과정에서 NAT 자체가 일종의 방화벽 역할을 자연스레 수행한다.
중간 NAT 서비스가 출발지IP(혹은 목적지IP)를 기록해두었다가 바꿔치기 한다. 이를 위한 NAT Table이 존재한다.
NAT에서 송신자의 IP를 변환(==IP masquerading)해주는 것을 SNAT(Source NAT), 수신자의 IP를 변환해주는 것을 DNAT(Destination NAT)라고 한다.
여러 호스트가 하나의 목적지를 향한다면? DNAT가 어떻게 이루어질까? -> PNAT(포트 주소 필요)
ping 나자신 을 하면 외부에서 내부로 들어올 때 어떻게 될까? -> NAT haripin
외부에서 내부로 접근하려면? (예: 웹서버) -> Port forwarding
여러 호스트가 하나의 목적지로 향하는 상황을 가정해보자
두 호스의 내부 IP가 외부로 나갈 때 동일한 8.8.8.8 로 변환되었다. 이후 내부로 다시 돌아오는 시점에서 라우터는 8.8.8.8을 어느 호스트의 IP로 변환해야 하는지 식별할 수 없다.

이를 위하여 포트번호를 사용하여 식별한다. (위 그림에 포트번호가 추가되었지만 올바른 그림이 아니다.)
패킷이 밖으로 나갈 때, 포트번호도 함께 변환시키고 이를 테이블에 기재한다. 외부에서 돌아오는 응답을 확인하여 목적지 호스트를 특정할 수 있다.

(Note) 왜 MAC 주소로 구분하지 않을까?
이렇게 포트로 구분했는데 만약 둘이 똑같은 Client 포트를 가진다면 어떻게 될까?
-> 포트 충돌 발생
이때 취해지는 조치는 라우터의 품질에 따라 다르다.
그렇다면 유효한 NAT의 개수는 몇 개일까?
NAT의 원리상 Table에 적혀있지 않은 외부 트래픽은 내부로 진입할 수 없다. 내부 -> 외부 -> 내부(내부에서 외부로 나갔다 다시 돌아옴)이 한 수행 단위이고 이 한 번이 수행되고 나면 Table에서 지워진다. 따라서 내부로 나간적이 없는 경우 NAT Table에 정보가 없기 때문에 내부로 들어올 수 없는 것이다.
NAT 안에서 서비스를 외부에 제공하기 위한 2가지 방법이 있다.
: 외부 네트워크에서 내부로 접근할 수 있도록 특정 IP와 포트를 매핑해둔 것
외부IP:외부포트 -> 내부IP:내부포트로 이루어지기 때문에 PNAT와 유사하다.
: 내부 호스트 중 특정 호스트 하나는 공인 IP를 사용하는 방법
DMZ vs Super DMZ
NAT 내부에서 NAT로 ping을 때리면 어떻게 될까?
다음 예시에서 h1이 168.131.151.1로 ping을 때렸다.
결론은 무시된다.
ping의 흐름은
잘 구분해서 쓴다면 통신을 못하지는 않지만 귀찮다. 매번 10.0.0.1과 168.131.151.1을 구분해야 한다.
이런 경우는 내부 망 테스트, 내부 접근 등에서 자주 사용된다.
예: Cloud-Kubernetes와 같은 환경에서 클러스터 구성

해결법 => NAT Hairpin (또는 NAT loopback, NAT Reflection)
: 내부 네트워크의 장치가 동일한 네트워크 내에 있는 다른 장치에 공인 IP 주소를 통해 접근할 수 있도록 하는 기능
(참고) hairpin은 외부로 나갔다 들어오는 것이 아니기 때문에 hairpin이 적용되면 icmp가 찍히지 않는다. 적용되면 icmp가 남아있음.
이전의 클러스터 예제에서 Hairpin이 동작한다면,
h1-> h2: ping 10.0.0.20 -> SNAT(192.168.0.10) -> DNAT(192.168.0.20)으로 동작한다.