Arch Linux - ネットワーク接続

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

ネットワーク接続を確立するためには、以下の手順が必要です。

  • 無線 LAN の場合、アクセスポイントに接続する。
  • 各 IP アドレスを取得、または指定して、設定する。
    IPv4/IPv6 ともに、DHCP を使うと、各 IP アドレスを自動で取得できます。
    IPv6 の場合は、DHCP を使わずに取得することもできます (DNS サーバの IP アドレスは除く)。

これらを手動でやるのは大変なので、通常は、ネットワーク接続を全体的に管理するサービスを使います。
接続方法の例
Linux でネットワーク接続をするには、複数の方法があります。
以下は、一例です。

[有線/無線]
systemd-networkd + (iwd or wpa_supplicant)
netctl + (wpa_supplicant)

[有線 LAN]
dhcpcd

[無線 LAN]
iwd

最終的には GUI でのネットワークマネージャを使うこともできますが、Arch Linux のインストール時は、常にコマンドを使って接続しなければなりません。

しかし、ネットワーク接続を頻繁に切り替えるようなことでもない限り、一度設定すれば、それ以降の手間がかかることはないので、コマンドによる接続でも特に問題はありません。
パッケージ
Arch Linux の基本パッケージには、ip コマンドなどの基本的なもの以外は含まれていないので、ネットワーク接続関連のパッケージは、別途インストールする必要があります。

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

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

$ 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* となります。

$ ip address で、IP アドレスを確認することもできます。

networkctl
それ以外にも、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 起動中でのみ動作するだけです。
PC 起動時に、サービスを自動的に実行させたい場合は、enable を行う必要があります。
/etc/resolv.conf
# ドメイン名前解決

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

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

ネットで外部のサーバーに接続する際は、接続先の IP アドレスが必要になります。
しかし、IP アドレスで接続先を指定するのは不便なので、通常は、www.google.com などどいったわかりやすいドメイン名を、IP アドレスの代わりに使用します。

DNS サーバーに接続して、あらかじめ登録されているドメイン名を送ると、それに対応した IP アドレスを取得することができるので、実際に外部のサーバーに接続する際は、その変換した IP アドレスを使うことになります。
/etc/resolv.conf
Linux では、DNS サーバーの設定 (IP アドレスなど) は、/etc/resolv.conf で定義します。

DNS サーバーの IP アドレスは、ルータやプロバイダなどによって異なるので、適切なものを設定する必要があります。

DNS サーバーは DHCP を使って自動取得できるので、使用する接続方法によっては、/etc/resolv.conf が自動で生成される場合があります。
それ以外では、適切な設定を行ったり、手動で /etc/resolv.conf を編集しなければならない場合があるので、各接続方法における動作を確認してください。

手動で設定
/etc/resolv.conf が自動で生成されない場合は、手動で設定する必要があります。

nameserver の後に、IP アドレスを記述します。
IPv4/IPv6 の両方を記述したい場合は、1行内に空白で区切ります。
複数行記述した場合、先頭から順に接続されます。

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

# Google Public DNS
nameserver 8.8.8.8

保存した後はすぐに有効になるので、設定した後にブラウザなどが正しく表示されていれば、問題ありません。
resolvconf コマンド
resolvconf コマンドを使うと、DHCP などを使って、自動で DNS サーバーの IP アドレスを取得し、/etc/resolv.conf を生成することができます。
(すでにネットワークに接続されている必要があります)

[パッケージ] openresolv

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

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

netctl で接続した場合は、このコマンドで、毎回ファイルが生成されます。
systemd-resolved
systemd-resolved は、DNS を管理するサービスです。systemd パッケージに含まれています。
systemd-networkd でネット接続する場合は、基本的に一緒に使います。

systemd-resolved は、/etc/resolv.conf 自体は自動で生成しませんが、resolv.conf に相当するファイルを、別の場所に生成します。
これらのいずれかを /etc/resolv.conf からリンクさせることで、DNS サーバーを設定することができます。

設定方法
/run/systemd/resolve/stub-resolv.conf には、systemd-resolved が実装している、ローカル DNS サーバのアドレスが記述されています。
/run/systemd/resolve/resolv.conf には、自動取得された DNS サーバのアドレスが記述されています。

stub-resolv.conf を使うことで、systemd-resolved の設定がすべて適用されるので、こちらが推奨されています。

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

  • /run/systemd/resolve/ 内のファイルは、systemd-resolved が実行されている間に作成されます。
    実行されていない場合は、ファイルが存在しない状態となります。
  • systemd-resolved を使わなくなった場合は、/etc/resolv.conf のリンクファイルを削除してから、ファイルを再作成してください。
  • Arch Linux インストール中、arch-chroot を実行した後に、リンクファイルの作成を行わないでください。
    arch-chroot 後では、インストール先の /etc/resolv.conf に正しく作成することができません。
(有線 LAN) dhcpcd
# dhcpcd - ArchWiki

[パッケージ] dhcpcd

有線 LAN 1つしか使わない& IP アドレスを自動で取得したい場合は、DHCP クライアントである dhcpcd を使うのが一番簡単です。

  • IPv4/IPv6 両対応で、デフォルトで両方とも有効です。
  • デフォルトで /etc/resolv.conf を自動生成します。

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

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

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

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

[パッケージ] iwd

無線 LAN だけを使う場合、iwd 単体で接続することもできますが、IP アドレスなどを細かく設定したい場合は、systemd-networkd と一緒に使った方が良いでしょう。

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

iwd サービスを起動した後に、iwctl コマンドでアクセスポイントに接続する必要があります。
※ iwctl コマンドは、netdev or wheel グループに入っている一般ユーザーなら、root 権限でなくても実行できます。
設定
/etc/iwd/main.conf ファイルで、iwd の設定を行えます。
(/etc/iwd/ は作成されていないので、mkdir コマンドで先に作成してください)

[General]
# 内蔵ネットワーク設定 (default:false)
#EnableNetworkConfiguration=true

[Network]
# IPv6 (default:true)
#EnableIPv6=false
# DNS 管理 [systemd,resolvconf,none] (default:systemd)
#NameResolvingService=systemd

iwd 単体でネットワーク接続を行う場合は、内蔵ネットワーク設定を有効にします。
(systemd-networkd と一緒に使う場合は、無効にします)
内蔵ネットワーク設定が有効の場合、DHCP を使って、自動で IP アドレスが取得されます (デフォルトで IPv6 有効)。

内蔵ネットワーク設定が有効の場合、DNS は、systemd-resolved を使うか、resolvconf コマンドを使うか、手動で設定するかを指定できます。
接続手順
## 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 内のファイルから接続されます。

不要になった設定は、手動でファイルを削除するか、以下のコマンドで削除してください。

## 設定を削除
$ iwctl known-networks <network> forget

ネットワーク設定ファイルの編集
/var/lib/iwd 内のネットワーク設定ファイルを編集することで、各ネットワークの設定を変更することができます。

[Security]
# 暗号化キーの生の文字列
Passphrase=...
...

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

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

systemd-networkd は、ネットワーク全般の接続管理を行います。systemd パッケージに含まれています。

無線 LAN 接続する場合は、iwd または wpa_supplicant パッケージが必要で、アクセスポイントへの接続は、それぞれの方法で別途行う必要があります。

systemd-networkd では、各ネットワークの設定ファイルを作成する必要があります。
設定ファイル (*.network)
各ネットワークの設定ファイルは、/etc/systemd/network/ ディレクトリ内に作成します。
ファイル名は、任意の名前で、拡張子に .network を付ける必要があります。

複数のファイルがある場合は、ファイル名の順に先頭から読み込まれるので、ファイルの名前で接続順を調節してください。

有線/無線ともに共通で、基本的に以下のように記述すれば、接続はできます。
以下の場合は、IPv4/IPv6 の両方が有効になり、DHCP を使って IP アドレスが取得されます。

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

[Network]
DHCP=yes

無線 LAN
無線 LAN の場合は、以下のように項目を追加すると良いでしょう。

[Match]
Name=wlan0

[Network]
DHCP=yes
# IPアドレスをプライバシー拡張機能で取得
IPv6PrivacyExtensions=true
# 3秒以内に接続が回復すれば、構成を維持する
IgnoreCarrierLoss=3s

Name= で指定するインターフェイス名は、$ networkctl で確認してください。
iwd を使う場合は、wlan0 といった名前になります。
起動
設定ファイルが用意できたら、systemd-networkd を起動します。
起動中に設定ファイルを変更した場合は、# systemctl restart systemd-networkd で再起動できます。

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

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

ただし、無線 LAN の場合は、これだけでは接続できないので、iwd または wpa_supplicant の各方法で別途接続を行う必要があります。
また、systemd-networkd 自体は /etc/resolv.conf を処理しないので、DNS サーバーの設定に関しては別途考える必要があります。
DNS
systemd-networkd 自体は、/etc/resolv.conf を処理しません。
DNS の管理は、基本的に systemd-resolved を使って行います。

# systemctl start systemd-resolved
# systemctl enable systemd-resolved
# ln -sf /run/systemd/resolve/stub-resolv.conf /etc/resolv.conf
無線 LAN (iwd)
systemd-networkd + iwd で無線 LAN 接続する場合は、iwd の内蔵ネットワーク設定を無効にする必要があります(デフォルト)。
有効になっている場合は、/etc/iwd/main.conf で無効にしてください。

iwd サービスを起動した後、iwctl コマンドで、アクセスポイントへの接続を行います。

# systemctl start iwd
# systemctl enable iwd
# iwctl station wlan0 connect <network>
無線 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 のサービスを起動します。
@ の後に、インターフェイス名を指定してください。

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

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

wpa_supplicant@.service のファイルの中身では、以下のようにして wpa_supplicant が起動されているので (%I がインスタ―フェイス名)、設定ファイルの名前は、wpa_supplicant-<interface>.conf にする必要があります。

ExecStart=/usr/bin/wpa_supplicant -c/etc/wpa_supplicant/wpa_supplicant-%I.conf -i%I
(有線/無線) netctl
# netctl - ArchWiki

[パッケージ] netctl, openresolv, dhcpcd, wpa_supplicant

netctl は、Arch Linux 独自のパッケージで、主にシェルスクリプトで構成されています。

事前に各プロファイルのファイルを用意してから、接続します。
既存のコマンドを使って、出来るだけ自動で設定できるように作られているため、あまり複雑なことを考える必要がありません。

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

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

※ 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> にコピーします。

また、無線 LAN の場合は、暗号化キーを直接記述するため、root 以外のユーザーが中身を読み込めないように、パーミッションを変更したほうが良いです。

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

テキストの編集
サンプルの内容を元に、テキストを編集します (以下は、無線 LAN の場合)。

# nano /etc/netctl/wireless

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 コマンドを使いますが、実際は中で systemctl コマンドが使われています。

## サービスを開始
# netctl start <profile>

## PC 起動時に有効にする
# netctl enable <profile>

<profile> には、プロファイルのファイル名を、ディレクトリパスなしで指定してください。

※プロファイルの中身を変更した場合は、systemd のユニットファイルを変更する必要があるので、reenable を行ってください。