LabHub
배우기 러닝패스 코스

アドレス・サブネット・ゲートウェイ

ルーティングテーブルを読んで計算する

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 대역이 함정입니다.