| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | |||||
| 3 | 4 | 5 | 6 | 7 | 8 | 9 |
| 10 | 11 | 12 | 13 | 14 | 15 | 16 |
| 17 | 18 | 19 | 20 | 21 | 22 | 23 |
| 24 | 25 | 26 | 27 | 28 | 29 | 30 |
| 31 |
- 홈서버
- GPU
- opnsense
- spring boot
- 젠킨스
- proxmox
- 방화벽
- 서포터즈
- naver
- 홈랩
- prometheus-stack
- NAS
- jenkins
- API MARKETPLACE
- APIMARKETPLACE
- GPU 엔지니어링
- AI
- homelab
- 네이버
- 가상화
- slf4j
- 대외활동
- N100
- LOG
- Elk
- 2022
- k8s
- Docker
- log4j2
- 모니터링
- Today
- Total
G 스토리
[HomeLab] Docker와 BIND9으로 Private DNS 구축하기 본문

지난 포스팅 요약: Proxmox 내부에 격리된 사설 네트워크(192.168.10.x)를 만들고, 라우터 VM을 통해 인터넷 연결(NAT)과 IP 자동 할당(DHCP)까지 성공했습니다.
하지만 여전히 문제가 하나 남았습니다. "서버 IP(192.168.10.xx)를 일일이 외우기가 너무 귀찮다!"
이번 포스팅에서는 Docker와 BIND9을 활용해, 내부망에서만 동작하는 Private DNS Server를 구축하고, www.jiwon1.com 같은 도메인으로 서버에 접속하는 과정을 정리합니다.
특히, 구축 과정에서 겪었던 포트 53번 충돌 문제와 Docker 환경에서의 Self-Lookup 실패(NAT Loopback) 이슈에 대한 기술적 고찰을 중점적으로 다룹니다.
Step 1: DNS 서버를 위한 고정 IP 할당
DNS 서버 주소가 바뀌면 네트워크 전체가 마비되겠죠? 가장 먼저 새로운 Ubuntu VM(또는 기존 서버)의 IP를 고정해 줍니다. 저는 192.168.10.20으로 정했습니다.
파일 경로: /etc/netplan/50-cloud-init.yaml
network:
ethernets:
ens18:
dhcp4: false
addresses:
- 192.168.10.20/24 # DNS 서버의 고정 IP
routes:
- to: default
via: 192.168.10.1 # 지난번 만든 Router VM 주소
nameservers:
addresses:
- 8.8.8.8
version: 2

Step 2: BIND9 설정 파일 작성
Docker 컨테이너로 띄울 것이므로, 호스트에 설정 파일들을 미리 작성해 둡니다.
1. named.conf.options (기본 옵션)
내부 도메인은 내가 처리하고, 모르는 외부 도메인(예: google.com)은 구글(8.8.8.8)에게 토스(Forwarding)합니다.
options {
directory "/var/cache/bind";
recursion yes;
allow-query { any; };
listen-on { any; };
forwarders { 8.8.8.8; };
dnssec-validation no;
};

2. named.conf.local (존 선언)
zone "jiwon1.com" {
type master;
file "/etc/bind/zones/db.jiwon1.com";
};
zone "jiwon2.com" {
type master;
file "/etc/bind/zones/db.jiwon2.com";
};

3. db.jiwon1.com (정방향 존 파일)
실제 도메인과 IP를 매칭하는 핵심 파일입니다.
$TTL 86400
@ IN SOA ns.jiwon1.com. admin.jiwon1.com. (
2025022701 ; Serial (수정 시 +1 필수)
3600 ; Refresh
1800 ; Retry
604800 ; Expire
86400 ) ; Negative Cache TTL
;
@ IN NS ns.jiwon1.com.
@ IN A 192.168.10.20
ns IN A 192.168.10.20
www IN A 192.168.10.20 ; [www.jiwon1.com](https://www.jiwon1.com) -> 10.20 연결

Step 3: Docker 환경 구성 및 실행
1. 53번 포트 충돌 해결 (systemd-resolved) 💥
Ubuntu는 기본적으로 systemd-resolved 서비스가 53번 포트를 점유하고 있습니다. 이 상태로 도커를 실행하면 Port Conflict가 발생합니다. 과감하게 비활성화합니다.
# 1. 서비스 중지 및 비활성화
sudo systemctl stop systemd-resolved
sudo systemctl disable systemd-resolved
# 2. 꼬여있는 resolv.conf 파일 재설정 (Host는 구글 DNS 사용)
sudo rm /etc/resolv.conf
echo "nameserver 8.8.8.8" | sudo tee /etc/resolv.conf
2. Dockerfile 작성
Ubuntu 베이스 이미지에 BIND9을 설치하고 설정 파일을 복사합니다.
FROM ubuntu:latest
RUN apt-get update && apt-get install -y bind9 dnsutils && apt-get clean
RUN mkdir -p /etc/bind/zones
# 작성해둔 설정 파일 복사
COPY named.conf.options /etc/bind/named.conf.options
COPY named.conf.local /etc/bind/named.conf.local
COPY db.jiwon1.com /etc/bind/zones/db.jiwon1.com
COPY db.jiwon2.com /etc/bind/zones/db.jiwon2.com
EXPOSE 53/tcp
EXPOSE 53/udp
CMD ["/usr/sbin/named", "-c", "/etc/bind/named.conf", "-g"]

3. 빌드 및 실행
# 이미지 빌드
sudo docker build -t mybind9 .
# 컨테이너 실행 (UDP/TCP 53번 포트 개방 필수)
sudo docker run -d --name private-dns \
-p 53:53/udp -p 53:53/tcp \
--restart always \
mybind9
Step 4: Router DHCP 설정 변경
이제 내부망의 모든 VM들이 자동으로 이 DNS 서버를 사용하도록, Router VM의 설정을 변경합니다.
Router VM (/etc/dhcp/dhcpd.conf)
# 기존 8.8.8.8 대신 내 Private DNS IP로 변경
option domain-name-servers 192.168.10.20;
설정 후 sudo systemctl restart isc-dhcp-server를 입력하면 적용됩니다.

🧐 기술적 고찰: 왜 DNS 서버 본인은 조회가 안 될까?
구축을 완료하고 테스트하던 중 흥미로운 현상을 발견했습니다.
(1) 다른 VM(Client)에서 조회 시: 성공 ✅Server: 192.168.10.20이 응답하며 정확한 IP를 반환합니다.
(2) DNS 서버 본체(Host)에서 조회 시: 실패 ❌NXDOMAIN이 뜨거나 타임아웃이 발생하며, 결국 8.8.8.8로 넘어가서 찾지 못합니다.
💡 원인: Docker NAT Loopback (Hairpinning) 이슈
분명 내 컴퓨터 안에 DNS가 떠 있는데, 왜 정작 주인인 나는 내 서버를 못 찾는 걸까요? 이는 Docker 네트워크의 구조적 특성 때문입니다.
- 외부 VM 접속: 패킷이
192.168.10.20NIC로 들어옴 → Docker의 포트 포워딩 규칙(PREROUTING)에 걸림 → 컨테이너로 전달 (성공) - Host 본체 접속: 패킷이 내부에서 발생(OUTPUT) → 외부에서 들어오는 트래픽이 아니므로 Docker의 NAT 규칙을 타지 않음 → "내가 나한테(10.20) 쏘는데?" 하며 패킷이 길을 잃거나 루프백 처리가 꼬임.
마치며
이로써 Router(DHCP/NAT)부터 Private DNS까지, Proxmox 홈랩을 위한 기초 인프라 공사가 끝났습니다. 이제 IP 주소 대신 www.jiwon1.com 같은 도메인을 사용해 쾌적하게 서비스를 올릴 준비가 되었습니다! 🚀

'IT 이것저것 요모조모 > Infra' 카테고리의 다른 글
| 홈 서버/NAS 만들기 #1: 부품 드래곤볼부터 누드 테스트까지 (1) | 2026.02.07 |
|---|---|
| [HomeLab] 놀고 있는 N100 미니 PC로 OPNsense 구축하기 2부 (Zenarmor, WireGuard) (1) | 2026.01.09 |
| [HomeLab] 놀고 있는 N100 미니 PC로 고성능 방화벽(OPNsense) 구축하기 1부 (0) | 2026.01.04 |
| [HomeLab] Proxmox 내부망 구축기 (DHCP/NAT) (1) | 2025.11.29 |
| 간단 ESXI 8.0u (무료 버전) 다운로드 방법 (0) | 2025.09.18 |