BIND View 기반 Zone Transfer 구성 및 Query 테스트
BIND의 view 기능을 활용하여 내부/외부 DNS 응답을 분리하고 Master-Slave 간 Zone Transfer(AXFR)를 구성하는 방법입니다.
동일한 도메인에 대해 클라이언트 IP 기준으로 서로 다른 레코드를 응답하도록 구성하며 내부망 사용자는 내부 IP를 외부 사용자는 외부 IP를 조회하도록 설정합니다.

Master DNS 서버 설정
- 운영체제 계열: RHEL/CentOS
- 설정 파일: /etc/named.conf
named.conf 설정
vim /etc/named.conf
options {
listen-on port 53 { any; };
directory "/var/named";
dump-file "/var/named/data/cache_dump.db";
statistics-file "/var/named/data/named_stats.txt";
memstatistics-file "/var/named/data/named_mem_stats.txt";
recursing-file "/var/named/data/named.recursing";
secroots-file "/var/named/data/named.secroots";
version "UNKNOWN";
allow-query { any; };
allow-query-cache { any; };
allow-transfer {
127.0.0.1;
192.168.0.62;
192.168.0.63;
};
notify yes;
also-notify { 192.168.0.63; };
recursion yes;
recursive-clients 10000;
check-names master ignore;
check-names slave ignore;
check-names response ignore;
zone-statistics yes;
dnssec-enable yes;
dnssec-validation yes;
bindkeys-file "/etc/named.root.key";
managed-keys-directory "/var/named/dynamic";
pid-file "/run/named/named.pid";
session-keyfile "/run/named/session.key";
};
statistics-channels {
inet 192.168.0.62 port 7777 allow { 192.168.0.0/24; };
};
include "/etc/named.root.key";
include "/etc/named.logging.conf";
Internal View 설정
view "internal-view" {
include "/etc/named.rfc1912.zones";
match-clients {
127.0.0.1;
192.168.0.62;
};
zone "." IN {
type hint;
file "named.ca";
};
zone "mocha.sangchul.kr" IN {
type master;
file "mocha.sangchul.kr.zone";
allow-transfer { 192.168.0.63; };
allow-update { 192.168.0.63; };
zone-statistics yes;
};
zone "0.168.192.in-addr.arpa" IN {
type master;
file "192_168_0.zone";
allow-transfer { 192.168.0.63; };
allow-update { 192.168.0.63; };
};
};
External View 설정
view "external-view" {
match-clients { any; };
recursion no;
zone "." IN {
type hint;
file "named.ca";
};
zone "mocha.sangchul.kr" IN {
type master;
file "ext-mocha.sangchul.kr.zone";
allow-transfer { 192.168.0.63; };
allow-update { 192.168.0.63; };
};
zone "0.168.192.in-addr.arpa" IN {
type master;
file "ext-192_168_0.zone";
allow-transfer { 192.168.0.63; };
allow-update { 192.168.0.63; };
};
};
Zone File 확인
ls -l /var/named/ | grep zone
-rw-r----- 1 named named 774 Jan 16 12:14 192_168_0.zone
-rw-r----- 1 named named 774 Jan 16 13:38 ext-192_168_0.zone
-rw-r----- 1 named named 359 Jan 16 13:44 ext-mocha.sangchul.kr.zone
-rw-r----- 1 named named 360 Jan 16 12:14 mocha.sangchul.kr.zone
Slave DNS 서버 설정
- 운영체제 계열: Ubuntu
- 설정 파일: /etc/bind/named.conf
named.conf 설정
vim /etc/bind/named.conf
options {
listen-on port 53 { any; };
directory "/var/cache/bind";
dump-file "/var/cache/bind/data/cache_dump.db";
statistics-file "/var/cache/bind/data/named_stats.txt";
memstatistics-file "/var/cache/bind/data/named_mem_stats.txt";
recursing-file "/var/cache/bind/data/named.recursing";
secroots-file "/var/cache/bind/data/named.secroots";
version "UNKNOWN";
allow-query { any; };
allow-query-cache { any; };
allow-transfer {
127.0.0.1;
192.168.0.63;
};
allow-notify { 192.168.0.62; };
recursion yes;
recursive-clients 10000;
masterfile-format text;
dnssec-validation auto;
};
statistics-channels {
inet 192.168.0.63 port 7777 allow { 192.168.0.0/24; };
};
include "/etc/bind/named.logging.conf";
Internal View 설정
view "internal-view" {
include "/etc/bind/named.conf.default-zones";
match-clients {
127.0.0.1;
192.168.0.62;
};
zone "mocha.sangchul.kr" IN {
type slave;
file "slaves/mocha.sangchul.kr.zone";
masters { 192.168.0.62; };
zone-statistics yes;
};
zone "0.168.192.in-addr.arpa" IN {
type slave;
file "slaves/192_168_0.zone";
masters { 192.168.0.62; };
};
};
External View 설정
view "external-view" {
match-clients { any; };
recursion no;
zone "mocha.sangchul.kr" IN {
type slave;
file "slaves/ext-mocha.sangchul.kr.zone";
masters { 192.168.0.62; };
};
zone "0.168.192.in-addr.arpa" IN {
type slave;
file "slaves/ext-192_168_0.zone";
masters { 192.168.0.62; };
};
};
Slave Zone File 확인
ls -l /var/cache/bind/slaves
total 16
-rw-r--r-- 1 bind bind 523 Jan 16 14:22 192_168_0.zone
-rw-r--r-- 1 bind bind 523 Jan 16 14:22 ext-192_168_0.zone
-rw-r--r-- 1 bind bind 435 Jan 16 14:22 ext-mocha.sangchul.kr.zone
-rw-r--r-- 1 bind bind 435 Jan 16 14:22 mocha.sangchul.kr.zone
정상적으로 Zone Transfer가 수행되면 Slave 서버에 zone 파일이 자동 생성됩니다.
설정 검증
named-checkconf
named-checkconf
named-checkzone
named-checkzone mocha.sangchul.kr /var/named/mocha.sangchul.kr.zone
서비스 재시작
RHEL/CentOS
systemctl restart named
systemctl status named
Ubuntu
systemctl restart bind9
systemctl status bind9
Query 테스트
내부 클라이언트 테스트
내부 클라이언트(match-clients)
- 127.0.0.1
- 192.168.0.62
내부 View에 매칭되므로 내부 IP가 반환됩니다.
dig @192.168.0.62 mocha.sangchul.kr
; <<>> DiG 9.11.4-P2-RedHat-9.11.4-26.P2.el7_9.10 <<>> @192.168.0.62 mocha.sangchul.kr
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 55545
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 2, ADDITIONAL: 3
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;mocha.sangchul.kr. IN A
;; ANSWER SECTION:
mocha.sangchul.kr. 60 IN A 192.168.0.61
;; AUTHORITY SECTION:
mocha.sangchul.kr. 60 IN NS ns2.mocha.sangchul.kr.
mocha.sangchul.kr. 60 IN NS ns.mocha.sangchul.kr.
;; ADDITIONAL SECTION:
ns.mocha.sangchul.kr. 60 IN A 192.168.0.62
ns2.mocha.sangchul.kr. 60 IN A 192.168.0.63
;; Query time: 0 msec
;; SERVER: 192.168.0.62#53(192.168.0.62)
;; WHEN: Mon Jan 16 14:31:29 KST 2023
;; MSG SIZE rcvd: 129
외부 클라이언트 테스트
외부 클라이언트
- any
외부 View에 매칭되므로 외부 IP가 반환됩니다.
dig @192.168.0.62 mocha.sangchul.kr
; <<>> DiG 9.18.1-1ubuntu1.2-Ubuntu <<>> @192.168.0.62 mocha.sangchul.kr
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 59508
;; flags: qr aa rd; QUERY: 1, ANSWER: 1, AUTHORITY: 2, ADDITIONAL: 3
;; WARNING: recursion requested but not available
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
; COOKIE: 8e19d8eed1f9367ccfb93c9b63c4e18f6dab5ba58f3930db (good)
;; QUESTION SECTION:
;mocha.sangchul.kr. IN A
;; ANSWER SECTION:
mocha.sangchul.kr. 60 IN A 10.10.10.61
;; AUTHORITY SECTION:
mocha.sangchul.kr. 60 IN NS ns.mocha.sangchul.kr.
mocha.sangchul.kr. 60 IN NS ns2.mocha.sangchul.kr.
;; ADDITIONAL SECTION:
ns.mocha.sangchul.kr. 60 IN A 192.168.0.62
ns2.mocha.sangchul.kr. 60 IN A 192.168.0.63
;; Query time: 4 msec
;; SERVER: 192.168.0.62#53(192.168.0.62) (UDP)
;; WHEN: Mon Jan 16 14:33:04 KST 2023
;; MSG SIZE rcvd: 157
View 동작 원리
BIND는 match-clients 조건을 기준으로 위에서부터 순차적으로 View를 평가합니다.
view "internal-view" {
match-clients { 127.0.0.1; 192.168.0.62; };
};
view "external-view" {
match-clients { any; };
};
동작 방식
- 내부 View 조건 확인
- 일치하면 internal-view zone 사용
- 일치하지 않으면 external-view 사용
따라서 any를 사용하는 View는 항상 가장 마지막에 배치하는 것이 중요합니다.
Zone Transfer 테스트
Slave 서버에서 AXFR 테스트
dig AXFR mocha.sangchul.kr @192.168.0.62
정상 동작 시 zone 전체 정보가 출력됩니다.
만약 실패한다면 다음 항목을 확인합니다.
- allow-transfer
- 방화벽(TCP/53)
- SELinux
- ACL 설정
- view match 조건
BIND의 view 기능을 활용하면 Split DNS 환경을 효율적으로 구성할 수 있으며 내부망/외부망 서비스 분리에도 매우 유용하게 활용할 수 있습니다.
참고URL
- bind view 설정 시 rndc 명령어 : https://scbyun.com/87
- Understanding views in BIND 9, with examples : https://kb.isc.org/docs/aa-00851
- 스플릿 브레인 DNS 배포에 DNS 정책 사용 : https://learn.microsoft.com/ko-kr/windows-server/networking/dns/deploy/split-brain-dns-deployment
'네임서버' 카테고리의 다른 글
| DNS 질의 시 TIMEOUT 시간 계산 방법 (0) | 2013.06.21 |
|---|---|
| named 실행 시 initgroups(): Operation not permitted 오류 발생 시 조치 방법 (0) | 2013.06.20 |
| DNS SPF 레코드 등록 및 질의 테스트(txt 레코드 조회) (0) | 2013.06.20 |
| Daum 메일 사용을 위한 MX 레코드 설정 방법 (0) | 2013.06.18 |
| [네임서버] DNSSEC 구축 방법 및 검증 (0) | 2013.06.18 |