내부망에서 같은 네트워크에 있는 서버의 공인 IP 또는 도메인(example.com) 으로 접속했는데 접속이 안 되거나 멈추는 경우가 있다. 이 상황에서 등장하는 개념이 바로 NAT Loopback 혹은 Hairpin NAT다.
NAT Loopback과 Hairpin NAT는 같은 개념을 가리키는 용어로, 라우터 제조사나 문서마다 다르게 부르기도 한다. 일부 라우터에서는 NAT Reflection이라고도 한다.
사설 IP를 할당받은 5G 라우터에 DDNS를 설정하고 내부에서 해당 도메인으로 접속을 시도했는데 실패했다.
원인을 찾는 과정에서 NAT Loopback이라는 개념을 알게 되었고, 그 구조와 동작 방식을 정리해두기로 했다.
192.168.0.10 → 123.45.67.89로 바뀌어서 외부 서버에 도달123.45.67.89:80 → 192.168.0.20:80일반적인 라우터는 포트포워딩 설정을 통해 DNAT 처리를 한다. 외부에서 공인 IP:포트로 접근하면 이를 내부 서버 IP로 매핑해준다.
192.168.0.10192.168.0.20123.45.67.89192.168.0.1example.com → 123.45.67.89같은 내부망에 있는 클라이언트가 http://example.com으로 접속할 때, 도메인은 라우터의 WAN IP를 가리킨다.
핵심 문제: 이 요청이 외부로 나갔다가 돌아오는 게 아니라, 라우터에서 자기 자신에게 온 패킷으로 인식된다. 하지만 일반적인 라우팅 규칙으로는 이런 자기 자신을 목적지로 하는 패킷을 다시 내부로 보내는 처리가 불가능하다.
이걸 가능하게 하는 기술이 바로 NAT Loopback!
NAT Loopback이 동작하려면 라우터가 다음 3단계를 순차적으로 수행해야 한다:
123.45.67.89:80 → 내부 서버 192.168.0.20:80로 변경192.168.0.10 → 라우터의 내부 IP 192.168.0.1로 변경192.168.0.20에서 온 응답을 받게 됨123.45.67.89에 요청했으므로 세션이 매칭되지 않아 패킷을 거부함정상적인 NAT Loopback 처리:
1. 클라이언트(192.168.0.10:12345) → 라우터(123.45.67.89:80)
2. [DNAT] 목적지 변경: 123.45.67.89:80 → 192.168.0.20:80
3. [SNAT] 출발지 변경: 192.168.0.10:12345 → 192.168.0.1:54321
4. [Hairpin] 라우터 → 서버(192.168.0.20:80)
5. 서버 응답: 192.168.0.20:80 → 192.168.0.1:54321
6. [역방향 NAT] 라우터 → 클라이언트(192.168.0.10:12345)
NAT Loopback을 지원하지 않는 라우터에서는 다음과 같은 현상이 발생한다:
| 구분 | 설명 | 역할 |
|---|---|---|
| SNAT | 출발지 IP 변경 (내부 → 외부) | 응답 경로 보장 |
| DNAT | 목적지 IP 변경 (외부 → 내부) | 포트포워딩 |
| NAT Loopback | 내부에서 공인 IP로 접속한 패킷을 내부로 되돌리는 방식 | 내부-도메인 접속 허용 |
| Hairpin Routing | 라우터에서 패킷을 다시 내부 인터페이스로 포워딩 | 물리적 패킷 전달 |
NAT Loopback은 라우터가 DNAT과 SNAT을 동시에 적용한 뒤 자기 자신을 목적지로 가진 패킷을 내부망으로 포워딩할 수 있도록 하는 기술이다.
현대 대부분의 가정용/기업용 라우터는 이 기능을 지원하지만, 설정에서 비활성화되어 있거나 펌웨어가 오래된 경우 문제가 발생할 수 있으므로 확인이 필요함.