Debian · Ubuntu 의 BIND 9 는 RHEL 계열과 파일 배치가 다르다. RHEL 은 /etc/named.conf 하나에 모으는 반면 Debian 은 /etc/bind/ 아래로 역할별로 쪼개 둔다. 여기서는 내부망용 캐시 리졸버와 사내 도메인의 권한 서버를 한 대에서 겸하는 구성을 다룬다.
| 파일 | 역할 |
|---|---|
/etc/bind/named.conf.options |
리스닝 · 포워딩 · 접근 제어 |
/etc/bind/named.conf.local |
직접 관리하는 존 선언 |
/etc/bind/db.* |
존 데이터 |
sudo apt install bind9 bind9-utils bind9-dnsutils
options {
directory "/var/cache/bind";
listen-on { any; };
listen-on-v6 { any; };
recursion yes;
allow-query { localhost; 192.168.10.0/24; };
forwarders {
1.1.1.1;
8.8.8.8;
};
forward only;
dnssec-validation auto;
};
forward only; 가 핵심이다. 이것이 없으면 포워더가 응답하지 않을 때 BIND 가 루트 힌트부터 스스로 재귀 질의를 시작한다. 폐쇄망이나 아웃바운드가 막힌 환경에서는 그 시도가 전부 타임아웃이 되어 응답이 몇 초씩 늦어진다. 포워더만 쓰게 하려면 반드시 함께 둔다. 반대로 포워더 장애 시에도 직접 해석하길 원하면 forward first; 로 두거나 생략한다.
allow-query { any; } 는 공인망에 노출되면 DNS 증폭 공격의 발판이 된다. 내부망 대역으로 한정한다.
내부 존은 직접 응답하고 나머지만 포워딩하는 것이 기본 동작이므로, 아래 존 선언과 함께 두면 그대로 동작한다. 특정 도메인만 다른 DNS(예: 사내 AD)로 넘기려면 그 도메인만 포워드 존으로 따로 선언한다.
zone "corp.example" IN {
type forward;
forward only;
forwarders { 192.168.10.10; 192.168.10.11; };
};
/etc/bind/named.conf.local
zone "abcd.efg" {
type master;
file "/etc/bind/db.abcd.efg";
};
zone "10.168.192.in-addr.arpa" {
type master;
file "/etc/bind/db.192.168.10";
};
/etc/bind/db.abcd.efg
$TTL 3600
@ IN SOA ns1.abcd.efg. admin.abcd.efg. (
2025091901 ; Serial
3600 ; Refresh
600 ; Retry
604800 ; Expire
300 ) ; Negative TTL
@ IN NS ns1.abcd.efg.
ns1 IN A 192.168.10.1
web IN A 192.168.10.20
* IN A 192.168.10.99
마지막 줄이 와일드카드다. *.abcd.efg 로 오는 질의 중 다른 레코드에 걸리지 않은 것만 192.168.10.99 로 응답한다. web.abcd.efg 는 위에 명시돼 있으므로 와일드카드가 아니라 그쪽으로 간다. 이 성질 때문에 와일드카드를 두면 오타가 전부 특정 IP 로 흘러가므로, 내부 실험망이 아니면 신중하게 쓴다.
존 파일을 고칠 때마다 Serial 을 올린다. 올리지 않으면 슬레이브가 변경을 가져가지 않는다.
/etc/bind/db.192.168.10
$TTL 3600
@ IN SOA ns1.abcd.efg. admin.abcd.efg. (
2025091901 3600 600 604800 300 )
@ IN NS ns1.abcd.efg.
1 IN PTR ns1.abcd.efg.
20 IN PTR web.abcd.efg.
99 IN PTR wildcard.abcd.efg.
역방향에는 와일드카드가 없다. PTR 은 IP 하나에 이름 하나를 붙이는 구조이므로 *.10.168.192.in-addr.arpa 같은 표기는 의미가 없다. 와일드카드 A 레코드가 가리키는 IP 하나에 대해 대표 이름을 하나 붙여 두는 것이 최선이다. 정방향 이름이 여러 개인데 역방향은 하나뿐인 상태가 되므로, 정·역 일치를 요구하는 서비스(메일, 일부 Kerberos 구성)에서는 문제가 될 수 있다.
sudo named-checkconf
sudo named-checkzone abcd.efg /etc/bind/db.abcd.efg
sudo named-checkzone 10.168.192.in-addr.arpa /etc/bind/db.192.168.10
sudo systemctl restart named # 배포판에 따라 bind9
Debian 12 부터 서비스 이름이 bind9 에서 named 로 바뀌었고 bind9.service 는 별칭으로 남아 있다.
dig @127.0.0.1 web.abcd.efg
dig @127.0.0.1 -x 192.168.10.20
dig @127.0.0.1 example.com +short
NXDOMAIN 은 서버는 답했는데 이름이 없다는 뜻이다. 존 파일의 오타, Serial 미변경, 존 선언 이름과 질의 도메인 불일치를 본다. 질의한 서버가 의도한 서버가 맞는지도 dig 의 SERVER: 줄로 확인한다.
communication error / timeout 은 서버에 닿지도 못한 것이다. 53번 포트는 UDP 와 TCP 를 모두 열어야 한다 — 응답이 512바이트를 넘으면 TCP 로 재시도하기 때문에 UDP 만 열면 큰 응답에서만 실패하는 까다로운 증상이 된다.
sudo ss -tulnp | grep :53
sudo iptables -L INPUT -n --line-numbers | grep -E '53|domain'
방화벽 관리 도구가 없는 서버라면 nftables 또는 iptables 를 직접 본다. 규칙을 전부 허용으로 바꾸는 것은 원인 확인 목적의 임시 조치일 뿐이며, 확인 뒤에는 53/udp · 53/tcp 만 허용하도록 되돌린다.