LabHub
배우기 러닝패스 코스

Addresses, Subnets and Gateways

Read and Compute the Routing Table

LabHub 에서 이어서 보기

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

목표

주소를 읽고, 서브넷을 계산하고, 패킷이 어느 길로 나가는지 커널에게 직접 묻습니다. 방화벽 규칙과 네트워크 정책은 전부 이 계산 위에 서 있습니다.

왜 중요한가

"어떤 대역만 안 된다" 는 신고는 거의 항상 라우팅이나 마스크 계산 문제입니다. 그런데 라우팅 테이블을 읽을 줄 모르면 무엇을 봐야 할지조차 모릅니다.

특히 4단계가 중요합니다. ip route get 은 테이블을 눈으로 읽고 추론하는 대신 커널에게 직접 묻는 명령입니다. 사람의 추론보다 정확하고, 답이 즉시 나옵니다.

단계

  1. 내 주소가 왜 /32 인가 → /root/net/01-addr.txt
  2. 주어진 세 대역의 서브넷 계산 → /root/net/02-subnet.txt
  3. 라우팅 테이블 → /root/net/03-route.txt
  4. ip route get 두 번 → /root/net/04-get.txt
  5. 최장 접두사 일치 설명 → /root/net/05-longest.txt
  6. 사설/공인 판별 → /root/net/08-private.txt

참고

내 주소의 프리픽스가 이상하다

ip -o addr show eth0 로 주소를 봅니다. 프리픽스가 /32 일 것입니다 — 오타가 아닙니다.

/root/net/01-addr.txt 에 두 줄: (1) 주소/프리픽스 그대로 (2) /32 인 이유를 한 줄로. 힌트: 이 클러스터의 CNI 는 Cilium 이고, 파드에 서브넷을 주는 대신 주소 하나만 준 뒤 나가는 길은 온링크 경로로 따로 알려 줍니다. 그래서 파드는 '같은 서브넷의 이웃' 이라는 개념 자체가 없습니다.

서브넷을 계산한다

이 파드의 주소는 /32 라 계산할 것이 없으니, 주어진 대역으로 연습합니다. /root/net/02-subnet.txt 에 세 줄을 쓰되 각 줄은 <CIDR> <네트워크주소> <브로드캐스트> <호스트개수> 형식입니다.

계산할 대역: 192.168.219.0/26, 10.10.0.0/20, 172.16.5.128/25

손으로 해 보고 python3 -c "import ipaddress; n=ipaddress.ip_network('192.168.219.0/26'); print(n.network_address, n.broadcast_address, n.num_addresses-2)" 로 검산하세요.

라우팅 테이블

ip route 전체를 /root/net/03-route.txt 에 저장합니다. default 줄이 있어야 합니다.

커널에게 직접 묻는다

두 번 묻습니다. ip route get 8.8.8.8(바깥)과 ip route get <게이트웨이 주소>(온링크). 게이트웨이 주소는 3단계에서 저장한 default via ... 줄에 있습니다.

두 결과를 /root/net/04-get.txt 에 저장하세요. 하나는 via 가 붙고 다른 하나는 붙지 않습니다 — 그 차이가 '게이트웨이를 거친다' 와 '직접 보낸다' 의 구분입니다.

최장 접두사 일치

/root/net/05-longest.txt 에 두 줄. (1) 10.0.0.0/8 과 10.244.0.0/16 이 모두 있을 때 10.244.1.5 는 어느 쪽으로 가는가 (2) 왜 그런가. 규칙 이름을 답에 넣으세요.

이름과 연결을 나눠 본다

'안 된다' 를 계층으로 쪼개는 훈련입니다. /root/net/06-dns.txt 에 두 줄. (1) getent hosts localhost 결과 (2) getent hosts nowhere.invalid 를 시도했을 때 어떻게 되는지 한 줄 설명. 이름이 안 풀리는 것과 연결이 안 되는 것은 다른 문제이고, 사용자에게는 똑같이 '안 됨' 으로 보입니다.

무엇이 듣고 있나

ss -ltnp 로 LISTEN 중인 TCP 포트를 봅니다. 결과를 /root/net/07-ports.txt 에 저장하세요. 이 파드에는 권한이 없어 프로세스 이름이 안 보일 수 있는데 그것도 정상입니다 — 포트 목록만 있으면 됩니다.

사설 대역 판별

/root/net/08-private.txt 에 다섯 줄. 각 줄은 <주소> <private|public> 형식입니다. 판별할 주소: 10.1.2.3 / 172.20.5.6 / 172.32.0.1 / 192.168.100.1 / 100.100.1.1. 172 대역의 경계와 CGNAT 대역이 함정입니다.