이번 글에서는 Ubuntu 22.04 기반 VM 환경에서 로컬 DNS 서버를 구축하고, 다양한 환경(Docker, macOS, 그리고 Ubuntu)에서 이를 설정하는 방법을 정리합니다.
1. Ubuntu 22.04에서 DNS 서버 구축
1-1. systemd-resolved 비활성화
Ubuntu 22.04는 기본적으로 systemd-resolved라는 로컬 DNS 리졸버를 사용합니다.
하지만 직접 DNS 서버(dnsmasq)를 구축할 때는 systemd-resolved가 충돌할 수 있으므로 비활성화가 필요합니다.
sudo systemctl stop systemd-resolved
sudo systemctl disable systemd-resolved
sudo systemctl status systemd-resolved # 상태 확인: inactive (dead)여야 함
※ Raspberry Pi 환경은 systemd-resolved 대신 dnsmasq가 기본 DNS 서버로 사용되고 있습니다.
1-2. /etc/resolv.conf 재설정
systemd-resolved가 관리하는 심볼릭 링크를 제거하고, 직접 사용할 DNS 서버 주소를 명시합니다.
sudo rm -rf /etc/resolv.conf
sudo vi /etc/resolv.conf
nameserver 192.168.64.4 # DNS 구축 서버 IP
nameserver 192.168.0.1 # 네트워크 게이트웨이 또는 백업 DNS 서버
1-3. dnsmasq 설정파일 설정
아래는 dnsmasq.conf 설정파일 예시입니다.
모든 DNS 쿼리를 로그로 기록하도록 설정하였으며, 기본 업스트림 DNS 서버로는 로컬 네트워크의 게이트웨이와 퍼블릭 DNS 서버를 지정했습니다.
또한, 내부 도메인과 호스트명에 대해 IP를 명시적으로 매핑하여 로컬 네트워크 내에서 이름 해석이 가능하도록 설정했습니다.
# Log all DNS queries
log-queries
# Ignore default hosts file and system resolver nameservers
no-resolv
# Specify default DNS server
server=192.168.0.1 # Local DNS
server=1.1.1.1 # Cloudflare DNS
server=8.8.8.8 # Google Public DNS
server=9.9.9.9 # Quad9 DNS
# strict-order makes dnsmasq query servers in the listed order
strict-order
# Map specific hostnames and domains to IP addresses
address=/fish01/192.168.64.2
address=/fish02/192.168.64.4
address=/.rpi/192.168.0.54
address=/.cnap.dev/192.168.64.2
address=/.kind.internal/192.168.64.4
1-4. dnsmasq 기반 DNS 서버 Dockefile 구성
아래는 Alpine Linux 기반으로 dnsmasq와 webproc(프로세스 관리 도구)을 설치하고 구성하는 Dockerfile입니다.
FROM alpine:3.21.3
ENV WEBPROC_VERSION=v0.4.0
ENV WEBPROC_BASE_URL=https://github.com/jpillora/webproc/releases/download/${WEBPROC_VERSION}
RUN set -eux; \
apk update \
&& apk --no-cache add dnsmasq gzip \
&& apk add --no-cache --virtual .build-deps curl \
&& ARCH=$(uname -m); \
case "$ARCH" in \
x86_64) ARCH_DL="amd64" ;; \
aarch64) ARCH_DL="arm64" ;; \
armv7l) ARCH_DL="armv7" ;; \
*) echo "Unsupported architecture: $ARCH" && exit 1 ;; \
esac; \
OS=$(uname -s | tr '[:upper:]' '[:lower:]'); \
FILE=webproc_${WEBPROC_VERSION#v}_${OS}_${ARCH_DL}.gz; \
curl -sL "${WEBPROC_BASE_URL}/${FILE}" | gzip -d - > /usr/local/bin/webproc; \
chmod +x /usr/local/bin/webproc \
&& apk del .build-deps
RUN mkdir -p /etc/default/
RUN echo -e "ENABLED=1
IGNORE_RESOLVCONF=yes" > /etc/default/dnsmasq
COPY dnsmasq.conf /etc/dnsmasq.conf
ENTRYPOINT ["webproc","-c","/etc/dnsmasq.conf","--","dnsmasq","--no-daemon"]
1-5. docker-compose.yaml 구성
위 Dockerfile을 빌드하여 dnsmasq 서비스를 띄우기 위한 docker-compose.yaml 설정입니다.
services:
dnsmasq:
build:
context: .
dockerfile: Dockerfile
container_name: dnsmasq
ports:
- 53:53/udp
- 53:53/tcp
- 8053:8080/tcp
volumes:
- ./dnsmasq.conf:/etc/dnsmasq.conf
cap_add:
- NET_ADMIN
restart: always
1-6. 서비스 시작 및 테스트
Dockerfile과 dnsmasq.conf를 가지고 이미지를 빌드하고 DNS 서버를 컨테이너로 실행합니다
docker-compose up -d
nslookup gitlab.rpi
DNS 설정 변경 시에는 dnsmasq.conf 파일을 수정 후 다음 명령어로 재시작해야 합니다.
docker-compose stop
docker-compose rm
docker-compose up -d
또는 다음과 같이 웹 인터페이스(http://192.168.64.4:8053)를 통해 DNS 설정을 변경할 수 있습니다.
※ DNS 구축 서버 IP: 192.168.64.4

2. Docker 데몬 DNS 설정
Docker 컨테이너 내부에서 DNS 서버를 직접 지정하려면 Docker 데몬 설정 파일(/etc/docker/daemon.json)에 다음 내용을 추가합니다.
{
"insecure-registries" : [ "harbor.cnap.dev" ],
"dns": [ "192.168.64.4", "192.168.64.1" ]
}
DNS 적용을 위해 Docker 데몬을 재시작합니다.
sudo cp daemon.json /etc/docker/
sudo systemctl restart docker
테스트 컨테이너를 띄워 DNS 서버가 제대로 동작하는지 확인합니다.
docker run --rm -ti busybox sh
nslookup gitlab.rpi
3. 방화벽 설정
DNS 서버 포트와 웹 인터페이스 포트를 외부에서 접근 가능하도록 방화벽을 여는 설정합니다.
sudo ufw allow 53/tcp
sudo ufw allow 53/udp
sudo ufw allow 8053/tcp
4. macOS에서 DNS 설정
macOS에서 Wi-Fi 네트워크의 DNS 서버를 수동으로 추가하려면,
- 시스템 설정 → 네트워크 → 연결된 Wi-Fi 선택 → 세부사항 → DNS
+버튼을 눌러 DNS 서버 목록에 다음 IP를 추가합니다.
192.168.64.2 # DNS 구축 서버 IP
192.168.0.1
5. Ubuntu DNS 설정
Ubuntu에서는 systemd-resolved 설정 파일을 수정해 DNS 서버를 지정할 수 있습니다.
sudo nano /etc/systemd/resolved.conf
[Resolve] 섹션에 아래와 같이 추가 또는 수정합니다.
DNS=192.168.64.2 192.168.0.1
저장 후 systemd-resolved를 재시작하거나 상태를 확인합니다.
sudo systemctl restart systemd-resolved
resolvectl status
필요에 따라 /etc/resolv.conf 심볼릭 링크를 확인하고, systemd-resolved가 올바른 DNS 서버를 가리키도록 관리해야 합니다.
마무리
이번 글에서는 Ubuntu 22.04 기반 VM에서 dnsmasq를 활용해 DNS 서버를 구축하는 방법부터, Docker, macOS, Ubuntu에 DNS 설정 절차까지 전반적으로 다뤘습니다.
앞서 Kind로 구축한 Kubernetes 호스트의 Docker 데몬에 로컬 DNS 서버를 지정하고, DNS 엔트리에 호스트 IP를 인그레스 도메인(호스트명)으로 등록하면, Kubernetes에 배포된 모든 Pod에서 인그레스를 통해 설정된 도메인을 사용하여 서비스에 접속할 수 있습니다. 또한 외부 서버에서도 로컬 DNS를 설정하면 /etc/hosts에 인그레스 도메인을 별도로 등록하지 않아도 애플리케이션에 접속할 수 있습니다.
로컬 DNS 서버를 운영하면 개발이나 테스트 환경에서 빠르게 도메인을 등록하고 관리할 수 있어, 서비스 안정성과 효율성을 높이는 데 큰 도움이 됩니다.