BBUWOO'S [ LIKE UNIX ] WORLD Home > Lecture > Bind9 > Bind9-2  

HOME
WHAT's BBUWOO?
LInux AnNyung
Open Source
    GitHUB
    GitHUB (for PHP)
LECTURE
MINI LECTURE
QnA BOARD
ENGLISH POEM


WARNNING

강좌의 모든 권리는 본인 김정균에게 있으며 이 강좌를 상업적 목적 으로 이용
하거나 다른 곳으로 옮길시에는 본인의 허락이 있어야 한다. 이글의 가장 최신글은
http://oops.org 에서 확인할수 있다.



1. Named.conf Configuration

서두에서도 말했듯이, named.conf 를 설정하기 전에 bind 9 의 가장 큰 변화인 dnssec-key 를 먼
저 생성하여 rndc.conf 를 설정을 해야한다. 이는 nsupdate 를 이용한 업데이트의 보안적인 측면
도 있지만 일반 유저의 권한으로 rndc 를 이용하여 named 를 재시작 하기 위한 인증 절차를 위해
필요한 설정이기도 하다. 물론 nsupdate 를 사용하지 않는다는 가정하에, 설정을 하지 않고 bind
8 과 같이 사용을 할 수도 있다.

그럼 먼저 rndc.conf 생성부터 알아 보도록 하자.

bind 9 를 설치하면 rndc-confgen 이라는 명령어가 설치가 된다. 이 명령어를 이용해서 rndc.conf
를 생성을 하도록 한다. rndc-confgen 명령을 이용하면 key 값을 random 하게 생성해 준다.

 Hanterm - rndc-confgen > /etc/rndc.conf

 [root@bbuwoo /etc]$ rndc-confgen > /etc/rndc.conf
 [root@bbuwoo /etc]$ cat /etc/rndc.conf

  # Start of rndc.conf
  key "rndc-key" {
          algorithm hmac-md5;
          secret "n+h/daGNTmmEKimn25/h4g==";
  };

  options {
          default-key "rndc-key";
          default-server 127.0.0.1;
          default-port 953;
  };
  # End of rndc.conf

 [root@bbuwoo /etc]$

rndc.conf 의 rndc-key 를 임의의 다른 이름으로 변경을 한다.  key 와 options 두군데를 변경해
야 한다.

 Hanterm - rndc-confgen > /etc/rndc.conf

 [root@bbuwoo /etc]$ rndc-confgen > /etc/rndc.conf
 [root@bbuwoo /etc]$ cat /etc/rndc.conf

  # Start of rndc.conf
  key "oops-key" {
          algorithm hmac-md5;
          secret "n+h/daGNTmmEKimn25/h4g==";
  };

  options {
          default-key "oops-key";
          default-server 127.0.0.1;
          default-port 953;
  };
  # End of rndc.conf

 [root@bbuwoo /etc]$


rndc.conf 의 설정을 마쳤다면 이제 named.conf 의 설정을 알아 보도록 한다.





설명에 들어가기전에 주의 할것 중에 하나는 주석라인의 표기이다. Bind 8 이후 부터 named.conf
에서의 주석은 "//" 를 이용해서 하도록 한다는 점을 명심하자.

또한 named.conf 에서 사용되는 설정의 옵션들은 bind 소스 중 /doc/arm 디렉토리에 html 파일로
reference 를 제공하고 있으니, 이 파일을 참조하도록 한다. 여기에서의 설명 역시 이 파일을 참
조로 한다.

 Hanterm - /etc/named.conf

 [root@bbuwoo /etc]$ cat named.conf

   options {
           version "unknown";
           directory "/var/named";
           allow-transfer { 210.96.230.250; };
           // query-source address * port 53;
   };

   controls {
           inet 127.0.0.1 port 953 allow { localhost; } keys { "oops-key"; };
   };

   key "oops-key" {
           algorithm hmac-md5;
           secret "n+h/daGNTmmEKimn25/h4g==";
   };

   logging {
           category lame-servers { null; };
           category unmatched { null; };
           category network { null; };
           category notify { null; };
   };

   //
   // a caching only nameserver config
   //
   zone "." IN {
           type hint;
           file "named.ca";
   };

   zone "oops.org" IN {
           type master;
           file "oops.zone";
           allow-update { none; };
   };

   zone "babo.co.kr" IN {
           type master;
           file "babo.zone";
           allow-update { none; };
   };

   zone "154.24.210.in-addr.arpa" IN {
           type master;
           file "oops.rev";
           allow-update { none; };
   };

   zone "0.0.127.in-addr.arpa" IN {
           type master;
           file "named.local";
           allow-update { none; };
   };

   // secondary name server 설정
   // primary 의 inverse domain 에 대한 Secondary 설정
   zone "154.24.210.in-addr.arpa" IN { 
           type slave;
           file "154.24.210.in-addr.arpa.bak";
           masters { 210.24.154.1; };  // Primary NS의 IP 주소
   };

   // 'netusers.net' 의 Secondary 설정
   zone "netusers.net" IN {  
           type slave;
           file "netusers.bak";
           masters { 210.24.154.1; };
   };

 [root@bbuwoo /etc]$

먼저 named.conf 의 Options 에서 사용하는 옵션들 중 몇 개를 살펴 보도록 하자. 아래에 열거한
것만 사용해도 충분하다고 생각된다.

version : bind 의 버젼을 강제로 지정을 한다.
Directory : zone file이 위치할 곳을 지정하게 된다.
pid-file : PID 가 담긴 파일 생성 경로를 지정한다.
allow-transfer : BIND 4 에서의 xftnets 와 동일한 역할을 한다.

 Hanterm - cat /etc/named.conf

 [root@bbuwoo /etc]$ cat /etc/named.conf

   options {
          version "unknown";

          SHELL> dig @oops.org txt chaos version.bind. | grep -i version

          VERSION.BIND.           0       CH      TXT     "8.3.1-REL"

          위의 명령을 이용하면 해당 bind 의 버젼 정보를 볼 수가 있다. 하지만
          요즘 들어 exploit 이 버젼별로 나오기에 가능한 내가 사용하는 버젼은
          숨기는 것이 좋다. 또한 이렇게 버전정보를 숨기는 것은 공격탐지를 하
          는 크래커에게, 이 곳은 방비를 하고 있구나 하는 생각을 전달 할 수도
          있기에, 버젼 정보는 숨기는 것이 좋다.

          directory "/var/named";

          각 도메인의 설정파일들이 위치할 디렉토리를 정의한다. 보통 기본값으
          로 /var/named 를 많이 사용을 한다.

          pid-file  "/var/run/named.pid";

          named 를 실행하면 named 의 process id 를 기록한 파일을 /var/run 에
          생성을 한다. 이 옵션은 이 pid 파일의 위치를 변경할 수 있도록 한다.

          allow-transfer { 210.96.230.250; };

          nslookup 에서 ls 를 이용하면, 해당 DNS 에 있는 모든 데이타를 볼 수
          있다. 즉 그 서버의 zone data 를 쓰윽 훔쳐 볼 수가 있게 되는데 쓸데
          없는 정보를 유출 하기가 싫다면, 이 옵션을 이용해서 ls 정보를 볼 수
          있는 호스트를 지정을 할 수가 있다. 위의 예제는 210.96.230.250 에서
          만 볼 수 있도록 설정한 예이며 다수의 호스트를 지정할 경우에는 아래
          의 예제를 참고하면 된다.

          allow-transfer { 210.96.230.250;111.111.111.111;222.222.222.222; };

          // query-source address * port 53;

          query-source 는 address 와 port 두 가지 값을 지정 한다. address 는
          bind 가 요청이 들어오는 주소에만 귀를 기울이게 하며, 포트의 경우는
          해당 포트로 들어오는 쿼리에 귀를 귀울이게 한다. 이 옵션은 일반적인
          상황에서는 지정할 필요 없다. (위의 예제 에서도 주석 처리가 되어 있
          다. 하지만 bind 의 기본 포트(53) 번을 다른 포트로 운영을 하거나 또
          는 네임 서버와 외부의 요청을 하는 시스템 사이에 방화벽이 있을 경우
          유용하게 사용을 할 수가 있다.

          // forwarders { 10.0.0.1; 10.0.0.2; };

          이 옵션은 별로 사용할 필요는 없지만 가끔 유용하게 사용될 경우가 있
          으므로 설명을 한다. forwarders 는 forward server 를 지정할 때 사용
          을 한다. 즉, 자신에게 들어오는 질문을 지정한 서버로 보내 버리는 역
          할을 한다. 위와 같이 지정을 했을 경우, 우선적으로 10.0.0.1 로 먼저
          쿼리를 보내고, 10.0.0.1 에서 응답이 없을 경우,  그 다음인 10.0.0.2
          로 질의를 보낸다. 만약 둘 다 응답이 없으면 원래대로 ROOT SERVER 에
          질문을 요청하도록 한다.

          forwarders 를 options 에 설정을 했을 경우, 모든 질의에 대해서 동작
          을 하며, named.conf 에 설정 할 zone 에 대해서만 forward 를 하고 싶
          을 경우에는 각 zone block 에서 설정을 할 수 도 있다.

          // forward first;

          forward 는 forwarders 가 설정이 되어 있을 경우만 작동을 하게 된다.
          forward 값은 first 와 only 두 개의 값을 지정할 수 있으며, 기본값은
          first 이다. first 는 forwarders 의 리스트에 먼저 질의를 하도록하며
          리스트에서 모두 응답이 없을 경우 자신에게 질의를 하도록 한다. only
          를 설정하였을 경우에는 오로지 forwarders 의 리스트에만 질의를 하도
          록 한다. 이둘의 차이는 forwarders 에서 리스트에서 모두 응답이 없을
          경우  ROOT SERVER 로 질의를 하도록 한다고 했는데, only 의 경우에는
          fowrarders 의 리스트에서 응답이 없을 경우, 찾지 못하는 것으로 응답
          을 하게 된다는 것이다.
   };

   ...

 [root@bbuwoo /etc]$

다음은 controls 블럭에 대한 설명을 한다. controls 는 시스템 관리자가 local 네임서버에 어떠
한 영향을 주기위한 control channel 을 정의한다. 또한 rndc utility 로 명령을 전달 하기 위하
여 정의를 하기도 한다.

 Hanterm - cat /etc/named.conf

 [root@bbuwoo /etc]$ cat /etc/named.conf

   ...
   controls {
           inet 127.0.0.1 port 953 allow { localhost; } keys { "oops-key"; };

   
   inet 는 귀를 귀울일 주소를 지정한다. 모든 곳은 * 문자를 이용한다.
   port 는 귀를 귀울일 포트를 지정한다. rndc 의 경우 953 번 포트를 기본으로 사
        용을 한다.
   allow 는 tcp wrapper 와 비슷하게 생각하면 된다. 즉 allow 에 지정된 호스트로
        부터의 요청만 허락을 한다는 의미이다. 모든 곳을 지정할 경우에는 any 로
        지정하며, 어느곳도 허락하고 싶지 않다면 none 으로 지정을 하면 된다.
   keys 는 allow 에 지정이 되어 있지 않더라도 지정된 key 와 동일할 경우 허락을
        한다.

   보통은 위와 같이 지정을 하는 것이 일반적이며, keys 의 값은 설정자에 따라 달
   라진다.
   
   };
   ...

 [root@bbuwoo /etc]$

다음은 key 블럭을 보겠다. key 블럭 설정은 간단하다.  앞에서 생성한 rndc.conf 의 key 블럭을
그대로 여기에 카피를 하면 된다.

 Hanterm - cat /etc/named.conf

 [root@bbuwoo /etc]$ cat /etc/named.conf

   ...
   key "oops-key" {
           algorithm hmac-md5;
           secret "n+h/daGNTmmEKimn25/h4g==";
   };
   ...

 [root@bbuwoo /etc]$

다음은 logging 블럭을 살펴 보도록 하자.  logging 블럭에서는 channel, category 의 설정이 가
능하다. channel 은 로그 레벨및 파일 위치 등을 설정할 수 있으나 그냥 기본값을 사용하는 것이
가장 무난하고 여기에서는 불필요한 로그, 즉 사용자 레벨의 log 가 아닌 시스템 레벨의 log (여
기서 시스템 레벨이라는 것은 우리가 알지 못해도 상관없는 로그를 의미한다.) 를 남기지 않도록
하기 위하여 category 옵션의 설정만 보도록 한다.

설정은 category [category_name] { "[value]"; }; 의 형식을 취한다.  value 가 null 로 지정이
되면 로그를 남기지 않는다는 것을 의미한다.

 Hanterm - cat /etc/named.conf

 [root@bbuwoo /etc]$ cat /etc/named.conf

   ...
   logging {
           category lame-servers { null; };

           로그에 보면 가끔 named 프로세스에 대해 아래와 같은 로그가 남을 경우
           가 있다.

           Feb  5 09:35:46 ns named[26674]: Lame server on 'ryu.siyon.com'
           (in 'siyon.com'?): [210.105.79.103].53 'ns.mylover.com'

           이 로그는 도메인 siyon.com 이 ns.mylover.com 으로 위임 되었으나, 해
           당 네임서버가 Authority 설정이 되어 있지 않은 경우이다. 이것은 외부
           네트워크에서의 Lame Delegation 이므로 신경 쓰지 않아도 좋다.

           Lame Delegation 은 Namespace 상에서 깨어진 링크를 의미한다.

           nms.test.com         IN      NS      ns.nms.test.com.
                                IN      NS      ns2.nms.test.com.

           예를들어 nms.nobreak.com 이 위와 같이 두 개의 네임서버를 갖으나, 두
           서버 중 하나 혹은 모두가 해당 도메인에 대한 Authority를 갖지않는 경
           우, 즉 Primary, Secondary 설정이 안되어 있을 경우가 Lame delegation
           에 해당된다.

           이렇듯 lameserver 에 관한 부분은 우리가 별로 신경을 쓸 필요가 없다.
           그러므로 이 로그는 남기지 않는 것이 로그를 볼 때 편하다는 이유다.

           category unmatched { null; };

           unmatched 는 ipv4 나 ipv6 의 형식에 맞지 않은 class 나 또는 view 와
           매치되지 않는 것들에 대한 메세지를 남긴다. 존재하지 않는 class 에서
           의 로그 역시 남길 필요가 없다. 로그가 남더라도 어떻게 해 볼 수 있는
           것이 없기 때문이다.

           category network { null; };

           네트워크 작동에 대한 로그를 남기지 않는다.

           category notify { null; };

           NOTIFY protocol 에 관련된 메세지를 남기지 않는다.
   };
   ...

 [root@bbuwoo /etc]$

다음은 설정할 각 도메인에 대한 zone block 설정에 대해서 보도록 하겠다.  zone block 은 캐쉬
네임서버, 로컬호스트, 로컬 네트워크의 inverse domain, 각 도메인, name server가 위치하는 네
트워크에 대한 inverse domain, 세컨더리 도메인, primary 네임서버가 위치하는 네트워크에 대한
inverse domain, 7 가지에 대해서 설정을 한다. 만약 네임서버가 secondary 의 역할을 하지 않는
다면 가장 마지막의 secondary domain 과 primary 네임서버가 위치하는 네트워크에 대한 inverse
domain 은 설정할 필요가 없다.

아래는 캐시 네임서버와 로컬 호스트에 관련된 설정을 한다. 이 부분은 꼭 존재를 해야 하며, 그
대로 사용을 하면 된다.

 Hanterm - cat /etc/named.conf


 [root@bbuwoo /etc]$ cat /etc/named.conf

  ...
  zone "." IN {
          type hint;
          file "named.ca";
  };

  zone "localhost" IN {
          type master;
          file "localhost.zone";
          allow-update { none; };
  };

  zone "0.0.127.in-addr.arpa" IN {
          type master;
          file "named.local";
          allow-update { none; };
  };
  ...

 [root@bbuwoo /etc]$

다음은 primary domain 설정에 대해 살펴 보도록 하자. primary domain 설정은 아래의 형식에 의
해 설정을 한다.

zone "ORIGIN" IN {
  type master;
  file /path/filename;
  allow-update { none; };
};

ORIGIN 이라는 것은 설정할 domain name 을 의미한다. 이 ORIGIN 은 zone 파일에서 @ 으로 표현을
하게 된다. 즉, zone file 에서 @ 이란 named.conf 의 ORIGIN 에 설정된 domain name 을 의미하는
것이다.

type master 는 primary domain 을 설정하고 있다는 것을 정의한다.

file 은 ORIGIN 에 정의한 도메인에 대한 세부 설정을 할 zone file 의 경로를 적는다.  path 를
지정하지 않은채 파일 이름만 정의할 경우 상단의 Options 의 directory 에 정의한 path 에서 해
당 zone 파일을 찾게 된다.

allow-update 는 dynamic update 시도를 허락할 ip 대역이나, dnssec key 를 지정한다.  dynamic
update 는 nsupdate 라는 유틸리티를 이용하여 로컬, 또는 원격에서 name server 의 재시작 없이
recode 를 수정/삭제/생성 할 수 있게 해 주는 기능을 의미하며, 여기서는 논하지 않을 것이다.
그러므로 기본값으로 none 을 지정한다.

이는 필자가 bind 9 를 아직 운영을 하지 않고 있으며, 또한 bind 8 에서의 dynamic update 방법
이 변화가 발생하였으므로, 테스트를 해 볼 기회가 없어 나중으로 미루기로 한다.

 Hanterm - cat /etc/named.conf


 [root@bbuwoo /etc]$ cat /etc/named.conf

  ...
  zone " oops.org" IN {
          type master;
          file "oops.zone";
          allow-update { none; };
  };

  zone "babo.co.kr" IN {
          type master;
          file "babo.zone";
          allow-update { none; };
  };
  ...

 [root@bbuwoo /etc]$

다음은 네임서버가 위치한 네트워크에 대한 inverse domain의 zone 을 정의한다. inverse domain
은 reverse mapping 을 가능하게 하며, reverse mapping 이라는 것은 쉽게 ip address 로 domain
을 찾는 것을 의미한다.

inverse domain 의 경우 ISP 로 부터 할당을 받아야 하는데, 보통은 각 ip class 의 1 번이 기본
으로 지정이 되어있다. 만약 C class 의 서브넷을 분할을 받았을 경우 예를 들어서 128 - 255 번
까지를 할당을 받았을 경우에는 inverse domain 권한이 없게 된다. 이 경우에는 앞쪽 서브넷에서
위임을 받아야 하지만 이 작업이 노가다라 잘 안해준다. (ISP 쪽에서 해 줄 수 있는 일이라면 고
객이니 해 달라고 우기면 되겠지만 위임은 ISP 에서 할 일이 아니라, 앞쪽 서브넷의 관리자가 해
줘야 한다. 또한 이 위임에 대한 방법은 제대로 아는 사람도 드물기 때문에 아마 쉽게 하지는 못
한다.)

inverse domain 은 name server 와 mail server 의 ip 만 앞쪽 서브넷(1번을 가지고 있는 서브넷)
의 관리자에게 요청(부탁)을 해서 설정을 하면 된다.

하지만, 권한을 가지고 있지 않다고 설정을 할 필요가 없지는 않다. name server 를 자신으로 지
정할 경우 이 inverse domain 이 설정이 되어 있어야지만 자신으로 지정을 할 수 있기 때문이다.

inverse domain 의 정의 역시 primary doamin 을 정의하는 것과 동일하다.

zone "ORIGIN" IN {
  type master;
  file /path/filename;
  allow-update { none; };
};

다른점은 ORIGIN 의 표기법인데, inverse domain 의 ORIGIN 은 네트워크대역.in-addr.arpa 로 설
정을 한다. 네트워크 대역은 꺼꾸로 표현한다는 것을 주의한다. 예를들어 C class 의 1.2.3.0 네
트워크에 대한 inverse domain 을 설정한다면, 3.2.1-in-addr.arpa 가 된다는 것이다. 각 클래스
별 예제를 참고하도록 한다.

A class 1.0.0.0   => 1.in-addr.arpa
B class 162.1.0.0 => 1.162.in-addr.arpa
C class 210.1.1.0 => 2.2.210.in-addr.arpa

주의할 것은 inverse domain 은 네트워크에 대한 설정이다. 그러므로 도메인을 100개를 정의한다
고 해도 inverse domain 정의는 해당 네트워크에 대한 1개만 존재하면 된다. 만약 네트워크가 여
러개가 연결되어 있을 경우,  즉 NIC 가 2 개가 존재하고 1.1.1.0 과 2.1.1.0 두개의 네트워크에
연결이 되어 있다면 2 개를 정의하도록 한다.

아래는 210.24.154.0 네트워크에 대한 inverse domain 의 정의이다.

 Hanterm - cat /etc/named.conf


 [root@bbuwoo /etc]$ cat /etc/named.conf

  ...
  zone "154.24.210.in-addr.arpa" IN {
          type master;
          file "oops.rev";
          allow-update { none; };
  };
  ...

 [root@bbuwoo /etc]$

다음은 secondary name 서버의 설정을 보도록 하겠다.  sedondary name server 설정은 아래의 형
식을 따른다.

zone "ORIGIN" IN {
    type slave;
    file /path/filename
    masters { PRIMARY_SERVER_IP; };
};

ORIGIN 은 sendary 로 정의 할 domain 이름을 적는다.
type 은 slave 로 지정을 한다.
file 은 path 를 지정하지 않을 경우 options 의 directory 값에서 찾는다.
masters 는 primary name server 의 ip 를 지정을 한다.

primary 의 inverse domain 을 secondary 로 정의할 때는, origin 만 primary 네트워크 대역으로
정의를 하면 된다.

참고로, sendary 로 지정된 도메인의 경우 zone 파일은 name server 에 의해 자동으로 생성이 된
다. 그러므로 따로 zone 파일을 생성해줄 필요가 없다. 하지만 여기서 주의할 것이 보통 bind 는
root 의 권한으로 작동을 하게 하지 않는다.  보통 named -u named 와 같이 named 유저의 권한으
로 작동을 하게 하는데 options 의 directory 에 지정한 디렉토리에 named 유저에게 쓰기 권한이
없을 경우 파일이 생성이 되지 못하거나 또는 업데이트 되지 못한다. 그러므로 directory 옵션에
지정된 위치의 디렉토리에 꼭 named 를 구동하는 유저 또는 그룹에게 쓰기 권한을 줘야 한다.

 Hanterm - cat /etc/named.conf


 [root@bbuwoo /etc]$ cat /etc/named.conf

  ...
  // secondary name server 설정
  // primary 의 inverse domain 에 대한 Secondary 설정
  zone "154.24.210.in-addr.arpa" IN { 
          type slave;
          file "154.24.210.in-addr.arpa.bak";
          masters { 210.24.154.1; };  // Primary NS의 IP 주소
  };

  // 'netusers.net' 의 Secondary 설정
  zone "netusers.net" IN {  
          type slave;
          file "netusers.bak";
          masters { 210.24.154.1; };
  };

 [root@bbuwoo /etc]$




하나의 host에서 여러 개의 도메인을 처리할 때 간편하게 하는 방법을 알아 보도록 하겠다. 일단
기본적으로 하나의 sample zone 파일을 만들도록 한다.  그리고 named.conf 에서 서로 공유가 가
능한, 즉 IP address가 같은 경우에는 위에서 만든 sample file을 지정을 하도록 하여 사용할 수
도 있다.

 Hanterm - /etc/named.conf

 [root@bbuwoo /etc]$ cat named.conf

   options {
           directory "/var/named";
           allow-transfer { 210.96.230.250; };
   };

   logging {
           category lame-servers { null; };
           category cname { null; };
           category response-checks { null; };
           category notify { null; };
   };

   // a caching only nameserver config
   zone "." IN {
           type hint;
           file "named.ca";
   };
   
   zone "oops.org" IN {
           type master;
           file "sample.zone";
           allow-update { none; };
   };

   zone "babo.co.kr" IN {
           type master;
           file "sample.zone";
           allow-update { none; };
   };

   zone "154.24.210.in-addr.arpa" IN {
           type master;
           file "oops.rev";
           allow-update { none; };
   };

   zone "0.0.127.in-addr.arpa" IN {
           type master;
           file "named.local";
           allow-update { none; };
   };

 [root@bbuwoo /etc]$

다음은 /etc/resolv.conf를 보겠다.



>> 이전 : Name Service 란?
>> 다음 : resolv.conf configuration



    



 Home > Lecture > Bind9 > Bind9-2

Copyright 1997-2024 JoungKyun Kim 
LAST MODIFIED: 2017/01/18