はじめに
ルーティングテーブルの読み方をすぐ忘れるのでメモ
環境
Ubuntu 24.04
ISA x86_64
おさらい
パケットの構成は、 [L2ヘッダ][L3ヘッダ][本体][おまけのL2チェックサム] が基本。
本文
下記は、ChatGPTに作ってもらった架空のroute -n
(あるいは、netstat -rn
)コマンドの結果
行番号 Destination Gateway Genmask Flags Metric Ref Use Iface
1. 0.0.0.0 192.168.1.1 0.0.0.0 UG 0 0 0 eth0
2. 10.0.0.0 192.168.2.1 255.255.255.0 UG 0 0 0 eth1
3. 192.168.1.0 * 255.255.255.0 U 0 0 0 eth0
4. 192.168.2.0 * 255.255.255.0 U 0 0 0 eth1
読み方
-
1行目
他のDestinationに含まれなかった結果デフォルトゲートウェイで送ることになったパケットはeth0から送る。
L2の宛先MACアドレスとしては、(eth0の所属するL2ネットワークで)IPアドレス192.168.1.1をMACアドレスに解決したものを利用する。L3のヘッダの宛先を、192.168.1.1にするわけでない(グローバルIPアドレスならグローバルIPアドレスをそのまま、192.168.1.1に送りたいなら192.168.1.1をそのままいれる) -
2行目
10.0.0.0/24 の範囲のアドレスへ送付するとき(ex. 10.0.0.1)は、L2ヘッダのMACアドレスはL2ネットワークに 192.168.2.1 のIPアドレスを解決したものを使う。また、Gatewayが存在することから、10.0.0.0/24の中のアドレスはeth1の所属するL2ネットワークの中には存在しないことがわかる。 -
3行目
Gatewayが*なので、全てのIPアドレスが同一リンクにあることがわかる。つまり、例えば192.168.1.1宛に送る場合、L2ヘッダは192.168.1.1をARPでMACアドレスに解決したものを使う。L3ヘッダはもちろん、そのまま使う。
Flagsについて
ルートの状態を示すフラグ。例:U(使用中)、G(ゲートウェイを経由する)、H(ホストルート)、R(リダイレクト)。
Metric
ルートの優先度。低い値が優先され
Use
このルートが使用された回数
Iface
実際にデータを送信するインターフェース名
逆引き
アドレスに対して選択されるルーティングテーブル行を得る
ip route get
MTUとは
Maximum Transmission Unit。L2で一度に送信できる最大データ量(単位はバイト)。1500バイトが多く、イーサネットのヘッダー(通常14バイト)とIPヘッダー(通常20バイト)を差し引いた1460バイトが実際のデータ部分となる。(L2=Wi-Fiの場合、ヘッダのサイズももう少し大きいことが多い気がするので、Wi-Fiは一度に送れるペイロードが少ないかも。)手元で見ると、ループバックインターフェースだけMTU=65536(0x10000)であった。適切に小さくしないと、フラグメンテーションが起きる(1つのパケットを経路の途中で分割されること)
sudo ip link set dev eth0 mtu 1400
などで変更できる。