3. caching name server의 구축

우선 DNS 설정은 다이얼업, 케이블모뎀, ADSL 사용자들에게 매우 유용하다.

레드헷이나 레드헷 기반 배포본은 이미 bindbind-utils와 caching nameserver가 설치되었다. 데비안 사용자라면 bindbind-doc가 설치되었을 것이다. 물론 설치시 이런 문서처럼 자세하게 설치에 대해 나오지 않을 것이고, 설치된 파일을 설정하는 법을 같이 읽어야 할 것이다.

caching nameserver는 단지 이름질의에 대한 대답만을 찾고 그 해답을 기억해서 다음에 필요할때 사용가능하게 한다. 이것은 기다리는 시간을 단축시킬 수 있다.

우선 /etc/named.conf (Debian: /etc/bind/named.conf)가 필요하며 이것은 named가 구동될 때 필요한 것이다.포함된 내용을 살펴보자

// Config file for caching only name server

options {
	directory "/var/named";

	// Uncommenting this might help if you have to go through a
	// firewall and things are not working out.  But you probably
	// need to talk to your firewall admin.

	// query-source port 53;
};

zone "." {
        type hint;
        file "root.hints";
};

zone "0.0.127.in-addr.arpa" {
        type master;
        file "pz/127.0.0";
};

리눅스 배포본이 여기에서 언급되는 모든 종류의 파일이름과 다른 이름을 쓸지도 모를 일이지만 안의 내용을 위와 같이 모두 같다.

'directory' : named프로그램이 설정 파일을 찾는 위치를 지정해 준다. named에 관련된 파일들은 위와 같다. 예를 들어 이후에 pz란 디렉토리 가 나오면 그것은 /var/named/pz라는 것을 의미하는 것일 것이다. 위의 예시와 같은 설정이 일반적인 설정이다.

/var/named/root.hints라는 파일이 안에 지정되 있다. /var/named/root.hints는 아래의 내용을 포함해야 한다. (만약 이 문서에서 이 내용들을 잘라서 첨부하게 된다면, 파일 앞에 있는 공백들을 제거하기를 바란다. 모든 라인의 시작은 공백이 없게 구성이 되어 있다. 몇몇 문서 프로그램들은 인위적으로 이러한 공백들을 만들기도 하는데 모든 초기 공백들은 제거되야 한다.

;
; There might be opening comments here if you already have this file.
; If not don't worry.
;
.                       6D IN NS        M.ROOT-SERVERS.NET.
.                       6D IN NS        I.ROOT-SERVERS.NET.
.                       6D IN NS        E.ROOT-SERVERS.NET.
.                       6D IN NS        D.ROOT-SERVERS.NET.
.                       6D IN NS        A.ROOT-SERVERS.NET.
.                       6D IN NS        H.ROOT-SERVERS.NET.
.                       6D IN NS        C.ROOT-SERVERS.NET.
.                       6D IN NS        G.ROOT-SERVERS.NET.
.                       6D IN NS        F.ROOT-SERVERS.NET.
.                       6D IN NS        B.ROOT-SERVERS.NET.
.                       6D IN NS        J.ROOT-SERVERS.NET.
.                       6D IN NS        K.ROOT-SERVERS.NET.
.                       6D IN NS        L.ROOT-SERVERS.NET.
;
M.ROOT-SERVERS.NET.     6D IN A         202.12.27.33
I.ROOT-SERVERS.NET.     6D IN A         192.36.148.17
E.ROOT-SERVERS.NET.     6D IN A         192.203.230.10
D.ROOT-SERVERS.NET.     6D IN A         128.8.10.90
A.ROOT-SERVERS.NET.     6D IN A         198.41.0.4
H.ROOT-SERVERS.NET.     6D IN A         128.63.2.53
C.ROOT-SERVERS.NET.     6D IN A         192.33.4.12
G.ROOT-SERVERS.NET.     6D IN A         192.112.36.4
F.ROOT-SERVERS.NET.     6D IN A         192.5.5.241
B.ROOT-SERVERS.NET.     6D IN A         128.9.0.107
J.ROOT-SERVERS.NET.     6D IN A         198.41.0.10
K.ROOT-SERVERS.NET.     6D IN A         193.0.14.129
L.ROOT-SERVERS.NET.     6D IN A         198.32.64.12

이 파일은 세상에 존재하는 root name server에 대하여 기술해 놓는다. 이 서버들은 시간마다 바뀌고 항상 현재 상태로 유지되야 한다. 유지섹션(maintain section)에서 어떤 방식으로 업데이트가 이루어 지는지 확인하길....

named.conf의 마지막 부분인 zone 부분에 대해서는 마지막 장에 기술해 놓기로 한다. 지금은 단지 pz 디렉토리 안에 있는 127.0.0이라는 파일 구성에 대해 보기로 한다. (누차 이야기 하지만 잘라 넣을 시 초기 공백은 제외하라....)

$TTL 3D
@               IN      SOA     ns.linux.bogus. hostmaster.linux.bogus. (
				1       ; Serial
				8H	; Refresh
				2H      ; Retry
				4W	; Expire
				1D)	; Minimum TTL
			NS      ns.linux.bogus.
1			PTR	localhost.

다음으로/etc/resolv.conf부분을 확인 하도록 하자.

search subdomain.your-domain.edu your-domain.edu
nameserver 127.0.0.1

'search'부분은 연결하고자 하는 호스트 이름은 어느 도메인에서 찾아져야 하는가를 결정해 준다.`nameserver'부분은 nameserver의 주소부분을 나타내는데 위와 같은 경우는 named가 구동되는 서버 자신을 의미한다.(127.0.0.1 이 정상이다. 다른 컴퓨터들이 마찬가지로 이 주소를 가지고 있다고 해도 문제될 것 없다.) 원한다면 `nameserver'부분에 여러 nameserver들을 쓸 수도 있다. (Note1:named 데몬이 이 파일을 읽는 것은 아니다. named가 작동하는 것을 이용하는 resolver들이 읽는다, Note2: 이 파일(resolv.conf)에서 domain이란 용어가 사용된다. 그러나 "search"와 "domain"이 같이 사용되진 않는다. 둘중 하나만이 작동할 것이다.)

이러한 파일의 작동을 확인하기 위해서: 만약 client가 foo라는 것을 찾는다면, foo.subdomain.your-domain.edu을 우선 확인하고, 그리고 나서 foo.your-domain.edu, 마지막으로 foo. 를 찾게 된다. search부분에서 너무많은 도메인을 넣기 않는게 좋다. 결국 기재된 모든 부분을 찾는데 시간이 소요되기 때문이다.

이 예에서 subdomain.your-domain.edu에 속해있다고 볼때, 여러분들의 컴퓨터는 your-machine.subdomain.your-domain.edu라고 불리게 될 것이다. 이러한 search 라인에 여러분들의 TLD(Top Level Domain, 예를들어edu)을 포함하면 안된다. 만약 다른 도메인을 연결하려면 예시와 같이 추가연결하면 된다.

search subdomain.your-domain.edu your-domain.edu other-domain.com

정확히 이야기 한다면 이런 예를 바탕으로 실제 도메인명을 써야한다. 도메인 명 마지막에 점이 없다는 것을 유의하자. 중요하다. 다시 상기하길....

3.1. named의 시작

이제 named를 시작할 시간이다. 만약에 전화접속식이면 접속부터 해라. 'ndc start'라고 코딩하고 실행해 보길... 옵션은 없이 실행한다. 데몬이 생성되지 않으면 '/usr/sbin/ndc start'라고 코딩해서 실행해 보시기를. 그래도 안되면 Q&A를 참조하라. named가 구동되는 동안에 syslog 파일을 보면 이러한 식의 결과를 보게 될 것이다.(보통 이 log파일은 /var/adm/messages안에 있거나/var/log 안에 위치하게 된다. 이 결과를 보려면 'tail -f /var/log/messages' 를 입력하면 된다.

(\은 연결되는 다음줄을 이야기한다.)

Dec 15 23:53:29 localhost named[3768]: starting.  named 8.2.2-P7 \
		Fri Nov 10 04:50:23 EST 2000 ^Iprospector@porky.\
		devel.redhat.com:/usr/src/bs/BUILD/bind-8.2.2_P7/\
		src/bin/named
Dec 15 23:53:29 localhost named[3768]: hint zone "" (IN) loaded\
		(serial 0)
Dec 15 23:53:29 localhost named[3768]: Zone "0.0.127.in-addr.arpa"\
		(file pz/127.0.0): No default TTL set using SOA\
		minimum instead
Dec 15 23:53:29 localhost named[3768]: master zone\
		"0.0.127.in-addr.arpa" (IN) loaded (serial 1)
Dec 15 23:53:29 localhost named[3768]: listening on [127.0.0.1].53 (lo)
Dec 15 23:53:29 localhost named[3768]: listening on [10.0.0.129].53\
		(wvlan0)
Dec 15 23:53:29 localhost named[3768]: Forwarding source address is\
		[0.0.0.0].1034
Dec 15 23:53:29 localhost named[3769]: Ready to answer queries.

만약 여기에 에러 메시지가 나온다면 뭔가 실수가 있는 것이다. named 가 위 예에서처럼 나오는 파일들을 지정해 주기 때문에 에러시 다시 원점으로 돌아가서 여기에 나오는 파일을 체크하도록 하자.

다음은 셋업된 부분을 체크해 보도록 한다. 전통적으로 nslookup 파일을 사용했지만 요즘은 dig dig를 사용한다.

$ dig -x 127.0.0.1       

; <<>> DiG 8.2 <<>> -x 
;; res options: init recurs defnam dnsrch
;; got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 4
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 0
;; QUERY SECTION:
;;      1.0.0.127.in-addr.arpa, type = ANY, class = IN

;; ANSWER SECTION:
1.0.0.127.in-addr.arpa.  1D IN PTR  localhost.

;; AUTHORITY SECTION:
0.0.127.in-addr.arpa.   1D IN NS        ns.penguin.bv.

;; Total query time: 30 msec
;; FROM: lookfar to SERVER: default -- 127.0.0.1
;; WHEN: Sat Dec 16 00:16:12 2000
;; MSG SIZE  sent: 40  rcvd: 110

이러한 식으로 나온다면 제대로 동작하는 것이다. 그렇지 않으면 돌아가서 다시 처음부터 체크해 보도록. named.conf를 수정할때 마다 ndc restart를 수행해야 한다.

이제 질의를 던져보자. 당신과 가까이 있는 컴퓨터를 조사해 봐라. 나는 오슬로대학의 pat.uio.no가 제일 가깝다.

$�ig pat.uio.no

; <<>> DiG 8.2 <<>> pat.uio.no 
;; res options: init recurs defnam dnsrch
;; got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 4
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 3, ADDITIONAL: 3
;; QUERY SECTION:
;;      pat.uio.no, type = A, class = IN

;; ANSWER SECTION:
pat.uio.no.             1D IN A         129.240.130.16

;; AUTHORITY SECTION:
uio.no.                 1D IN NS        nissen.uio.no.
uio.no.                 1D IN NS        ifi.uio.no.
uio.no.                 1D IN NS        nn.uninett.no.

;; ADDITIONAL SECTION:
nissen.uio.no.          1D IN A         129.240.2.3
ifi.uio.no.             1H IN A         129.240.64.2
nn.uninett.no.          1D IN A         158.38.0.181

;; Total query time: 112 msec
;; FROM: lookfar to SERVER: default -- 127.0.0.1
;; WHEN: Sat Dec 16 00:23:07 2000
;; MSG SIZE  sent: 28  rcvd: 162

여기에서 dig는 named에게 pat.uio.no라고 명칭된 기계를 찾으라고 요청하게 되고 그러면 root.hints파일에 명시된 name server들 중에 하나에 접속하게 되며, 그곳으로 부터 도달하는 방법을 질문한다. 결과를 얻기 전에 약간의 시간이 걸릴 수도 있는데 이것은 /etc/resolv.conf 에 지정된 모든 도메인을 찾을 경우가 있기 때문이다. flag: 부분의 aa부분을 주목하길. 이것은 질의에 대한 결과가 인증되었다는 것을 의미한다. 다시 말하면 인증된 서버로 부터 갱신이 되었다는 것을 의미한다. 다음에 이 인증부분에 대해 다시 설명할 것이다.

만약 다시 똑같은 질의를 보낸다면 다름과 같은 결과를 얻게 될 것이다.

$ dig pat.uio.no

; <<>> DiG 8.2 <<>> pat.uio.no 
;; res options: init recurs defnam dnsrch
;; got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 4
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 3, ADDITIONAL: 3
;; QUERY SECTION:
;;      pat.uio.no, type = A, class = IN

;; ANSWER SECTION:
pat.uio.no.             23h59m58s IN A  129.240.130.16

;; AUTHORITY SECTION:
UIO.NO.                 23h59m58s IN NS  nissen.UIO.NO.
UIO.NO.                 23h59m58s IN NS  ifi.UIO.NO.
UIO.NO.                 23h59m58s IN NS  nn.uninett.NO.

;; ADDITIONAL SECTION:
nissen.UIO.NO.          23h59m58s IN A  129.240.2.3
ifi.UIO.NO.             1d23h59m58s IN A  129.240.64.2
nn.uninett.NO.          1d23h59m58s IN A  158.38.0.181

;; Total query time: 4 msec
;; FROM: lookfar to SERVER: default -- 127.0.0.1
;; WHEN: Sat Dec 16 00:23:09 2000
;; MSG SIZE  sent: 28  rcvd: 162

질의에 대한 결과 부분에서 "flag"부분의 "aa"가 없다는 사실을 주목하길. 이것은 cache가 정보를 가지고 있을때 더이상 named가 질의를 하기 위해 네트워크 밖으로 나가지 않는다는 것을 의미한다. 저장된 정보가 오래 되었을 수도 있다. 매우 희박하겠지만 가끔 이러한 정보를 통해서 "aa"가 없는지를 확인해야 할 것이다. 이제 자신의 cache서버가 작동한다는 것을 알게 되었다.

3.2. Resolvers

표준 C API가 구현되는 모든 종류의 OS들은 gethostbyname 과 gethostbyaddr를 호출한다. 이러한 함수(아마도 API구현 함수종류인듯 합니다.) 는 다른 여러 소스로 부터 정보들을 가져오게 된다. 가져온 이런 정보들은 리눅스나 다른 유닉스에서는 /etc/nsswitch.conf 부분에 설정되어 있는 데로 받게된다. 이것은 여러 다른 파일이나 DB에서 서로 다른 종류의 데이터를 얻는 것이다. 맨위에 자세한 주석이 있으며 반드시 읽기를 바란다. 'hosts:'로 시작하는 라인을 찾아 보자. 거기에 이렇게 쓰여 있을 것이다.

hosts:      files dns

(복사할 경우 생기는 공백을 잊지 말기를... 이제 더 이야기 하지 않을 것이다.)

만약 'hosts:'라는 라인이 보이지 않는다면 위와같이 기재 해 놓기를... 이것은 프로그램들이 우선 /etc/hosts를 찾아야 한다는 것을 이야기 하며 그리고 resolv.conf에 지정된 DNS를 체크한다는 이야기 이다.

3.3. 축하

caching name server 설정법을 알게 되었다. 자축하는 의미에서 맥주나 우유, 아니면 다른 걸로 축하하시길...