Netplan で経路を足す
Ubuntu 26.04 LTS Server で「この宛先だけ別のルータへ送りたい」というとき、経路は Netplan の routes: に書きます。ip route add でも足せますが、そちらは再起動すると消えます。
デフォルトルートだけの設定はネットワーク設定(Netplan)にまとめています。ここでは宛先別の経路、metric による選択、on-link、IPv6、ポリシールーティングを扱います。
routes の書き方
routes: はインタフェースの下に置き、経路を1つずつリストで並べます。
| キー | 意味 |
|---|---|
to | 宛先。プレフィックス表記(10.130.1.0/24)か default |
via | 次の転送先。そのインタフェースのサブネット内のアドレス |
metric | 同じ宛先に複数の経路があるときの優先度。小さいほうが選ばれる |
on-link | via がサブネット外にあるとき true にする |
table | 経路を入れるルーティングテーブルの番号。省略すると main |
設定ファイルは /etc/netplan/ に新しく1枚作ります。 cloud-init が置いた 50-cloud-init.yaml は書き換えません。ファイル名の数字が大きいほうが後に読まれます。
パーミッションは 600 にします。 認証情報を書く場合があるため、root 以外から読めないようにするのが Netplan の作法です。
sudo tee /etc/netplan/70-static-routes.yaml <<'EOF'
network:
version: 2
ethernets:
ens3:
routes:
- to: 10.130.1.0/24
via: 192.168.100.1
- to: 10.130.2.0/24
via: 192.168.100.2
EOF
sudo chmod 600 /etc/netplan/70-static-routes.yaml
sudo netplan apply反映されると ip route に proto static として並びます。
ip route
ip route get 10.130.1.1kazulog@sv1:~$ ip route
default via 10.19.0.1 dev ens2 proto static
10.19.0.0/16 dev ens2 proto kernel scope link src 10.19.12.11
10.130.1.0/24 via 192.168.100.1 dev ens3 proto static
10.130.2.0/24 via 192.168.100.2 dev ens3 proto static
192.168.100.0/24 dev ens3 proto kernel scope link src 192.168.100.10
kazulog@sv1:~$ ip route get 10.130.1.1
10.130.1.1 via 192.168.100.1 dev ens3 src 192.168.100.10 uid 1000
cache
kazulog@sv1:~$ ip route get 10.130.2.1
10.130.2.1 via 192.168.100.2 dev ens3 src 192.168.100.10 uid 1000
cache ip route get は、カーネルが実際にどの経路を選ぶかを答えます。経路が何本もあって ip route の一覧から読み取りにくいときは、こちらのほうが確実です。
書いた内容は netplan get でも確認できます。複数のファイルをまとめた結果が出るので、どのファイルに書いたかを忘れても全体を把握できます。
kazulog@sv1:~$ sudo netplan get ethernets.ens3.routes
- to: "10.130.1.0/24"
via: "192.168.100.1"
- to: "10.130.2.0/24"
via: "192.168.100.2"
- metric: 100
to: "10.130.9.0/24"
via: "192.168.100.1"
- metric: 200
to: "10.130.9.0/24"
via: "192.168.100.2"同じ宛先に複数の経路を置く(metric)
同じ宛先へ2本の経路を書くと、metric が小さいほうが使われます。もう一方は予備として経路表に残ります。
- to: 10.130.9.0/24
via: 192.168.100.1
metric: 100
- to: 10.130.9.0/24
via: 192.168.100.2
metric: 200kazulog@sv1:~$ ip route show 10.130.9.0/24
10.130.9.0/24 via 192.168.100.1 dev ens3 proto static metric 100
10.130.9.0/24 via 192.168.100.2 dev ens3 proto static metric 200
kazulog@sv1:~$ ip route get 10.130.9.1
10.130.9.1 via 192.168.100.1 dev ens3 src 192.168.100.10 uid 1000
cache metric を入れ替えると選択が移ります。
- to: 10.130.9.0/24
via: 192.168.100.1
metric: 100
- to: 10.130.9.0/24
via: 192.168.100.2
metric: 50kazulog@sv1:~$ ip route show 10.130.9.0/24
10.130.9.0/24 via 192.168.100.2 dev ens3 proto static metric 50
10.130.9.0/24 via 192.168.100.1 dev ens3 proto static metric 100
kazulog@sv1:~$ ip route get 10.130.9.2
10.130.9.2 via 192.168.100.2 dev ens3 src 192.168.100.10 uid 1000
cache to: default を別のインタフェースに書くと、metric によっては管理用の既定経路より優先され、リモートから接続できなくなります。via がサブネット外にあるとき(on-link)
via に指定するアドレスは、通常そのインタフェースのサブネット内になければなりません。サブネット外のアドレスを書くと、netplan apply はエラーを出さないのに経路が入りません。
kazulog@sv1:~$ sudo cat /etc/netplan/71-onlink.yaml
network:
version: 2
ethernets:
ens3:
routes:
- to: 10.140.0.0/16
via: 192.168.200.1
kazulog@sv1:~$ sudo netplan apply
kazulog@sv1:~$ ip route show 10.140.0.0/16
kazulog@sv1:~$ sudo grep -A3 -B1 "10.140.0.0/16" /run/systemd/network/10-netplan-ens3.network
[Route]
Destination=10.140.0.0/16
Gateway=192.168.200.1Netplan は systemd-networkd の設定を生成するところまでは行っており、経路を落としているのはカーネルです。次ホップへの到達方法が分からないため受け付けません。
on-link: true を足すと、その via が同じリンク上にいるとカーネルに伝わり、経路が入ります。
kazulog@sv1:~$ sudo cat /etc/netplan/71-onlink.yaml
network:
version: 2
ethernets:
ens3:
routes:
- to: 10.140.0.0/16
via: 192.168.200.1
on-link: true
kazulog@sv1:~$ ip route show 10.140.0.0/16
10.140.0.0/16 via 192.168.200.1 dev ens3 proto static onlink
kazulog@sv1:~$ sudo grep -A4 -B1 "10.140.0.0/16" /run/systemd/network/10-netplan-ens3.network
[Route]
Destination=10.140.0.0/16
Gateway=192.168.200.1
GatewayOnLink=trueip route の行末に onlink が付きます。ルータのアドレスだけが別セグメントにある構成や、インタフェースに /32 を振っている構成で使います。
IPv6 のスタティックルート
書き方は IPv4 と同じで、to と via に IPv6 アドレスを書くだけです。同じ routes: の中に IPv4 と混ぜて並べられます。
- to: 2001:db8:130:1::/64
via: 2001:db8:100::1
- to: 2001:db8:130:2::/64
via: 2001:db8:100::2kazulog@sv1:~$ ip -6 route
2001:db8:100::/64 dev ens3 proto kernel metric 256 pref medium
2001:db8:130:1::/64 via 2001:db8:100::1 dev ens3 proto static metric 1024 pref medium
2001:db8:130:2::/64 via 2001:db8:100::2 dev ens3 proto static metric 1024 pref medium
fe80::/64 dev ens2 proto kernel metric 256 pref medium
fe80::/64 dev ens3 proto kernel metric 256 pref medium
kazulog@sv1:~$ ip -6 route get 2001:db8:130:1::1
2001:db8:130:1::1 from :: via 2001:db8:100::1 dev ens3 proto static src 2001:db8:100::10 metric 1024 pref mediumIPv6 の経路には metric を書かなくても既定で 1024 が付きます。IPv4 の既定(0)とは違うので、metric で優先度を付けるときは実際の値を ip -6 route で確認してください。
送信元アドレスで経路を変える(ポリシールーティング)
宛先ではなく「送信元アドレス」で経路を選び分けたいときは、経路を別テーブルに入れて routing-policy でそのテーブルを引かせます。
sudo tee /etc/netplan/72-policy.yaml <<'EOF'
network:
version: 2
ethernets:
ens3:
addresses:
- 192.168.100.110/24
routes:
- to: default
via: 192.168.100.1
metric: 50
table: 100
- to: default
via: 192.168.100.2
metric: 100
table: 100
routing-policy:
- from: 192.168.100.110
table: 100
EOF
sudo chmod 600 /etc/netplan/72-policy.yaml
sudo netplan applytable: 100 を付けた経路は main には入らず、番号 100 のテーブルに入ります。routing-policy の from に一致した通信だけがそこを引きます。/etc/iproute2/rt_tables へテーブル名を登録する必要はありません。
ip rule
ip route show table 100
ip route get 10.130.9.1
ip route get 10.130.9.1 from 192.168.100.110kazulog@sv1:~$ ip rule
0: from all lookup local
32765: from 192.168.100.110 lookup 100 proto static
32766: from all lookup main
32767: from all lookup default
kazulog@sv1:~$ ip route show table 100
default via 192.168.100.1 dev ens3 proto static metric 50
default via 192.168.100.2 dev ens3 proto static metric 100
kazulog@sv1:~$ ip route get 10.130.9.1
10.130.9.1 via 192.168.100.2 dev ens3 src 192.168.100.10 uid 1000
cache
kazulog@sv1:~$ ip route get 10.130.9.1 from 192.168.100.110
10.130.9.1 from 192.168.100.110 via 192.168.100.1 dev ens3 table 100 uid 1000
cache 同じ宛先でも、送信元が 192.168.100.110 のときだけ次ホップが変わります。ip rule の番号 32765 が main(32766)より小さいので、こちらが先に引かれます。
テーブル 100 にはデフォルトルートを2本置いてあり、そこでも metric の小さいほうが選ばれています。main を触らずに「複数のデフォルトルートを metric で選ぶ」形を試せます。
実際の通信でも次ホップが変わります。-I で送信元アドレスを指定して確認します。
kazulog@sv1:~$ ping -c3 -W2 -I 192.168.100.110 10.130.9.1
PING 10.130.9.1 (10.130.9.1) from 192.168.100.110 : 56(84) bytes of data.
64 bytes from 10.130.9.1: icmp_seq=1 ttl=255 time=1.18 ms
64 bytes from 10.130.9.1: icmp_seq=2 ttl=255 time=1.66 ms
64 bytes from 10.130.9.1: icmp_seq=3 ttl=255 time=1.57 ms
--- 10.130.9.1 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2004ms
rtt min/avg/max/mdev = 1.176/1.468/1.660/0.210 msip route add は一時的
ip route add で足した経路はカーネルの経路表に直接入るだけで、Netplan は知りません。netplan apply や再起動で消えます。
kazulog@sv1:~$ sudo ip route add 10.150.0.0/16 via 192.168.100.1
kazulog@sv1:~$ ip route show 10.150.0.0/16
10.150.0.0/16 via 192.168.100.1 dev ens3
kazulog@sv1:~$ sudo netplan apply
kazulog@sv1:~$ ip route show 10.150.0.0/16切り分けの間だけ経路を足したいときには便利です。恒久的に残す経路は Netplan に書いてください。
設定を元に戻す
追加したファイルを消して netplan apply すると、経路も追加したアドレスも消えます。
sudo rm /etc/netplan/70-static-routes.yaml
sudo netplan applykazulog@sv1:~$ ls /etc/netplan/
50-cloud-init.yaml
kazulog@sv1:~$ ip -br a show ens3
ens3 UP 192.168.100.10/24 2001:db8:100::10/64 fe80::5054:ff:feb3:bb22/64
kazulog@sv1:~$ ip route
default via 10.19.0.1 dev ens2 proto static
10.19.0.0/16 dev ens2 proto kernel scope link src 10.19.12.11
192.168.100.0/24 dev ens3 proto kernel scope link src 192.168.100.10
kazulog@sv1:~$ ip rule
0: from all lookup local
32766: from all lookup main
32767: from all lookup default検証環境と実行ログ
CML 上に Ubuntu 26.04 LTS Server(sv1)と Cisco ルータ2台(R1 / R2)を同じセグメントに置いて採取しました。
sv1 (Ubuntu 26.04) R1 (IOS XE 17.03.08a) R2 (IOS XE 17.03.08a)
ens3 192.168.100.10/24 Gi2 192.168.100.1/24 Gi2 192.168.100.2/24
2001:db8:100::10/64 2001:db8:100::1/64 2001:db8:100::2/64
Lo1 10.130.1.1/24 Lo1 10.130.2.1/24
2001:db8:130:1::1/64 2001:db8:130:2::1/64
Lo9 10.130.9.1/32 Lo9 10.130.9.2/32
| | |
+---------------------------+--------- LAB-SW ---------+次ホップが2つある構成にしてあります。 10.130.9.0/24 は R1 が .1、R2 が .2 だけを持ち、残りは Null0 へ落とします。そのため metric を変えると、ip route get の表示だけでなく ping の成否が入れ替わります。
| 手順 | 実行ログ | 設定ファイル | syslog |
|---|---|---|---|
| 初期状態(経路なし) | show | conf | log |
| 宛先別の経路を足す | show | conf | log |
| 同じ宛先に2経路(metric 100 / 200) | show | conf | log |
| metric を入れ替える | show | conf | log |
| on-link なし(経路が入らない) | show | — | — |
| on-link あり | show | conf | log |
| IPv6 の経路 | show | conf | log |
| ポリシールーティング | show | conf | log |
| ip route add と netplan apply | show | conf | log |
| 元に戻す(最終状態) | show | conf | log |
次ホップになった R1 / R2 の記録です。検証Configはこの ..._run.txt です。
| ルータ | show出力 | syslog | running-config |
|---|---|---|---|
| R1 | show | log | run |
| R2 | show | log | run |
参考リンク
関連記事
- Ubuntu 26.04 LTS Server のホスト名の変更(hostnamectl)
- Ubuntu 26.04 LTS Server のパッケージ更新(apt update / upgrade)
- Ubuntu 26.04 LTS Server のタイムゾーン設定と時刻同期
- Ubuntu 26.04 LTS Server のユーザー作成と sudo 権限の設定
- Ubuntu 26.04 LTS Server の SSH サーバー設定(公開鍵認証)
- Ubuntu 26.04 LTS Server のサービス管理(systemctl)とログ確認(journalctl)
- Ubuntu 26.04 LTS Server の自動更新設定(unattended-upgrades)
- Ubuntu 26.04 LTS Server の初期設定を自動化する(cloud-init)
- Ubuntu 26.04 LTS Server のカーネルパラメータ設定(sysctl)
- Ubuntu 26.04 LTS Server のネットワーク設定(Netplan)
- Ubuntu 26.04 LTS Server の名前解決設定(systemd-resolved)
- Ubuntu 26.04 LTS Server の NTP 同期先の変更(chrony)
- Ubuntu 26.04 LTS Server のスタティックルート設定(Netplan)
- neovim 公式サイトから最新バージョンをインストールする手順 Ubuntu 26.04 LTS Server