LabHub
배우기 러닝패스 코스

Network Troubleshooting

Reading, Writing and Auditing /etc/hosts

LabHub 에서 이어서 보기

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

목표

/etc/hosts 를 읽고, 고치고, 감사합니다. 그리고 getentdig 가 왜 다른 답을 하는지 손으로 확인합니다.

왜 중요한가

/etc/hostsnsswitch.confhosts: 줄에서 files 가 앞에 있는 한 DNS 보다 먼저 봅니다. 그래서 hosts 에 잘못된 줄이 하나 남아 있으면 DNS 를 아무리 고쳐도 애플리케이션은 계속 옛 주소로 갑니다. 더 나쁜 것은 이 사고가 DNS 오류의 얼굴을 하지 않는다는 점입니다 — 이름은 멀쩡히 풀리고, 증상은 connection refused 나 timeout 으로 나타납니다. dig 는 이 파일을 전혀 보지 않기 때문에 "dig 는 정상인데 애플리케이션만 실패" 라는 미궁이 만들어집니다.

단계

  1. /root/net 디렉터리를 만들고, /etc/hosts 에서 루프백 주소를 가진 줄만 골라 /root/net/hosts-loopback.txt 로 저장하세요. IPv4(127. 로 시작)와 IPv6(::1) 양쪽이 모두 들어가야 합니다.
  2. /etc/hosts10.10.0.11app1.labhub.local(정규 이름), app1(별칭) 항목을 추가하고, getent hosts app1.labhub.local 의 출력을 /root/net/getent-app1.txt 로 저장하세요.
  3. 별칭 app1 로도 같은 IP 가 나오는지 확인해 /root/net/getent-alias.txt 로 저장하세요.
  4. /etc/nsswitch.conf 에서 hosts: 로 시작하는 줄을 /root/net/nsswitch-hosts.txt 로 저장하세요.
  5. /etc/hosts 에 IPv6 항목 fd00:cafe::11app6.labhub.local 을 추가하고, IPv6 주소만 조회한 결과를 /root/net/getent-v6.txt 로 저장하세요.
  6. /etc/hostsweb.labhub.local 이라는 같은 이름10.10.0.2110.10.0.22 두 IP 에 각각 한 줄씩 추가하고, getent ahosts web.labhub.local 의 출력을 /root/net/getent-multi.txt 로 저장하세요.
  7. /opt/fixtures/nt-hosts/hosts.broken 을 감사하세요. 아래 세 규칙을 어긴 줄 번호만 오름차순으로 한 줄에 하나씩 /root/net/hosts-audit.txt 에 적으세요.
    • 규칙 A: 모든 항목 줄은 IP 와 이름을 합쳐 2개 이상의 필드를 가져야 한다
    • 규칙 B: IPv4 주소의 각 옥텟은 0~255 여야 한다
    • 규칙 C: 같은 정규 이름(둘째 필드)이 파일 안에서 두 번 이상 나오면 안 된다
  8. 7번에서 찾은 문제를 모두 고친 최종본을 /root/net/hosts.final 로 제출하세요. 원래 있던 정상 항목은 그대로 유지하고, db01.labhub.local10.20.30.13, bad.labhub.local10.20.30.18 로 고치고, 이름이 없는 줄은 10.20.30.14 log01.labhub.local log01 로 채우고, 중복된 정규 이름을 가진 줄은 정규 이름을 web01-old.labhub.local 로 바꾸세요.

참고

루프백 항목 확인

/root/net 디렉터리를 만들고, /etc/hosts 에서 루프백 주소를 가진 줄만 골라 /root/net/hosts-loopback.txt 로 저장하세요. IPv4(127. 로 시작)와 IPv6(::1) 양쪽이 모두 들어가야 합니다.

IPv4 루프백과 IPv6 루프백은 서로 다른 줄에 있습니다. 두 줄을 모두 골라내야 합니다.

항목 추가하고 해석 확인

/etc/hosts10.10.0.11app1.labhub.local(정규 이름), app1(별칭) 항목을 추가하고, getent hosts app1.labhub.local 의 출력을 /root/net/getent-app1.txt 로 저장하세요.

getent hosts 는 애플리케이션과 같은 경로로 이름을 풉니다. 결과의 첫 필드가 IP 입니다.

별칭으로도 풀리는지 확인

별칭 app1 로도 같은 IP 가 나오는지 확인해 /root/net/getent-alias.txt 로 저장하세요.

hosts 한 줄에서 두 번째 필드가 정규 이름, 세 번째부터가 별칭입니다. 별칭도 같은 IP 로 풀려야 정상입니다.

해석 순서 확인

/etc/nsswitch.conf 에서 hosts: 로 시작하는 줄을 /root/net/nsswitch-hosts.txt 로 저장하세요.

hosts 로 시작하는 줄 하나면 됩니다. 그 줄에서 첫 번째 소스가 무엇인지가 이 실습의 핵심입니다.

IPv6 항목 다루기

/etc/hosts 에 IPv6 항목 fd00:cafe::11app6.labhub.local 을 추가하고, IPv6 주소만 조회한 결과를 /root/net/getent-v6.txt 로 저장하세요.

hosts 파일은 IPv4 만 담는 곳이 아닙니다. IPv6 주소를 적고 getent hosts <이름> 으로 확인하세요.

getent ahostsv6 를 떠올렸다면 좋은 감각인데, 이 환경에서는 빈 값이 나옵니다. glibc 의 ahosts 계열은 조회에 AI_ADDRCONFIG 를 붙이고, 그 플래그는 이 기계에 전역 스코프 IPv6 주소가 하나라도 있을 때만 IPv6 를 물어봅니다. lo::1 은 host 스코프라 세지 않으므로 getent ahostsv6 ::1 조차 빈 값입니다.

이건 함정이 아니라 실무에서 그대로 만나는 현상입니다 — 「hosts 에 분명히 적었는데 왜 안 나오지」 의 흔한 정답이 이것입니다. getent hosts 는 다른 경로(gethostbyname2)라 이 플래그를 타지 않습니다.

한 이름에 여러 IP

/etc/hostsweb.labhub.local 이라는 같은 이름10.10.0.2110.10.0.22 두 IP 에 각각 한 줄씩 추가하고, getent ahosts web.labhub.local 의 출력을 /root/net/getent-multi.txt 로 저장하세요.

같은 이름을 두 줄에 각각 다른 IP 로 적을 수 있습니다. getent ahosts 가 몇 줄을 돌려주는지 보세요.

망가진 hosts 감사

/opt/fixtures/nt-hosts/hosts.broken 을 감사하세요. 아래 세 규칙을 어긴 줄 번호만 오름차순으로 한 줄에 하나씩 /root/net/hosts-audit.txt 에 적으세요.

규칙은 네 가지입니다. 필드가 2개 미만인 줄, IPv4 옥텟이 255 를 넘는 줄, 이미 앞에서 쓰인 정규 이름을 다시 쓴 줄. 줄 번호는 주석과 빈 줄을 포함해 파일 맨 위부터 1로 셉니다.

정리된 최종본 제출

7번에서 찾은 문제를 모두 고친 최종본을 /root/net/hosts.final 로 제출하세요. 원래 있던 정상 항목은 그대로 유지하고, db01.labhub.local10.20.30.13, bad.labhub.local10.20.30.18 로 고치고, 이름이 없는 줄은 10.20.30.14 log01.labhub.local log01 로 채우고, 중복된 정규 이름을 가진 줄은 정규 이름을 web01-old.labhub.local 로 바꾸세요.

감사에서 찾은 문제를 모두 없앤 파일이어야 합니다. 잘못된 IP 는 지우기보다 올바른 값으로 고치는 편이 현실적입니다.