Raspberry pi OS (2021-10-30-raspios-bullseye-armhf-lite)に、Network Managerとdhclientとを導入した環境において、nmcliを用いて静的IPv4アドレスと静的ルーティング情報を設定する。
ここでは同じネットワークインターフェイスにおいて、DHCPで取得したIPv4アドレスと、静的に設定したIPv4アドレスとを併用する。
<前提条件について>
次のページの手順で、Raspberry pi OSに、Network Managerとdhclientを導入した。
上記手順でeth0は、すでにNetwork Managerと連携したdhclientというDHCPクライアントソフトウェアによって、IPv4アドレスが割り当てられている。
このためRaspberry pi OS(2021-10-30-raspios-bullseye-armhf-lite)でデフォルトのdhcpcdは無効にしている。
dhcpcdは無効にしているため、Network Managerの管理ツールnmcliを用いて、
IPv4アドレスの手動設定、ルーティングの手動設定を行っていることに注意する。
(参考)dhcpcdを用いた設定方法について(この方法は今回の環境では使わない。)
http://akira-arets.blogspot.com/2018/04/raspbianstretch-register-routinginfo.html
ログに書き込まれる内容によって、SDカードの寿命が気になれば、
次のページに記載の方法で、「/var/log」をRAM領域に移すこともできる。
■IPv4アドレスの自動取得と静的IPv4アドレスの併用のための設定
以下では、既存の接続設定を削除する操作を含んでいる。
そのため、SSHリモート接続でなく、モニターを接続、USBキーボードによる操作を行う必要がある。
rootユーザーに切り替えて操作した。
◯既存の接続名を削除した。
・既存の接続設定の確認
root@raspberrypi:/home/pi# nmcli con show
NAME UUID TYPE DEVICEWired connection 1 ********-****-****-****-************ ethernet eth0
インターフェイスeth0に関しては、"Wired connection 1"という名称でデフォルト接続設定が既にされていることがわかった。
複数の接続設定が存在していると、DHCPによるアドレス取得失敗時に、Network Managerがそれらを切り替えて接続試行しようとするので、既存の接続設定は削除することにした。
・既存の接続設定の削除を行った。
root@raspberrypi:/home/pi# nmcli connection delete "Wired connection 1"
◯新しく接続設定を作成した。
・eth0インターフェイスに対する設定を作成した。
(接続名称はここでは"Eth0"にした。)
root@raspberrypi:/home/pi# nmcli con add type ethernet con-name "Eth0" ifname eth0
詳細については次のページを参考にしてください。
・自動的にコネクションを開始するように設定した。
root@raspberrypi:/home/pi# nmcli con mod connection.autoconnect yes
◯DHCPによるIPv4アドレス取得のための設定を行った。
root@raspberrypi:/home/pi# nmcli con mod "Eth0" ipv4.method auto
◯静的IPv4アドレスも設定した。
・静的IPv4アドレスの登録
root@raspberrypi:/home/pi# nmcli con mod "Eth0" ipv4.addresses '192.168.MMM.100/24'
(削除する場合は、-ipv4.addresses のようにマイナス記号を付ける。)
・(重要)アドレス自動取得時のDHCPのアドレス取得の試行回数は無制限にする。
root@raspberrypi:/home/pi# nmcli connection mod "Eth0" connection.autoconnect-retries 0
ここでのポイントは、DHCPクライアントによるアドレス自動取得にも対応させながら、同じLANインターフェースで静的IPv4アドレスも同時に利用しようとしていることである。
「connection.autoconnect-retries 0」を設定しない場合、DHCPによるアドレス取得ができない環境では、Network Manager始動直後は静的IPv4アドレスによる通信ができたが、数分で通信不能に陥ってしまった。
これは、DHCPによるアドレス自動取得に失敗しギブアップするとき、同じインターフェイスに設定している静的IPv4アドレスによる通信も不能にされてしまうからではないかと考えた。
そこで、この「connection.autoconnect-retries 0」という設定を行ったところ、DHCPによるアドレス自動取得に失敗する環境でも、静的IPv4アドレスではうまく通信ができるようになった。
この「connection.autoconnect-retries 0」という設定は、DHCPのアドレス取得の試行回数を無制限にする。試行をギブアップしないので、ここで設定しようとしている静的IPv4アドレスも有効になっていると考えられる。
・作成した設定情報を有効にした。
root@raspberrypi:/home/pi# nmcli con up "Eth0"
(DHCPによるアドレス取得が有効な環境の場合の結果)
Connection successfully activated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/2)
(DHCPによるアドレス取得ができない環境の場合)
Error: Connection activation failed: IP configuration could not be reserved (no available address, timeout, etc.)Hint: use 'journalctl -xe NM_CONNECTION=********-****-****-****-************ + NM_DEVICE=eth0' to get more details.
DHCPによるアドレス取得ができない環境では、このようなエラーが表示されるものの、上記の方法で静的IPアドレスを設定しているため、静的IPアドレスを用いてうまく通信できた。
・IPv4アドレスがeth0に設定されたか確認した。
DHCPによるアドレス取得が可能な環境において、DHCPクライアントが取得したIPv4アドレスなどのネットワーク情報と、手動で設定したIPv4の両方が存在していることが確認できた。
システムを再起動しても、手動設定したIPv4アドレスは有効だった。
root@raspberrypi:/home/pi# ip a
(DHCPによるアドレス取得が有効な環境の場合)
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host lovalid_lft forever preferred_lft foreverinet6 ::1/128 scope hostvalid_lft forever preferred_lft forever2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000link/ether dc:a6:32:**:**:** brd ff:ff:ff:ff:ff:ffinet 192.168.MMM.100/24 brd 192.168.MMM.255 scope global noprefixroute eth0valid_lft forever preferred_lft foreverinet 192.168.XXX.12/24 brd 192.168.XXX.255 scope global dynamic noprefixroute eth0valid_lft 259197sec preferred_lft 259197secinet6 fe80::****:****:****:****/64 scope link noprefixroutevalid_lft forever preferred_lft forever3: wlan0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast state DOWN group default qlen 1000link/ether ae:**:**:**:**:** brd ff:ff:ff:ff:ff:ff permaddr dc:a6:32:**:**:**
DHCPによるIPアドレスの取得ができない環境では、「nmcli d」の結果をみると、「connecting (getting IP configuration)」という表示になっていたが、静的IPアドレスを上記の方法で設定しているため通信可能であった。
■静的ルーティング設定
以上の設定に加えて、ルーティング情報も設定した。
静的ルーティング設定前には、次のようにルーティングテーブルが存在していた。
pi@raspberrypi:~ $ route
Kernel IP routing tableDestination Gateway Genmask Flags Metric Ref Use Ifacedefault 192.168.XXX.254 0.0.0.0 UG 100 0 0 eth0192.168.XXX.0 0.0.0.0 255.255.255.0 U 100 0 0 eth0192.168.MMM.0 0.0.0.0 255.255.255.0 U 100 0 0 eth0
◯192.168.0.0/16宛のパケットを192.168.MMM.1へルーティングする設定を行った。
次の図のように、Raspberry Piは、192.168.MMM.0/24 と192.168.XXX.0/24の2つのネットワークに属しているものとする。
192.168.XXX.0/24のIPv4アドレスなどの情報はDHCPで受け取り、192.168.MMM.0/24のIPv4などの情報は静的に設定している。
[Raspberry Pi](192.168.MMM.100)-----192.168.MMM.0/24 And 192.168.XXX.0/24-----(192.168.MMM.1)[Router]-----192.168.0.0/16-----
そして、Raspberry Piから、さらに192.168.0.0/16ネットワークへ接続するために、このRaspberry Piに次のようにルーティング情報を設定した。そのゲートウェイはRouterの192.168.MMM.1アドレスである。
・ルーティング設定の追加
次のコマンドでは永続的なルーティング情報を設定する。
root@raspberrypi:/home/pi# nmcli connection mod "Eth0" ipv4.routes "192.168.0.0/16 192.168.MMM.1"
(削除する場合は、-ipv4.routes のようにマイナス記号を付ける。)
(ip route add 192.168.0.0/16 via 192.168.127.1 dev eth0 というipコマンドでは、Network Managerにより設定が解消されてしまうようである。)
・この設定を有効にした。
(DHCPによるアドレス取得が有効な環境の場合)
root@raspberrypi:/home/pi# nmcli con up "Eth0"
Connection successfully activated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/2)
(DHCPによるアドレス取得ができない環境の場合)
root@raspberrypi:/home/pi# nmcli con up "Eth0"
Error: Connection activation failed: IP configuration could not be reserved (no available address, timeout, etc.)Hint: use 'journalctl -xe NM_CONNECTION=********-****-****-****-************ + NM_DEVICE=eth0' to get more details.
このようなエラーが表示されるものの、上記の方法で静的IPアドレスを設定しているため、
静的IPアドレスを用いてうまく通信できた。
・ルーティングテーブルを確認した。
(DHCPによるアドレス取得が有効な環境の場合)
root@raspberrypi:/home/pi# route
Kernel IP routing tableDestination Gateway Genmask Flags Metric Ref Use Ifacedefault 192.168.XXX.254 0.0.0.0 UG 100 0 0 eth0192.168.0.0 192.168.MMM.1 255.255.0.0 UG 100 0 0 eth0192.168.XXX.0 0.0.0.0 255.255.255.0 U 100 0 0 eth0192.168.MMM.0 0.0.0.0 255.255.255.0 U 100 0 0 eth0
(DHCPによるアドレス取得ができない環境の場合)
root@raspberrypi:/home/pi# route
Kernel IP routing tableDestination Gateway Genmask Flags Metric Ref Use Iface192.168.0.0 192.168.MMM.1 255.255.0.0 UG 100 0 0 eth0192.168.MMM.0 0.0.0.0 255.255.255.0 U 100 0 0 eth0
DHCPによるIPアドレスの取得ができない環境では、「nmcli d」の結果をみると、「connecting (getting IP configuration)」という表示になっていたが、
静的IPアドレスを上記の方法で設定しているため通信可能であった。
DHCPによってルーティングやDNSが取得できない場合、
次の例を参考に必要に応じてデフォルトルートやDNSも設定しておく。
◯デフォルトルートを手動設定する。
・デフォルトルートの追加
次のコマンドでは永続的なルーティング情報を設定する。
root@raspberrypi:/home/pi# nmcli connection mod "Eth0" ipv4.gateway '192.168.MMM.1'
削除する場合は、ipv4.gatewayの引数として、シングルクォート2つを置く。(「ipv4.gateway ''」)
# nmcli connection mod "Eth0" ipv4.gateway ''
・DNSサーバーのアドレスを登録する
root@raspberrypi:/home/pi# nmcli con mod eth0 ipv4.dns '192.168.XXX.1''
・この設定を有効にした。
root@raspberrypi:/home/pi# nmcli con up "Eth0"
Error: Connection activation failed: IP configuration could not be reserved (no available address, timeout, etc.)Hint: use 'journalctl -xe NM_CONNECTION=********-****-****-****-************ + NM_DEVICE=eth0' to get more details.
DHCPによるアドレス取得ができない環境では、このようなエラーが表示されるものの、上記の方法で静的IPアドレスを設定しているため、静的IPアドレスを用いてうまく通信できた。
<参考>
・GNOME DEVELOPER / General Connection Profile Settings
< https://developer-old.gnome.org/NetworkManager/stable/settings-connection.html > 2022年2月8日
・【Linux CentOS 7】nmcliだけでIPv6とIPv4ネットワークに接続するための設定を行う方法(静的IPアドレスの利用)
< http://akira-arets.blogspot.com/2018/04/linux-centos7-networksetting-nmcli.html > 2022年2月8日
・4.2. CONFIGURING STATIC ROUTES USING NMCLI
< https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/7/html/networking_guide/sec-configuring_static_routes_using_nmcli > 2022年2月8日