4/20/2007

bind configuration

# cat /etc/named.conf
// generated by named-bootconf.pl
options {
directory "/var/named";
//allow-transfer { none; };
//allow-query {192.168.1.0/24; localhost; };
//forwarders { 211.220.43.122; };
//version "None";
};

// a caching only nameserver config
controls {
inet 127.0.0.1 allow { localhost; } keys { rndckey; };
};

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; };
};

// linuxschool.net의 primary name server 설정
zone "linuxschool.net" IN {
type master;
file "test/linuxschool.net.zone";
};

// srv4u.net의 secondary name server 설정
zone "srv4u.net" IN {
type slave;
file "srv4u.net.bak";
masters { 192.168.0.1; };
};

include "/etc/rndc.key";
#

bind4와 bind9의 차이점중 주석문에서의 차이점도 있다.
bind4에서는 세미콜론(;)이 주석이었지만, bind9에서는 C(/*,*/)나 C++(//)스타일의
주석을 이용한다.
bind9에서 세미콜론을 주석으로 사용하면, 환경설정 구문의 끝으로 인식하기 때문에 주석
문의 시작으로 인식하지 않는다.

그럼 본격적으로 시작해보자.

⑴ Option {};
이 옵션문은 설정파일에서 한번만 사용되며 BIND와 DNS에 사용되는 전역옵션을
설정하며, 중요한 몇가지 옵션에 대해서 알아보자.

ⓐ directory "/var/named";
- 서버의 작업 디렉토리를 나타내며 절대경로를 입력한다.
ⓑ allow-transfer { none; };
- 마스터 네임서버에서 zone transfer를 허용할 호스트를 정의한다.
슬레이브 네임서버에 대해서만 허용하면 되므로, 지금 설정은 캐싱 전용 네임서버이므로
none으로 이 명령문의 작동을 보안을 위해 완전히 막는다.
ⓒ allow-query { 192.168.1.0/24; localhost}
- 캐싱네임서버에 일반적인 질의를 할 수 있는 호스트를 지정한다. 이 설정에서는 보안상
하나의 서브넷 블록만을 허용한 것이다.
ⓓ forwarders { 168.126.63.1; 168.126.63.2 };
- DNS 질의를 포워딩할 IP Address를 정의한다. 인터넷에 직접 연결되어 있지 않은 서버는
이 옵션을 사용하여 많은 사이트에 대한 캐시를 생성하고 외부 네임 서버 연결과 질의에
대한 트래픽을 줄일수 있다.
forwarders 부분의 두 아이피는 마스터와 슬레이브 네임서버의 IP주소다. 이것은 다른
ISP의 DNS서버나 다른 DNS서버일 수도 있다.
ⓔ version "None";
- BIND와 DNS서버의 실제 버전을 보안을 위해 숨길 수 있게 한다.


⑵ controls {};
controls는 rndc가 네임서버를 제어하기 위해 이용하는 채널을 설정한다.
bind9는 bind8처럼 controls 구문을 이용해 네임서버가 제어 메시지를 받아들이는 방법을
제어하는데 문법은 같지만 inet 서브 구문이 허용된다는 점이 다른다.

controls { inet 127.0.0.1 allow { localhost; } keys { rndckey; }; }; 에서

bind9에서 포트를 지정하지 않을 경우 네임서버는 953 포트를 기본적으로 listen 한다.
네임서버로 제어 메시지를 보내려면 rndc 사용자들이 자신을 인증하기 위한 암호키가 필요
한데 위 구문이 키를 지정하는 구문이다.
위 구문은 inet이 127.0.0.1 의 953 포트에 귀 기울이고, localhost에 한하여 키값이
일치할 경우에만 허락하도록 설정되어있다.
key 구문을 named.conf 파일에 포함시킬 수도 있지만 보안상의 문제가 될 수도 있기 때문에
읽기 권한을 제한한 별도의 파일로 만든 후에 include 시키는 방법이 좋다.

⑶ logging {};
다음으로 logging 블럭이 있는데 channel, category 의 설정이 가능하다.
channel 은 로그 레벨및 파일 위치 등을 설정할 수 있으나 그냥 기본값을 사용하는 것이
가장 무난하므로 별도로 설명하지 않겠다.

⑷ zone {};
다음은 설정할 각 도메인에 대한 zone block 설정에 대해서 보도록 하겠다.
zone {}; 은 캐쉬네임서버, 로컬호스트, 로컬 네트워크의 inverse domain, 각 도메인
, name server가 위치하는 네트워크에 대한 inverse domain, 세컨더리 도메인, primary
네임서버가 위치하는 네트워크에 대한 inverse domain, 7 가지에 대해서 설정을 한다.

① 캐시 네임서버와 로컬 호스트에 관련 설정

// 캐싱네임서버에 대한 설정
zone "." IN {
type hint;
file "named.ca";
};

루트 도메인 (.)에 대한 zone 구문이고 루트 도메인의 type은 오직 hint만 가능하다.
루트 도에인 (.)의 zone 파일 즉 hint 파일의 이름을 named.ca 로 지정했다.
named.ca 파일은 bind를 rpm으로 설치할 경우 /var/named에 기본적으로 생성된다.


// 로컬호스트에 대한 설정
zone "localhost" IN {
type master;
file "localhost.zone";
allow-update { none; };
};

locahost에 대한 zone 구문이고 type은 master로 설정되어 있다.
localhost의 type을 slave로 설정할 경우는 없을 것이다.
localhost의 zone 파일을 localhost.zone 으로 지정했는데 이 파일 역시 bind를 rpm으로
설치 했을 경우 /var/named에 생성된다. 당연히 다이나믹 업데이이트는 허용하지 않고 있다.


//루프백(loopback) 주소 127.0.0.1에 대한 리버스 매핑 설정.
zone "0.0.127.in-addr.arpa" IN {
type master;
file "named.local";
allow-update { none; };
};

localhost의 Inverse Domain을 설정하는 zone 구문이다.
이 설정은 named.conf에 기본적으로 설정되어 있다.
localhost의 inverse Domain의 zone 파일을 named.local로 지정해 주었다.
이 파일 역시 rpm으로 bind를 설치 했을 경우 /var/named 디렉토리에 생성된다.


위에 출력된 부분은 캐시 네임서버와 로컬 호스트에 관련된 설정으로 반드시 있어야되며,
별도로 수정을 할 필요는 없다.

② 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 를 수정/삭제/생성 할 수 있게 해 주는 기능을 의미하며,
별도로 'DNS 동적 업데이트' 파트에서 설명하도록 하겠다.

③ inverse domain 설정

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 을 정의하는 것과 동일지만,
ORIGIN 의 표기법이 다르다. inverse domain 의 ORIGIN 은 네트워크대역.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 개를 정의하도록 한다.

④ sendary domain 설정

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 를 구동하는 유저 또는 그룹에게 쓰기 권한을 줘야 한다.

댓글 없음: