bind9을 이용해서 dns서버 만들기

Ubuntu 22.04 환경에서 BIND9를 활용해 로컬 네트워크용 DNS 서버를 구축하는 방법을 설명합니다. 이 튜토리얼에서는 기본적인 DNS 서버 설정부터 테스트까지의 모든 과정을 다룹니다.

BIND9

BIND9(Berkeley Internet Name Domain)는 가장 널리 사용되는 DNS 서버 소프트웨어 중 하나입니다. 네트워크 내부에서 이름 해석을 수행하거나, 특정 도메인을 관리하기 위해 많이 사용됩니다.

설치 준비 및 환경 설정

패키지 설치

sudo apt update && sudo apt install bind9 bind9utils bind9-doc -y

IPv6 비활성화(선택사항)

IPv6 사용을 원하지 않는 경우 비활성화합니다.

sudo sysctl -w net.ipv6.conf.all.disable_ipv6=1
sudo sysctl -w net.ipv6.conf.default.disable_ipv6=1

기본 설정 파일 수정

BIND9의 설정 파일을 수정해 기본 기능을 활성화합니다.

/etc/bind/named.conf.options 수정

sudo nano /etc/bind/named.conf.options

다음과 같이 설정합니다.

options {
    directory "/var/cache/bind";

    recursion yes;  // 내부 네트워크에 대한 쿼리만 허용
    allow-recursion { 192.168.0.0/24; };  // 내부에서 외부로 허용할 네트워크 대역
    listen-on { any; };  // 수신하는 DNS 서버
    allow-query { 192.168.0.0/24; };  // 캐시된것 또는 존에대하여 쿼리를 허용할 네트워크 대역

    forwarders {
        8.8.8.8;
        8.8.4.4;
    };

    dnssec-validation no;
    listen-on-v6 { none; };  // IPv6 요청 비활성화
};

주의사항(참고 필수)

listen-on 부분을 any로 설정하였을때와 192.168.0.240으로 설정하였을때 수신하는 방식이 다르다.
테스트 할때 192.168.0.240으로 하니 /etc/systemd/resolved.conf에 DNS정보를 192.168.0.240으로 설정해야 정상동작하는 이슈가 생겨 좀 혼동되는 요인이 있었다.
dns서버자체에서 dns서버가 관리하는 도메인을 질의하였을때 응답이 없었는데 원인을 파악해보니 /etc/bind/named.conf.options의 listen-on과 /etc/systemd/resolved.conf에 DNS정보를 맞춰주어야 한다.

따라서 /etc/bind/named.conf.options 파일에서 listen-on을 { any; } 로 넣고
/etc/systemd/resolved.conf에 DNS=127.0.0.1로 변경하였다.

/etc/bind/named.conf.options 파일에서 listen-on을 { 192.168.0.240; }으로 넣었을때 결과
/etc/bind/named.conf.options 파일에서 listen-on을 { any; }로 넣었을때 결과

cpu코어수에따라 조회되는 결과 값이 중복으로 나타날 수 있음.

로컬 DNS 서버를 사용할 경우 해야되는 설정

이 설정을 하지않으면 정상동작하지 않을 수 있습니다.

vi /etc/systemd/resolved.conf
[Resolve]
......
DNS=호스트 서버의 아이피 # 127.0.0.1 # 위 주의사항(참고 필수) 내용 참조.
......
systemctl restart systemd-resolved.service

도메인 zone 설정

domain정보를 추가하는 zone을 정의합니다.
테스트를 위하여 test.local을 이용하여 생성합니다.

sudo vim /etc/bind/named.conf.local
zone "test.com" {
    type master;
    file "/etc/bind/zones/test.com";
};

도메인 존(zone) 파일 생성

DNS 서버가 사용할 도메인 정보를 정의합니다.

mkdir /etc/bind/zones
sudo vim /etc/bind/zones/test.com
$TTL    60
@       IN      SOA     dns.example.com. admin.test.com. (
                              3         ; Serial
                            120         ; Refresh
                             60         ; Retry
                        2419200         ; Expire
                             60 )       ; Negative Cache TTL
;
@       IN      NS      dns.example.com.
dns     IN      A       192.168.0.240 # dns서버정보 추가 필요.
@       IN      A       192.168.0.195 # 도메인의 루트 주소 test.com.
www     IN      CNAME   test.com.

192.168.0.195서버는 별도의 nginx서버를 만들어 테스트 하였습니다.

방화벽 설정

BIND9가 사용할 **DNS 포트(UDP 53번)**를 허용합니다.

DNS 서버 테스트

DNS 서버 재시작

BIND9 서버를 재시작하여 설정을 적용합니다.

sudo systemctl restart bind9

네트워크 클라이언트에서 DNS 테스트

로컬 PC에서 DNS 서버가 올바르게 동작하는지 확인합니다.

로컬호스트를 통해서 거쳐갔다오는 경우 아래와 같이 확인

root@hm-svr2:~# nslookup
> test.com
Server:		127.0.0.53
Address:	127.0.0.53#53

Non-authoritative answer:
Name:	test.com
Address: 192.168.0.195

DNS서버를 명시해서 체크하는 경우 아래와 같이 확인

root@hm-svr2:~# nslookup test.com 192.168.0.240
Server:		192.168.0.240
Address:	192.168.0.240#53

Name:	test.com
Address: 192.168.0.195

추가참고 자료

systemd-resolved VS resolvconf

dns설정 관련하여 리서치를 하다보면 resolvconf 패키지를 추가 설치하는 경우를 볼 수 있다.
systemd-resolved와 같이 사용할 필요는 없으나 내 환경에서는 굳이 resolvconf가 필요가 없다.
/etc/resolv.conf파일은 /run/systemd/resolve/stub-resolv.conf파일과 링크되어있고
/run/systemd/resolve/stub-resolv.conf 파일은 systemd-resolved가 관리하고있다.

따라서, /etc/systemd/resolved.conf에서 바꾸면된다.
/etc/resolv.conf의 nameserver를 변경하려고 resolvconf패키지를 이용할 필요는 굳이 없다.