본문 바로가기

개발노트/LINUX

[우분투 16.04(LTS)] Ubuntu 16.04 에서 bind9 를 이용한 DNS 설정 (zone 파일은 이미 있는 상태)

DNS 서버 설정



(보안상 자세한 캡쳐와 아이피, 계정 등 정보는 자체 필터링(삭제))

설정 환경

1차 DNS

  • IP : xxx.xxx.xxx.1

  • 장비 : HP proliant DL380 G4

  • HDD RAID 구성 : RAID 5

  • 운영체제 : Ubuntu Server 16.04 (LTS) - 2021년 4월까지 지원

2차 DNS

  • IP : xxx.xxx.xxx.2

  • 장비 : HP proliant DL380 G4

  • HDD RAID 구성 : RAID 5

  • 운영체제 : Ubuntu Server 16.04 (LTS) - 2021년 4월까지 지원

기본 명령어

  • 네임서버 시작/종료/재시작 : DNS 서비스 자체에 문제가 있을 때 사용하는 명령어

    • # service bind9 start

    • # service bind9 stop

    • # service bind9 restart

  • 네임서버 환경설정 파일 점검

    • service bind9 restart 를 하기 전에 미리 실행해봐야 하는 명령어임.

    • # named-checkconf [설정_파일_이름]

      • ex) # named-checkconf /etc/bind/named.conf

      • ex) # named-checkconf /etc/bind/named.conf.options

      • ex) # named-checkconf /etc/bind/named.conf.local

      • ex) # named-checkconf /etc/bind/named.conf.default-zones

    • # namd-checkzone [점검_도메인] [zone_파일_이름]

      • ex) # named-checkzone domain.net /etc/nameserver/domain.zone

      • ex) # named-checkzone domain.net /etc/nameserver/domain.rev

      • ex) # named-checkzone domain.net /etc/nameserver/domain-sub.zone

  • 네임서버 시작 시 쌓이는 로그 확인 ( 오류를 확인할 수 있음 )

    • 파일 : /var/log/syslog

    • service bind9 restart 를 한 이후 아래 명령어를 실행하면 오류가 발생했을 경우 어떤 오류인지 확인이 가능하다.

    • # tail -n 40 /var/log/syslog

    • # vim /var/log/syslog

  • rndc 명령어 : 네임서버 데몬 컨트롤 유틸리티

    • # rndc stop

      • service bind9 stop 와 같다.

    • # rndc status

      • 네임서버의 각종 정보를 확인할 수 있는 명령어

    • # rndc reload [zone_파일_이름]

      • zone 파일을 다시 로드하는 명령어

      • bind9 서비스는 종료하지 않으면서 zone 파일들 만을 재 로드하여 zone 파일들의 변경사항들에 대해서만 bind9 서비스에 적용시킬 수 있다.

    • # rndc flush

      • 캐시된 정보를 제거하는 명령어

      • 네임서버 변경 후 캐시된 정보들을 flushing 해주는 것인데 실시간으로 네임서버를 조회할 때 유용하게 사용된다.

진행 수순

  1. zone, rev 파일 등 설정 파일 백업 준비

  2. bind 설치

  3. /etc/resolv.conf 파일 수정

  4. /etc/hosts 파일 수정

  5. /etc/bind/ 폴더 내의 설정 파일 수정

  6. 보안/권한 관련 apparmor 설정

  7. 1차(Master), 2차(Slave) DNS 설정

진행 방법


  1. FTP 로 /home/{username}/ 에 nameserver.tar.gz 파일을 서버에 업로드

  2. 압축 해제

    1. $ sudo tar -zxvf nameserver.tar.gz

  3. /home/{username}/etc/nameserver/ 디렉토리를 /etc/nameserver/ 디렉토리로 복사

    1. $ sudo cp -r nameserver/ /etc/nameserver/

  4. 불필요한 백업 파일 정리 (연도날짜형식으로 되어있는 파일 제거)

    1. $ find | egrep '[0-9]{8}' 로 삭제할 파일/디렉토리 찾기

    2. $ find | egrep '[0-9]{8}' | sudo xargs rm -r

  5. /etc/bind/named.conf.local 파일에 zone 을 추가한다.

    1. $ sudo vi /etc/bind/named.conf.local

  6. /etc/resolv.conf 파일에 nameserver 127.0.0.1 을 추가한다.

    1. vim /etc/resolv.conf

  7. /etc/hosts 파일에 xxx.xxx.xxx.2(현재 구축하고 있는 DNS 외부 공인 아이피) 를 추가한다.

    1. $ sudo vim /etc/hosts

  8. /etc/bind/named.conf.options 파일 수정 : listen-on port {any}; 추가

    1. $ sudo vim /etc/bind/named.conf.options

설정 파일 내용

/etc/bind/named.conf


// This is the primary configuration file for the BIND DNS server named.

//

// Please read /usr/share/doc/bind9/README.Debian.gz for information on the

// structure of BIND configuration files in Debian, *BEFORE* you customize

// this configuration file.

//

// If you are just adding zones, please do that in /etc/bind/named.conf.local


options {

   check-names master ignore;

   check-names slave ignore;

   check-names response ignore;

   allow-recursion {any;};

   allow-transfer { xxx.xxx.xxx.2; };

};



//include "/etc/bind/named.conf.options";

include "/etc/bind/named.conf.local";

// include "/etc/bind/named.conf.default-zones";



// Logging Configuration

logging {

   channel systemlog {

       file "/etc/bind/log/named.log";

       severity debug;

       print-time yes;

   };

   channel audit_log {

       file "/etc/bind/log/security.log";

       severity debug;

       print-time yes;

   };

   channel xfer_log {

       file "/etc/bind/log/xfer.log";

       severity debug;

       print-time yes;

   };

   category default {systemlog; };

   category security {audit_log; };

   category config { systemlog; };

   category xfer-in { xfer_log; };

   category xfer-out { xfer_log; };

   category notify { audit_log; };

   category update { audit_log; };

   category queries { audit_log; };

   category lame-servers { audit_log; };

};



/etc/bind/named.conf.local

  • 2차 DNS일 경우에는 아래 설정에서 “type master” 를 “type slave”로 변경하고

  • 각 zone 블럭 내에 masters { xxx.xxx.xxx.1; }; 을 추가해준다.


//

// Do any local configuration here

//


// Consider adding the 1918 zones here, if they are not used in your

// organization

//include "/etc/bind/zones.rfc1918";


zone "." {

    type hint;

    file "/etc/bind/db.root";

};


zone "domain.net" IN {

    type master;

    file "/etc/nameserver/domain.zone";

    check-names ignore;

};


zone "domain.kr" IN {

   type master;

   file "/etc/nameserver/domain_kr.zone";

   check-names ignore;

};


// Reverse zone configuration

zone "xxx.xxx.xxx.in-addr.arpa" { // C클래스, B클래스, A클래스 순으로 작성

   type master;

   file "/etc/nameserver/domain.rev";

   check-names ignore;

};


// Loopback zone configuration

zone "0.0.127.in-addr.arpa" {

   type master;

   file "/etc/nameserver/localhost.rev";

   check-names ignore;

};



/etc/bind/named.conf.options (사용 안 함)


options {

   directory "/var/cache/bind";

   listen-on port 53 {any;};

//    check-names master ignore;

//    check-names slave ignore;

//    check-names response ignore;


   // If there is a firewall between you and nameservers you want

   // to talk to, you may need to fix the firewall to allow multiple

   // ports to talk.  See http://www.kb.cert.org/vuls/id/800113


   // If your ISP provided one or more IP addresses for stable

   // nameservers, you probably want to use them as forwarders.

   // Uncomment the following block, and insert the addresses replacing

   // the all-0's placeholder.


   // forwarders {

   //  0.0.0.0;

   // };


   //========================================================================

   // If BIND logs error messages about the root key being expired,

   // you will need to update your keys.  See https://www.isc.org/bind-keys

   //========================================================================

   dnssec-validation auto;


   auth-nxdomain no;    # conform to RFC1035

   listen-on-v6 { any; };

};




/etc/apparmor.d/local/usr.sbin.named


# Site-specific additions and overrides for usr.sbin.named.

# For more details, please see /etc/apparmor.d/local/README.

/etc/nameserver/* rw,


  • 이 코드는 프로필을 reload 해줘야 적용된다.

  • Command to reload this profile : apparmor_parser -r /etc/apparmor.d/usr.sbin.named


Reload Zone

  • rndc reload

  • rndc reload zone파일명



Trouble Shooting

문제 발생시 도움이 되는 명령어들

  1. <설정 파일 확인> 아래 설정 파일의 이상 유무 확인은 named-checkconf 명령어로 확인한다.

    1. named-checkconf /etc/bind/named.conf

    2. named-checkconf /etc/bind/named.conf.local

    3. named-checkconf /etc/bind/named.conf.options

    4. 아무 메시지가 없으면 이상이 없는 것이다.

  2. <zone 파일 확인> 아래 zone 파일의 이상 유무 확인은 named-checkzone 명령어로 확인한다.

    1. named-checkzone [DOMAIN_ADDR] [ZONE_FILE]

      1. 뜻 : [DOMAIN_ADDR] 에 대한 [ZONE_FILE] 을 체크한다.

    2. named-checkzone domain.net /etc/nameserver/domain.zone

    3. named-checkzone domain.net /etc/nameserver/domain_kr.zone

  3. <Log 확인> service bind9 restart 를 실행한 후 /var/log/syslog 를 확인한다.

    1. 설정 파일들을 체크 한 후 service bind9 restart 명령어로 DNS 서비스를 재시작한다.

    2. /var/log/syslog 파일에 bind9 가 종료되고 실행되는 로그가 쌓이고 있으니 이 파일을 확인하면 된다.

      1. tail -n 30 /var/log/syslog

      2. vim /var/log/syslog

  4. 운영중에는 service bind9 restart 명령어 사용을 자제하고 rndc reload 명령어를 사용하는 것이 좋다.

DNS 설정하면서 발생했던 문제들

  1. bad owner name

    1. named-checkzone domain.net /etc/nameserver/domain.zone 명령어를 실행했을 때 bad owner name (check-names) 라는 오류가 발생하였다.

    2. 이는 BIND 서버가 기본적으로 RFC 1123을 준수하지 않는 이름들이 리소스 레코드에 포함하는지를 검사하고 그러한 경우에는 마스터 영역을 로드하지 않기 때문에 발생하는데, RFC 1123에는 언더스코어( _ ) 문자를 허용하지 않고 있기 때문에 발생했다.

      1. /etc/nameserver/domain.zone 파일의 레코드 중 abc_de 라는 이름에 언더스코어가 포함되어 있어서 문제가 되었음.

    3. 해결 방법

      1. /etc/bind/named.conf 파일의 options 블럭에 check-names master ignore; 를 추가해주면 된다.

      2. 그래도 해결되지 않을 경우 /etc/bind/named.conf.local 파일에 추가한 zone 블럭마다 check-names ignore; 를 추가해준다.

      3. 가장 좋은 방법은 레코드의 이름 중에 언더스코어를 포함하고 있으면 포함하지 않는 것으로 바꾸는 것이겠다.




  1. no TTL specified

    1. 오류라기 보다는 zone 파일 최상단에 TTL 부분이 주석처리 되어 있으므로 TTL이 명시되지 않았음을 알려주며 SOA 에서 설정한 MINTTL을 사용하겠다는 메세지가 있었음

    2. 해결 방법

      1. 해당 메시지를 일으키는 zone 파일에서 TTL 을 명시해줌.


  1. NS 'domain.net' has no address records (A or AAAA) 에러

    1. 네임서버 domain.net 가 주소 레코드 (클래스 A 또는 AAAA)가 없어서 발생하는 에러이다.

    2. 해결 방법

      1. 해당 메시지를 일으키는 파일에서 주소 레코드를 추가한다.


참고 자료 및 진행 순서에 대한 스크린샷




반응형