LANが不安定

提供: とある社畜の頭脳整理
2019年9月5日 (木) 12:59時点におけるRin-scrooge (トーク | 投稿記録)による版 (→‎参考サイト)
ナビゲーションに移動 検索に移動

ずっと、ネットワークの不安定に悩まされてきましたが、ひとまず解決を見たような気がするので、ここにまとめておきます。
と言っても…NetworkManagerをやめただけなのですが…。
(詳しい人に聞いたら、「それ一番最初に落とすサービスです!」って言われた…(^_^;))

あまりにも、不安定だったので標準のnic(オンボードのr8152)に戻して設定しています。
(そういう意味で、USB-LANアダプタは未検証です。r8152ではスピードが出ないので後日、検証予定です。)
また、基本サーバー用途なので固定IP前提で話を進めていきます。

netctl編

netctlの準備

nic名の確認

以下のコマンドで、nic名を確認します。

ip a

こんなふうに出力されるかと思います。
(まだNetworkManagerで設定されている前提になっています。ネットワークサービスを起動していない場合はIPが振られていないかと思います。)

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: enp0s20u4: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 00:e0:4c:36:be:7f brd ff:ff:ff:ff:ff:ff
    inet 192.168.56.11/24 brd 192.168.11.255 scope global enp0s20u4
       valid_lft forever preferred_lft forever
    inet6 xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx/64 scope global dynamic mngtmpaddr 
       valid_lft 86391sec preferred_lft 14391sec
    inet6 fe80::2e0:4cff:fe36:be7f/64 scope link 
       valid_lft forever preferred_lft forever
3: wlan0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
    link/ether 18:bb:26:a9:a1:0e brd ff:ff:ff:ff:ff:ff

「enp0s20u4」がnic名になります。
これを元にnetctlの設定をしていきます。

netctlの設定

まずは、設定ファイルのサンプルが準備されているので、それをコピーします。

cp /etc/netctl/examples/ethernet-static /etc/netctl/enp0s20u4

(私の場合、nic名をnetctlのプロファイル名にも使用しています)


コピーしたら以下のコマンドで、設定を編集していきます。

netctl edit enp0s20u4

修正箇所は以下のとおりです。


【修正前】

 1 Description='A basic static ethernet connection'
 2 Interface=eth0
 3 Connection=ethernet
 4 IP=static
 5 Address=('192.168.1.23/24' '192.168.1.87/24')
 6 #Routes=('192.168.0.0/24 via 192.168.1.2')
 7 Gateway='192.168.1.1'
 8 DNS=('192.168.1.1')
 9 
10 ## For IPv6 autoconfiguration
11 #IP6=stateless
12 
13 ## For IPv6 static address configuration
14 #IP6=static
15 #Address6=('1234:5678:9abc:def::1/64' '1234:3456::123/96')
16 #Routes6=('abcd::1234')
17 #Gateway6='1234:0:123::abcd'


【修正後】

 1 Description='A basic static ethernet connection'
 2 Interface=enp0s20u4
 3 Connection=ethernet
 4 IP=static
 5 Address=('192.168.56.11/24')
 6 #Routes=('192.168.0.0/24 via 192.168.1.2')
 7 Gateway='192.168.56.1'
 8 DNS=('192.168.56.1')
 9 
10 ## For IPv6 autoconfiguration
11 IP6=stateless
12 
13 ## For IPv6 static address configuration
14 #IP6=static
15 #Address6=('1234:5678:9abc:def::1/64' '1234:3456::123/96')
16 #Routes6=('abcd::1234')
17 #Gateway6='1234:0:123::abcd'

「Interface」はnic名と同じにします。
「Address」は指定したい固定IPアドレスです。「/24」はサブネットマスクに合わせてください。
「Gateway」と「DNS」は自宅の環境によって変わるかと思いますが、基本ルーターのIPアドレスになります。
「IP6」はIPv6を使用していなければ、コメントアウトする必要はありません。

netctlの起動

以下のコマンドでNetworkManagerを終了&無効化し、netctlを起動&有効化します。

systemctl stop NetworkManager
systemctl disable NetworkManager
netctl start enp0s20u4
netctl enable enp0s20u4

遭遇したトラブル

再起動時にnicが検出できていない

シャットダウン&電源切断で起動すると大丈夫なのに、再起動するとnicが検出されない現象に悩まされました。
以下のコマンドでログを確認してみました。

journalctl -p err..alert


すると以下のメッセージが…

Duplicate Address Detection is taking too long on interface 'enp0s20u4'


調べてみると以下のサイトが見つかりました。
Duplicate Address Detection fails / Networking, Server, and Protection / Arch Linux Forums

どうやら「Duplicate Address Detection(DAD)」はIPv6の機能で、アドレス重複をチェックしているのだそうで…
そいつがタイムアウトしているとのこと…
対策としてはDADのタイムアウトの時間を伸ばせば良いみたいです。


ということで、設定ファイルを再度編集します。


【修正前】

 1 Description='A basic static ethernet connection'
 2 Interface=enp0s20u4
 3 Connection=ethernet
 4 IP=static
 5 Address=('192.168.56.11/24')
 6 #Routes=('192.168.0.0/24 via 192.168.1.2')
 7 Gateway='192.168.56.1'
 8 DNS=('192.168.56.1')
 9 
10 ## For IPv6 autoconfiguration
11 IP6=stateless
12 
13 ## For IPv6 static address configuration
14 #IP6=static
15 #Address6=('1234:5678:9abc:def::1/64' '1234:3456::123/96')
16 #Routes6=('abcd::1234')
17 #Gateway6='1234:0:123::abcd'


【修正後】

 1 Description='A basic static ethernet connection'
 2 Interface=enp0s20u4
 3 Connection=ethernet
 4 IP=static
 5 Address=('192.168.56.11/24')
 6 #Routes=('192.168.0.0/24 via 192.168.1.2')
 7 Gateway='192.168.56.1'
 8 DNS=('192.168.56.1')
 9 
10 ## For IPv6 autoconfiguration
11 IP6=stateless
12 TimeoutDAD=60
13 
14 ## For IPv6 static address configuration
15 #IP6=static
16 #Address6=('1234:5678:9abc:def::1/64' '1234:3456::123/96')
17 #Routes6=('abcd::1234')
18 #Gateway6='1234:0:123::abcd'

編集したら以下のコマンドで設定を読み込み直します。

netctl reenable enp0s20u4

読み込み直したら、netctlの再起動もしくはサーバーの再起動をしてください。

systemd-networkd編

もっとシンプルに…systemd-networkdを使用しても安定します。

systemd-networkdの準備

nic名の確認

以下のコマンドで、nic名を確認します。

ip a

こんなふうに出力されるかと思います。
(まだNetworkManagerで設定されている前提になっています。ネットワークサービスを起動していない場合はIPが振られていないかと思います。)

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: enp0s20u4: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 00:e0:4c:36:be:7f brd ff:ff:ff:ff:ff:ff
    inet 192.168.56.11/24 brd 192.168.11.255 scope global enp0s20u4
       valid_lft forever preferred_lft forever
    inet6 xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx/64 scope global dynamic mngtmpaddr 
       valid_lft 86391sec preferred_lft 14391sec
    inet6 fe80::2e0:4cff:fe36:be7f/64 scope link 
       valid_lft forever preferred_lft forever
3: wlan0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
    link/ether 18:bb:26:a9:a1:0e brd ff:ff:ff:ff:ff:ff

「enp0s20u4」がnic名になります。
これを元にsystemd-networkdの設定をしていきます。

systemd-networkdの設定

設定ファイルを作成していきます。今回はnic名をファイル名に使用していきます。
以下のコマンドで「/etc/systemd/network」ディレクトリに新規ファイルを作成します。

nano /etc/systemd/network/enp0s20u4.network

ファイルの内容は以下のとおりです。(固定IP前提になっています…)

[Match]
Name=enp0s20u4

[Network]
Address=192.168.11.105/24
Gateway=192.168.11.1

次に「resolv.conf」にDNSを設定します。
以下のコマンドでresolv.confを開きます。

nano /etc/resolv.conf

ファイルの内容は以下の通りにします。

nameserver 8.8.8.8
nameserver 8.8.4.4

※ひとまずGoogleを指定していますが、プロバイダ指定のDNSでも、ルーターでもかまいません。

systemd-networkdの起動

以下のコマンドでsystemd-networkdを起動します。

systemctl start systemd-networkd
systemctl enable systemd-networkd

参考サイト

netctl - ArchWiki
systemd-networkd - ArchWiki
Duplicate Address Detection fails / Networking, Server, and Protection / Arch Linux Forums