LainyZine: 프로그래머 가이드 🐣

[리눅스] nslookup 명령어: DNS 쿼리하는 방법

nslookup이란?

nslookup 명령어는 네트워크 디버깅을 위해 자주 사용되는 리눅스 명령어로, DNS 서버에 직접 DNS 쿼리를 하고 그 결과를 출력해줍니다. 이를 통해서 DNS 설정이 정상적인지, 혹은 DNS 서버가 정상적으로 동작하고 있는지, 네트워크가 의도한대로 설정되어있는지 등을 확인할 수 있습니다. 또한 nslookup은 리눅스 명령어지만, 맥OS나 윈도우에도 같은 이름을 가진 명령어가 있습니다. 현재는 nslookup보다는 비슷한 기능을 하는 dig나 host 명령어 사용을 권장하는 편입니다. 이 글에서는 nslookup의 사용법과 옵션에 대해서 소개합니다.

nslookup 명령어를 설치하는 방법

맥OS와 윈도우10에는 nslookup 이름을 가진 명령어가 포함되어있습니다. 리눅스 버전과 사용법은 대동소이하지만 정확한 사용법은 조금 다를 수 있습니다. 리눅스에도 nslookup은 대부분의 경우 미리 설치가 되어있습니다. 하지만 Docker 용 이미지와 같이 환경에 따라서 설치가 되어있지 않은 경우도 있습니다.

Ubuntu를 포함한 Debian 계열 배포판의 경우 dnsutils 패키지를 설치하면 nslookup 명령어가 같이 설치됩니다.

$ apt install dnsutils

RedHat 계열 배포판의 경우 bind-utils 패키지에 nslookup 명령어가 포함되어있습니다. yum으로 이 패키지를 설치하면 됩니다.

$ yum install bind-utils

nslookup으로 도메인의 IP 조회하는 방법

nslookup을 사용하는 가장 기본적인 방법은 다음과 같이 호스트네임을 인자로 지정하는 방법입니다.

$ nslookup [DOMAIN]

apple.com을 조회한 결과는 다음과 같습니다.

$ nslookup apple.com
Server:         1.1.1.1
Address:        1.1.1.1#53

Non-authoritative answer:
Name:   apple.com
Address: 17.253.144.10

여기서 Server와 Address 정보는 어느 DNS 서버에 쿼리를 요청했는지를 의미합니다. 별도로 DNS 서버를 지정하지 않으면 시스템에서 사용중인 DNS 서버에서 DNS 정보를 조회합니다.

Non-authoritative answer의 의미에 대해서는 뒤에서 따로 설명하겠습니다. 그 다음의 NAME은 조회한 도메인 이름을 의미하며 Address는 apple.com에 연결된 IP 주소입니다.

nslookup으로 도메인의 IP 주소를 조회할 때 프로토콜을 포함하지 않아야 합니다. 예를 들어 https://apple.com으로 조회하면 원하는 결과를 얻을 수 없습니다.

$ nslookup https://apple.com
Server:         1.1.1.1
Address:        1.1.1.1#53

** server can't find https://apple.com: NXDOMAIN

IP 주소로 도메인 조회하는 방법

도메인으로 IP를 조회하는 것과 반대로 IP에 연결된 도메인을 조회하려면 다음과 같이 IP로 쿼리를 합니다. 이 경우 PTR 레코드를 조회하며, 역방향 조회(인버스 도메인)라고도 합니다.

$ nslookup [IP]

앞서 조회했던 apple.com의 IP 값으로 쿼리해본 결과는 다음과 같습니다.

$ nslookup 17.253.144.10
;; Truncated, retrying in TCP mode.
Server:         1.1.1.1
Address:        1.1.1.1#53

Non-authoritative answer:
...
10.144.253.17.in-addr.arpa      name = apple.com.ai.
10.144.253.17.in-addr.arpa      name = apple.co.uk.
10.144.253.17.in-addr.arpa      name = apple.ca.
10.144.253.17.in-addr.arpa      name = apple.com.
...

결과를 읽는 법은 크게 다르지 않습니다. 단, 결과 값을 보고 하나의 IP에 다수의 도메인들이 연결된 것을 확인할 수 있습니다. 여기서 IP 주소 뒤의 .in-addr.arpa는 PTR 레코드 조회 때 자동으로 붙는 접미사라고 이해해도 무방합니다.

DNS 서버를 지정하는 방법

특정한 DNS 서버에 쿼리를 하고 싶다면, 다음과 같이 사용합니다.

$ nslookup [DOMAIN] [DNS_SERVER]

예를 들어 구글의 퍼블릭 DNS인 8.8.8.8에서 DNS를 조회하고 싶은 경우 2번째 인자로 지정해줍니다.

$ nslookup apple.com 8.8.8.8
Server:         8.8.8.8
Address:        8.8.8.8#53

Non-authoritative answer:
Name:   apple.com
Address: 17.253.144.10

출력된 내용을 통해 8.8.8.8 서버에서 DNS 조회가 이루어진 것을 확인할 수 있습니다.

인터렉티브 모드

nslookup을 인자 없이 실행하면, 인터렉티브 모드로 실행됩니다. 기본적인 사용 방법을 알아보겠습니다. 먼저 server 명령어로 DNS 서버를 지정합니다.

$ nslookup
> server 8.8.8.8
Default server: 8.8.8.8
Address: 8.8.8.8#53

조회하고자 하는 도메인을 입력합니다. 결과가 출력됩니다. 도메인을 추가로 입력하면, 다시 결과가 출력됩니다. 여러 도메인들을 조회해보고 싶을 때 인터렉티브 모드를 사용하면 편리합니다.

> apple.com
Server:         8.8.8.8
Address:        8.8.8.8#53

Non-authoritative answer:
Name:   apple.com
Address: 17.253.144.10
> google.com
Server:         8.8.8.8
Address:        8.8.8.8#53

Non-authoritative answer:
Name:   google.com
Address: 172.217.161.46

이번에는 다시 server 명령어로 DNS 서버를 1.1.1.1로 변경해줍니다. 그리고 원하는 도메인을 조회해봅니다. 이번에는 1.1.1.1에 쿼리한 결과가 출력됩니다.

> server 1.1.1.1
Default server: 1.1.1.1
Address: 1.1.1.1#53
> google.com
Server:         1.1.1.1
Address:        1.1.1.1#53

Non-authoritative answer:
Name:   google.com
Address: 172.217.31.142

^D를 입력하면 nslookup이 종료됩니다.

> ^D
$

타입 별 레코드 조회(MX, TXT 등)

nslookup으로 도메인을 조회할 때 레코드 타입을 지정하는 것도 가능합니다. -type=[TYPE] 옵션을 사용합니다.

$ nslookup -type=[TYPE] [DOMAIN]

예를 들어 apple.comMX 도메인을 조회하려면 다음과 같이 실행합니다.

$ nslookup -type=mx apple.com
Server:         1.1.1.1
Address:        1.1.1.1#53

Non-authoritative answer:
apple.com       mail exchanger = 10 ma1-aaemail-dr-lapp03.apple.com.
apple.com       mail exchanger = 10 ma1-aaemail-dr-lapp02.apple.com.
apple.com       mail exchanger = 10 ma1-aaemail-dr-lapp01.apple.com.
...

txt 레코드는 다음과 같이 조회할 수 있습니다.

$ nslookup -type=txt apple.com
Server:         1.1.1.1
Address:        1.1.1.1#53

Non-authoritative answer:
apple.com       text = "apple-domain-verification=X5Jt76bn3Dnmgzjj"
apple.com       text = "miro-verification=2494d255c4c50b1e521650a0659cbf3fa08b0072"
...

DNS 레코드 타입에 대해서는 다음 문서를 참고해주세요.

쿼리 타임아웃을 지정하는 방법

-timeout 옵션을 지정하면 쿼리 타임아웃 시간을 지정할 수 있습니다. 다음과 같이 사용합니다. (명령어 앞에 time을 앞에 붙여주면 실행 시간을 확인할 수 있습니다)

$ time nslookup -timeout=1 apple.com 0.0.0.0
;; connection timed out; no servers could be reached
0.00s user 0.00s system 0% cpu 3.015 total

0.0.0.0에 DNS 서버가 없기 때문에 타임아웃이 되고 종료됩니다. 다른 처리 때문인지 1초보다는 시간이 더 걸리네요.

기본 타임아웃은 10초입니다. (실제로 실행해보면, 좀 더 시간이 오래 걸리네요.)

$ time nslookup apple.com 0.0.0.0
;; connection timed out; no servers could be reached

nslookup apple.com 0.0.0.0  0.00s user 0.00s system 0% cpu 15.015 total

Non-authoritative answer의 의미

이 글의 처음 예제로 돌아가보겠습니다. apple.com의 도메인을 조회하면 Non-authoritative answer라는 문구가 출력됩니다.

$ nslookup apple.com
Server:         1.1.1.1
Address:        1.1.1.1#53

Non-authoritative answer:
Name:   apple.com
Address: 17.253.144.10

구글 번역기로 뜻을 살펴보면 신뢰할 수 없는 답변이라고 합니다.

신뢰할 수 없는 답변

이는 사용자가 이용하는 DNS 서버가 도메인 소유자가 등록한 1차 정보원이 아니기 때문입니다. DNS 서버는 상위 DNS 서버에 쿼리를 하고 다시 이를 캐시해서 가지고 있습니다. 따라서 캐시에 따라서 최신 정보와 다르거나, 혹은 DNS 서버 자체를 신뢰할 수 없는 경우 악의적인 조작을 하는 것도 가능합니다. DNS 서버의 동작 원리에 대한 좀 더 자세한 이야기는 다음 글을 참고해주세요.

그렇다면 신뢰할 수 있는 답변을 얻기 위해서는 어떻게 해야할까요? SOA 레코드를 조회해서 해당 도메인의 정보가 등록되어있는 DNS 서버를 확인하고, 이 서버에 조회를 해보면 됩니다.

먼저 apple.com의 SOA 레코드를 조회해봅니다.

$ nslookup -type=soa apple.com
Server:         1.1.1.1
Address:        1.1.1.1#53

Non-authoritative answer:
apple.com
        origin = usmsc2-extxfr-001.dns.apple.com
        mail addr = hostmaster.apple.com
        serial = 2010125272
        refresh = 900
        retry = 900
        expire = 2016000
        minimum = 14400

여기서 origin으로 출력되는 서버를 DNS 서버로 지정해서 조회해봅니다.

$ nslookup apple.com usmsc2-extxfr-001.dns.apple.com
Server:         usmsc2-extxfr-001.dns.apple.com
Address:        17.47.176.10#53

Name:   apple.com
Address: 17.253.144.10

더 이상 Non-authoritative answer(신뢰할 수 없는 답변)이라는 문구가 출력되지 않습니다.

추천 문서

LainyZine은 쿠팡 파트너스 활동에 따른 수수료를 제공받습니다.