LabHub
배우기 러닝패스 코스

인증서는 갱신됐는데 브라우저는 옛것을 보여줬다 · 이름은 어디서 먼저 답하는가 · 실습

권한 서버는 바뀌었는데 캐시는 옛 답을 준다

LabHub 에서 이어서 보기

목표

파이썬으로 권한 DNS 서버와 캐시 서버를 띄우고, dig 로 TTL·CNAME·부정 응답을 읽은 뒤 "존은 바꿨는데 캐시는 옛 답을 준다" 를 직접 재현합니다.

왜 중요한가

DNS 장애는 대부분 "누가 무엇을 얼마 동안 기억하고 있는가" 의 문제입니다. /etc/hosts 는 DNS 보다 먼저 답하고, 캐시는 권한 서버가 준 TTL 만큼 옛 답을 돌려주며, 없는 이름조차 SOA 가 정한 시간만큼 기억됩니다. 이 실습은 그 세 층을 각각 손으로 만져 봅니다. 재료 서버 /opt/app/minidns.py 는 표준 라이브러리로 만든 작은 DNS 로, 권한 모드는 질의마다 존 파일을 다시 읽고 캐시 모드는 TTL 을 줄여 가며 답합니다.

단계

1. 존 파일 /root/dns/zone.txt 를 만드세요. lab.internal. 의 SOA(마지막 필드 minimum 은 60), www.lab.internal. A 10.0.0.10 TTL 120, api.lab.internal. CNAME www.lab.internal. 이 있어야 합니다. 권한 서버를 python3 /opt/app/minidns.py auth --zone /root/dns/zone.txt --port 5300 으로 띄우고(로그는 /root/dns/auth.log 로), dig @127.0.0.1 -p 5300 www.lab.internal A +noall +answer 의 결과를 /root/dns/01-auth.txt 에 저장하세요.
2. /etc/hosts10.0.0.99 www.lab.internal 을 추가하고, getent hosts www.lab.internal 의 결과와 /etc/nsswitch.confhosts: 줄을 /root/dns/02-hosts.txt 에 저장하세요.
3. 캐시 서버를 python3 /opt/app/minidns.py cache --upstream 127.0.0.1:5300 --port 5301 로 띄우고, www.lab.internal 을 캐시(5301)에 몇 초 간격으로 두 번 물어 두 answer 를 모두 /root/dns/03-ttl.txt 에 저장하세요.
4. 캐시에 api.lab.internal 의 A 를 물어 answer 를 /root/dns/04-cname.txt 에 저장하세요.
5. 없는 이름 nope.lab.internal 을 캐시에 +comments +authority 로 몇 초 간격으로 두 번 물어 /root/dns/05-nx.txt 에 저장하고, 부정 응답이 캐시에 남는 초를 /root/dns/05-negttl.txt 에 숫자 하나로 적으세요.
6. 캐시에 www 를 한 번 물어 채운 뒤, 존 파일의 www.lab.internal.10.0.0.11 로 바꾸고 SOA serial 을 올리세요. 그리고 120초 안에 권한 서버(5300)와 캐시(5301)에 차례로 물어 두 answer 를 /root/dns/06-stale.txt 에 저장하세요.
7. 캐시 서버를 끝내고 다시 띄운 뒤 www 의 answer 를 /root/dns/07-after.txt 에 저장하세요. 캐시를 비울 수 없었다면 옛 답이 최대 몇 초까지 남을 수 있는지 /root/dns/07-window.txt 에 숫자 하나로 적으세요.
8. dig @127.0.0.1 -p 5300 +search +domain=lab.internal +ndots=5 api.lab A 로 짧은 이름을 물은 뒤, 권한 서버 로그(/root/dns/auth.log)에서 api.lab 이 들어간 QUERY 줄을 뽑아 /root/dns/08-search.txt 에 저장하세요.
9. /root/dns/09-report.md 에 정리하세요. /etc/hosts 가 왜 먼저인지, 이전 시 최악의 전파 시간(초), 부정 캐시 시간(초), ndots 가 만드는 추가 질의를 담아야 합니다.

참고

단계 9개

  1. 존 파일과 권한 서버
  2. /etc/hosts 가 먼저다
  3. 캐시는 TTL 을 줄여 가며 답한다
  4. CNAME 사슬은 한 답에 온다
  5. 없는 이름도 기억된다
  6. 존은 바뀌었는데 캐시는 옛 답
  7. 캐시를 비우면, 못 비우면
  8. ndots 가 만드는 추가 질의
  9. 정리 보고서