NetworkManager
NetworkManager 是一個為系統提供檢測和配置功能以便自動連接到網絡的程序。NetworkManager 的功能對無線和有線網絡都很有用。對於無線網絡,NetworkManager 偏好已知的無線網絡,並能切換到最可靠的網絡。能感知 NetworkManager 的應用程式可以切換在線和離線模式。比起無線連接,NetworkManager 更偏好有線連接,且支持數據機連接和一些類型的 VPN。NetworkManager 最初由 Red Hat 開發,現在由 GNOME 管理。
可以通過安裝 networkmanager包 軟體包獲取 NetworkManager。此軟體包包含一個守護程序、一個命令行界面(nmcli)和一個基於 curses 的界面(nmtui)。
安裝完成後,啟動/啟用 NetworkManager.service。NetworkManager 守護進程啟動後,會自動連接到已配置且可用的「系統連接」。「用戶連接」和未配置的連接需要通過 nmcli 或 applet 進行配置和連接。
- 請確保沒運行其它網絡配置服務;多個網絡服務會發生衝突。可以用
systemctl --type=service查看正在運行的服務列表,然後停止它們。參見#配置以啟用 NetworkManager 服務。 - 如果 systemd-resolved 沒有啟動,錯誤消息將會淹沒日誌。詳見後面的 Unit dbus-org.freedesktop.resolve1.service not found 部分。
- nm-connection-editor包 提供圖形界面;
-
network-manager-applet包 提供系統托盤圖標(
nm-applet)。
NetworkManager 使用 ModemManager 提供移動寬帶連接。
安裝 modemmanager包 和 usb_modeswitch包。然後啟用並啟動 ModemManager.service。
可能需要重新啟動 NetworkManager.service 才能使其檢測 ModemManager。重新啟動後,重新插入數據機應該就可以識別了。
從前端界面(例如 nm-connection-editor包)添加連接並將連接類型選擇為 broadband,選擇 ISP 和套餐, mobile-broadband-provider-info包 會自動填入 APN 和其它設置。
安裝 ppp包 以支持 PPPoE / DSL 連接。使用 nm-connection-editor 添加一個新的 DSL/PPPoE 連接。
從 1.16 版本開始 NetworkManager 原生支持 WireGuard,它只需要 wireguard 內核模塊。詳見 WireGuard in NetworkManager 博客文章。
對其他類型 VPN 的支持基於一個插件系統。它們在以下軟體包中提供:
- networkmanager-openconnect包 支持 OpenConnect
- networkmanager-openvpn包支持 OpenVPN
- networkmanager-pptp包 支持 PPTP Client
- networkmanager-strongswan包 支持 strongSwan
- networkmanager-vpnc包
- networkmanager-fortisslvpn-gitAUR
- networkmanager-iodine-gitAUR
- networkmanager-libreswanAUR
- networkmanager-l2tp包
- networkmanager-sshAUR
- network-manager-sstp包
- 要在使用 VPN 時獲得完整的 DNS 解析,請設置條件轉發。
- 這些插件可能沒有文檔化的命令行界面,或者在沒有運行 applet 的情況下根本無法工作。如果您使用的是常規 DE,那麼這不是問題;如果不是,那麼您應該在配置或激活連接時運行 #nm-applet,來顯示必要的對話框。[1]
NetworkManager 附帶 nmcli(1) 和 nmtui(1)。
顯示附近的 Wi-Fi 網絡:
$ nmcli device wifi list
連接到 Wi-Fi 網絡:
$ nmcli device wifi connect SSID_或_BSSID password 密码
連接到隱藏的 Wi-Fi 網絡:
$ nmcli device wifi connect SSID_或_BSSID password 密码 hidden yes
連接到 wlan1 網絡接口上的 Wi-Fi:
$ nmcli device wifi connect SSID_或_BSSID password 密码 ifname wlan1 profile_name
斷開網絡接口上的連接:
$ nmcli device disconnect ifname eth0
顯示連接列表及其名稱、UUID、類型和支持設備:
$ nmcli connection show
激活連接(即使用現有配置文件連接到網絡):
$ nmcli connection up name_或_uuid
刪除連接:
$ nmcli connection delete name_或_uuid
顯示所有網絡設備及其狀態:
$ nmcli device
關閉 Wi-Fi:
$ nmcli radio wifi off
設置的完整列表參見 nm-settings(5)。
首先需要獲取連接列表:
$ nmcli connection
NAME UUID TYPE DEVICE Wired connection 2 e7054040-a421-3bef-965d-bb7d60b7cecf ethernet enp5s0 Wired connection 1 997f2782-f0fc-301d-bfba-15421a2735d8 ethernet enp0s25 MY-HOME-WIFI-5G 92a0f7b3-2eba-49ab-a899-24d83978f308 wifi --
第一列可以作為連接 connection-id, 本示例中使用 Wired connection 2。
創建後有三種方法可以配置 Wired connection 2:
- nmcli 交互式編輯器
-
nmcli connection edit 'Wired connection 2'.
Usage is well documented from the editor.
- nmcli 命令行界面
-
nmcli connection modify 'Wired connection 2' setting.property value. 用法參見 nmcli(1) 。 For example you can change its IPv4 route metric to 200 usingnmcli connection modify 'Wired connection 2' ipv4.route-metric 200command.
To remove a setting pass an empty field ("") to it like this:
nmcli connection modify 'Wired connection 2' setting.property ""
- 連接文件
- 在
/etc/NetworkManager/system-connections/中修改對應的Wired connection 2.nmconnection文件。
別忘了使用nmcli connection reload重新加載配置文件。
NetworkManager 提供了一個用於管理連接、系統主機名和無線開關的文本用戶界面(TUI)。可以通過運行 nmtui 來啟動。
為把 NetworkManager 與桌面環境集成,您可以安裝一個 applet。這不僅便於您輕鬆訪問網絡選擇和配置界面,更能提供一個安全存儲網絡密鑰的代理程序。這種圖形前端往往顯示在系統托盤(或通知區域),從而允許用戶選擇網絡或者配置 NetworkManager。各種桌面環境都有自己的 applet。你也可以使用 #nm-applet。
GNOME 在網絡設置裡有內置的配置工具。
安裝 plasma-nm包 軟體包。然後通過面板的選項 > 添加部件 > 網絡將其添加到 KDE 的任務欄上。
network-manager-applet包 是一個工作在 Xorg 環境下的 GTK 3 前端,帶有一個系統托盤。
為了存儲連接密碼,您可以安裝實現了 Secret Service D-Bus API 的應用程式,如 GNOME/Keyring、KDE Wallet 和 KeePassXC。
請注意,如果對某個連接啟用了 對其他用戶可用 選項,NetworkManager 就會明文存儲密碼,不過相應的文件只能被 root 或者其他使用 nm-applet 的用戶訪問。參照 #加密的 Wi-Fi 密碼。
要在沒有系統托盤的情況下運行 nm-applet,可以使用 trayer包 或 stalonetray包。例如,可以在自己的可執行文件路徑中添加這樣的腳本:
nmgui
#!/bin/sh nm-applet 2>&1 > /dev/null & stalonetray 2>&1 > /dev/null killall nm-applet
當關閉 stalonetray 窗口的時候,它也會關閉 nm-applet,所以當你完成網絡配置後它就不會再占用內存。
applet 可以顯示一些事件的通知,比如連接或斷開 WiFi。要顯示這些消息,確保你已安裝了一個通知伺服器——請參見 Desktop notifications。如果在沒有通知伺服器的情況下使用,那麼可能會在 stdout/stderr 中看到一些消息,並且 applet可能會掛起。請參見[2]。
要在禁用通知的情況下使用 nm-applet,請使用以下命令運行 applet:
$ nm-applet --no-agent
--no-agent 選項啟動 nm-applet,將無法通過點擊列表中的項目來連接新的加密 Wi-Fi 網絡,因為不會彈出密碼輸入對話框。journal 中會顯示 no secrets: No agents were available for this request。從 1.18.0 版本開始,官方軟體包 network-manager-applet包 中包含 Appindicator 支持。要在 Appindicator 環境中使用 nm-applet,請使用以下命令啟動 applet:
$ nm-applet --indicator
networkmanager-dmenu-gitAUR 是一個通過 dmenu 或 rofi 而不是 nm-applet 管理 NetworkManager 連接的小腳本。它提供了所有必要的功能, 例如連接到已有的 NetworkManager wifi 或有線網絡、連接到新的 wifi 網絡、在需要的時候詢問密碼、連接到已有的 VPN、啟用/停用網絡連接、運行 nm-connection-editor 圖形界面、連接到藍牙網絡等等。
Pantheon 的 switchboard包 搭配 switchboard-plug-network包 和 nm-connection-editor包,提供了一種與桌面環境無關的方式來配置 NetworkManager。可以通過以下命令運行:
$ io.elementary.settings
NetworkManager 需要一些額外的步驟才能正常運行。請確保已按照網絡配置#設置計算機名一節的描述配置 /etc/hosts。
NetworkManager 的全局配置文件位於 /etc/NetworkManager/NetworkManager.conf。額外的配置文件可以放在 /etc/NetworkManager/conf.d/ 中。全局的默認配置通常不需要改動。
編輯配置文件後,可以使用以下命令應用更改:
# nmcli general reload
啟用 NetworkManager.service 的同時也會啟用 NetworkManager-wait-online.service,這是一個一次性(oneshot)系統服務,用於等待網絡配置完成。後者包含 WantedBy=network-online.target,因此只有當 network-online.target 本身被啟用或被其他單元拉取時才會完成。另見 systemd#Running services after the network is up。
默認情況下,NetworkManager-wait-online.service 會等待 NetworkManager 啟動完成,而不是特指等待網絡連接可用(參見 nm-online(1))。如果 NetworkManager-wait-online.service 在網絡真正連通之前就結束,可能會導致啟動時某些服務失敗,可以通過 附加配置片段 移除 ExecStart 行中的 -s 參數來解決:
[Service] ExecStart= ExecStart=/usr/bin/nm-online -q
注意這可能會導致其他問題。
在某些情況下,由於超時太短,服務仍然無法在啟動時成功啟動。編輯服務,將 NM_ONLINE_TIMEOUT 從 60 改為更大的值。
默認情況下,活動的本地會話中的所有用戶都能在沒有密碼的情況下改變大多數網絡設置。參照 General troubleshooting#會話權限檢查會話類型。在大多數情況下,一切都應該開箱即用。
一些操作(例如改變系統計算機名)需要管理員密碼。這時,需要將自己添加到 wheel 用戶組並運行一個 polkit 身份認證組件,它將提示輸入密碼。
對於遠程會話(例如 headless VNC),有幾種方法獲得使用 NetworkManager 所需的權限:
- 將自己添加到
wheel用戶組。執行每個操作時都需要輸入自己的密碼。注意你的帳戶同時被賦予了此帳戶組的其他權限,例如使用 sudo 命令時無需輸入 root 密碼。 - 將自己添加到
network用戶組,同時創建一個包含以下內容的/etc/polkit-1/rules.d/50-org.freedesktop.NetworkManager.rules文件:polkit.addRule(function(action, subject) { if (action.id.indexOf("org.freedesktop.NetworkManager.") == 0 && subject.isInGroup("network")) { return polkit.Result.YES; } });network用戶組中的所有用戶都將能免密碼管理網絡,這意味著不需要運行 polkit 身份認證組件,因此在 SSH 會話中也能工作。
NetworkManager 支持一些代理設置。雖然這些設置無法直接通過 nmtui 修改,但 nm-applet 和 nmcli 支持它們,也可以通過調度腳本運行自定義代理命令。 請參閱 nm-settings-nmcli(5) 中的代理設置與 #Dispatcher examples。
此外,如果你使用 GNOME 或 KDE,你可以使用 proxydriverAUR,它將使用 NetworkManager 的信息處理代理設置。
要讓 proxydriver 能夠改變代理設置,你需要執行下面的命令,來讓NetworkManager作為GNOME啟動過程的一部分。(參見 GNOME#自啟動)。
$ xhost +si:localuser:username
參見 Proxy server。
NetworkManager 可以在連接到網絡後嘗試訪問一個 Web 伺服器,以確定該網絡是否需要進行進一步認證(比如基於強制網絡門戶的網頁認證)。 默認網址(在 /usr/lib/NetworkManager/conf.d/20-connectivity.conf 中配置)是 ping.archlinux.org。要使用其他 Web 伺服器或禁用連接檢查,請創建 /etc/NetworkManager/conf.d/20-connectivity.conf,請參見 NetworkManager.conf(5) § CONNECTIVITY SECTION。如下配置文件示例使用了由 GNOME 提供的另一個 Web 伺服器 (並不一定要使用 GNOME 桌面環境):
/etc/NetworkManager/conf.d/20-connectivity.conf
[connectivity] uri=http://nmcheck.gnome.org/check_network_status.txt
若要禁用 NetworkManager 的連接性檢查(有時候一些 VPN 會阻止這類檢查),請使用以下配置:
/etc/NetworkManager/conf.d/20-connectivity.conf
[connectivity] enabled=false
如果您連接的網絡提供了強制門戶(一般用於網頁認證), 桌面管理器會自動打開一個窗口並要求您輸入憑據。如果您的桌面管理器沒有這麼做,則您可以安裝 capnet-assist包 軟體包 (然而其 NetworkManager 的 disapatcher 腳本目前是壞的)。或者您也可以參考以下內容創建一個自己的 dispatcher 腳本。
/etc/NetworkManager/dispatcher.d/90-open_captive_portal
#!/bin/sh -e
# Script to dispatch NetworkManager events
#
# Runs shows a login webpage on walled garden networks.
# See NetworkManager(8) for further documentation of the dispatcher events.
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
if [ -x "/usr/bin/logger" ]; then
logger="/usr/bin/logger -s -t captive-portal"
else
logger=":"
fi
wait_for_process() {
PNAME=$1
while [ -z "$(/usr/bin/pgrep $PNAME)" ]; do
sleep 3;
done
}
#launch the browser, but on boot we need to wait that nm-applet starts
start_browser() {
local user="$1"
local display="$2"
export DISPLAY="$display"
wait_for_process nm-applet
export XAUTHORITY="/home/$user/.Xauthority"
export GTK_IM_MODULE=fcitx:ibus
$logger "Running browser as '$user' with display '$display' to login in captive portal"
sudo -u "$user" --preserve-env=DISPLAY,XAUTHORITY,GTK_IM_MODULE -H xdg-open http://capnet.elementary.io 2>&1 > /dev/null
}
# Run the right scripts
case "$2" in
connectivity-change)
$logger -p user.debug "dispatcher script triggered on connectivity change: $CONNECTIVITY_STATE"
if [ "$CONNECTIVITY_STATE" = "PORTAL" ]; then
# Match last column of who's output with ' :[at least one digit] '
who | awk '$NF ~ /\(:[0-9]+\)/ { print $1 " " substr($NF, 2, length($NF)-2) };' | \
while read user display; do
start_browser $user $display || $logger -p user.err "Failed for user: '$user' display: '$display'"
done
fi
;;
*)
# In a down phase
exit 0
;;
esac
請將該腳本設為可執行。但該腳本假設你使用的是 X,並且只是打開一個 HTTP 頁面,可能並不適用於所有人。
你需要重啟 NetworkManager.service 或重新啟動系統,腳本才會開始生效。一旦啟用,當檢測到你處於強制門戶(captive portal)環境中時,調度腳本應會自動打開登錄窗口。
一個簡單的解決方案是 captive-portal-sh —— 一個用於獲取強制門戶 URL 並在默認瀏覽器中打開的 shell 腳本(僅適用於 Wayland 用戶)。
另一個方案是基於 Google Chrome 的 captive-browser-gitAUR。
一些較老的 Wi-Fi 晶片(例如 Broadcom BCM4360)需要使用專有的 wl 驅動,該驅動不支持許多強制門戶熱點在顯示登錄頁面前所使用的 OWE/橢圓曲線握手(Elliptic-Curve handshake)。
通過將 NetworkManager 的 Wi-Fi 後端切換為 iwd(參見 #Using iwd as the Wi-Fi backend),可以在現有驅動基礎上由用戶空間實現完整的 OWE 密鑰交換,從而完成加密關聯、獲取 DHCP 租約,並觸發門戶的 「PORTAL」 狀態。
完成這些步驟後,任何調度腳本或瀏覽器啟動器都可以可靠地彈出登錄頁面,即使是原本無法完全連接的硬體也能正常訪問網絡。
NetworkManager 默認使用內置的 DHCP 客戶端。內置的 DHCPv4 插件基於 nettools 的 n-dhcp4 庫,而內置的 DHCPv6 插件的代碼基於 systemd-networkd。
要使用不同的 DHCP 客戶端,安裝以下之一:
要更改 DHCP 客戶端後端,請在 /etc/NetworkManager/conf.d/ 中的配置文件中設置選項 main.dhcp=dhcp 客戶端名稱。例如:
/etc/NetworkManager/conf.d/dhcp-client.conf
[main] dhcp=dhclient
- NetworkManager 不支持使用 dhcpcd 進行 IPv6 配置。 詳見NetworkManager issue #5.如果將 dhcpcd 設置為 DHCP 客戶端,NetworkManager 將為 DHCPv6 使用內置 DHCP 客戶端。
- 不要啟用 dhclient包 和 dhcpcd包 軟體包提供的 systemd 單元。它們會與 NetworkManager 衝突,詳情請參見#安裝中的注釋。
NetworkManager 的 DNS 管理在 GNOME 項目的 wiki 頁面中進行了描述——Projects/NetworkManager/DNS。
NetworkManager 有一個插件,用於啟用 DNS 緩存和條件轉發 (以前在 NetworkManager 的文檔中稱為「拆分 DNS」)。此設置的優點是 DNS 查找將被緩存,縮短了解析時間,並且 VPN 主機的 DNS 查找將路由到相關 VPN 的 DNS 伺服器。如果您連接到多個 VPN,這尤其有用。
/etc/resolv.conf 是指向 /run/systemd/resolve/stub-resolv.conf、/run/systemd/resolve/resolv.conf、/lib/systemd/resolv.conf 或 /usr/lib/systemd/resolv.conf 的符號連結,NetworkManager 將自動選擇 systemd resolved。要使用 dnsmasq,必須首先刪除該符號連結,然後重新啟動 NetworkManager。確保已安裝 dnsmasq包。然後在 /etc/NetworkManager/conf.d/ 中的配置文件中設置 main.dns=dnsmasq:
/etc/NetworkManager/conf.d/dns.conf
[main] dns=dnsmasq
現在以 root 身份運行 nmcli general reload。NetworkManager 將自動啟動 dnsmasq 並將 127.0.0.1 添加到 /etc/resolv.conf。原來的 DNS 伺服器可以在 /run/NetworkManager/no-stub-resolv.conf 中找到。你可以通過使用 drill example.com 進行兩次相同的 DNS 查詢,來確認是否正在使用 dnsmasq,同時驗證伺服器和查詢時間。
- 無需啟動
dnsmasq.service或編輯/etc/dnsmasq.conf。NetworkManager 不通過 systemd 服務啟動 dnsmasq,也不會讀取 dnsmasq 的默認配置文件。 - NetworkManager 啟動的 dnsmasq 實例會綁定到
127.0.0.1:53,因此你不能在同一地址和埠上運行其他軟體(包括dnsmasq.service)。
可以通過在 /etc/NetworkManager/dnsmasq.d/ 中創建配置文件為 dnsmasq 創建自定義配置。例如,要更改 DNS 緩存(存儲在 RAM 中)的大小:
/etc/NetworkManager/dnsmasq.d/cache.conf
cache-size=1000
可以使用以下命令檢查配置文件語法:
$ dnsmasq --test --conf-file=/dev/null --conf-dir=/etc/NetworkManager/dnsmasq.d
所有可用選項請參見 dnsmasq(8)。
在 NetworkManager 中啟用 dnsmasq 可能會破壞本應正常工作的 IPv6-only DNS 查詢(例如 drill -6 [hostname])。為了解決這個問題,可以創建以下文件,配置 dnsmasq 也監聽 IPv6 迴環地址:
/etc/NetworkManager/dnsmasq.d/ipv6-listen.conf
listen-address=::1
此外,dnsmasq 也不優先考慮上游 IPv6 DNS。遺憾的是,NetworkManager 無法執行此操作 (Ubuntu Bug)。解決方法是在 NetworkManager 配置中禁用 IPv4 DNS(如果有)。
默認情況下,NetworkManager 啟動的 dnsmasq 實例不會驗證 DNSSEC,因為它是使用 --proxy-dnssec 選項啟動的。它將信任從上游 DNS 伺服器獲得的任何 DNSSEC 信息。
要讓 dnsmasq 驗證 DNSSEC(這會破壞不支持 DNSSEC 的 DNS 伺服器的解析),請創建以下配置文件:
/etc/NetworkManager/dnsmasq.d/dnssec.conf
conf-file=/usr/share/dnsmasq/trust-anchors.conf dnssec
NetworkManager 能把 systemd-resolved 作為DNS解析器和緩存。在使用它之前,確保你已正確配置 systemd-resolved 並且 systemd-resolved.service 已經啟動。
如果 /etc/resolv.conf 是一個指向 /run/systemd/resolve/stub-resolv.conf、/run/systemd/resolve/resolv.conf 或 /usr/lib/systemd/resolv.conf 的符號連結,systemd-resolved會自動啟用。
你也可以通過編寫 /etc/NetworkManager/conf.d/ 下的配置文件,設置 main.dns=systemd-resolved 來顯式啟用它:
/etc/NetworkManager/conf.d/dns.conf
[main] dns=systemd-resolved
如果 openresolv 有適用於你的本地 DNS resolver 的監聽者,請設置該監聽者並 配置 NetworkManager 使用 openresolv。
由於 NetworkManager 向 resolvconf 廣播的是單一「接口」,因此無法在兩個 NetworkManager 連接之間實現條件轉發。詳見 NetworkManager issue 153。
如果你在 /etc/resolvconf.conf 中設置了 private_interfaces="*"[5],可以部分緩解該問題。任何不在搜索域列表中的查詢都不會被轉發,而是根據本地解析器的配置處理,例如轉發到其他 DNS 伺服器或從 DNS 根遞歸解析。
要為所有連接設置 DNS 伺服器,請在 NetworkManager.conf(5) 中的 [global-dns-domain-*] 的部分下使用 servers=serveripaddress1,serveripaddress2,serveripaddress3 的格式指定它們。例如:
/etc/NetworkManager/conf.d/dns-servers.conf
[global-dns-domain-*] servers=::1,127.0.0.1
- 如果您使用 NetworkManager's dnsmasq or systemd-resolved plugin 或 openresolv subscribers,則不要使用
servers=選項指定環回地址,因為這可能會破壞 DNS 解析。 - 指定的伺服器不會被發送到 systemd-resolved,而是使用連接的 DNS 伺服器。
設置方法取決於所使用的前端類型;通常流程是右鍵點擊程序小工具,編輯(或創建)一個配置文件,然後選擇 DHCP 類型為 自動(指定地址)。
需要輸入 DNS 地址,格式通常為:127.0.0.1, DNS-server-one, ...。
要為每個連接設置 DNS 伺服器,需要修改 連接設置 中的 ipv4.dns 和 ipv6.dns(以及對應的 dns-search 和 dns-options)參數。
如果 method 設置為 auto(即使用 DHCP/RA),則需要將 ignore-auto-dns 設置為 yes。
要使用 DNS over TLS(需要 systemd-resolved),請使用語法 dns=ip.address#servername; 指定 DNS 伺服器,同時將 connection.dns-over-tls 設置為 2。例如,要使用 Quad9:
/etc/NetworkManager/system-connections/Example Wi-Fi.nmconnection
... [connection] ... dns-over-tls=2 [ipv4] ... dns=9.9.9.9#dns.quad9.net;149.112.112.112#dns.quad9.net; ignore-auto-dns=true [ipv6] ... dns=2620:fe::fe#dns.quad9.net;2620:fe::9#dns.quad9.net; ignore-auto-dns=true
NetworkManager 對 /etc/resolv.conf 的管理方式可以通過 main.rc-manager 選項配置。 networkmanager包 會把它設置為 symlink,而不是上游默認的 auto。 具體設置及其值在 NetworkManager.conf(5) 手冊頁中有說明。
NetworkManager 還通過調度程序腳本提供鉤子,可用於在網絡變化後修改 /etc/resolv.conf。有關更多信息,請參見 #使用 NetworkManager 調度網絡服務和NetworkManager(8)。
- 如果 NetworkManager 被配置為使用 dnsmasq 或 systemd-resolved,則相應的環回地址將寫入
/etc/resolv.conf。 - NetworkManager (要)寫入
/etc/resolv.conf的resolv.conf文件位於/run/NetworkManager/resolv.conf。 -
/run/NetworkManager/no-stub-resolv.conf中包含 NetworkManager 獲取到的 DNS 伺服器和搜索域。
要防止 NetworkManager 修改 /etc/resolv.conf,請在 /etc/NetworkManager/conf.d/ 下的配置文件中設置 main.dns=none 選項:
/etc/NetworkManager/conf.d/dns.conf
[main] dns=none
main.systemd-resolved=false,這樣 NetworkManager 就不會將 DNS 配置發送給 systemd-resolved。之後 /etc/resolv.conf 可能是一個損壞的符號連結,你需要將其刪除。然後,重新創建一個新的 /etc/resolv.conf 文件。
- 在使用 systemd-resolved 時,請不要設置
main.rc-manager=resolvconf;而應該正確創建一個 /etc/resolv.conf 的 symlink 或者 將 NetworkManager 顯式配置為使用 systemd 解析. - 如果您沒有使用 systemd-resolved ,請勿安裝 systemd-resolvconf包 軟體包。除非
systemd-resolved.service啟動,否則它將破壞所有使用 resolconf 的網絡軟體(不僅僅是 NetworkManager)。
要將 NetworkManager 配置為使用 openresolv,請在 /etc/NetworkManager/conf.d/ 目錄下的配置文件中設置 main.rc-manager=resolvconf:
/etc/NetworkManager/conf.d/rc-manager.conf
[main] rc-manager=resolvconf
可以根據當前的連接分配 firewalld 區域。例如,在工作時限制較多,在家時限制較少。
也可以通過 NetworkManager 調度實現。
有些服務只有聯網時才有意義,例如 NFS, SMB 和 NTPd。NetworkManager 可以在連接網絡後啟動這些服務,並在網絡關閉時停止它們。
要使用這一功能, 需要 enable 並 start NetworkManager-dispatcher.service。
服務啟動後,可以將腳本加到 /etc/NetworkManager/dispatcher.d 目錄。
這些腳本必須屬於 root, 否則不會被執行。為了安全起見, 所屬用戶組也設置為 root:
# chown root:root /etc/NetworkManager/dispatcher.d/10-script.sh
而且腳本必須是可執行的。
# chmod 755 scriptname
腳本將在連接網絡時按字母表順序運行,並在網絡停止時反向停止。要保證啟動順序,可以在前面加數字,例如 10_portmap 或 30_netfs 這樣就能保證 portmapper 在 NFS 掛載之前啟動。
腳本將接收如下參數:
-
Interface name: 例如
eth0 - Action: up, down, vpn-up, vpn-down, ... (完整列表請參考 NetworkManager(8))
如果一切運行良好, 那麼這一節就可以跳過了。然而,如果你要運行的 dispatcher 腳本需要花費更多時間來運行,則可能出現一些問題。一開始,默認的內部超時時間為 3 秒,如果腳本未在該時間內執行完畢,則會被終止。後來這一超時被延長到大約 20 秒(參見 Bugtracker)。如果 20 秒仍然不夠,那麼您可以通過修改 dispatcher 服務文件 /usr/lib/systemd/system/NetworkManager-dispatcher.service 來讓它在退出後保持活動。
/etc/systemd/system/NetworkManager-dispatcher.service
.include /usr/lib/systemd/system/NetworkManager-dispatcher.service [Service] RemainAfterExit=yes
運行修改後的 NetworkManager-dispatcher 服務並將其設置為開機啟動。
RemainAfterExit 那一行後會讓 dispatcher 一直運行。不幸的是, dispatcher 必須在再次運行腳本前被關閉。這意味著腳本只能被運行一次。因此, 除非超時確實引起了問題, 否則不要修改服務文件。安裝 tzupdateAUR 並創建一個可執行腳本:
/etc/NetworkManager/dispatcher.d/update-timezone.sh
#! /bin/bash
# 网络连接时自动设置时区
iface=$1
action=$2
if [[ $iface != lo && $action == up ]]; then
tz=$(tzupdate -s 1 -p 2>/dev/null)
if [[ -n $tz && -r /usr/share/zoneinfo/$tz ]]; then
timedatectl set-timezone $tz
fi
fi
如果需要,可以將條件 $iface != lo 修改為匹配特定接口。
由於該腳本在一個非常受限制的環境中運行, 為了連接上SSH agent, 你必須 export SSH_AUTH_SOCK。 這裡有幾種不同方式, 參照
here 獲取更多詳細信息. 以下示例需要 gnome-keyring , 如果 gnome-keyring 沒解鎖,將需要你輸入密碼. 如果 NetworkManager 設置為登錄後自動連接, 很有可能因為 gnome-keyring 還沒啟動導致失敗(轉入睡眠). 對應的 UUID 可以通過命令 nmcli con status 或 nmcli con list 查得。
#!/bin/sh
USER='username'
REMOTE='user@host:/remote/path'
LOCAL='/local/path'
interface=$1 status=$2
if [ "$CONNECTION_UUID" = "uuid" ]; then
case $status in
up)
# sleep 10
SSH_AUTH_SOCK=$(find /tmp -maxdepth 1 -type s -user "$USER" -name 'ssh')
export SSH_AUTH_SOCK
su "$USER" -c "sshfs $REMOTE $LOCAL"
;;
down)
fusermount -u "$LOCAL"
;;
esac
fi
一些 SMB 共享僅在某些網絡或位置(例如在家中)可用。您可以使用 dispatcher 腳本來僅掛載當前位置中存在的 SMB 共享。
下面的腳本將檢查我們是否連接到一個特定的網絡,並掛載共享 :
/etc/NetworkManager/dispatcher.d/30-mount-smb.sh
#!/bin/sh
# Find the connection UUID with "nmcli connection show" in terminal.
# All NetworkManager connection types are supported: wireless, VPN, wired...
if [ "$2" = "up" ]; then
if [ "$CONNECTION_UUID" = "uuid" ]; then
mount /your/mount/point &
# add more shares as needed
fi
fi
以下腳本將在正常斷開與特定網絡的連接之前卸載所有 SMB 共享:
/etc/NetworkManager/dispatcher.d/pre-down.d/30-umount-smb.sh
#!/bin/sh if [ "$CONNECTION_UUID" = "uuid" ]; then umount -a -l -t cifs fi
pre-down.d 子目錄中,否則它將在任何連接狀態更改時卸載所有共享。下面的腳本將嘗試在意外斷開與特定網絡的連接後卸載所有 SMB 共享 :
/etc/NetworkManager/dispatcher.d/40-umount-smb.sh
#!/bin/sh
if [ "$CONNECTION_UUID" = "uuid" ]; then
if [ "$2" = "down" ]; then
umount -a -l -t cifs
fi
fi
- 自 NetworkManager 0.9.8 起,關閉或重啟時不會執行 pre-down 和 down 事件,詳見 該錯誤報告 獲取更多信息。
- 之前的 umount 腳本仍然可能導致實際訪問掛載點的應用程式「掛起」。
另一種方法是使用 NFS#Using a NetworkManager dispatcher 中的腳本 :
/etc/NetworkManager/dispatcher.d/30-smb.sh
#!/bin/sh
# Find the connection UUID with "nmcli con show" in terminal.
# All NetworkManager connection types are supported: wireless, VPN, wired...
WANTED_CON_UUID="CHANGE-ME-NOW-9c7eff15-010a-4b1c-a786-9b4efa218ba9"
if [ "$CONNECTION_UUID" = "$WANTED_CON_UUID" ]; then
# Script parameter $1: network interface name, not used
# Script parameter $2: dispatched event
case "$2" in
"up")
mount -a -t cifs
;;
"down"|"pre-down"|"vpn-pre-down")
umount -l -a -t cifs >/dev/null
;;
esac
fi
noauto 選項的掛載,刪除此掛載選項或使用 auto 選項來允許 dispatcher 管理這些掛載。在 /etc/NetworkManager/dispatcher.d/pre-down/ 目錄下創建一個符號連結來捕獲 pre-down 事件 :
# ln -s ../30-smb.sh /etc/NetworkManager/dispatcher.d/pre-down.d/30-smb.sh
參見 NFS#Using a NetworkManager dispatcher.
其想法是,僅當 LAN 電纜拔下時(例如,從筆記本電腦底座上拔下時)才打開 Wi-Fi,一旦 LAN 電纜再次插入,Wi-Fi 將自動禁用。
創建以下 dispatcher 腳本 [6],並將其中的 LAN_interface 替換為您自己的網絡接口。
記得將腳本設置為可執行。你可以通過重啟 NetworkManager.service,運行 ip a,並檢查 wlp3s0(或你的 Wi-Fi 接口名)是否處於 state DOWN 來驗證腳本是否生效。如果遇到異常情況,請查看 NetworkManager-dispatcher.service 的 日誌。
/etc/NetworkManager/dispatcher.d/wlan_auto_toggle.sh
#!/bin/sh
if [ "$1" = "LAN_interface" ]; then
case "$2" in
up)
nmcli radio wifi off
;;
down)
nmcli radio wifi on
;;
esac
elif [ "$(nmcli -g GENERAL.STATE device show LAN_interface)" = "20 (unavailable)" ]; then
nmcli radio wifi on
fi
此部分示例演示如果自動連接到NetworkManager已定義的vpn-connection.首先創建調度腳本定義vpn連接之後的事務
iwgetid,需要安裝 wireless_tools包。/etc/NetworkManager/dispatcher.d/vpn-up
#!/bin/sh
VPN_NAME="name of VPN connection defined in NetworkManager"
ESSID="Wi-Fi network ESSID (not connection name)"
interface=$1 status=$2
case $status in
up|vpn-down)
if iwgetid | grep -qs ":\"$ESSID\""; then
nmcli connection up id "$VPN_NAME"
fi
;;
down)
if iwgetid | grep -qs ":\"$ESSID\""; then
if nmcli connection show --active | grep "$VPN_NAME"; then
nmcli connection down id "$VPN_NAME"
fi
fi
;;
esac
如果想在任意 Wi-Fi 網絡都可以自動連接 VPN, 你可以用這樣給 ESSID 賦值: ESSID=$(iwgetid -r)。記住要給腳本設置相應的權限, 參見上文。
由於 VPN secrets 保管方式的原因, 連接依然可能會失敗並且 NetworkManager-dispatcher.service 會報錯 'no valid VPN secrets'。這樣就需要用下面方法讓腳本可以獲取 VPN 密碼:
或者直接在 VPN 配置文件中加入 vpn-secrets 並寫入密碼:
1. 可以選擇編輯 VPN 連接的配置文件讓 NetworkManager 自己儲存 secrets 而不是把 secrets 保存在不能被root訪問的 keyring 中: 打開 /etc/NetworkManager/system-connections/name of your VPN connection, 把 password-flags 以及 secret-flags 從 1 改為 0。
如果還不行,需要在安全位置創建 passwd-file,權限和 dispatcher 腳本一致,並添加如下內容:
/path/to/passwd-file
vpn.secrets.password:YOUR_PASSWORD
腳本也需要做出相應修改:
/etc/NetworkManager/dispatcher.d/vpn-up
#!/bin/sh
VPN_NAME="name of VPN connection defined in NetworkManager"
ESSID="Wi-Fi network ESSID (not connection name)"
interface=$1 status=$2
case $status in
up|vpn-down)
if iwgetid | grep -qs ":\"$ESSID\""; then
nmcli connection up id "$VPN_NAME" passwd-file /path/to/passwd-file
fi
;;
down)
if iwgetid | grep -qs ":\"$ESSID\""; then
if nmcli connection show --active | grep "$VPN_NAME"; then
nmcli connection down id "$VPN_NAME"
fi
fi
;;
esac
2. 修改 password-flags,將密碼加入配置文件的 vpn-secrets 部分:
[vpn] .... password-flags=0 [vpn-secrets] password=your_password
許多商業 VPN 供應商僅支持 IPv4。這意味著所有 IPv6 流量都會繞過 VPN,使 VPN 變得毫無用處。為了避免這種情況,可以使用 dispatcher 在 VPN 連接啟動時禁用所有 IPv6 流量。
/etc/NetworkManager/dispatcher.d/10-vpn-ipv6
#!/bin/sh case "$2" in vpn-up) echo 1 > /proc/sys/net/ipv6/conf/all/disable_ipv6 ;; vpn-down) echo 0 > /proc/sys/net/ipv6/conf/all/disable_ipv6 ;; esac
作為替代方案,可以使用調度器(dispatcher)臨時將 VPN 連接所用設備的 IPv6 模式設置為 link-local。這樣可以避免 NetworkManager 產生大量關於 IPv6 被禁用的日誌。如果有多個設備或連接提供 IPv6 連接,該腳本將無法正常工作,但可以調整腳本以遍歷多個設備。請注意,任何對連接的更改(通過 nmcli(1) 或 桌面環境)都會重新應用整個連接到設備,並重新啟用 IPv6(如果連接中啟用了 IPv6)。
/etc/NetworkManager/dispatcher.d/10-vpn-ipv6
#!/bin/sh
case "$2" in
vpn-up)
nmcli device modify "${DEVICE_IFACE}" ipv6.method link-local
;;
vpn-down)
nmcli device reapply "${DEVICE_IFACE}"
;;
esac
安裝 networkmanager-dispatcher-openntpdAUR 軟體包
當你在不同的網絡之間漫遊時 ( 例如公司的區域網,家裡的 WiFi,以及不時出現的其他 WiFi) ,你可能需要把 timesyncd 使用的 NTP 伺服器設置為 DHCP 提供的伺服器。但是,NetworkManager 本身不能與 systemd-timesyncd 通信來設置 NTP 伺服器。
dispatcher 可以解決這個問題。
Create the overlay directory for your systemd-timesyncd configuration /etc/systemd/timesyncd.conf.d if it does not already exist. Inside /etc/NetworkManager/dispatcher.d, put the following:
/etc/NetworkManager/dispatcher.d/10-update-timesyncd
#!/bin/sh
[ -z "$CONNECTION_UUID" ] && exit 0
INTERFACE="$1"
ACTION="$2"
case $ACTION in
up | dhcp4-change | dhcp6-change)
[ -n "$DHCP4_NTP_SERVERS" ] || exit
mkdir -p /etc/systemd/timesyncd.conf.d
cat <<-THE_END >"/etc/systemd/timesyncd.conf.d/${CONNECTION_UUID}.conf"
[Time]
NTP=$DHCP4_NTP_SERVERS
THE_END
systemctl restart systemd-timesyncd.service
;;
down)
rm -f "/etc/systemd/timesyncd.conf.d/${CONNECTION_UUID}.conf"
systemctl restart systemd-timesyncd.service
;;
esac
每次 NetworkManager 設置新的網絡連接(ACTION=up)或獲得現有連接的一些更新(ACTION=dhcp4-change 或 ACTION=dhcp6-change),並且提供的連接數據包含有關 NTP 伺服器(DHCP4_NTP_SERVERS)的信息時,都會將特定於連接的覆蓋配置文件寫入 /etc/systemd/timesyncd.conf.d,其中包含獲取到的 NTP 伺服器。每當連接被斷開(ACTION=down)時,特定於連接的覆蓋文件就會被刪除。每次更改 systemd-timesyncd 的配置後,都會重新啟動此服務以獲取更新的配置。為每個連接使用單獨的配置文件是為了避免 NetworkManager 並行管理兩個或多個連接時,配置中的不同 NTP 伺服器名稱被覆蓋,因為 up、dhcp4-change、dhcp6-change 和 down 操作可能以任意順序出現。
NetworkManager 托盤組件被設計成開機自動啟動,所以對大部分用戶來說,並不需要過多配置。但是如果你手動停用舊有的網絡設置斷網,你需要測試一下 NetworkManager 是否正常工作。首先啟動 NetworkManager.service.
有些托盤組件會提供給你一個 .desktop 文件以便通過系統菜單運行。如果沒有,那你就需要通過命令或者註銷重登錄系統來讓托盤組件運行。 一旦托盤組件運行了,它會自動請求網絡連接並通過 DHCP 伺服器來進行網絡配置。
在一些 non-xdg-compliant 窗口系統,比如在 awesome 中啟動 GNOME applet:
nm-applet --sm-disable &
如果需要靜態 IP,你需要配置 NetworkManager。一般來說,在托盤圖標上面點擊右鍵,選擇「編輯連接」即可。
NetworkManager 默認會在 /etc/NetworkManager/system-connections/ 中的連接文件當中以明文形式存儲密碼。要顯示存儲的密碼,使用以下命令:
# grep -r '^psk=' /etc/NetworkManager/system-connections/
密碼可以被文件系統中的 root 用戶和通過 GUI(如 nm-applet)訪問設置的用戶訪問。
最好將密碼以加密形式保存在密鑰環中,而不是明文。這樣做的缺點是必須為每個用戶設置連接。
更好的做法是以加密形式將密碼存儲在密鑰環中而不是以明文形式存儲,使用密鑰環的缺點是需要為每一個用戶單獨配置連接。
為了對密鑰環進行讀寫操作,必須有一個可用的機密代理,比如:
-
nmcliwith the--askoption - #前端中提及的任一圖形界面
如果這兩者都不可用,那麼身份驗證將失敗,並提示錯誤 no secrets: No agents were available for this request.
需要啟動密鑰環守護程序並解鎖密鑰環才能讓之後的東西工作。
此外,需要將 NetworkManager 配置為不存儲所有用戶的密碼。使用 GNOME 的 network-manager-applet包,從終端運行 nm-connection-editor,選擇一個網絡連接,單擊編輯,選擇 Wi-Fi 安全性選項卡,單擊密碼的右圖標並選擇只為此用戶存儲密碼。
若使用 KDE 的 plasma-nm包,請單擊該小部件,然後單擊右上角的設置圖標,再單擊網絡連接,在常規配置選項卡中,取消選中允許所有用戶連接到此網絡。如果勾選該選項,即使正在運行 keyring 守護程序,密碼仍將以明文形式存儲。
如果之前選擇了該選項又取消勾選了,則可能必須首先使用 重置 選項才能使密碼從文件中消失。或者,首先刪除連接並重新設置它。
使用 NetworkManager,您只要點擊幾下就可以共享你的 Internet 連接(例如,3G或者有線)。請注意 可能會干擾該功能。
您需要一個支持 AP 模式的 Wi-Fi 卡,請參閱軟體接入點#無線網卡必須支持AP模式了解詳細信息。
安裝dnsmasq包 軟體包。請注意 NetworkManager 會啟動自己的獨立於dnsmasq.service的 dnsmasq 實例,作為 DHCP 伺服器。有關注意事項,請參見 #dnsmasq。
創建共享連接:
- 點擊小部件並選擇創建新無線網絡.
- 按照嚮導操作(選擇 WPA2 或更高版本,請確保使用至少 8 個字符長的密碼,密碼太短會創建失敗)。
- 選擇 Hotspot(熱點) 或 Ad-hoc 作為 Wi-Fi 模式。
該連接將被保存供下次使用。
場景:您的設備能通過 Wi-Fi 上網,並且您希望通過以太網與其他設備共享網際網路連接,這一般被稱為 WISP。
要求:
-
安裝dnsmasq包 軟體包。請注意 NetworkManager 會啟動自己的獨立於
dnsmasq.service的 dnsmasq 實例,作為 DHCP 伺服器。有關注意事項,請參見 #dnsmasq。 - 您的網際網路連接設備和其他設備通過合適的以太網電纜連接(這通常意味著網線直連或兩者接到同一個交換機上)。
- 防火牆沒有阻止網絡連接共享。
步驟:
- 在終端裡運行
nm-connection-editor。 - 添加新的以太網連接
- 為新的連接起一個合適的名字
- 轉到 「IPv4 設置」 選項
- 在「方法」下選擇「共享給其他計算機」
- 保存
現在,您應該可以在 NetworkManager 的有線連接列表中看到您新創建的連接。
有些cron任務需要可用的網絡連接才能成功。你可能希望在網絡不可用時避免運行這些任務。為此,添加一個網絡的if 測試,該測試詢問NetworkManager的nm-tool 並檢查網狀態。下面展示的測試當任何接口可用時成功,當所有藉口都不可用時失敗。對於可能連接有線,無線或者關閉網絡的筆記本來說這很方便。
if [ $(nm-tool|grep State|cut -f2 -d' ') == "connected" ]; then
#Whatever you want to do if the network is online
else
#Whatever you want to do if the network is offline - note, this and the else above are optional
fi
例如,這對於一個運行fpupdate來更新F-Prot病毒掃描簽名的cron.hourly腳本很有幫助。另外,經過小的修改,使用nm-tool輸出的不同部分可以區分不同的網絡;例如,因為活躍的無線網絡連接有一個星號(asterisk'*')表示,你可以grep網絡名,然後grep星號。
NetworkManager 默認不會連接到需要密碼的網絡,僅在登錄後才會連接,要不登錄就連接網絡,請使用下面方式配置:
- 在面板中右鍵點擊
nm-applet圖標,選擇「編輯連接」,然後打開「無線」標籤頁 - 選擇你想操作的連接,點擊「編輯」按鈕
- 勾選「自動連接」和「對所有用戶可用」選項
- 此外,確保在「Wi-Fi 安全性」下選擇了「為所有用戶保存密碼(不加密)」
登出並重新登錄,完成。
雖然可以在連接時直接輸入,plasma-nm包 0.9.3.2-1及以上版本還支持從 KWallet 中獲取OpenConnect用戶名和密碼。
打開"KDE Wallet Manager"在"Network Management|Maps"下面查找你的OpenConnect VPN連接。點擊"Show values"並在這個表的鍵值"VpnSecrets"下輸入你的憑據(相應替代'username'和'password'):
form:main:username%SEP%username%SEP%form:main:password%SEP%password
下次你連接時,用戶名和密碼會出現在"VPN secrets"對話框中。
有時,可能希望Networkmanager忽略特定的設備,並且不為他們配置地址和路由。通過在/etc/NetworkManager/NetworkManager.conf中使用下述配置,你可以快速輕鬆地按照MAC或者接口名忽略設備。
[keyfile] unmanaged-devices=mac:00:22:68:1c:59:b1;mac:00:1E:65:30:D1:C4;interface-name:eth0
填入上述內容後,執行 # nmcli general reload 後,應該能在NetworkManager不改變已完成設置的情況下配置接口。
MAC 地址隨機化可以通過不向網絡公開真實的 MAC 地址來提高隱私。
NetworkManager 支持兩種類型的 MAC 地址隨機化:掃描期間的隨機化和網絡連接時的隨機化。這兩種模式都可以通過修改 /etc/NetworkManager/NetworkManager.conf 或在 /etc/NetworkManager/conf.d/ 中創建單獨的配置文件來配置,推薦使用後者,因為 NetworkManager 可能會覆蓋前者的配置文件。
Wi-Fi 掃描期間的隨機化默認情況下是啟用的,但是可以通過在 /etc/NetworkManager/NetworkManager.conf 或 /etc/NetworkManager/conf.d 下的專用配置文件中添加以下行來禁用 :
/etc/NetworkManager/conf.d/wifi_rand_mac.conf
[device] wifi.scan-rand-mac-address=no
可以為無線和以太網接口設置不同的網絡連接時的 MAC 地址隨機化模式。有關不同模式的更多細節,請參見 GNOME 博客文章。
在 MAC 地址隨機化方面,最重要的模式是 stable 和 random。當您連接到新網絡時,stable 會生成一個隨機 MAC 地址,並將兩者永久關聯。這意味著您每次連接到該網絡時都將使用相同的 MAC 地址。相比之下,random 每次連接到新的或以前已知的網絡時都會生成一個新的 MAC 地址。您可以通過在 /etc/NetworkManager/conf.d 下添加所需配置來配置 MAC 隨機化:
/etc/NetworkManager/conf.d/wifi_rand_mac.conf
[device-mac-randomization] # "yes" is already the default for scanning wifi.scan-rand-mac-address=yes [connection-mac-randomization] # Randomize MAC for every ethernet connection ethernet.cloned-mac-address=random # Generate a random MAC for each WiFi and associate the two permanently. wifi.cloned-mac-address=stable
要為特定連接配置 MAC 地址隨機化(例如,當網絡不支持隨機 MAC 地址時),請編輯該連接,將 802-11-wireless.cloned-mac-address 設置為其中一種模式(例如 stable 或 random)。
參考這篇 GNOME 博客文章了解更多詳情。
DHCPv6 唯一標識符(DUID)是 DHCPv6 客戶端用於向 DHCPv6 伺服器標識自身的值。NetworkManager 支持 3 種類型的 DUID:
- DUID-UUID (RFC 6355): 從通用唯一標識符(UUID)生成。
- DUID-LL (RFC 3315): 從鏈路層地址 ( 即 MAC 地址 ) 生成。
- DUID-LLT (RFC 3315): 從鏈路層地址加上時間戳生成。
如果使用了 NetworkManager 內置的 DHCP 客戶端(默認如此),則他會使用從機器 ID (/etc/machine-id) 生成的 DUID 來標識自身。這意味著機器上的所有網絡連接都用的是同一個 DUID,這可能會造成隱私洩露。
幸運的是,NetworkManager 能夠為每個連接提供唯一的 DUID,這些 DUID 來自連接的 stable-id 和每個主機的唯一密鑰。您可以通過在 /etc/NetworkManager/conf.d 下添加以下配置來啟用它 :
/etc/NetworkManager/conf.d/duid.conf
[connection] ipv6.dhcp-duid=stable-uuid
該選項同時還支持 stable-ll 和 stable-llt 等值。有關更多信息,請閱讀 nm-settings(5) § ipv6 setting 中 dhcp-duid 的說明。
默認情況下,NetworkManager 會為它發現的每個有線以太網連接生成一個連接配置文件。在生成連接時,它無法確定是否還有更多的以太網適配器可用。因此,它將第一個有線連接命名為「Wired connection 1」。你可以通過配置 no-auto-default(參見 NetworkManager.conf(5))來避免自動生成此連接,或者直接刪除它。之後,NetworkManager 會記住不再為該接口生成連接。
你也可以編輯該連接(並保存到磁碟)或刪除它。NetworkManager 不會重新生成新的連接。然後你可以將連接名稱改為你想要的任何名字。可以使用類似 nm-connection-editor包 的工具來完成這項任務。
為了啟用 experimental iwd backend, 要首先 安裝 iwd包 並創建如下配置文件:
/etc/NetworkManager/conf.d/wifi_backend.conf
[device] wifi.backend=iwd
你也可以選擇安裝 networkmanager-iwdAUR, 一個修改過的NetworkManager 包 ,專門用於和 iwd 共同工作,主要區別在於 iwd 是必須的 但是wpa_supplicant 在構建後可以卸載。
如果你想在網絡命名空間中運行 NetworkManager(例如,管理應由特定應用程式使用的設備),請在將設備移入命名空間之前先將其關閉:
$ ip link set dev MY_DEVICE down $ ip link set dev MY_DEVICE netns MY_NAMESPACE $ ip netns exec MY_NAMESPACE NetworkManager ... $ ip netns exec MY_NAMESPACE killall NetworkManager
否則,NetworkManager 之後會因 device is strictly unmanaged 錯誤而無法建立連接。
NetworkManager 可以設置為在連接到網際網路時自動連接 VPN,且可以針對每個網絡單獨配置。VPN 連接本身可以通過 GNOME 的 NetworkManager 前端添加,但要實現自動使用 VPN,必須使用 nmcli。其他前端可能沒有此限制。
首先,確保將 VPN 連接設置為對所有用戶可用。在 GNOME 中,這只需在 details 標籤頁下勾選一個選項。在 Identity 標籤頁中,點擊密碼欄位右側的圖標,將其設置為 為所有用戶保存密碼。
然後找到該 VPN 連接的 UUID,並將其添加到網際網路連接的 connection.secondaries 中:
# UUID=$(nmcli --get-values connection.uuid connection show VPN-连接名称) # nmcli connection modify 互联网连接名称 connection.secondaries "$UUID"
現在,當 NetworkManager 重啟後,並且你連接了已配置的網際網路連接,就會自動連接到 VPN。
嘗試連接到安全的 Wi-Fi 網絡時,既不提示輸入密碼,也不建立連接。如果沒有安裝密鑰環軟體包,這種情況就會發生。一個簡單的解決方案是安裝 gnome-keyring包。如果希望密碼以加密的形式存儲,按照 GNOME/Keyring 來設置 gnome-keyring-daemon。
當 NetworkManager 關閉但 pid(state)文件未刪除時,就會看到 Network management disabled 提示。此時,請手動刪除文件:
# rm /var/lib/NetworkManager/NetworkManager.state
如果在使用內置 DHCP 客戶端獲取 IP 地址時遇到問題,請考慮換一個 DHCP 客戶端,有關說明,請參閱 #DHCP 客戶端。這種解決方法可能會解決大型無線網絡(如 eduroam)中的問題。
如果在通過 DHCP 獲取 IP 地址時遇到問題,嘗試在 /etc/dhclient.conf 中添加以下內容:
interface "eth0" {
send dhcp-client-identifier 01:aa:bb:cc:dd:ee:ff;
}
其中 aa:bb:cc:dd:ee:ff 是網卡的 MAC 地址。MAC 地址可以使用 iproute2包 包中的 ip link show 接口 命令獲得。
參見 Mobile broadband modem#NetworkManager。
有時候在使用筆記本上的開關禁用 Wi-Fi 然後重新啟用後,NetworkManager 無法工作。這常常是 rfkill 的問題。要檢查驅動程序是否已告知 rfkill 無線適配器的狀態,請使用:
$ watch -n1 rfkill list all
如果開啟適配器後其標識符仍然顯示為 blocked,可嘗試如下命令手動 unblock(其中 X 是上面輸出的標識符編號):
# rfkill event unblock X
由於未解決的錯誤,將默認連接更改為靜態 IP 地址時,nm-applet 可能無法正確存儲配置更改,並將恢復為自動 DHCP。
要解決這個問題,必須在 nm-applet 中編輯默認連接(例如 "Auto eth0")、改變連接名稱(例如改成 "my eth0")、取消勾選"對所有用戶可用"複選框並根據需要改變靜態 IP 地址設置,最後點擊應用。這將保存一個具有給定名稱的新連接。
接下來,要讓默認連接不自動連接。要做到這一點,請以非 root 身份運行 nm-connection-editor。在連接編輯器中,編輯默認連接(例如 "Auto eth0"),取消勾選"自動連接"。點擊應用,然後關閉連接編輯器。
參見 #設置 PolicyKit 權限。
由於隱藏網絡不會顯示在無線視圖的選擇列表中,因此無法使用 GUI 忘記(刪除)它們。可以使用以下命令刪除:
# rm /etc/NetworkManager/system-connections/SSID
這也適用於任何其他連接。
使用 GNOME 時,在 NetworkManager 中設置 OpenConnect 或 vpnc 連接時,有時不會看到彈出對話框,並且 /var/log/errors.log 中會出現以下錯誤:
localhost NetworkManager[399]: <error> [1361719690.10506] [nm-vpn-connection.c:1405] get_secrets_cb(): Failed to request VPN secrets #3: (6) No agents were available for this request.
這是由於 GNOME NetworkManager Applet 期望對話框腳本位於 /usr/lib/gnome-shell,而 NetworkManager 的包將它們放入 /usr/lib/networkmanager。
作為"臨時"修復(這個錯誤已經存在一段時間了),請創建以下符號連結:
- 對於 OpenConnect:
ln -s /usr/lib/networkmanager/nm-openconnect-auth-dialog /usr/lib/gnome-shell/ - 對於 VPNC(即 Cisco VPN):
ln -s /usr/lib/networkmanager/nm-vpnc-auth-dialog /usr/lib/gnome-shell/
對其他的 NetworkManager VPN 插件可能也需要做類似的事情,不過以上兩個最常見。
WLAN 晶片附帶默認的監管區域[損壞的連結:無效的章節]。如果接入點不在這些限制範圍內運行,就無法連接到網絡。解決這個問題很容易:
- 安裝 wireless-regdb包。
- 取消注釋
/etc/conf.d/wireless-regdom中正確的國家代碼。 - 重新啟動系統,因為該設置僅在啟動時讀取。
當系統(即以 root 用戶運行的 NetworkManager)嘗試建立一個 VPN 連接時問題就會發生,因為密碼存儲在某一個特定用戶的 GNOME Keyring 中,所以無法獲取密碼。
一個解決辦法是用明文存儲 VPN 密碼,如#使用 dispatcher 在網絡連接建立後連接 vpn 步驟 (2.) 中所描述。
如果使用 nm-applet GUI 中的新的"自動連接 VPN"選項,就不再需要使用步驟 (1.) 所描述的 dispatcher 自動連接。
隨著時間的推移,日誌文件(/var/log/journal)可能會變得非常龐大。使用 NetworkManager 時,這可對啟動性能產生大的影響,參考:systemd#啟動的時間太長。
使用命令(journalctl -p5 按斜槓輸入Killing)
输出结果 NetworkManager[38]: <error> [1685410869.7713] platform-linux: sysctl: failed to open
可以嘗試使用以下方法(基本可以解決)
sudo systemctl disable NetworkManager.service
reboot
sudo systemctl start NetworkManager.service
sudo systemctl enable NetworkManager.service
NetworkManager 每 2 分鐘掃描一次。
有些 WiFi 驅動在已連接/關聯的同時掃描基站會有問題。症狀包括 VPN 斷開/重連和丟包,以及頁面無法加載但之後刷新沒有問題。
以 root 身份運行 journalctl -f 可以表明這種情況是否正在發生,類似下面的信息會在日誌文件中以有規律的間隔出現:
NetworkManager[410]: <info> (wlp3s0): roamed from BSSID 00:14:48:11:20:CF (my-wifi-name) to (none) ((none))
如果漫遊不重要,可以通過在 WiFi 連接配置文件中鎖定接入點的 BSSID 來禁用定期掃描行為。
部分聯想機型存在 ideapad_laptop 模塊的問題,原因是 Wi-Fi 驅動錯誤地報告了軟阻塞。儘管仍可以使用 netctl 操作無線網卡,但 NetworkManager 等管理工具則會失效。你可以通過切換硬體開關後運行 rfkill list,如果軟阻塞依然存在,就可以確認是此問題導致。
卸載 ideapad_laptop 模塊應能解決此問題。(警告: 這可能會導致筆記本鍵盤和觸控板也被禁用!)
NetworkManager 默認會將主機名發送給 DHCP 伺服器。
要全局禁用向 DHCP 伺服器發送主機名,請在 /etc/NetworkManager/conf.d/ 下創建配置文件,設置 ipv4.dhcp-send-hostname=false 和 ipv6.dhcp-send-hostname=false 選項。例如:
/etc/NetworkManager/conf.d/dhcp-send-hostname.conf
[connection] ipv4.dhcp-send-hostname=false ipv6.dhcp-send-hostname=false
要為特定連接禁用向 DHCP 伺服器發送主機名(或者在全局禁用時為某連接啟用此功能),請在該網絡連接文件中添加:
/etc/NetworkManager/system-connections/your_connection_file.nmconnection
... [ipv4] dhcp-send-hostname=false ... [ipv6] dhcp-send-hostname=false ...
/etc/dhcpcd.conf 並在最後一行添加 anonymous。如果你使用 xfce4-notifyd.service 作為通知服務,則必須編輯該單元文件並添加以下內容:
/etc/systemd/user/xfce4-notifyd.service.d/display_env.conf
[Service] Environment="DISPLAY=:0.0"
重新加載守護進程後,重啟 xfce4-notifyd.service。退出 i3 並重新啟動,托盤中的 applet 應該會顯示。
如果 systemd-resolved.service 沒有啟動,NetworkManager 會嘗試通過 D-Bus 啟動它,但會失敗:
dbus-daemon[991]: [system] Activating via systemd: service name='org.freedesktop.resolve1' unit='dbus-org.freedesktop.resolve1.service' requested by ':1.23' (uid=0 pid=1012 comm="/usr/bin/NetworkManager --no-daemon ") dbus-daemon[991]: [system] Activation via systemd failed for unit 'dbus-org.freedesktop.resolve1.service': Unit dbus-org.freedesktop.resolve1.service not found. dbus-daemon[991]: [system] Activating via systemd: service name='org.freedesktop.resolve1' unit='dbus-org.freedesktop.resolve1.service' requested by ':1.23' (uid=0 pid=1012 comm="/usr/bin/NetworkManager --no-daemon ")
這是因為 NetworkManager 會嘗試將 DNS 信息發送給 systemd-resolved,即使在 NetworkManager.conf(5) 中設置了 main.dns=。[8]
可以通過在 /etc/NetworkManager/conf.d/ 中添加配置文件來禁用此行為:
/etc/NetworkManager/conf.d/no-systemd-resolved.conf
[main] systemd-resolved=false
參見 FS#62138。
如果你在嘗試連接到網絡時收到以下錯誤:
$ nmcli device wifi connect SSID password password
Error: Connection activation failed: (7) Secrets were required, but not provided
此錯誤可能有多種原因,建議查看 journal(使用 -u NetworkManager 過濾)。例如,如果 NetworkManager 建立連接耗時過長,它可能會認為密碼錯誤:
NetworkManager[1372]: <warn> [1643991888.3808] device (wlan0): Activation: (wifi) association took too long NetworkManager[1372]: <info> [1643991888.3809] device (wlan0): state change: config -> need-auth (reason 'none', sys-iface-state: 'managed') NetworkManager[1372]: <warn> [1643991888.3838] device (wlan0): Activation: (wifi) asking for new secrets
你可以嘗試刪除該連接配置文件並重新創建一個:
$ nmcli connection delete SSID $ nmcli device wifi connect SSID password password
也可以嘗試禁用 MAC 地址隨機化:
/etc/NetworkManager/conf.d/wifi_rand_mac.conf
[device] wifi.scan-rand-mac-address=no
如果你在使用 NetworkManager 的 iwd 後端 連接類似 'eduroam' 的 WPA Enterprise 網絡,會出現以下錯誤:
Connection 'eduroam' is not avialable on device wlan0 because profile is not compatible with device (802.1x connections must have IWD provisioning files)
這是因為 NetworkManager 無法配置 WPA Enterprise 網絡。你必須使用 iwd 的配置文件來配置它,例如放在 /var/lib/iwd/essid.8021x,詳見 iwd#WPA Enterprise。
如果你收到以下錯誤:
Failed to request VPN secrets #1: No agents were available for this request.
可能是因為密碼為空,或你需要 配置 PolicyKit 權限。
包 networkmanager-openvpn包 在 GNOME-Shell 集成時需要依賴 libnma-gtk4包,並可選依賴 libnma包(Gtk3)。如果系統缺少 libnma包,系統日誌會列印如下信息:
NetworkManager[642]: <warn> [...] vpn[..."name_of_vpn_profile VPN"]: secrets: failed to request VPN secrets #3: No agents were available for this request.
If you get this error:
Failed to request VPN secrets #1: No agents were available for this request.
It is either because the password is empty or you have to set up PolicyKit permissions.
自從 openssl包 升級到版本 3 後,使用遺留加密算法生成的證書默認將被拒絕。通過 networkmanager-openvpn包 使用此類證書時,日誌可能出現以下錯誤:
nm-openvpn[14359]: OpenSSL: error:0A00018E:SSL routines::ca md too weak nm-openvpn[14359]: Cannot load certificate file /home/archie/.local/share/networkmanagement/certificates/my_issued_cert.crt nm-openvpn[14359]: Exiting due to fatal error
正確的做法是讓 OpenVPN 伺服器管理員生成並重新簽發更安全的證書。但作為臨時解決方案,OpenVPN 需要指定:
模板錯誤: 您在嘗試使用 = 標誌嗎? 有關解決方法,請訪問 Help:Template#Escape template-breaking characters。
雖然 GUI 插件可能無法設置,但可以使用 nmcli 實現。此外,你還需要啟用 OpenSSL 的 「legacy」 提供器。
首先,通過以下命令獲取有問題的 VPN 連接名稱:
$ nmcli connection show
假設連接名為 vpn.example.com,使用 nmcli 格式如下:
$ nmcli connection modify vpn.example.com +vpn.data tls-cipher=DEFAULT:@SECLEVEL=0
此更改將立即反映在 /etc/NetworkManager/system-connections/vpn.example.com.nmconnection 文件中。
接著,編輯 /etc/ssl/openssl.cnf 來啟用 legacy provider(參見 OpenSSL wiki):
在文件末尾的 provider_sect 部分添加:
/etc/ssl/openssl.cnf
openssl_conf = openssl_init [openssl_init] providers = provider_sect [provider_sect] default = default_sect legacy = legacy_sect [default_sect] activate = 1 [legacy_sect] activate = 1
最後,重啟 NetworkManager.service 以使新的 OpenSSL 配置生效。
自 openssl包 升級至版本 3 起,默認情況下 「SSL 3、TLS 1.0、TLS 1.1 和 DTLS 1.0 僅在安全等級 0 時可用」。參見 OpenSSL 發布說明。嘗試連接僅支持舊協議的 Wi-Fi 網絡時,日誌中可能會出現如下錯誤:
wpa_supplicant[3320]: SSL: SSL3 alert: write (local SSL3 detected an error):fatal:protocol version wpa_supplicant[3320]: OpenSSL: openssl_handshake - SSL_connect error:0A000102:SSL routines::unsupported protocol wpa_supplicant[3320]: wlp3s0: CTRL-EVENT-EAP-FAILURE EAP authentication failed
正確的做法是說服機構的管理員升級加密的網絡隧道協議到 TLS 1.3,並可選擇性地放棄對已棄用的安全標準(包括 TLS 1.0/1.1、DTLS 1.0 和 SSL 1-3)的支持。不過,作為臨時解決方案,有多種方法可以默認啟用 TLS 1.0 和/或 1.1。
其中一種方法是手動打補丁或還原 OpenSSL 中導致此問題的更改([9])。由於這也會降低所有使用 OpenSSL 安全級別 1 的程序的安全性,因此不推薦該方法。
更好的方法是單獨為 wpa_supplicant 設置使用的安全等級,如 BBS#286417 所述。若僅修改受影響的連接,可以在連接的配置文件的 [802-1x] 部分設置 phase1-auth-flags=32 或 phase1-auth-flags=64。這可能無法通過圖形界面完成,但可使用 nmcli。
首先,使用以下命令獲取出問題的連接名稱:
$ nmcli connection show
假設該連接使用 TLS 1.0,名稱為 Example Wi-Fi,則執行:
$ nmcli connection modify 'Example Wi-Fi' 802-1x.phase1-auth-flags 32
若為 TLS 1.1,則執行:
$ nmcli connection modify 'Example Wi-Fi' 802-1x.phase1-auth-flags 64
此更改將立即反映到 /etc/NetworkManager/system-connections/Example Wi-Fi.nmconnection 文件中。
最後,重啟 NetworkManager.service 以使新的 OpenSSL 設置生效。