LabHub
배우기 러닝패스 코스

Linuxネットワーク診断

名前解決の診断

LabHub 에서 이어서 보기

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

목표

이름 해석이 어떤 경로를 거치는지 확인하고, "dig 는 되는데 앱은 안 되는" 상황을 직접 만들어 봅니다.

왜 중요한가

애플리케이션은 glibc 의 getaddrinfo() 를 부르고, glibc 는 /etc/nsswitch.confhosts: 줄 순서대로 물어봅니다(보통 files dns - 즉 /etc/hosts 가 먼저). 반면 dig 는 이 모든 것을 건너뛰고 /etc/resolv.conf 의 네임서버에 직접 물어봅니다. 두 도구의 답이 다르면 문제는 DNS 서버가 아니라 스텁 리졸버 구간입니다. 이 사실 하나가 "dig 는 되는데 왜 앱은 안 되지" 라는 질문을 몇 시간에서 몇 분으로 줄여 줍니다.

단계

/root/dns 디렉터리에서 작업합니다.

  1. /etc/resolv.conf첫 번째 nameserver 주소를 /root/dns/nameserver.txt 에 적으세요.
  2. /etc/hosts10.99.0.10app.labhub.local 과 짧은 이름 app 두 가지로 등록하세요.
  3. /etc/nsswitch.confhosts: 항목 값(콜론 뒤 전체)을 /root/dns/order.txt 에 적으세요. 파일이 없으면 unavailable.
  4. 같은 이름 app.labhub.localgetentdig +short 로 각각 물어본 결과를 /root/dns/compare.txt 에 다음 두 줄로 적으세요. dig 가 아무 답도 주지 않으면 none 이라고 적습니다.
    • getent=<결과>
    • dig=<결과 또는 none>
  5. /etc/resolv.conf 의 검색 도메인 목록을 /root/dns/search.txt 에 공백으로 구분해 적으세요. 없으면 none.
  6. 10.99.0.10 을 역방향으로 조회한 결과 이름을 /root/dns/reverse.txt 에 적으세요.
  7. /etc/hostsapi.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이 아닌 코드입니다.
    • name=<이름>
    • ip=<주소>

참고

리졸버 주소 확인

/etc/resolv.conf첫 번째 nameserver 주소를 /root/dns/nameserver.txt 에 적으세요.

/etc/resolv.conf 의 nameserver 줄입니다. 여러 개면 첫 번째만 적으세요.

hosts 파일에 이름 등록

/etc/hosts10.99.0.10app.labhub.local 과 짧은 이름 app 두 가지로 등록하세요.

한 줄에 IP 뒤로 이름을 여러 개 적으면 모두 별칭이 됩니다. getent 로 확인하세요.

이름 서비스 순서 확인

/etc/nsswitch.confhosts: 항목 값(콜론 뒤 전체)을 /root/dns/order.txt 에 적으세요. 파일이 없으면 unavailable.

/etc/nsswitch.conf 의 hosts: 줄입니다. 콜론 뒤 값만 적으세요.

getent 와 dig 비교하기

같은 이름 app.labhub.localgetentdig +short 로 각각 물어본 결과를 /root/dns/compare.txt 에 다음 두 줄로 적으세요. 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/hostsapi.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이 아닌 코드입니다.

성공하면 이름과 IP 를 출력하고 0, 실패하면 unresolved 와 종료 코드 3 입니다.