Search

'[DNS]'에 해당되는 글 1건

  1. 2017.10.26 [DNS] 루트 네임서버 만들기

[DNS] 루트 네임서버 만들기

[DNS] 2017. 10. 26. 18:08 Posted by 부르곰므

항상 공식적인 루트 네임서버만을 사용하다가 

어?! 내가 그냥 루트 네임서버를 구축할 수 있지 않을까? 생각이 들었다.

맨땅에 헤딩하면서 이것저것 만졌지만... 역시 쉽사리 구축할 수 없었고 그 방법을 서술한 내용도 찾을 수 없었다.


포기할 수는 없었다. 완전 같지는 않더라도 비슷하게 구현해 보고 싶어서 루트 zone을 찾았다. 루트 zone은 생각보다 쉽게 찾을 수 있었다. 


다음과 같은 내용으로 구축을 했다.

========================

OpenDNS => Centos6.8_x64

RootDNS => Centos6.8_x64

ComDNS => Centos6.8_x64

DebDNS    => Centos6.8_x64

rootest.com => Centos6.8_x64

========================


<테스트 시나리오>

 오직 하나의 루트 네임서버만 있다고 가정한다.

 OpenDNS에서는 그 루트 네임서버를 참조한다.

 사용자는 rootest.com으로 질의를 해서 ip값을 알아온다.




# 가장 상위의 Root 네임서버

 1. named.conf


 다른 부분을 제외하고 가장 크게 만진 부분은 일반 bind에서 root hint를 참조하는 부분이다.

zone "." 부분은 원래 type은 hint로 루트 네임서버의 목록이 나열된 부분을 지정해 준다.

 

 Root 네임서버도 하나의 권한 네임서버일 것이라는 생각으로 이 부분을 master로 지정해 주었다. 

=====================[/etc/named.conf]============================

options {

        listen-on port 53 { any; };

        listen-on-v6 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";

        allow-query     { any; };

        recursion no;

};


logging {

        channel default_debug {

                file "data/named.run";

                severity dynamic;

        };

};


zone "." IN {

        type master;

        file "root.zone";

};


#include "/etc/named.rfc1912.zones";

#include "/etc/named.root.key";

============================================================


 2. root.zone


 루트 네임서버에 대한 권한을 가지고 있어야 하는 root.zone파일을 다음과 같이 구성했다. 

 한가지 특징은 위임인데, Glue Record로 구성했다. 글루 레코드는 네임서버를 나타내는 ns값에 대한 A레코드를 지정한 부분을 뜻한다.


 해당 존파일을 통해, .(루트)질의를 하면 root-server.net을 찾고 그 주소는 10.10.8.138로 나타난다.

 그리고 구축한 com과 net도 gtld로써 루트로 질의가 오면 찾아갈 수 있게 글루레코드로 구성했다.

=========================[root.zone]============================

$TTL 3H

.       IN SOA  root-server.net. admin.root. (

                                        0       ; serial

                                        1D      ; refresh

                                        1H      ; retry

                                        1W      ; expire

                                        3H )    ; minimum

.               IN      NS      root-server.net.

com.            IN      NS      yy.gtld-server.net.

deb.            IN      NS      n.gtld-server.net.

root-server.net.        IN      A       10.10.8.138

yy.gtld-server.net.     IN      A       10.10.8.137

n.gtld-server.net.      IN      A       10.10.8.133

============================================================


 3. 기타 구성

 루트 네임서버는 권한 DNS로 구성되어 리졸버와 DNS서버 구성을 굳이 할 필요가 없어 지웠다.



# 중간 부분의 GTLD 네임서버(comDNS, debDNS)

 1. named.conf


 그냥 권한 네임서버 만든다고 생각하자.

 루트힌트는 쓸 일이 없으니깐 그냥 주석처리 했다.

=====================[/etc/named.conf]============================

options {

        listen-on port 53 { any; };

        listen-on-v6 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";

        allow-query     { any; };

        recursion no;


};


logging {

        channel default_debug {

                file "data/named.run";

                severity dynamic;

        };

};


//zone "." IN {

//      type hint;

//      file "named.ca";

//};


include "/etc/named.rfc1912.zones";

include "/etc/named.root.key";

============================================================


 2. named.rfc1912.zones


 존파일을 참조할 수 있게 해주는 부분의 설정이다.

 com서버이기에 다음과 같은 설정을 추가한다.

============================================================

.............전략.............


zone "com" IN {

        type master;

        file "named.com";

        allow-update { none; };

};


................후략.................

============================================================


 3. zone파일


 루트 네임서버와 마찬가지로 약간 특이한 점은 GlueRecord이다.

============================================================

$TTL 3H

@       IN SOA  yy.gtld-server.net. admin.com. (

                                        0       ; serial

                                        1D      ; refresh

                                        1H      ; retry

                                        1W      ; expire

                                        3H )    ; minimum

com.                    IN      NS      yy.gtld-server.net.

rootest.com.            IN      NS      ns.rootest.com.

yy.gtld-server.net.     IN      A       10.10.8.137

ns.rootest.com.         IN      A       10.10.8.136

============================================================



# 질의를 위한 OpenDNS

 깡통 서버, 캐시 서버, 오픈 서버 라는 이름으로 불리우는 리커션을 위한 리커션에 의한 리커션의 DNS를 만들자. recursion은 자신이 권한을 가지고 있지 않은 질의에 대한 값을 ROOT HINT를 참조하여 알아오는 기능이다. 해당 기능을 설정하면 루트 네임서버로 반복적 질의를 보내기 


 1. named.conf

 이번에는 recursion기능을 허용해야한다. 또한, 루트 힌트를 질의 할 수 있게 해주어야 한다.

============================================================

options {

        listen-on port 53 { any; };

        listen-on-v6 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";

        allow-query     { any; };

        recursion yes;


};


logging {

        channel default_debug {

                file "data/named.run";

                severity dynamic;

        };

};


zone "." IN {

        type hint;

        file "named.ca";

};


include "/etc/named.rfc1912.zones";


============================================================


 2. named.ca

 zone파일이 있는 /var/named/chroot/var/named(또는 /var/named) 디렉토리의 named.ca를 수정해 주자. named.ca는 루트서버들이 저장되어 있는 일종의 zone파일이다.


 모두 필요없다. 위에서 구축한 루트에 대한 정보만 추가해 준다.

============================================================

;       This file holds the information on root name servers needed to

;       initialize cache of Internet domain name servers

;       (e.g. reference this file in the "cache  .  <file>"

;       configuration file of BIND domain name servers).

;

;       This file is made available by InterNIC

;       under anonymous FTP as

;           file                /domain/named.cache

;           on server           FTP.INTERNIC.NET

;       -OR-                    RS.INTERNIC.NET

;

;       last update:    December 01, 2015

;       related version of root zone:   2015120100

;

; formerly NS.INTERNIC.NET

;

.                       3600000      NS    root-server.net.

root-server.net.        3600000      A     10.10.8.138

============================================================

       


# 기본적인 권한서버

 rootest.com에 대한 설정은 어디에서나 찾아서 구축할 수 있기에 따로 기술하지 않는다.



# 확인할 사항

 모든 zone파일의 소유자는 root.named여야 한다.

 반드시 전부 service named restart를 통해 데몬을 재실행 한다.

 selinux도 disabled하고 방화벽도 내리고 해야 편하다.

 모든 서버에 이렇게 설정되었나 확인하자.



# 시나리오 실행.

 윈도우에서, 리눅스에서 어디서든 질의를 하되, 평소 KT나 구글의 DNS에 질의하듯, 질의하는 서버를 구축한 OpenDNS로 설정하자.


nslookup이라면 server 옵션으로

dig라면 그냥 @뒤에 붙여주면 된다. 


 귀찮으니 그냥 openDNS에 질의해 보겠다.(어차피 같다.)

dig @0 은 해당 서버에 설정된 리졸버(여기서는 127.0.0.1)에 질의하는 것과 같다.

==================================================

[root@localhost named]# dig @0 rootest.com +trace


; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.62.rc1.el6_9.4 <<>> @0 rootest.com +trace

; (1 server found)

;; global options: +cmd

.                       3600000 IN      NS      root-server.net.

;; Received 45 bytes from 127.0.0.1#53(0.0.0.0) in 3 ms


com.                    10800   IN      NS      yy.gtld-server.net.

;; Received 77 bytes from 10.10.8.138#53(10.10.8.138) in 4 ms


rootest.com.            10800   IN      NS      ns.rootest.com.

;; Received 62 bytes from 10.10.8.137#53(10.10.8.137) in 7 ms


rootest.com.            3600    IN      A       1.1.1.1

rootest.com.            86400   IN      NS      ns.rootest.com.

;; Received 78 bytes from 10.10.8.136#53(10.10.8.136) in 0 ms

==================================================



==================================================

[root@localhost named]# dig @0 rootest.com


; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.62.rc1.el6_9.4 <<>> @0 rootest.com

; (1 server found)

;; global options: +cmd

;; Got answer:

;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 52774

;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 1


;; QUESTION SECTION:

;rootest.com.                   IN      A


;; ANSWER SECTION:

rootest.com.            3600    IN      A       1.1.1.1


;; AUTHORITY SECTION:

rootest.com.            10796   IN      NS      ns.rootest.com.


;; ADDITIONAL SECTION:

ns.rootest.com.         86396   IN      A       10.10.8.136


;; Query time: 2 msec

;; SERVER: 127.0.0.1#53(0.0.0.0)

;; WHEN: Sat Oct 21 08:02:01 2017

;; MSG SIZE  rcvd: 78

==================================================

그냥 질의와 +trace질의시 경로와 정보를 잘 가져온다.


이해가 가지 않으면 질문해주세요.