TT Lab
はじめる
学ぶ 学習パス コース

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

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

TT Labで続きを見る

目標

アドレスを読み、サブネットを計算し、パケットがどの道へ出るかをカーネルに直接尋ねます。ファイアウォールのルールとネットワークポリシーは、すべてこの計算の上に成り立っています。

なぜ重要なのか

「特定の範囲だけつながらない」という報告は、ほとんどの場合、ルーティングかマスク計算の問題です。ところが、ルーティングテーブルの読み方を知らないと、何を見ればよいのかさえわかりません。

特にステップ4が重要です。ip route getは、テーブルを目で読んで推論する代わりに、カーネルに直接尋ねるコマンドです。人間の推論より正確で、答えがすぐ出ます。

ステップ

  1. 自分のアドレスはなぜ/32なのか → /root/net/01-addr.txt
  2. 与えられた3つの範囲のサブネット計算 → /root/net/02-subnet.txt
  3. ルーティングテーブル → /root/net/03-route.txt
  4. ip route getを2回 → /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に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範囲が落とし穴です。