メインコンテンツへスキップ
  1. Linux 関連記事一覧/
  2. Ubuntu 26.04 LTS Server/

Ubuntu 26.04 LTS Server のスタティックルート設定(Netplan)

目次

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-linkvia がサブネット外にあるとき 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 routeproto static として並びます。

経路の確認コマンド
ip route
ip route get 10.130.1.1
宛先別の経路 実行例
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 
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 でも確認できます。複数のファイルをまとめた結果が出るので、どのファイルに書いたかを忘れても全体を把握できます。

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 が小さいほうが使われます。もう一方は予備として経路表に残ります。

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: 200
metric 100 側が選ばれる 実行例
kazulog@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 を入れ替えると選択が移ります。

192.168.100.2 側を優先に変える
        - 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: 50
metric 50 側が選ばれる 実行例
kazulog@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 はエラーを出さないのに経路が入りません

on-link なしの場合 実行例
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.1

Netplan は systemd-networkd の設定を生成するところまでは行っており、経路を落としているのはカーネルです。次ホップへの到達方法が分からないため受け付けません。

on-link: true を足すと、その via が同じリンク上にいるとカーネルに伝わり、経路が入ります。

on-link ありの場合 実行例
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=true

ip route の行末に onlink が付きます。ルータのアドレスだけが別セグメントにある構成や、インタフェースに /32 を振っている構成で使います。

IPv6 のスタティックルート

書き方は IPv4 と同じで、tovia に IPv6 アドレスを書くだけです。同じ routes: の中に IPv4 と混ぜて並べられます。

IPv6 の経路
        - to: 2001:db8:130:1::/64
          via: 2001:db8:100::1
        - to: 2001:db8:130:2::/64
          via: 2001:db8:100::2
IPv6 の経路 実行例
kazulog@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 medium

IPv6 の経路には 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 apply

table: 100 を付けた経路は main には入らず、番号 100 のテーブルに入ります。routing-policyfrom に一致した通信だけがそこを引きます。/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.110
ポリシールーティング 実行例
kazulog@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 で送信元アドレスを指定して確認します。

送信元を変えた ping 実行例
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 ms

ip route add は一時的

ip route add で足した経路はカーネルの経路表に直接入るだけで、Netplan は知りません。netplan apply や再起動で消えます。

ip route add 実行例
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 apply
元に戻した状態 実行例
kazulog@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
初期状態(経路なし)showconflog
宛先別の経路を足すshowconflog
同じ宛先に2経路(metric 100 / 200)showconflog
metric を入れ替えるshowconflog
on-link なし(経路が入らない)show
on-link ありshowconflog
IPv6 の経路showconflog
ポリシールーティングshowconflog
ip route add と netplan applyshowconflog
元に戻す(最終状態)showconflog

次ホップになった R1 / R2 の記録です。検証Configはこの ..._run.txt です。

ルータshow出力syslogrunning-config
R1showlogrun
R2showlogrun

参考リンク

Netplan reference - routes

関連記事

Ubuntu 公式ページ