Diagnosing Name Resolution
한국어 원문으로 표시합니다.
목표
이름 해석이 어떤 경로를 거치는지 확인하고, "dig 는 되는데 앱은 안 되는" 상황을 직접 만들어 봅니다.
왜 중요한가
애플리케이션은 glibc 의 getaddrinfo() 를 부르고, glibc 는 /etc/nsswitch.conf 의 hosts: 줄 순서대로 물어봅니다(보통 files dns - 즉 /etc/hosts 가 먼저). 반면 dig 는 이 모든 것을 건너뛰고 /etc/resolv.conf 의 네임서버에 직접 물어봅니다. 두 도구의 답이 다르면 문제는 DNS 서버가 아니라 스텁 리졸버 구간입니다. 이 사실 하나가 "dig 는 되는데 왜 앱은 안 되지" 라는 질문을 몇 시간에서 몇 분으로 줄여 줍니다.
단계
/root/dns 디렉터리에서 작업합니다.
/etc/resolv.conf의 첫 번째 nameserver 주소를/root/dns/nameserver.txt에 적으세요./etc/hosts에10.99.0.10을app.labhub.local과 짧은 이름app두 가지로 등록하세요./etc/nsswitch.conf의hosts:항목 값(콜론 뒤 전체)을/root/dns/order.txt에 적으세요. 파일이 없으면unavailable.- 같은 이름
app.labhub.local을getent와dig +short로 각각 물어본 결과를/root/dns/compare.txt에 다음 두 줄로 적으세요. dig 가 아무 답도 주지 않으면none이라고 적습니다.getent=<결과>dig=<결과 또는 none>
/etc/resolv.conf의 검색 도메인 목록을/root/dns/search.txt에 공백으로 구분해 적으세요. 없으면none.10.99.0.10을 역방향으로 조회한 결과 이름을/root/dns/reverse.txt에 적으세요./etc/hosts에api.labhub.local을 두 줄로 등록하세요.10.99.0.21을 먼저,10.99.0.22를 그 뒤에. 그리고getent hosts api.labhub.local이 실제로 돌려주는 IP 를/root/dns/first.txt에 적으세요./root/dns/resolve.sh <이름>을 만드세요. 해석에 성공하면 다음 두 줄을 출력하고 종료 코드 0, 실패하면unresolved를 알리고 종료 코드 3. 인자가 없으면 0이 아닌 코드입니다.name=<이름>ip=<주소>
참고
getent hosts 이름은IP 정식이름 별칭...형식으로 출력합니다.dig +short +time=2 +tries=1 이름으로 짧게 물어볼 수 있습니다.- 흔한 실수 1: 4번에서 dig 결과가 비었다고 실패로 판단하면 안 됩니다. hosts 에만 있는 이름은 DNS 가 모르는 것이 정상입니다.
- 흔한 실수 2: 7번에서 두 줄의 순서를 바꾸면 결과가 달라집니다. 먼저 적힌 줄이 이깁니다.
리졸버 주소 확인
/etc/resolv.conf 의 첫 번째 nameserver 주소를 /root/dns/nameserver.txt 에 적으세요.
/etc/resolv.conf 의 nameserver 줄입니다. 여러 개면 첫 번째만 적으세요.
hosts 파일에 이름 등록
/etc/hosts 에 10.99.0.10 을 app.labhub.local 과 짧은 이름 app 두 가지로 등록하세요.
한 줄에 IP 뒤로 이름을 여러 개 적으면 모두 별칭이 됩니다. getent 로 확인하세요.
이름 서비스 순서 확인
/etc/nsswitch.conf 의 hosts: 항목 값(콜론 뒤 전체)을 /root/dns/order.txt 에 적으세요. 파일이 없으면 unavailable.
/etc/nsswitch.conf 의 hosts: 줄입니다. 콜론 뒤 값만 적으세요.
getent 와 dig 비교하기
같은 이름 app.labhub.local 을 getent 와 dig +short 로 각각 물어본 결과를 /root/dns/compare.txt 에 다음 두 줄로 적으세요. dig 가 아무 답도 주지 않으면 none 이라고 적습니다.
getent=<결과>dig=<결과 또는 none>
같은 이름을 두 도구로 물어보세요. 결과가 왜 다른지 생각해 보세요. dig 가 아무 답도 못 받으면 none 이라고 적습니다.
검색 도메인 확인
/etc/resolv.conf 의 검색 도메인 목록을 /root/dns/search.txt 에 공백으로 구분해 적으세요. 없으면 none.
resolv.conf 의 search 줄입니다. 없으면 none 이라고 적으세요.
역방향 조회
10.99.0.10 을 역방향으로 조회한 결과 이름을 /root/dns/reverse.txt 에 적으세요.
getent hosts 에 IP 를 넣으면 역방향으로 동작합니다.
같은 이름 두 줄, 누가 이기나
/etc/hosts 에 api.labhub.local 을 두 줄로 등록하세요. 10.99.0.21 을 먼저, 10.99.0.22 를 그 뒤에. 그리고 getent hosts api.labhub.local 이 실제로 돌려주는 IP 를 /root/dns/first.txt 에 적으세요.
순서가 결과를 바꿉니다. 21 을 먼저 적으세요.
이름 해석 헬퍼 만들기
/root/dns/resolve.sh <이름> 을 만드세요. 해석에 성공하면 다음 두 줄을 출력하고 종료 코드 0, 실패하면 unresolved 를 알리고 종료 코드 3. 인자가 없으면 0이 아닌 코드입니다.
name=<이름>ip=<주소>
성공하면 이름과 IP 를 출력하고 0, 실패하면 unresolved 와 종료 코드 3 입니다.