8.1. 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'와 같이 동작한다.

8.1.1. 도메인 네임 검색

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

8.1.2. 기본 쿼리 서버 변경

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

8.1.3. 네임 서버처럼 질의하기

네임서버는 Resolver의 요청을 처리하기 위해, 네임스페이스를 검색하며, 여러 네임서버와 통신을 하는데, nslookup으로 동일한 과정을 밟아보도록 하자. 네임서버가 인터넷상에서 어떻게 동작하며, 네임서버들 간에는 어떤 사건들이 발생하고, 여러분을 위해 무엇을 하는지, 구체적인 느낌을 받을 수 있을 것이다.

Figure 8-1. 네임서버처럼 질의하기

네임서버처럼 질의하기

(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

8.1.4. 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 가 있다.

8.1.5. 초기화 파일 .nslookuprc

nslookup은 실행시 ~/.nslookuprc 파일이 존재하면, 내용을 읽어 옵션을 조정한다. 매번 설정하는 옵션이 있다면, 본 파일을 통해 간편화할 수 있겠다.

* .nslookuprc 파일 예
set type=NS
set nosearch
set debug