본문으로 바로가기

DNS서버(네임서버) 설치

category 리눅스/Linux 일반 2013. 6. 22. 20:18

설치환경 : CentOS 6.4 minimal / bind-9.8.2
필요요소 : Bind 패키지, 도메인주소(예: uzuro.com) 및 IP주소(예: 123.456.789.00)
설정포트 : tcp 53 / udp 53

DNS서버 설치 준비사항

1. 도메인 주소

DNS서버를 구축하기 위해서 도메인 주소를 확보한다. 일반적으로 도메인주소는 도메인 대행업체에서 구입하게 되는데 각각의 대행업체들은 구입한 도메인을 자신들의 네임서버에 존파일을 등록해둔다. 대행업체의 ns.xxxx.xxx 와 같은 형태로 네임서버를 공지하고 있을것이다. 대행업체들의 설정메뉴들을 보면(예: 가비아) 호스트관리 메뉴가 있는데 이 곳에 호스트 등록을 함으로써 기본으로 제공하는 네임서버를 이용하지 않고 자신이 구축한 네임서버를 이용할 수 있게 된다.

호스트 등록은 경우에 따라 1~3일의 기간이 소요 될 수 있다.

2. TCP/UDP 프로토콜 port 53

DNS서버는 애플리케이션 프롵토콜중의 하나인 DNS 프로토콜을 사용한다. DNS 프로토콜은 네트워크를 경유하여 DNS 구현요소 간에 DNS 질의(DNS Query)와 응답(DNS Response)을 수행하히기 위한 클라이언트/서버 모델의 애플리케이션 프로토콜이다.

DNS 프로토콜은 TCP 및 UDP 포트번호 53번을 사용한다. DNS 질의의 대부분은 UDP 포트 53번을 사용하여 질의와 응답이 이루어진다. 그러나 UDP 헤더 이후의 DNS 헤더를 포함한 DNS 메시지 영역의 길이가 512 바이트를 초과하는 경우에는 TCP 53번 포트를 사용하는 TCP 연결을 통한 DNS 질의와 응답이 이루어지는 매커니즘이 존재한다. 또한 동일한 도메인 존을 가지고 있는 네임서버간의 도메인 존 데이터 송수신을 위한 존 트랜스퍼(Zone Transfer)를 수행하는 경우에는 많은 데이터 전송요청이 이루어지므로 TCP 53번을 사용한다.

고로 방화벽 및 공유기에서 TCP/UDP 53번 포트를 개방한다.

iptables를 활성화 해둔 경우 아래의 순서로 포트 개방

iptables -A INPUT -p udp -m state --state NEW --dport 53 -j ACCEPT
iptables -A INPUT -p tcp -m state --state NEW --dport 53 -j ACCEPT
service iptables save
service iptables restart

3. Bind 설치 방법 결정

Bind를 소스설치 할 것인지 yum 혹은 rpm을 이용한 설치를 할 것인지를 선택한다. 이 글에서는 yum을 이용한 설치를 진행한다(아래에 DNS서버 설치에서 다룸).

소스 설치시 다운로드 방법 : www.isc.org > Software - Bind 메뉴를 클릭해서 원하는 버전의 Bind버전을 tar.gz 형식을 다운로드한다.

DNS서버 설치

DNS서버의 기능을 제공하는 대표적인 소프트웨어가 BIND이다. BIND는 버전에 따라 설정 파일(/etc/named.conf)의 항목이 다를 수 있기 때문에 버전 9 이외의 BIND를 사용할 때는 주의해야 한다.

Bind 설치여부 확인

아래의 명령어의 결과로 bind 패키지들이 검색된다면 설치되어 있는 것이다.

rpm -qa | grep bind

Bind 설치

yum -y install bind-*

  ===================================================================================================================================
   Package                           Arch                     Version                                Repository                 Size
  ===================================================================================================================================

  Installing:

   bind                              x86_64                32:9.8.2-0.17.rc1.el6_4.4                   updates                4.0 M

   bind-chroot                       x86_64                32:9.8.2-0.17.rc1.el6_4.4                   updates                 71 k

   bind-devel                        x86_64                32:9.8.2-0.17.rc1.el6_4.4                   updates                378 k

   bind-dyndb-ldap                   x86_64                2.3-2.el6                                   base                    68 k

   bind-libs                         x86_64                32:9.8.2-0.17.rc1.el6_4.4                   updates                878 k
 
   bind-sdb                          x86_64                32:9.8.2-0.17.rc1.el6_4.4                   updates                306 k

   bind-utils                        x86_64                32:9.8.2-0.17.rc1.el6_4.4                   updates                182 k


  Installing for dependencies:

   portreserve                       x86_64                0.0.4-9.el6                                 base                    23 k

   postgresql-libs                   x86_64                8.4.13-1.el6_3                              base                   200 k


  Transaction Summary

  ===================================================================================================================================
  Install       9 Package(s)

Bind 관련해서 국내 검색결과나 서적들을 보면 caching-nameserver 관련 패키지를 설치하라고 하던데 현재의 Bind 버전에서는 이를 기본 bind 패키지에 포함시키는듯 싶다. 따로 설치하려고해도 이미 설치되어 있다고 나온다. 리눅스 관련 국내서적들이 출간된지 최소 5~6년이 지난 시점이다 보니 최신의 패키지들에 대한 구성이나 설정법이 상이할 수 있다.

1. bind Jail(chroot) 설정

yum으로 설치했을 경우, 디렉토리 구조를 살펴보면 /var/named/chroot 구조가 생긴다.

bind의 데몬파일은 named인데 이 named 서비스를 시작하지 않은 경우에는 마치 chroot가 작용하지 않는듯이 /var/named 디렉토리와 /etc 디렉토리에 설정파일들이 존재하고 있다. 이때 named 서비스를 시작하게 되면 자동으로 /var/named/chroot/var/named 디렉토리와 /var/named/chroot/etc 디렉토리에 각종 설정파일들이 자동으로 생겨난다.

이 파일들은 ls -la로 살펴보면 링크파일이 아니다. 추측컨데 기본 위치에서 서비스가 시작될때마다 복사해오고 종료하면 삭제하는 듯 싶다. bind-chroot 관련해서 정보를 찾기 어렵기에 정확한 진의를 판별하기가 어렵다.

/etc/named.conf 파일을 수정하고 named 서비스를 시작(재시작)하면 수정한 내용이 그대로 적용되어 /var/named/chroot/etc/named.conf에 똑같은 내용이 반영된다. 다른 파일들도 마찬가지다.

2. named.conf 설정

vi /etc/named.conf

  listen-on-v6 port 53 { ::1; };

  # 각 도메인의 zone 파일의 위치를 지정한다.
  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";

  # 네임서버 쿼리를 허용할 IP 혹은 IP 대역을 설정
   // allow-query     { localhost; };
  allow-query     { any; };

  # 이 구문을 추가하지 않으면 warning 을 봄
  empty-zones-enable no;

  recursion yes;

  dnssec-enable yes;
  dnssec-validation yes;
  dnssec-lookaside auto;

  # Path to ISC DLV key
  bindkeys-file "/etc/named.iscdlv.key";
  managed-keys-directory "/var/named/dynamic";
};


  # 네임서버 실행에 있어서 디버깅시 참고 할 수 있는 로그파일생성 위치 지정
  logging {
      channel default_debug {
              file "data/named.run";
              severity dynamic;
        };
  };

  # 루트도메인에 대한 설정을 named.ca라는 파일에서 참조하라는 설정
  # type 값은 hint(루트도메인을 지정), master(1차 네임서버), slave(2차 네임서버)
  zone "." IN {
        type hint;
        file "named.ca";
  };

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

3. named.rfc1912.zones 설정

도메인을 설정하는 부분으로 아래에선 uzuro.com 도메인에 대한 설정을 하고 있다.

vi /etc/named.rfc1912.zones

  #
  # ISC BIND named zone configuration for zones recommended by
  # RFC 1912 section 4.1 : localhost TLDs and address zones
  # and http://www.ietf.org/internet-drafts/draft-ietf-dnsop-default-local-zones-02.txt
  # (c)2007 R W Franks
  #
  # See /usr/share/doc/bind*/sample/ for example named configuration files.
  #

  # 로컬호스트 도메인에 대한 설정으로 기본 설정을 그대로 사용
  zone "localhost.localdomain" IN {
        type master;
        file "named.localhost";
        allow-update { none; };
  };

  # 로컬호스트 도메인에 대한 설정으로 기본 설정을 그대로 사용
  zone "localhost" IN {
        type master;
        file "named.localhost";
        allow-update { none; };
  };

  # ipv6에 대한 로컬 호스트 루프백 설정으로 기본 설정을 그대로 사용
  zone "1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa" IN {
        type master;
        file "named.loopback";
        allow-update { none; };
  };

  # 로컬호스트에 대한 루프백 인버스 도메인 설정으로 기본 설정을 그대로 사용
  zone "1.0.0.127.in-addr.arpa" IN {
        type master;
        file "named.loopback";
        allow-update { none; };
  };

  # 제로호스트에 대한 루프백 설정으로 기본 설정을 그대로 사용
  zone "0.in-addr.arpa" IN {
        type master;
        file "named.empty";
        allow-update { none; };
  };

  # uzuro.com 도메인
  zone "uzuro.com" IN {
        type master;
        file "uzuro.com.zone";
        allow-update { none; };
  };

  # 자신의 IP주소의 마지막을 뺀 주소를 역순으로
  zone "789.456.123.in-addr.arpa" IN {    
        type master;
        file "uzuro.com.rev";
        allow-update { none; };
  };

4. zone 파일 생성과 reverse 파일 생성

/var/named 디렉토리의 named.localhost 파일을 복사해 사용한다.

cp /var/named/named.localhost /var/named/uzuro.com.zone
cp /var/named/named.localhost /var/named/uzuro.com.rev

복사시 소유권이 변경되니 소유권을 다시 정정해준다.

chwon root.named /var/named/uzuro.com.zone
chown root.named /var/named/uzuro.com.rev

uzuro.com의 zone 파일을 수정한다. 수정할때 $TTL 값을 짧게 설정해서 당분간은 변경내용이 바로바로 등록되도록 한다.

vi uzuro.com.zone

  ; uzuro.com.zone

  $TTL 10M

  @       IN SOA  ns.uzuro.com. webmaster.uzuro.com. (

                                        0       ; serial
                                        1D      ; refresh
                                        1H      ; retry
                                        1W      ; expire
                                        3H )    ; minimum

          IN NS   ns.uzuro.com.
          IN MX   10 mail.uzuro.com.
          IN A    123.456.789.00     

  ns      IN A    123.456.789.00  
  mail    IN A    123.456.789.00  
  blog    IN A    123.456.789.00  
  music   IN A    123.456.789.00  
  game    IN A    123.456.789.00  
  howto   IN A    123.456.789.00  
  www     IN A    123.456.789.00  
  ftp     IN A    123.456.789.00  

  uzuro.com. IN TXT "v=spf1 ip4:123.456.789.00  ~all"

zone 파일의 설명

  • ; (세미콜론) : 주석을 의미함
  • $TTL : Time To Live의 약자로 uzuro.com의 호스트 이름을 질의해 갔을 때, 질의해 간 다른 네임서버가 해당 IP주소를 캐시에 저장하는 기간(3H - 3시간, 1D - 1일, 10M - 10분, 8600 - 24시간, 600 - 10분)
  • @ : /etc/named.rfc1912.zones에 정의된 uzuro.com을 의미함, uzuro.com.으로 고쳐써도 됨
  • IN : 클래스 이름으로 internet을 의미함
  • SOA : Start Of Authority의 약자로 권한의 시작을 뜻함. 또한, 괄호 안의 숫자는 시간을 의미하는데 차례로 serial(버전 정보), refresh(상위 네임 서버에게 업데이트된 정보를 요청하는 간격), retry(상위 네임 서버에 문제 발생시 재접속 간격), expire(상위 네임 서버에 접속 못할 경우 이전의 정보를 파기하는 간격), minimum(이 시간 이후에 정보가 삭제됨)을 말함. H는 Hour, D는 Day, W는 Week의 약자임
  • NS : Name Server의 약자로 설정된 도메인의 네임 서버 역할을 하는 컴퓨터를 지정함
  • MX : Mail Exchanger의 약자로 메일 서버 컴퓨터를 설정함
  • IN MX 10 mail.uzuro.com. : 10은 메일주소의 우선순위를 위한 숫자
  • A : 호스트 이름에 상응하는 IP주소를 지정함
  • CNAME : 호스트 이름에 대한 별칭을 부여할 때 사용함
  • uzuro.com. IN TXT "v=spf1 ip4:123.456.789.00 ~all" : 위 메일발송IP를 위조하여 보내온 메일은 수신자의 메일서버의 정책에 따라 판단하라 라는 뜻이다. SPF는 메일발신서버 인증 중 하나로서 소유하신 도메인의 SPF 레코드를 확인하거나, SPF 레코드 작성을 도와주는 곳입니다 https://www.kisarbl.or.kr/spf/spfWizard_step1.jsp

리버스파일을 수정한다. 리버스파일은 제대로 설정하더라도 회선을 대여받고 있는 ISP 업체에서 막아두고 있을 것이다. ISP업체에서는 이를 고정IP 를 사용하는 사용자에 한하여 리버스도메인을 등록해 준다. 메일서비스의 경우 이 리버스도메인을 지원해야 정상적인 전송이 되는 경우가 있다. KT DNS 서비스 운용지원

vi uzuro.com.rev

  ; uzuro.com.rev

  $TTL 10M

  @       IN SOA  ns.uzuro.com. webmaster.uzuro.com. (

                                        0       ; serial
                                        1D      ; refresh
                                        1H      ; retry
                                        1W      ; expire
                                        3H )    ; minimum

         IN NS   ns.uzuro.com.
  00     IN PTR  ns.uzuro.com.
  00     IN PTR  mail.uzuro.com.

5. 서비스 시작과 등록

named 서비스를 등록한다.

chkconfig named on

named 서비스를 시작한다.

service named start

named 관련 설정 파일들을 수정한 후에는 named 서비스를 재시작해준다.

service named restart

파일 체크

named.conf, named.rfc1912.zones 파일 설정 검사에 대하여 알아본다. 아무런 메세지도 나오지 않는다면 정상으로 간주한다.

named-checkconf /etc/named.rfc1912.zones
named-checkconf /etc/named.conf

zone 파일 설정 검사

named-checkzone [도메인명] [존파일 절대경로 위치]

named-checkzone uzuro.com /var/named/uzuro.com.zone

  zone uzuro.com/IN: loaded serial 0
  OK

네임서버 응답확인

dig 사용

dig @server domain query-type query-class

query-type 값

  • a : 네트워크주소를 의미함
  • any : 지정한 도메인의 모든 정보를 의미함
  • mx : 지정한 도메인의 메일서버 정보를 의미함
  • ns : 네임서버를 의미함
  • soa : SOA 정보를 의미함
  • hinfo : HINFO 레코드에 대한 정보를 의미함
dig @8.8.8.8 uzuro.com any

  ; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.17.rc1.el6_4.4 <<>> @8.8.8.8 uzuro.com any
  ; (1 server found)
  ;; global options: +cmd
  ;; Got answer:
  ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 62493
  ;; flags: qr rd ra; QUERY: 1, ANSWER: 4, AUTHORITY: 0, ADDITIONAL: 0


  ;; QUESTION SECTION:
  ;uzuro.com.                     IN      ANY


  ;; ANSWER SECTION:
  uzuro.com.              490     IN      SOA     ns.uzuro.com. webmaster.uzuro.com. 0 86400 3600 604800 10800
  uzuro.com.              490     IN      NS      ns.uzuro.com.
  uzuro.com.              490     IN      MX      10 mail.uzuro.com.
  uzuro.com.              490     IN      A       xxx.xxx.xxx.xx


  ;; Query time: 38 msec
  ;; SERVER: 8.8.8.8#53(8.8.8.8)
  ;; WHEN: Tue Jun 25 00:49:39 2013
  ;; MSG SIZE  rcvd: 127

리버스 설정을 검사한다. 현재는 domain.ns.kornet.net에 막혀 있다. 문의해야한다.

dig @8.8.8.8 00.789.456.123.in-addr.arpa PTR

  ; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.17.rc1.el6_4.4 <<>> @8.8.8.8 00.789.456.123.in-addr.arpa PTR
  ; (1 server found)
  ;; global options: +cmd
  ;; Got answer:
  ;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: 9117
  ;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 0


  ;; QUESTION SECTION:
  ;00.789.456.123.in-addr.arpa.   IN      PTR

  ;; AUTHORITY SECTION:
  789.456.123.in-addr.arpa. 1799  IN      SOA     789.456.123.in-addr.arpa. domain.ns.kornet.net. 2006062800 43200 3600 604800 43200


  ;; Query time: 235 msec
  ;; SERVER: 8.8.8.8#53(8.8.8.8)
  ;; WHEN: Tue Jun 25 01:19:15 2013
  ;; MSG SIZE  rcvd: 101

host 사용

host uzuro.com ns.uzuro.com

  Using domain server:
  Name: ns.uzuro.com
  Address: xxx.xxx.xxx.xx#53

  Aliases:
  uzuro.com has address xxx.xxx.xxx.xx
  uzuro.com mail is handled by 10 mail.uzuro.com.

nslookup 사용

nslookup uzuro.com 8.8.8.8

  Server:         8.8.8.8
  Address:        8.8.8.8#53

  Non-authoritative answer:
  Name:   uzuro.com
  Address: 123.456.789.00

set q= 의 값으로 A, ANY, CNAME, HINFO, MX, PX, NS, PTR, SOA, TXT, WKS, SRV, NAPTR등을 넣을수 있다.

nslookup

  > set q=MX

  > uzuro.com

  Server:         168.126.63.1
  Address:        168.126.63.1#53


  Non-authoritative answer:
  uzuro.com       mail exchanger = 10 mail.uzuro.com.


  Authoritative answers can be found from:
  uzuro.com       nameserver = ns.uzuro.com.
  mail.uzuro.com  internet address = 123.456.789.00
  ns.uzuro.com    internet address = 123.456.789.00