Arch Linux - ネットワーク接続

ネットワーク接続
# ネットワーク設定 - ArchWiki
# ワイヤレス設定 - ArchWiki

Arch Linux でネットワーク接続をするには、複数の方法があります。
CUI におけるネットワーク接続の方法を、いくつか紹介します。

主に、メインの接続ツールを使って手動で接続するか、複数の接続を管理するネットワークマネージャを使って、ある程度自動で接続するかの2択になります。

それぞれ、必要になるパッケージが異なるので、接続で必要になるものは自分で選択して、別途インストールしてください。

※ネットワーク関連のサービスは、複数を同時に実行すると、衝突する場合があるので、注意してください。
無線 LAN
無線 LAN の場合は、別途ファームウェアが必要になります。
Intel の内蔵無線 LAN チップなど、一般的なものは linux-firmware に含まれていますが、新しい製品などでは、メーカーから Linux 用のドライバをダウンロードする必要があります。

詳しくは、無線 LAN 接続 の方をご覧ください。
接続に関する事項
まずは、共通で必要になる知識などを解説します。
ネットワークのインターフェイス名の確認
それぞれの有線 LAN や無線 LAN ごとに、インターフェイス名が自動で付けられています。
ネット接続する際には、この名前が必要になるので、確認したい場合は、以下のコマンドを使ってください。

$ ip link

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: enp0s31f6: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
    link/ether ...
3: wlp2s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DORMANT group default qlen 1000
    link/ether ...

enp* は有線 LAN、wlp* は無線 LAN です。
※ iwd で接続している場合、無線 LAN は wlan* となります。

また、systemd に含まれる networkctl コマンドを使うこともできます。
systemd-networkd でネット接続する際に、接続状況を確認するためのものですが、systemd-networkd が動いていなくても実行できます。

$ networkctl

WARNING: systemd-networkd is not running, output will be incomplete.

IDX LINK      TYPE     OPERATIONAL SETUP    
  1 lo        loopback n/a         unmanaged
  2 enp0s31f6 ether    n/a         unmanaged
  3 wlp2s0    wlan     n/a         unmanaged

3 links listed.
systemctl の使い方
各サービスは systemd で管理するので、systemctl コマンドを使って、実際に動作させたり、有効(PC 起動時に自動で実行させる)にしたりする必要があります。

## 動作を開始する
# systemctl start <name...>

## サービスを起動時に有効にする
# systemctl enable <name...>

stop現在実行されているものを停止する
restart再開始させる。
設定ファイルを変更して、その状態を有効にしたい時など。
disablePC 起動時に無効にする
reenable再有効する。
設定ファイルの変更などにより、systemd のユニットファイルの内容が変わる時。
status現在の状態を表示する。
システムログの数行も表示されるので、問題があった場合などは確認してみてください。

start で実際に動作が開始されますが、現在の起動中のみ動作するだけで、PC 起動時には自動的に実行されないので、永続的に実行したい場合は、enable も行う必要があります。
/etc/resolv.conf
# ドメイン名前解決

/etc/resolv.conf は、DNS サーバーの IP アドレスを定義するためのファイルです。
ネットの使用時において重要な項目となるため、先に説明します。

このファイルが正しく設定されていないと、正常にネットに接続できません。
ネットワーク自体には接続できているのに、ブラウザでページが表示できない場合などは、/etc/resolv.conf ファイルが存在するか、また、中身が正しく設定されているか確認してください。
DNS サーバーについて
DNS サーバーは、ドメイン名から IP アドレスを取得するためのものです。

ネットでどこかに接続する場合は、接続先のサーバーの IP アドレスが必要になります。
しかし、IP アドレスで接続先を記載すると、何のサーバーかわかりにくいので、通常は、www.google.com などどいった、わかりやすいドメイン名を IP アドレスの代わりに使用します。

ドメイン名に対する IP アドレスはあらかじめ登録されているので、接続する際は、DNS サーバーを使って、ドメイン名を IP アドレスに変換してから、対象のサーバーに接続する形になります。
resolv.conf
Linux では、DNS サーバーの IP アドレスは、/etc/resolv.conf に定義する必要があります。

DNS サーバーの IP アドレスは接続環境によって異なりますし、公開されている DNS サーバーを使用したい場合もあるので、自身で選択して、適切に設定しなければなりません。

ただし、ネットワークマネージャや、dhcpcd、netctl など、自動で /etc/resolv.conf を上書きするものもあります。
ネットワーク設定によって自動で設定されるのか、それとも、手動で設定しなければならないのか、それらも確認した上で、設定してください。
手動で設定
/etc/resolv.conf が、ネットワーク設定によって自動で処理されない場合は、手動で設定する必要があります。

ルータを介して接続している場合や、公開されている DNS サーバーを使う場合などは、手動で IP アドレスを設定できます。
(ルータの DNS サーバーの IP アドレスは製品によって異なるので、製品情報などを確認してください)

/etc/resolv.conf を編集して、nameserver の後に、IP アドレスを記述します(以下は IPv4 の場合)。
複数行記述すると、先頭から順に試されます。

# ルータ (製品による)
nameserver 192.168.0.1

# Google Public DNS
nameserver 8.8.8.8

保存した後はすぐに有効になるので、設定した後にブラウザなどが正しく表示されていれば、問題ありません。
ネットワーク関連のサービスによって自動生成
ネットワークマネージャ、dhcpcd、netctl などを使ってネットワークに接続している場合、自動で /etc/resolv.conf が上書きされる場合があります。

基本的には、その方が面倒がなくてよいのですが、逆に、手動で resolv.conf を設定したい場合は、resolv.conf が上書きされないように、それぞれの設定を行う必要があります。
resolvconf
DHCP などによって、自動で DNS サーバーの IP アドレスを取得したい場合は、resolvconf コマンドを使うと、自動で resolv.conf を生成することができます。
(すでにネットワークに接続されている必要があります)

[パッケージ] openresolv

## インストール
# pacman -S openresolv

## /etc/resolv.conf を生成
# resolvconf -u

IP アドレスが固定のものであれば、一度生成するだけで構いませんが、ネットワーク設定関連のサービスから実行される場合は、接続時に毎回生成されます。
systemd-resolved
systemd-resolved は、systemd パッケージに含まれており、ローカル DNS によるドメイン名解決などを提供します。
systemd-networkd で接続する場合は一緒に使うことが多いですが、単体で使うことも出来ます。

この DNS を使う場合は、/etc/resolv.conf を、/run/systemd/resolve/resolv.conf へのシンボリックリンクとして作成します。

# systemctl start systemd-resolved
# systemctl enable systemd-resolved
# ln -sf /run/systemd/resolve/resolv.conf /etc/resolv.conf

※ /run/systemd/resolve/resolv.conf のファイルは、systemd-resolved が実行されている間作成されるので、実行されていない時は、ファイルが存在しない状態となります。

※ systemd-resolved を使わなくなった場合は、/etc/resolv.conf を削除してから、ファイルを再作成してください。

Arch Linux インストール中の注意点
※ Arch Linux のインストール中、arch-chroot を実行している段階で設定する場合は、一度 chroot を抜けてから、リンクファイルを /mnt/etc/resolv.conf として指定して、作成する必要があります。

# exit
# ln -sf /run/systemd/resolve/resolv.conf /mnt/etc/resolv.conf
# arch-chroot /mnt

arch-chroot のスクリプト内では、/etc/resolv.conf が特殊に処理されているので、/etc/resolv.conf = インストール作業の Linux 上にある /etc/resolv.conf となってしまいます。

そのため、リンクファイルを作成する時は、インストール先の Arch Linux を起動した後にする方がいいかもしれません。
(有線 LAN) dhcpcd
# dhcpcd - ArchWiki

[パッケージ] dhcpcd

有線 LAN 1つだけしか使わず、また、IP アドレスを自動で取得したい場合は、DHCP クライアントである dhcpcd を使うのが一番簡単です。
※ dhcpcd は、デフォルトで /etc/resolv.conf を自動生成します。

インターフェイス名を確認の上、以下のコマンドを実行してください。
波線の部分は、自分の有線 LAN のインターフェイス名に置き換えてください。

## インストール
# pacman -S dhcpcd

## 動作を開始
# systemctl start dhcpcd@enp0s31f6
                         ~~~~~~~~~

## PC 起動時に有効にする
# systemctl enable dhcpcd@enp0s31f6
                          ~~~~~~~~~
(無線 LAN) iwd
# iwd - ArchWiki

[パッケージ] iwd

無線 LAN だけを使う場合、iwd 単体で接続できます。
また、iwd は、systemd-networkd などの他のネットワークマネージャと一緒に使う場合もあります。

## インストール
# pacman -S iwd

iwd サービスを起動した後に、iwctl コマンドで操作して接続します。
※ iwctl コマンドは、root ユーザー以外にも、netdev or wheel グループに入っている一般ユーザーでも使用できます。

※ Arch Linux のインストール時に、インストール先のネットワーク設定を行う時は、インストール先の Linux を起動した後に接続処理をする方が良いです。
その場合、あらかじめ iwd パッケージだけは前もってインストールしておいてください。
設定ファイル
まずは、/etc/iwd/main.conf ファイルで、iwd の設定を行います。

# mkdir /etc/iwd
# nano /etc/iwd/main.conf

[General]
## 内蔵ネットワーク設定有効
EnableNetworkConfiguration=true

[Network]
## DNS (resolvconf)
#NameResolvingService=resolvconf
## IPv6 有効
#EnableIPv6=true

iwd 単体でネットワークに接続する場合は、iwd 内蔵のネットワーク設定を有効にします。
(デフォルトでは無効です。systemd-networkd と一緒に使う場合などは、無効にします)
(iwd 単体接続で、固定 IP アドレスを指定する場合も、有効にする必要があります)

有効にした場合は、DHCP クライアントも内蔵されているので、別途 dhcpcd などの DHCP クライアントはインストールしなくてもよいです。

他の設定は、必要に応じて、行頭の # を消して、有効にしてください。

DNS
内蔵ネットワーク設定を使う場合は、DNS の管理方法を選択できます。
NameResolvingService= で、systemd または resolvconf を指定できます。デフォルトは systemd です。

systemd (systemd-resolved) の場合は、別途 systemd-resolved を起動して、設定する必要があります。

resolvconf の場合は、iwd サービスの起動時に、resolvconf (openresolv パッケージ) を使って、/etc/resolv.conf を上書きします。
(2022年2月現在、2回目以降は、/etc/resolv.conf が読み込み専用ファイルであるとして、上書きできない状態になっています。システムログにそれらのエラーが出た場合は、手動でファイルを編集してください)
接続手順
## iwd サービスを起動
# systemctl start iwd

## PC 起動時に有効にする
# systemctl enable iwd

## 無線 LAN デバイスのリストを表示 (通常は wlan0)
$ iwctl device list

## ルータを検索 (* が電波の強さ)
$ iwctl station wlan0 get-networks
                ~~~~~

## ルータに接続 (<network> は、SSID ネットワーク名)
$ iwctl station wlan0 connect <network>
                ~~~~~         ~~~~~~~~~
Passphrase: (暗号キーを入力)

## 接続状態の表示
$ iwctl station wlan0 show

※ iwd の場合、ネットワークの名前は、wlan* となります。

接続に成功した場合は、/var/lib/iwd ディレクトリに、「<network>.<type>」のファイル名で、ネットワークの設定ファイルが生成されます。
<type> は暗号化のタイプを表しており、通常は psk です。

/var/lib/iwd 内のファイルは、root ユーザーのみ読み書きできる状態なので、一般ユーザーでは、$ ls でファイルリストの表示ができません。
ファイルリストを表示する時は、root ユーザーで操作してください。

一度接続されたネットワークの設定は保存され、次回の起動時は、自動で /var/lib/iwd 内のファイルから接続されます。
ネットワーク設定ファイル
/var/lib/iwd 内に、各ネットワークの設定ファイル (<network>.<type>) があります。
このファイルを編集することで、各ネットワークの設定を変更することができます。

[Security]
# 暗号化キーの生の文字列
Passphrase=...
# 事前共有鍵。最初の接続時に設定される
PreSharedKey=...

[Settings]
# 起動時の自動接続を無効に
#Autoconnect=false

## 固定 IP アドレスを設定する場合 (例)
#[IPv4]
#Address=192.168.0.10
#Gateway=192.168.0.1
#DNS=192.168.0.1
(有線/無線) netctl
# netctl - ArchWiki

パッケージ: netctl, openresolv, dhcpcd, wpa_supplicant

netctl は、Arch Linux 独自の CUI ネットワークマネージャです。
事前にプロファイルのファイルを用意してから、接続します。
Arch Linux 用に作られている分、あまり細かいことを考えずに接続できます。

## インストール
# pacman -S netctl openresolv dhcpcd wpa_supplicant

  • /etc/resolv.conf の設定用に、openresolv を追加。
  • DHCP で IP アドレスを自動で取得する場合は、dhcpcd を追加。
  • 無線 LAN 接続する場合は、wpa_supplicant を追加。

※ netctl は、resolvconf コマンドを使って、接続時に毎回 /etc/resolv.conf を上書きします。
プロファイルの用意
netctl では、各ネットワークを「プロファイル」として、設定ファイルを用意する必要があります。

プロファイルは、/etc/netctl/ ディレクトリ内に、適当なファイル名で作成します(拡張子はなし)。
サンプルのファイルが /etc/netctl/examples/ 内にあるので、基本的には、このファイルのうち1つをコピーして、編集してます。

ethernet-dhcp有線LAN : DHCP
ethernet-static有線LAN : 固定 IP アドレス
wireless-wpa無線 LAN (WPA 暗号化) : DHCP
wireless-wpa-static無線 LAN (WPA 暗号化) : 固定 IP アドレス

例えば、無線 LAN で、DHCP によって IP アドレスを自動取得するなら、
/etc/netctl/examples/wireless-wpa を /etc/netctl/<filename> にコピーします。

また、セキュリティ的には、root のみ読み書きできるようにした方がよいので、
所有者のみ読み書きできるよう、# chmod 600 <filename> とします。

# cp /etc/netctl/examples/wireless-wpa /etc/netctl/mynetwork
# chmod 600 /etc/netctl/mynetwork

後は、サンプルの内容を元に、テキストを編集します。

# nano /etc/netctl/mynetwork

Description='A simple WPA encrypted wireless connection'
Interface=wlp2s0
Connection=wireless
Security=wpa
IP=dhcp

ESSID='ネットワークの名前 (SSID)'
Key='暗号化キー'

Interface の値は、$ ip link などで確認した、インターフェイス名に書き換えます。無線 LAN なら、wlp〜 です。
ESSID にはルータのネットワークの名前を、Key には暗号化キーの文字列を記述します。

有線 LAN の場合も、Interface の値を書き換えてください。
起動
プロファイルが用意できたら、netctl のサービスを起動/有効にします。
netctl の場合は、systemctl コマンドを使わずに、netctl コマンドでサービスを処理します。

## サービスを開始 (プロファイルのファイル名を指定)
# netctl start mynetwork
               ~~~~~~~~~~

## PC 起動時に有効にする
# netctl enable mynetwork
                ~~~~~~~~~

プロファイルの内容を変更した場合は、# netctl reenable <profile> としてください。
起動中のプロファイルを再接続したい場合は、# netctl restart <profile> です。
(有線/無線) systemd-networkd
# systemd-networkd - ArchWiki

systemd-networkd は、systemd パッケージに含まれています。
有線 LAN だけなら、追加で必要なパッケージはありません。
無線 LAN の場合は、iwd または wpa_supplicant パッケージが必要で、無線 LAN の接続は別途行う必要があります。

/etc/systemd/network/ ディレクトリ内に、各ネットワークごとの設定ファイル (*.network) を用意すると、起動時に接続されます。
複数のファイルがある場合は、ファイル名順に読み込まれるので、ファイルの名前で接続順を調節してください。
設定ファイル (*.network)
有線/無線ともに共通で、以下のように記述します。

インターフェイス名は、$ networkctl で確認してください。
ただし、無線 LAN で iwd を使う場合は、wlan0 といった名前を使うことになります。

[Match]
Name=<インターフェイス名>

[Network]
## DHCP による IP アドレス取得
DHCP=ipv4
## 固定 IP アドレス
#Address=192.168.0.10/24
#Gateway=192.168.0.1
#DNS=192.168.0.1

固定 IP アドレスにする場合、DNS= の項目があると、systemd-resolved が必要になります。
固定 IP で DNS も固定にしたい場合は、DNS= の項目は記述せずに、/etc/resolv.conf の方で設定してください。

ファイルが用意できたら、systemd-networkd を起動します。
起動中に設定ファイルを変更した場合は、# systemctl restart systemd-networkd で再起動できます。

## サービスの起動
# systemctl start systemd-networkd

## PC 起動時に有効にする
# systemctl enable systemd-networkd

ただし、無線 LAN の場合は、別途接続する必要があります。
また、/etc/resolv.conf に関しても、別途考える必要があります。
DNS
systemd-networkd 自体は、/etc/resolv.conf を処理しませんので、デフォルトでは DNS サーバーを手動で設定することになります。

自動で設定したいのであれば、systemd-resolved と一緒に使うことが多いと思います。
上記の /etc/resolv.conf の項目を参考にしてください。
無線 LAN (iwd)
systemd-networkd + iwd で無線 LAN 接続する場合は、iwd の内蔵ネットワーク設定を無効にする必要があります(デフォルト)。
有効になっている場合は、/etc/iwd/main.conf で無効にしてください。

あとは、iwd 単体で接続するのと同じ手順で、iwd サービスを起動した後、iwctl コマンドで接続を行います。
(# systemctl enable iwd も行ってください)

無線 LAN に接続された状態で $ networkctl を実行すると、ネットワークの名前が、wlp* ではなく、wlan0 などとなっているので、*.network の設定ファイルでは、Name=wlan0 というように、ネットワーク名を記述します。

あとは、systemd-networkd を起動して、$ networkctl の結果が、wlan* で routable / configured になっていれば、成功です。
無線 LAN (wpa_supplicant)
systemd-networkd + wpa_supplicant で無線 LAN 接続する場合は、以下の手順で行ってください。
wpa_supplicant パッケージをインストールしてください。

設定ファイルを作成
まずは、wpa_supplicant の接続設定のファイルを作成する必要があります。
ルータのネットワークの名前と暗号化キーを指定して、出力された network={...} の情報を、ファイルに保存してください。
<interface> は、wlp〜 などのインスターフェイス名です。

## root にログインしている状態の場合

# wpa_passphrase <SSID> <key> > /etc/wpa_supplicant/wpa_supplicant-<interface>.conf
                 ~~~~~~ ~~~~~                                      ~~~~~~~~~~~

## 一般ユーザーの場合
## (上記に sudo しただけでは書き込めないため)

$ wpa_passphrase <SSID> <key> | sudo tee /etc/wpa_supplicant/wpa_supplicant-<interface>.conf
                 ~~~~~~ ~~~~~                                               ~~~~~~~~~~~

暗号化キーが直接記述されているため、root 以外からは見られないようにします。

# chmod 600 /etc/wpa_supplicant/wpa_supplicant-<interface>.conf
                                               ~~~~~~~~~~~

このファイル内には、他にも各項目を設定できますが、そのままでも動作はします。
項目の詳細は、/usr/share/doc/wpa_supplicant/wpa_supplicant.conf を見てください。

起動する
wpa_supplicant パッケージには、systemd のサービスファイルも含まれているので、これを使います。
@ の後に、インターフェイス名を指定してください。

## 起動時に有効にする
# systemctl enable wpa_supplicant@<interface>
                                  ~~~~~~~~~~~

## 実際に動作させる
# systemctl start wpa_supplicant@<interface>
                                 ~~~~~~~~~~~

wpa_supplicant@.service のファイルでは、以下のようにして wpa_supplicant が起動されているので、設定ファイルの名前は、wpa_supplicant-<interface>.conf にする必要があります。

ExecStart=/usr/bin/wpa_supplicant -c/etc/wpa_supplicant/wpa_supplicant-%I.conf -i%I