개발/문제해결

Hairpin NAT 문제 해결: 내부 DNS서버 운영

ksc036 2025. 10. 12. 01:13

문제 상황

pc에서 도메인으로 내가 운영하는 서비스에 접근이 되지 않았다.

 

  • 환경

공유기 (공인 IP: 1.2.3.4)
├─ PC A (192.168.0.10)  
└─ PC B (192.168.0.20)  

└─  핸드폰(192.168.0.30)

 

  • 설정

도메인을 이용해서 내 서비스에 접근하기 위해 다음과 같이 구성했다.

1. PC B에 서비스를 띄우고 포트를 리스닝 상태로 만들었다. (방화벽도 allow)

2. 도메인을 구입하고, ISP에서 할당받은 공인 IP를 A 레코드로 지정했다. (도메인 → 공인 IP 매핑)

3. 공유기에서 포트 포워딩을 설정하여 웹 서비스 요청이 PC B로 전달되도록 했다.

 

외부에서 도메인을 입력하면 정상적으로 서비스에 연결되었다.

 

하지만 PC A에서 도메인을 입력하면 연결이 되지 않았다. (timeout 발생)

또한 Wi-Fi를 사용하는 휴대폰에서도 도메인 접속이 되지 않았다. (데이터를 사용하면 접속 가능)

 

검색해보니 공유기에서 Hairpin NAT(=NAT Loopback) 을 지원하지 않으면 이런 문제가 발생한다고 한다.
요즘 공유기는 대부분 지원하지만, 통신사 기본 공유기나 일부 저가형 모델에서는 문제가 생길 수 있다.

 

해결방법

생각나는 해결방법은 3가지가 있었다.

  장점 단점
공유기 변경  돈만 쓰면 해결되어서 제일 간단 추가 비용 발생
hosts수정  간단하고 빠름 내부 ip변경 시 매번 변경, pc 많아지면 각각 설정필요
dns서버 운영 DNS 서버 설정만 하면 모든 PC에서 자동 적용 초기 설정이 다소 번거로움

 

해결방안은 크게 2가지로 분류할 수 있다.

공유기 변경 Hosts수정, DNS서버 운영

 

 

공유기 변경은 클라이언트가 공유기를 거쳤다가 목적지로 가는 것이고,

hosts 수정이나 DNS 서버 운영은 도메인이 내부 IP로 해석되므로 (같은 서브넷인 경우) ARP로 목적지 MAC을 알아내어 스위치가 있다면 라우터를 거치지 않고 통신한다.

(내 환경에서는 공유기 = 스위치+라우터 임으로 라우터를 거치게 된다. 하지만 라우터와 스위치가 분리되어있다면 라우터를 거치지 않는다.)

 

나는 DNS 서버를 직접 운영하면서 공부도 할 겸 dns서버 운영 방법을 선택했다.

 

DNS 서버 설정 방법 (Ubuntu 기준)

우선 항상 켜져 있는 PC B에 dnsmasq 기반 DNS 서버를 설치하기로 했다.

 

1. dnsmasq 설치

 

sudo apt update
sudo apt install dnsmasq

 

2. 설정파일 생성

설정파일 위치

메인 설정파일 /etc/dnsmasq.conf

추가 설정 폴더 /etc/dnsmasq.d/*.conf

 

추가 설정 폴더(/etc/dnsmasq.d)에 local.conf 이라는 파일의 이름을 만든 뒤 

address=/.example.com/192.168.0.20

 

example.com이나 test.example.com으로 접근하면 내부 ip를 반환하게 설정해준다.

 

3. 시스템의 DNS 서버를 dnsmasq로 변경

sudo nano /etc/NetworkManager/NetworkManager.conf

 

[main]
dns=dnsmasq

 

sudo systemctl restart NetworkManager

 

4. 외부 dns 전달

server=기존의dns주소(ex 8.8.8.8)

 

5. 설정 적용

sudo systemctl restart dnsmasq

 

6. 포트 열어주기 

sudo ufw allow 53 

 

7. dns 테스트

pcA에서

nslookup example.com 192.168.0.20

 

클라이언트(PC, 휴대폰 등)가 이 DNS 서버를 사용하도록 설정

1. 공유기 설정에서 DNS 서버 주소를 내가 만든 DNS 서버(192.168.0.20)로 변경 → Wi-Fi 연결 시 자동으로 이 DNS를 사용하게 됨

2. 기존 ipconfig /all 등으로 dns가 제대로 192.168.0.20를 가리키고 있는지 확인한다. (안되면 변경해주기!!)

 

minio console예시

 

내부적으로 사용하는 서비스중 하나인 minio콘솔에 정상적으로 도메인을 통해서 접근이 되는게 확인 되었다. 

 

 

'개발 > 문제해결' 카테고리의 다른 글

pm2 Error: listen EADDRINUSE: address already 에러  (0) 2026.02.02