Ubuntu 20.04 デスクトップ版でスタティックルートを追加する方法
前書き
我が家で 24 時間稼働させている Ubuntu のデスクトップ版がありますが、デフォルトゲートウェイ以外にスタティックルートを追加する必要が出てきたのでそのやり方をメモしておきます。
GUI 操作を行わないため、この Ubuntu がデスクトップ版である必要はないのですが、サーバー版をインストールし直すのが面倒くさいので使い続けています。
デフォルトゲートウェイは我が家のヤマハルーターに向けられていますが、今回は特定の IP アドレス宛に関しては FreeBSD にルーティングさせたい、という背景事情があります。
まずは現状確認する
IP アドレス
Ubuntu に設定されている IP アドレスとデバイス名を確認します。
$ ip address show dev enp0s25 2: enp0s25: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000 link/ether 04:20:9a:41:1f:35 brd ff:ff:ff:ff:ff:ff inet 172.16.1.2/24 brd 172.16.1.255 scope global noprefixroute enp0s25 valid_lft forever preferred_lft forever inet6 fe80::620:9aff:fe41:1f35/64 scope link valid_lft forever preferred_lft forever $
172.16.1.2 が enp0s25というデバイス に設定されています。
ルーティングテーブル
ip route コマンドで確認できます。
$ ip route default via 172.16.1.1 dev enp0s25 proto static metric 100 169.254.0.0/16 dev enp0s25 scope link metric 1000 172.16.1.0/24 dev enp0s25 proto kernel scope link src 172.16.1.2 metric 100 $
NetworkManager 管理デバイス
NetworkManager で管理されているデバイスを確認します。NetworkManager を管理・設定するためのコマンドである nmcli コマンドを使います。
$ nmcli device DEVICE TYPE STATE CONNECTION enp0s25 ethernet 接続済み wired1 enxbc5c4ce12dd4 ethernet 接続済み netplan-enxbc5c4ce12dd4 wlp3s0 wifi 利用不可 -- lo loopback 管理無し -- $
ここでポイントとなってくるのは 172.16.1.2 が設定されているデバイス enp0s25 の接続名 (CONNECTION と表示されている箇所) が wired1 として定義されているところです。
NetworkManager で管理されている情報
NetworkManager で設定・管理されている情報を確認します。ipv4 と指定していることから推測できるように IPv4 に関するパラメーターが表示されます。
※ ここから接続名が必要となってきます。
$ nmcli -f ipv4 connection show wired1 ipv4.method: manual ipv4.dns: 1.1.1.1,8.8.8.8 ipv4.dns-search: -- ipv4.dns-options: -- ipv4.dns-priority: 0 ipv4.addresses: 172.16.1.2/24 ipv4.gateway: 172.16.1.1 ipv4.routes: -- ipv4.route-metric: -1 ipv4.route-table: 0 (unspec) ipv4.routing-rules: -- ipv4.ignore-auto-routes: いいえ ipv4.ignore-auto-dns: いいえ ipv4.dhcp-client-id: -- ipv4.dhcp-iaid: -- ipv4.dhcp-timeout: 0 (default) ipv4.dhcp-send-hostname: はい ipv4.dhcp-hostname: -- ipv4.dhcp-fqdn: -- ipv4.dhcp-hostname-flags: 0x0 (none) ipv4.never-default: いいえ ipv4.may-fail: はい ipv4.dad-timeout: -1 (default) $
本投稿で触れるスタティックルートに関する部分だけに絞って表示させたい場合は ipv4.routes と指定して実行します。
$ nmcli -f ipv4.routes connection show wired1 ipv4.routes: -- $
空っぽ。つまり、まだスタティックルートの定義がされていないことがわかります。
スタティックルートを設定する
スタティックルートを設定するために必要な情報は以下の 2 つです。
- 宛先 IP アドレス
- ネクストホップ
ネクストホップとは転送先のルーターのことです。隣のルーターとでも覚えておけば良いでしょう。
例として、10.2.0.0/24 宛の通信 (パケット) を 172.16.1.1 のルーターに転送 = ルーティングさせたい場合は以下のように設定します。
$ sudo nmcli connection modify wired1 +ipv4.routes "10.2.0.0/24 172.16.1.1" $
接続名 wired1 に対してスタティックルートを追加するイメージになります。
設定した内容を確認します。
$ nmcli -f ipv4.routes connection show wired1 ipv4.routes: { ip = 10.2.0.0/24, nh = 172.16.1.1 } $
スタティックルートが設定されました。ip = 10.2.0.0/24 宛は nh = 172.16.1.1 に転送する、と定義されています。nh はネクストホップの略です。
以下のコマンドは実行する必要があるのかないのか不確かなのですが、設定を反映させるために必要という情報がありました。(本当に必要なのかどうか、再起動が不要なのかどうか、このあたりをちゃんと調べきれていない)
$ sudo nmcli connection reload $
スタティックルートを削除する場合は以下のように実行します。
$ sudo nmcli connection modify wired1 -ipv4.routes "10.2.0.0/24 172.16.1.1"
-ipv4.routes というようにマイナスをつけて削除します。
設定ファイルを確認する
ここまででスタティックルートの設定ができたが、設定した内容はどこのファイルに保存されたのか?
これについても調べてみたので軽く書いておきます。
$ cd /etc/NetworkManager/ $ ls -tlr 合計 24 -rw-r--r-- 1 root root 98 3月 26 2018 NetworkManager.conf drwxr-xr-x 2 root root 4096 11月 3 2018 dnsmasq.d drwxr-xr-x 2 root root 4096 11月 3 2018 dnsmasq-shared.d drwxr-xr-x 2 root root 4096 4月 10 2022 conf.d drwxr-xr-x 5 root root 4096 4月 10 2022 dispatcher.d drwxr-xr-x 2 root root 4096 1月 2 16:10 system-connections $ cd system-connections/ $ ls -tlr 合計 12 -rw------- 1 root root 353 5月 14 2019 Higashinakano -rw------- 1 root root 342 8月 3 2019 aterm-902f23-a -rw------- 1 root root 395 1月 2 16:10 '有線接続 1' $
ファイルのタイムスタンプを足がかりにして調べていくと、/etc/NetworkManager/system-connections ディレクトリにある ‘有線接続1’ というファイルが見つかりました。これに記録されていました。
$ sudo cat '有線接続 1' [connection] id=wired1 uuid=83493657-dc45-3586-b91e-6ea694c9ce0c type=ethernet autoconnect-priority=-999 permissions= timestamp=1672643214 [ethernet] mac-address=04:20:9A:41:1F:35 mac-address-blacklist= [ipv4] address1=172.16.1.2/24,172.16.1.1 dns=1.1.1.1;8.8.8.8; dns-search= method=manual route1=10.2.0.0/24,172.16.1.1 [ipv6] addr-gen-mode=stable-privacy dns-search= method=ignore [proxy] $
上記青字の箇所にスタティックルートの定義が書かれています。
‘有線接続1’ じゃなくて wired1 というファイル名になっているところが少し気になるところですが、なにかの都合でここでは和訳されて ‘有線接続1’ というファイル名になったのだと思われます。