Devin.KR
로그인

리눅스 nslookup 명령어 사용법 - DNS 조회 기본과 dig와의 차이

개발자 조회 1

이 명령어를 언제 쓰는가

도메인이 어떤 IP로 풀리는지 확인해야 하는데 dig가 설치돼 있지 않을 때 쓴다. 최소 설치된 컨테이너나 갓 올린 서버에는 bind-utils/dnsutils가 없어서 dig가 없는 경우가 흔한데, nslookup은 그런 환경에서도 종종 살아 있다. 윈도우 서버와 리눅스 서버 양쪽에서 같은 문법으로 쓸 수 있다는 것도 실무에서 의외로 크다.

다만 오래된 도구다. 출력이 응답 원본이 아니라 가공된 형태라 TTL, 응답 플래그, 권한 여부 같은 정보가 빠진다. DNS를 파고들어야 하는 순간에는 dig로 옮겨 타는 것이 맞다. nslookup은 "이름이 풀리긴 하나"를 확인하는 자리에 둔다.

기본 형식

nslookup [-옵션] 도메인 [네임서버]
  • 도메인 — 조회할 이름. IP를 넣으면 자동으로 역방향(PTR) 조회를 한다.
  • 네임서버 — 마지막 인자로 물어볼 서버를 지정한다. dig의 @와 달리 기호 없이 그냥 뒤에 붙인다.
  • -옵션-type=MX 처럼 등호로 값을 준다.

인자 없이 nslookup만 치면 대화형 모드로 들어간다. 빠져나오려면 exit을 친다. 스크립트에서는 반드시 인자를 주는 비대화형으로 쓴다.

자주 쓰는 옵션

옵션의미예시
-type=레코드 타입 지정(A, AAAA, MX, TXT, NS, SOA, CNAME, PTR)nslookup -type=MX google.com
-query=-type=과 같다. 줄여서 -q=nslookup -q=NS devin.kr
서버 인자특정 네임서버에 직접 질의nslookup devin.kr 8.8.8.8
-timeout=응답 대기 시간(초)nslookup -timeout=2 devin.kr
-debug응답 패킷 내용을 자세히 표시nslookup -debug devin.kr
-port=53이 아닌 포트의 DNS 서버에 질의nslookup -port=5353 devin.kr 127.0.0.1

실전 예제

1. 도메인이 풀리는지 확인한다. 가장 기본이자 대부분의 상황에서 이걸로 끝난다.

nslookup devin.kr
Server:		61.41.153.2
Address:	61.41.153.2#53

Non-authoritative answer:
Name:	devin.kr
Address: 182.222.121.235

맨 위 Server실제로 물어본 리졸버다. 이 값이 예상과 다르면 /etc/resolv.conf가 잘못돼 있는 것이다. Non-authoritative answer는 권한 서버가 아니라 캐시에서 온 답이라는 뜻으로, 정상이다.

2. 로컬 DNS를 건너뛰고 공개 리졸버에 직접 묻는다. 사내 DNS가 이상한지, 도메인 자체가 이상한지 가르는 방법이다.

nslookup devin.kr 8.8.8.8

여기서는 정상인데 서버 기본 리졸버로는 실패하면 사내 DNS 문제다. 둘 다 실패하면 도메인 설정 문제다.

3. 메일 수신 경로를 확인한다. 메일이 안 들어온다는 문의를 받았을 때 첫 단계다.

nslookup -type=MX google.com
google.com	mail exchanger = 10 smtp.google.com.

4. IP로 서버 이름을 되짚는다. 접속 로그에 찍힌 낯선 IP의 정체를 볼 때 쓴다.

nslookup 8.8.8.8

PTR이 등록돼 있지 않으면 ** server can't find 8.8.8.8.in-addr.arpa: NXDOMAIN 형태로 나온다. 대부분의 일반 IP는 PTR이 없는 것이 정상이라 이것만으로 이상하다고 볼 수 없다.

5. 네임서버가 무엇인지 확인한다. 도메인 이관 직후 반영 여부를 볼 때.

nslookup -type=NS devin.kr

함정과 주의점

종료 코드를 믿기 어렵다. nslookup은 조회에 실패해도 구현과 버전에 따라 0을 반환하는 경우가 있다. 셸 스크립트에서 if nslookup ...; then 식으로 성공 여부를 판단하면 조용히 잘못 동작한다. 스크립트에서는 dig +short의 출력이 비었는지 검사하거나, getent hosts를 쓰는 편이 안전하다.

TTL이 보이지 않는다. nslookup 기본 출력에는 남은 캐시 시간이 없다. "언제 전파되나"를 판단할 근거가 없다는 뜻이다. 이 정보가 필요하면 dig +noall +answer를 쓴다.

대화형 모드에 갇히기 쉽다. cron이나 CI에서 인자를 잘못 줘서 대화형으로 들어가면 표준 입력을 기다리며 멈춘다. 자동화에는 반드시 도메인 인자를 명시하고, 필요하면 < /dev/null을 붙여둔다.

배포판마다 구현이 다르다. 리눅스의 nslookup은 대개 BIND 도구 모음에서 오지만, 예전 busybox나 일부 컨테이너 이미지에는 옵션 지원이 훨씬 빈약한 자체 구현이 들어 있다. -type=이 안 먹으면 그 경우다.

함께 보면 좋은 명령어

  • dig — TTL, 응답 상태, 위임 추적까지 필요한 순간의 정답.
  • host — nslookup보다 출력이 짧고 종료 코드가 정직하다.
  • ping — 이름이 풀린 다음 그 IP에 실제로 닿는지 확인한다.