ルーティングテーブルを読んで計算する
한국어 원문으로 표시합니다.
목표
주소를 읽고, 서브넷을 계산하고, 패킷이 어느 길로 나가는지 커널에게 직접 묻습니다. 방화벽 규칙과 네트워크 정책은 전부 이 계산 위에 서 있습니다.
왜 중요한가
"어떤 대역만 안 된다" 는 신고는 거의 항상 라우팅이나 마스크 계산 문제입니다. 그런데 라우팅 테이블을 읽을 줄 모르면 무엇을 봐야 할지조차 모릅니다.
특히 4단계가 중요합니다. ip route get 은 테이블을 눈으로 읽고 추론하는 대신
커널에게 직접 묻는 명령입니다. 사람의 추론보다 정확하고, 답이 즉시 나옵니다.
단계
- 내 주소가 왜 /32 인가 →
/root/net/01-addr.txt - 주어진 세 대역의 서브넷 계산 →
/root/net/02-subnet.txt - 라우팅 테이블 →
/root/net/03-route.txt ip route get두 번 →/root/net/04-get.txt- 최장 접두사 일치 설명 →
/root/net/05-longest.txt - 사설/공인 판별 →
/root/net/08-private.txt
참고
- 이 파드는 커널 권한이 없어
ip route add로 경로를 바꿀 수는 없습니다. 읽고 계산하는 것이 목적입니다. - 파드 주소가
/32인 것은 정상입니다. Cilium 은 파드마다 주소 하나만 주고 나가는 길을 온링크 경로로 따로 알려 줍니다. 그래서 파드에는 '같은 서브넷의 이웃' 이 없고, 모든 통신이 게이트웨이를 거칩니다. python3의ipaddress모듈이 계산 검산에 유용합니다.- 172 사설 대역의 경계와
100.64.0.0/10이 함정입니다.
내 주소의 프리픽스가 이상하다
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 대역이 함정입니다.