[출처: http://gnujava.com:8000/board/article_view.jsp?article_no=182&board_no=12&table_cd=EPAR05&table_no=05 ]
NSLOOKUP
네임서버를 운영하고 관리하는데 있어 문제를 발견하고 해결하기 위해 Resolver의 입장으로 네임서버를 시험해볼 필요가 있다. 대부분의 시스템에 기본 설치되어 있는 nslookup은 dig와 함께 가장 널리 사용되는 네임서버 질의 도구로써, 도메인 메니저의 기본 무기중 하나이다.
$ nslookup
Default Server: ns.nobreak.com
Address: 210.105.79.2
> exit
nslookup은 실행후 대화형 프롬프트 '>'를 표시하고 '/etc/resolv.conf'에 정의된 첫 번째 네임서버를 기본 질의 서버로 설정한다. 'nslookup'은 BIND와 달리 하나의 서버만을 질의에 사용하기 때문에 'Default NS -> Timeout -> Error'와 같이 동작한다.
도메인 네임 검색
nslookup은 기본적으로 입력된 도메인에 대해 A 레코드를 검색하고, IP 주소(in-addr.arpa)에 대해서는 PTR 레코드를 검색한다. 'set type=RR' 명령으로 A 레코드 이외의 레코드 또한 검색할 수 있으며, RR(Resource Record)에는 A,ANY,CNAME,HINFO,MX,NS,PTR,SOA,TXT 등이 올 수 있다. 이중 ANY는 관련된 레코드들을 모두 출력하라는 약속 기호이다.
> www.kr.freebsd.org. # IP 검색
Name: www.kr.freebsd.org
Address: 150.183.110.39
> ftp.kr.freebsd.org.
Name: www.kr.freebsd.org # ftp는 www의 CNAME
Address: 150.183.110.39
Aliases: ftp.kr.freebsd.org
> 150.183.110.39 # 도메인 검색
Name: www.kr.freebsd.org
Address: 150.183.110.39
> set type=MX # MX 레코드 검색
> kr.freebsd.org.
kr.freebsd.org preference = 10, mail exchanger = mail.kr.freebsd.org
> set type=NS # NS 레코드 검색
> kr.freebsd.org. # 도메인 위임 확인
kr.freebsd.org nameserver = ns.kr.freebsd.org
kr.freebsd.org nameserver = ns2.kr.freebsd.org
ns.kr.freebsd.org internet address = 150.183.110.2
ns2.kr.freebsd.org internet address = 150.183.110.3
> 46.102.39.in-addr.arpa. # 인버스 도메인 위임 확인
kr.freebsd.org nameserver = ns.kr.freebsd.org
kr.freebsd.org nameserver = ns2.kr.freebsd.org
ns.kr.freebsd.org internet address = 150.183.110.2
ns2.kr.freebsd.org internet address = 150.183.110.3
기본 쿼리 서버 변경
nslookup은 기본적으로 recurse 모드로 동작하기 때문에, 때론 해당 도메인의 Authority를 갖는 특정 네임서버에 직접 질의를 하여 Authoritative 응답(네임서버의 캐쉬에서가 아닌)을 확인 할 필요가 있다. 'server', 'lserver' 명령으로 기본 질의 서버를 변경 할 수 있다. 두 명령은 주어진 네임서버의 주소(쿼리가 아닌)를 찾을 때 사용할 질의 서버의 차이인데, 'server'는 현재의 기본 서버를 통하고, 'lserver'는 시스템 기본 서버(nslookup 구동시 초기 설정되는)를 사용함이 다르다. 'lserver'명령은 타 네임서버로 스위칭 한 후, 다시 다른 네임서버로 스위칭하려 하는데, 현재의 네임서버가 동작하지 않아 해당 네임서버의 주소를 검색하지 못할 때 사용한다. 다음을 보자.
$ nslookup
Default Server: ns.nobreak.com
Address: 210.105.79.2
nslookup 구동시의 기본 서버 'ns.nobreak.com'이 'lserver' 명령에서 주어진 NS의 주소를 찾기위한 질의 서버가 된다.
> server ns.jp.freebsd.org. # 기본 서버 변경
Default Server: ns.jp.freebsd.org
Address: 199.100.7.25
> server ns.nobreak.com.
*** Can't find address for server ns.nobreak.com: Non-existent host/domain
ns.jp.freebsd.org를 통해 ns.nobreak.com을 찾을 수가 없다. 이때에는 'lserver' 명령으로 시스템 기본 서버를 통해 'ns.nobreak.com'의 주소를 검색한다.
> lserver ns.nobreak.com.
Default Server: ns.nobreak.com
Address: 210.105.79.2
루트 네임서버를 질의 서버로 하고자 할 때는, 간단히 'root' 명령을 사용할 수 있다.
> root
Default Server: a.root-servers.net
Address: 198.41.0.4
네임 서버처럼 질의하기
네임서버는 Resolver의 요청을 처리하기 위해, 네임스페이스를 검색하며, 여러 네임서버와 통신을 하는데, nslookup으로 동일한 과정을 밟아보도록 하자. 네임서버가 인터넷상에서 어떻게 동작하며, 네임서버들 간에는 어떤 사건들이 발생하고, 여러분을 위해 무엇을 하는지, 구체적인 느낌을 받을 수 있을 것이다.
(1)
> set norecurse # Iterative 모드로 전환
> www.kr.freebsd.org.
Server: ns.nobreak.com
Address: 210.105.79.2
Name: www.kr.freebsd.org
Served by:
- H.ROOT-SERVERS.NET
128.63.2.53
ORG
- B.ROOT-SERVERS.NET
128.9.0.107
ORG
...
'ORG.'가 관리되는 루트 서버들의 목록을 레퍼런싱 해준다.
(2)
> server h.root-servers.net.
> www.kr.freebsd.org.
Server: h.root-servers.net
Address: 128.63.2.53
Name: www.kr.freebsd.org
Served by:
- WHO.CDROM.COM
204.216.27.3
FREEBSD.ORG
- NS1.CRL.COM
165.113.1.36
FREEBSD.ORG
- NS2.CRL.COM
165.113.61.37
FREEBSD.ORG
(3)
> server who.cdrom.com.
> www.kr.freebsd.org.
Server: who.cdrom.com
Address: 204.216.27.3
Name: www.kr.freebsd.org
Served by:
- ns.kr.freebsd.org
150.183.110.2
kr.freebsd.org
- ns2.kr.freebsd.org
150.183.110.3
kr.freebsd.org
(4)
> server ns.kr.freebsd.org.
> www.kr.freebsd.org.
Server: ns.kr.freebsd.org
Address: 150.183.110.2
Name: www.kr.freebsd.org
Address: 150.183.110.39
Zone Transfer
해당 도메인의 Zone에 대한 복사본을 얻기위해, Primary로부터 Zone 데이터베이스를 끌어오는 작업을 Zone Transfer라 한다. 이 작업은 주로 Secondary NS 측에서 이루어지며, 때때로 얼마나 많은 수의 호스트가 등록되어 있는지 혹은 Zone의 문법적 오류를 검사하기 위해 관리자가 수동으로 조작하기도 한다. Zone Transfer는 Authority를 갖는 네임서버에 직접 질의하여야 하므로, nslookup 상에서 해당 NS로 질의 서버를 변경한후, 'ls' 명령을 사용한다.
> server ns.kr.freebsd.org.
> ls -t A kr.freebsd.org # A 레코드 출력
kr.freebsd.org. server = ns.kr.freebsd.org
kr.freebsd.org. server = ns2.kr.freebsd.org
mail 150.183.110.32
mqueue 150.183.110.33
www 150.183.110.39
www2 150.183.110.40
> ls -d kr.freebsd.org # 모든 레코드 출력
kr.freebsd.org. SOA ns.nobreak.com hostmaster.kr.freebsd.org.
(1999031501 21600 1800 1209600 86400)
kr.freebsd.org. NS ns.nobreak.com
kr.freebsd.org. NS ns2.nobreak.com
kr.freebsd.org. MX 10 mail.kr.freebsd.org
kr.freebsd.org. MX 20 mqueue.kr.freebsd.org
cvsup CNAME www.kr.freebsd.org
mail A 150.183.110.32
mqueue A 150.183.110.33
ftp CNAME www.kr.freebsd.org
ftp2 CNAME www2.kr.freebsd.org
ftp3 CNAME ftp.free.nobreak.com
www A 150.183.110.39
www HINFO Pentium-200 FreeBSD 2.2.8
www TXT "Korea FreeBSD Users Group"
www2 A 150.183.110.40
www2 HINFO Pentium-133MHz FreeBSD 2.2.8
www2 TXT "Korea FreeBSD Users Group"
> ls -t MX kr.freebsd.org > MX-kr.freebsd.org # 파일로 저장
> view MX-kr.freebsd.org # 파일 내용 확인
BIND의 경우 'named-xfer'라는 외부 프로그램을 사용해 Zone Transfer를 수행한다. 네임서버의 입장에서 부트 파일에 Secondary 설정이 있을 경우의 처리과정을 살펴보자.
secondary kr.freebsd.org 210.105.79.2 sec-kr.freebsd.org
BIND는 'secondary' 명령을 만나면 내부적으로 다음과 같이 동작한다.
loop(Interval == TTL) {
named-xfer -z kr.freebsd.org -f /var/named/sec-kr.freebsd.org -s Current_Serial 210.105.79.2
switch ( $? ) { // 'named-xfer'는 환경 변수 '$?'에 결과를 복귀함
case 0 : OK; // 시리얼이 같음, Zone Transfer가 필요치 않음
case 1 : OK; // 시리얼이 증가했음, Zone Transfer가 성공적으로 수행됨
case 2 : ERROR; // 네임서버를 찾을 수 없음
// 혹은 네임서버가 도메인의 Authority를 갖지 않음
case 3 : ERROR: // 시리얼이 감소했음, 기존의 백업카피 유지
}
primary kr.freebsd.org sec-kr.freebsd.org
}
보안의 이유로 허락된 곳(예: Secondary NS's IP)에서만 Zone Transfer를 허용하고자 한다면, Primary NS의 부트파일에 다음과 같은 옵션을 준다. (Zone Transfer만을 제한하는 것이기 때문에, 호스트에 대한 개별 쿼리는 허용된다)
xfrnets 210.105.79.3&255.255.255.255 210.105.80.128&255.255.255.128
이것은 BIND-4의 설정예인데, IP 210.105.79.3과 210.105.80.129-254 에서만 Zone Transfer를 허용하라는 의미이다. BIND-4에서는 개별 IP와 서브넷으로 나누어진 블럭에 대해 "IP&Mask"의 형식으로 목록을 작성하며, 클래스 전체를 허용하고자 할 경우엔 '210.105.79.0'과 같이 마스크를 생략하여도 된다.
options {
allow-transfer { localnets; 210.105.79.3; };
};
BIND-8의 경우에 해당 서버가 속한 네트워크와, 210.105.79.3만을 허용한 예이다. localnets는 예약어이며 다른 예약어로는 any, none, localhost 가 있다.
초기화 파일 '.nslookuprc'
nslookup은 실행시 '~/.nslookuprc' 파일이 존재하면, 내용을 읽어 옵션을 조정한다. 매번 설정하는 옵션이 있다면, 본 파일을 통해 간편화할 수 있겠다.
* .nslookuprc 파일 예
set type=NS
set nosearch
set debug
DIG
Dig(Domain Information Groper)의 사용법을 조금만 짚어보도록 하자. 'nslookup'과의 기능적 차이는 크게 없지만, 사용이 간결하고, 출력이 상세하여, Shell Script등에서 주로 사용된다. 다음은 ns.kornet.ne.kr을 통해 www.nobreak.com의 A 레코드를 검색한 결과이다.
$ dig [@네임서버] 도메인 [쿼리타입] [+쿼리옵션]
$ dig @ns.kornet.ne.kr www.nobreak.com A
;; ANSWER SECTION:
www.nobreak.com. 16h12m36s IN CNAME ns.nobreak.com.
ns.nobreak.com. 1d19h12m27s IN A 210.105.79.2
;; AUTHORITY SECTION:
nobreak.com. 22h17m35s IN NS ns.nobreak.com.
nobreak.com. 22h17m35s IN NS ns2.nobreak.com.
;; ADDITIONAL SECTION:
ns.nobreak.com. 1d19h12m27s IN A 210.105.79.2
ns2.nobreak.com. 1d1h46m58s IN A 210.105.79.3
DIG는 쿼리에 대한 결과를 ANSWER SECTION에, 해당 도메인의 인증을 갖는 네임서버 정보를 AUTHORITY SECTION에, 그리고, 글루레코드 등이 있을 경우 그에대한 정보를 ADDITIONAL SECTION에 출력하여 준다.
DNSWALK
Dnswalk는 Perl로 제작된 스크립트로써 존재하지 않는 호스트를 가르키는 MX, PTR이 없는 A, 잘못된 CNAME, 유효하지 않은 이름문자, 누락된 트레일링 도트, 불필요나 글루 레코드, Lame Delegation 등 Zone 데이터베이스의 다양한 오류를 찾아준다. 미처 발견치 못한 문제점을 진단하는데 도움이 될 것이다. Dnswalk의 최신 버젼은 다음 주소에서 얻을 수 있다.
$ dnswalk -raFl freebsd.org.
Checking freebsd.org.
Getting zone transfer of freebsd.org. from ns2.iafrica.com...done.
SOA=implode.root.com contact=hostmaster.freebsd.org
FAIL: Cannot get SOA record for pt.freebsd.org from zeus.ci.ua.pt
(lame?): Connection refused
BAD: lv.freebsd.org NS ns.fasts.com: lame NS delegation
BAD: eu.freebsd.org NS server.zsb.th-darmstadt.de: unknown host
WARN: irc3.freebsd.org CNAME irc.nocturnal.net: CNAME (to nocturnal.net)
WARN: ns.th.freebsd.org A 203.154.230.20: no PTR record
WARN: irc2.freebsd.org CNAME va.i-Plus.net: unknown host
1 failures, 3 warnings, 1 errors.
Dnswalk는 검사를 수행하기 위해 해당 도메인을 Zone Transfer 한 후 내부적으로 Dig와 Resolver 루틴을 사용한다. Delegation된 도메인을 따라가며 검사를 행하기 때문에 거대 도메인을 관리한다면 한번쯤 사용해봄직 하다