在本教程中,我們將學習如何在 Ubuntu 18.04/20.04 服務器和桌面上使用wpa_supplicant從命令行連接到 Wi-Fi 網絡。在現代家庭無線網絡中,通信受 WPA-PSK(預共享密鑰)保護,而不是為企業網絡設計的 WPA-Enterprise。WPA-PSK 也稱為 WPA-個人。 wpa_supplicant是 WPA 請求者組件的實現。無線局域網中的請求者是安裝在最終用戶計算機上的客戶端軟件,需要對其進行身份驗證才能加入網絡。
步驟 1:查找您的無線接口和無線網絡的名稱
運行iwconfig命令以查找您的無線接口的名稱 :
iwconfig
wlan0曾經是沒有 Systemd 的 Linux 系統上無線網絡接口的通用名稱。因為 Ubuntu 使用 Systemd,你會發現你的無線網絡接口被命名為類似wlp4s0. 您還可以看到它現在沒有與任何接入點相關聯。
如果您的無線接口未顯示,也許您需要使用以下命令啟動它。
sudo ifconfig wlp4s0 up
然后通過使用以下命令掃描附近的網絡來查找您的無線網絡名稱。替換wlp4s0為您自己的無線接口名稱。ESSID 是網絡名稱標識符。
sudo iwlist wlp4s0 scan | grep ESSID
第 2 步:使用 WPA_Supplicant 連接到 Wi-Fi 網絡
現在 Ubuntu 18.04/20.04 上從默認軟件存儲庫安裝wpa_supplicant。
sudo apt install wpasupplicant
我們需要創建一個wpa_supplicant.conf使用該wpa_passphrase實用程序命名的文件 。 wpa_supplicant.conf是描述用戶希望計算機連接到的所有網絡的配置文件。運行以下命令來創建此文件。將 ESSID 和 Wi-Fi 密碼替換為您自己的密碼。
wpa_passphrase your-ESSID your-wifi-passphrase | sudo tee /etc/wpa_supplicant.conf
請注意,在上面的屏幕截圖中,我用雙引號將 ESSID 括起來,因為我的 ESSID 包含空格。
wpa_passphrase命令的輸出將通過管道傳輸到tee,然后寫入/etc/wpa_supplicant.conf文件。現在使用以下命令將您的無線網卡連接到無線接入點。
sudo wpa_supplicant -c /etc/wpa_supplicant.conf -i wlp4s0
以下輸出表明您的無線網卡已成功連接到接入點:
Successfully initialized wpa_supplicant wlp4s0: SME: Trying to authenticate with c5:4a:21:53:ac:eb (SSID='LinuxBabe.Com Network' freq=2437 MHz) wlp4s0: Trying to associate with c5:4a:21:53:ac:eb (SSID='LinuxBabe.Com Network' freq=2437 MHz) wlp4s0: Associated with c5:4a:21:53:ac:eb wlp4s0: CTRL-EVENT-SUBNET-STATUS-UPDATE status=0 wlp4s0: WPA: Key negotiation completed with c5:4a:21:53:ac:eb [PTK=CCMP GTK=CCMP] wlp4s0: CTRL-EVENT-CONNECTED - Connection to c5:4a:21:53:ac:eb completed [id=0 id_str=]
請注意,如果您使用的是 Ubuntu 桌面版,那么您需要使用以下命令停止網絡管理器,否則在使用wpa_supplicant時會導致連接問題。
sudo systemctl stop NetworkManager
並通過執行以下命令在啟動時禁用 NetworkManager 自動啟動。
sudo systemctl disable NetworkManager-wait-online NetworkManager-dispatcher NetworkManager
默認情況下,wpa_supplicant 在前台運行。如果連接完成,則打開另一個終端窗口並運行
iwconfig
您可以看到無線接口現在與接入點相關聯。
您可以按CTRL+C停止當前的wpa_supplicant進程並通過添加-B標志在后台運行它。
sudo wpa_supplicant -B -c /etc/wpa_supplicant.conf -i wlp4s0
盡管我們已通過身份驗證並連接到無線網絡,但我們還沒有 IP 地址。要從 DHCP 服務器獲取私有 IP 地址,請使用以下命令:
sudo dhclient wlp4s0
現在您的無線接口有一個私有 IP 地址,它可以顯示為:
ip addr show wlp4s0
現在您可以訪問 Internet。要釋放私有 IP 地址,請運行
sudo dhclient wlp4s0 -r
連接到隱藏的無線網絡
如果您的無線路由器不廣播 ESSID,那么您需要在/etc/wpa_supplicant.conf文件中添加以下行。
scan_ssid=1
像下面這樣:
network={ ssid="LinuxBabe.Com Network"
#psk="12345qwert" psk=68add4c5fee7dc3d0dac810f89b805d6d147c01e281f07f475a3e0195 scan_ssid=1 }
第 3 步:啟動時自動連接
要在啟動時自動連接到無線網絡,我們需要編輯該wpa_supplicant.service文件。最好將文件從一個/lib/systemd/system/目錄復制到另一個/etc/systemd/system/目錄,然后編輯文件內容,因為我們不希望更新的版本wpa_supplicant覆蓋我們的修改。
sudo cp /lib/systemd/system/wpa_supplicant.service /etc/systemd/system/wpa_supplicant.service
使用命令行文本編輯器(例如 Nano)編輯文件。
sudo nano /etc/systemd/system/wpa_supplicant.service
找到以下行。
ExecStart=/sbin/wpa_supplicant -u -s -O /run/wpa_supplicant
將其更改為以下內容。這里我們在ExecStart命令中添加了配置文件和無線接口名稱。
ExecStart=/sbin/wpa_supplicant -u -s -c /etc/wpa_supplicant.conf -i wlp4s0
建議在檢測到故障時始終嘗試重新啟動 wpa_supplicant。在該ExecStart行下方添加以下內容。
Restart=always
如果您可以在此文件中找到以下行,請將其注釋掉(在該行的開頭添加 # 字符)。
Alias=dbus-fi.w1.wpa_supplicant1.service
保存並關閉文件。(要在 Nano 文本編輯器中保存文件,請按Ctrl+O,然后按Enter確認。要退出,請按Ctrl+X。)然后重新加載 systemd。
sudo systemctl daemon-reload
啟用wpa_supplicant服務以在啟動時啟動。
sudo systemctl enable wpa_supplicant.service
我們還需要在啟動dhclient時啟動以從 DHCP 服務器獲取私有 IP 地址。這可以通過為dhclient.
sudo nano /etc/systemd/system/dhclient.service
將以下文本放入文件中。
[Unit] Description= DHCP Client Before=network.target After=wpa_supplicant.service [Service] Type=forking ExecStart=/sbin/dhclient wlp4s0 -v ExecStop=/sbin/dhclient wlp4s0 -r Restart=always [Install] WantedBy=multi-user.target
保存並關閉文件。然后啟用此服務。
sudo systemctl enable dhclient.service
如何獲取靜態 IP 地址
如果要獲取靜態 IP 地址,則需要禁用dhclient.service.
sudo systemctl disable dhclient.service
我們需要在 Ubuntu 18.04/20.04 上使用 netplan 配置靜態 IP 地址。下創建配置文件/etc/netplan/。
sudo nano /etc/netplan/10-wifi.yaml
將以下行添加到此文件中。替換192.168.0.102為您首選的 IP 地址。請注意縮進。額外的空間會使配置無效。
network: ethernets: wlp4s0: dhcp4: no addresses: [192.168.0.102/24] gateway4: 192.168.0.1 version: 2
保存並關閉文件。然后應用配置。
sudo netplan apply
--debug如果它沒有按預期工作,您也可以打開該選項。
sudo netplan --debug apply
如果.yaml目錄下還有其他文件/etc/netplan/,那么netplan會自動合並不同文件的配置。netplan使用systemd-networkd作為后端網絡渲染。建議先配置wpa_supplicant.servicerun systemd-networkd.service,系統會先關聯一個Wi-Fi接入點,然后獲取私有IP地址。
sudo nano /etc/systemd/system/wpa_supplicant.service
找到以下行。
Before=network.target
將其更改為:
Before=network.target systemd-networkd.service
保存並關閉文件。
獲取靜態 IP 地址的另一種方法是登錄路由器的管理界面並為無線網卡的 MAC 地址分配一個靜態 IP(如果您的路由器支持此功能)。
在 Ubuntu 上使用主機名訪問服務
實際上,您不必為您的 Ubuntu 機器獲取靜態 IP 地址。Ubuntu 可以使用 mDNS(多播 DNS)向本地網絡宣布其主機名,客戶端可以使用該主機名訪問 Ubuntu 機器上的服務。即使 IP 地址更改,此主機名始終可以解析為 Ubuntu 機器的 IP 地址。
為了使用 mDNS,您需要安裝 avahi-daemon,它是 mDNS/DNS-SD 的開源實現。
sudo apt install avahi-daemon
啟動服務。
sudo systemctl start avahi-daemon
在啟動時啟用自動啟動。
sudo systemctl enable avahi-daemon
Avahi-daemon 監聽 UDP 5353,所以需要在防火牆中打開這個端口。如果您使用 UFW,則運行以下命令。
sudo ufw allow 5353/udp
然后你應該使用hostnamectl命令為你的 Ubuntu 機器設置一個唯一的主機名。將 ubuntubox 替換為您首選的主機名,本地網絡中的其他設備不應使用該主機名。
sudo hostnamectl set-hostname ubuntubox
現在重新啟動 avahi-daemon。
sudo systemctl restart avahi-daemon
如果您檢查狀態
systemctl status avahi-daemon
您可以看到以.local域結尾的 mDNS 主機名。
在客戶端計算機上,您還需要安裝 mDNS/DNS-SD 軟件。
- Linux 用戶應該安裝avahi-daemon.
- Windows 用戶需要通過安裝Bonjour 打印服務或安裝iTunes來啟用 Bonjour 服務。
- 在 macOS 上,預裝了 Bonjour。
現在您可以使用ubuntubox.local主機名訪問服務,無需檢查和鍵入 IP 地址。
在 Raspberry Pi 上解鎖 Wifi
用於 Raspberry Pi 的 Ubuntu ARM 操作系統默認阻止無線接口。您需要使用以下命令解除阻止:
sudo rfkill unblock wifi
要在啟動時解鎖它,請創建一個 systemd 服務單元。
sudo nano /etc/systemd/system/unblock-wifi.service
向其中添加以下幾行。
[Unit] Description=RFKill Unblock WiFi Devices Requires=wpa_supplicant.service After=wpa_supplicant.service [Service] Type=oneshot ExecStart=/usr/sbin/rfkill unblock wifi ExecStop= RemainAfterExit=yes [Install] WantedBy=multi-user.target
保存並關閉文件。在啟動時啟用自動啟動。
sudo systemctl enable unblock-wifi
我發現unblock-wifi.service應該在wpa_supplicant.service啟動后運行,否則無法解鎖wifi。請注意,如果您安裝了桌面環境,則可能正在運行的網絡管理器會干擾連接。你需要禁用它。比如我在樹莓派上使用輕量級的LXQT桌面環境(sudo apt install lubuntu-desktop),需要禁用connman.service和NetworkManager.service。
sudo systemctl disable connman.service NetworkManager.service
多個 Wi-Fi 網絡
該/etc/wpa_supplicant.conf配置文件可以包含多個Wi-Fi網絡。wpa_supplicant 將根據配置文件中網絡塊的順序、網絡安全級別和信號強度自動選擇最佳網絡。
要添加第二個 Wi-Fi 網絡,請運行
wpa_passphrase your-ESSID your-wifi-passphrase | sudo tee -a /etc/wpa_supplicant.conf
請注意,您需要將-a選項與tee命令一起使用,該選項會將新的 Wifi 網絡附加到文件中,而不是刪除原始內容。
無線網絡安全
請勿在 Wi-Fi 路由器中使用WPA2 TKIP或WPA2 TKIP+AES作為加密方法。TKIP 不再被認為是安全的。您可以使用WPA2-AES作為加密方法。