iwd
iwd (iNet wireless daemon,iNet 無線守護程序) 是由英特爾(Intel)為 Linux 編寫的一個無線網絡守護程序。該項目的核心目標是不依賴任何外部庫,而是最大程度地利用 Linux 內核提供的功能來優化資源利用。
iwd 可以獨立工作,也可以和 ConnMan、systemd-networkd 和 NetworkManager 這樣更完善的網絡管理器結合使用。
安裝[編輯 | 編輯原始碼]
也可選擇安裝第三方包,其提供圖形化與終端用戶界面:
- impala — iwd 的一個 TUI(Terminal User Interface,終端用戶界面)前端。
- iwgtk — iwd 的一個圖形化前端,提供指示器(托盤)圖標。
使用方法[編輯 | 編輯原始碼]
iwd包 軟體包提供了客戶端程序 iwctl
、守護程序 iwd
和 WiFi 監控工具 iwmon
。
啟動/啟用 iwd.service
以便可以使用 iwctl
或 iwgtk
對其進行控制。
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
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 托盤圖標的自啟動無需額外配置,因為 iwgtkCNRepo 將 iwgtk-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) 獲得更詳盡的設置。
WPA-PSK[編輯 | 編輯原始碼]
一個連接到 WPA-PSK 或 WPA2-PSK 安全網絡的最小示例文件,其 SSID "spaceship",Passphrase "test1234":
/var/lib/iwd/spaceship.psk
[Security] PreSharedKey=aafb192ce2da24d8c7805c956136f45dd612103f086034c402ed266355297295
- _
兩字符之一時作為文件名。如果其包含其他字符,文件名將替代為=
字符後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_passphrase(自wpa_supplicant包 或 wpa-pskAUR),用 SSID 與 passphrase 計算 pre-shared key。
- 參見 wpa_supplicant#Connecting with wpa_passphrase 獲得更多細節。
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。
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
值。
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
- 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
|
其中 method
是 EAP-Method
的內容,應為 TLS
、TTLS
或 PEAP
。 提取所有必要信息,並轉換、使之與 iwd 配置等價後,就可以按照前面的方法將其放入名為 essid.8021x
的配置文件中。
- Eduroam 提供方可能不要求使用
EAP-Identity
,在這種情況下可以在選項欄位裡寫上anonymous
。 - 若您的
EAP-method-ServerDomainMask
以DNS:
開始,只使用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-resolved 和 resolvconf。
要使用 systemd-resolved
,將下列部分添加到 /etc/iwd/main.conf
中:
/etc/iwd/main.conf
[Network] NameResolvingService=systemd
而對於 resolvconf
,添加的為:
/etc/iwd/main.conf
[Network] NameResolvingService=resolvconf
允許任何用戶讀取狀態信息[編輯 | 編輯原始碼]
如果想允許任何用戶讀取狀態信息,但不允許修改設置,請按如下所示創建一個 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>
加密網絡配置文件[編輯 | 編輯原始碼]
默認情況下,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#63912 和 thread 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#
在引導後保留。 這使得 iwd 和 udev 間存在接口重命名的競爭,如 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