Arch Linux - 無線 LAN 接続

無線 LAN 接続について
# ワイヤレス設定 - ArchWiki
ドライバ
※無線 LAN で接続するには、無線 LAN のチップセットに応じたドライバが必要になります。

Windows では、基本的に、付属する CD などにドライバが入っています。
Linux 用のドライバに関しては、メーカーの HP からダウンロードするか、あらかじめ用意されているパッケージをインストールする必要があります。

Arch Linux では、一般的なドライバの多くは、linux-firmware パッケージ内に含まれています。

# linux-firmware パッケージ

この中に必要なドライバが含まれていない場合は、自分でドライバを用意して、インストールする必要があります。

基本的に、最近発売されたチップセットや、あまり一般的でないメーカーの場合は、Linux 用ドライバがなかったり、あっても正常に動作しない場合があるので、無線 LAN デバイスを購入する前に、あらかじめ Linux で使えるかどうかを確認しておく必要があります。

内蔵無線 LAN の場合は、Intel のチップセットが使われている場合が多いので、動作する可能性は高いです。

USB 接続型の場合は、製品によって対応状況はバラバラですが、基本的に少し古めのものの方が、接続できる可能性は高いです。

もしも Linux 用のドライバがない場合は、Ndiswrapper を使って、Windows 用のドライバを無理矢理 Linux ドライバとして使うことも出来ます。

ドライバがない場合や、正しく動作しない場合は、Arch Wiki の方で情報を確認してください。
ドライバがロードされていて使える状態にあるか
linux-firmware パッケージがインストールされている場合、Linux の起動時に、各デバイスに対応するドライバが存在していれば、自動でロードされるので、デバイスの一覧を表示して、無線 LAN のドライバがすでにロードされているかを確認します。

▼ 内蔵無線 LAN や PCI 接続の場合 (-k でドライバの情報表示)
※ pciutils パッケージ
$ lspci -k

▼ USB 接続の無線 LAN の場合 (-v で詳細を表示)
※ usbutils パッケージ
$ lsusb -v

Wireless が無線という意味なので、デバイス名にそのような文字がある所を探します。

02:00.0 Network controller: Intel Corporation Wireless 3160 (rev 83)
    Subsystem: Intel Corporation Dual Band Wireless AC 3160
    Kernel driver in use: iwlwifi
    Kernel modules: iwlwifi

上記の場合は、Intel の内蔵無線 LAN なので、iwlwifi モジュールがロードされていることがわかります。
このような状態であれば、問題なく使えます。
(USB 接続の場合は、表示結果が異なります)

ドライバがロードされていない場合、対応しているドライバがないということなので、自分でドライバを用意する必要があります。
メーカーによって方法が異なるので、Arch Wiki の方を確認してください。
ドライバのファイルを確認
以下のコマンドで、/usr/lib/firmware にあるファームウェアのファイルのうち、どのファイルが使用されているかを確認することができます。
※ root で実行してください。

# dmesg | grep firmware

[    8.720537] iwlwifi 0000:02:00.0: loaded firmware version 17.3216344376.0 3160-17.ucode op_mode iwlmvm
[    9.203187] Bluetooth: hci0: Intel Bluetooth firmware file: intel/ibt-hw-37.7.10-fw-1.0.1.2d.d.bseq

iwlwifi と 3160-17.ucode をヒントに探すと、/usr/lib/firmware には iwlwifi-3160-17.ucode.xz のファイルがあり、その中には iwlwifi-3160-17.ucode ファイルが含まれているので、このファイルが使われていることがわかります。

また、Bluetooth 用のドライバとして、/usr/lib/firmware/intel/ibt-hw-37.7.10-fw-1.0.1.2d.d.bseq.xz が使われていることもわかります。
インターフェイス名と設定を確認
ドライバが存在していて、使える状態なら、次に、無線 LAN デバイスのインターフェイス名を確認します。
Linux によって、デバイスごとに自動で名前が付けられています。

ip コマンドで、ネットワーク関連の操作が行えます。
iw コマンドは、無線 LAN 用のコマンドなので、そちらを使うことも出来ますが、今回は ip を使います。
インターフェイス名の確認
ネットワークインターフェイスの一覧と状態を表示します。

$ 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 d0:50:99:ae:00:b8 brd ff:ff:ff:ff:ff:ff
3: wlp2s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP mode DORMANT group default qlen 1000
    link/ether 2c:6e:85:60:c2:28 brd ff:ff:ff:ff:ff:ff

結果は、環境によって異なります。

一番最初の lo は無視してください。
2番目の enp0s31f6 は、有線 LAN です。
3番目の wlp2s0 が、無線 LAN となります。

有線 LAN は先頭が enp、無線 LAN は先頭が wlp なので、先頭の名前で判断してください。
無線 LAN のインターフェイス名は、覚えておくか、メモしておきます。
インターフェイスを立ち上げる
iw コマンドなどを使う場合は、事前に無線 LAN インターフェイスを立ち上げておく必要があります。
もし、それらのコマンドが失敗した場合は、立ち上げてから試してみてください。

netctl など、ネットワーク接続関連のサービスで接続する場合、無線 LAN インターフェイスが立ち上がっている状態だと、接続できない場合があるので、その時は DOWN の状態に戻してから接続してください。

まず、$ ip link で出力した一覧の中にある、無線 LAN のステータスを確認してください。
< > 内が、現在の状態です。

3: wlp2s0: <BROADCAST,MULTICAST,UP,LOWER_UP>

ここに UP の項目がある場合(LOWER_UP は別です)、インターフェイスが立ち上がっている状態です。
UP がない場合は、以下のコマンドで立ち上げます。

# ip link set wlp2s0 up
              ~~~~~~

wlp2s0 の部分は、自分のインターフェイス名に置き換えてください。
もう一度 $ ip link を実行して、UP の項目があれば、立ち上がっています。

逆に DOWN の状態に戻す場合は、以下のようにします。

# ip link set wlp2s0 down
              ~~~~~~
無線 LAN の知識
無線 LAN 接続をする時に必要となる知識を、先に説明しておきます。
SSID/ESSID
無線 LAN アクセスポイント(ルータ)ごとの識別名です。
32 文字までの英数字で構成されます。

これは、接続するアクセスポイントを指定する時に使います。

コマンドで、近所のルータの名前を検索することもできますが、できれば、自分の家のルータの情報は、あらかじめ調べておいてください。
機器の裏などに表示してあります。
WEP/WPA/WPA2
通信を暗号化するための認証方式です。
暗号化を設定しておかないと、電波が届く範囲内であれば、誰でもそのアクセスポイントに接続できてしまうので、自宅での通常使用であれば、必ず設定しておきます。

WEP初期の規格。様々な脆弱性が発見されているため、現在ではほぼ使われていません
WPAWEP を強化したもの
WPA2WPA をさらに強化したもの (2004年)
WPA3WPA2 をさらに強化したもの (2018年)

ルータと Linux 両方で対応している、一番新しいものを使うことになります。

暗号化を使う場合は、そのアクセスポイントに接続する時に、キー (パスワード) の文字列が必要になります。
キーを知っている人間しかそのアクセスポイントに接続できないので、他の人に使われる心配はありません。

キーの文字列は、ルータの設定で変えることができます (有線/無線接続して、パソコン上のブラウザで設定する)。

最近のルータの場合は、出荷時にデフォルトのキーが設定されています。
その場合、機器の裏などにキーが書いてあるので、最初の接続時などは、そのキーを使います。
TKIP/AES
TKIP、AES は暗号化の方法です。
ルータの設定では、この2つを選択できる場合があります。

TKIP よりも AES の方が強固なので、通常は AES を選択してください。
接続について
インターフェイスの準備が整って、接続に必要な情報も用意したら、実際に接続していきます。
Linux で無線 LAN 接続するための方法は、いくつかあります。

GUI 環境で、GUI のツールを使って接続することもできますが、Arch Linux を使うのであれば、インストール時にコンソール画面でのネット接続は必須となるため、CUI での設定方法は覚えておいた方が良いでしょう。

インストール後に、ネット接続を頻繁に切り替えて使うことが多い場合は、GUI のネットワークマネージャを使うと便利です。

ただし、ネット接続がほぼ固定の場合は、わざわざネットワークマネージャを使う必要もないので、一度設定を行って、起動時に自動で接続するようにすれば、特に問題はありません。
CUI での設定方法
ネットワーク接続には、以下のようなコマンド・パッケージを使います。

ネットワーク全般ip コマンド (iproute2 パッケージ。base に含まれる)
IP アドレス関連ip コマンド (手動設定時)
dhcpcd (DHCP による、IP アドレスの自動取得)
DNSresolvconf コマンド (openresolv パッケージ。/etc/resolv.conf の生成)
無線関連iw (ユーティリティ)
wpa_supplicant (無線接続)
iwd (無線接続)
マネージャnetctl
systemd-networkd (systemd によるネットワーク設定)

# netctl - ArchWiki
# iwd - ArchWiki
# systemd-networked - ArchWiki

無線接続の場合、「iwd 単体」「netctl + wpa_supplicant」「systemd-networkd + (iwd or wpa_supplicant)」などの方法があります。

詳しくは、ネットワーク設定 の方を見てください。
iwd
iwd は、Intel によって作られた無線 LAN 接続のためのデーモンです。
wpa_supplicant を置き換えることを目的としています。

以前のインストール ISO では、無線 LAN 接続用に wifi-menu というコマンドがありましたが、現在はそれが削除され、代わりに iwd が含まれています。

Arch Linux のインストール時に無線 LAN 接続する場合は、iwd を使うことになります。

iwd 単体で接続することもできますが、systemd-networkd + iwd で接続することもできます。
使い方
iwd を使うには、まず systemd で iwd のサービスを起動する必要がありますが、Arch Linux のインストール時は、自動で起動されています。

Arch Linux インストール後に使う場合は、# systemctl start iwd で起動します。
(起動時に自動で有効にする場合は、# systemctl enable iwd)

iwd の起動後、接続などの操作をする場合は、iwctl コマンドを使います。

iwctl コマンドは、root ユーザーか、netdev or wheel グループに入っている一般ユーザーで実行できます。

iwctl コマンドでオプションを指定しない場合は、独自のプロンプトが実行され、その中でコマンドを入力していきます。
オプションを指定した場合は、単独で各処理を行います。

以下、ヘルプの内容の一部です。

Station:
  station list                                      List devices in Station mode
  station <wlan> connect <"network name"> [security]Connect to network
  station <wlan> connect-hidden <"network name">    Connect to hidden network
  station <wlan> disconnect                         Disconnect
  station <wlan> get-networks [rssi-dbms/rssi-bars] Get networks
  station <wlan> get-hidden-access-points [rssi-dbms]Get hidden APs
  station <wlan> scan                               Scan for networks
  station <wlan> show                               Show station info

WiFi Simple Configuration:
  wsc list                                          List WSC-capable devices
  wsc <wlan> push-button                            PushButton mode
  wsc <wlan> start-user-pin <8 digit PIN>           PIN mode
  wsc <wlan> start-pin                              PIN mode with generated
                            8 digit PIN
  wsc <wlan> cancel                                 Aborts WSC operations

Known Networks:
  known-networks list                               List known networks
  known-networks <"network name"> forget            Forget known network
  known-networks <"network name"> show              Show known network
  known-networks <"network name"> set-property <name> <value>Set property

Devices:
  device list                                       List devices
  device <wlan> show                                Show device info
  device <wlan> set-property <name> <value>         Set property

stationルータの操作
wscルータに付いている WPS などのボタンを使って、接続
known-networks一度接続したネットワークの情報
deviceネットワークデバイスの情報

プロンプト内で実行するなら、ヘルプの通り、"device list" などと入力して実行します。
コマンド単独で実行するなら、"# iwctl device list" というように、iwctl コマンドに引数を指定します。
基本的な接続方法
# iwctl
NetworkConfigurationEnabled: disabled
StateDirectory: /var/lib/iwd
Version: 1.24

■ デバイスのリスト

[iwd]# device list
                                    Devices
--------------------------------------------------------------------------------
  Name                Address             Powered   Adapter   Mode
--------------------------------------------------------------------------------
  wlan0               **:**:**:**:**:**   on        phy0      station

■ ルータの検索

[iwd]# station wlan0 get-networks
                               Available networks
--------------------------------------------------------------------------------
    Network name                    Security          Signal
--------------------------------------------------------------------------------
    **************                  psk               ***

■ ルータと接続

[iwd]# station wlan0 connect <network-name>
Passphrase: (暗号化キー入力)

■ プロンプト終了

[iwd]# quit

※ iwd 単体でネットワーク接続する場合は、/etc/iwd/main.conf で内蔵ネットワーク設定を有効にする必要があります。
※ /etc/resolv.conf の DNS サーバー設定も別途行う必要があります。

/etc/iwd/main.conf
[General]
## 内蔵ネットワーク設定有効
EnableNetworkConfiguration=true

[Network]
## DNS (resolvconf)
#NameResolvingService=resolvconf
netctl
netctl は、Arch Linux 独自のネットワーク接続ツールです。
有線/無線両方に対応しています。

ネットワークに関する情報をプロファイルとして作成して、接続することができます。

一度プロファイルを作って、起動時に netctl が動作するように設定しておけば、あとは起動時に自動でネットワークに接続してくれます。
必要なパッケージ
netctlnetctl 本体
dhcpcdDHCP で自動的に IP アドレスを取得する場合。
固定 IP の場合は不要。
wpa_supplicant無線 LAN 接続する場合

※ netctl のサービスを有効にする場合、dhcpcd のサービスは無効にしてください。
プロファイルについて
プロファイルのテキストファイルは手動で作成する必要があります。

/etc/netctl/ ディレクトリ内に、任意のファイル名(拡張子はなし)で作成します。
このファイル名がプロファイル名となります。

各接続タイプごとのサンプルファイルが、/etc/netctl/examples/ に存在するので、基本的にこのファイルをコピーして編集していきます。
サンプルプロファイルの一覧
まずは、サンプルの一覧を見てみます。
サンプルファイルのディレクトリに移動し、ファイル一覧を表示します。

$ cd /etc/netctl/examples
$ ls

bonding          macvlan-static  vlan-dhcp      wireless-wpa-config
bridge           mobile_ppp      vlan-static    wireless-wpa-configsection
ethernet-custom  openvswitch     wireguard      wireless-wpa-static
ethernet-dhcp    pppoe           wireless-open
ethernet-static  tunnel          wireless-wep
macvlan-dhcp     tuntap          wireless-wpa

いくつかありますが、ethernet-* は有線 LAN 用、wireless-* が無線 LAN 用です。
通常は、この中のどれかをベースとして使います。

wireless-open暗号化が設定されていない、オープンなアクセスポイント用
wireless-wep暗号化が WEP の場合
wireless-wpa暗号化が WPA/WPA2 の場合 (DHCP で IP アドレスを自動取得)
wireless-wpa-staticWPA (固定 IP アドレス)
wireless-wpa-configWPA (wpa_passphrase で生成したキー情報をファイルで指定)
wireless-wpa-configsectionWPA (wpa_passphrase で生成したキー情報を埋め込み)

暗号化の種類などによってファイルが分かれているので、必要なものを選択してください。

一般的には WPA/WPA2 を使うため、通常は wireless-wpa で問題ありません。
この場合、IP アドレスは、dhcpcd を使って自動的に取得されます。
(dhcpcd パッケージは、あらかじめインストールしておいてください)

wireless-wpa-static は、IP アドレスを手動で指定する場合に使います。
(ルータと接続する場合、IP アドレスは 192.168.0.* などの値となるので、* の部分を好きな値 (2〜) に設定できます)
プロファイルの作成
使用するサンプルのプロファイルが決まったら、/etc/netctl 上にファイルをコピーします。

$ cd /etc/netctl
# cp exsamples/wireless-wpa wireless
# chmod 600 wireless

cp コマンドで、/etc/netctl/exsamples/wireless-wpa ファイルを、/etc/netctl/wireless にコピーします。
ファイル名は一応 "wireless" にしましたが、別の名前でも構いません。

ファイル内に暗号化キーを直接記述するため、セキュリティ的に、root 以外がファイル内容を見られないようにした方が良いです。
chmod コマンドで、アクセスを制限します。

600 は、所有者(root)のみ、読み込みと書き込みを許可する値です。
(一般ユーザーでは、ファイルを開いて内容を確認することもできなくなります)
プロファイルの編集
テキストエディタで、プロファイルを編集します。

# nano wireless

テキスト内容は、以下のようになっているので、一部を自分の環境用に書き換えます。

Description='A simple WPA encrypted wireless connection'
Interface=wlan0
Connection=wireless

Security=wpa
IP=dhcp

ESSID='MyNetwork'
# Prepend hexadecimal keys with \"
# If your key starts with ", write it as '""<key>"'
# See also: the section on special quoting rules in netctl.profile(5)
Key='WirelessKey'
# Uncomment this if your ssid is hidden
#Hidden=yes
# Set a priority for automatic profile selection
#Priority=10

Description説明文。そのままでもいいです。
Interface インターフェイス名。
自分の環境の無線 LAN インターフェイス名を指定してください。

※ wlan0 では、接続できません。
$ ip link で表示された、"wlp〜" の名前を指定します。
Connection接続タイプ。wireless で無線接続。
Security暗号化のタイプ。wpa で WPA/WPA2。
IPIP アドレスの取得方法。
dhcp は、dhcp クライアントツールで自動取得。
ESSID アクセスポイントの ESSID (識別名)。
MyNetwork の部分を、自分のルータの名前に置き換えます。
Key 暗号化のキー。
WirelessKey の部分を、自分のルータの暗号化キーに置き換えます。

※ の項目については、必ず置き換えてください。
他はそのままで構いません。

キーの暗号化について
Key の項目は、パスワードをそのままテキスト内に直接記述することになるので、他人にこのファイルを見られると、パスワードを知られてしまいます。

パスワードを直接記述したくないという場合は、キーの文字列を暗号化して、設定することもできます。

wireless-wpa-config, wireless-wpa-configsection のサンプルプロファイルは、キー文字列を暗号化する場合のためのものです。このサンプルを使って設定してください。

キーの暗号化には、wpa_passphrase コマンドを使い、ESSID とキーの文字列を指定して、実行します。
実行後、結果が出力されるので、その内容をファイルに保存するか、プロファイル内に直接書き込みます。

$ wpa_passphrase <ESSID> <KEY>

これで、一見してパスワードの中身はわからなくなりました。

ただし、これらの設定ファイル自体が入手できてしまうような状況では、結局そのファイルを使えば接続はできてしまうため、セキュリティ的には、あまり意味はありません。
固定 IP の場合
固定 IP にしたい場合 (IPv4 の場合) は、以下のようになります。

「192.168.N.M」 の N の部分は、ルータによって値が異なります。
説明書を見たり、ルータの情報を見たりしてください。

Description='A simple WPA encrypted wireless connection'
Interface=***
Connection=wireless
Security=wpa
ESSID='***'
Key='***'

IP=static
Address='192.168.0.100/24'
Gateway='192.168.0.1'
DNS='192.168.0.1'

Address は、IP アドレスです。
「192.168.N.M」 の M の部分は 1 以外の好きな値を使って構いません。

ただし、そのルータが他のパソコンや機器とも接続する場合は、それぞれで IP アドレスを消費するので、他の機器の IP アドレスと重複しないようにしてください。

DHCP で自動取得した場合は、通常、低い値から順に割り当てられていきます。

GatewayDNA は、ルータのアドレスを指定します。
基本的に、ブラウザでルータの設定画面を開く時のアドレスと同じです。
接続
プロファイルが作成できたら、そのプロファイルを使って、netctl で接続します。
netctl では、systemctl コマンドは使いません。

(プロファイルから接続)
# netctl start wireless
               ~~~~~~~~

netctl の start コマンドで、プロファイルの内容を元にネットワークに接続します。
wireless は、接続するプロファイル名(作成したファイル名)です。

接続に失敗した場合は、プロファイルを見直してください。

なお、ip コマンドで、インターフェイスを UP にして立ち上げた状態の場合は、接続に失敗するので、DOWN の状態にしておいてください。

# ip link set wlp2s0 down
              ~~~~~~

接続を切断する場合は、stop です。

# netctl stop wireless
              ~~~~~~~~
起動時に接続させる
netctl start によって、現在の起動中での接続はできましたが、このままでは、再起動時に自動で接続はされません。

PC 起動時に自動で接続するためには、enable を使います。

# netctl enable <profile>

enable を行うと、サービスが systemd に登録され、起動時に自動で接続されます。
逆に、disable を行うと、systemd から登録を削除します。

なお、enable 後にプロファイルの内容を変更した場合は、再設定が必要になるので、必ず reenable を行ってください。

# netctl reenable <profile>