G 스토리

[HomeLab] Docker와 BIND9으로 Private DNS 구축하기 본문

IT 이것저것 요모조모/Infra

[HomeLab] Docker와 BIND9으로 Private DNS 구축하기

Jiione 2025. 12. 13. 15:55

 

지난 포스팅 요약: Proxmox 내부에 격리된 사설 네트워크(192.168.10.x)를 만들고, 라우터 VM을 통해 인터넷 연결(NAT)과 IP 자동 할당(DHCP)까지 성공했습니다.

하지만 여전히 문제가 하나 남았습니다. "서버 IP(192.168.10.xx)를 일일이 외우기가 너무 귀찮다!"
이번 포스팅에서는 DockerBIND9을 활용해, 내부망에서만 동작하는 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.20 NIC로 들어옴 → Docker의 포트 포워딩 규칙(PREROUTING)에 걸림 → 컨테이너로 전달 (성공)
  • Host 본체 접속: 패킷이 내부에서 발생(OUTPUT) → 외부에서 들어오는 트래픽이 아니므로 Docker의 NAT 규칙을 타지 않음 → "내가 나한테(10.20) 쏘는데?" 하며 패킷이 길을 잃거나 루프백 처리가 꼬임.

마치며

이로써 Router(DHCP/NAT)부터 Private DNS까지, Proxmox 홈랩을 위한 기초 인프라 공사가 끝났습니다. 이제 IP 주소 대신 www.jiwon1.com 같은 도메인을 사용해 쾌적하게 서비스를 올릴 준비가 되었습니다! 🚀