跳转至内容

NetworkManager

来自 ArchWiki

NetworkManager 是一个用于提供系统自动连接网络所需检测和配置的程序。

NetworkManager 对无线和有线网络都很有用。对于无线网络,NetworkManager 会优先选择已知的无线网络,并能够切换到最可靠的网络。支持 NetworkManager 的应用程序可以在在线和离线模式之间切换。

NetworkManager 还优先选择有线连接而非无线连接,支持调制解调器连接和某些类型的 VPN。

警告 默认情况下,密钥,例如 Wi-Fi 密码,对 root 用户在文件系统中可访问,并且可以通过 GUI(例如通过 #nm-applet)访问设置的用户也可访问。有关更多信息,请参阅 #Encrypted Wi-Fi passwords

安装

NetworkManager 可以通过 networkmanager安装,其中包含一个守护进程、一个命令行界面(nmcli)和一个基于 curses 的界面(nmtui)。

启用 NetworkManager

安装后,您应该 启动/启用 NetworkManager.service。一旦 NetworkManager 守护进程启动,它将自动连接到任何已配置的可用“系统连接”。任何“用户连接”或未配置的连接将需要 nmcli 或小程序进行配置和连接。

其他接口

移动宽带支持

NetworkManager 使用 ModemManager 来支持移动宽带连接。

安装 modemmanagerusb_modeswitch。之后 启用启动 ModemManager.service

可能需要 重启 NetworkManager.service 才能使其检测到 ModemManager。重启后,重新插入调制解调器,它应该会被识别。

从前端(例如 nm-connection-editor)添加连接,并将连接类型选择为移动宽带。选择您的 ISP 和套餐后,APN 和其他设置应通过 mobile-broadband-provider-info 中的信息自动填充。

PPPoE / DSL 支持

要获得 PPPoE / DSL 连接支持,请 安装 ppp 包。要实际添加 PPPoE 连接,请使用 nm-connection-editor 并添加新的 DSL/PPPoE 连接。

VPN 支持

NetworkManager 从 1.16 版本开始对 WireGuard 提供原生支持,只需要 wireguard 内核模块。有关详细信息,请阅读 WireGuard in NetworkManager blog post

对其他 VPN 类型的支持基于插件系统。它们包含在以下软件包中

警告 有很多与 VPN 支持相关的bug。请正确检查通过 GUI 设置的守护进程选项,并在每个软件包发布时仔细检查。
  • 为了在 VPN 连接时获得完全正常的 DNS 解析,您应该设置 条件转发
  • 这些插件可能没有文档化的命令行界面,或者在没有运行小程序的情况下根本无法工作。如果您使用常规的桌面环境,这不是问题;如果您不使用,您应该在配置或激活连接时运行 #nm-applet,以便获得必要的对话框。 [1]

用法

NetworkManager 附带 nmcli(1)nmtui(1)

nmcli 示例

列出附近的 Wi-Fi 网络

$ nmcli device wifi list

连接到 Wi-Fi 网络

$ nmcli device wifi connect SSID_or_BSSID password password

连接到隐藏的 Wi-Fi 网络

$ nmcli device wifi connect SSID_or_BSSID password password hidden yes

连接到 wlan1 接口的 Wi-Fi

$ nmcli device wifi connect SSID_or_BSSID password password ifname wlan1 profile_name

断开接口连接

$ nmcli device disconnect ifname eth0

获取连接列表,包括其名称、UUID、类型和后端设备

$ nmcli connection show

激活连接(即连接到具有现有配置文件的网络)

$ nmcli connection up name_or_uuid

删除连接

$ nmcli connection delete name_or_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 作为 connection-id。

您有三种方法可以在创建 Wired connection 2 连接后对其进行配置

nmcli 交互式编辑器
nmcli connection edit 'Wired connection 2'.
编辑器的用法有很好的记录。
nmcli 命令行界面
nmcli connection modify 'Wired connection 2' setting.property value。有关用法,请参阅 nmcli(1)。例如,您可以使用 nmcli connection modify 'Wired connection 2' ipv4.route-metric 200 命令将其 IPv4 路由指标更改为 200。

要删除设置,请向其传递一个空字段(""),如下所示

nmcli connection modify 'Wired connection 2' setting.property ""
连接文件
/etc/NetworkManager/system-connections/ 中,修改相应的 Wired connection 2.nmconnection 文件。
不要忘记使用 nmcli connection reload 重新加载配置文件。

nmtui

NetworkManager 提供了一个文本用户界面(TUI)来管理连接、系统主机名和无线电开关。可以通过运行 nmtui 来启动它。

前端

为了与 桌面环境集成,大多数用户会希望安装一个小程序。这不仅提供了方便的网络选择和配置访问,还提供了安全存储密钥所需的功能。不同的桌面环境有自己的小程序;否则,您可以使用 #nm-applet

GNOME

GNOME 有一个内置工具,可以从网络设置中访问。

KDE Plasma

安装 plasma-nm 包。之后,通过“面板选项 > 添加小部件 > 网络”菜单将其添加到 KDE 任务栏。

nm-applet

network-manager-applet 是一个 GTK 3 前端,可以在带有系统托盘的 Xorg 环境下运行。

要存储连接密钥,请安装并配置一个实现了 Secret Service D-Bus API 的应用程序,例如 GNOME/KeyringKDE WalletKeePassXC

请注意,在启用连接的复选框选项“Make available to other users”后,NetworkManager 会以明文形式存储密码,尽管相应的文件只有 root(或其他用户通过 nm-applet)可以访问。请参阅 #Encrypted Wi-Fi passwords

为了在没有系统托盘的情况下运行 nm-applet,您可以使用 trayerAURstalonetray。例如,您可以在您的 PATH 中添加一个如下的脚本

nmgui
#!/bin/sh
nm-applet    2>&1 > /dev/null &
stalonetray  2>&1 > /dev/null
killall nm-applet

当您关闭 stalonetray 窗口时,它也会关闭 nm-applet,因此一旦您完成网络设置,就不会占用额外的内存。

该小程序可以显示连接到或断开 Wi-Fi 网络的事件通知。要显示这些通知,请确保您已安装通知服务器 - 请参阅 Desktop notifications。如果您在没有通知服务器的情况下使用该小程序,您可能会在 stdout/stderr 中看到一些消息,并且该小程序可能会挂起。请参阅 [2]

为了在禁用这些通知的情况下运行 nm-applet,请使用以下命令启动该小程序

$ nm-applet --no-agent
提示 nm-applet 可能会通过 autostart desktop file 自动启动,要添加 --no-agent 选项,请修改其中的 Exec 行,例如
Exec=nm-applet --no-agent
警告i3 上,如果使用 --no-agent 选项启动 nm-applet,则无法通过单击项目列表来连接到新的加密 Wi-Fi 网络,因为不会弹出密码输入对话框。 journal 将显示 no secrets: No agents were available for this request

Appindicator

从版本 1.18.0 开始,Appindicator 支持在官方 network-manager-applet 包中可用。要在 Appindicator 环境中使用 nm-applet,请使用以下命令启动该小程序

$ nm-applet --indicator

networkmanager-dmenu

或者,还有 networkmanager-dmenu,这是一个小脚本,可以使用 dmenurofi 来管理 NetworkManager 连接,而不是 nm-applet。它提供了所有基本功能,例如连接到现有的 NetworkManager Wi-Fi 或有线连接、连接到新的 Wi-Fi 连接、在需要时请求密码、连接到现有 VPN 连接、启用/禁用网络、启动 nm-connection-editor GUI、连接到蓝牙网络。

switchboard

Pantheon 的 switchboard 结合 switchboard-plug-networknm-connection-editor,提供了一种独立于桌面环境的方式来配置 NetworkManager。可以使用以下命令运行它

$ io.elementary.settings

配置

NetworkManager 需要一些额外的步骤才能正常运行。确保您已按照 Network configuration#Set the hostname 部分的说明配置了 /etc/hosts

NetworkManager 的全局配置文件位于 /etc/NetworkManager/NetworkManager.conf。其他配置文件可以放在 /etc/NetworkManager/conf.d/ 中。通常不需要对全局默认设置进行任何配置。

编辑配置文件后,可以通过运行以下命令应用更改

# nmcli general reload

NetworkManager-wait-online

启用 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_TIMEOUT60 更改为更高的值。

设置 PolicyKit 权限

默认情况下,处于活动本地会话中的所有用户都可以在不输入密码的情况下更改大多数网络设置。请参阅 General troubleshooting#Session permissions 来检查您的会话类型。在大多数情况下,一切都应该开箱即用。

某些操作(例如更改系统主机名)需要管理员密码。在这种情况下,您需要将自己 添加wheel 组并运行一个 Polkit 认证代理,它会提示您输入密码。

对于远程会话(例如 headless VNC),您有几种选项可以获取使用 NetworkManager 所需的特权

  1. 将自己 添加wheel 组。您将不得不为每个操作输入密码。请注意,您的用户帐户也可能获得其他权限,例如无需输入 root 密码即可使用 sudo
  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 支持一些代理设置。虽然无法直接使用 nmtuinm-appletnmcli 修改它们,但它们都支持。请参阅 nm-settings-nmcli(5) 中的代理设置。

此外,可以使用 dispatcher 脚本始终运行自定义代理命令,请参阅 #Dispatcher examples

另请参阅 Proxy settings

检查连接性

NetworkManager 连接到网络后可以尝试访问一个网页服务器,以确定它是否位于认证门户后面。默认主机(在 /usr/lib/NetworkManager/conf.d/20-connectivity.conf 中配置)是 ping.archlinux.org(redirect.archlinux.org 的 CNAME 别名)。要使用不同的网页服务器或禁用连接性检查,请创建 /etc/NetworkManager/conf.d/20-connectivity.conf,请参阅 NetworkManager.conf(5) § CONNECTIVITY SECTION。下面是一个使用 GNOME 服务器的示例(不需要使用 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 的默认连接 URL 承诺不记录任何访问。请参阅 [3] [4]

认证门户

本文或本节需要在语言、wiki 语法或风格方面进行改进。请参阅 Help:Style 获取参考。

原因: 复杂的脚本不应在 wiki 上维护。(在 Talk:NetworkManager 中讨论)

对于那些位于 认证门户后面的用户,桌面管理器可能会自动打开一个窗口要求输入凭据。如果您的桌面没有,您可以使用 capnet-assist 包(但它目前有一个损坏的 NetworkManager dispatcher 脚本)。或者,您可以创建一个如下内容的 NetworkManager 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

使脚本可执行。但该脚本假定您使用 X 并直接打开 http 页面。它可能不适用于所有人。

您需要 重启 NetworkManager.service 或重新启动才能使其开始工作。一旦完成,当检测到您位于认证门户后面时,dispatcher 脚本应该会打开一个登录窗口。

简单的解决方案是 captive-portal-sh - 一个获取认证门户 URL 并在默认浏览器中打开它的 shell 脚本(仅限 Wayland 用户)。

另一个解决方案是基于 Google Chrome 的 captive-browser-gitAUR

iwd 对旧硬件认证门户的支持

一些较旧的 Wi-Fi 芯片(例如 Broadcom BCM4360)需要专有的 wl 驱动程序,该驱动程序不支持许多认证门户热点在显示登录页面之前使用的 OWE/椭圆曲线握手。通过将 NetworkManager 的 Wi-Fi 后端切换到 iwd(参见 #Using iwd as the Wi-Fi backend),它在现有驱动程序之上在用户空间实现了完整的 OWE 密钥交换,您可以完成加密关联,获得 DHCP 租约,并触发门户“PORTAL”状态。一旦完成,任何 dispatcher 脚本或浏览器启动器都将可靠地弹出登录页面,而硬件否则将永远无法完全连接。

DHCP 客户端

默认情况下,NetworkManager 使用其内部 DHCP 客户端。内部 DHCPv4 插件基于 nettools 的 n-dhcp4 库,而内部 DHCPv6 插件则基于 systemd-networkd 的代码。

要使用不同的 DHCP 客户端,请安装其中一个替代品

要更改 DHCP 客户端后端,请在 /etc/NetworkManager/conf.d/ 中使用配置文件设置 main.dhcp=dhcp_client_name 选项。例如:

/etc/NetworkManager/conf.d/dhcp-client.conf
[main]
dhcp=dhcpcd

请勿启用 dhclientdhcpcd 软件包随附的 systemd 单元。它们将与 NetworkManager 冲突,有关详细信息,请参阅 #Installation 中的说明。

DNS 管理

NetworkManager 的 DNS 管理在 GNOME 项目的 wiki 页面上进行了描述—Projects/NetworkManager/DNS

DNS 缓存和条件转发

NetworkManager 有一个插件,可以使用 dnsmasqsystemd-resolved 来启用 DNS 缓存和条件转发(在 NetworkManager 的文档中先前称为“split 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 中找到。您可以通过使用 drill example.com 进行两次相同的 DNS 查询并验证服务器和查询时间来确认正在使用 dnsmasq。

  • 您无需启动 dnsmasq.service 或编辑 /etc/dnsmasq.conf。NetworkManager 将在不使用 systemd 服务且不读取 dnsmasq 的默认配置文件的情况下启动 dnsmasq。
  • NetworkManager 启动的 dnsmasq 实例将绑定到 127.0.0.1:53,您不能在同一地址和端口上运行任何其他软件(包括 dnsmasq.service)。
自定义 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

本文或本章节的准确性存在争议。

原因:这并未解决问题,因为 NetworkManager 不会将 ::1 添加到 /etc/resolv.conf。除非手动将 @::1 传递给 drill,否则仍会因 Error: error sending query: No (valid) nameservers defined in the resolver 而失败。(在 Talk:NetworkManager 中讨论)

在 NetworkManager 中启用 dnsmasq 可能会破坏仅限 IPv6 的 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,前提是存在该选项。

DNSSEC

NetworkManager 默认启动的 dnsmasq 实例将不会验证 DNSSEC。要启用 DNSSEC 验证,从而破坏与不支持它的名称服务器的 DNS 解析,请创建以下配置文件

/etc/NetworkManager/dnsmasq.d/dnssec.conf
conf-file=/usr/share/dnsmasq/trust-anchors.conf
dnssec
systemd-resolved

本文章或章节需要扩充。

原因:NetworkManager 1.16 添加了一个新设置 main.systemd-resolved[5](默认启用)。它会无条件地将 DNS 配置发送到 systemd-resolved。与 systemd-resolved#DNS 中的“Preserving resolv.conf”相关?(在 Talk:NetworkManager 中讨论)

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 解析器

如果 openresolv 有一个适用于您本地 DNS 解析器的订阅者,请设置该订阅者并配置 NetworkManager 以使用 openresolv

由于 NetworkManager 向 resolvconf 公告单个“接口”,因此无法在两个 NetworkManager 连接之间实现条件转发。请参阅 NetworkManager issue 153

如果可以在 /etc/resolvconf.conf 中设置 private_interfaces="*"[6],则可以部分缓解此问题。对于不在搜索域列表中的域的任何查询都不会被转发。它们将根据本地解析器的配置进行处理,例如,转发到另一个 DNS 服务器或从 DNS 根递归解析。

自定义 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)

设置将取决于所使用的前端类型;该过程通常涉及右键单击小程序,编辑(或创建)配置文件,然后选择 DHCP 类型为 Automatic (specify addresses)。需要输入 DNS 地址,通常格式为:127.0.0.1, DNS-server-one, ...

在连接中设置自定义 DNS 服务器(nmcli / 配置文件)

要为每个连接设置 DNS 服务器,您需要更改 连接设置中的 ipv4.dnsipv6.dns 设置(以及它们相关的 dns-searchdns-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
注意 此示例使用 Quad9。请替换为您信任的 DNS 解析器。请参阅 Domain name resolution#Third-party DNS services

/etc/resolv.conf

NetworkManager 的 /etc/resolv.conf 管理模式通过 main.rc-manager 设置进行配置。networkmanager 将其设置为 symlink,而不是上游默认值 auto。该设置及其值记录在 NetworkManager.conf(5) man 页中。

提示 使用 openresolv 可以让 NetworkManager 与其他支持 resolvconf 的软件共存,或者,例如,运行一个本地 DNS 缓存和 split-DNS 解析器,为此 openresolv 有一个 订阅者。请注意,在使用 NetworkManager 和 openresolv 时,条件转发尚未完全支持

NetworkManager 还通过所谓的 dispatcher 脚本提供钩子,可用于在网络更改后修改 /etc/resolv.conf。有关更多信息,请参阅 #Network services with NetworkManager dispatcherNetworkManager(8)

  • 如果 NetworkManager 配置为使用 dnsmasqsystemd-resolved,则会将相应的回环地址写入 /etc/resolv.conf
  • NetworkManager 写入或将要写入 /etc/resolv.confresolv.conf 文件可以在 /run/NetworkManager/resolv.conf 中找到。
  • 包含已获取名称服务器和搜索域的 resolv.conf 文件可以在 /run/NetworkManager/no-stub-resolv.conf 中找到。
未管理的 /etc/resolv.conf

要阻止 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 不会向 systemd-resolved 发送 DNS 配置。
注意 有关如何配置 NetworkManager 使用其他 DNS 后端(如 dnsmasqsystemd-resolved)而不是使用 main.dns=none,请参阅 #DNS caching and conditional forwarding

之后,/etc/resolv.conf 可能会成为一个损坏的符号链接,您需要将其删除。然后,创建一个新的 /etc/resolv.conf 文件。

使用 openresolv
注意 NetworkManager 不支持使用 systemd-resolved 的 resolvconf 接口(resolvectl(1) § COMPATIBILITY WITH RESOLVCONF(8)),该接口由 systemd-resolvconf 提供。

要配置 NetworkManager 以使用 openresolv,请在 /etc/NetworkManager/conf.d/ 中使用配置文件设置 main.rc-manager=resolvconf

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

防火墙

您可以根据当前连接分配 firewalld 区域。例如,在工作时使用严格的防火墙,在家时使用不太严格的防火墙。

也可以使用 NetworkManager dispatcher 来完成此操作。

NetworkManager dispatcher 的网络服务

在 NetworkManager 启动接口之前,您不希望运行许多网络服务。NetworkManager 能够:在您连接到网络时启动服务,在您断开连接时停止服务(例如,在使用 NFSSMBNTPd 时)。

要激活此功能,您需要启用启动 NetworkManager-dispatcher.service

服务激活后,可以将脚本添加到 /etc/NetworkManager/dispatcher.d 目录中。

脚本必须由 root 拥有,否则 dispatcher 将不会执行它们。为了提高安全性,请也将组所有权设置为 root。

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

确保文件是可执行的

脚本将在连接时按字母顺序运行,在断开连接时按反字母顺序运行。为了确保它们的启动顺序,通常会在脚本名称前使用数字字符(例如 10-portmap30-netfs(这可以确保在尝试挂载 NFS 之前 portmapper 已经启动))。

脚本将接收以下参数

警告 如果连接到外部或公共网络,请注意您正在启动哪些服务以及您期望哪些服务器可用于它们进行连接。在连接到公共网络时启动错误的服务可能会导致安全漏洞。

避免 dispatcher 超时

如果以上内容有效,则此部分不适用。但是,有一个与运行 dispatcher 脚本相关的一般问题,这些脚本需要更长的时间才能执行。最初只使用了三秒钟的内部超时。如果调用的脚本未及时完成,它将被终止。后来超时延长到大约 20 秒(有关更多信息,请参阅 Bugtracker)。如果超时仍然导致问题,一种解决方法可能是为 NetworkManager-dispatcher.service 使用 drop-in 文件,使其在退出后保持活动状态。

/etc/systemd/system/NetworkManager-dispatcher.service.d/remain_after_exit.conf
[Service]
RemainAfterExit=yes

现在启动并启用修改后的 NetworkManager-dispatcher 服务。

警告RemainAfterExit 行添加到其中将阻止 dispatcher 关闭。不幸的是,dispatcher 必须在能够再次运行您的脚本之前关闭。有了它,dispatcher 将不会超时,但它也不会关闭,这意味着脚本在每次启动时只会运行一次。因此,除非超时确实造成了问题,否则不要添加该行。

Dispatcher 示例

自动设置时区

创建一个 NetworkManager dispatcher 脚本并使其可执行

/etc/NetworkManager/dispatcher.d/09-timezone
#!/bin/sh
case "$2" in
    up)
        timedatectl set-timezone "$(curl --fail https://ipapi.co/timezone)"
    ;;
esac
提示 使用 connectivity-change 而不是 up 可以防止在连接到 VPN(使用 OpenConnect 等客户端)时更改时区。

或者,工具 tzupdateAUR 可以根据 IP 地址的地理位置自动设置时区。此最受欢迎的 IP 地理定位 API 比较可能有助于决定在生产环境中使用哪个 API。

使用 sshfs 挂载远程目录

由于脚本在非常受限的环境中运行,您必须导出 SSH_AUTH_SOCK 才能连接到您的 SSH 代理。有多种方法可以实现这一点,有关更多信息,请参阅此消息。下面的示例适用于 GNOME Keyring,如果尚未解锁,它会要求您输入密码。如果 NetworkManager 在登录时自动连接,则 gnome-keyring 可能尚未启动,并且导出将失败(因此需要 sleep)。可以使用命令 nmcli connection statusnmcli connection list 找到要匹配的 UUID

#!/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
  • 由于 NetworkManager 0.9.8,pre-downdown 事件在关机或重启时不会执行,有关更多信息,请参阅此 bug 报告
  • 先前的 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 共享

请参阅 NFS#Using a NetworkManager dispatcher

使用 dispatcher 根据 LAN 线缆插入情况自动切换无线

其思想是仅在拔出 LAN 线缆时(例如,从笔记本扩展坞断开连接时)打开 Wi-Fi,并且一旦重新插入 LAN 线缆,Wi-Fi 将自动禁用。

创建以下 dispatcher 脚本[7],将 Your_Ethernet_Interface 替换为您的以太网接口的设备名称。

注意 您可以使用 nmclinmcli d | grep ethernet)获取接口列表。以太网接口以 eneth 开头,例如 enp0s5eth0

请记住使脚本可执行。您可以通过重启 NetworkManager.service、运行 ip a 并检查 wlp3s0(或您的 Wi-Fi 接口名称)是否处于 state DOWN 状态来验证其是否正常工作。如果遇到意外行为,请检查 NetworkManager-dispatcher.service日志

/etc/NetworkManager/dispatcher.d/99-wifi-auto-toggle
#!/bin/sh

LOG_PREFIX="WiFi Auto-Toggle"
ETHERNET_INTERFACE="Your_Ethernet_Interface"

if [ "$1" = "$ETHERNET_INTERFACE" ]; then
    case "$2" in
        up)
            echo "$LOG_PREFIX ethernet up"
            nmcli radio wifi off
            ;;
        down)
            echo "$LOG_PREFIX ethernet down"
            nmcli radio wifi on
            ;;
    esac
elif [ "$(nmcli -g GENERAL.STATE device show $ETHERNET_INTERFACE)" = "20 (unavailable)" ]; then
    echo "$LOG_PREFIX failsafe"
    nmcli radio wifi on
fi
注意 在 LAN 接口上次连接时断开连接,然后在计算机关闭时断开连接的情况下,存在一个故障安全机制。这意味着计算机重新启动时无线电仍然关闭,并且 LAN 接口断开连接,您将没有网络。

使用 dispatcher 在网络连接建立后连接到 VPN

在此示例中,我们希望在连接到特定 Wi-Fi 网络后自动连接到先前定义的 VPN 连接。首先要做的是创建 dispatcher 脚本,该脚本定义在连接到网络后应执行的操作。

本文或本章节的准确性存在争议。

原因:脚本不带 iwgetid 也能工作,而且可能更可靠?(在 Talk:NetworkManager#Fixes for automatic VPN dispatcher script 中讨论)
注意 该脚本需要 wireless_tools 才能使用 iwgetid
/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)。请记住相应地设置脚本的权限。

尝试使用上述脚本连接可能仍会因 NetworkManager-dispatcher.service 抱怨“no valid VPN secrets”而失败,这是因为VPN secrets 的存储方式。幸运的是,有不同的选项可以让上述脚本访问您的 VPN 密码。

1:其中一个选项需要编辑 VPN 连接配置文件,以使 NetworkManager 自身存储 secrets 而不是将其存储在对 root 无法访问的密钥环中:打开 /etc/NetworkManager/system-connections/name of your VPN connection.nmconnection 并将 password-flagssecret-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
注意 现在可能需要重新打开 NetworkManager 连接编辑器并再次保存 VPN 密码/secrets。

使用 dispatcher 禁用 VPN 提供商连接上的 IPv6

许多商业 VPN 提供商仅支持 IPv4。这意味着所有 IPv6 流量都会绕过 VPN,使其几乎无用。为避免这种情况,可以在 VPN 连接激活期间使用 dispatcher 禁用所有 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
警告 上述脚本不适用于 WireGuard,因为 NetworkManager 不会为它发送 vpn-up/down 事件,您必须依赖于 WireGuard 接口的通用事件,如脚本所示。

作为替代方案,dispatcher 可用于将 VPN 连接使用的设备的 IPv6 模式临时设置为 link-local。这将避免 NetworkManager 因禁用 IPv6 而产生的日志记录。如果多个设备或连接提供 IPv6 连接,此脚本将不起作用,但可以调整为迭代多个设备。请注意,对连接的任何更改(使用 nmcli(1)桌面环境)都会将整个连接重新应用于设备,并重新启用 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

OpenNTPD

请参阅 OpenNTPD#Using NetworkManager dispatcher

通过 DHCP 使用 systemd-timesyncd 动态设置 NTP 服务器

在不同网络之间漫游时(例如,公司 LAN、家庭 Wi-Fi、各种其他 Wi-Fi),您可能希望将 timesyncd 使用的 NTP 服务器设置为 DHCP 提供的服务器。但是,NetworkManager 本身无法与 systemd-timesyncd 通信以设置 NTP 服务器。

Dispatcher 可以解决这个问题。

如果您的 systemd-timesyncd 配置目录 /etc/systemd/timesyncd.conf.d 不存在,请创建它。在 /etc/NetworkManager/dispatcher.d 中,放置以下内容:

/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 0
	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 文件,以便可以通过应用程序菜单加载 NetworkManager 小程序。如果没有,您将需要找到要使用的命令,或者注销并重新登录以启动小程序。小程序启动后,它很可能会开始轮询网络连接以通过 DHCP 服务器进行自动配置。

要在非 xdg 兼容的窗口管理器(如 awesome)中启动 GNOME 小程序

nm-applet --sm-disable &

对于静态 IP 地址,您必须配置 NetworkManager 以使其能够识别它们。该过程通常涉及右键单击小程序并选择类似“Edit Connections”的选项。

技巧与提示

加密的 Wi-Fi 密码

默认情况下,NetworkManager 将密码以明文形式存储在 /etc/NetworkManager/system-connections/ 的连接文件中。要打印存储的密码,请使用以下命令:

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

密码对于 root 用户在文件系统中可用,并且对于通过 GUI(例如 nm-applet)访问设置的用户也可用。

最好将密码以加密形式存储在密钥环中,而不是明文。缺点是连接必须为每个用户进行设置。

为了读取和写入密钥环,必须有一个可用的 secret agent。它可以是以下之一:

  • 带有 --ask 选项的 nmcli
  • 来自#Front-ends 的图形界面之一

如果您没有提供以上任何一项,则身份验证将失败并出现错误 no secrets: No agents were available for this request.

使用 GNOME Keyring

密钥环守护程序必须已启动,并且密钥环需要解锁才能使以下操作生效。

此外,NetworkManager 需要配置为不为所有用户存储密码。使用 GNOME 的 network-manager-applet,从终端运行 nm-connection-editor,选择一个网络连接,单击“Edit”,选择“Wi-Fi Security”选项卡,然后单击密码右侧的图标并勾选“Store the password only for this user”。

使用 KDE Wallet

使用 KDE 的 plasma-nm,单击小程序,然后单击右上角的“Settings”图标,单击一个网络连接,在“General configuration”选项卡中,取消勾选“All users may connect to this network”。如果勾选了该选项,即使密钥环守护程序正在运行,密码仍将以明文形式存储。

如果之前选择了该选项并取消勾选了它,您可能需要先使用 reset 选项使密码从文件中消失。或者,先删除连接,然后重新设置。

通过 Wi-Fi 共享互联网连接

您只需点击几下即可共享您的互联网连接(例如 3G 或有线)。请注意,防火墙可能会干扰互联网共享。

您需要一张支持 AP 模式的 Wi-Fi 卡,有关详细信息,请参阅 Software access point#Wi-Fi device must support AP mode

安装 dnsmasq 软件包才能实际共享连接。请注意,NetworkManager 会启动自己的 dnsmasq 实例,独立于 dnsmasq.service,作为 DHCP 服务器。有关注意事项,请参阅 #dnsmasq

创建共享连接

  • 单击小程序并选择“Create new wireless network”。
  • 遵循向导(选择 WPA2 或更高版本,确保使用至少 8 个字符的密码,较短的长度将失败)。
    • 选择 Hotspot 或 Ad-hoc 作为 Wi-Fi 模式。

连接将保存并保留,以备下次使用。

注意 Android 不支持连接到 Ad-hoc 网络。要与 Android 共享连接,请使用基础设施模式(即 Wi-Fi 模式设置为“Hotspot”)。

通过以太网共享互联网连接

场景:您的设备通过 Wi-Fi 连接互联网,并且您想通过以太网将互联网连接共享给其他设备。

需求

  • 安装 dnsmasqnm-connection-editor 软件包以实际共享连接。请注意,NetworkManager 会启动自己的 dnsmasq 实例,独立于 dnsmasq.service,作为 DHCP 服务器。有关注意事项,请参阅 #dnsmasq
  • 您的互联网连接设备和其他设备通过合适的以太网线缆连接(这通常意味着交叉线缆或中间有一个交换机)。
  • 互联网共享不会被防火墙阻止。

步骤

  • 从终端运行 nm-connection-editor
  • 添加新的以太网连接。
  • 为其起一个有意义的名称。例如“Shared Internet”。
  • 转到“IPv4 Settings”。
  • 对于“Method:”选择“Shared to other computers”。
  • 保存。

现在,在 NetworkManager 的有线连接下,您应该会看到一个名为“Shared Internet”的新选项。

在 cron 作业或脚本中检查网络是否启动

本文或本章节已过时。

原因:nm-tool 已从 NetworkManager 中移除很长时间了[8]。应该使用 nmcli 代替。(在 Talk: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

这对于运行F-Prot病毒扫描程序签名更新的cron.hourly脚本很有用,例如。另一种可能有用的方法是,通过一些修改,可以使用nm-tool的各种输出部分来区分不同的网络;例如,由于活动无线网络用星号表示,您可以grep网络名称,然后grep文字星号。

开机时通过密码连接到网络

默认情况下,NetworkManager在开机时不会自动连接需要密码的网络。这是因为默认情况下,它将这些连接锁定给创建它们的用户,只有在他们登录后才会连接。要更改此设置,请执行以下操作:

  1. 右键单击面板中的nm-applet图标,选择“编辑连接”,然后打开“无线”选项卡。
  2. 选择要操作的连接,然后单击“编辑”按钮。
  3. 选中“自动连接”和“所有用户可用”复选框。
  4. 此外,请确保在“Wi-Fi安全”下选择了“为所有用户存储密码(未加密)”。

注销并重新登录以完成。

OpenConnect与KWallet中的密码

虽然您可以在连接时输入这两个值,但plasma-nm 0.9.3.2及更高版本能够直接从KWallet检索OpenConnect用户名和密码。

打开“KDE钱包管理器”,在“网络管理|映射”下查找您的OpenConnect VPN连接。单击“显示值”,然后在“VpnSecrets”键中输入您的凭据(相应地替换usernamepassword)。

form:main:username%SEP%username%SEP%form:main:password%SEP%password

下次连接时,用户名和密码应出现在“VPN秘密”对话框中。

忽略特定设备

有时可能希望NetworkManager忽略特定设备,而不尝试为其配置地址和路由。您可以通过MAC地址或接口名称快速轻松地忽略设备,方法是在/etc/NetworkManager/conf.d/unmanaged.conf中使用以下内容:

[keyfile]
unmanaged-devices=mac:00:22:68:1c:59:b1;mac:00:1E:65:30:D1:C4;interface-name:eth0

编辑文件后,以root身份运行nmcli general reload。之后,您应该能够配置接口而NetworkManager不会更改您已设置的内容。

配置MAC地址随机化

本文档或本节候选内容已合并到NetworkManager/Privacy#MAC Randomization

注意:现在有一个专门的隐私子页面。(在Talk:NetworkManager中讨论)
注意 可能需要禁用MAC地址随机化才能获得(稳定的)链接连接[9]以及/或限制基于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随机化方面,最重要的模式是stablerandomstable会在您连接到新网络时生成一个随机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 Wi-Fi and associate the two permanently.
wifi.cloned-mac-address=stable

要为特定连接配置MAC随机化(例如,如果网络不喜欢随机MAC地址),请编辑连接,将802-11-wireless.cloned-mac-address设置为其中一种模式(例如stablerandom)。

有关更多详细信息,请参阅以下GNOME博客文章

关闭主机名发送

默认情况下,NetworkManager会将主机名发送到DHCP服务器。

要全局禁用将主机名发送到DHCP服务器,请使用/etc/NetworkManager/conf.d/中的配置文件设置ipv4.dhcp-send-hostname=0ipv6.dhcp-send-hostname=0选项。例如:

/etc/NetworkManager/conf.d/dhcp-send-hostname.conf
[connection]
ipv4.dhcp-send-hostname=0
ipv6.dhcp-send-hostname=0

要为特定连接禁用将主机名发送到DHCP服务器(或者,如果全局禁用,则为连接启用它),请将以下内容添加到您的网络连接文件:

/etc/NetworkManager/system-connections/your_connection_file.nmconnection
...
[ipv4]
dhcp-send-hostname=false
...
[ipv6]
dhcp-send-hostname=false
...
注意 这些选项仅由默认的内部DHCP客户端处理。要在使用NetworkManager和dhcpcd时省略发送主机名,请编辑/etc/dhcpcd.conf并在最后一行插入anonymous

启用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-UUID进行标识。这意味着所有连接都共享相同的UUID,这可能存在隐私泄露风险。

幸运的是,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 setting中有关dhcp-duid的描述。

处理有线连接

默认情况下,NetworkManager为发现的每个有线以太网连接生成一个连接配置文件。在生成连接时,它不知道是否会有更多以太网适配器可用。因此,它将第一个有线连接命名为“有线连接1”。您可以通过配置no-auto-default(请参阅NetworkManager.conf(5))或直接删除它来避免生成此连接。然后NetworkManager会记住不再为该接口生成连接。

您还可以编辑连接(并将其持久化到磁盘)或删除它。NetworkManager不会重新生成新连接。然后您可以将名称更改为您想要的任何名称。您可以使用nm-connection-editor等工具来完成此任务。

使用iwd作为Wi-Fi后端

  • 不要启用iwd.service或手动配置iwd。NetworkManager将自行启动和管理它。
  • 在切换到iwd之前,请考虑现有问题

要启用实验性的iwd后端,首先安装iwd,然后创建以下配置文件:

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

或者,您可以安装networkmanager-iwdAUR,这是一个修改过的软件包,配置为仅与iwd配合使用NetworkManager,主要区别在于iwd是必需的,而wpa_supplicant可以在构建后卸载。

注意 切换到iwd后,您可能需要转换现有的NetworkManager网络配置文件

在网络命名空间中运行

如果您想在网络命名空间中运行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错误。

自动连接到VPN

NetworkManager可以设置为在连接到互联网时自动连接到VPN,这是按网络进行设置的。VPN连接本身可以在GNOME的NetworkManager前端添加,但要使其自动使用VPN,必须使用nmcli。其他前端可能没有此限制。

首先,请确保使VPN连接可供所有用户使用。在GNOME中,这只需要在“详细信息”选项卡下勾选一个复选框。在“身份”选项卡中,在密码字段中,单击字段右侧的图标,并将其设置为“为所有用户存储密码”。

然后找到VPN连接的UUID,并将其添加到Internet连接的connection.secondaries中。

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

现在,当NetworkManager重新启动并且您连接到配置的Internet连接时,您应该会自动连接到VPN。

故障排除

安全Wi-Fi网络无密码提示

当尝试连接到安全的Wi-Fi网络时,不会出现密码提示,也不会建立连接。当未安装任何密钥环包时,就会发生这种情况。一个简单的解决方案是安装gnome-keyring。如果您希望以加密形式存储密码,请按照GNOME Keyring的说明设置gnome-keyring-daemon

网络管理已禁用

当NetworkManager关闭但pid(状态)文件未删除时,您将看到“Network management disabled”消息。如果发生这种情况,请手动删除该文件:

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

内部DHCP客户端问题

如果您在使用内部DHCP客户端时遇到获取IP地址的问题,请考虑使用其他DHCP客户端,请参阅#DHCP client获取说明。此解决方法可以解决大型无线网络(如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是此NIC的MAC地址。可以使用来自iproute2包的ip link show interface命令找到MAC地址。

未检测到3G调制解调器

请参阅Mobile broadband modem#NetworkManager

关闭笔记本电脑的WLAN

有时NetworkManager在您使用笔记本电脑上的开关禁用Wi-Fi适配器然后再次启用它时将无法正常工作。这通常是rfkill的问题。要检查驱动程序是否将无线适配器的状态通知给rfkill,请使用:

$ watch -n1 rfkill list all

如果关闭适配器后某个标识符仍被阻止,您可以尝试手动取消阻止它(其中X是上述输出提供的标识符编号):

# rfkill event unblock X

静态IP地址设置已恢复为DHCP

本文或本章节已过时。

原因:本节于2010年添加,描述了一个旧版本的nm-applet。在2024年是否仍然相关?(在Talk:NetworkManager中讨论)

由于一个未解决的bug,在将默认连接更改为静态IP地址时,nm-applet可能无法正确保存配置更改,并会恢复为自动DHCP。

要解决此问题,您必须在nm-applet中编辑默认连接(例如“Auto eth0”),更改连接名称(例如“my eth0”),取消选中“所有用户可用”复选框,根据需要更改静态IP地址设置,然后单击应用。这将以给定名称保存新连接。

接下来,您需要使默认连接不自动连接。为此,请运行nm-connection-editor不要以root身份运行)。在连接编辑器中,编辑默认连接(例如“Auto eth0”)并取消选中“自动连接”。单击应用并关闭连接编辑器。

无法作为普通用户编辑连接

请参阅#Set up PolicyKit permissions

忘记隐藏的无线网络

由于隐藏网络未在“无线”视图的选择列表中显示,因此无法使用GUI将其忘记(删除)。您可以使用以下命令删除一个:

# rm /etc/NetworkManager/system-connections/SSID.nmconnection

这也适用于任何其他连接。

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。作为“临时”修复(此bug已经存在一段时间了),创建以下符号链接:

  • 对于OpenConnect:ln -s /usr/lib/nm-openconnect-auth-dialog /usr/lib/gnome-shell/
  • 对于VPNC(即Cisco VPN):ln -s /usr/lib/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密码保留为明文,如#Use dispatcher to connect to a VPN after a network connection is established的步骤(2.)中所述。

如果您使用nm-applet GUI中的新“自动连接VPN”选项,则不再需要使用步骤(1.)中描述的分派器进行自动连接。

systemd瓶颈

随着时间的推移,日志文件(/var/log/journal)可能会变得非常大。这可能会对使用NetworkManager的启动性能产生很大影响,请参阅:systemd#Boot time increasing over time

频繁的网络断开、延迟和丢包(Wi-Fi)

NetworkManager每2分钟扫描一次。

一些Wi-Fi驱动程序在连接/关联时扫描基站时存在问题。症状包括VPN断开/重连和丢包,网页加载失败后又能正常刷新。

以root身份运行journalctl -f将表明正在发生这种情况,日志中将定期包含以下类似消息:

NetworkManager[410]: <info>  (wlp3s0): roamed from BSSID 00:14:48:11:20:CF (my-wifi-name) to (none) ((none))

如果漫游不重要,则可以通过锁定Wi-Fi连接配置文件中的接入点BSSID来禁用定期扫描行为。

Lenovo笔记本电脑(IdeaPad、Legion等)无法开启Wi-Fi

某些Lenovo型号上的ideapad_laptop模块存在问题,因为Wi-Fi驱动程序错误地报告了软块。卡片仍然可以通过netctl进行操作,但NetworkManager等管理器会失败。您可以通过在切换硬件开关后检查rfkill list的输出来验证这是否是问题,并看到软块仍然存在。

本文或本章节的准确性存在争议。

原因:尝试使用rfkill.default_staterfkill.master_switch_mode(请参阅kernel-parameters.html)来修复rfkill问题。(在Talk:NetworkManager中讨论)

卸载ideapad_laptop模块应该可以解决此问题。(警告:这也可能禁用笔记本电脑键盘和触摸板!)

nm-applet在i3wm中消失

如果您使用xfce4-notifyd.service进行通知,则必须编辑单元并添加以下内容:

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

在重新加载守护进程后,重启xfce4-notifyd.service。退出i3并重新启动它,applet应该会显示在托盘中。

未找到单元dbus-org.freedesktop.resolve1.service

如果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将尝试向systemd-resolved发送DNS信息,而与NetworkManager.conf(5)中的main.dns=设置无关。[10]

可以通过/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

使用iwd的WPA Enterprise连接

如果您尝试使用NetworkManager和iwd后端连接到“eduroam”等WPA Enterprise网络,则会从NetworkManager收到以下错误:

 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中所述。

无法请求VPN秘密

如果您收到此错误:

Failed to request VPN secrets #1: No agents were available for this request.

这要么是因为密码为空,要么是因为您需要设置PolicyKit权限

OpenVPN连接失败并出现“secrets: failed to request VPN secrets”警告

本文或本节正考虑移除。

原因:这不值得设置一个故障排除部分。可选依赖项由pacman标出,如果这还不够清楚,则应在#VPN support中进行说明。(在Talk:NetworkManager#Remove unnecessary section 8.22中讨论)

软件包networkmanager-openvpn要求libnma-gtk4,并且在与GNOME-Shell集成时可选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.

OpenVPN连接因OpenSSL“ca md too weak”错误而失败

由于openssl已更新到3.0版本,默认情况下将拒绝使用旧加密算法生成的证书。尝试将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需要tls-cipher "DEFAULT:@SECLEVEL=0"。这可能无法通过插件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中。

至于OpenSSL,请编辑/etc/ssl/openssl.cnf,如OpenSSL wiki中所述。

具体来说,在[provider_sect]部分的末尾添加legacy = legacy_sect。在[default_sect]下,取消注释activate = 1。最后,添加一个新部分[legacy_sect],其中也包含行activate = 1。排除大多数其他预先存在的配置部分,最终结果将如下所示:

/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配置生效。

WPA Enterprise连接因OpenSSL“unsupported protocol”错误而无法进行身份验证

由于openssl已更新到3.0版本,“SSL 3、TLS 1.0、TLS 1.1和DTLS 1.0仅在安全级别0下工作”默认情况下。尝试向仅支持旧标准的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中破坏性的更改([11])。由于这也会降低使用OpenSSL级别1的所有其他程序的安全性,因此不推荐这样做。相反,您可以直接设置wpa_supplicant使用的级别,如BBS#286417中所述。要仅更改受影响的连接,可以在连接配置文件[802-1x]部分中设置phase1-auth-flags=32phase1-auth-flags=64。这可能无法通过GUI完成,但可以使用nmcli完成。

首先,使用以下命令获取有问题Wi-Fi连接的名称:

$ nmcli connection show

假设该连接使用TLS 1.0且名称为Example Wi-Fi,请像这样使用nmcli

$ nmcli connection modify 'Example Wi-Fi' 802-1x.phase1-auth-flags 32

对于TLS 1.1连接,请键入“64”。

$ nmcli connection modify 'Example Wi-Fi' 802-1x.phase1-auth-flags 64
注意 您键入的数字是指2的n次幂的数字。此处,n是网络身份验证字节的索引,从右到左读取。翻转第五位可启用TLS 1.0 [log(2) 32],翻转第六位可启用TLS 1.1 [log(2) 64]

更改应立即反映在/etc/NetworkManager/system-connections/Example Wi-Fi.nmconnection中。

最后,重启NetworkManager.service以使新的OpenSSL配置生效。

参见

© . This site is unofficial and not affiliated with Arch Linux.

Content is available under GNU Free Documentation License 1.3 or later unless otherwise noted.