ルーティングテーブルを読んで計算する
目標
アドレスを読み、サブネットを計算し、パケットがどの道へ出るかをカーネルに直接尋ねます。ファイアウォールのルールとネットワークポリシーは、すべてこの計算の上に成り立っています。
なぜ重要なのか
「特定の範囲だけつながらない」という報告は、ほとんどの場合、ルーティングかマスク計算の問題です。ところが、ルーティングテーブルの読み方を知らないと、何を見ればよいのかさえわかりません。
特にステップ4が重要です。ip route getは、テーブルを目で読んで推論する代わりに、カーネルに直接尋ねるコマンドです。人間の推論より正確で、答えがすぐ出ます。
ステップ
- 自分のアドレスはなぜ/32なのか →
/root/net/01-addr.txt - 与えられた3つの範囲のサブネット計算 →
/root/net/02-subnet.txt - ルーティングテーブル →
/root/net/03-route.txt ip route getを2回 →/root/net/04-get.txt- 最長プレフィックス一致の説明 →
/root/net/05-longest.txt - プライベート/グローバルの判別 →
/root/net/08-private.txt
参考
- このPodはカーネル権限がないので、
ip route addで経路を変更することはできません。読んで計算することが目的です。 - Podのアドレスが
/32なのは正常です。CiliumはPodごとにアドレス1つだけを渡し、出ていく道をオンリンク経路として別に知らせます。そのため、Podには「同じサブネットのネイバー」がなく、すべての通信がゲートウェイを経由します。 python3のipaddressモジュールが、計算の検算に役立ちます。- 172のプライベート範囲の境界と
100.64.0.0/10が落とし穴です。
自分のアドレスのプレフィックスが変だ
ip -o addr show eth0でアドレスを見ます。プレフィックスが/32のはずです。タイプミスではありません。
/root/net/01-addr.txtに2行。(1)アドレス/プレフィックスをそのまま書く。(2)/32である理由を1行で書く。ヒント: このクラスターのCNIはCiliumで、Podにサブネットを渡す代わりに、アドレス1つだけを渡したうえで、出ていく道をオンリンク経路として別に知らせます。そのためPodには、「同じサブネットのネイバー」という概念そのものがありません。
サブネットを計算する
このPodのアドレスは/32なので計算することがなく、与えられた範囲で練習します。/root/net/02-subnet.txtに3行を書き、各行は<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行が必要です。
カーネルに直接尋ねる
2回尋ねます。ip route get 8.8.8.8(外側)とip route get <게이트웨이 주소>(プレースホルダーはゲートウェイのアドレスです。オンリンク)です。ゲートウェイのアドレスは、ステップ3で保存したdefault via ...の行にあります。
2つの結果を/root/net/04-get.txtに保存してください。1つにはviaが付き、もう1つには付きません。その違いが、「ゲートウェイを経由する」と「直接送る」の区別です。
最長プレフィックス一致
/root/net/05-longest.txtに2行。(1)10.0.0.0/8と10.244.0.0/16がどちらもあるとき、10.244.1.5はどちらへ行くか。(2)なぜそうなのか。ルールの名前を答えに入れてください。
名前と接続を分けて見る
「つながらない」を階層に分解する訓練です。/root/net/06-dns.txtに2行。(1)getent hosts localhostの結果。(2)getent hosts nowhere.invalidを試したときにどうなるかの1行の説明。名前が解決できないことと、接続できないことは別の問題で、ユーザーには同じく「つながらない」と見えます。
何が待ち受けているか
ss -ltnpで、LISTEN中のTCPポートを見ます。結果を/root/net/07-ports.txtに保存してください。このPodには権限がないので、プロセス名が見えないことがありますが、それも正常です。ポートの一覧があれば十分です。
プライベート範囲の判別
/root/net/08-private.txtに5行。各行は<주소> <private|public>(プレースホルダーはアドレスです)の形式です。判別するアドレス: 10.1.2.3 / 172.20.5.6 / 172.32.0.1 / 192.168.100.1 / 100.100.1.1。172の範囲の境界とCGNAT範囲が落とし穴です。