Linux에서 dig 명령을 사용하는 방법

이제부터 dig 명령어를 통해 얻을 수 있는 다양한 정보를 심층적으로 분석해 보겠습니다.

다음은 dig 명령어 실행 결과의 예시입니다.

  ; <<>> DiG 9.11.3-1ubuntu1.11-Ubuntu <<>> wdzwdz.com
  ;; global options: +cmd
  ;; Got answer:
  ;; ->>HEADER<<-

이 결과가 의미하는 바는 다음과 같습니다.

첫 번째 줄은 dig 명령어의 버전 정보와 쿼리 대상 도메인 주소를 보여줍니다.
‘전역 옵션’ 줄은 dig 명령어에 적용된 전역 설정들을 나타냅니다.
여기서는 기본적으로 ‘+cmd’ 옵션만 사용되었습니다.
Opcode는 요청된 작업 유형을 나타내며, 이 경우에는 ‘쿼리’입니다.
다른 종류의 요청에는 역방향 조회나 DNS 서버 상태 확인 등이 있습니다.
상태는 ‘오류 없음’으로, 요청이 성공적으로 처리되었음을 나타냅니다.
ID는 요청과 응답을 매칭시키는 데 사용되는 임의의 숫자입니다.
플래그는 ‘qr rd ra’로, 쿼리 요청, 재귀 요청 허용, 재귀 사용 가능 등을 의미합니다.
‘AA’는 응답이 권한 있는 네임 서버로부터 왔음을 나타냅니다.
‘쿼리’는 현재 세션에서 실행된 쿼리 수를 나타냅니다(이 경우 1개).
‘답변’은 응답으로 받은 답변의 수를 보여줍니다(이 경우 4개).
‘Authority’는 권한 있는 네임 서버로부터 받은 응답 수를 나타내며, 여기서는 0입니다.
이는 캐시된 응답을 받았음을 의미합니다.
‘추가’는 추가 정보의 수를 나타내며, 이 값이 2 이상이어야 정보가 표시됩니다.

의사 섹션 분석

다음은 ‘Opt Pseudosection’의 내용입니다.

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 65494

각 항목을 자세히 살펴보겠습니다.

EDNS 버전 0은 DNS 확장 메커니즘이 사용 중임을 나타냅니다.
EDNS는 UDP 패킷 크기를 확장하여 더 많은 데이터와 플래그를 전송할 수 있도록 합니다.
‘flags’는 현재 사용 중인 플래그가 없음을 나타냅니다.
‘udp’는 UDP 패킷의 최대 크기를 나타냅니다.

질문 섹션

질문 섹션에는 다음과 같은 내용이 포함되어 있습니다.

;; QUESTION SECTION:
;wdzwdz.com. IN A

각 항목은 다음을 의미합니다.

‘wdzwdz.com’은 쿼리 대상 도메인 이름입니다.
‘IN’은 인터넷 클래스 쿼리를 의미합니다.
‘A’는 dig 명령어가 DNS 서버에 A 레코드(주소 레코드)를 요청하고 있음을 나타냅니다.

답변 섹션

답변 섹션에는 DNS 서버로부터 받은 네 개의 답변이 나열됩니다.

wdzwdz.com. 3551 IN A 151.101.194.217
wdzwdz.com. 3551 IN A 151.101.130.217
wdzwdz.com. 3551 IN A 151.101.66.217
wdzwdz.com. 3551 IN A 151.101.2.217

각 항목의 의미는 다음과 같습니다.

‘3551’은 TTL(Time to Live) 값으로, 해당 레코드를 캐시할 수 있는 시간(초)을 나타냅니다.
TTL이 만료되면 DNS 서버에서 데이터를 새로 받아야 합니다.
‘IN’은 인터넷 클래스 쿼리임을 의미합니다.
‘A’는 DNS 서버에서 A 레코드(주소 레코드)를 응답했음을 의미합니다.

통계 섹션

마지막으로 통계 섹션에는 다음과 같은 정보가 포함되어 있습니다.

;; Query time: 0 msec
;; SERVER: 127.0.0.53#53(127.0.0.53)
;; WHEN: Sun Mar 22 07:44:37 EDT 2020
;; MSG SIZE rcvd: 106

각 항목은 다음을 의미합니다.

‘쿼리 시간’은 응답을 받는 데 걸린 시간입니다.
‘SERVER’는 응답한 DNS 서버의 IP 주소와 포트 번호입니다.
로컬 캐싱 스텁 해석기를 가리키는 경우가 많습니다.
‘WHEN’은 요청이 이루어진 시간입니다.
‘MSG SIZE rcvd’는 DNS 서버에서 받은 메시지 크기입니다.

출력 섹션 선택

dig 명령어는 출력 섹션을 사용자가 선택하여 포함하거나 제외할 수 있는 기능을 제공합니다. 특정 정보를 제외하거나 원하는 섹션만 포함하여 결과를 사용자화할 수 있습니다.

다음은 결과에서 섹션을 제거하는 옵션입니다.

  • +nocomments: 주석 줄을 제거합니다.
  • +noauthority: 권한 섹션을 제거합니다.
  • +noadditional: 추가 섹션을 제거합니다.
  • +nostats: 통계 섹션을 제거합니다.
  • +noanswer: 답변 섹션을 제거합니다.
  • +noall: 모든 섹션을 제거합니다.

‘+noall’ 옵션은 다른 옵션과 함께 사용되어 특정 섹션만 출력할 때 유용합니다. 여러 섹션을 끄기 위해 긴 옵션 문자열을 입력하는 대신 ‘+noall’을 사용하면 모든 섹션을 한 번에 끌 수 있습니다.

다음은 다시 출력하고 싶은 옵션을 활성화하는 옵션입니다.

  • +comments: 주석 줄을 표시합니다.
  • +authority: 권한 섹션을 표시합니다.
  • +additional: 추가 섹션을 표시합니다.
  • +stats: 통계 섹션을 표시합니다.
  • +answer: 답변 섹션을 표시합니다.
  • +all: 모든 섹션을 표시합니다.

다음 명령어를 입력하여 주석 줄을 제외한 결과를 얻을 수 있습니다.

dig wdzwdz.com +nocomments

‘+noall’ 옵션을 단독으로 사용하면 아무런 출력을 얻을 수 없습니다.

dig wdzwdz.com +noall

다음과 같이 출력하고 싶은 섹션을 선택적으로 추가할 수 있습니다. 답변 섹션만 추가하려면 다음과 같이 입력합니다.

dig wdzwdz.com +noall +answer

통계 섹션도 추가하려면 다음을 입력합니다.

dig wdzwdz.com +noall +answer +stats

‘+noall +answer’ 조합은 자주 사용됩니다. 매번 명령줄에 입력하는 대신 구성 파일에 저장할 수 있습니다. ~/.digrc 파일에 다음을 입력합니다.

echo "+noall +answer" > $HOME/.digrc

파일 내용을 확인하려면 다음을 입력합니다.

cat .digrc

이제부터 dig 명령어는 해당 설정을 적용하여 실행됩니다.

dig ubuntu.org
dig linux.org
dig github.com

이 설정은 이 문서의 나머지 예시에 사용됩니다.

DNS 레코드 타입

dig 명령어의 결과는 DNS 서버에 저장된 다양한 유형의 레코드에서 가져옵니다. 기본적으로 A 레코드를 쿼리하지만, 다른 레코드 타입도 지정할 수 있습니다. 다음은 dig와 함께 일반적으로 사용되는 레코드 타입입니다.

A 레코드 도메인을 IPv4 주소에 연결합니다.
MX 레코드 메일 교환 레코드는 도메인으로 전송된 이메일을 올바른 메일 서버로 보냅니다.
NS 레코드 네임 서버 레코드는 도메인을 DNS 서버 세트에 위임합니다.
TXT 레코드 텍스트 레코드는 도메인에 관한 텍스트 기반 정보를 저장합니다. 이메일 스푸핑 방지에 사용될 수 있습니다.
SOA 레코드 권한 레코드의 시작으로 도메인에 대한 많은 정보를 보유합니다. 기본 네임 서버, 책임자, 변경 시간, 영역 새로 고침 빈도 등을 찾을 수 있습니다.
TTL DNS 서버가 각 DNS 쿼리를 캐시할 수 있는 기간을 지정합니다.
ANY 가능한 모든 유형의 DNS 레코드를 반환하도록 지시합니다.

A 레코드 타입을 지정하면 주소 레코드를 쿼리하여 IP 주소를 얻을 수 있습니다.

dig redhat.com A

메일 교환 레코드를 조회하려면 MX 플래그를 사용합니다.

dig yahoo.com MX

이름 서버 플래그는 최상위 도메인과 연결된 루트 이름 서버를 반환합니다.

dig fedora.com NS

권한 레코드의 시작을 조회하려면 SOA 플래그를 입력합니다.

dig manjaro.com SOA

TTL 플래그는 DNS 서버 캐시에 저장된 데이터의 TTL 값을 보여줍니다. 요청을 반복하면 TTL 값이 감소했다가 다시 시작 값으로 돌아갑니다.

dig usa.gov TTL

텍스트 레코드를 확인하려면 TXT 플래그를 입력합니다.

dig usa.gov TXT

DNS 서버 지정

특정 DNS 서버를 사용하려면 @ 기호를 사용하여 dig 명령어에 전달할 수 있습니다.

기본 DNS 서버는 로컬 캐싱 스텁 확인자인 127.0.0.53 입니다.

dig usa.gov +stats

이제 Google의 공개 DNS 서버인 8.8.8.8을 사용하려면 다음과 같이 입력합니다.

dig @8.8.8.8 usa.gov +stats

여러 도메인에서 dig 사용

다음과 같이 명령줄에서 여러 도메인을 dig 명령어에 전달할 수 있습니다.

dig ubuntu.org fedora.org manjaro.com

정기적으로 확인하는 도메인 목록을 파일에 저장한 후 dig 명령어에 전달할 수도 있습니다.

domains.txt 파일의 내용을 확인하고 -f 옵션을 사용하여 dig 명령어에 전달하려면 다음을 입력합니다.

cat domains.txt
dig -f domains.txt

역방향 DNS 조회

IP 주소를 알고 있지만 해당 IP 주소가 어디를 가리키는지 모를 경우, 역방향 DNS 조회를 시도하여 도메인 주소를 확인할 수 있습니다.

이 기능은 PTR(포인터 레코드)이 DNS 서버에 등록되어 있어야 가능합니다. PTR 레코드는 IP 주소를 정규화된 도메인 이름으로 매핑합니다.

예를 들어 IP 주소 209.51.188.148이 어디로 연결되는지 알아보려면 -x (역방향 조회) 옵션을 사용하여 다음을 입력합니다.

dig -x 209.51.188.148

결과적으로 IP 주소는 gnu.org 도메인으로 확인되었습니다.

dig 명령어는 특정 DNS 레코드를 요청할 수 있기 때문에 PTR 레코드를 직접 조회하는 것도 가능합니다. 이를 위해서는 IP 주소를 역순으로 입력하고 끝에 .in-addr.arpa를 추가해야 합니다.

dig ptr 148.188.51.209.in-addr.arpa

결과는 동일하며, 약간의 추가 작업이 필요했습니다.

dig 명령어 활용하기

인터넷 사용 시 브라우저에 웹사이트 이름을 입력할 때 마법처럼 웹사이트가 열리는 과정을 dig 명령어를 통해 확인할 수 있습니다. dig 명령어를 사용하면 네트워크 구성 프로세스를 탐색하고 DNS 동작을 더 잘 이해할 수 있습니다.