🐥

systemd-networkd で有線と無線をいい感じにする

に公開

Linux のネットワーク管理には NetworkManager が使われることも多いと思いますが、systemd-networkd を利用してみます。ワイヤレス認証には iwd を使います。

有線と無線のどちらも使えるようにして、両方接続されているときは有線側で通信するようにしていきます。ネットワークは家庭で使う一般的な WiFiルータから dhcp でIPアドレスやゲートウェイ、DNSの情報を取得する環境です。

ネットワーク設定の管理に systemd-networkd.service、名前解決に systemd-resolved.service 、ワイヤレス認証に iwd.service が必要なので有効にして起動しておきます。

ネットワークインターフェイスの確認

networkctl コマンドでインターフェイス名を確認します。

$ networkctl 
IDX LINK      TYPE     OPERATIONAL SETUP      
  1 lo        loopback carrier     unmanaged
  2 enp0s31f6 ether    no-carrier  configuring
  4 wlan0     wlan     routable    configured 

3 links listed.

今回使用している Thinkpad T480 では有線が enp0s31f6、無線が wlan0 となります。

ワイヤレス認証

iwctl コマンドを使ってWiFiの認証を行います。

# iwctl station wlan0 connect <SSID>

実行すると <SSID> のパスワードを聞かれるので入力してWiFiへ接続します。

設定ファイル

systemd-networkd は /etc/systemd/network 内の .netwok ファイルの設定に従って接続するので有線と無線それぞれのファイルを用意します。

/etc/systemd/network/20-wired.network
[Match]
Name=enp0s31f6

[Network]
DHCP=yes

[DHCPv4]
RouteMetric=100

[IPv6AcceptRA]
RouteMetric=100
/etc/systemd/network/25-wireless.network
[Match]
Name=wlan0

[Network]
DHCP=yes
IgnoreCarrierLoss=3s

[DHCPv4]
RouteMetric=600

[IPv6AcceptRA]
RouteMetric=600

RouteMetric の値で優先順位が決まり小さいほうが優先されるので、有線を 100 にして無線を 600 にしています。

networkctl コマンドで SETUPconfiguringconfigured になっていれば設定ファイルが読み込まれていますし、OPERATIONALroutable であれば通信できる状態です。

確認

有線、無線ともに接続した状態を見てみます。

 networkctl 
IDX LINK      TYPE     OPERATIONAL SETUP     
  1 lo        loopback carrier     unmanaged
  2 enp0s31f6 ether    routable    configured
  4 wlan0     wlan     routable    configured

3 links listed.

経路確認

$  ip route 
default via 192.168.0.1 dev enp0s31f6 proto dhcp src 192.168.0.154 metric 100 
default via 192.168.0.1 dev wlan0 proto dhcp src 192.168.0.156 metric 600 
...

enp0s31f6wlan0 があって metric も設定通りになっています。

参考
https://wiki.archlinux.jp/index.php/-networkd?rdfrom=https%3A%2F%2Fwiki.archlinux.org%2Findex.php%3Ftitle%3DSystemd-networkd_(%25E6%2597%25A5%25E6%259C%25AC%25E8%25AA%259E)%26redirect%3Dno
https://wiki.archlinux.jp/index.php/Iwd

Discussion