본문 바로가기

네임서버

BIND View 기반 Zone Transfer 구성 및 Query 테스트

반응형

BIND View 기반 Zone Transfer 구성 및 Query 테스트

BIND의 view 기능을 활용하여 내부/외부 DNS 응답을 분리하고 Master-Slave 간 Zone Transfer(AXFR)를 구성하는 방법입니다.

 

동일한 도메인에 대해 클라이언트 IP 기준으로 서로 다른 레코드를 응답하도록 구성하며 내부망 사용자는 내부 IP를 외부 사용자는 외부 IP를 조회하도록 설정합니다.

출처-https://learn.microsoft.com/ko-kr/windows-server/networking/media/dns-split-brain/dns-split-brain-01.jpg

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
728x90

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; };
};

동작 방식

  1. 내부 View 조건 확인
  2. 일치하면 internal-view zone 사용
  3. 일치하지 않으면 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

 

728x90
반응형