NAT

앵우·2026년 1월 9일

NAT란?

NAT(Network Address Translation, 네트워크 주소 변환)는 내부 망에는 사설 IP주소를 사용하지만, 외부(인터넷)과의 통신에서는 공인 IP를 사용하는 것이다.

NAT를 사용하는 이유

  • IPv4 주소 부족 해결

IPv4의 크기는 2^32bits로 약 42억만큼 할당할 수 있다. (서브넷을 고려한다면 실제 가용한건 훨씬 모자라다.) 그러나 전 세계 인터넷에 연결되어 있는 장비의 수는 약 250억개이다. IPv4의 부족 문제를 해결하기 위한 것으로 IPv6가 있는데 NAT 또한 해결책이 될 수 있다.

NAT를 적절히만 사용한다면, 하나의 공인 IP만으로 다수의 호스트를 사용할 수 있다. 보통 DHCP와 함께 사용된다.

  • 보안 강화(IP Masquerading)

외부로 공개되는 IP는 단 하나로 외부에서는 내부의 사설IP를 알기 힘들다. IP 변환 과정에서 NAT 자체가 일종의 방화벽 역할을 자연스레 수행한다.

NAT 원리

중간 NAT 서비스가 출발지IP(혹은 목적지IP)를 기록해두었다가 바꿔치기 한다. 이를 위한 NAT Table이 존재한다.

NAT에서 송신자의 IP를 변환(==IP masquerading)해주는 것을 SNAT(Source NAT), 수신자의 IP를 변환해주는 것을 DNAT(Destination NAT)라고 한다.

NAT의 챌린지들

  • 여러 호스트가 하나의 목적지를 향한다면? DNAT가 어떻게 이루어질까? -> PNAT(포트 주소 필요)

  • ping 나자신 을 하면 외부에서 내부로 들어올 때 어떻게 될까? -> NAT haripin

  • 외부에서 내부로 접근하려면? (예: 웹서버) -> Port forwarding

PNAT(Port NAT)

여러 호스트가 하나의 목적지로 향하는 상황을 가정해보자

두 호스의 내부 IP가 외부로 나갈 때 동일한 8.8.8.8 로 변환되었다. 이후 내부로 다시 돌아오는 시점에서 라우터는 8.8.8.8을 어느 호스트의 IP로 변환해야 하는지 식별할 수 없다.

이를 위하여 포트번호를 사용하여 식별한다. (위 그림에 포트번호가 추가되었지만 올바른 그림이 아니다.)

패킷이 밖으로 나갈 때, 포트번호도 함께 변환시키고 이를 테이블에 기재한다. 외부에서 돌아오는 응답을 확인하여 목적지 호스트를 특정할 수 있다.

(Note) 왜 MAC 주소로 구분하지 않을까?

  • NAT는 L3/L4(IP, Port) 계층에서 동작하므로, L2 정보인 MAC 주소를 기준으로 변환할 수 없다.
  • MAC 주소는 동일한 LAN(브로드캐스트 도메인) 내에서만 유효하며, 서로 다른 네트워크 간에는 MAC 주소를 알 수 없다.

이렇게 포트로 구분했는데 만약 둘이 똑같은 Client 포트를 가진다면 어떻게 될까?
-> 포트 충돌 발생

이때 취해지는 조치는 라우터의 품질에 따라 다르다.

  • 저렴한 라우터 -> 그냥 안 됨, 통신 오류
  • 조금 좋은 라우터(대부분의 경우) -> 내부에서 포트 번호를 한번 더 변환시킨다.(보통+1)
  • 매주 비싸고 좋은 라우터(Stateful Router) -> TCP 내 내부 Seq/Ack 추척 후 구분

그렇다면 유효한 NAT의 개수는 몇 개일까?

  • 포트 번호는 65535개이다. 이중 1024개는 예약이라 실제로 사용할 수 있는 것은 64511개이다.
  • 이론상 출발지*목적지해서 129000개의 호스트가 가능하다. (모든 포트가 충돌하지 않는 경우)
  • 하지만 생일역설 문제에 따라 약 296대의 호스트가 있으면 50%의 확률로 충돌이 발생한다.

Port forwarding

NAT의 원리상 Table에 적혀있지 않은 외부 트래픽은 내부로 진입할 수 없다. 내부 -> 외부 -> 내부(내부에서 외부로 나갔다 다시 돌아옴)이 한 수행 단위이고 이 한 번이 수행되고 나면 Table에서 지워진다. 따라서 내부로 나간적이 없는 경우 NAT Table에 정보가 없기 때문에 내부로 들어올 수 없는 것이다.

NAT 안에서 서비스를 외부에 제공하기 위한 2가지 방법이 있다.

  • Port fowarding
  • DMZ

포트포워딩

: 외부 네트워크에서 내부로 접근할 수 있도록 특정 IP와 포트를 매핑해둔 것

  • 외부IP:외부포트 -> 내부IP:내부포트로 이루어지기 때문에 PNAT와 유사하다.
  • PNAT와 차이점은 NAT Table을 static하게 박아놓은 것이다. (<-> NAT Table은 한 번 나갔다 들어오면 지워짐)
  • 내부 장치가 다시 응답을 보내면 다시 NAT와 같이 통신한다.

DMZ

  • 항상 오픈이 되어야 하는 서비스를 위한 것으로, 외부와 내부 네트워크 사이에 중간 영역을 만드는 개념이다.
  • 내부 네트워크에 대한 직접적인 접근을 차단하면서, 외부 네트워크(인터넷)에서 특정 서버나 서비스에 접근할 수 있도록 허용한다.
  • 포트포워딩에 적혀있지 않은 나머지 요청들은 DMZ로 지정된 호스트로 전달된다.
    - 특정한 호스트에 한해서 모든 포트 개방
    • 일종의 특수한 Port forwarding 룰이라도 봐도 됨
    • 외부에서 내부의 대표서비스처럼 보임

Super DMZ

: 내부 호스트 중 특정 호스트 하나는 공인 IP를 사용하는 방법

  • SDMZ라고들 부름(또는 Twin-IP)
  • 외부 IP 주소를 그대로 할당하는 것이기 때문에 내부 서버를 운영할 때 더욱 안정적

DMZ vs Super DMZ

  • DMZ는 일종의 포트포워딩이 내부에서 빈번하게 이루어지는 것이다.
  • Super DMZ는 내부 네트워크의 특정 장치를 외부에 완전히 노출시키는 것이다.
    - 타 장치의 포트포워딩이 불가능해짐

NAT hairpin

NAT 내부에서 NAT로 ping을 때리면 어떻게 될까?

다음 예시에서 h1이 168.131.151.1로 ping을 때렸다.

결론은 무시된다.

ping의 흐름은

  • 10.0.0.10 -> 168.131.151.1로 요청을 하면
  • SNAT가 발생해 168.131.151.1 -> 168.131.151.1로 나가고
  • 응답은 168.131.151.1 -> 168.131.151.1와 같은 형식으로 돌아온다.
  • 자기자신에게 그대로 다시 돌아오게 되면서 ping이 불가하고 무시된다.

잘 구분해서 쓴다면 통신을 못하지는 않지만 귀찮다. 매번 10.0.0.1과 168.131.151.1을 구분해야 한다.

이런 경우는 내부 망 테스트, 내부 접근 등에서 자주 사용된다.

예: Cloud-Kubernetes와 같은 환경에서 클러스터 구성

  • h1, h2, h3가 같은 네트워크에 속한 것처럼 보이지만 실제로는 다른 네트워크이다. (VLAN 아님)
  • 만약 내부에서 점검을 한다고 h1에서 Reachability 테스트를 해보면
    - h1 -> h3 (O) 두 라우터를 거쳐 NAT 변환 후 h3에 도달
    ping 10.0.0.30 -> SNAT(1.1.1.1) -> DNAT(1.1.1.2) -> DNAT(10.0.0.30)
    • h1 -> h2 (X) 같은 물리 네트워크에 있어 패킷이 같은 라우터로 돌아옴
      ping 10.0.0.20 -> SNAT(1.1.1.1) -> DNAT(1.1.1.1) -> ..?

해결법 => NAT Hairpin (또는 NAT loopback, NAT Reflection)

NAT Haripin

: 내부 네트워크의 장치가 동일한 네트워크 내에 있는 다른 장치에 공인 IP 주소를 통해 접근할 수 있도록 하는 기능

  • 내부 네트워크 장치가 내부 장치에 외부 IP로 접근하고자 한다면, 라우터는 내부에서 들어오는 요청에 대한 외부 IP와 포트를 인식하고 이를 다시 내부로 전달
    => 내부 IP와 포트로 매핑되기에, 라우터 외부로 패킷이 나가지 않고 내부에서 요청 처리

(참고) hairpin은 외부로 나갔다 들어오는 것이 아니기 때문에 hairpin이 적용되면 icmp가 찍히지 않는다. 적용되면 icmp가 남아있음.

이전의 클러스터 예제에서 Hairpin이 동작한다면,
h1-> h2: ping 10.0.0.20 -> SNAT(192.168.0.10) -> DNAT(192.168.0.20)으로 동작한다.

0개의 댓글