느리지만 단단한 IT 인프라 이야기

Networks

[Networks] Hairpin NAT

바둑이 아저씨 2025. 11. 23. 18:01

hairpin nat ( supportportal.juniper.net )


NAT(Network Address Translation)을 사용하는 환경에서는 내부 클라이언트가 같은 내부 서버를 공인 IP 또는 도메인으로 접속할 때 접속이 되지 않는 상황이 발생합니다.

이 글에서는 그 이유와, 이를 해결하는 Hairpin NAT(NAT Loopback)이 작동하는 전체 흐름을 정리합니다.


1. 내부에서 공인 IP 접속이 안 되는 이유

내부 PC가 내부 서버를 공인 IP로 접속할 때, 기본 NAT 동작에서는 다음과 같은 문제가 발생합니다.

  • 문제 ① NAT 장비는 내부에서 오는 패킷을 "외부로 나가는 트래픽"으로 인식하지 않음
  • 문제 ② DNAT(Port Forwarding)가 외부 인터페이스에만 적용됨
  • 문제 ③ 라우팅이 내부로 다시 되돌아올 수 없음 (Hairpin 경로 없음)

예를 들어 내부 서버가 다음과 같다고 가정합니다.

  • 내부 서버: 192.168.10.10
  • 공인 IP: 1.2.3.4
  • 내부 PC: 192.168.10.50

내부 PC가 http://1.2.3.4 로 접속하면

① NAT 장비는 “내부 → 내부” 통신으로 판단하여 포트를 매핑(DNAT)하지 않음
② 서버는 응답을 같은 내부 네트워크(192.168.10.50)로 직접 보내버림
③ NAT 장비는 세션 테이블이 없어 응답 패킷을 정상적으로 처리하지 못함

이 때문에 정상적인 TCP 세션이 성립하지 않습니다.


2. Hairpin NAT(NAT Loopback)의 필요성

Hairpin NAT는 NAT 장비가 내부에서 들어오는 공인 IP 요청도 외부 요청처럼 처리하도록 만드는 기능입니다.

즉, 내부에서 공인 IP로 접속하더라도 DNAT → SNAT을 모두 수행하여
통신이 정상적으로 이루어지도록 경로를 “한 번 감아서 다시 내부로 돌려주는” 방식입니다.

  • 외부에서 접속할 때와 동일한 VIP/포트포워딩 규칙 사용
  • 내부 → 내부 통신이지만 NAT 테이블 매핑 생성
  • 응답 패킷도 NAT 테이블을 통해 되돌아와 세션 유지

3. Hairpin NAT 동작 흐름 (패킷 순서)

Hairpin NAT가 켜져 있을 때 내부 PC(192.168.10.50)가 내부 서버(192.168.10.10)를 공인 IP(1.2.3.4)로 접속하는 전체 흐름입니다.

  1. 클라이언트 → NAT 장비로 패킷 전달
    내부 PC는 다음과 같은 요청을 NAT에게 보냅니다.
    Source: 192.168.10.50
    Destination: 1.2.3.4 (공인 IP)
    
  2. NAT 장비가 “내부에서 외부로 가는 요청”처럼 인식
    Hairpin NAT 덕분에 내부 요청도 외부 인터페이스 규칙(DNAT)에 매칭됩니다.
  3. DNAT 수행
    NAT 장비는 목적지를 내부 서버로 변경합니다.
    Destination IP: 1.2.3.4 → 192.168.10.10
    
  4. SNAT 수행 (매우 중요)
    내부 서버가 응답을 NAT 장비로 보내도록 하기 위해 클라이언트의 내부 IP를 NAT의 내부 인터페이스 IP로 변경합니다.
    Source IP: 192.168.10.50 → 192.168.10.1 (예시)
    
  5. NAT 장비 → 내부 서버로 패킷 전달
    From: NAT 내부 IP (192.168.10.1)
    To:   서버 (192.168.10.10)
    
  6. 서버가 NAT 장비로 응답 전송
    서버는 NAT의 IP(192.168.10.1)를 클라이언트라고 인식하므로 응답을 NAT 장비로 되돌려 보냅니다.

  7. NAT 장비: 세션 테이블을 참조하여 역변환
    NAT는 DNAT/SNAT 테이블을 이용해 응답 패킷을 원래 클라이언트로 변환합니다.
    Source IP: 192.168.10.10 → 1.2.3.4
    Destination IP: 192.168.10.1 → 192.168.10.50
    
  8. 클라이언트가 정상적으로 응답을 수신 → 세션 성립

4. 핵심 정리

  • 기본 환경에서는 내부 → 공인 IP → 내부 서버가 불가능
  • Hairpin NAT는 “내부에서도 외부에서처럼 DNAT/SNAT 처리”해주는 기술
  • SNAT이 없으면 서버가 응답을 직접 내부 PC로 보내 NAT 세션이 깨짐
  • Hairpin NAT 구조에서는 ① DNAT → ② SNAT → ③ 서버 응답 → ④ 역변환 흐름이 필수

마지막으로 아래 구조도 그림을 통해 내부 클라이언트(192.168.10.50)가 공인 IP(1.2.3.4)로 접속했을 때 Hairpin NAT가 작동하여 내부 서버(192.168.10.10)와 통신이 성립되는 전체 흐름을 안내드립니다.

  (1) 클라이언트 요청
  [Client]
  192.168.10.50
      |
      |  TCP SYN: dst=1.2.3.4:80
      v

  +-----------------------------+
  |          NAT 장비           |
  |  (Hairpin NAT enabled)      |
  |                             |
  |  1) 패킷 수신                |
  |  2) DNAT: dst 1.2.3.4 -> 192.168.10.10
  |  3) SNAT: src 192.168.10.50 -> 192.168.10.1 (NAT IP)
  |  4) Forward to internal LAN |
  +-----------------------------+
      |
      |  TCP SYN (dst=192.168.10.10, src=192.168.10.1)
      v

  (2) 서버 응답
  [Server]
  192.168.10.10
      |
      |  TCP SYN/ACK -> dst=192.168.10.1 (NAT IP)
      v

  (3) NAT 장비 (역변환)
  +-----------------------------+
  |  NAT 장비                    |
  |  1) 수신 응답 확인            |
  |  2) 역변환: src 192.168.10.10 -> 1.2.3.4
  |             dst 192.168.10.1 -> 192.168.10.50
  |  3) 클라이언트로 전달        |
  +-----------------------------+
      |
      |  TCP SYN/ACK (src=1.2.3.4 dst=192.168.10.50)
      v

  (4) 클라이언트가 응답 수신 → 세션 성립
  [Client] 192.168.10.50  <-- 통신 성공 -->

각 단계별 패킷 요약 (요약 테이블)

1) 원본 요청 (클라이언트 → NAT)
   Src: 192.168.10.50
   Dst: 1.2.3.4:80

2) DNAT & SNAT 후 NAT → 서버 전달
   Src: 192.168.10.1      (NAT 내부 IP로 SNAT)
   Dst: 192.168.10.10:80  (공인IP -> 내부서버로 DNAT)

3) 서버 응답 → NAT
   Src: 192.168.10.10
   Dst: 192.168.10.1

4) NAT 역변환 → 클라이언트 전달
   Src: 1.2.3.4           (원래의 공인 IP로 복원)
   Dst: 192.168.10.50

간단한 플로우(요약)

  1. 클라이언트가 공인 IP(1.2.3.4)로 접속 시 NAT가 패킷을 수신한다.
  2. NAT는 DNAT(목적지 변환)를 통해 패킷을 내부 서버(192.168.10.10)로 바꾼다.
  3. 동시에 SNAT(출발지 변환)을 수행하여 서버가 응답을 NAT로 보내도록 한다.
  4. 서버 응답을 NAT가 받아 역변환(원래의 공인 IP/클라이언트 IP로 복원) 후 클라이언트로 보낸다.
  5. 이로써 내부에서 공인 IP로 접속해도 정상적으로 세션이 성립된다.

이러한 방식 덕분에 내부/외부 모두 동일 URL을 사용할 수 있고, SSL 인증서나 서비스 구성이 매우 편리해집니다.

내부에서 외부 DNAT에 적용된 공인 IP가 접근되지 않는다면, Hairpin NAT 적용 여부 확인이 필요합니다.

Axgate 장비를 기준으로 실제 장비에서 적용하는 방법에 대해서 추후 포스팅에 다룰 수 있도록 하겠습니다.

감사합니다.



'Networks' 카테고리의 다른 글

[Netwroks] Ping  (0) 2025.11.04