NetworkManager

出自 Arch Linux 中文维基

NetworkManager 是一個為系統提供檢測和配置功能以便自動連接到網絡的程序。NetworkManager 的功能對無線和有線網絡都很有用。對於無線網絡,NetworkManager 偏好已知的無線網絡,並能切換到最可靠的網絡。能感知 NetworkManager 的應用程式可以切換在線和離線模式。比起無線連接,NetworkManager 更偏好有線連接,且支持調製解調器連接和一些類型的 VPN。NetworkManager 最初由 Red Hat 開發,現在由 GNOME 管理。

警吿: 默認情況下,文件系統中的 root 用户和通過 GUI(如 nm-applet)訪問設置的用户可以訪問機密信息(如 WiFi 密碼)。參見#加密的 Wi-Fi 密碼

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

可以通過安裝 networkmanager 軟件包獲取 NetworkManager。此軟件包包含一個守護程序、一個命令行界面(nmcli)和一個基於 curses 的界面(nmtui)。

啟用 NetworkManager[編輯 | 編輯原始碼]

安裝完成後,啟動/啟用 NetworkManager.service。NetworkManager 守護進程啟動後,會自動連接到已配置且可用的「系統連接」。「用户連接」和未配置的連接需要通過 nmcli 或 applet 進行配置和連接。

注意:
  • 請確保沒運行其它網絡配置服務;多個網絡服務會發生衝突。可以用 systemctl --type=service 查看正在運行的服務列表,然後停止它們。參見#配置以啟用 NetworkManager 服務。
  • 如果 systemd-resolved 沒有啟動,錯誤消息將會淹沒日誌。詳見後面的 Unit dbus-org.freedesktop.resolve1.service not found 部分。

額外的界面[編輯 | 編輯原始碼]

流動網絡支持[編輯 | 編輯原始碼]

NetworkManager 使用 ModemManager 提供移動寬帶連接。

安裝 modemmanagerusb_modeswitch。然後啟用啟動 ModemManager.service

可能需要重新啟動 NetworkManager.service 才能使其檢測 ModemManager。重新啟動後,重新插入調製解調器應該就可以識別了。

從前端界面(例如 nm-connection-editor)添加連接並將連接類型選擇為 broadband,選擇 ISP 和套餐, mobile-broadband-provider-info 會自動填入 APN 和其它設置。

PPPoE / DSL 支持[編輯 | 編輯原始碼]

安裝 rp-pppoe 以支持 PPPoE / DSL 連接。使用 nm-connection-editor 添加一個新的 DSL/PPPoE 連接。

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

從 1.16 版本開始 NetworkManager 原生支持 WireGuard,它只需要 wireguard 內核模塊。詳見 WireGuard in NetworkManager 博客文章

對其他類型 VPN 的支持基於一個插件系統。它們在以下軟件包中提供:

警吿: 有很多與 VPN 支持有關的錯誤。Check the daemon processes options set via the GUI correctly and double-check with each package release.
注意:
  • 要在使用 VPN 時獲得完整的 DNS 解析,請設置條件轉發
  • 這些插件可能沒有文檔化的命令行界面,或者在沒有運行 applet 的情況下根本無法工作。如果您使用的是常規 DE,那麼這不是問題;如果不是,那麼您應該在配置或激活連接時運行 #nm-applet,來顯示必要的對話框。[1]

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

NetworkManager 附帶 nmcli(1)nmtui(1)

nmcli 示例[編輯 | 編輯原始碼]

顯示附近的 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 using nmcli connection modify 'Wired connection 2' ipv4.route-metric 200 command.

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 與桌面環境集成,您可以安裝一個 applet。這不僅便於您輕鬆訪問網絡選擇和配置界面,更能提供一個安全存儲網絡密鑰的代理程序。這種圖形前端往往顯示在系統托盤(或通知區域),從而允許用户選擇網絡或者配置 NetworkManager。各種桌面環境都有自己的 applet。你也可以使用 #nm-applet

GNOME[編輯 | 編輯原始碼]

GNOME網絡設置 裡有內置的配置工具。

KDE Plasma[編輯 | 編輯原始碼]

安裝 plasma-nm 軟件包。然後通過 面板的選項 > 添加部件 > 網絡 將其添加到 KDE 的任務欄上。

nm-applet[編輯 | 編輯原始碼]

network-manager-applet 是一個工作在 Xorg 環境下的 GTK 3 前端,帶有一個系統托盤。

為了存儲連接密碼,您可以安裝實現了 Secret Service D-Bus API 的應用程式,如 GNOME/KeyringKDE WalletKeePassXC

請注意,如果對某個連接啟用了 對其他用户可用 選項,NetworkManager 就會明文存儲密碼,不過相應的文件只能被 root 或者其他使用 nm-applet 的用户訪問。參照 #加密的 Wi-Fi 密碼

要在沒有系統托盤的情況下運行 nm-applet,可以使用 trayerstalonetray。例如,可以在自己的可執行文件路徑中添加這樣的腳本:

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
提示:nm-applet 可能被自啟動桌面配置項自動啟動, 這種情況下請在那裏的 Exec 一行添加 --no-agent 選項:
Exec=nm-applet --no-agent

Appindicator[編輯 | 編輯原始碼]

從 1.18.0 版本開始,官方軟件包 network-manager-applet包含 Appindicator 支持。要在 Appindicator 環境中使用 nm-applet,請使用以下命令啟動 applet:

$ nm-applet --indicator

networkmanager-dmenu[編輯 | 編輯原始碼]

networkmanager-dmenu-gitAUR 是一個通過 dmenurofi 而不是 nm-applet 管理 NetworkManager 連接的小腳本。它提供了所有必要的功能, 例如連接到已有的 NetworkManager wifi 或有線網絡、連接到新的 wifi 網絡、在需要的時候詢問密碼、連接到已有的 VPN、啟用/停用網絡連接、運行 nm-connection-editor 圖形界面、連接到藍牙網絡等等。

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

NetworkManager 需要一些額外的步驟才能正常運行。請確保已按照網絡配置#設置計算機名一節的描述配置 /etc/hosts

NetworkManager 的全局配置文件位於 /etc/NetworkManager/NetworkManager.conf。額外的配置文件可以放在 /etc/NetworkManager/conf.d/ 中。全局的默認配置通常不需要改動。

編輯配置文件後,可以使用以下命令應用更改:

# nmcli general reload

NetworkManager-wait-online[編輯 | 編輯原始碼]

Enabling NetworkManager.service also enables NetworkManager-wait-online.service, which is a oneshot system service that waits for the network to be configured. The latter has WantedBy=network-online.target, so it will finish only when network-online.target itself is enabled or pulled in by some other unit. See also systemd#Running services after the network is up.

By default, NetworkManager-wait-online.service waits for NetworkManager startup to complete, rather than waiting for network connectivity specifically (see nm-online(1)). If NetworkManager-wait-online.service finishes before the network is really up, resulting in failed services on boot, extend the unit to remove the -s from the ExecStart line:

[Service]
ExecStart=
ExecStart=/usr/bin/nm-online -q

注意這可能會導致其他問題

在某些情況下,由於超時太短,服務仍然無法在啟動時成功啟動。編輯服務,將 NM_ONLINE_TIMEOUT60 改為更大的值。

設置 PolicyKit 權限[編輯 | 編輯原始碼]

默認情況下,活動的本地會話中的所有用户都能在沒有密碼的情況下改變大多數網絡設置。參照 General troubleshooting#會話權限檢查會話類型。在大多數情況下,一切都應該開箱即用。

一些操作(例如改變系統計算機名)需要管理員密碼。這時,需要將自己添加wheel 用户組並運行一個 polkit 身份認證組件,它將提示輸入密碼。

對於遠程會話(例如 headless VNC),有幾種方法獲得使用 NetworkManager 所需的權限:

  1. 將自己添加wheel 用户組。執行每個操作時都需要輸入自己的密碼。注意你的賬户同時被賦予了此賬户組的其他權限,例如使用 sudo 命令時無需輸入 root 密碼。
  2. 將自己添加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 不直接處理代理設置,但如果你使用 GNOMEKDE,你可以使用 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
注意: 儘管自動連接檢查理論上可能會泄露私隱,但 Arch Linux 默認設置的連接檢查 Web 伺服器承諾不會記錄任何訪問。 請參考 [3] [4].

強制網絡門户[編輯 | 編輯原始碼]

如果您連接的網絡提供了 強制門户(一般用於網頁認證), 桌面管理器會自動打開一個窗口並要求您輸入憑據。如果您的桌面管理器沒有這麼做,則您可以安裝 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"

    $logger "Running browser as '$user' with display '$display' to login in captive portal"
    sudo -u "$user" --preserve-env=DISPLAY,XAUTHORITY -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

您需要 重啟 一次 NetworkManager.service 服務或者重啟電腦才能讓以上腳本生效。然後該腳本應該會在網絡要求強制門户的時候自動為您打開登錄窗口。

另一個解決方案是基於 Google Chrome 的 captive-browser-gitAUR

DHCP 客户端[編輯 | 編輯原始碼]

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
注意:
  • NetworkManger does not support using dhcpcd for IPv6. See NetworkManager issue #5.如果將 dhcpcd 設置為 DHCP 客户端,NetworkManager 將為 DHCPv6 使用內置 DHCP 客户端。
  • 不要啟用 dhclientdhcpcd 軟件包提供的 systemd 單元。它們會與 NetworkManager 衝突,詳情請參見#安裝中的註釋。

DNS 管理[編輯 | 編輯原始碼]

NetworkManager 的 DNS 管理在 GNOME 項目的 wiki 頁面中進行了描述——Projects/NetworkManager/DNS

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[編輯 | 編輯原始碼]

確保已安裝 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 中找到。You can verify dnsmasq is being used by doing the same DNS lookup twice with drill example.com and verifying the server and query times.

注意:
  • 無需啟動 dnsmasq.service 或編輯 /etc/dnsmasq.conf。NetworkManager 不通過 systemd 服務啟動 dnsmasq,也不會讀取 dnsmasq 的默認配置文件。
  • The dnsmasq instance started by NetworkManager will bind to 127.0.0.1:53, you cannot run any other software (including dnsmasq.service) on the same address and port.
自定義 dnsmasq 配置[編輯 | 編輯原始碼]

可以通過在 /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)

IPv6[編輯 | 編輯原始碼]

本文或本章節的事實準確性存在爭議。

原因: This does not solve the issue because NetworkManager does not add ::1 to /etc/resolv.conf. Unless @::1 is manually passed to drill, it will still fail with Error: error sending query: No (valid) nameservers defined in the resolver.(在 Talk:NetworkManager 中討論)


Enabling dnsmasq in NetworkManager may break IPv6-only DNS lookups (i.e. drill -6 [hostname]) which would otherwise work. In order to resolve this, creating the following file will configure dnsmasq to also listen to the IPv6 loopback:

/etc/NetworkManager/dnsmasq.d/ipv6-listen.conf
listen-address=::1

此外,dnsmasq 也不優先考慮上游 IPv6 DNS。遺憾的是,NetworkManager 無法執行此操作 (Ubuntu Bug)。解決方法是在 NetworkManager 配置中禁用 IPv4 DNS(如果有)。

DNSSEC[編輯 | 編輯原始碼]

默認情況下,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
systemd-resolved[編輯 | 編輯原始碼]

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
DNS resolver with an openresolv subscriber[編輯 | 編輯原始碼]

If openresolv has a subscriber for your local DNS resolver, set up the subscriber and configure NetworkManager to use openresolv.

Because NetworkManager advertises a single "interface" to resolvconf, it is not possible to implement conditional forwarding between two NetworkManager connections. See NetworkManager issue 153.

This can be partially mitigated if you set private_interfaces="*" in /etc/resolvconf.conf[5]. Any queries for domains that are not in search domain list will not get forwarded. They will be handled according to the local resolver's configuration, for example, forwarded to another DNS server or resolved recursively from the DNS root.

自定義 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
注意:
設置自定義連接 DNS 伺服器[編輯 | 編輯原始碼]
設置自定義連接 DNS 伺服器(GUI)[編輯 | 編輯原始碼]

Setup will depend on the type of front-end used; the process usually involves right-clicking on the applet, editing (or creating) a profile, and then choosing DHCP type as Automatic (specify addresses). The DNS addresses will need to be entered and are usually in this form: 127.0.0.1, DNS-server-one, ....

設置自定義連接 DNS 伺服器(nmcli / 連接文件)[編輯 | 編輯原始碼]

To setup DNS Servers per connection, you can use the dns field (and the associated dns-search and dns-options) in the connection settings[損壞的連結:無效的章節].

If method is set to auto (when you use DHCP), you need to set ignore-auto-dns to yes.

/etc/resolv.conf[編輯 | 編輯原始碼]

NetworkManager 對 /etc/resolv.conf 的管理方式可以通過 main.rc-manager 選項配置。 networkmanager 會把它設置為 symlink,而不是上游默認的 auto。 具體設置及其值在 NetworkManager.conf(5) 手冊頁中有説明。

提示:使用 openresolv 可以讓 NetworkManager 和其他管理 resolvconf 的軟件共存。比如如果要運行一個本地 DNS 緩存和拆分 DNS 解析器,openresoly可以提供一個 subscriber。不過將 NetworkManager 與 openresolv 一起使用時,要注意條件轉發仍未得到完全支持

NetworkManager 還通過調度程序腳本提供鈎子,可用於在網絡變化後修改 /etc/resolv.conf。有關更多信息,請參見 #使用 NetworkManager 調度網絡服務NetworkManager(8)

注意:
  • 如果 NetworkManager 被配置為使用 dnsmasqsystemd-resolved,則相應的環回地址將寫入 /etc/resolv.conf
  • NetworkManager (要)寫入 /etc/resolv.confresolv.conf 文件位於 /run/NetworkManager/resolv.conf
  • /run/NetworkManager/no-stub-resolv.conf 中包含 NetworkManager 獲取到的 DNS 伺服器和搜索域。
不讓 NetworkManager 管理 /etc/resolv.conf[編輯 | 編輯原始碼]

要防止 NetworkManager 修改 /etc/resolv.conf,請在 /etc/NetworkManager/conf.d/ 下的配置文件中設置 main.dns=none 選項:

/etc/NetworkManager/conf.d/dns.conf
[main]
dns=none
提示:You might also want to set main.systemd-resolved=false, so that NetworkManager does not send the DNS configuration to systemd-resolved.
注意: See DNS caching and conditional forwarding, to configure NetworkManager using other DNS backends like dnsmasq and systemd-resolved, instead of using main.dns=none.

After that /etc/resolv.conf might be a broken symlink that you will need to remove. Then, just create a new /etc/resolv.conf file.

Use openresolv[編輯 | 編輯原始碼]
注意: NetworkManager 不支持使用由 systemd-resolvconf 提供的 systemd-resolved 的 resolvconf 接口 (resolvectl(1) § COMPATIBILITY WITH RESOLVCONF(8))

要將 NetworkManager 配置為使用 openresolv,請在 /etc/NetworkManager/conf.d/ 目錄下的配置文件中設置 main.rc-manager=resolvconf:

/etc/NetworkManager/conf.d/rc-manager.conf
[main]
rc-manager=resolvconf

防火牆[編輯 | 編輯原始碼]

可以根據當前的連接分配 firewalld 區域。例如,在工作時限制較多,在家時限制較少。

也可以通過 NetworkManager 調度實現。

使用 NetworkManager 調度網絡服務[編輯 | 編輯原始碼]

有些服務只有聯網時才有意義,例如 NFS, SMBNTPd。NetworkManager 可以在連接網絡後啟動這些服務,並在網絡關閉時停止它們。

要使用這一功能, 需要 enablestart NetworkManager-dispatcher.service

服務啟動後,可以將腳本加到 /etc/NetworkManager/dispatcher.d 目錄。

這些腳本必須屬於 root, 否則不會被執行。為了安全起見, 所屬 用户組也設置為 root:

# chown root:root /etc/NetworkManager/dispatcher.d/10-script.sh

而且腳本必須是 可執行 的。

# chmod 755 scriptname

腳本將在連接網絡時按字母表順序運行,並在網絡停止時反向停止。要保證啟動順序,可以在前面加數字,例如 10_portmap30_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 必須在再次運行腳本前被關閉。這意味着腳本只能被運行一次。因此, 除非超時確實引起了問題, 否則不要修改服務文件。

Dispatcher 示例[編輯 | 編輯原始碼]

使用 sshfs 掛載遠程目錄[編輯 | 編輯原始碼]

由於該腳本在一個非常受限制的環境中運行, 為了連接上SSH agent, 你必須 export SSH_AUTH_SOCK。 這裏有幾種不同方式, 參照 here 獲取更多詳細信息. 以下示例需要 gnome-keyring , 如果 gnome-keyring 沒解鎖,將需要你輸入密碼. 如果 NetworkManager 設置為登錄後自動連接, 很有可能因為 gnome-keyring 還沒啟動導致失敗(轉入睡眠). 對應的 UUID 可以通過命令 nmcli con statusnmcli 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 共享[編輯 | 編輯原始碼]

一些 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
注意:
模板錯誤: 您在嘗試使用 = 標誌嗎? 有關解決方法,請訪問 Help:Template#Escape template-breaking characters

另一種方法是使用 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 共享[編輯 | 編輯原始碼]

參見 NFS#Using a NetworkManager dispatcher.

當插入網線時用 dispatcher 腳本自動關閉無線網絡[編輯 | 編輯原始碼]

其想法是,僅當 LAN 電纜拔下時(例如,從筆記本電腦底座上拔下時)才打開 Wi-Fi,一旦 LAN 電纜再次插入,Wi-Fi 將自動禁用。

創建以下 dispatcher 腳本 [6],並將其中的 LAN_interface 替換為您自己的網絡接口。

/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

{{注意|您可以使用 nmcli 命令獲得接口列表。以太網(LAN)接口的前綴為 en,例如 enp0s5}}

使用 dispatcher 在網絡連接建立後連接 vpn[編輯 | 編輯原始碼]

此部分示例演示如果自動連接到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-flags1 改為 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 密碼。

用 dispatcher 來禁用 VPN 上的 IPv6 連接[編輯 | 編輯原始碼]

許多商業 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

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

安裝 networkmanager-dispatcher-openntpdAUR 軟件包

使用 systemd-timesyncd 動態設置通過 DHCP 獲取到的 NTP 伺服器[編輯 | 編輯原始碼]

當你在不同的網絡之間漫遊時 ( 例如公司的局域網,家裏的 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-changeACTION=dhcp6-change),並且提供的連接數據包含有關 NTP 伺服器(DHCP4_NTP_SERVERS)的信息時,都會將特定於連接的覆蓋配置文件寫入 /etc/systemd/timesyncd.conf.d,其中包含獲取到的 NTP 伺服器。每當連接被斷開(ACTION=down)時,特定於連接的覆蓋文件就會被刪除。每次更改 systemd-timesyncd 的配置後,都會重新啟動此服務以獲取更新的配置。為每個連接使用單獨的配置文件是為了避免 NetworkManager 並行管理兩個或多個連接時,配置中的不同 NTP 伺服器名稱被覆蓋,因為 updhcp4-changedhcp6-changedown 操作可能以任意順序出現。

測試[編輯 | 編輯原始碼]

NetworkManager 托盤組件被設計成開機自動啟動,所以對大部分用户來説,並不需要過多配置。但是如果你手動停用舊有的網絡設置斷網,你需要測試一下 NetworkManager 是否正常工作。首先啟動 NetworkManager.service.

有些托盤組件會提供給你一個 .desktop 文件以便通過系統菜單運行。如果沒有,那你就需要通過命令或者註銷重登錄系統來讓托盤組件運行。 一旦托盤組件運行了,它會自動請求網絡連接並通過 DHCP 伺服器來進行網絡配置。

在一些 non-xdg-compliant 窗口系統,比如在 awesome 中啟動 GNOME applet:

nm-applet --sm-disable &

如果需要靜態 IP,你需要配置 NetworkManager。一般來説,在托盤圖標上面點擊右鍵,選擇「編輯連接」即可。

提示與技巧[編輯 | 編輯原始碼]

加密的 Wi-Fi 密碼[編輯 | 編輯原始碼]

NetworkManager 默認會在 /etc/NetworkManager/system-connections/ 中的連接文件當中以明文形式存儲密碼。要顯示存儲的密碼,使用以下命令:

# grep -r '^psk=' /etc/NetworkManager/system-connections/

密碼可以被文件系統中的 root 用户和通過 GUI(如 nm-applet)訪問設置的用户訪問。

最好將密碼以加密形式保存在密鑰環中,而不是明文。這樣做的缺點是必須為每個用户設置連接。

更好的做法是以加密形式將密碼存儲在密鑰環中而不是以明文形式存儲,使用密鑰環的缺點是需要為每一個用户單獨配置連接。

為了對密鑰環進行讀寫操作,必須有一個可用的機密代理,比如:

  • nmcli with the --ask option
  • #前端 中提及的任一圖形界面

如果這兩者都不可用,那麼身份驗證將失敗,並提示錯誤 no secrets: No agents were available for this request.

使用 GNOME 密鑰環[編輯 | 編輯原始碼]

需要啟動密鑰環守護程序並解鎖密鑰環才能讓之後的東西工作。

此外,需要將 NetworkManager 配置為不存儲所有用户的密碼。使用 GNOME 的 network-manager-applet,從終端運行 nm-connection-editor,選擇一個網絡連接,單擊 編輯,選擇 Wi-Fi 安全性 選項卡,單擊密碼的右圖標並選擇 只為此用户存儲密碼

使用 KDE Wallet[編輯 | 編輯原始碼]

若使用 KDE 的 plasma-nm,請單擊該小部件,然後單擊右上角的 設置 圖標,再單擊網絡連接,在 常規配置 選項卡中,取消選中 允許所有用户連接到此網絡。如果勾選該選項,即使正在運行 keyring 守護程序,密碼仍將以明文形式存儲。

如果之前選擇了該選項又取消勾選了,則可能必須首先使用 重置 選項才能使密碼從文件中消失。或者,首先刪除連接並重新設置它。

通過 Wi-Fi 共享網絡連接(移動熱點)[編輯 | 編輯原始碼]

使用 NetworkManager,您只要點擊幾下就可以共享你的 Internet 連接(例如,3G或者有線)。請注意 可能會干擾該功能。

您需要一個支持 AP 模式的 Wi-Fi 卡,請參閱 軟件接入點#無線網卡必須支持AP模式 了解詳細信息。

安裝dnsmasq 軟件包。請注意 NetworkManager 會啟動自己的獨立於dnsmasq.servicednsmasq 實例,作為 DHCP 伺服器。有關注意事項,請參見 #dnsmasq

創建共享連接:

  • 點擊小部件並選擇 創建新無線網絡.
  • 按照嚮導操作(選擇 WPA2 或更高版本,請確保使用至少 8 個字符長的密碼,密碼太短會創建失敗)。
    • 選擇 Hotspot(熱點) 或 Ad-hoc 作為 Wi-Fi 模式。

該連接將被保存供下次使用。

注意: Android 不支持連接到 Ad-hoc 網絡。要與 Android 共享連接,請使用基礎結構模式(即將 Wi-Fi 模式設置為「熱點」)。

通過以太網共享連接(作為WISP路由器)[編輯 | 編輯原始碼]

場景:您的設備能通過 Wi-Fi 上網,並且您希望通過以太網與其他設備共享互聯網連接,這一般被稱為 WISP。

要求:

  • 安裝dnsmasq 軟件包。請注意 NetworkManager 會啟動自己的獨立於dnsmasq.servicednsmasq 實例,作為 DHCP 伺服器。有關注意事項,請參見 #dnsmasq
  • 您的互聯網連接設備和其他設備通過合適的以太網電纜連接(這通常意味着網線直連或兩者接到同一個交換機上)。
  • 防火牆沒有阻止網絡連接共享。

步驟:

  • 在終端裡運行 nm-connection-editor
  • 添加新的以太網連接
  • 為新的連接起一個合適的名字
  • 轉到 「IPv4 設置」 選項
  • 在「方法」下選擇「共享給其他計算機」
  • 保存

現在,您應該可以在 NetworkManager 的有線連接列表中看到您新創建的連接。

在cron任務(jobs)或腳本中檢查網絡是否連接[編輯 | 編輯原始碼]

有些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 默認不會連接到需要密碼的網絡,僅在登錄後才會連接,要不登錄就連接網絡,請使用下面方式配置:

  1. 右擊面板中的nm-applet圖標,並選擇編輯連接(Edit Connections),打開無線(wireless)選項卡
  2. 選擇你想要使用的連接並單擊編輯
  3. 勾選"自動連接"(「Connect Automatically」)框和"對所有用户可用"(「Available to all users」)框

登出並重新登錄,完成。

有密碼認證的KDE and OpenConnect VPN[編輯 | 編輯原始碼]

雖然可以在連接時直接輸入,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 地址隨機化功能以獲得(穩定的)鏈路連接(比如[7])。也有些網絡會基於 MAC 地址來限制設備接入或限速。

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 地址隨機化方面,最重要的模式是 stablerandom。當您連接到新網絡時,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

參考這篇 GNOME 博客文章 了解更多詳情。

啟用IPv6私隱擴展[編輯 | 編輯原始碼]

參見 IPv6#NetworkManager

給每個網絡連接配置單獨的 DUID[編輯 | 編輯原始碼]

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-llstable-llt 等值。有關更多信息,請閱讀 nm-settings(5) § ipv6 settingdhcp-duid 的説明。

Working with wired connections[編輯 | 編輯原始碼]

By default, NetworkManager generates a connection profile for each wired ethernet connection it finds. At the point when generating the connection, it does not know whether there will be more Ethernet adapters available. Hence, it calls the first wired connection "Wired connection 1". You can avoid generating this connection, by configuring no-auto-default (see NetworkManager.conf(5)), or by simply deleting it. Then NetworkManager will remember not to generate a connection for this interface again.

You can also edit the connection (and persist it to disk) or delete it. NetworkManager will not re-generate a new connection. Then you can change the name to whatever you want. You can use something like nm-connection-editor for this task.

Using iwd as the Wi-Fi backend[編輯 | 編輯原始碼]

注意:
  • Do not enable iwd.service or manually configure iwd. NetworkManager will start and manage it itself.
  • Consider existing issues before switching to iwd.

To enable the experimental iwd backend, first 安裝 iwd and then create the following configuration file:

/etc/NetworkManager/conf.d/wifi_backend.conf
[device]
wifi.backend=iwd

Alternatively, you can install networkmanager-iwdAUR, a modified package configured to build NetworkManager working exclusively with iwd, with the main difference being that iwd is required and wpa_supplicant can be uninstalled after building.

注意: You may need to convert existing NetworkManager network profiles after switching to iwd.

Running in a network namespace[編輯 | 編輯原始碼]

If you would like to run NetworkManager inside a network namespace (e.g., to manage a specific device which should be use by selected applications), bring the device down before moving it to the namespace:

$ 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

otherwise NetworkManager will later fail to establish the connection with a device is strictly unmanaged error.

Automatically connect to VPN[編輯 | 編輯原始碼]

NetworkManager can be set to automatically connect to a VPN when connecting to the internet, on a per network basis. The VPN connection itself can be added in GNOME's NetworkManager front-end, but to make it automatically use the VPN nmcli must be used. Other front-ends might not have this limitation.

First, make sure to make the VPN connection available to all users. In the GNOME this is a matter of checking a box under the details tab. Under the Identity tab, in the password field, click the icon on the right side in the field, and set it to Store the password for all users.

Then find the UUID of the VPN connection, and add that to connection.secondaries of the Internet connection:

# UUID=$(nmcli --get-values connection.uuid connection show name-of-VPN-connection)
# nmcli connection modify name-of-Internet-connection connection.secondaries "$UUID"

Now when NetworkManager is restarted and you connect to the Internet connection you have configured, you should automatically get connected to the VPN.

問題解決[編輯 | 編輯原始碼]

安全 Wi-Fi 網絡不提示輸入密碼[編輯 | 編輯原始碼]

嘗試連接到安全的 Wi-Fi 網絡時,既不提示輸入密碼,也不建立連接。如果沒有安裝密鑰環軟件包,這種情況就會發生。一個簡單的解決方案是安裝 gnome-keyring。如果希望密碼以加密的形式存儲,按照 GNOME/Keyring 來設置 gnome-keyring-daemon

Network management disabled[編輯 | 編輯原始碼]

當 NetworkManager 關閉但 pid(state)文件未刪除時,就會看到 Network management disabled 提示。此時,請手動刪除文件:

# rm /var/lib/NetworkManager/NetworkManager.state

內置 DHCP 客户端的問題[編輯 | 編輯原始碼]

如果在使用內置 DHCP 客户端獲取 IP 地址時遇到問題,請考慮換一個 DHCP 客户端,有關説明,請參閱 #DHCP 客户端。這種解決方法可能會解決大型無線網絡(如 eduroam)中的問題。

使用 dhclient 時的 DHCP 問題[編輯 | 編輯原始碼]

如果在通過 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 接口 命令獲得。

未檢測到 3G 調製解調器[編輯 | 編輯原始碼]

參見 Mobile broadband modem#NetworkManager

在筆記本電腦上關閉 WLAN[編輯 | 編輯原始碼]

有時候在使用筆記本上的開關禁用 Wi-Fi 然後重新啟用後,NetworkManager 無法工作。這常常是 rfkill 的問題。要檢查驅動程序是否已吿知 rfkill 無線適配器的狀態,請使用:

$ watch -n1 rfkill list all

如果開啟適配器後其標識符仍然顯示為 blocked,可嘗試如下命令手動 unblock(其中 X 是上面輸出的標識符編號):

# rfkill event unblock X

靜態 IP 地址設置恢復為 DHCP[編輯 | 編輯原始碼]

由於未解決的錯誤,將默認連接更改為靜態 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 中 VPN 不工作[編輯 | 編輯原始碼]

使用 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 晶片附帶默認的監管區域[損壞的連結:無效的章節]。如果接入點不在這些限制範圍內運行,就無法連接到網絡。解決這個問題很容易:

  1. 安裝 wireless-regdb
  2. 取消註釋 /etc/conf.d/wireless-regdom 中正確的國家代碼。
  3. 重新啟動系統,因為該設置僅在啟動時讀取。

啟動時自動連接到 VPN 不工作[編輯 | 編輯原始碼]

當系統(即以 root 用户運行的 NetworkManager)嘗試建立一個 VPN 連接時問題就會發生,因為密碼存儲在某一個特定用户的 GNOME Keyring 中,所以無法獲取密碼。

一個解決辦法是用明文存儲 VPN 密碼,如#使用 dispatcher 在網絡連接建立後連接 vpn 步驟 (2.) 中所描述。

如果使用 nm-applet GUI 中的新的"自動連接 VPN"選項,就不再需要使用步驟 (1.) 所描述的 dispatcher 自動連接。

systemd 瓶頸[編輯 | 編輯原始碼]

隨着時間的推移,日誌文件(/var/log/journal)可能會變得非常龐大。使用 NetworkManager 時,這可對啟動性能產生大的影響,參考:systemd#啟動的時間太長

使用archinstall腳本創建的系統關機慢(並且關機時kde右下角彈窗報錯)[編輯 | 編輯原始碼]

使用命令(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

有規律的網絡斷開、延遲和丟包(WiFi)[編輯 | 編輯原始碼]

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 來禁用定期掃描行為。

聯想筆記本電腦無法打開WiFi (IdeaPad, Legion, etc.)[編輯 | 編輯原始碼]

There is an issue with the ideapad_laptop module on some Lenovo models due to the Wi-Fi driver incorrectly reporting a soft block. The card can still be manipulated with netctl, but managers like NetworkManager break. You can verify that this is the problem by checking the output of rfkill list after toggling your hardware switch and seeing that the soft block persists.

本文或本章節的事實準確性存在爭議。

原因: Try to use rfkill.default_state and rfkill.master_switch_mode (see kernel-parameters.html) to fix the rfkill problem.(在 Talk:NetworkManager 中討論)


Unloading the ideapad_laptop module should fix this. (warning: this may disable the laptop keyboard and touchpad also!).

不把主機名推送到DHCP伺服器[編輯 | 編輯原始碼]

NetworkManager 默認將主機名發送到 DHCP 伺服器,目前界面上可以全局禁用。(Issue #584).

要針對某個連接禁用此配置,將如下內容加入配置文件:

/etc/NetworkManager/system-connections/your_connection_file
...
[ipv4]
dhcp-send-hostname=false
...
[ipv6]
dhcp-send-hostname=false
...

nm-applet disappears in i3wm[編輯 | 編輯原始碼]

If you use the xfce4-notifyd.service for notifications you must edit the unit and add the following:

/etc/systemd/user/xfce4-notifyd.service.d/display_env.conf
[Service]
Environment="DISPLAY=:0.0"

After reloading the daemons restart xfce4-notifyd.service. Exit i3 and start it back up again and the applet should show on the tray.

Unit dbus-org.freedesktop.resolve1.service not found[編輯 | 編輯原始碼]

If systemd-resolved.service is not started, NetworkManager will try to start it using D-Bus and fail:

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 ")

This is because NetworkManager will try to send DNS information to systemd-resolved regardless of the main.dns= setting in NetworkManager.conf(5).[8]

This can be disabled with a configuration file in /etc/NetworkManager/conf.d/:

/etc/NetworkManager/conf.d/no-systemd-resolved.conf
[main]
systemd-resolved=false

See FS#62138.

Secrets were required, but not provided[編輯 | 編輯原始碼]

If you received the following error when attempting to connect to a network:

$ nmcli device wifi connect SSID password password
Error: Connection activation failed: (7) Secrets were required, but not provided

This error can have numerous causes and you should read the journal (filter it with -u NetworkManager). For example, if NetworkManager took too long to establish connection, it will believe that the password is incorrect:

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

You can try deleting the connection profile and creating a new one:

$ nmcli connection delete SSID
$ nmcli device wifi connect SSID password password

You can also try disabling MAC address randomization:

/etc/NetworkManager/conf.d/wifi_rand_mac.conf
[device]
wifi.scan-rand-mac-address=no

WPA Enterprise connection with iwd[編輯 | 編輯原始碼]

If you try to connect to an WPA Enterprise network like 'eduroam' with NetworkManager with the iwd backend then you will get the following error from NetworkManager:

 Connection 'eduroam' is not avialable on device wlan0 because profile is not compatible with device (802.1x connections must have IWD provisioning files)

This is because NetworkManager can not configure a WPA Enterprise network. Therefore you have to configure it using an iwd configuration file /var/lib/iwd/essid.8021x like described in iwd#WPA Enterprise.

Failed to request VPN secrets[編輯 | 編輯原始碼]

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.

OpenVPN connections fail with OpenSSL "ca md too weak" error[編輯 | 編輯原始碼]

Since openssl was updated to version 3, certificates generated with legacy cryptographic algorithms are rejected by default. Attempting to use networkmanager-openvpn with such a setup can result in the following error in the logs:

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

The correct approach is to have the OpenVPN server administrator generate and re-issue more secure certificates. However, as an immediate work-around, OpenVPN requires tls-cipher "DEFAULT:@SECLEVEL=0". This may not be possible through the plugin GUI, but it is possible with nmcli. Separately, you will also need to enable the legacy provider in OpenSSL.

Firstly, obtain the name of the VPN connection with the issue, from the output of the following:

$ nmcli connection show

Assuming the connection name is vpn.example.com, use nmcli like so:

$ nmcli connection modify vpn.example.com +vpn.data tls-cipher=DEFAULT:@SECLEVEL=0

The change should instantly be reflected in /etc/NetworkManager/system-connections/vpn.example.com.nmconnection.

As for OpenSSL, edit /etc/ssl/openssl.cnf as described on the OpenSSL wiki.

Specifically, at the end of the [provider_sect] section add legacy = legacy_sect. Under [default_sect] uncomment activate = 1. Lastly, add a new section [legacy_sect] that also contains the line activate = 1. Excluding most other preexisting configuration sections, the end result will look something like:

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

Finally, restart the NetworkManager.service to have the new OpenSSL configuration take effect.

參見[編輯 | 編輯原始碼]