Digging Into DNS With dig
한국어 원문으로 표시합니다.
목표
dig 로 레코드 타입별 조회를 하고, TTL 과 네거티브 캐시를 읽고, getent 와 dig 의 답이 갈리는 지점을 직접 만들어 봅니다.
왜 중요한가
dig 출력은 status 와 flags 부터 읽어야 합니다. NXDOMAIN(이름 자체가 없음)과 NOERROR + ANSWER 0(이름은 있는데 그 타입만 없음)은 완전히 다른 상황이고 대응도 다릅니다. aa 플래그가 없으면 캐시에서 온 답이고, 그래서 TTL 이 줄어듭니다. 그리고 dig 는 /etc/hosts 를 보지 않으므로, 같은 이름에 대해 getent 와 서로 다른 답을 할 수 있습니다 — 그 차이가 곧 원인의 위치입니다.
단계
/root/dns디렉터리를 만들고,/etc/resolv.conf에서nameserver로 시작하는 줄만/root/dns/nameserver.txt로 저장하세요.example.com의 A 레코드 값만/root/dns/a.txt로 저장하세요. 파일에는 IPv4 주소가 최소 한 줄 있어야 합니다.google.com의MX,NS,TXT를 각각/root/dns/mx.txt,/root/dns/ns.txt,/root/dns/txt.txt로 저장하세요. 세 파일 모두 비어 있으면 안 됩니다.example.com의 답변 섹션만 출력해/root/dns/ttl1.txt로 저장하고, 5초 이상 기다린 뒤 같은 방법으로/root/dns/ttl2.txt를 만드세요. 두 번째 TTL 이 첫 번째보다 크면 안 됩니다.8.8.8.8의 역방향 조회 결과를/root/dns/ptr.txt로 저장하세요.labhub-does-not-exist-9137.example.com을 조회해 전체 출력을/root/dns/nxdomain.txt로 저장하세요. 파일에status: NXDOMAIN과 SOA 레코드가 모두 들어 있어야 합니다./etc/hosts에10.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로 저장하세요. 두 결과는 서로 달라야 합니다./root/dns/report.txt를 다음 5줄로 만드세요.NAMESERVERS=<1번 파일의 줄 수>/A_COUNT=<2번 파일의 줄 수>/PTR=<5번에서 얻은 이름, 끝의 점 제외>/HOSTS_WINS=<7번 getent 결과의 IP>/DNS_SAYS=<7번 dig 결과의 첫 번째 IP>
참고
dig +short,dig +noall +answer,dig -x <IP>,dig -t MX <이름>을 조합하면 이 실습의 대부분이 끝납니다.- 4번에서 TTL 은
+noall +answer출력의 두 번째 열입니다. - 6번에서 SOA 는 AUTHORITY 섹션에 나옵니다.
+noall +authority로 따로 볼 수도 있습니다. - 흔한 실수 1: 7번에서 hosts 에 넣은 IP 가 실제 DNS 응답과 같으면 이 단계의 의미가 없습니다. 사설 대역 주소를 쓰세요.
- 흔한 실수 2:
dig결과가 비어 있다면 그 타입의 레코드가 없는 것입니다.status를 확인해 NXDOMAIN 인지 NOERROR 인지 구분하세요.
리졸버 설정 읽기
/root/dns 디렉터리를 만들고, /etc/resolv.conf 에서 nameserver 로 시작하는 줄만 /root/dns/nameserver.txt 로 저장하세요.
resolv.conf 에서 nameserver 로 시작하는 줄만 필요합니다. 여러 개일 수 있습니다.
정방향 조회
example.com 의 A 레코드 값만 /root/dns/a.txt 로 저장하세요. 파일에는 IPv4 주소가 최소 한 줄 있어야 합니다.
값만 필요하면 짧은 출력 옵션이 있습니다. A 레코드는 IPv4 주소 형식이어야 합니다.
레코드 타입별 조회
google.com 의 MX, 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/hosts 에 10.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>
앞 단계 결과를 키=값으로 모으면 됩니다. 개수를 세는 항목은 줄 수로 세면 충분합니다.