iwd

出自 Arch Linux 中文维基

iwd (iNet wireless daemon,iNet 無線守護程序) 是由英特爾(Intel)為 Linux 編寫的一個無線網絡守護程序。該項目的核心目標是不依賴任何外部庫,而是最大程度地利用 Linux 內核提供的功能來優化資源利用。

iwd 可以獨立工作,也可以和 ConnMansystemd-networkdNetworkManager 這樣更完善的網絡管理器結合使用。

注意: 當通過 NetworkManager 使用 iwd 時,除非 NetworkManager 的文章中另有說明,否則請不要按照本頁上的說明操作。

安裝[編輯 | 編輯原始碼]

安裝 iwd 軟體包。

也可選擇安裝第三方包,其提供圖形化與終端用戶界面:

  • impala — iwd 的一個 TUI(Terminal User Interface,終端用戶界面)前端。
https://github.com/pythops/impala || impala
  • iwgtk — iwd 的一個圖形化前端,提供指示器(托盤)圖標。
https://github.com/J-Lentz/iwgtk || iwgtkAUR

使用方法[編輯 | 編輯原始碼]

iwd 軟體包提供了客戶端程序 iwctl、守護程序 iwd 和 WiFi 監控工具 iwmon

啟動/啟用 iwd.service 以便可以使用 iwctliwgtk 對其進行控制。

注意: 僅允許root、networkwheel 用戶組 的成員與 iwd 交互。為了使用 iwctliwgtk,您需要 將您的用戶添加到其中一個組.

iwctl[編輯 | 編輯原始碼]

要進入交互式提示符(interactive prompt),執行:

$ iwctl

然後交互式提示符就會以 [iwd]# 前綴顯示出來了。

提示:
  • iwctl 提示符中,可以通過 Tab 鍵自動補全命令和設備名稱。
  • 要退出交互式提示,按下 Ctrl+d 發送 EOF 信號。
  • 可以在不進入交互式提示符的情況下,將所有命令當作命令行參數使用。例如:iwctl device wlan0 show

要列出所有可用的命令:

[iwd]# help

連接網絡[編輯 | 編輯原始碼]

首先,使用 rfkill 命令確認 Wi-Fi 設備未被屏蔽。

如果不知道你的網絡設備名稱,請列出所有 WiFi 設備:

[iwd]# device list

如果設備或其相應的適配器已關閉,請將其打開。

[iwd]# device name set-property Powered on
[iwd]# adapter adapter set-property Powered on

然後,要開始掃描網絡(注意:這個命令不會輸出任何內容),執行:

[iwd]# station name scan

再然後,就可以列出所有可用的網絡:

[iwd]# station name get-networks

最後,要連接到一個網絡:

[iwd]# station name connect SSID
注意: * 對於通過 DHCP 的 IP 和 DNS 自動配置,您需要 手動啟用 內置 DHCP 客戶端,或配置一個 獨立 DHCP 客戶端
提示:用戶界面支持自動補全,輸入 station 後按壓 Tab Tab,將顯示可用的設備,鍵入設備的首字母和 Tab 將自動補全。同樣,輸入 connect Tab Tab 以顯示可用網絡列表。然後,鍵入所選網絡的首字母,後跟 Tab,以自動補全。


如果要求輸入網絡密碼(並且密碼尚未存入任何一個 iwd 自動檢查的配置文件中),將會提示用戶輸入。此外,連接操作可以應用成命令行參數的形式:

and it is not already stored in one of the profiles that iwd automatically checks

$ iwctl --passphrase passphrase station name connect SSID
注意:
  • iwd 會自動將網絡密碼存儲在 /var/lib/iwd 目錄中,以後就可以使用其自動連接記住的網絡。參見 #網絡配置 一節。
  • 要連接 SSID 裡帶空格的網絡,連接時請用雙引號將網絡名稱括起來。(或用轉義符代替空格("\ "))
  • iwd 僅支持 8 到 63 位 ASCII 編碼字符組成的 PSK 密碼。如果沒有滿足要求,會出現下列錯誤信息:PMK generation failed. Ensure Crypto Engine is properly configured

使用 WPS/WSC 連接網絡[編輯 | 編輯原始碼]

如果網絡配置為可以通過按下一個按鈕就能進行連接 (Wikipedia:Wi-Fi Protected Setup,WPS,WiFi 保護配置),先檢查設備是否能兼容以下配置步驟:

[iwd]# wsc list

然後,假設設備出現在了上面的列表中:

[iwd]# wsc device push-button

接著按下路由器上的按鈕。如果提前按下按鈕,但只要少於兩分鐘前,以上步驟也是可以生效的。

如果網絡要求驗證 PIN 碼才能連接,請檢查 help 命令的輸出,了解如何為 wsc 命令提供正確的選項。

斷開網絡連接[編輯 | 編輯原始碼]

要斷開網絡連接:

[iwd]# station device disconnect

顯示設備和連接信息[編輯 | 編輯原始碼]

要顯示 WiFi 設備詳細情況,比如 MAC 地址:

[iwd]# device device show

要顯示包括 WiFi 設備的連接網絡在內的連接狀態:

[iwd]# station device show

管理已知網絡[編輯 | 編輯原始碼]

要列出以前連接過的網絡:

[iwd]# known-networks list

要忘記已知的網絡:

[iwd]# known-networks SSID forget

iwgtk[編輯 | 編輯原始碼]

另外,iwgtkCNRepo 提供了一個 GUI 前端,也通過它可以控制 iwd。

不加任何參數運行 iwgtk 將啟動一個 iwd 的管理窗口,它能被用於切換適配器的開關、更改操作模式、查看或連結可用的無線網絡、管理已保存的網絡。

托盤圖標[編輯 | 編輯原始碼]

要啟動 iwgtk 的托盤圖標請運行:

$ iwgtk -i

如果托盤中的圖標沒有出現,則你的系統托盤很可能不支持 StatusNotifierItem API,這種情況下你需要使用一個兼容層(例如snixembed-gitAUR)。 下面的系統托盤支持 StatusNotifierItem API,因此無需兼容層:

  • KDE Plasma
  • swaybar
  • xfce4-panel


下面的托盤只支持 XEmbed 因此需要snixembed-gitAUR

  • AwesomeWM
  • i3bar

自啟動[編輯 | 編輯原始碼]

每次登錄桌面時自啟動 iwgtk 的托盤圖標是常見的用法。如果你的桌面環境支持 XDG Autostart 標準,則 iwgtk 托盤圖標的自啟動無需額外配置,因為 iwgtkCNRepoiwgtk-indicator.desktop 文件放置在了 /etc/xdg/autostart/。 作為上面的方法的替代, iwgtkCNRepo提供了一個用來自啟動托盤進程的 systemd 單元文件.如果你的桌面環境支持 systemd 的 graphical-session.target 單元, 則 iwgtk 能在 Systemd#使用單元iwgtk.service 用戶單元後被 systemd 自動啟動。

網絡配置[編輯 | 編輯原始碼]

iwd 默認在 /var/lib/iwd 目錄下儲存網絡配置。配置文件名形如 網絡.類別,其中網絡是該網絡的 SSID,類別是網絡類別,是 .open, .psk, .8021x 之一。文件儲存加密的 PreSharedKey 和可選的 cleartext Passphrase,可以不調用 iwctl 由用戶創建。該文件亦可用作隸屬該網絡 SSID 的其他配置。參見 iwd.network(5) 獲得更詳盡的設置。

注意: 在字符串值中,包括身份和密碼,特定字符被反斜槓轉義。開頭的空格,\n,\r 以及反斜槓必須轉義表達。參見 iwd.network(5)

WPA-PSK[編輯 | 編輯原始碼]

一個連接到 WPA-PSK 或 WPA2-PSK 安全網絡的最小示例文件,其 SSID "spaceship",Passphrase "test1234":

/var/lib/iwd/spaceship.psk
[Security]
PreSharedKey=aafb192ce2da24d8c7805c956136f45dd612103f086034c402ed266355297295
注意: 網絡的 SSID 僅當其僅包含字母,數字或 - _ 兩字符之一時作為文件名。如果其包含其他字符,文件名將替代為=字符後SSID的十六進位編碼(十六進位數使用小寫字母)。

下列兩種方法可以根據 passphrase 計算 pre-shared key:

  • 在配置文件的 cleartext 輸入 passphrase:
/var/lib/iwd/spaceship.psk
[Security]
Passphrase=test1234

pre-shared key 會在第一次連接時自動追加到文件末尾:

/var/lib/iwd/spaceship.psk
[Security]
Passphrase=test1234
PreSharedKey=aafb192ce2da24d8c7805c956136f45dd612103f086034c402ed266355297295

WPA Enterprise[編輯 | 編輯原始碼]

EAP-PWD[編輯 | 編輯原始碼]

為了連接到受 EAP-PWD 保護的企業(無線)訪問接入點 (Access Point, AP),需要在 /var/lib/iwd 文件夾中創建一個 essid.8021x 格式的文件,並包含以下內容:

/var/lib/iwd/essid.8021x
[Security]
EAP-Method=PWD
EAP-Identity=your_enterprise_email
EAP-Password=your_password

[Settings]
AutoConnect=true

如果不想自動連接到 AP,可以將相應選項設定為 False 並手動通過 iwctl 連接網絡。密碼同理,如果不想讓密碼以明文保存,則將相應選項從文件中刪去,直接連接企業 AP。

注意: 無法更改不同 SSID 的優先級,您可能需要設置 AutoConnect=false 作為變通方法。

EAP-PEAP[編輯 | 編輯原始碼]

和 EAP-PWD 一樣,同樣需要在同一文件夾中創建一個 essid.8021x 格式的文件。在繼續編寫配置文件之前,不妨了解一下自己所屬組織所使用的 CA 證書。下面是一個使用 MSCHAPv2 密碼認證的示例配置文件:

/var/lib/iwd/essid.8021x
[Security]
EAP-Method=PEAP
EAP-Identity=anonymous@realm.edu
EAP-PEAP-CACert=/path/to/root.crt
EAP-PEAP-ServerDomainMask=radius.realm.edu
EAP-PEAP-Phase2-Method=MSCHAPV2
EAP-PEAP-Phase2-Identity=johndoe@realm.edu
EAP-PEAP-Phase2-Password=hunter2

[Settings]
AutoConnect=true

MsCHAPv2 密碼亦可被存為一個加密的哈希值。正確的 md4 值可這樣計算:

$ iconv -t utf16le | openssl md4 -provider legacy

在輸完密碼後,按下 Ctrl+d以輸入 EOF,不要按 Enter。結果哈希值應儲存在 EAP-PEAP-Phase2-Password-Hash 值。

注意: 如果打算使用 eduroam,另請參見 #Eduroam

TTLS-PAP[編輯 | 編輯原始碼]

和 EAP-PWD 一樣,同樣需要在同一文件夾中創建一個 essid.8021x 格式的文件。在繼續編寫配置文件之前,不妨了解一下自己所屬組織所使用的 CA 證書。下面是一個使用 PAP 密碼認證的示例配置文件:

/var/lib/iwd/essid.8021x
[Security]
EAP-Method=TTLS
EAP-Identity=anonymous@uni-test.de
EAP-TTLS-CACert=cert.pem
EAP-TTLS-ServerDomainMask=*.uni-test.de
EAP-TTLS-Phase2-Method=Tunneled-PAP
EAP-TTLS-Phase2-Identity=user
EAP-TTLS-Phase2-Password=password

[Settings]
AutoConnect=true

EAP-TLS[編輯 | 編輯原始碼]

EAP-TLS 使用 x509 客戶端證書來確認您的身份。和 ssh 密鑰一樣,這些證書使用公鑰加密,因此永不需要向 wifi 驗證伺服器發送密鑰,您也無需複製和重複使用密碼。通常情況下,每台設備都會使用不同的證書。理論上,至少可以在不強迫你更改密碼或中斷其他設備的情況下撤銷證書。

與其他企業級方法一樣,您需要知道貴組織使用的 CA 證書(cacert.pem),該證書可以向設備證明它連接到的目標是正確的。您還需要擁有在每次連接時上傳的、代表您的客戶端證書(client-cert.pem),以及證明您擁有客戶端證書的配套的私鑰(client-key.pem)。

當您收集好憑證,將這個放到您的 /var/lib/iwd/essid.8021x 文件:

{{hc|/var/lib/iwd/essid.8021x|2=

[Security]

EAP-Method=TLS

EAP-TLS-CACert=/path/to/cacert.pem

EAP-Identity=your_enterprise_email

EAP-TLS-ClientCert=/path/to/client-cert.pem

EAP-TLS-ClientKey=/path/to/client-key.pem

  1. EAP-TLS-ClientKeyPassphrase=key-passphrase # 若 client-key.pem 是加密的,提供密鑰。

Eduroam[編輯 | 編輯原始碼]

Eduroam 提供了一個配置助手工具 (Configuration Assistant Tool,CAT), 遺憾的是它並不支持 iwd。但是,CAT 的安裝程序只是一個 Python 腳本,可以通過點擊下載按鈕,然後選擇你的大學來下載它。可以很輕易地提取出必要的配置選項,包括證書和服務域掩碼。此外,一些機構正在升級到 EAP-TLS,並將 client-cert.pem 的生成外包給 SecureW2。這種情況下,您也需要使用他們的工具來生成客戶端證書。

下列的表格包含了 iwd 配置選項到 Eduroam CAT 安裝腳本變量的映射關係:

Iwd 配置選項 CAT 腳本變量
essid 某個 Config.ssids 文件
EAP-Method Config.eap_outer
EAP-Identity Config.anonymous_identity
EAP-method-CACert Config.CA的內容,或者包含Config.CA.pem文件的絕對路徑
EAP-method-ServerDomainMask Config.servers 之一
EAP-method-Phase2-Method 除非 Config.eap_inner 等於 PAP,否則請使用 Tunneled-PAP
EAP-method-Phase2-Identity username@Config.user_realm

其中 methodEAP-Method 的內容,應為 TLSTTLSPEAP。 提取所有必要信息,並轉換、使之與 iwd 配置等價後,就可以按照前面的方法將其放入名為 essid.8021x 的配置文件中。

注意:
  • Eduroam 提供方可能不要求使用 EAP-Identity,在這種情況下可以在選項欄位裡寫上 anonymous
  • 若您的 EAP-method-ServerDomainMaskDNS:開始,只使用 DNS: 以後的部分。

其他情況[編輯 | 編輯原始碼]

更多測試範例可在上游倉庫的測試案例中找到

可選配置[編輯 | 編輯原始碼]

文件 /etc/iwd/main.conf 用於存儲主要配置。參見 iwd.config(5)

禁用特定網絡的自動連接[編輯 | 編輯原始碼]

創建或編輯 /var/lib/iwd/network.type 文件。在其中添加如下部分:

/var/lib/iwd/spaceship.psk (for example)
[Settings]
AutoConnect=false

禁用定期掃描可用網絡[編輯 | 編輯原始碼]

默認情況下,當 iwd 處於未連接狀態時,它會定期掃描可用網絡。要禁用定期掃描(以便總是手動掃描網絡),創建或編輯 /etc/iwd/main.conf 文件並添加以下部分:

/etc/iwd/main.conf
[Scan]
DisablePeriodicScan=true

啟用內置網絡配置[編輯 | 編輯原始碼]

自 0.19 版本起,iwd 可使用內置的 DHCP 客戶端或靜態配置來分配(多個)IP 地址並設置路由。它是獨立 DHCP 客戶端不錯的替代品。

要激活 iwd 的網絡配置功能,創建或編輯 /etc/iwd/main.conf 並添加以下部分:

/etc/iwd/main.conf
[General]
EnableNetworkConfiguration=true

還可以用 RoutePriorityOffset 設置路由指標(route metric):

/etc/iwd/main.conf
[Network]
RoutePriorityOffset=300

IPv6 支持[編輯 | 編輯原始碼]

自從 1.10 版本,iwd 支持 IPv6,但在 2.0 版本以下默認禁用。2.0 版本後默認啟用。

欲禁用之,在配置文件下添加以下內容:

/etc/iwd/main.conf
[Network]
EnableIPv6=false

要在高於 1.10 低於 2.0 版本啟用它:

/etc/iwd/main.conf
[Network]
EnableIPv6=true

無論您想用 DHCPv6 還是靜態 IPv6 配置,您都需要啟用該設置。它也可以設置在每個網絡的基礎上。

在網絡配置中設定靜態 IP 地址[編輯 | 編輯原始碼]

將下列部分添加到 /var/lib/iwd/network.type 文件中。例如可以這樣寫:

/var/lib/iwd/spaceship.psk
[IPv4]
Address=192.168.1.10
Netmask=255.255.255.0
Gateway=192.168.1.1
Broadcast=192.168.1.255
DNS=192.168.1.1

選擇 DNS 管理器[編輯 | 編輯原始碼]

目前,iwd 支持兩種 DNS 管理器——systemd-resolvedresolvconf

要使用 systemd-resolved,將下列部分添加到 /etc/iwd/main.conf 中:

/etc/iwd/main.conf
[Network]
NameResolvingService=systemd

而對於 resolvconf,添加的為:

/etc/iwd/main.conf
[Network]
NameResolvingService=resolvconf
注意: 若未指定,默認使用 systemd-resolved,並推薦其用於systemd.

允許任何用戶讀取狀態信息[編輯 | 編輯原始碼]

如果想允許任何用戶讀取狀態信息,但不允許修改設置,請按如下所示創建一個 D-Bus 配置:

/etc/dbus-1/system.d/iwd-allow-read.conf
<!-- Allow any user to read iwd status information. Overrides some part
      of /usr/share/dbus-1/system.d/iwd-dbus.conf. -->

<!DOCTYPE busconfig PUBLIC "-//freedesktop//DTD D-BUS Bus Configuration 1.0//EN"
 "http://www.freedesktop.org/standards/dbus/1.0/busconfig.dtd">
<busconfig>

  <policy context="default">
    <deny send_destination="net.connman.iwd"/>
    <allow send_destination="net.connman.iwd" send_interface="org.freedesktop.DBus.Properties" send_member="GetAll" />
    <allow send_destination="net.connman.iwd" send_interface="org.freedesktop.DBus.Properties" send_member="Get" />
    <allow send_destination="net.connman.iwd" send_interface="org.freedesktop.DBus.ObjectManager" send_member="GetManagedObjects" />
    <allow send_destination="net.connman.iwd" send_interface="net.connman.iwd.Device" send_member="RegisterSignalLevelAgent" />
    <allow send_destination="net.connman.iwd" send_interface="net.connman.iwd.Device" send_member="UnregisterSignalLevelAgent" />
  </policy>

</busconfig>

加密網絡配置文件[編輯 | 編輯原始碼]

這篇文章的某些內容需要擴充。

原因: 加密網絡配置文件在某些配置文件中可能無效。 (在 Talk:Iwd 中討論)

默認情況下,iwd 會以未加密方式在系統中存儲網絡憑證。自 iwd 1.25 版起,iwd 提供了試驗性支持,可為使用 systemd 的系統創建加密配置文件

首先,創建一個加密憑證。下面的示例使用systemd-creds創建了一個名為iwd-secret的加密憑據,該憑據與系統的Trusted Platform Module綁定,將用於創建加密配置文件:

# systemd-ask-password -n | systemd-creds --tpm2-device=auto --name=iwd-secret encrypt - /etc/credstore.encrypted/iwd-secret.cred

接下來,為 iwd 服務創建一個 drop-in file,添加 LoadCredentialEncrypted 選項。

/etc/systemd/system/iwd.service.d/use-creds.conf
[Service]

LoadCredentialEncrypted=iwd-secret:/etc/credstore.encrypted/iwd-secret.cred

最終,在 iwd 配置文件中添加 SystemdEncrypt 選項(值為該憑證),重載 systemd 管理器,並重啟 iwd 服務。

/etc/iwd/main.conf
[General]

...

SystemdEncrypt=iwd-secret
注意:
  • 當前系統中的任何配置文件都將自動加密。此時無需其他操作,今後的任何配置文件都將自動加密。
  • 在上例中,加密憑據隱式綁定到 TPM PCR 7。因此,如果安全啟動狀態或固件證書發生變化,該啟動會話將無法連接網絡。

故障排除[編輯 | 編輯原始碼]

詳細 TLS 調試[編輯 | 編輯原始碼]

如果在配置 MSCHAPv2 或 TTLS 時遇到困難,這會很有用。可以通過一個附加配置片段來設定以下環境變量

/etc/systemd/system/iwd.service.d/tls-debug.conf
[Service]
Environment=IWD_TLS_DEBUG=TRUE

之後通過以 root 身份運行 journalctl -u iwd.service 命令檢查 iwd 日誌。

引導後重啟 iwd.service[編輯 | 編輯原始碼]

一些電腦上 iwd.service 需引導後重啟才能正常工作。參見 FS#63912thread 251432。 This probably occurs because the Linux 內核與服務啟動過早且 iwd 開啟在無線網卡啟動前。 要解決,您可擴展單元以增加延遲:

[Service]
ExecStartPre=/usr/bin/sleep 2

然後,重載 systemd 管理配置。

Wireless device is not renamed by udev[編輯 | 編輯原始碼]

1.0 起,iwd 禁用了可預測的無線設備重命名。它設置了阻止 udev 重命名 wlp#s# 接口的以下 systemd 網絡連接配置文件:

/usr/lib/systemd/network/80-iwd.link
[Match]
Type=wlan

[Link]
NamePolicy=keep kernel

結果是網絡連結名 wlan# 在引導後保留。 這使得 iwdudev 間存在接口重命名的競爭,如 iwd udev interface renaming 所述。

如果造成問題,嘗試以此解決:

# ln -s /dev/null /etc/systemd/network/80-iwd.link

在 AP 模式下無 DHCP[編輯 | 編輯原始碼]

當在 AP 模式下通過 DHCP連接到 iwd 時,客戶端可能收不到 IP 地址。這有必要用 iwd 在管理好的接口上啟用網絡配置。

/etc/iwd/main.conf
[General]
EnableNetworkConfiguration=True

提及文件若不存在則創建。

因 iwd 崩潰無法連接 WiFi[編輯 | 編輯原始碼]

一些用戶經歷 WiFi 斷開的情況,通過不斷重連,最終使之穩定並成功連接。

用戶通過 journal 報告 iwd.service 崩潰 ([1]) 。

核心問題 是多個網絡連接服務衝突。要解決,請檢查您是否同時啟用多個服務。

客戶端密鑰加載錯誤[編輯 | 編輯原始碼]

要加載密鑰文件,iwd 需要 pkcs8_key_parser 內核參數。引導時,它由 systemd-modules-load.service(8) 使用 /usr/lib/modules-load.d/pkcs8.conf 加載,如果才安裝 iwd,就不會出現這種情況。

當嘗試連接到 WPA 企業網絡時,如在 journal 有例如 Error loading client private key /path/to/key 的消息,請手動加載內核:

# modprobe pkcs8_key_parser

iwd 始終漫遊[編輯 | 編輯原始碼]

如果連接太差,iwd 會漫遊到其他已知 AP。

出現此問題,系統日誌會報:wlan0: deauthenticating from xx:xx:xx:xx:xx:xx by local choice (Reason: 3=DEAUTH_LEAVING)

您可通過以下方法查看信號強度:

iwctl station wlan0 show | grep RSSI

您可調整閾值以允許更差的連接。RoamThreshold 默認值為 -70,RoamThreshold5G 默認值為 -76。

/etc/iwd/main.conf
[General]

RoamThreshold=-75

RoamThreshold5G=-80

另請參閱[編輯 | 編輯原始碼]