ルーティング
経路が複数あるとき、Linux はどれを選ぶのか。答えはロンゲストマッチで、プレフィックス長が長い、つまりより具体的な経路が勝ちます。この原則を頭に置くと ip route show の出力が1行ずつ読めます。
ip route show の1行を読む
プレーンテキスト
default via 192.168.1.1 dev eth0
172.20.0.0/16 via 192.168.1.254 dev eth0
192.168.1.0/24 dev eth0 proto kernel scope link src 192.168.1.10| 要素 | 意味 |
|---|---|
default | 0.0.0.0/0 のこと。他のどの経路にも当てはまらないパケットの行き先 |
via <アドレス> | 次に渡す相手 (ネクストホップ) のアドレス |
dev <名前> | どのインターフェースから出すか |
proto kernel | カーネルが自動で作った経路。scope link は同じリンク上の範囲 |
metric <数値> | 同じ宛先に複数経路があるときの優先度。小さいほうが優先 |
3行目のように via が無い経路は直接接続の経路です。インターフェースにアドレスを付けると自動で作られ、同じセグメントの相手にはルーターを介さず直接届けられます。
via はネクストホップ、dev はインターフェース
ターミナル
ip route add default via 192.168.1.1 # デフォルトゲートウェイ
ip route add 172.20.0.0/16 via 192.168.1.254 # 静的経路。ルーター経由
ip route add 10.10.0.0/16 dev eth0 # 直接接続として扱う
ip route del 172.20.0.0/16 # 経路を消す
ip route get 172.20.5.1 # この宛先にどの経路が使われるかデフォルト経路は default とも 0.0.0.0/0 とも書け、どちらも正しい書き方です。ip route get は宛先アドレスを渡すと、実際に選ばれる経路と送信元アドレスを教えてくれます。テーブルを目で追う必要がないので、実務で強い道具です。
ip route add で追加した経路も、アドレスと同じく再起動で消えます。恒久化は /etc/network/interfaces の gateway 行や、NetworkManager の設定、systemd-networkd の Gateway= で行います。
旧 route コマンドとの対応
route -n が ip route show、route add default gw <IP> が ip route add default via <IP>、route add -net <網> netmask <マスク> gw <IP> が ip route add <網>/<長さ> via <IP> に対応します。route del default はそのまま ip route del default です。
route -n の -n は名前解決をせず数値のまま表示するオプションで、DNS が引けない環境で route が固まるのを避けるために付けます。出力には Flags 列があり、U は経路が有効、G はゲートウェイ経由、H はホスト単位の経路です。デフォルトゲートウェイの行は UG になります。
IP フォワーディングは既定で無効
Linux が受け取ったパケットを別のインターフェースへ転送する機能です。ルーターや NAT ゲートウェイを作るときに有効化します。現在の値は 0 が無効、1 が有効です。
ターミナル
cat /proc/sys/net/ipv4/ip_forward
sysctl net.ipv4.ip_forward
sysctl -w net.ipv4.ip_forward=1一時的に有効化するには sysctl -w を使うか、/proc/sys/net/ipv4/ip_forward へ 1 を書き込みます。どちらも同じ場所を触っています。再起動しても残すには /etc/sysctl.conf か /etc/sysctl.d/ 配下に net.ipv4.ip_forward = 1 の行を書き、sysctl -p で読み込みます。IPv6 では net.ipv6.conf.all.forwarding が対応します。
/proc/sys/ 配下のパス区切りのスラッシュをドットに置き換えたものが sysctl のパラメータ名です。この対応を覚えておくと両方の書き方に迷いません。
試験で狙われるところ
デフォルト経路は default とも 0.0.0.0/0 とも書けます。via はネクストホップのアドレス、dev はインターフェース名で役割が違います。metric は小さいほうが優先です。ip route で足した経路は再起動で消えます。そして直接接続の経路には via が付きません。