NetworkManager

来自 ArchWiki

NetworkManager 是一个程序,用于为系统提供检测和配置,以自动连接到网络。NetworkManager 的功能对于无线和有线网络都很有用。对于无线网络,NetworkManager 倾向于已知的无线网络,并能够切换到最可靠的网络。支持 NetworkManager 的应用程序可以在在线和离线模式之间切换。NetworkManager 也比无线连接更倾向于有线连接,并支持调制解调器连接和某些类型的 VPN。NetworkManager 最初由 Red Hat 开发,现在由 GNOME 项目托管。

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

安装

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

启用 NetworkManager

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

注意

其他接口

移动宽带支持

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

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

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

从前端(例如 nm-connection-editor)添加连接,然后选择移动宽带作为连接类型。选择您的 ISP 和计费方案后,应使用来自 mobile-broadband-provider-info 的信息自动填写APN 和其他设置。

PPPoE / DSL 支持

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

VPN 支持

自 1.16 版本以来,NetworkManager 原生支持 WireGuard,它只需要 wireguard 内核模块。有关详细信息,请阅读 NetworkManager 中的 WireGuard 博客文章

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

警告: VPN 支持存在很多 缺陷。检查通过 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)可访问。 请参阅 #加密的 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,因此一旦你完成网络设置,就不会占用额外的内存。

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

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

$ nm-applet --no-agent
提示: nm-applet 可能会通过 autostart desktop file 自动启动,要添加 --no-agent 选项,请修改那里的 Exec 行,即
Exec=nm-applet --no-agent
警告:i3 上,如果 nm-applet 使用 --no-agent 选项启动,则无法通过单击项目列表连接到新的加密 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-gitAUR,这是一个小型脚本,用于使用 dmenurofi 而不是 nm-applet 来管理 NetworkManager 连接。 它提供了所有基本功能,例如连接到现有的 NetworkManager Wi-Fi 或有线连接、连接到新的 Wi-Fi 连接、在需要时请求密码、连接到现有的 VPN 连接、启用/禁用网络、启动 nm-connection-editor GUI、连接到蓝牙网络。

switchboard

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

$ io.elementary.settings

配置

NetworkManager 将需要一些额外的步骤才能正常运行。 确保你已按照 网络配置#设置主机名 部分中的描述配置了 /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#在网络启动后运行服务

默认情况下,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 权限

默认情况下,活动本地会话中的所有用户都可以在没有密码的情况下更改大多数网络设置。 请参阅 常规故障排除#会话权限 以检查你的会话类型。 在大多数情况下,一切都应该开箱即用。

某些操作(例如更改系统主机名)需要管理员密码。 在这种情况下,你需要将自己添加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 确实支持一些代理设置。 虽然不能使用 nmtui 直接修改它们,但 nm-appletnmcli 支持这些设置。 请参阅 nm-settings-nmcli(5) 中的代理设置。

此外,始终可以使用调度器脚本运行自定义代理命令,请参阅 #调度器示例

另请参阅 代理设置

检查连接性

NetworkManager 可以在连接到网络后尝试访问 Web 服务器,以确定它是否位于例如强制门户之后。 默认主机(在 /usr/lib/NetworkManager/conf.d/20-connectivity.conf 中配置)是 ping.archlinux.org(redirect.archlinux.org 的 CNAME 别名)。 要使用不同的 Web 服务器或禁用连接性检查,请创建 /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 调度器脚本)。或者,您可以创建一个包含以下内容的 NetworkManager 调度器脚本。

/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 或重新启动才能使其开始工作。一旦您这样做,调度器脚本应该在检测到您位于强制门户之后打开一个登录窗口。

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

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

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=dhclient
注意
  • NetworkManager 不支持将 dhcpcd 用于 IPv6。请参阅 NetworkManager issue #5。如果将 dhcpcd 设置为 DHCP 客户端,NetworkManager 将对 DHCPv6 使用内部 DHCP 客户端。
  • 不要启用 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 将启动 dnsmasq 而无需使用 systemd 服务,也无需读取 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-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,假设存在 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 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) 中使用语法 servers=serveripaddress1,serveripaddress2,serveripaddress3 在名为 [global-dns-domain-*] 的部分中指定它们。例如

/etc/NetworkManager/conf.d/dns-servers.conf
[global-dns-domain-*]
servers=::1,127.0.0.1
注意
在连接中设置自定义 DNS 服务器
在连接中设置自定义 DNS 服务器 (GUI)

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

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

要为每个连接设置 DNS 服务器,您可以使用连接设置中的 dns 字段(以及相关的 dns-searchdns-options)。

如果 method 设置为 auto(当您使用 DHCP 时),您需要将 ignore-auto-dns 设置为 yes

/etc/resolv.conf

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

提示: 使用 openresolv 允许 NetworkManager 与其他支持 resolvconf 的软件共存,或者,例如,运行本地 DNS 缓存和 split-DNS 解析器,openresolv 为其提供了订阅者。请注意,当 NetworkManager 与 openresolv 一起使用时,条件转发尚未完全支持

NetworkManager 还通过所谓的调度器脚本提供钩子,这些脚本可用于在网络更改后更改 /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 不会将 DNS 配置发送到 systemd-resolved
注意: 请参阅 #DNS 缓存和条件转发,以配置 NetworkManager 使用其他 DNS 后端(如 dnsmasqsystemd-resolved),而不是使用 main.dns=none

之后,/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 调度器 完成。

NetworkManager 调度器的网络服务

您可能不希望一些网络服务在 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 file,使其在退出后保持活动状态

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

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

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

Dispatcher 示例

自动设置时区

本文或本节是与 系统时间#每次 NetworkManager 连接到网络时更新时区 合并的候选对象。

注意: 来自系统时间的示例似乎更简单。(在 Talk:NetworkManager 中讨论)

安装 tzupdateAUR 并创建一个可执行脚本

/etc/NetworkManager/dispatcher.d/update-timezone.sh
#! /bin/bash
# Automatically set time zone when connected to the network
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 以匹配特定接口。

使用 sshfs 挂载远程目录

由于脚本在非常严格的环境中运行,您必须导出 SSH_AUTH_SOCK 才能连接到您的 SSH agent。有很多方法可以实现这一点,有关更多信息,请参见 此消息。以下示例适用于 GNOME Keyring,如果尚未解锁,将要求您输入密码。如果 NetworkManager 在登录时自动连接,则 gnome-keyring 很可能尚未启动,导出将失败(因此需要 sleep)。要匹配的 UUID 可以使用命令 nmcli connection statusnmcli connection 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
注意
  • 由于 NetworkManager 0.9.8,pre-downdown 事件不会在关机或重启时执行,有关更多信息,请参见 此错误报告
  • 之前的 umount 脚本仍然容易导致实际访问挂载点的应用程序“挂起”。

另一种方法是使用 NFS#使用 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#使用 NetworkManager dispatcher

使用 dispatcher 根据 LAN 电缆是否插入自动切换无线网络

其想法是仅在 LAN 电缆拔下时才打开 Wi-Fi(例如,当从笔记本电脑扩展坞上分离时),并在再次插入 LAN 电缆后自动禁用 Wi-Fi。

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

注意: 您可以使用 nmcli 获取接口列表 (nmcli 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#自动 VPN dispatcher 脚本的修复 中讨论)
注意: 此脚本将需要 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 会抱怨“没有有效的 VPN 密钥”,因为 VPN 密钥的存储方式。幸运的是,有不同的选项可以使上述脚本访问您的 VPN 密码。

1:其中一种方法需要编辑 VPN 连接配置文件,使 NetworkManager 自行存储密钥,而不是存储在 root 用户无法访问的密钥环中root 用户无法访问的密钥环:打开 /etc/NetworkManager/system-connections/您的 VPN 连接的名称 并将 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 密码/密钥。

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

许多 商业 VPN 提供商 仅支持 IPv4。这意味着所有 IPv6 流量都绕过 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(如果在连接中启用)。

/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#使用 NetworkManager dispatcher

动态设置通过 DHCP 与 systemd-timesyncd 接收的 NTP 服务器

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

dispatcher 可以解决这个问题。

创建 systemd-timesyncd 配置的 overlay 目录 /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) 时,都会将连接特定的 overlay 配置文件写入 /etc/systemd/timesyncd.conf.d,其中包含提供的 NTP 服务器。每当连接断开 (ACTION=down) 时,连接特定的 overlay 文件将被删除。每次更改 systemd-timesyncd 的配置后,此服务都会重新启动以获取更新的配置。有意使用连接特定的配置文件,以便当 NetworkManager 并行管理两个或多个连接时,配置中不同的 NTP 服务器名称不会被覆盖,因为 updhcp4-changedhcp6-changedown 操作可能会以任意顺序出现。

测试

NetworkManager applet 被设计为在登录时加载,因此对于大多数用户来说,无需进一步配置。如果您已经禁用了之前的网络设置并断开了网络连接,您现在可以测试 NetworkManager 是否可以工作。第一步是启动 NetworkManager.service

一些 applet 将为您提供一个 .desktop 文件,以便可以通过应用程序菜单加载 NetworkManager applet。如果它没有提供,您将不得不找到要使用的命令,或者注销并重新登录以启动 applet。一旦 applet 启动,它可能会开始轮询网络连接,以便使用 DHCP 服务器进行自动配置。

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

nm-applet --sm-disable &

对于静态 IP 地址,您必须配置 NetworkManager 以理解它们。该过程通常涉及右键单击 applet 并选择类似“编辑连接”的选项。

提示和技巧

加密的 Wi-Fi 密码

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

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

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

最好将密码以加密形式保存在密钥环中,而不是明文形式。这样做的不利之处在于必须为每个用户设置连接。

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

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

如果您不提供其中任何一个,则身份验证将失败,并显示错误 no secrets: No agents were available for this request.

使用 GNOME Keyring

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

此外,需要配置 NetworkManager,使其不为所有用户存储密码。使用 GNOME 的 network-manager-applet,从终端运行 nm-connection-editor,选择一个网络连接,点击编辑,选择Wi-Fi 安全选项卡,然后点击密码右侧的图标,并选中仅为此用户存储密码

使用 KDE Wallet

使用 KDE 的 plasma-nm,点击小程序,点击右上角的设置图标,点击一个网络连接,在常规配置选项卡中,取消勾选所有用户都可以连接到此网络。 如果该选项被勾选,即使密钥环守护进程正在运行,密码仍然会以明文形式存储。

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

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

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

您将需要支持 AP 模式的 Wi-Fi 网卡,详情请参阅 软件接入点#Wi-Fi 设备必须支持 AP 模式

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

创建共享连接

  • 点击小程序并选择创建新的无线网络
  • 按照向导操作(选择 WPA2 或更高版本,请务必使用至少 8 个字符长的密码,长度较短的密码将失败)。
    • 选择 热点 或 Ad-hoc 作为 Wi-Fi 模式。

连接将被保存并存储,以便下次您需要时使用。

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

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

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

要求

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

步骤

  • 从终端运行 nm-connection-editor
  • 添加一个新的以太网连接。
  • 给它起一个有意义的名称。 例如“共享互联网”
  • 转到“IPv4 设置”。
  • 对于“方法:”,选择“与其他计算机共享”。
  • 保存

现在您应该在 NetworkManager 中的“有线连接”下看到一个新的选项“共享互联网”。

检查 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

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

在启动时连接到带有密钥的网络

默认情况下,NetworkManager 不会在启动时自动连接到需要密钥的网络。 这是因为它默认将此类连接锁定到创建它的用户,仅在他们登录后才连接。 要更改此设置,请执行以下操作

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

注销并重新登录以完成。

在 KWallet 中使用密码的 OpenConnect

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

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

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

下次连接时,用户名和密码应显示在“VPN 密钥”对话框中。

忽略特定设备

有时可能需要 NetworkManager 忽略特定设备,并且不尝试为它们配置地址和路由。 您可以通过在 /etc/NetworkManager/conf.d/unmanaged.conf 中使用以下内容,通过 MAC 或接口名称快速轻松地忽略设备

[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/隐私#MAC 随机化 合并的候选对象。

注释: 现在有一个专门的隐私子页面。(在 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 博客文章

启用 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 客户端(默认),它将使用从 machine-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 设置 中的 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,并将其添加到互联网连接的 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 重新启动并且您连接到已配置的互联网连接时,您应该会自动连接到 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 客户端 获取说明。此解决方法可能解决大型无线网络(如 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 地址。MAC 地址可以使用 iproute2 软件包中的 ip link show interface 命令找到。

3G 调制解调器未检测到

请参阅 移动宽带调制解调器#NetworkManager

笔记本电脑上关闭 WLAN

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

$ watch -n1 rfkill list all

如果在您打开适配器后,一个标识符仍然被阻止,您可以尝试手动解除阻止它(其中 X 是上述输出提供的标识符编号)

# rfkill event unblock X

静态 IP 地址设置恢复为 DHCP

本文或章节已过时。

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

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

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

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

无法以普通用户身份编辑连接

请参阅 #设置 PolicyKit 权限

忘记隐藏的无线网络

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

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

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

VPN 在 GNOME 中不起作用

当在使用 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 密码以明文形式保存,如 #使用调度器在建立网络连接后连接到 VPN 的步骤 (2.) 中所述。

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

Systemd 瓶颈

随着时间的推移,日志文件 (/var/log/journal) 可能会变得非常大。当使用 NetworkManager 时,这可能会对启动性能产生重大影响,请参阅:Systemd#启动时间随时间推移而增加

定期网络断开、延迟和丢包 (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 来禁用定期扫描行为。

无法在联想笔记本电脑上打开 Wi-Fi (IdeaPad, Legion 等)

由于 Wi-Fi 驱动程序错误地报告软阻塞,某些联想型号上的 ideapad_laptop 模块存在问题。该网卡仍然可以使用 netctl 进行操作,但像 NetworkManager 这样的管理器会中断。您可以通过在切换硬件开关后检查 rfkill list 的输出来验证这是否是问题所在,并查看软阻塞是否仍然存在。

此文章或章节的事实准确性存在争议。

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

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

关闭主机名发送

默认情况下,NetworkManager 会将主机名发送到 DHCP 服务器。主机名发送只能按连接禁用,而不能全局禁用(Issue #584)。

要为特定连接禁用向 DHCP 服务器发送主机名,请将以下内容添加到您的网络连接文件

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

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 应该会显示在托盘中。

Unit dbus-org.freedesktop.resolve1.service not found

如果 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= 设置。[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

此错误可能有多种原因,您应该阅读 日志(使用 -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 企业连接

如果您尝试使用带有 iwd 后端 的 NetworkManager 连接到像 'eduroam' 这样的 WPA 企业网络,那么您将从 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 企业网络。因此,您必须使用 iwd 配置文件 /var/lib/iwd/essid.8021x 来配置它,如 iwd#WPA 企业 中所述。

请求 VPN 密钥失败

如果您收到此错误

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

要么是因为密码为空,要么您必须 设置 PolicyKit 权限

OpenVPN 连接失败,并显示“secrets: failed to request VPN secrets”警告

此文章或章节正在考虑删除。

原因: 这不需要故障排除章节。可选依赖项由 pacman 指出,如果这不够清楚,则应在 #VPN 支持 中涵盖。(在 Talk:NetworkManager#移除不必要的章节 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 以来,默认情况下会拒绝使用旧版加密算法生成的证书。尝试将 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,请按照 OpenSSL wiki 上的描述编辑 /etc/ssl/openssl.cnf

具体来说,在 [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 企业连接验证失败,并显示 OpenSSL “unsupported protocol”错误

自从 openssl 更新到版本 3 以来,“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 配置生效。

另请参阅