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