ひゃまだのblog

ひゃまだ(id:hymd3a)の趣味のブログ

DebianのNetworkManagerで、固定IPのイーサネットが繋がらなくなる対策

(2022-07-12 初稿)

はじめに

2022年6月上旬から、ずっと悩んでいた現象の対策がわかったのでメモを残す。

その現象とは、DebianでNetworkManagerを用いてイーサネットで接続していると、起動直後はWeb接続できるが、数分後にWeb接続できなくなる現象だ。

なお、Web接続できなくなるだけで、他のPCへのpingsshは正常に動作する。

筆者の環境

Linux hoge 5.10.0-16-amd64 #1 SMP Debian 5.10.127-1 (2022-06-30) x86_64 GNU/Linux
LXDE環境で NetworkManagerを用いてイーサネットでネット接続

最初はWebに接続できて、その後接続できなくなる現象

起動直後またはネットワーク設定変更直後は、Web接続可能だが、2〜3分後にWeb接続できなくなる。ただし、同じネットワーク内の他のPCなどにSSH接続などは可能。

起動直後のNetworkManagerの「接続情報」

起動直後は、Web接続が可能で、以下の画像のとおりゲートウェイ(デフォルトルート)が設定されている。

なお、確認方法は、NetworkManagerのアイコンを右クリックすると「接続情報」を見ることができる。

赤丸で示したとおり、ゲートウェイIPアドレスが記載されている。

NetworkManagerの「接続情報」

起動後、Web接続できなくなるNetworkManagerの「接続情報」

起動後、数分するとWeb接続できなくなる。その時の「接続情報」は以下のとおり。

ゲートウェイ(デフォルトルート)が、0.0.0.0に設定されている。

Web接続できなくなったNetworkManagerの「接続情報」

原因を探る

不可解な現象なので、以下のとおり/var/log/syslogを確認してみた。

syslogの確認

/var/log/syslogを追うと以下のような記述を発見。

$ sudo less /var/log/syslog
Jul 12 09:43:26 mou connmand[394]: enp2s0f1 {add} route 0.0.0.0 gw 0.0.0.0 scope 253 <LINK>

connmandにより、ゲートウェイが0.0.0.0に設定されているよう…

(筆者の考えている原因)

同じネットワークの中に、DHCPサーバがある場合に、正常にゲートウェイ等の情報が取得できればWeb接続が可能であるが、DHCPサーバがない場合や不完全なネットワーク情報しか取得できない場合に、デフォルトゲートウェイが「0.0.0.0」に設定されてしまうのではないかと推察(あくまでも筆者の推測である)。

対策

connmanctlで対策

connmandというデーモンでネットワークを変更されているようなので、connmanctlで設定をし直せばつながるようになる。

ちなみに、connmanctlについては初めて知ったので、以下のサイトを参考にさせて頂いた(多謝)。

例として、以下の設定を行う。

IP address:   192.168.22.200
Netmask:      255.255.255.0
Gateway:      192.168.22.1
DNS server:   192.168.1.1

まずは、現在の接続サービスの確認。

$ connmanctl services
*AO Wired                ethernet_80fa5x3fxx1x_cable   #Macアドレスは変更してある

続いて、ethernetにネットワークを設定

(nameserverを設定し直さない場合)
$ sudo connmanctl config ethernet_80fa5x3fxx1x_cable --ipv4 manual 192.168.22.200 255.255.255.0 192.168.22.1

(nameserverを設定し直す場合)
$ sudo connmanctl config ethernet_80fa5x3fxx1x_cable --ipv4 manual 192.168.22.200 255.255.255.0 192.168.22.1 --nameservers 192.168.200.36

上記のいずれかのコマンドで、ネットワークの再起動等しなくてもWeb接続が可能となる。

bashスクリプト

コマンドが少し長くて覚えきれそうにないので、以下のとおりBashスクリプトにした。

ちなみに、connmanctlで一度設定すると、再起動後も正常に動作するので、一度だけ実行すれば良いので、スクリプトにする意味は少ない。(^^ゞ

$ cat set_network
#!/bin/bash
# Written by H.Yamada
# start ver0.01 2022-07-12

# ip route
#default via 192.168.22.1 dev enp2s0f1 
#192.168.22.0/24 dev enp2s0f1 proto kernel scope link src 192.168.22.200 
#192.168.22.1 dev enp2s0f1 scope link 
#192.168.200.36 via 192.168.22.1 dev enp2s0f1  # rslt=$(/usr/bin/connmanctl services) set ${rslt} srvc=${3}                         # service rslt=$(/usr/bin/ip route | grep 'default via') set ${rslt} gway=${3}                        # gateway rslt=$(/usr/bin/ip route | grep 'link src') set ${rslt} ip=${9}                              # IP address sudo /usr/bin/connmanctl config ${srvc} --ipv4 manual ${ip} 255.255.255.0 ${gway}

おわりに

Debian 11(Bullseye)のネットワーク接続は、NetworkManagerまたはsystemdで行われていると思っていたので、connmanctlで簡単に設定できるとは思いもよらなかった。

上記の思い込みがあり、NetworkManagerのアイコンで'有線接続 1'を切断して再接続したり、以下のコマンドを実行したりしてきたが、ときどきしか設定がうまくいかなかった。

(うまく行かないコマンドの例)
sudo nmcli con modify '有線接続 1' ipv4.gateway 192.168.22.1
sudo nmcli con down '有線接続 1'
sudo nmcli con up '有線接続 1'
sudo systemctl restart NetworkManager

今回、connmanctlを初めて知り、また、とても設定が簡単なのでDebianのマニュアルなどでももっと宣伝して欲しいと思った。

なお、ここでは記述しないが、Wi-Fiの接続も制御できるので、NetworkManagerよりも万能な気がしている。

関連ページ