LabHub
배우기 러닝패스 코스

ネットワークトラブルシューティング

digでDNSを掘る

LabHub 에서 이어서 보기

한국어 원문으로 표시합니다.

목표

dig 로 레코드 타입별 조회를 하고, TTL 과 네거티브 캐시를 읽고, getentdig 의 답이 갈리는 지점을 직접 만들어 봅니다.

왜 중요한가

dig 출력은 statusflags 부터 읽어야 합니다. NXDOMAIN(이름 자체가 없음)과 NOERROR + ANSWER 0(이름은 있는데 그 타입만 없음)은 완전히 다른 상황이고 대응도 다릅니다. aa 플래그가 없으면 캐시에서 온 답이고, 그래서 TTL 이 줄어듭니다. 그리고 dig 는 /etc/hosts 를 보지 않으므로, 같은 이름에 대해 getent 와 서로 다른 답을 할 수 있습니다 — 그 차이가 곧 원인의 위치입니다.

단계

  1. /root/dns 디렉터리를 만들고, /etc/resolv.conf 에서 nameserver 로 시작하는 줄만 /root/dns/nameserver.txt 로 저장하세요.
  2. example.com 의 A 레코드 값만 /root/dns/a.txt 로 저장하세요. 파일에는 IPv4 주소가 최소 한 줄 있어야 합니다.
  3. google.comMX, NS, TXT 를 각각 /root/dns/mx.txt, /root/dns/ns.txt, /root/dns/txt.txt 로 저장하세요. 세 파일 모두 비어 있으면 안 됩니다.
  4. example.com 의 답변 섹션만 출력해 /root/dns/ttl1.txt 로 저장하고, 5초 이상 기다린 뒤 같은 방법으로 /root/dns/ttl2.txt 를 만드세요. 두 번째 TTL 이 첫 번째보다 크면 안 됩니다.
  5. 8.8.8.8 의 역방향 조회 결과를 /root/dns/ptr.txt 로 저장하세요.
  6. labhub-does-not-exist-9137.example.com 을 조회해 전체 출력을 /root/dns/nxdomain.txt 로 저장하세요. 파일에 status: NXDOMAIN 과 SOA 레코드가 모두 들어 있어야 합니다.
  7. /etc/hosts10.77.0.1 www.example.com 을 추가한 뒤, getent hosts www.example.com 결과를 /root/dns/getent-www.txt 로, dig +short www.example.com 결과를 /root/dns/dig-www.txt 로 저장하세요. 두 결과는 서로 달라야 합니다.
  8. /root/dns/report.txt 를 다음 5줄로 만드세요. NAMESERVERS=<1번 파일의 줄 수> / A_COUNT=<2번 파일의 줄 수> / PTR=<5번에서 얻은 이름, 끝의 점 제외> / HOSTS_WINS=<7번 getent 결과의 IP> / DNS_SAYS=<7번 dig 결과의 첫 번째 IP>

참고

리졸버 설정 읽기

/root/dns 디렉터리를 만들고, /etc/resolv.conf 에서 nameserver 로 시작하는 줄만 /root/dns/nameserver.txt 로 저장하세요.

resolv.conf 에서 nameserver 로 시작하는 줄만 필요합니다. 여러 개일 수 있습니다.

정방향 조회

example.com 의 A 레코드 값만 /root/dns/a.txt 로 저장하세요. 파일에는 IPv4 주소가 최소 한 줄 있어야 합니다.

값만 필요하면 짧은 출력 옵션이 있습니다. A 레코드는 IPv4 주소 형식이어야 합니다.

레코드 타입별 조회

google.comMX, NS, TXT 를 각각 /root/dns/mx.txt, /root/dns/ns.txt, /root/dns/txt.txt 로 저장하세요. 세 파일 모두 비어 있으면 안 됩니다.

dig 는 -t 로 타입을 지정하거나 이름 뒤에 타입을 그냥 붙여도 됩니다. MX 값은 우선순위 숫자와 호스트 이름 쌍입니다.

TTL 이 줄어드는 것 관찰

example.com 의 답변 섹션만 출력해 /root/dns/ttl1.txt 로 저장하고, 5초 이상 기다린 뒤 같은 방법으로 /root/dns/ttl2.txt 를 만드세요. 두 번째 TTL 이 첫 번째보다 크면 안 됩니다.

answer 섹션만 출력하면 TTL 이 두 번째 열에 나옵니다. 같은 질의를 잠시 간격을 두고 두 번 하세요.

역방향 조회

8.8.8.8 의 역방향 조회 결과를 /root/dns/ptr.txt 로 저장하세요.

dig 에는 IP 를 넣으면 PTR 을 찾아 주는 전용 옵션이 있습니다. 결과는 점으로 끝나는 이름입니다.

없는 이름과 네거티브 캐시

labhub-does-not-exist-9137.example.com 을 조회해 전체 출력을 /root/dns/nxdomain.txt 로 저장하세요. 파일에 status: NXDOMAIN 과 SOA 레코드가 모두 들어 있어야 합니다.

status 는 헤더 줄에 있습니다. SOA 는 AUTHORITY 섹션에 오고, 마지막 숫자가 MINIMUM 입니다.

getent 와 dig 가 갈리는 지점

/etc/hosts10.77.0.1 www.example.com 을 추가한 뒤, getent hosts www.example.com 결과를 /root/dns/getent-www.txt 로, dig +short www.example.com 결과를 /root/dns/dig-www.txt 로 저장하세요. 두 결과는 서로 달라야 합니다.

hosts 에 넣은 IP 와 DNS 가 주는 IP 가 달라야 이 단계의 의미가 있습니다. 두 결과를 각각 저장하세요.

한 가지 함정이 있습니다. getent hosts <이름> 은 IPv6 로 먼저 묻고 그 답이 없을 때만 IPv4 로 되묻습니다. 그런데 hosts 에 넣는 줄은 IPv4 하나뿐이라, 그 이름에 AAAA 레코드가 있으면 v6 조회가 hosts 를 지나쳐 DNS 로 나가고 IPv6 주소가 먼저 나옵니다. hosts 가 무시된 것처럼 보이지만 그렇지 않습니다 — getent ahostsv4 <이름> 으로 v4 계열만 물어보면 hosts 값이 그대로 나옵니다. 이 단계에서는 그쪽을 쓰세요.

조회 종합 보고서

/root/dns/report.txt 를 다음 5줄로 만드세요. NAMESERVERS=<1번 파일의 줄 수> / A_COUNT=<2번 파일의 줄 수> / PTR=<5번에서 얻은 이름, 끝의 점 제외> / HOSTS_WINS=<7번 getent 결과의 IP> / DNS_SAYS=<7번 dig 결과의 첫 번째 IP>

앞 단계 결과를 키=값으로 모으면 됩니다. 개수를 세는 항목은 줄 수로 세면 충분합니다.