bind on Ubuntu

출처: https://lindarex.github.io/bind9/ubuntu-bind9-setting/

요약(SUMMARY)Permalink

  1. bind9 DNS 서버 VM 호스트 설정
  2. bind9 DNS 서버 설정
  3. bind9 로컬 DNS 서버 및 영역(ZONE) 설정
  4. bind9 설정 확인
  5. 네트워크 명령어로 bind9 DNS 서버 VM에서 DNS 확인
  6. 네트워크 명령어로 외부 VM에서 DNS 확인

내용(CONTENTS)Permalink

1. DNS 서버 VM 호스트 설정Permalink

1.1. /etc/hosts 설정Permalink

$ sudo vi /etc/hosts
--------------------------------------------------------------------------------
127.0.0.1 localhost
127.0.1.1 ns.lindarex.local
10.0.1.32 ns.lindarex.local

# The following lines are desirable for IPv6 capable hosts
::1     ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
--------------------------------------------------------------------------------

1.2. /etc/hostname 설정Permalink

$ sudo vi /etc/hostname
--------------------------------------------------------------------------------
ns.lindarex.local
--------------------------------------------------------------------------------

host 설정 후 VM 재시작이 필요합니다.

2. bind9 DNS 서버 설정Permalink

$ sudo vi /etc/bind/named.conf.options
--------------------------------------------------------------------------------
options {
	directory "/var/cache/bind";
	dnssec-validation auto;
	auth-nxdomain no;
    listen-on port 53 { localhost; 10.0.1.0/24; };
    allow-query { any; };
    forwarders { 8.8.8.8; };
    recursion yes;
};
--------------------------------------------------------------------------------
  • 위 설정을 설명합니다.

      'directory "/var/cache/bind";'
      // 기본값은 '/var/cache/bind'입니다.
      // server의 작업 디렉터리(directory)를 정의하며 절대 경로(path)입니다.
    
      'dnssec-validation auto;'
      // 기본값은 'auto'입니다.
      // 'auto'로 지정하면, DNSSEC 유효성 검사가 활성화되고 DNS root zone에 기본 trust anchor가 사용됩니다.
    
      'auth-nxdomain no;'
      // 기본값은 'no'입니다.
      // 오래된 DNS 소프트웨어를 사용한다면 'yes'로 설정합니다.
    
      'listen-on port 53 { localhost; 10.0.1.0/24; };'
      // server가 query에 응답할 인터페이스(interface)와 포트(port)를 지정합니다.
    
      'allow-query { any; };'
      // DNS query를 할 수 있는 host를 지정합니다.
    
      'forwarders { 8.8.8.8; };'
      // 포워딩(forwarding)에 사용할 IP address를 지정합니다.
    
      'recursion yes;'
      // 기본값은 'yes'이며, 재귀(recursive) query를 활성화합니다.
    

DNSSEC(domain name system security extensions)에 대한 자세한 정보는 https://ko.wikipedia.org/wiki/DNSSEC와 https://한국인터넷정보센터.한국/jsp/resources/dns/dnssecInfo/dnssecInfo.jsp를 확인해 주시기 바랍니다.

3. bind9 로컬 DNS 서버 및 영역(ZONE) 설정Permalink

3.1. /etc/bind/named.conf.local 설정Permalink

  • 정방향(forward) 및 역방향(reverse) 영역(zone)을 지정합니다.

forward zone(forward lookup zone)은 host 이름 또는 FQDN에 대한 IP address를 관리하는 DNS zone이고, reverse zone(reverse lookup zone)은 IP address에 대응하는 host 이름 또는 FQDN을 관리하는 DNS zone입니다.

$ sudo vi /etc/bind/named.conf.local
--------------------------------------------------------------------------------
// FORWARD ZONE
zone "lindarex.local" IN {
  type master;
  file "lindarex.local.zone";
};

// REVERSE ZONE
zone "1.0.10.in-addr.arpa" IN {
  type master;
  file "lindarex.local.zone.rev";
};
--------------------------------------------------------------------------------
  • 위 설정을 설명합니다.

      'zone "lindarex.local" IN {'
      // forward zone의 domain 이름을 지정합니다.
      // 'IN'은 클래스(class)를 명시한 것으로 인터넷(internet)을 지정한 것입니다.
      // 지정하지 않으면 기본값은 internet이지만, 예제를 위해 지정했습니다.
      // 'hesiod', 'CHAOS' class 등이 존재합니다.
    
      'type master;'
      // zone type을 'master'로 지정합니다.
      // 'primary'와 같은 의미입니다.
      // slave (또는 secondary), mirror, delegation-only, forward, hint, redirect, static-stub, stub 등이 존재합니다.
    
      'file "lindarex.local.zone";'
      // zone 파일(file)의 path와 이름을 지정합니다.
      // 절대 path로 지정하지 않으면, 'named.conf.options'의 directory 설정을 루트(root) directory로 사용합니다.
    
      'zone "1.0.10.in-addr.arpa" IN {'
      // reverse zone의 IP 영역을 지정합니다.
      // 역순으로 기재하는 것을 주의합니다.
    

    위 예제는 서브넷 마스크(subnet mask)가 ‘10.0.1.0/24’이기 때문에 ‘1.0.10.in-addr.arpa’으로 설정합니다. 만약 subnet mask가 ‘10.0.1.0/16’ 이라면, ‘0.10.in-addr.arpa’으로 설정합니다.

3.2. /var/cache/bind/lindarex.local.zone 생성Permalink

  • forward zone file을 생성합니다.
$ sudo vi /var/cache/bind/lindarex.local.zone
--------------------------------------------------------------------------------
$TTL	86400
@	IN	SOA	ns.lindarex.local. root.ns.lindarex.local. (
			      1		; Serial
			 604800		; Refresh
			  86400		; Retry
			2419200		; Expire
			  86400 )	; Negative Cache TTL
;
@	IN	NS	ns.lindarex.local.
ns	IN	A	10.0.1.32
--------------------------------------------------------------------------------
  • 위 설정을 설명합니다.

      '$TTL	86400'
      // resolver가 record를 캐시(cache) 할 시간(초, seconds)을 정의합니다.
      // TTL(time-to-live)을 '0'으로 설정하면 record를 cache 하지 않습니다.
    
      '@	IN	SOA	ns.lindarex.local. root.ns.lindarex.local. ('
      // SOA(start of authority)는 zone(domain)에 대한 전역(global) 매개변수(parameters)와 zone 이름을 정의합니다.
      // zone file에는 하나의 SOA RR(resource records)만 허용됩니다.
    
      '1		; Serial'
      // serial number를 정의합니다.
      // 1에서 4294967295 사이의 부호 없는 32비트(bit) 값(최대 2147483647)이며, 10자리 필드로 정의됩니다. 
      // 이 값은 zone file의 RR이 업데이트될 때 증가해야 합니다.
    
      '604800		; Refresh'
      // 32 bit 값의 refresh seconds를 정의합니다.
      // slave가 master DNS SOA RR을 읽어서 master에서 zone을 새로 고치려고 시도하는 시간을 설정합니다.
    
      '86400		; Retry'
      // 32 bit 값의 update retry seconds를 정의합니다.
      // 'refresh' 만료 또는 NOTIFY 메시지 수신, slave가 master에 연결하지 못하는 경우의 재시도 간격을 지정합니다.
    
      '2419200		; Expire'
      // expire seconds를 정의합니다.
      // 32 bit 값이며, zone 데이터(data)가 더는 권한이 없는 경우를 나타냅니다.
      // slave(secondary) server에서만 사용됩니다.
    
      '86400 )	; Negative Cache TTL'
      // negative cache TTL seconds를 정의합니다.
      // 32 bit 값이며, 이전에는 'nx = nxdomain ttl'로 정의했었습니다.
      // 'NAME ERROR = NXDOMAIN' 결과는 resolver에 의해 cache 되고, 허용하는 최댓값은 3시간(10800 seconds)입니다.
    
      '@	IN	NS	ns.lindarex.local.'
      // DNS generic record format(textual format)입니다.
      // - 일반적으로 'owner-name', 'class', 'type', 'type-specific-data'로 구성됩니다.
      // - 'owner-name'
      //    + record가 속한 zone file에서 노드(node)의 소유자 이름 또는 레이블(label)입니다.
      //    + 위 예제에서는 '@'이며, '$ORIGIN'을 대체합니다.
      // - 'class'
      //    + protocol 패밀리 또는 protocol 인스턴스(instance)를 정의합니다.
      //    + 16 bit 값이며, 위 예제에서는 'IN'이며, internet protocol입니다.
      // - 'type'
      //    + 'type-specific-data'의 값을 결정하는 RR 유형이며, 위 예제에서는 'NS'입니다. 
      //    + 'NS'는 name server를 의미합니다.
      //    + SOA record로 정의된 domain 또는 하위(sub) domain의 권한 있는 name server를 지정합니다.
      // - 'type-specific-data'
      //    + 'class'와 'type' 값에 의해 정의됩니다.
      //    + 위 예제에서는 'ns.lindarex.local.'입니다.
    
      'ns	IN	A	10.0.1.32'
      // - 'owner-name'
      //    + 위 예제에서는 'ns'이며, host 이름을 지정합니다.
      // - 'class'
      //    + 위 예제에서는 'IN'이며, internet protocol입니다.
      // - 'type'
      //    + 위 예제에서는 'A'입니다.
      //    + 'A'는 IPv4 address record, host의 IPv4 address입니다.
      // - 'type-specific-data'
      //    + 위 예제에서는 '10.0.1.32'입니다.
    

3.3. /var/cache/bind/lindarex.local.zone.rev 생성Permalink

  • reverse zone file을 생성합니다.
$ sudo vi /var/cache/bind/lindarex.local.zone.rev
--------------------------------------------------------------------------------
$TTL	86400
@	IN	SOA	ns.lindarex.local. root.ns.lindarex.local. (
			      2		; Serial
			 604800		; Refresh
			  86400		; Retry
			2419200		; Expire
			  86400 )	; Negative Cache TTL
;
@	IN	NS	ns.
32	IN	PTR	ns.lindarex.local.
--------------------------------------------------------------------------------
  • forward zone file 설정과 다른 부분만 설명합니다.
      '@	IN	NS	ns.'
      // - 'owner-name'
      //    + 위 예제에서는 '@'이며, '$ORIGIN'을 대체합니다.
      // - 'class'
      //    + 위 예제에서는 'IN'이며, internet protocol입니다.
      // - 'type'
      //    + 위 예제에서는 'NS'이며, name server입니다.
      // - 'type-specific-data'
      //    + 위 예제에서는 'ns.'이며, host 이름을 지정합니다.
    
      '32	IN	PTR	ns.lindarex.local.'
      // - 'owner-name'
      //    + 위 예제에서는 '32'입니다.
      //    + bind9 DNS server VM의 IP address가 '10.0.1.32'이고, 
      //      subnet mask가 '10.0.1.0/24'이기 때문에 역순으로 '32'를 지정합니다.
      //    + 만약 subnet mask가 '10.0.1.0/16'이면, '32.1'로 설정해야 합니다.
      // - 'class'
      //    + 위 예제에서는 'IN'이며, internet protocol입니다.
      // - 'type'
      //    + 위 예제에서는 'PTR'입니다.
      //    + 'PTR'은 pointer, reverse DNS입니다
      // - 'type-specific-data'
      //    + 위 예제에서는 'ns.lindarex.local.'입니다.
    

4. bind9 설정 확인Permalink

4.1. bind9 설정 file 문법 확인Permalink

$ named-checkconf

아무 결과가 나오지 않아야 문법(syntax) 오류가 없는 것입니다.

4.2. bind9 zone file syntax 확인Permalink

  • forward zone file의 syntax를 확인합니다.
$ named-checkzone lindarex.local /var/cache/bind/lindarex.local.zone
zone lindarex.local/IN: loaded serial 1
OK
  • reverse zone file의 syntax를 확인합니다.
$ named-checkzone 10.0.1.32 /var/cache/bind/lindarex.local.zone.rev
zone 10.0.1.32/IN: loaded serial 2
OK
  • bind9 설정에 syntax 오류가 없다면, bind9을 재시작합니다.
$ sudo systemctl restart bind9.service

5. 네트워크 명령어로 bind9 DNS 서버 VM에서 DNS 확인Permalink

  • 아래 명령어는 bind9을 설치한 VM(10.0.1.32)에서 실행합니다.

5.1. nslookup 명령어(command)로 확인Permalink

$ nslookup ns.lindarex.local
Server:		127.0.0.53
Address:	127.0.0.53#53

Non-authoritative answer:
Name:	ns.lindarex.local
Address: 127.0.1.1
Name:	ns.lindarex.local
Address: 10.0.1.32
$ nslookup ns.lindarex.local localhost.localdomain
Server:		localhost.localdomain
Address:	::1#53

Name:	ns.lindarex.local
Address: 10.0.1.32

nslookup command에 대한 자세한 정보는 https://ko.wikipedia.org/wiki/Nslookup를 확인해 주시기 바랍니다.

5.2. dig command로 확인Permalink

$ dig ns.lindarex.local

; <<>> DiG 9.11.3-1ubuntu1.11-Ubuntu <<>> ns.lindarex.local
;; global options: +cmd
;; Got answer:
;; WARNING: .local is reserved for Multicast DNS
;; You are currently testing what happens when an mDNS query is leaked to DNS
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 36078
;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 65494
;; QUESTION SECTION:
;ns.lindarex.local.		IN	A

;; ANSWER SECTION:
ns.lindarex.local.	0	IN	A	127.0.1.1
ns.lindarex.local.	0	IN	A	10.0.1.32

;; Query time: 0 msec
;; SERVER: 127.0.0.53#53(127.0.0.53)
;; WHEN: Sat Apr 04 05:17:52 UTC 2020
;; MSG SIZE  rcvd: 78
$ dig -x 10.0.1.32

; <<>> DiG 9.11.3-1ubuntu1.11-Ubuntu <<>> -x 10.0.1.32
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 14862
;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 65494
;; QUESTION SECTION:
;32.1.0.10.in-addr.arpa.		IN	PTR

;; ANSWER SECTION:
32.1.0.10.in-addr.arpa.	0	IN	PTR	ns.lindarex.local.

;; Query time: 0 msec
;; SERVER: 127.0.0.53#53(127.0.0.53)
;; WHEN: Sat Apr 04 05:18:04 UTC 2020
;; MSG SIZE  rcvd: 100

dig command에 대한 자세한 정보는 https://ko.wikipedia.org/wiki/Dig를 확인해 주시기 바랍니다.

6. 네트워크 명령어로 외부 VM에서 DNS 확인Permalink

  • 아래 command는 외부 VM(10.0.1.0/24)에서 실행합니다.
  • 외부 VM에 name server 설정이 필요합니다.

name server 설정 방법은 우분투(Ubuntu) 환경에 네임 서버(Name server) 설정하기 포스트를 참고하시기 바랍니다.

6.1. nslookup command로 확인Permalink

$ nslookup ns.lindarex.local
Server:		10.0.1.32
Address:	10.0.1.32#53

Name:	ns.lindarex.local
Address: 10.0.1.32
$ nslookup 10.0.1.32
32.1.0.10.in-addr.arpa	name = ns.lindarex.local.

6.2. dig command로 확인Permalink

$ dig ns.lindarex.local

; <<>> DiG 9.11.3-1ubuntu1.11-Ubuntu <<>> ns.lindarex.local
;; global options: +cmd
;; Got answer:
;; WARNING: .local is reserved for Multicast DNS
;; You are currently testing what happens when an mDNS query is leaked to DNS
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 37938
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
; COOKIE: 4d8ecf3a8c01a1e3c63e18595e8ac359738e244f6d3d1ec2 (good)
;; QUESTION SECTION:
;ns.lindarex.local.		IN	A

;; ANSWER SECTION:
ns.lindarex.local.	86400	IN	A	10.0.1.32

;; AUTHORITY SECTION:
lindarex.local.		86400	IN	NS	ns.lindarex.local.

;; Query time: 0 msec
;; SERVER: 10.0.1.32#53(10.0.1.32)
;; WHEN: Sat Apr 04 05:51:22 UTC 2020
;; MSG SIZE  rcvd: 104
$ dig -x 10.0.1.32

; <<>> DiG 9.11.3-1ubuntu1.11-Ubuntu <<>> -x 10.0.1.32
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 18625
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 1, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
; COOKIE: 37c4348db0ce59742913765d5e8ac375010a08556676faca (good)
;; QUESTION SECTION:
;32.1.0.10.in-addr.arpa.		IN	PTR

;; ANSWER SECTION:
32.1.0.10.in-addr.arpa.	86400	IN	PTR	ns.lindarex.local.

;; AUTHORITY SECTION:
1.0.10.in-addr.arpa.	86400	IN	NS	ns.

;; Query time: 0 msec
;; SERVER: 10.0.1.32#53(10.0.1.32)
;; WHEN: Sat Apr 04 05:51:49 UTC 2020
;; MSG SIZE  rcvd: 144

마무리(CONCLUSION)Permalink

ubuntu 환경에 bind9 설정을 완료했습니다.

일반적으로 엔지니어가 아닌 이상 DNS 설정을 할 기회는 드물지만, bind9 설정을 통해 네트워크 용어와 개념을 조금은 익숙해지길 바라며 이 포스트를 작성했습니다.

bind9 설정에 대한 더 자세한 내용은 아래 참고 페이지를 확인해 주시기 바랍니다.

참고(REFERENCES)Permalink

위로 스크롤