구축환경: Ubuntu 14.04LTS
Ubuntu에 DNS 서버 구축을 하기 위해, BIND9 소스 패키지를 빌드하여 설치하였다.
https://packages.ubuntu.com/trusty/bind9
먼저, BIND9의 소스 패키지는 위 링크에서 다운 받았다.
다운 받은 압축 파일을
tar -xvzf bind9_9.9.5.dfsg.orig.tar.gz
명령어를 사용해 압축 해제한 후, bind9-9.9.5.dfsg 디렉터리로 이동하여
./configure --without-openssl
명령어를 사용해 빌드에 필요한 프로그램을 확인했다. OpenSSL을 사용하지 않으려고 옵션을 주었다.
따로 필요한 프로그램은 없어 바로 빌드했다.
make
명령어를 이용하여 빌드를 한 후,
make install
명령어로 설치해주었다.
설치가 끝나면 /usr/local/sbin에 named를 비롯한 여러 BIND 9 라이브러리들의 실행파일이 생성되어,
명령어만 입력해도 프로그램들을 실행시킬 수 있다.
named로 DNS 서버를 켜기 전, 먼저 DNS 서버를 설정해야한다.
http://zytrax.com/books/dns/ch7/
위 링크를 참고하여 설정하였다. (configuration 파일과 zone 파일 작성법이 나와있다.)
(이 글은 내 컴퓨터의 IP가 192.168.0.101, 호스트 컴퓨터의 IP가 192.168.0.27이라고 가정하고 작성함)
먼저, /etc/hosts 파일을,
127.0.0.1 my.local localhost
127.0.0.1 ns
위와 같이 수정하였다.
apt-get 명령어로 BIND9를 설치하면 자동으로 /etc/named.conf 파일, /etc/bind/named.conf.options 등이 생성되는 것 같은데,
소스 패키지를 빌드하여 설치한 경우엔 생성되지 않는다. (bind9-9.9.5.dfsg 디렉터리의 FAQ 참고)
그렇기 때문에 디렉터리와 파일을 생성하여 설정해주었다.
/etc/bind/named.conf.options 파일을,
options {
directory "/var/cache/bind";
forwarders {
##KT 네임서버 IP
168.126.63.1;
168.126.63.2;
};
listen-on-v6 { any; };
};
다음과 같이 만들어, 내부 도메인이 아닌 경우 KT 네임서버에 묻게 했다.
여기서, options는 DNS 서버의 전체적인 제어에 대한 설정을 하는 절이며,
listen-on-v6는 BIND가 IPv6 쿼리 listen 여부를 설정하는 문장이다.(IP나 Port 설정도 가능)
/etc/bind/named.conf.local 파일을,
zone "my.local" IN {
type master;
file "/etc/bind/zones/my.local.db";
};
zone "0.168.192.in-addr.arpa" {
type master;
file "/etc/bind/zones/rev.0.168.192.in-addr.arpa";
};
다음과 같이 만들어, zone을 추가하였다.
여기서, zone은 네임서버가 지원할 zone을 정의하는 절이며,
type은 zone의 type을 설정하는 문장이다. (type에 대한 정의는 위 링크에서 참고)
file은 zone에 의해 사용될 파일을 설정하는 문장이다.
/etc/named.conf 파일은 다음과 같이 간단하게 만들었다.
include "/etc/bind/named.conf.options";
include "/etc/bind/named.conf.local";
보다시피, 위에서 만든 파일들을 include 했다.
그 후, named.conf.options에 정의한 zone에 대한 zone 파일을 생성한다.
/etc/bind/zones라는 디렉터리를 만들어서, 그 안에 zone 파일들을 생성했다.
먼저, my.local.db 파일을 다음과 같이 만들었다.
;
; BIND data file for local loopback interface
;
$ORIGIN my.local.
$TTL 604800
@ IN SOA ns.my.local. master.my.local. (
10 ; Serial
604800 ; Refresh
86400 ; Retry
2419200 ; Expire
604800 ) ; Negative Cache TTL
;
; name servers - NS records
my.local. IN NS ns.my.local.
; name servers - A records
localhost IN A 127.0.0.1
gateway IN A 192.168.0.1
ns IN A 192.168.0.101
; hosts - A records
testcom IN A 192.168.0.27
여기서, SOA는 zone에 대한 설정을 하는 레코드고,
NS는 도메인에 대한 네임서버를 정의, A는 호스트에 대한 아이피를 설정하는 레코드다.
rev.0.168.192.in-addr.arpa 파일은 다음과 같이 만들었다.
;
; BIND reverse data file for broadcast zone
;
$TTL 604800
@ IN SOA ns.my.local. master.my.local. (
14 ; Serial
604800 ; Refresh
86400 ; Retry
2419200 ; Expire
604800 ) ; Negative Cache TTL
;
; name server
@ IN NS ns.my.local.
; PTR Records
1 IN PTR gateway.my.local.
27 IN PTR testcom.my.local.
101 IN PTR ns.my.local.
여기서 PTR은 아이피에 대한 도메인을 설정하는 레코드다.
설정이 다 끝나면,
named-checkconf 명령어로 configuration에 구문 에러가 있는지 확인하고,
zones 디렉터리로 이동하여, named-checkzone을 사용해 zone 파일이 정확하게 작성되었는지 확인한다.
ex) named-checkzone my.local my.local.db
ex) named-checkzone 0.168.192.in-addr.arpa rev.0.168.192.in-addr.arpa
그 후 named 명령어를 입력하면, DNS 서버가 켜진다.
host 컴퓨터에선, DNS 서버로 192.168.0.101을 사용하게 한 후, DNS 서버가 잘 기능하는 지 테스트했다.
telnet ns.my.local, ftp ns.my.local등의 명령어로 DNS 서버에 등록된 도메인으로 IP를 잘 찾아 접속하는 지 확인했고,
내부 도메인이 아닌 경우를 테스트 하기 위해 google 등의 일반 사이트에 웹 브라우저를 사용해 접속해보았다.