Menu Close

配置和管理网络

Red Hat Enterprise Linux 9

在 Red Hat Enterprise Linux 9 中配置和管理网络的指南

摘要

本文档论述了如何在 Red Hat Enterprise Linux 9 中管理网络。

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。我们从这四个术语开始:master、slave、黑名单和白名单。由于此项工作十分艰巨,这些更改将在即将推出的几个发行版本中逐步实施。如需了解更多详细信息,请参阅 CTO Chris Wright 信息

对红帽文档提供反馈

我们感谢您对文档提供反馈信息。请让我们了解如何改进文档。

  • 关于特定内容的简单评论:

    1. 请确定您使用 Multi-page HTML 格式查看文档。另外,确定 Feedback 按钮出现在文档页的右上方。
    2. 用鼠标指针高亮显示您想评论的文本部分。
    3. 点在高亮文本上弹出的 Add Feedback
    4. 按照显示的步骤操作。
  • 要通过 Bugzilla 提交反馈,请创建一个新的问题单:

    1. 进入 Bugzilla 网站。
    2. 在 Component 中选择 Documentation
    3. Description 中输入您要提供的信息。包括文档相关部分的链接。
    4. Submit Bug

第 1 章 一致的网络接口设备命名

Red Hat Enterprise Linux 提供用于网络接口的一致性和可预测的设备命名方法。这些特性有助于查找和区分网络接口。

内核为网络接口分配名称的方法是,使用一个固定前缀,再加上随着内核初始化网络设备时增加的数字。例如,eth0 代表启动时被探测的第一个设备。但是这些名称不一定与设备外壳上的标签对应。具有多个网络适配器的现代服务器平台,可能会遇到这些接口的命名不明确的情况。这会影响系统中嵌入的网络适配器和附加适配器。

在 Red Hat Enterprise Linux 中,udev 设备管理器支持很多不同的命名方案。默认情况下,udev 根据固件、拓扑和位置信息分配固定名称。它有以下优点:

  • 设备名称完全可预测。
  • 在添加或删除硬件时,设备名称也会保持不变。
  • 因此,有问题的硬件可以被无缝地替换。

1.1. 网络接口设备命名等级

如果启用了一致的设备命名(在 Red Hat Enterprise Linux 中是默认设置), udev 设备管理器会根据以下方案生成设备名称:

方案描述示例

1

设备名称包含固件或者 BIOS 提供的索引号,用于板上的设备。如果此信息不适用,则 udev 将使用方案 2。

eno1

2

设备名称包含固件或 BIOS 提供的 PCI Express(PCIe)热插件插槽索引号。如果此信息不适用,则 udev 将使用方案 3。

ens1

3

设备名称包含硬件连接器的物理位置。如果此信息不适用,则 udev 将使用方案 5。

enp2s0

4

设备名称包含 MAC 地址。Red Hat Enterprise Linux 默认不使用这个方案,但管理员可选择性地使用它。

enx525400d5e0fb

5

传统的无法预计的内核命名方案。如果 udev 无法应用任何其他方案,设备管理器将使用这个方案。

eth0

默认情况下,Red Hat Enterprise Linux 根据 /usr/lib/systemd/network/99-default.link 文件中的 NamePolicy 设置选择设备名称。NamePolicy 中值的顺序非常重要。Red Hat Enterprise Linux 使用在该文件中指定的以及 udev 生成的第一个设备名称。

如果您手动配置 udev 规则以更改内核设备名称,则优先使用这些规则。

1.2. 网络设备重命名是如何工作的

默认情况下,在 Red Hat Enterprise Linux 中启用了一致的设备命名。udev 设备管理器会处理不同的规则来重命名设备。以下列表描述了 udev 处理这些规则的顺序,以及这些规则负责什么操作:

  1. /usr/lib/udev/rules.d/60-net.rules 文件定义了 /lib/udev/rename_device helper 实用程序会搜索 /etc/sysconfig/network-scripts/ifcfg-* 文件中的 HWADDR 参数。如果变量中设置的值与接口的 MAC 地址匹配,帮助程序会将接口重命名为文件 DEVICE 参数中设置的名称。只有安装 initscripts 软件包后,该文件才存在。
  2. /usr/lib/udev/rules.d/71-biosdevname.rules 文件定义了 biosdevname 实用程序会根据其命名策略重命名接口,只要它在上一步中没有重命名。
  3. /usr/lib/udev/rules.d/75-net-description.rules 文件定义 udev 检查网络接口设备,并在下一步中将要处理的 udev- internal 变量中设置属性。请注意,其中一些属性可能没有定义。
  4. /usr/lib/udev/rules.d/80-net-setup-link.rules 文件会调用 net_setup_link udev 内置来应用该策略。以下是存储在 /usr/lib/systemd/network/99-default.link 文件中的默认策略:

    [Link]
    NamePolicy=kernel database onboard slot path
    MACAddressPolicy=persistent

    在这个策略中,如果内核使用持久名称,则 udev 不会重命名该接口。如果内核没有使用持久名称,则 udev 会将接口重命名为 udev 的硬件数据库提供的名称。如果这个数据库不可用,Red Hat Enterprise Linux 会回复到上述机制中。

    另外,对于基于 MAC 地址的接口,将此文件中的 NamePolicy 参数设置为 mac

  5. /usr/lib/udev/rules.d/80-net-setup-link.rules 文件定义了 udev 会根据 udev-internal 参数重命名接口,按以下顺序:

    1. ID_NET_NAME_ONBOARD
    2. ID_NET_NAME_SLOT
    3. ID_NET_NAME_PATH

    如果没有设置参数,则 udev 将使用下一个参数。如果没有设置任何参数,接口就不会被重命名。

步骤 3 和 4 实现了网络接口设备命名层次结构中介绍的命名方案 1 到 4。

其他资源

1.3. x86_64 平台上的可预测的网络接口名称解释

当启用一致的网络设备名称功能时,udev 设备管理器会根据不同的标准创建设备名称。这部分论述了在 x86_64 平台上安装 Red Hat Enterprise Linux 时的命名方案。

接口名称以双字符前缀开始,该前缀基于接口类型:

  • en 用于以太网
  • wl 用于无线 LAN(WLAN)
  • ww 用于无线 WAN(WWAN)

另外,以下之一会附加到上述其中一个前缀中,基于 udev 设备管理器应用的模式:

  • o<on-board_index_number>
  • s<hot_plug_slot_index_number>[f<function>][d<device_id>]

    请注意,所有多功能 PCI 设备在设备名称中包含 [f<function>] 号,包括功能 0 设备。

  • x<MAC_address>
  • [P<domain_number>]p<bus>s<slot>[f<function>][d<device_id>]

    [P<domain_number>] 部分定义 PCI 地理位置。只有在域号不是 0 时,才会设置此部分。

  • [P<domain_number>]p<bus>s<slot>[f<function>][u<usb_port>][…​][c<config>][i<interface>]

    对于 USB 设备,hub 端口号的完整链由 hub 的端口号组成。如果名称大于最大值(15 个字符),则不会导出该名称。如果链中有多个 USB 设备,则 udev 可以阻止使用 USB 配置描述符(c1)和 USB 接口描述符(i0)的默认值。

1.4. System z 平台中可预测的网络接口设备名称解释

当启用一致的网络设备名称功能时,System z 平台的 udev 设备管理器会根据总线 ID 创建设备名称。总线 ID 识别 s390 频道子系统中的一个设备。

对于 CCW(channel command word)设备,总线 ID 是设备号,并带有一个 0.n 前缀,其中 n 是子频道集的 ID。

以太网接口被命名,如 enccw0.0.1234。串行线互联网协议 (SLIP) 通道到通道 (CTC) 网络设备被命名,如 slccw0.0.1234

使用 znetconf -clscss -a 命令显示可用的网络设备及其总线 ID。

1.5. 在安装过程中禁用一致的接口设备命名

这部分论述了如何在安装过程中禁用一致的接口设备命名。

警告

红帽建议不要禁用一致的设备命名,且不支持具有多个网络接口的主机上此功能。禁用一致的设备命名可能会导致不同类型的问题。例如:如果您在系统中添加另一个网卡,则分配内核设备名称(如 eth0) 不再被修复。因此,重启后内核可以以不同的方式为该设备命名。

步骤

  1. 引导 Red Hat Enterprise Linux 9 安装介质。
  2. 在引导管理器中,选择 Install Red Hat Enterprise Linux 9,然后按 Tab 键编辑该条目。
  3. 在内核命令行中附加 net.ifnames=0 参数:

    vmlinuz... net.ifnames=0
  4. Enter 键开始安装。

1.6. 在安装的系统中禁用一致的接口设备命名

这部分论述了如何在已安装的 RHEL 系统中禁用一致的接口设备命名。

警告

红帽建议不要禁用一致的设备命名,且不支持具有多个网络接口的主机上此功能。禁用一致的设备命名可能会导致不同类型的问题。例如:如果您在系统中添加另一个网卡,则分配内核设备名称(如 eth0) 不再被修复。因此,重启后内核可以以不同的方式为该设备命名。

先决条件

  • 系统使用一致的接口设备命名,这是默认设置。

步骤

  1. 编辑 /etc/default/grub 文件,并将 net.ifnames=0 参数附加到 GRUB_CMDLINE_LINUX 变量中:

    GRUB_CMDLINE_LINUX="... net.ifnames=0"
  2. 重建 grub.cfg 文件:

    • 在具有 UEFI 引导模式的系统上:

      # grub2-mkconfig -o /boot/efi/EFI/redhat/grub.cfg
    • 在使用旧引导模式的系统上:

      # grub2-mkconfig -o /boot/grub2/grub.cfg
  3. 显示当前配置集名称和关联的设备名称:

    # nmcli -f NAME,DEVICE,FILENAME connection show
    NAME           DEVICE  FILENAME
    System enp1s0  enp1s0  /etc/sysconfig/network-scripts/ifcfg-enp1s0
    System enp7s0  enp7s0  /etc/NetworkManager/system-connections/enp7s0.nmconnection

    请注意,哪个配置文件名称和配置文件与每个设备相关联。

  4. 从所有连接配置集中删除 HWADDR 参数:

    # sed -i '/^HWADDR=/d' /etc/sysconfig/network-scripts/ifcfg-enp1s0 /etc/NetworkManager/system-connections/enp7s0.nmconnection
  5. 显示与以太网设备关联的 MAC 地址:

    # ip link show
    ...
    2: enp1s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP mode DEFAULT group default qlen 1000
        link/ether 00:53:00:c5:98:1c brd ff:ff:ff:ff:ff:ff
    3: enp7s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP mode DEFAULT group default qlen 1000
        link/ether 00:53:00:b6:87:c6 brd ff:ff:ff:ff:ff:ff
  6. 重启主机:

    # reboot
  7. 重新引导后,显示以太网设备并根据 MAC 地址识别新接口名称:

    # ip link show
    ...
    2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP mode DEFAULT group default qlen 1000
        link/ether 00:53:00:b6:87:c6 brd ff:ff:ff:ff:ff:ff
    3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP mode DEFAULT group default qlen 1000
        link/ether 00:53:00:c5:98:1c brd ff:ff:ff:ff:ff:ff

    如果您将当前输出与上一个输出进行比较:

    • 接口 enp7s0 (MAC 地址 00:53:00:b6:87:c6)现在被命名为 eth0
    • 接口 enp1s0 (MAC 地址 00:53:00:c5:98:1c)现在被命名为 eth1
  8. 重命名配置文件:

    # mv /etc/NetworkManager/system-connections/enp7s0.nmconnection /etc/NetworkManager/system-connections/eth0.nmconnection
    # mv /etc/sysconfig/network-scripts/ifcfg-enp1s0 /etc/sysconfig/network-scripts/ifcfg-eth1
  9. 重新载入 NetworkManager:

    # nmcli connection reload
  10. 如果在配置文件中没有设置配置集名称,NetworkManager 将使用默认值。要在重命名并重新载入连接后确定当前配置集的名称,请输入:

    # nmcli -f NAME,DEVICE,FILENAME connection show
    NAME           FILENAME
    System enp7s0  /etc/NetworkManager/system-connections/eth0.nmconnection
    System enp1s0  /etc/sysconfig/network-scripts/ifcfg-eth1

    下一步需要配置集名称。

  11. 重命名 NetworkManager 连接配置集并更新每个配置集中的接口名称:

    # nmcli connection modify "System enp7s0" connection.id eth0 connection.interface-name eth0
    # nmcli connection modify "System enp1s0" connection.id eth1 connection.interface-name eth1
  12. 重新激活 NetworkManager 连接:

    # nmcli connection up eth0
    # nmcli connection up eth1

1.7. 自定义以太网接口的前缀

您可以在 Red Hat Enterprise Linux 安装过程中自定义以太网接口名称的前缀。

重要

红帽不支持在已部署的系统中使用 prefixdevname 程序自定义前缀。

RHEL 安装后,udev 服务将以太网设备命名为 <prefix>.<index>。例如,如果您选择了前缀 net,RHEL 会将以太网接口命名为 net0net1 等。

先决条件

  • 您要设置的前缀满足以下要求:

    • 它由 ASCII 字符组成。
    • 它是字母数字字符串。
    • 它少于 16 个字符。
    • 它不与任何用于网络接口命名的其他已知前缀(如 ethenoensem)冲突。

步骤

  1. 引导 Red Hat Enterprise Linux 安装介质。
  2. 在引导管理器中:

    1. 选择 Install Red Hat Enterprise Linux <version> 条目,然后按 Tab 键编辑条目。
    2. 在内核选项中追加 net.ifnames.prefix= <prefix>
    3. Enter 键启动安装程序。
  3. 安装 Red Hat Enterprise Linux。

验证

  • 安装后,显示以太网接口:

    # ip link show
    ...
    2: net0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP mode DEFAULT group default qlen 1000
        link/ether 00:53:00:c5:98:1c brd ff:ff:ff:ff:ff:ff
    3: net1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP mode DEFAULT group default qlen 1000
        link/ether 00:53:00:c2:39:9e brd ff:ff:ff:ff:ff:ff
    ...

1.8. 使用 udev 规则分配用户定义的网络接口名称

udev 设备管理器支持一组规则来自定义接口名称。

步骤

  1. 显示所有网络接口及其 MAC 地址:

    # ip link list
    
    enp6s0f0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP mode DEFAULT group default qlen 1000
        link/ether b4:96:91:14:ae:58 brd ff:ff:ff:ff:ff:ff
    enp6s0f1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP mode DEFAULT group default qlen 1000
        link/ether b4:96:91:14:ae:5a brd ff:ff:ff:ff:ff:ff
    enp4s0f0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP mode DEFAULT group default qlen 1000
        link/ether 00:90:fa:6a:7d:90 brd ff:ff:ff:ff:ff:ff
  2. 创建包含以下内容的文件 /etc/udev/rules.d/70-custom-ifnames.rules

    SUBSYSTEM=="net",ACTION=="add",ATTR{address}=="b4:96:91:14:ae:58",ATTR{type}=="1",NAME="provider0"
    SUBSYSTEM=="net",ACTION=="add",ATTR{address}=="b4:96:91:14:ae:5a",ATTR{type}=="1",NAME="provider1"
    SUBSYSTEM=="net",ACTION=="add",ATTR{address}=="00:90:fa:6a:7d:90",ATTR{type}=="1",NAME="dmz"

    这些规则与网络接口的 MAC 地址匹配,并将它们重命名为 NAME 属性中指定的名称。在这些示例中,ATTR{type} 参数值 1 定义了接口类型为 Ethernet。

验证

  1. 重启系统:

    # reboot
  2. 验证每个 MAC 地址的接口名称是否与您在规则文件的 NAME 参数中设置的值匹配:

    # ip link show
    
    provider0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP mode DEFAULT group default qlen 1000
        link/ether b4:96:91:14:ae:58 brd ff:ff:ff:ff:ff:ff
       altname enp6s0f0
    provider1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP mode DEFAULT group default qlen 1000
        link/ether b4:96:91:14:ae:5a brd ff:ff:ff:ff:ff:ff
        altname enp6s0f1
    dmz: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP mode DEFAULT group default qlen 1000
        link/ether 00:90:fa:6a:7d:90 brd ff:ff:ff:ff:ff:ff
        altname enp4s0f0

其他资源

  • udev(7) 手册页
  • udevadm(8) 手册页
  • /usr/src/kernels/<kernel_version>/include/uapi/linux/if_arp.hkernel-doc 软件包提供。

1.10. 其他资源

  • 有关 udev 设备管理器的详情,请查看 udev(7) 手册页。

第 2 章 NetworkManager 入门

默认情况下,RHEL 使用 NetworkManager 管理网络配置和连接。

2.1. 使用 NetworkManager 的好处

使用 NetworkManager 的主要优点是:

  • 通过 D-Bus 提供 API,它允许查询和控制网络配置和状态。这样,多个应用程序就可以检查和配置网络,确保同步和最新的网络状态。例如,RHEL web 控制台(通过一个 web 浏览器监控和配置服务)使用 NetworkManager D-BUS 接口来配置网络,以及 Gnome GUInmclinm-connection-editor 工具。对这些工具所做的每个改变都会被其他所有用户检测到。
  • 可以更方便的镜像网络配置:网络管理器( NetworkManager)确保网络连接正常工作。当发现在系统中没有网络配置但存在网络设备时,NetworkManager 会创建临时连接以提供连接。
  • 提供到用户的简单连接设置: NetworkManager 通过不同的工具提供管理 - GUI、nmtui、nmcli
  • 支持配置灵活性。例如,配置 WiFi 接口,NetworkManager 会扫描并显示可用的 wifi 网络。您可以选择一个接口,NetworkManager 会显示在重启过程后提供自动连接所需的凭证。NetworkManager 可以配置网络别名、IP 地址、静态路由、DNS 信息和 VPN 连接以及很多具体连接的参数。您可以修改配置选项以反应您的需要。
  • 重启过程后保持设备状态,并接管在重启过程中将其设定为受管模式的接口。
  • 处理没有被显式设置但由用户或者其他网络设备手动控制的设备。

2.2. 您可以用来管理 NetworkManager 连接的工具和应用程序概述

您可以使用以下工具和应用程序来管理 NetworkManager 连接:

  • nmcli :用于管理连接的命令行工具。
  • nmtui :基于鼠标光标的文本用户界面(TUI)。要使用这个应用程序,请安装 NetworkManager-tui 软件包。
  • nm-connection-editor :用于执行与 NetworkManager 相关的任务的图形用户界面(GUI)。要启动这个应用程序,在 GNOME 会话终端输入 nm-connection-editor
  • control-center: GNOME shell 为桌面用户提供的 GUI。请注意,这个应用程序支持的功能比 nm-connection-editor 少。
  • GNOME shell 中的 网络连接 图标:此图标表示网络连接状态,并充当您要使用的连接类型的视觉指示符。

第 3 章 配置 NetworkManager 以忽略某些设备

默认情况下,NetworkManager 管理除 lo (环回)设备以外的所有设备。但是,您可以将某些设备设置为 非受管设备 来配置网络管理器(NetworkManager)忽略这些设备。使用这个设置,您可以手动管理这些设备,例如使用脚本。

3.1. 永久将设备配置为网络管理器(NetworkManager)中非受管设备

您可以根据以下条件将设备配置为非受管,如接口名称、MAC 地址或设备类型。这个步骤描述了如何在 NetworkManager 中将 enp1s0 接口永久设置为非受管(unmanaged)接口。

要临时将网络设备配置为非受管,请参阅临时将设备配置为 NetworkManager 中的非受管设备

步骤

  1. 可选:显示要识别您要设置为非受管设备的设备列表:

    # nmcli device status
    DEVICE  TYPE      STATE         CONNECTION
    enp1s0  ethernet  disconnected  --
    ...
  2. 使用以下内容创建 /etc/NetworkManager/conf.d/99-unmanaged-devices.conf 文件:

    [keyfile]
    unmanaged-devices=interface-name:enp1s0

    要将多个设备设置为非受管设备,请使用分号分隔 unmanaged-devices 参数中的条目:

    [keyfile]
    unmanaged-devices=interface-name:interface_1;interface-name:interface_2;...
  3. 重新载入 NetworkManager 服务:

    # systemctl reload NetworkManager

验证步骤

  • 显示设备列表:

    # nmcli device status
    DEVICE  TYPE      STATE      CONNECTION
    enp1s0  ethernet  unmanaged  --
    ...

    enp1s0 设备旁边的非受管状态表示 NetworkManager 不管理该设备。

其他资源

  • NetworkManager.conf(5) 手册页中的 设备列表格式 部分。

3.2. 将设备临时配置为在 NetworkManager 中不被管理

您可以根据以下条件将设备配置为非受管,如接口名称、MAC 地址或设备类型。这个步骤描述了如何在 NetworkManager 中临时将 enp1s0 接口设置为非受管接口。

可以使用这个方法用于特定目的,如测试。要永久将网络设备配置为非受管设备,请参阅永久将设备配置为 NetworkManager 中的非受管设备

步骤

  1. 可选:显示要识别您要设置为非受管设备的设备列表:

    # nmcli device status
    DEVICE  TYPE      STATE         CONNECTION
    enp1s0  ethernet  disconnected  --
    ...
  2. enp1s0 设备设置为非受管状态 :

    # nmcli device set enp1s0 managed no

验证步骤

  • 显示设备列表:

    # nmcli device status
    DEVICE  TYPE      STATE      CONNECTION
    enp1s0  ethernet  unmanaged  --
    ...

    enp1s0 设备旁边的非受管状态表示 NetworkManager 不管理该设备。

其他资源

  • NetworkManager.conf(5) 手册页中的 设备列表格式 部分

第 4 章 使用 nmtui 来通过基于文本的界面管理网络连接

nmtui 应用程序是 NetworkManager 的文本用户界面(TUI)。下面的部分提供了如何使用 nmtui 配置网络接口。

注意

nmtui 应用程序不支持所有连接类型。特别是,您无法添加或修改需要 802.1X 验证的 VPN 连接或以太网连接。

4.1. 启动 nmtui 工具

这个步骤描述了如何启动 NetworkManager 文本用户界面 nmtui

先决条件

  • 已安装 NetworkManager-tui 软件包。

步骤

  1. 要启动 nmtui,请输入:

    # nmtui
    nmtui 选择一个选项
  2. 进入:

    • 在选项中,使用光标或按 Tab 键前进,按Shift+Tab 后退。
    • 使用 Enter 选择一个选项。
    • 使用空格键切换复选框的状态。

4.2. 使用 nmtui 添加连接配置集

nmtui 应用程序为 NetworkManager 提供了一个文本用户界面。以下介绍了如何添加新连接配置集的步骤。

先决条件

  • 已安装 NetworkManager-tui 软件包。

流程

  1. 启动 NetworkManager 文本用户界面工具:

    # nmtui
  2. 选择 Edit a connection 菜单项,点 Enter
  3. 选择 Add 按钮,点 Enter
  4. 选择 Ethernet,点 Enter
  5. 输入连接详情信息。

    在 nmtui 中添加连接
  6. 选择 OK 保存更改。
  7. 选择 Back 返回主菜单。
  8. 选择 Activate a connection 并点 Enter
  9. 选择新的连接条目,点 Enter 键激活连接。
  10. 选择 Back 返回主菜单。
  11. 选择 Quit

验证步骤

  1. 显示设备和连接的状态:

    # nmcli device status
    DEVICE      TYPE      STATE      CONNECTION
    enp1s0      ethernet  connected  Example-Connection
  2. 显示连接配置集的所有设置:

    # nmcli connection show Example-Connection
    connection.id:              Example-Connection
    connection.uuid:            b6cdfa1c-e4ad-46e5-af8b-a75f06b79f76
    connection.stable-id:       --
    connection.type:            802-3-ethernet
    connection.interface-name:  enp1s0
    ...

    如果磁盘中的配置与设备中的配置不匹配,则启动或重启 NetworkManager 会创建一个代表该设备的配置的内存连接。有关详情以及如何避免此问题,请参阅 NetworkManager 服务重启后复制连接

    其他资源

4.3. 使用 nmtui 对修改的连接应用更改

nmtui 中修改了连接后,您必须重新激活连接。请注意,在 nmtui 中对连接进行响应会临时取消激活连接。

先决条件

  • 连接配置集没有启用 auto-connect 设置。

步骤

  1. 在主菜单中选择 Activate a connection 菜单项:

    nmtui 激活连接
  2. 选择修改的连接。
  3. 在右侧,选择取消激活按钮,然后按 Enter 键:

    nmtui 取消激活修改的连接
  4. 再次选择连接。
  5. 在右侧,选择 激活按钮,然后按 Enter 键:

    nmtui 激活修改的连接

第 5 章 nmcli 入门

本节介绍 nmcli 实用程序的常规信息。

5.1. nmcli 输出格式的不同

nmcli 实用程序支持不同的选项来修改 nmcli 命令的输出。通过使用这些选项,您可以只显示所需的信息。这简化了处理脚本中输出的过程。

默认情况下,nmcli 工具以类似表的形式显示其输出:

# nmcli device
DEVICE  TYPE      STATE      CONNECTION
enp1s0  ethernet  connected  enp1s0
lo      loopback  unmanaged  --

使用 -f 选项,您可以按自定义顺序显示特定的列。例如,要只显示 DEVICESTATE 列,请输入:

# nmcli -f DEVICE,STATE device
DEVICE  STATE
enp1s0  connected
lo      unmanaged

t 选项允许您以冒号分隔格式显示输出的每个字段:

# nmcli -t device
enp1s0:ethernet:connected:enp1s0
lo:loopback:unmanaged:

当您需要使用脚本处理输出时,可以使用 -f-t 的组合来显示特定字段(以冒号分隔):

# nmcli -f DEVICE,STATE -t device
enp1s0:connected
lo:unmanaged

5.2. 在 nmcli 中使用 tab 自动完成

如果您的主机上安装了 bash-completion 软件包,则可以在 nmcli 实用程序中使用 tab 补全功能。这可让您自动完成选项名称,并识别可能的选项和值。

例如,如果您键入 nmcli con 并按 Tab 键,则 shell 会自动完成命令 nmcli connection

您所输入的选项或值必须是唯一的。如果它不是唯一的,则 nmcli 会显示所有可能。例如,如果您键入 nmcli connection d 并按 Tab 连接,则命令将显示命令 deletedown 的可能选项。

您还可以使用 tab 自动完成来显示连接配置集中可以设置的所有属性。例如,如果您键入 nmcli connection modify connection_name 并按 Tab,则会显示所有可用属性的列表。

5.3. 频繁使用的 nmcli 命令

以下是经常使用的 nmcli 命令的概述。

  • 要显示列表连接配置集,请输入:

    # nmcli connection show
    NAME    UUID                                  TYPE      DEVICE
    enp1s0  45224a39-606f-4bf7-b3dc-d088236c15ee  ethernet  enp1s0
  • 要显示特定连接配置集的设置,请输入:

    # nmcli connection show connection_name
    connection.id:             enp1s0
    connection.uuid:           45224a39-606f-4bf7-b3dc-d088236c15ee
    connection.stable-id:      --
    connection.type:           802-3-ethernet
    ...
  • 要修改连接的属性,请输入:

    # nmcli connection modify connection_name property value

    您可以通过传递多个 property value 组合来使用一个单独的命令来修改多个属性。

  • 要显示网络设备列表、其状态以及使用该设备的连接配置集,请输入:

    # nmcli device
    DEVICE  TYPE      STATE         CONNECTION
    enp1s0  ethernet  connected     enp1s0
    enp8s0  ethernet  disconnected  --
    enp7s0  ethernet  unmanaged     --
    ...
  • 要激活连接,请输入:

    # nmcli connection up connection_name
  • 要取消激活连接,请输入:

    # nmcli connection down connection_name

第 6 章 配置以太网连接

这部分论述了如何使用静态和动态 IP 地址配置以太网连接的不同方法。

6.1. 使用 nmcli 配置静态以太网连接

这个步骤描述了使用 nmcli 实用程序在以下设置中添加以太网连接:

  • 静态 IPv4 地址 - 192.0.2.1/24 子网掩码
  • 静态 IPv6 地址 - 2001:db8:1::1/64 子网掩码
  • IPv4 默认网关 - 192.0.2.254
  • IPv6 默认网关 - 2001:db8:1::fffe
  • IPv4 DNS 服务器 - 192.0.2.200
  • IPv6 DNS 服务器 - 2001:db8:1::ffbb
  • DNS 搜索域 - example.com

流程

  1. 为以太网连接添加新的 NetworkManager 连接配置集:

    # nmcli connection add con-name Example-Connection ifname enp7s0 type ethernet

    可以进一步修改您创建的 Example-Connection 连接配置集。

  2. 设置 IPv4 地址:

    # nmcli connection modify Example-Connection ipv4.addresses 192.0.2.1/24
  3. 设置 IPv6 地址:

    # nmcli connection modify Example-Connection ipv6.addresses 2001:db8:1::1/64
  4. 将 IPv4 和 IPv6 连接方法设置为 manual

    # nmcli connection modify Example-Connection ipv4.method manual
    # nmcli connection modify Example-Connection ipv6.method manual
  5. 设置 IPv4 和 IPv6 默认网关:

    # nmcli connection modify Example-Connection ipv4.gateway 192.0.2.254
    # nmcli connection modify Example-Connection ipv6.gateway 2001:db8:1::fffe
  6. 设置 IPv4 和 IPv6 DNS 服务器地址:

    # nmcli connection modify Example-Connection ipv4.dns "192.0.2.200"
    # nmcli connection modify Example-Connection ipv6.dns "2001:db8:1::ffbb"

    要设置多个 DNS 服务器,以空格分隔并用引号括起来。

  7. 为 IPv4 和 IPv6 连接设置 DNS 搜索域:

    # nmcli connection modify Example-Connection ipv4.dns-search example.com
    # nmcli connection modify Example-Connection ipv6.dns-search example.com
  8. 激活连接配置集:

    # nmcli connection up Example-Connection
    Connection successfully activated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/13)

验证步骤

  1. 显示设备和连接的状态:

    # nmcli device status
    DEVICE      TYPE      STATE      CONNECTION
    enp7s0      ethernet  connected  Example-Connection
  2. 显示连接配置集的所有设置:

    # nmcli connection show Example-Connection
    connection.id:              Example-Connection
    connection.uuid:            b6cdfa1c-e4ad-46e5-af8b-a75f06b79f76
    connection.stable-id:       --
    connection.type:            802-3-ethernet
    connection.interface-name:  enp7s0
    ...
  3. 使用 ping 程序来验证这个主机是否可以向其它主机发送数据包。

    • 查找同一子网中的 IP 地址。

      对于 IPv4:

      # ping 192.0.2.3

      对于 IPv6:

      # ping 2001:db8:1::2

      如果命令失败,请验证 IP 和子网的设置。

    • 在远程子网中查找 IP 地址。

      对于 IPv4:

      # ping 198.162.3.1

      对于 IPv6:

      # ping 2001:db8:2::1
      • 如果命令失败,则使用 ping 默认网关来验证设置。

        对于 IPv4:

        # ping 192.0.2.254

        对于 IPv6:

        # ping 2001:db8:1::fff3
  4. 使用 host 实用程序来验证名称解析是否正常工作。例如:

    # host client.example.com

    如果命令返回任何错误,如 connection timed outno servers could be reached,请验证您的 DNS 设置。

故障排除步骤

  1. 如果连接失败,或者网络接口在上线和关闭状态间切换:

    • 确保网络电缆插入到主机和交换机。
    • 检查连接失败是否只存在于这个主机上,或者其他连接到该服务器连接的同一交换机的主机中。
    • 验证网络电缆和网络接口是否如预期工作。执行硬件诊断步骤并替换有缺陷的电缆和网络接口卡。
    • 如果磁盘中的配置与设备中的配置不匹配,则启动或重启 NetworkManager 会创建一个代表该设备的配置的内存连接。有关详情以及如何避免这个问题,请参阅 NetworkManager 服务重启后复制连接

其他资源

6.2. 使用 nmcli 互动编辑器配置静态以太网连接

这个过程论述了使用 nmcli 互动模式在以下设置中添加以太网连接:

  • 静态 IPv4 地址 - 192.0.2.1/24 子网掩码
  • 静态 IPv6 地址 - 2001:db8:1::1/64 子网掩码
  • IPv4 默认网关 - 192.0.2.254
  • IPv6 默认网关 - 2001:db8:1::fffe
  • IPv4 DNS 服务器 - 192.0.2.200
  • IPv6 DNS 服务器 - 2001:db8:1::ffbb
  • DNS 搜索域 - example.com

步骤

  1. 要为以太网连接添加新的 NetworkManager 连接配置集并启动互动模式,请输入:

    # nmcli connection edit type ethernet con-name Example-Connection
  2. 设置网络接口:

    nmcli> set connection.interface-name enp7s0
  3. 设置 IPv4 地址:

    nmcli> set ipv4.addresses 192.0.2.1/24
  4. 设置 IPv6 地址:

    nmcli> set ipv6.addresses 2001:db8:1::1/64
  5. 将 IPv4 和 IPv6 连接方法设置为 manual

    nmcli> set ipv4.method manual
    nmcli> set ipv6.method manual
  6. 设置 IPv4 和 IPv6 默认网关:

    nmcli> set ipv4.gateway 192.0.2.254
    nmcli> set ipv6.gateway 2001:db8:1::fffe
  7. 设置 IPv4 和 IPv6 DNS 服务器地址:

    nmcli> set ipv4.dns 192.0.2.200
    nmcli> set ipv6.dns 2001:db8:1::ffbb

    要设置多个 DNS 服务器,以空格分隔并用引号括起来。

  8. 为 IPv4 和 IPv6 连接设置 DNS 搜索域:

    nmcli> set ipv4.dns-search example.com
    nmcli> set ipv6.dns-search example.com
  9. 保存并激活连接:

    nmcli> save persistent
    Saving the connection with 'autoconnect=yes'. That might result in an immediate activation of the connection.
    Do you still want to save? (yes/no) [yes] yes
  10. 保留为互动模式:

    nmcli> quit

验证步骤

  1. 显示设备和连接的状态:

    # nmcli device status
    DEVICE      TYPE      STATE      CONNECTION
    enp7s0      ethernet  connected  Example-Connection
  2. 显示连接配置集的所有设置:

    # nmcli connection show Example-Connection
    connection.id:              Example-Connection
    connection.uuid:            b6cdfa1c-e4ad-46e5-af8b-a75f06b79f76
    connection.stable-id:       --
    connection.type:            802-3-ethernet
    connection.interface-name:  enp7s0
    ...
  3. 使用 ping 程序来验证这个主机是否可以向其它主机发送数据包。

    • 查找同一子网中的 IP 地址。

      对于 IPv4:

      # ping 192.0.2.3

      对于 IPv6:

      # ping 2001:db8:1::2

      如果命令失败,请验证 IP 和子网的设置。

    • 在远程子网中查找 IP 地址。

      对于 IPv4:

      # ping 198.162.3.1

      对于 IPv6:

      # ping 2001:db8:2::1
      • 如果命令失败,则使用 ping 默认网关来验证设置。

        对于 IPv4:

        # ping 192.0.2.254

        对于 IPv6:

        # ping 2001:db8:1::fff3
  4. 使用 host 实用程序来验证名称解析是否正常工作。例如:

    # host client.example.com

    如果命令返回任何错误,如 connection timed outno servers could be reached,请验证您的 DNS 设置。

故障排除步骤

  1. 如果连接失败,或者网络接口在上线和关闭状态间切换:

    • 确保网络电缆插入到主机和交换机。
    • 检查连接失败是否只存在于这个主机上,或者其他连接到该服务器连接的同一交换机的主机中。
    • 验证网络电缆和网络接口是否如预期工作。执行硬件诊断步骤并替换有缺陷的电缆和网络接口卡。

如果磁盘中的配置与设备中的配置不匹配,则启动或重启 NetworkManager 会创建一个代表该设备的配置的内存连接。有关详情以及如何避免这个问题,请参阅 NetworkManager 服务重启后复制连接

其他资源

6.3. 使用 nmstatectl 配置静态以太网连接

这个步骤描述了如何使用 nmstatectl 程序为 enp7s0 设备配置以太网连接:

  • 静态 IPv4 地址 - 192.0.2.1,子网掩码为 /24
  • 静态 IPv6 地址 - 2001:db8:1::1,子网掩码为 /64
  • IPv4 默认网关 - 192.0.2.254
  • IPv6 默认网关 - 2001:db8:1::fffe
  • IPv4 DNS 服务器 - 192.0.2.200
  • IPv6 DNS 服务器 - 2001:db8:1::ffbb
  • DNS 搜索域 - example.com

nmstatectl 工具确保设置配置后结果与配置文件匹配。如果有任何失败,nmstatectl 会自动回滚更改以避免系统处于错误状态。

该流程以 YAML 格式定义接口配置。或者,您也可以以 JSON 格式指定配置:

先决条件

  • 已安装 nmstate 软件包。

步骤

  1. 创建包含以下内容的 YAML 文件,如 ~/create-ethernet-profile.yml

    ---
    interfaces:
    - name: enp7s0
      type: ethernet
      state: up
      ipv4:
        enabled: true
        address:
        - ip: 192.0.2.1
          prefix-length: 24
        dhcp: false
      ipv6:
        enabled: true
        address:
        - ip: 2001:db8:1::1
          prefix-length: 64
        autoconf: false
        dhcp: false
    routes:
      config:
      - destination: 0.0.0.0/0
        next-hop-address: 192.0.2.254
        next-hop-interface: enp7s0
      - destination: ::/0
        next-hop-address: 2001:db8:1::fffe
        next-hop-interface: enp7s0
    dns-resolver:
      config:
        search:
        - example.com
        server:
        - 192.0.2.200
        - 2001:db8:1::ffbb
  2. 将设置应用到系统:

    # nmstatectl apply ~/create-ethernet-profile.yml

验证步骤

  1. 显示设备和连接的状态:

    # nmcli device status
    DEVICE      TYPE      STATE      CONNECTION
    enp7s0      ethernet  connected  enp7s0
  2. 显示连接配置集的所有设置:

    # nmcli connection show enp7s0
    connection.id:              enp7s0
    connection.uuid:            b6cdfa1c-e4ad-46e5-af8b-a75f06b79f76
    connection.stable-id:       --
    connection.type:            802-3-ethernet
    connection.interface-name:  enp7s0
    ...
  3. 以 YAML 格式显示连接设置:

    # nmstatectl show enp7s0

其他资源

  • nmstatectl(8) man page
  • /usr/share/doc/nmstate/examples/

6.4. 使用接口名称的 RHEL 系统角色配置静态以太网连接

此流程描述了如何使用网络 RHEL 系统角色通过运行 Ansible playbook 为 enp7s0 接口远程添加以太网连接:

  • 静态 IPv4 地址 - 192.0.2.1/24 子网掩码
  • 静态 IPv6 地址 - 2001:db8:1::1/64 子网掩码
  • IPv4 默认网关 - 192.0.2.254
  • IPv6 默认网关 - 2001:db8:1::fffe
  • IPv4 DNS 服务器 - 192.0.2.200
  • IPv6 DNS 服务器 - 2001:db8:1::ffbb
  • DNS 搜索域 - example.com

在 Ansible 控制节点上运行此步骤。

先决条件

  • ansible-corerhel-system-roles 软件包在控制节点上安装。
  • 如果您在运行 playbook 时使用了与 root 不同的远程用户,则此用户在受管节点上具有合适的 sudo 权限。
  • 主机使用 NetworkManager 配置网络。

步骤

  1. 如果您要在其上执行 playbook 中指令的主机还没有被列入清单,请将此主机的 IP 或名称添加到 /etc/ansible/hosts Ansible 清单文件中:

    node.example.com
  2. 使用以下内容创建 ~/ethernet-static-IP.yml playbook:

    ---
    - name: Configure an Ethernet connection with static IP
      hosts: node.example.com
      become: true
      tasks:
      - include_role:
          name: rhel-system-roles.network
    
        vars:
          network_connections:
            - name: enp7s0
              interface_name: enp7s0
              type: ethernet
              autoconnect: yes
              ip:
                address:
                  - 192.0.2.1/24
                  - 2001:db8:1::1/64
                gateway4: 192.0.2.254
                gateway6: 2001:db8:1::fffe
                dns:
                  - 192.0.2.200
                  - 2001:db8:1::ffbb
                dns_search:
                  - example.com
              state: up
  3. 运行 playbook:

    • 要以 root 用户身份连接到受管主机,请输入:

      # ansible-playbook -u root ~/ethernet-static-IP.yml
    • 以用户身份连接到受管主机,请输入:

      # ansible-playbook -u user_name --ask-become-pass ~/ethernet-static-IP.yml

      --ask-become-pass 选项确保 ansible-playbook 命令提示输入 -u user_name 选项中定义的用户的 sudo 密码。

    如果没有指定 -u user_name 选项,ansible-playbook 以当前登录到控制节点的用户身份连接到受管主机。

其他资源

  • /usr/share/ansible/roles/rhel-system-roles.network/README.md
  • ansible-playbook(1) 手册页

6.5. 使用设备路径的 RHEL 系统角色配置静态以太网连接

此流程描述了如何使用 RHEL 系统角色通过运行 Ansible playbook 为与特定设备匹配的设备远程添加带有静态 IP 地址的以太网连接。

您可以使用以下命令识别设备路径:

# udevadm info /sys/class/net/<device_name> | grep ID_PATH=

此流程会为与 PCI ID 0000:00:0[1-3].0 表达式匹配的设备(但不包括设置 0000:00:02.0)进行以下设置 :

  • 静态 IPv4 地址 - 192.0.2.1/24 子网掩码
  • 静态 IPv6 地址 - 2001:db8:1::1/64 子网掩码
  • IPv4 默认网关 - 192.0.2.254
  • IPv6 默认网关 - 2001:db8:1::fffe
  • IPv4 DNS 服务器 - 192.0.2.200
  • IPv6 DNS 服务器 - 2001:db8:1::ffbb
  • DNS 搜索域 - example.com

在 Ansible 控制节点上运行此步骤。

先决条件

  • ansible-corerhel-system-roles 软件包在控制节点上安装。
  • 如果您在运行 playbook 时使用了与 root 不同的远程用户,则此用户在受管节点上具有合适的 sudo 权限。
  • 主机使用 NetworkManager 配置网络。

步骤

  1. 如果您要在其上执行 playbook 中指令的主机还没有被列入清单,请将此主机的 IP 或名称添加到 /etc/ansible/hosts Ansible 清单文件中:

    node.example.com
  2. 使用以下内容创建 ~/ethernet-dynamic-IP.yml playbook:

    ---
    - name: Configure an Ethernet connection with dynamic IP
      hosts: node.example.com
      become: true
      tasks:
      - include_role:
          name: rhel-system-roles.network
    
        vars:
          network_connections:
            - name: example
              match:
                path:
                  - pci-0000:00:0[1-3].0
                  - &!pci-0000:00:02.0
              type: ethernet
              autoconnect: yes
              ip:
                address:
                  - 192.0.2.1/24
                  - 2001:db8:1::1/64
                gateway4: 192.0.2.254
                gateway6: 2001:db8:1::fffe
                dns:
                  - 192.0.2.200
                  - 2001:db8:1::ffbb
                dns_search:
                  - example.com
              state: up

    本例中的 match 参数定义了,将 play 应用到与 PCI ID 0000:00:0[1-3].0 匹配的设备,但不包括 0000:00:02.0。有关可以使用的特殊修饰符和通配符的详情,请查看 /usr/share/ansible/roles/rhel-system-roles.network/README.md 文件中的 match 参数描述。

  3. 运行 playbook:

    • 要以 root 用户身份连接到受管主机,请输入:

      # ansible-playbook -u root ~/ethernet-dynamic-IP.yml
    • 以用户身份连接到受管主机,请输入:

      # ansible-playbook -u user_name --ask-become-pass ~/ethernet-dynamic-IP.yml

      --ask-become-pass 选项确保 ansible-playbook 命令提示输入 -u user_name 选项中定义的用户的 sudo 密码。

    如果没有指定 -u user_name 选项,ansible-playbook 以当前登录到控制节点的用户身份连接到受管主机。

其他资源

  • /usr/share/ansible/roles/rhel-system-roles.network/README.md 文件
  • ansible-playbook(1) 手册页

6.6. 使用 nmcli 配置动态以太网连接

这个步骤描述了使用 nmcli 工具添加动态以太网连接。使用这个设置,NetworkManager 从 DHCP 服务器请求这个连接的 IP 设置。

先决条件

  • 网络中有 DHCP 服务器。

流程

  1. 为以太网连接添加新的 NetworkManager 连接配置集:

    # nmcli connection add con-name Example-Connection ifname enp7s0 type ethernet
  2. (可选)在使用 Example-Connection 配置集时更改主机名 NetworkManager 发送到 DHCP 服务器:

    # nmcli connection modify Example-Connection ipv4.dhcp-hostname Example ipv6.dhcp-hostname Example
  3. (可选)在使用 Example-Connection 配置集时更改客户端 ID NetworkManager 发送到 IPv4 DHCP 服务器:

    # nmcli connection modify Example-Connection ipv4.dhcp-client-id client-ID

    请注意,IPv6 没有 dhcp-client-id 参数。要为 IPv6 创建标识符,请配置 dhclient 服务。

验证步骤

  1. 显示设备和连接的状态:

    # nmcli device status
    DEVICE      TYPE      STATE      CONNECTION
    enp7s0      ethernet  connected  Example-Connection
  2. 显示连接配置集的所有设置:

    # nmcli connection show Example-Connection
    connection.id:              Example-Connection
    connection.uuid:            b6cdfa1c-e4ad-46e5-af8b-a75f06b79f76
    connection.stable-id:       --
    connection.type:            802-3-ethernet
    connection.interface-name:  enp7s0
    ...
  3. 使用 ping 程序来验证这个主机是否可以向其它主机发送数据包。

    • 查找同一子网中的 IP 地址。

      对于 IPv4:

      # ping 192.0.2.3

      对于 IPv6:

      # ping 2001:db8:1::2

      如果命令失败,请验证 IP 和子网的设置。

    • 在远程子网中查找 IP 地址。

      对于 IPv4:

      # ping 198.162.3.1

      对于 IPv6:

      # ping 2001:db8:2::1
      • 如果命令失败,则使用 ping 默认网关来验证设置。

        对于 IPv4:

        # ping 192.0.2.254

        对于 IPv6:

        # ping 2001:db8:1::fff3
  4. 使用 host 实用程序来验证名称解析是否正常工作。例如:

    # host client.example.com

    如果命令返回任何错误,如 connection timed outno servers could be reached,请验证您的 DNS 设置。

其他资源

6.7. 使用 nmcli 互动编辑器配置动态以太网连接

这个步骤描述了使用 nmcli 工具的互动编辑器添加动态以太网连接。使用这个设置,NetworkManager 从 DHCP 服务器请求这个连接的 IP 设置。

先决条件

  • 网络中有 DHCP 服务器。

流程

  1. 要为以太网连接添加新的 NetworkManager 连接配置集并启动互动模式,请输入:

    # nmcli connection edit type ethernet con-name Example-Connection
  2. 设置网络接口:

    nmcli> set connection.interface-name enp7s0
  3. (可选)在使用 Example-Connection 配置集时更改主机名 NetworkManager 发送到 DHCP 服务器:

    nmcli> set ipv4.dhcp-hostname Example
    nmcli> set ipv6.dhcp-hostname Example
  4. (可选)在使用 Example-Connection 配置集时更改客户端 ID NetworkManager 发送到 IPv4 DHCP 服务器:

    nmcli> set ipv4.dhcp-client-id client-ID

    请注意,IPv6 没有 dhcp-client-id 参数。要为 IPv6 创建标识符,请配置 dhclient 服务。

  5. 保存并激活连接:

    nmcli> save persistent
    Saving the connection with 'autoconnect=yes'. That might result in an immediate activation of the connection.
    Do you still want to save? (yes/no) [yes] yes
  6. 保留为互动模式:

    nmcli> quit

验证步骤

  1. 显示设备和连接的状态:

    # nmcli device status
    DEVICE      TYPE      STATE      CONNECTION
    enp7s0      ethernet  connected  Example-Connection
  2. 显示连接配置集的所有设置:

    # nmcli connection show Example-Connection
    connection.id:              Example-Connection
    connection.uuid:            b6cdfa1c-e4ad-46e5-af8b-a75f06b79f76
    connection.stable-id:       --
    connection.type:            802-3-ethernet
    connection.interface-name:  enp7s0
    ...
  3. 使用 ping 程序来验证这个主机是否可以向其它主机发送数据包。

    • 查找同一子网中的 IP 地址。

      对于 IPv4:

      # ping 192.0.2.3

      对于 IPv6:

      # ping 2001:db8:1::2

      如果命令失败,请验证 IP 和子网的设置。

    • 在远程子网中查找 IP 地址。

      对于 IPv4:

      # ping 198.162.3.1

      对于 IPv6:

      # ping 2001:db8:2::1
      • 如果命令失败,则使用 ping 默认网关来验证设置。

        对于 IPv4:

        # ping 192.0.2.254

        对于 IPv6:

        # ping 2001:db8:1::fff3
  4. 使用 host 实用程序来验证名称解析是否正常工作。例如:

    # host client.example.com

    如果命令返回任何错误,如 connection timed outno servers could be reached,请验证您的 DNS 设置。

其他资源

6.8. 使用 nmstatectl 配置动态以太网连接

这个步骤描述了如何使用 nmstatectl 程序为 enp7s0 设备添加动态以太网。在这个过程中的设置中,NetworkManager 从 DHCP 服务器请求此连接的 IP 设置。

nmstatectl 工具确保设置配置后结果与配置文件匹配。如果有任何失败,nmstatectl 会自动回滚更改以避免系统处于错误状态。

该流程以 YAML 格式定义接口配置。或者,您也可以以 JSON 格式指定配置:

先决条件

  • 已安装 nmstate 软件包。

步骤

  1. 创建包含以下内容的 YAML 文件,如 ~/create-ethernet-profile.yml

    ---
    interfaces:
    - name: enp7s0
      type: ethernet
      state: up
      ipv4:
        enabled: true
        auto-dns: true
        auto-gateway: true
        auto-routes: true
        dhcp: true
      ipv6:
        enabled: true
        auto-dns: true
        auto-gateway: true
        auto-routes: true
        autoconf: true
        dhcp: true
  2. 将设置应用到系统:

    # nmstatectl apply ~/create-ethernet-profile.yml

验证步骤

  1. 显示设备和连接的状态:

    # nmcli device status
    DEVICE      TYPE      STATE      CONNECTION
    enp7s0      ethernet  connected  enp7s0
  2. 显示连接配置集的所有设置:

    # nmcli connection show enp7s0
    connection.id:              enp7s0_
    connection.uuid:            b6cdfa1c-e4ad-46e5-af8b-a75f06b79f76
    connection.stable-id:       --
    connection.type:            802-3-ethernet
    connection.interface-name:  enp7s0
    ...
  3. 以 YAML 格式显示连接设置:

    # nmstatectl show enp7s0

其他资源

  • nmstatectl(8) man page
  • /usr/share/doc/nmstate/examples/

6.9. 使用接口名称的 RHEL 系统角色配置动态以太网连接

此流程描述了如何使用 RHEL 系统角色通过运行 Ansible playbook 来为 enp7s0 接口远程添加动态以太网连接。在这个设置中,网络连接从 DHCP 服务器请求这个连接的 IP 设置。在 Ansible 控制节点上运行此步骤。

先决条件

  • 网络中有 DHCP 服务器。
  • ansible-corerhel-system-roles 软件包在控制节点上安装。
  • 如果您在运行 playbook 时使用了与 root 不同的远程用户,则此用户在受管节点上具有合适的 sudo 权限。
  • 主机使用 NetworkManager 配置网络。

步骤

  1. 如果您要在其上执行 playbook 中指令的主机还没有被列入清单,请将此主机的 IP 或名称添加到 /etc/ansible/hosts Ansible 清单文件中:

    node.example.com
  2. 使用以下内容创建 ~/ethernet-dynamic-IP.yml playbook:

    ---
    - name: Configure an Ethernet connection with dynamic IP
      hosts: node.example.com
      become: true
      tasks:
      - include_role:
          name: rhel-system-roles.network
    
        vars:
          network_connections:
            - name: enp7s0
              interface_name: enp7s0
              type: ethernet
              autoconnect: yes
              ip:
                dhcp4: yes
                auto6: yes
              state: up
  3. 运行 playbook:

    • 要以 root 用户身份连接到受管主机,请输入:

      # ansible-playbook -u root ~/ethernet-dynamic-IP.yml
    • 以用户身份连接到受管主机,请输入:

      # ansible-playbook -u user_name --ask-become-pass ~/ethernet-dynamic-IP.yml

      --ask-become-pass 选项确保 ansible-playbook 命令提示输入 -u user_name 选项中定义的用户的 sudo 密码。

    如果没有指定 -u user_name 选项,ansible-playbook 以当前登录到控制节点的用户身份连接到受管主机。

其他资源

  • /usr/share/ansible/roles/rhel-system-roles.network/README.md 文件
  • ansible-playbook(1) 手册页

6.10. 使用设备路径的 RHEL 系统角色配置动态以太网连接

此流程描述了如何使用 RHEL 系统角色通过运行 Ansible playbook 为与特定设备路径匹配的设备远程添加动态以太网连接。使用动态 IP 设置时,网络连接会从 DHCP 服务器请求这个连接的 IP 设置。在 Ansible 控制节点上运行此步骤。

您可以使用以下命令识别设备路径:

# udevadm info /sys/class/net/<device_name> | grep ID_PATH=

先决条件

  • 网络中有 DHCP 服务器。
  • ansible-corerhel-system-roles 软件包在控制节点上安装。
  • 如果您在运行 playbook 时使用了与 root 不同的远程用户,则此用户在受管节点上具有合适的 sudo 权限。
  • 主机使用 NetworkManager 配置网络。

步骤

  1. 如果您要在其上执行 playbook 中指令的主机还没有被列入清单,请将此主机的 IP 或名称添加到 /etc/ansible/hosts Ansible 清单文件中:

    node.example.com
  2. 使用以下内容创建 ~/ethernet-dynamic-IP.yml playbook:

    ---
    - name: Configure an Ethernet connection with dynamic IP
      hosts: node.example.com
      become: true
      tasks:
      - include_role:
          name: rhel-system-roles.network
    
        vars:
          network_connections:
            - name: example
              match:
                path:
                  - pci-0000:00:0[1-3].0
                  - &!pci-0000:00:02.0
              type: ethernet
              autoconnect: yes
              ip:
                dhcp4: yes
                auto6: yes
              state: up

    本例中的 match 参数定义了,将 play 应用到与 PCI ID 0000:00:0[1-3].0 匹配的设备,但不包括 0000:00:02.0。有关可以使用的特殊修饰符和通配符的详情,请查看 /usr/share/ansible/roles/rhel-system-roles.network/README.md 文件中的 match 参数描述。

  3. 运行 playbook:

    • 要以 root 用户身份连接到受管主机,请输入:

      # ansible-playbook -u root ~/ethernet-dynamic-IP.yml
    • 以用户身份连接到受管主机,请输入:

      # ansible-playbook -u user_name --ask-become-pass ~/ethernet-dynamic-IP.yml

      --ask-become-pass 选项确保 ansible-playbook 命令提示输入 -u user_name 选项中定义的用户的 sudo 密码。

    如果没有指定 -u user_name 选项,ansible-playbook 以当前登录到控制节点的用户身份连接到受管主机。

其他资源

  • /usr/share/ansible/roles/rhel-system-roles.network/README.md 文件
  • ansible-playbook(1) 手册页

6.11. 使用 control-center 配置以太网连接

以太网连接是在物理机或虚拟机中最常用的连接类型。这部分论述了如何在 GNOME control-center 中配置此连接类型:

请注意,control-center 支持的配置选项比 nm-connection-editor 应用程序或 nmcli 实用程序支持的选项要少。

先决条件

  • 服务器配置中有一个物理或者虚拟以太网设备。
  • 已安装了 GNOME。

步骤

  1. Super 键,输入 Settings,然后按 Enter 键。
  2. 在左侧导航中选择 Network
  3. Wired 条目旁边的 + 按钮创建新配置集。
  4. 可选:在 Identity 选项卡中为连接设置名称。
  5. IPv4 标签页中,配置 IPv4 设置。例如,选择手动,设置静态 IPv4 地址、网络掩码、默认网关和 DNS 服务器:

    IPv4 设置控制中心 RHEL9
  6. IPv6 标签页中,配置 IPv6 设置。例如,选择手动,设置静态 IPv6 地址、网络掩码、默认网关和 DNS 服务器:

    IPv6 设置控制中心 RHEL9
  7. Add 按钮保存连接。GNOME control-center 会自动激活连接。

验证步骤

  1. 显示设备和连接的状态:

    # nmcli device status
    DEVICE      TYPE      STATE      CONNECTION
    enp7s0      ethernet  connected  Example-Connection
  2. 显示连接配置集的所有设置:

    # nmcli connection show Example-Connection
    connection.id:              Example-Connection
    connection.uuid:            b6cdfa1c-e4ad-46e5-af8b-a75f06b79f76
    connection.stable-id:       --
    connection.type:            802-3-ethernet
    connection.interface-name:  enp7s0
    ...
  3. 使用 ping 程序来验证这个主机是否可以向其它主机发送数据包。

    • 查找同一子网中的 IP 地址。

      对于 IPv4:

      # ping 192.0.2.3

      对于 IPv6:

      # ping 2001:db8:1::2

      如果命令失败,请验证 IP 和子网的设置。

    • 在远程子网中查找 IP 地址。

      对于 IPv4:

      # ping 198.162.3.1

      对于 IPv6:

      # ping 2001:db8:2::1
      • 如果命令失败,则使用 ping 默认网关来验证设置。

        对于 IPv4:

        # ping 192.0.2.254

        对于 IPv6:

        # ping 2001:db8:1::fffe
  4. 使用 host 实用程序来验证名称解析是否正常工作。例如:

    # host client.example.com

    如果命令返回任何错误,如 connection timed outno servers could be reached,请验证您的 DNS 设置。

故障排除步骤

  1. 如果连接失败,或者网络接口在上线和关闭状态间切换:

    • 确保网络电缆插入到主机和交换机。
    • 检查连接失败是否只存在于这个主机上,或者其他连接到该服务器连接的同一交换机的主机中。
    • 验证网络电缆和网络接口是否如预期工作。执行硬件诊断步骤并替换有缺陷的电缆和网络接口卡。

其它资源

6.12. 使用 nm-connection-editor 配置以太网连接

以太网连接是在物理或者虚拟服务器中最常用的连接类型。这部分论述了如何使用 nm-connection-editor 应用程序配置此连接类型。

先决条件

  • 服务器配置中有一个物理或者虚拟以太网设备。
  • 已安装了 GNOME。

流程

  1. 打开终端窗口,输入:

    $ nm-connection-editor
  2. + 按钮添加新连接。
  3. 选择 以太网连接 类型,然后单击 创建
  4. General 选项卡中:

    1. 要在系统引导时,或重启 NetworkManager 服务时自动启用此连接:

      1. 选择 Connect automatically with priority
      2. 可选:修改优先级 Connect automatically with priority

        如果同一设备有多个连接配置集,NetworkManager 只启用一个配置集。默认情况下,NetworkManager 激活启用了自动连接的最后使用的配置集。但是,如果您在配置集中设置了优先级值,NetworkManager 会以最高优先级激活配置集。

    2. 如果该配置集应该只对创建连接配置集的用户可用,清除 All users may connect to this network 复选框。

    ethernet connection general tab

  5. 以太网 选项卡中,选择一个设备,再选择性地选择与以太网相关的其他设置。 ethernet connection settings
  6. IPv4 Settings 选项卡中,配置 IPv4 设置。例如,设置静态 IPv4 地址、网络掩码、默认网关和 DNS 服务器: IPv4 settings nm connection editor
  7. IPv6 设置 选项卡上,配置 IPv6 设置。例如,设置静态 IPv6 地址、网络掩码、默认网关和 DNS 服务器: IPv6 settings nm connection editor
  8. 保存连接。
  9. 关闭 nm-connection-editor

验证步骤

  1. 使用 ping 程序来验证这个主机是否可以向其它主机发送数据包。

    • 查找同一子网中的 IP 地址。

      对于 IPv4:

      # ping 192.0.2.3

      对于 IPv6:

      # ping 2001:db8:1::2

      如果命令失败,请验证 IP 和子网的设置。

    • 在远程子网中查找 IP 地址。

      对于 IPv4:

      # ping 198.162.3.1

      对于 IPv6:

      # ping 2001:db8:2::1
      • 如果命令失败,则使用 ping 默认网关来验证设置。

        对于 IPv4:

        # ping 192.0.2.254

        对于 IPv6:

        # ping 2001:db8:1::fff3
    • 使用 host 实用程序来验证名称解析是否正常工作。例如:

      # host client.example.com

      如果命令返回任何错误,如 connection timed outno servers could be reached,请验证您的 DNS 设置。

其它资源

6.13. 更改 NetworkManager 的 DHCP 客户端

默认情况下,NetworkManager 使用其内部 DHCP 客户端。但是,如果您需要 DHCP 客户端具有内置客户端未提供的功能,您也可以将 NetworkManager 配置为使用 dhclient

请注意,RHEL 不提供 dhcpcd,因此 NetworkManager 无法使用这个客户端。

步骤

  1. 使用以下内容创建 /etc/NetworkManager/conf.d/dhcp-client.conf 文件:

    [main]
    dhcp=dhclient

    您可以将 dhcp 参数设置为 internal (默认)或 dhclient

  2. 如果将 dhcp 参数设置为 dhclient,请安装 dhcp-client 软件包:

    # dnf install dhcp-client
  3. 重启 NetworkManager:

    # systemctl restart NetworkManager

    请注意,重启会临时中断所有网络连接。

验证

  • /var/log/messages 日志文件中搜索类似如下的条目:

    Apr 26 09:54:19 server NetworkManager[27748]: <info>  [1650959659.8483] dhcp-init: Using DHCP client 'dhclient'

    此日志条目确认 NetworkManager 使用 dhclient 作为 DHCP 客户端。

其他资源

  • NetworkManager.conf(5)man page

6.14. 配置 NetworkManager 连接的 DHCP 行为

DHCP 客户端在每次连接到网络时都从 DHCP 服务器请求动态 IP 地址和对应配置信息。

当您将连接配置为从 DHCP 服务器检索 IP 地址时,网络管理器(NetworkManager)从 DHCP 服务器请求 IP 地址。默认情况下,客户端会等待 45 秒时间完成此请求。当 DHCP 连接启动时,dhcp 客户端会从 DHCP 服务器请求 IP 地址。

先决条件

  • 在主机上配置了使用 DHCP 的连接。

步骤

  1. 设置 ipv4.dhcp-timeoutipv6.dhcp-timeout 属性。例如,要将这两个选项都设置为 30 秒,请输入:

    # nmcli connection modify connection_name ipv4.dhcp-timeout 30 ipv6.dhcp-timeout 30

    另外,将参数设置为 infinity 以配置网络管理器(NetworkManager)不会停止尝试请求并续订 IP 地址,直到成功为止。

  2. 可选:配置如果网络管理器(NetworkManager)在超时前没有接收 IPv4 地址时的行为:

    # nmcli connection modify connection_name ipv4.may-fail value

    如果将 ipv4.may-fail 选项设置为:

    • yes,连接的状态取决于 IPv6 配置:

      • 如果启用了 IPv6 配置并成功,NetworkManager 会激活 IPv6 连接,不再尝试激活 IPv4 连接。
      • 如果禁用或未配置 IPv6 配置,连接会失败。
    • no,连接会被取消激活。在这种情况下:

      • 如果启用了连接的 autoconnect 属性,NetworkManager 会多次尝试激活连接,尝试的次数由 autoconnect-retries 属性设置。默认值为 4
      • 如果连接仍然无法获得 DHCP 地址,则自动激活会失败。请注意,5 分钟后,自动连接过程会再次启动,从 DHCP 服务器获取 IP 地址。
  3. 可选:配置如果网络管理器(NetworkManager)在超时前没有接收 IPv6 地址时的行为:

    # nmcli connection modify connection_name ipv6.may-fail value

其他资源

  • nm-settings(5) man page

6.15. 通过接口名称使用单一连接配置集配置多个以太网接口

在大多数情况下,一个连接配置集包含一个网络设备的设置。但是,当您在连接配置集中设置接口名称时,NetworkManager 也支持通配符。如果以太网网络之间具有动态 IP 地址分配的主机 roam,您可以使用此功能创建可用于多个以太网接口的单一连接配置集。

先决条件

  • DHCP 在网络中可用
  • 主机有多个以太网适配器
  • 主机上不存在连接配置集

步骤

  1. 添加应用于从 enp 开头的所有接口名称的连接配置集:

    #nmcli connection add con-name Example connection.multi-connect multiple match.interface-name enp* type ethernet

验证步骤

  1. 显示单个连接配置集的所有设置:

    #nmcli connection show Example
    connection.id:                      Example
    ...
    connection.multi-connect:           3 (multiple)
    match.interface-name:               `enp*`
    ...

    3 表示连接配置集上同时活跃的接口数量,而不是连接配置集中的网络接口数量。连接配置集使用与 match.interface-name 参数中的模式匹配的所有设备,因此连接配置集具有相同的通用唯一识别符(UUID)。

  2. 显示连接的状态:

    #nmcli connection show
    NAME                    UUID                    TYPE     DEVICE
    ...
    Example  6f22402e-c0cc-49cf-b702-eaf0cd5ea7d1  ethernet  enp7s0
    Example  6f22402e-c0cc-49cf-b702-eaf0cd5ea7d1  ethernet  enp8s0
    Example  6f22402e-c0cc-49cf-b702-eaf0cd5ea7d1  ethernet  enp9s0

其他资源

  • nmcli(1) man page
  • nm-settings(5) man page

6.16. 使用 PCI ID 为多个以太网接口配置单一连接配置集

PCI ID 是连接到该系统的设备的唯一标识符。连接配置集根据 PCI ID 列表匹配接口来添加多个设备。您可以使用这个步骤将多个设备 PCI ID 连接到单个连接配置集。

先决条件

  • DHCP 服务器在网络中可用
  • 主机有多个以太网适配器
  • 系统中不存在连接配置集

步骤

  1. 识别设备路径。例如,要显示以 enp 开头的所有接口的设备路径,请输入:

    #udevadm info /sys/class/net/enp* | grep ID_PATH=
    
    ...
    E: ID_PATH=pci-0000:07:00.0
    E: ID_PATH=pci-0000:08:00.0
  2. 添加与 0000:00:0[7-8].0 表达式匹配的所有 PCI ID 的连接配置集:

    #nmcli connection add type ethernet connection.multi-connect multiple match.path "pci-0000:07:00.0 pci-0000:08:00.0" con-name Example

验证步骤

  1. 显示连接的状态:

    #nmcli connection show
    
    NAME   UUID     TYPE        DEVICE
    ...
    Example      9cee0958-512f-4203-9d3d-b57af1d88466  ethernet  enp7s0
    Example      9cee0958-512f-4203-9d3d-b57af1d88466  ethernet  enp8s0
    ...
  2. 显示连接配置集的所有设置:

    #nmcli connection show Example
    
    connection.id:               Example
    ...
    connection.multi-connect:    3 (multiple)
    match.path:                  pci-0000:07:00.0,pci-0000:08:00.0
    ...

此连接配置集使用与 match.path 参数中的模式匹配的所有设备,因此连接配置集具有相同的全局唯一标识符(UUID)。

其他资源

  • nmcli(1) man page
  • nm-settings(5) man page

第 7 章 管理 Wi-Fi 连接

这部分论述了如何配置和管理 Wi-Fi 连接。

7.1. 设置无线规范域

在 Red Hat Enterprise Linux 中,crda 软件包包含中央常规域代理,它为内核提供给定的无线管理规则。某些 udev 脚本使用它,且不应手动运行,除非要调试 udev 脚本。内核在新规范域更改时发送 udev 事件来运行 crda。规范域更改由 Linux 无线子系统(IEEE-802.11)触发。此子系统使用 regulatory.bin 文件来保持其监管数据库信息。

setregdomain 实用程序为您的系统设置规范域。Setregdomain 不使用任何参数,通常通过系统脚本调用,如 udev,而不是管理员手动调用。如果国家代码查找失败,系统管理员可以在 /etc/sysconfig/regdomain 文件中定义 COUNTRY 环境变量。

其他资源

  • setregdomain(1) man page
  • crda(8) man page
  • regulatory.bin(5) man page
  • iw(8) man page

7.2. 使用 nmcli 配置 Wi-Fi 连接

这个步骤描述了如何使用 nmcli 配置 Wi-fi 连接配置集。

先决条件

  • 安装了 nmcli 工具。
  • 确保 WiFi 被启用(默认):

    $ nmcli radio wifi on

步骤

  1. 使用静态 IP 配置创建 Wi-Fi 连接配置集:

    $ nmcli con add con-name MyCafe ifname wlan0 type wifi ssid MyCafe ip4 192.0.2.101/24 gw4 192.0.2.1
  2. 设置一个 DNS 服务器。例如,将 192.0.2.1 设置为 DNS 服务器:

    $ nmcli con modify con-name MyCafe ipv4.dns "192.0.2.1"
  3. 另外,还可设置 DNS 搜索域。例如,要将搜索域设置为 example.com

    $ nmcli con modify con-name MyCafe ipv4.dns-search "example.com"
  4. 要检查特定属性,如 mtu

    $ nmcli connection show id MyCafe | grep mtu
    802-11-wireless.mtu:                     auto
  5. 更改设置的属性:

    $ nmcli connection modify id MyCafe wireless.mtu 1350
  6. 验证更改:

    $ nmcli connection show id MyCafe | grep mtu
    802-11-wireless.mtu:                     1350

验证步骤

  1. 使用 ping 程序来验证这个主机是否可以向其它主机发送数据包。

    • 查找同一子网中的 IP 地址。例如:

      # ping 192.0.2.103

      如果命令失败,请验证 IP 和子网的设置。

    • 在远程子网中查找 IP 地址。例如:

      # ping 198.51.16.3
      • 如果命令失败,则使用 ping 默认网关来验证设置。

        # ping 192.0.2.1
  2. 使用 host 实用程序来验证名称解析是否正常工作。例如:

    # host client.example.com

    如果命令返回任何错误,如 connection timed outno servers could be reached,请验证您的 DNS 设置。

其他资源

7.3. 使用 control-center 配置 Wi-Fi 连接

当您连接到 Wi-Fi 时,会根据当前的网络连接预先填充网络设置。这意味着当接口连接到网络时会自动探测到设置。

这个步骤描述了如何使用 control-center 手动配置 Wi-Fi 设置。

步骤

  1. Super 键进入 Activities Overview,键入 Wi-Fi 并按 Enter。在左侧的菜单条目中您可以看到可用的网络列表。
  2. 选择您要编辑的 Wi-Fi 连接名称右侧的齿轮图标,编辑连接对话框会显示。Details 菜单窗口显示您可以进行进一步配置的连接详情。

    选项

    1. 如果您选择了自动连接NetworkManager 会在 NetworkManager 检测到连接可用时自动连接到此连接。如果您不希望 NetworkManager 自动连接,请清除复选框。请注意,当选择复选框时,您必须在网络连接图标的菜单中手动选择该连接会导致它连接。
    2. 要使连接可供其他用户使用,选中 Make available to available to other users 复选框。
    3. 您还可以通过更改 Restrict background data usage 选项来控制后台数据使用量。

      注意

      要删除 Wi-Fi 连接,请单击 Forget Connection 红框。

  3. 选择 Identity 菜单项来查看基本配置选项。

    SSID - 访问点(AP)的 Service Set Identifier (SSID)。

    BSSID - Basic Service Set Identifier (BSSID)是在 Infrastructure 模式中您连接到的特定无线访问点的 MAC 地址(也称为硬件地址 。默认情况下,该字段为空白,您可以在无需指定 BSSID 的情况下连接到 SSID 指向的无线接入点。如果指定了 BSSID,它将强制系统只关联到特定的接入点。对于临时网络,在创建临时网络时,mac80211 子系统会随机生成 BSSID。网络管理器(NetworkManager)不显示它。

    MAC 地址 - MAC 地址允许您将特定的无线适配器与特定连接关联。

    克隆的地址 - 要使用的克隆的 MAC 地址来代替实际硬件地址。保留空白,除非需要。

  4. 要进行进一步的 IP 地址配置,请选择 IPv4IPv6 菜单项。

    默认情况下,根据当前的网络设置,IPv4IPv6 都被设置为自动配置。这意味着,当接口连接到网络时,会自动检测到本地 IP 地址、DNS 地址和其他设置。如果有 DHCP 服务器在此网络中负责分配 IP 配置,这就足够了,但您也可以在 IPv4IPv6 设置中提供静态配置。在 IPv4IPv6 菜单条目中,您可以看到以下设置:

    • IPv4 方法

      • Automatic (DHCP) - 如果您要连接的网络使用路由器广告(Router Advertisements,RA)或 DHCP 服务器来分配动态 IP 地址,请选择这个选项。您可以在 Details 菜单条目中看到分配的 IP 地址。
      • Link-Local Only - 如果您要连接的网络没有 DHCP 服务器且您不想手动分配 IP 地址,请选择这个选项。随机地址将根据 RFC 3927 分配前缀 169.254/16
      • 手动 - 如果您要手动分配 IP 地址,请选择这个选项。
      • Disable - 在这个连接中禁用 IPv4
    • DNS

      如果 AutomaticON,且没有可用的 DHCP 服务器为这个连接分配 DNS 服务器,请将其设置为 OFF 来输入用逗号分开的 DNS 服务器的 IP 地址。

    • Routes

      请注意,在 Routes 部分,当 AutomaticON 时,会使用路由器公告(RA)或 DHCP 的路由,但您也可以添加其他静态路由。当 OFF 时,只使用静态路由。

      • Address - 输入远程网络、子网络或主机的 IP 地址。
      • Netmask - 以上输入的 IP 地址的子网掩码或前缀长度。
      • Gateway - 上面输入的远程网络、子网络或主机的网关的 IP 地址。
      • Metric - 网络成本,赋予此路由的首选值。数值越低,优先级越高。
    • 仅将此连接用于其网络上的资源

      选择这个复选框以防止连接成为默认路由。

    另外,要在 Wi-Fi 连接中配置 IPv6 设置,请选择 IPv6 菜单条目:

    • IPv6 Method

      • Automatic - 选择这个选项使用 IPv6 Stateless Address AutoConfiguration(SLAAC)根据硬件地址和路由器公告(RA)创建自动的、无状态的配置。
      • Automatic, DHCP only - 选择这个选项以不使用 RA,但从 DHCPv6 请求信息以创建有状态的配置。
      • Link-Local Only - 如果您要连接的网络没有 DHCP 服务器且您不想手动分配 IP 地址,请选择这个选项。随机地址将根据 RFC 4862 分配,前缀为 FE80::0
      • 手动 - 如果您要手动分配 IP 地址,请选择这个选项。
      • Disable - 在这个连接中禁用 IPv6
    • DNS, Routes, Use this connection only for resources on its network 项是 IPv4 的常规设置。
  5. 要在 Wi-Fi 连接中配置 Security 性设置,请选择 Security 菜单条目。

    警告

    不要在没有加密的情况下连接到 Wi-Fi 网络,或者只支持不安全的 WEP 或 WPA 标准。

    可用的配置选项如下:

    • 安全性

      • None - 禁用加密,且数据通过网络以纯文本传输。
      • WEP 40/128-bit Key — Wired Equivalent Privacy (WEP),来自 IEEE 802.11 标准。使用单一预共享密钥(PSK)。
      • WEP 128-bit Passphrase - 生成 WEP 密钥的密码短语的 MD5 哈希。
      • 动态 WEP(802.1X) - 动态更改 WEP 密钥。
      • LEAP - 思科系统轻量级扩展验证协议。
      • WPA & WPA2 Personal — Wi-Fi Protected Access (WPA),来自 IEEE 802.11i 标准草稿。Wi-Fi Protected Access 2(WPA2),来自 802.11i-2004 标准。个人模式,使用预共享密钥(WPA-PSK)。
      • WPA & WPA2 Enterprise - 与 RADIUS 验证服务器一起使用的 WPA 和 WPA 2 提供 IEEE 802.1X 网络访问控制。
      • WPA3 Personal - Wi-Fi Protected Access 3(WPA3)Personal 使用 Simultaneous Authentication of Equals(SAE)而不是预共享密钥(PSK)以防止字典攻击。WPA3 使用完美的转发保密。
    • Password - 输入要在验证过程中使用的密码。
  6. 完成配置后,点 应用 按钮保存配置。
注意

当您点 加号 按钮添加新连接时, NetworkManager 会为那个连接创建新配置文件,然后打开同一个对话框来编辑现有连接。这两个对话框之间的区别在于现有连接配置集有详情菜单条目。

7.4. 使用 nmcli 连接到 Wi-Fi 网络

这个步骤描述了如何使用 nmcli 实用程序连接到 无线 连接。

先决条件

  • 安装了 nmcli 工具。
  • 确保 WiFi 被启用(默认):

    $ nmcli radio wifi on

流程

  1. 刷新可用的 Wi-Fi 连接列表:

    $ nmcli device wifi rescan
  2. 查看可用的 Wi-Fi 接入点:

    $ nmcli dev wifi list
    
    IN-USE  SSID      MODE   CHAN  RATE        SIGNAL  BARS  SECURITY
    ...
            MyCafe    Infra  3     405 Mbit/s  85      ▂▄▆█  WPA1 WPA2
  3. 使用 nmcli 连接到 Wi-Fi 连接:

    $ nmcli dev wifi connect SSID-Name password wireless-password

    例如:

    $ nmcli dev wifi connect MyCafe password wireless-password

    请注意,如果要禁用 Wi-Fi 状态:

    $ nmcli radio wifi off

7.5. 使用 nmcli 连接到隐藏的 Wi-Fi 网络

所有接入点都有一个 Service Set Identifier(SSID)来识别它们。然而,接入点可以被配置为不广播其 SSID,在这种情况下,它会被隐藏,且不会出现在网络管理器(NetworkManager)的可用网络列表中。

此步骤演示了如何使用 nmcli 工具连接到隐藏网络。

先决条件

  • 安装了 nmcli 工具。
  • 知道 SSID,以及 Wi-Fi 连接的密码。
  • 确保 WiFi 被启用(默认):

    $ nmcli radio wifi on

流程

  • 连接到隐藏的 SSID:

    $ nmcli dev wifi connect SSID_Name password wireless_password hidden yes

7.6. 使用 GNOME GUI 连接至 Wi-Fi 网络

这个步骤描述了如何连接到无线网络以访问互联网。

流程

  1. 在屏幕右上角打开 GNOME Shell 网络连接图标菜单。
  2. 选择 Wi-Fi Not Connected
  3. Select Network 选项。
  4. 单击您要连接的网络名称,然后单击 连接

    请注意,如果没有看到网络,则网络可能是隐藏的。

  5. 如果网络需要密码或加密密钥保护,请输入密码并单击 连接

    请注意:如果您不知道密码,请联络 Wi-Fi 网络的管理员。

  6. 如果连接成功,则会在连接图标菜单中看到网络连接,无线指示符位于屏幕右上角。

7.7. 使用 nmcli 在现有 Wi-Fi 连接中配置 802.1X 网络身份验证

使用 nmcli 工具,您可以配置客户端来向网络验证其自身。这个流程描述了如何在现有名为 wlp1s0 的 NetworkManager Wi-Fi 连接配置文件中配置具有 Microsoft Challenge-Handshake Authentication Protocol 版本 2(MSCHAPv2)的 Protected Extensible Authentication Protocol(PEAP)身份验证。

先决条件

  1. 网络必须具有 802.1X 网络身份验证。
  2. Wi-Fi 连接配置集存在于 NetworkManager 中,且具有有效的 IP 配置。
  3. 如果需要客户端验证验证器的证书,则必须将证书颁发机构(CA)证书存储在 /etc/pki/ca-trust/source/anchors/ 目录中。
  4. 已安装 wpa_supplicant 软件包。

步骤

  1. 将 Wi-Fi 安全模式设为 wpa-eap,将 Extensible Authentication Protocol (EAP)设为 peap,将内部身份验证协议设为 mschapv2,以及用户名:

    # nmcli connection modify wlp1s0 wireless-security.key-mgmt wpa-eap 802-1x.eap peap 802-1x.phase2-auth mschapv2 802-1x.identity user_name

    请注意,您必须在单个命令中设置 wireless-security.key-mgmt,802-1x.eap802-1x.phase2-auth802-1x.identity 参数。

  2. 另外,还可将该密码存储在配置中:

    # nmcli connection modify wlp1s0 802-1x.password password
    重要

    默认情况下,NetworkManager 将密码以明文形式存储在 /etc/sysconfig/network-scripts/keys-connection_name 文件中,该文件只对 root 用户可读。但是,在配置文件中清除文本密码会有安全隐患。

    要提高安全性,请将 802-1x.password-flags 参数设为 0x1。有了这个设置,在具有 GNOME 桌面环境或运行nm-applet 的服务器上,NetworkManager 从这些服务检索密码。在其他情况下,NetworkManager 会提示输入密码。

  3. 如果需要客户端验证验证器的证书,请将连接配置文件中的 802-1x.ca-cert 参数设为 CA 证书的路径:

    # nmcli connection modify wlp1s0 802-1x.ca-cert /etc/pki/ca-trust/source/anchors/ca.crt
    注意

    为了安全起见,红帽建议使用验证程序证书来使客户端能够验证验证器的身份。

  4. 激活连接配置集:

    # nmcli connection up wlp1s0

验证步骤

  • 访问需要网络身份验证的网络上的资源。

其他资源

第 8 章 配置 VLAN 标记

这部分论述了如何配置虚拟本地区域网络(VLAN)。VLAN 是物理网络中的一个逻辑网络。当 VLAN 接口通过接口时,VLAN 接口标签带有 VLAN ID 的数据包,并删除返回的数据包的标签。

您可以在另一个接口(如以太网、绑定、team 或桥接设备)上创建 VLAN 接口。这个界面被称为 父接口

8.1. 使用 nmcli 命令配置 VLAN 标记

这部分论述了如何使用 nmcli 工具配置 Virtual Local Area Network(VLAN)标记。

先决条件

  • 您计划用作虚拟 VLAN 接口的父接口支持 VLAN 标签。
  • 如果您在绑定接口之上配置 VLAN:

    • 绑定的端口是上线的。
    • 这个绑定没有使用 fail_over_mac=follow 选项配置。VLAN 虚拟设备无法更改其 MAC 地址以匹配父设备的新 MAC 地址。在这种情况下,流量仍会使用不正确的源 MAC 地址发送。
    • 这个绑定通常不会预期从 DHCP 服务器或 IPv6 自动配置获取 IP 地址。在创建绑定时设置 ipv4.method=disableipv6.method=ignore 选项来确保它。否则,如果 DHCP 或 IPv6 自动配置失败,接口可能会关闭。
  • 主机连接到的交换机被配置为支持 VLAN 标签。详情请查看您的交换机文档。

流程

  1. 显示网络接口:

    # nmcli device status
    DEVICE   TYPE      STATE         CONNECTION
    enp1s0   ethernet  disconnected  enp1s0
    bridge0  bridge    connected     bridge0
    bond0    bond      connected     bond0
    ...
  2. 创建 VLAN 接口。例如,要创建一个名为 vlan10 的 VLAN 接口,它使用 enp1s0 作为其父接口,以及带有 VLAN ID 10 的标记数据包,请输入:

    # nmcli connection add type vlan con-name vlan10 ifname vlan10 vlan.parent enp1s0 vlan.id 10

    请注意,VLAN 必须在范围 04094 之间。

  3. 默认情况下,VLAN 连接会继承上级接口的最大传输单元(MTU)。另外,还可设置不同的 MTU 值:

    # nmcli connection modify vlan10 ethernet.mtu 2000
  4. 配置 VLAN 设备的 IP 设置。如果要使用这个 VLAN 设备作为其它设备的端口,请跳过这一步。

    1. 配置 IPv4 设置。例如,要为 vlan10 连接设置静态 IPv4 地址、网络掩码、默认网关和 DNS 服务器设置,请输入:

      # nmcli connection modify vlan10 ipv4.addresses '192.0.2.1/24'
      # nmcli connection modify vlan10 ipv4.gateway '192.0.2.254'
      # nmcli connection modify vlan10 ipv4.dns '192.0.2.253'
      # nmcli connection modify vlan10 ipv4.method manual
    2. 配置 IPv6 设置。例如,要为 vlan10 连接设置静态 IPv6 地址、网络掩码、默认网关和 DNS 服务器设置,请输入:

      # nmcli connection modify vlan10 ipv6.addresses '2001:db8:1::1/32'
      # nmcli connection modify vlan10 ipv6.gateway '2001:db8:1::fffe'
      # nmcli connection modify vlan10 ipv6.dns '2001:db8:1::fffd'
      # nmcli connection modify vlan10 ipv6.method manual
  5. 激活连接:

    # nmcli connection up vlan10

验证步骤

  • 验证设置:

    # ip -d addr show vlan10
    4: vlan10@enp1s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
        link/ether 52:54:00:72:2f:6e brd ff:ff:ff:ff:ff:ff promiscuity 0
        vlan protocol 802.1Q id 10 <REORDER_HDR> numtxqueues 1 numrxqueues 1 gso_max_size 65536 gso_max_segs 65535
        inet 192.0.2.1/24 brd 192.0.2.255 scope global noprefixroute vlan10
           valid_lft forever preferred_lft forever
        inet6 2001:db8:1::1/32 scope global noprefixroute
           valid_lft forever preferred_lft forever
        inet6 fe80::8dd7:9030:6f8e:89e6/64 scope link noprefixroute
           valid_lft forever preferred_lft forever

其他资源

8.2. 使用 RHEL web 控制台配置 VLAN 标记

本节介绍如何使用 RHEL web 控制台配置网络桥接。

先决条件

  • 您计划用作虚拟 VLAN 接口的父接口支持 VLAN 标签。
  • 如果您在绑定接口之上配置 VLAN:

    • 绑定的端口是上线的。
    • 这个绑定没有使用 fail_over_mac=follow 选项配置。VLAN 虚拟设备无法更改其 MAC 地址以匹配父设备的新 MAC 地址。在这种情况下,流量仍会使用不正确的源 MAC 地址发送。
    • 这个绑定通常不会预期从 DHCP 服务器或 IPv6 自动配置获取 IP 地址。禁用 IPv4 和 IPv6 协议创建绑定以确保它。否则,如果 DHCP 或 IPv6 自动配置失败,接口可能会关闭。
  • 主机连接到的交换机被配置为支持 VLAN 标签。详情请查看您的交换机文档。

步骤

  1. 在屏幕左侧的导航中选择 Networking 选项卡。
  2. Interfaces 部分点 Add VLAN
  3. 选择父设备。
  4. 输入 VLAN ID。
  5. 输入 VLAN 设备的名称,或保留自动生成的名称。

    VLAN 设置
  6. 应用
  7. 默认情况下,VLAN 设备使用动态 IP 地址。如果要设置静态 IP 地址:

    1. Interfaces 部分中的 VLAN 设备名称。
    2. 点您要配置的协议旁的 Edit
    3. 选择 地址 旁边的 "手动 ",并输入 IP 地址、前缀和默认网关。
    4. DNS 部分,点 + 按钮,并输入 DNS 服务器的 IP 地址。重复此步骤来设置多个 DNS 服务器。
    5. DNS 搜索域 部分中,点 + 按钮并输入搜索域。
    6. 如果接口需要静态路由,请在 Routes 部分配置它们。

      bond team bridge vlan.ipv4
    7. 应用

验证

  • 在屏幕左侧的导航中选择 Networking 选项卡,并检查接口上是否有传入和传出流量:

    VLAN 验证

8.3. 使用 nm-connection-editor 配置 VLAN 标记

这部分论述了如何使用 nm-connection-editor 应用程序配置 Virtual Local Area Network(VLAN)标记。

先决条件

  • 您计划用作虚拟 VLAN 接口的父接口支持 VLAN 标签。
  • 如果您在绑定接口之上配置 VLAN:

    • 绑定的端口是上线的。
    • 这个绑定没有使用 fail_over_mac=follow 选项配置。VLAN 虚拟设备无法更改其 MAC 地址以匹配父设备的新 MAC 地址。在这种情况下,流量仍会使用不正确的源 MAC 地址发送。
  • 主机已连接,以支持 VLAN 标签。详情请查看您的交换机文档。

步骤

  1. 打开终端并输入 nm-connection-editor

    $ nm-connection-editor
  2. + 按钮添加新连接。
  3. 选择 VLAN 连接类型,然后单击 Create
  4. VLAN 标签页中:

    1. 选择上级接口。
    2. 选择 VLAN ID。请注意,VLAN 必须在范围 04094 之间。
    3. 默认情况下,VLAN 连接会继承上级接口的最大传输单元(MTU)。另外,还可设置不同的 MTU 值。
    4. 另外,还可设置 VLAN 接口的名称以及其它特定 VLAN 选项。

      vlan settings nm connection editor

  5. 配置 VLAN 设备的 IP 设置。如果要使用这个 VLAN 设备作为其它设备的端口,请跳过这一步。

    1. IPv4 Settings 选项卡中,配置 IPv4 设置。例如,设置静态 IPv4 地址、网络掩码、默认网关和 DNS 服务器: vlan IPv4 settings nm connection editor
    2. IPv6 设置 选项卡上,配置 IPv6 设置。例如,设置静态 IPv6 地址、网络掩码、默认网关和 DNS 服务器: vlan IPv6 settings nm connection editor
  6. 点击 Save 保存 VLAN 连接。
  7. 关闭 nm-connection-editor

验证步骤

  1. 验证设置:

    # ip -d addr show vlan10
    4: vlan10@enp1s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
        link/ether 52:54:00:d5:e0:fb brd ff:ff:ff:ff:ff:ff promiscuity 0
        vlan protocol 802.1Q id 10 <REORDER_HDR> numtxqueues 1 numrxqueues 1 gso_max_size 65536 gso_max_segs 65535
        inet 192.0.2.1/24 brd 192.0.2.255 scope global noprefixroute vlan10
           valid_lft forever preferred_lft forever
        inet6 2001:db8:1::1/32 scope global noprefixroute
           valid_lft forever preferred_lft forever
        inet6 fe80::8dd7:9030:6f8e:89e6/64 scope link noprefixroute
           valid_lft forever preferred_lft forever

8.4. 使用 nmstatectl 配置 VLAN 标记

这部分论述了如何使用 nmstatectl 工具配置使用以太网连接 ID 10 的 VLAN。作为子设备,VLAN 连接包含 IP、默认网关和 DNS 配置。

根据您的环境,相应地调整 YAML 文件。例如,若要在 VLAN 中使用网桥或绑定设备,请调整您在 VLAN 中使用的端口的 base-iface 属性和 type 属性。

先决条件

  • 要将以太网设备用作 VLAN 中的端口,必须在服务器中安装物理或者虚拟以太网设备。
  • 已安装 nmstate 软件包。

步骤

  1. 创建包含以下内容的 YAML 文件,如 ~/create-vlan.yml

    ---
    interfaces:
    - name: vlan10
      type: vlan
      state: up
      ipv4:
        enabled: true
        address:
        - ip: 192.0.2.1
          prefix-length: 24
        dhcp: false
      ipv6:
        enabled: true
        address:
        - ip: 2001:db8:1::1
          prefix-length: 64
        autoconf: false
        dhcp: false
      vlan:
        base-iface: enp1s0
        id: 10
    - name: enp1s0
      type: ethernet
      state: up
    
    routes:
      config:
      - destination: 0.0.0.0/0
        next-hop-address: 192.0.2.254
        next-hop-interface: vlan10
      - destination: ::/0
        next-hop-address: 2001:db8:1::fffe
        next-hop-interface: vlan10
    
    dns-resolver:
      config:
        search:
        - example.com
        server:
        - 192.0.2.200
        - 2001:db8:1::ffbb
  2. 将设置应用到系统:

    # nmstatectl apply ~/create-vlan.yml

验证步骤

  1. 显示设备和连接的状态:

    # nmcli device status
    DEVICE      TYPE      STATE      CONNECTION
    vlan10      vlan      connected  vlan10
  2. 显示连接配置集的所有设置:

    # nmcli connection show vlan10
    connection.id:              vlan10
    connection.uuid:            1722970f-788e-4f81-bd7d-a86bf21c9df5
    connection.stable-id:       --
    connection.type:            vlan
    connection.interface-name:  vlan10
    ...
  3. 以 YAML 格式显示连接设置:

    # nmstatectl show vlan0

其他资源

  • nmstatectl(8) man page
  • /usr/share/doc/nmstate/examples/

8.5. 使用 RHEL 系统角色配置 VLAN 标记

您可以使用网络 RHEL 系统角色配置 VLAN 标记。这个流程描述了如何在这个以太网连接之上添加以太网连接和 ID 为 10 的 VLAN。作为子设备,VLAN 连接包含 IP、默认网关和 DNS 配置。

根据您的环境,相应地进行调整。例如:

  • 若要将 VLAN 用作其他连接中的端口(如绑定),请省略 ip 属性,并在子配置中设置 IP 配置。
  • 若要在 VLAN 中使用 team、bridge 或 bond 设备,请调整您在 VLAN 中使用的端口的 interface_name类型 属性。

先决条件

  • ansible-corerhel-system-roles 软件包在控制节点上安装。
  • 如果您在运行 playbook 时使用了与 root 不同的远程用户,则此用户在受管节点上具有合适的 sudo 权限。

步骤

  1. 如果您要在其上执行 playbook 中指令的主机还没有被列入清单,请将此主机的 IP 或名称添加到 /etc/ansible/hosts Ansible 清单文件中:

    node.example.com
  2. 使用以下内容创建 ~/vlan-ethernet.yml playbook:

    ---
    - name: Configure a VLAN that uses an Ethernet connection
      hosts: node.example.com
      become: true
      tasks:
      - include_role:
          name: rhel-system-roles.network
    
        vars:
          network_connections:
            # Add an Ethernet profile for the underlying device of the VLAN
            - name: enp1s0
              type: ethernet
              interface_name: enp1s0
              autoconnect: yes
              state: up
              ip:
                dhcp4: no
                auto6: no
    
            # Define the VLAN profile
            - name: enp1s0.10
              type: vlan
              ip:
                address:
                  - "192.0.2.1/24"
                  - "2001:db8:1::1/64"
                gateway4: 192.0.2.254
                gateway6: 2001:db8:1::fffe
                dns:
                  - 192.0.2.200
                  - 2001:db8:1::ffbb
                dns_search:
                  - example.com
              vlan_id: 10
              parent: enp1s0
              state: up

    VLAN 配置文件中的 parent 属性将 VLAN 配置为在 enp1s0 设备之上运行。

  3. 运行 playbook:

    • 要以 root 用户身份连接到受管主机,请输入:

      # ansible-playbook -u root ~/vlan-ethernet.yml
    • 以用户身份连接到受管主机,请输入:

      # ansible-playbook -u user_name --ask-become-pass ~/vlan-ethernet.yml

      --ask-become-pass 选项确保 ansible-playbook 命令提示输入 -u user_name 选项中定义的用户的 sudo 密码。

    如果没有指定 -u user_name 选项,ansible-playbook 以当前登录到控制节点的用户身份连接到受管主机。

其他资源

  • /usr/share/ansible/roles/rhel-system-roles.network/README.md 文件
  • ansible-playbook(1) 手册页

第 9 章 使用 VXLAN 为虚拟机创建虚拟层-2 域

虚拟可扩展 LAN(VXLAN)是一种网络协议,通过 UDP 协议通过 IP 网络隧道连接第 2 层流量。例如,在不同主机上运行的某些虚拟机可通过 VXLAN 隧道进行通信。主机可以位于不同的子网中,甚至位于世界各地的不同数据中心。从虚拟机的角度来看,同一 VXLAN 中的其他虚拟机在同一第 2 层域中。

本文档论述了如何在 RHEL 主机上配置 VXLAN,对于虚拟机这是不可避免的:

VXLAN 隧道

在本例中,RHEL-host-A 和 RHEL-host-B 使用网桥 br0,将每台主机上虚拟机的虚拟网络与名为 vxlan10 的 VXLAN 连接。由于此配置,VXLAN 对虚拟机不可见,而且虚拟机不需要任何特殊的配置。如果您稍后将更多虚拟机连接到同一虚拟网络,则虚拟机将自动是同一虚拟层 2 域的成员。

重要

与普通的 L-2 流量一样,VXLAN 中的数据不会被加密。出于安全考虑,通过 VPN 或其他类型的加密连接使用 VXLAN。

9.1. VXLAN 的优点

虚拟可扩展 LAN(VXLAN)具有以下主要优点:

  • VXLAN 使用 24 位 ID。因此,您可以最多创建 16,777,216 隔离的网络。例如,虚拟 LAN(VLAN)只支持 4,096 隔离的网络。
  • VXLAN 使用 IP 协议。这可让您在同一层-2 域中路由流量和虚拟运行在不同网络和位置中的系统。
  • 与大多数隧道协议不同,VXLAN 不仅仅是点对点网络。VXLAN 可以动态了解其他端点的 IP 地址,也可以使用静态配置的转发条目。
  • 某些网卡支持 UDP 隧道相关卸载功能。

其他资源

  • /usr/share/doc/kernel-doc-<kernel_version>/Documentation/networking/vxlan.rstkernel-doc 软件包提供

9.2. 在主机上配置以太网接口

要将 RHEL 虚拟机主机连接到以太网,请创建一个网络连接配置集,配置 IP 设置并激活配置集。

在 RHEL 主机上运行这个步骤,并相应地调整 IP 地址配置。

先决条件

  • 主机连接到以太网主机。

步骤

  1. 在 NetworkManager 中添加新的以太网连接配置集:

    # nmcli connection add con-name Example ifname enp1s0 type ethernet
  2. 配置 IPv4 设置:

    # nmcli connection modify Example ipv4.addresses 198.51.100.2/24 ipv4.method manual ipv4.gateway 198.51.100.254 ipv4.dns 198.51.100.200 ipv4.dns-search example.com

    如果网络使用 DHCP,请跳过这一步。

  3. 激活 Example 连接:

    # nmcli connection up Example

验证

  1. 显示设备和连接的状态:

    # nmcli device status
    DEVICE      TYPE      STATE      CONNECTION
    enp1s0      ethernet  connected  Example
  2. 在远程网络中 ping 主机以验证 IP 设置:

    # ping RHEL-host-B.example.com

    请注意,在已在该主机上配置网络前,您无法对其他虚拟机主机进行 ping 操作。

其他资源

  • nm-settings(5)

9.3. 创建附加了 VXLAN 的网络桥接

要使虚拟可扩展局域网(VXLAN)无法对虚拟机(VM)可见,在主机上创建一个网桥,并将 VXLAN 与网桥连接。使用 NetworkManager 创建网桥和 VXLAN。您不会向网桥中添加虚拟机的任何流量访问点(TAP)设备(通常名为 vnet* )。libvirtd 服务在虚拟机启动时动态添加。

在 RHEL 主机上运行这个步骤,并相应地调整 IP 地址。

步骤

  1. 创建网桥 br0

    # nmcli connection add type bridge con-name br0 ifname br0 ipv4.method disabled ipv6.method disabled

    此命令在网桥设备上设置 IPv4 和 IPv6 地址,因为此网桥在第 2 层中工作。

  2. 创建 VXLAN 接口,并将它连接到 br0

    # nmcli connection add type vxlan slave-type bridge con-name br0-vxlan10 ifname vxlan10 id 10 local 198.51.100.2 remote 203.0.113.1 master br0

    这个命令使用以下设置:

    • id 10 :设置 VXLAN 标识符。
    • local 198.51.100.2 :设置传出数据包的源 IP 地址。
    • remote 203.0.113.1 :当 VXLAN 设备转发数据库中不知道目标链路层地址时,将单播或多播 IP 地址设置为在传出数据包中使用。
    • master br0 :设置此 VXLAN 连接,使其在 br0 连接中作为端口创建。
    • ipv4.method disabledipv6.method disabled :禁用网桥上的 IPv4 和 IPv6。

    默认情况下,NetworkManager 使用 8472 作为目的地端口。如果目标端口不同,还要将 destination-port <port_number> 选项传递给该命令。

  3. 激活 br0 连接配置集:

    # nmcli connection up br0
  4. 在本地防火墙中为传入的 UDP 连接打开端口 8472

    # firewall-cmd --permanent --add-port=8472/udp
    # firewall-cmd --reload

验证

  • 显示转发表:

    # bridge fdb show dev vxlan10
    2a:53:bd:d5:b3:0a master br0 permanent
    00:00:00:00:00:00 dst 203.0.113.1 self permanent
    ...

其他资源

  • nm-settings(5)

9.4. 使用现有网桥在 libvirt 中创建虚拟网络

要启用虚拟机(VM)将 br0 网桥与附加的虚拟可扩展 LAN(VXLAN)一起使用,首先向使用该网桥的 libvirtd 服务添加虚拟网络。

先决条件

  • 已安装 libvirt 软件包。
  • 您启动并启用 libvirtd 服务。
  • 已使用 RHEL 上的 VXLAN 配置了 br0 设备。

步骤

  1. 使用以下内容创建 ~/vxlan10-bridge.xml 文件:

    <network>
     <name>vxlan10-bridge</name>
     <forward mode="bridge" />
     <bridge name="br0" />
    </network>
  2. 使用 ~/vxlan10-bridge.xml 文件在 libvirt 中创建一个新虚拟网络:

    # virsh net-define ~/vxlan10-bridge.xml
  3. 删除 ~/vxlan10-bridge.xml 文件:

    # rm ~/vxlan10-bridge.xml
  4. 启动 vxlan10-bridge 虚拟网络:

    # virsh net-start vxlan10-bridge
  5. vxlan10-bridge 虚拟网络配置为在 libvirtd 服务启动时自动启动:

    # virsh net-autostart vxlan10-bridge

验证

  • 显示虚拟网络列表:

    # virsh net-list
     Name              State    Autostart   Persistent
    ----------------------------------------------------
     vxlan10-bridge    active   yes         yes
     ...

其他资源

  • virsh(1) man page

9.5. 将虚拟机配置为使用 VXLAN

要将虚拟机配置为使用主机上附加的虚拟可扩展 LAN(VXLAN)的桥接设备,请创建一个使用 vxlan10-bridge 虚拟网络的新虚拟机,或更新现有虚拟机的设置以使用此网络。

在 RHEL 主机上执行这个步骤。

先决条件

  • 您已在 libvirtd 中配置了 vxlan10-bridge 虚拟网络。

步骤

  • 要创建新虚拟机,并将其配置为使用 vxlan10-bridge 网络,在创建虚拟机时将 --network network:vxlan10-bridge 选项传递给 virt-install 命令:

    # virt-install ... --network network:vxlan10-bridge
  • 更改现有虚拟机的网络设置:

    1. 将虚拟机的网络接口连接到 vxlan10-bridge 虚拟网络:

      # virt-xml VM_name --edit --network network=vxlan10-bridge
    2. 关闭虚拟机,然后再次启动它:

      # virsh shutdown VM_name
      # virsh start VM_name

验证

  1. 显示主机上虚拟机的虚拟网络接口:

    # virsh domiflist VM_name
     Interface   Type     Source           Model    MAC
    -------------------------------------------------------------------
     vnet1       bridge   vxlan10-bridge   virtio   52:54:00:c5:98:1c
  2. 显示连接到 vxlan10-bridge 网桥的接口:

    # ip link show master vxlan10-bridge
    18: vxlan10: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master br0 state UNKNOWN mode DEFAULT group default qlen 1000
        link/ether 2a:53:bd:d5:b3:0a brd ff:ff:ff:ff:ff:ff
    19: vnet1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master br0 state UNKNOWN mode DEFAULT group default qlen 1000
        link/ether 52:54:00:c5:98:1c brd ff:ff:ff:ff:ff:ff

    请注意,libvirtd 服务会动态更新网桥的配置。当您启动使用 vxlan10-bridge 网络的虚拟机时,主机上的对应的 vnet* 设备将显示为网桥的端口。

  3. 使用地址解析协议(ARP)请求来验证虚拟机是否位于同一 VXLAN 中:

    1. 在同一 VXLAN 中启动两个或多个虚拟机。
    2. 从一个虚拟机发送 ARP 请求到另一个虚拟机:

      # arping -c 1 192.0.2.2
      ARPING 192.0.2.2 from 192.0.2.1 enp1s0
      Unicast reply from 192.0.2.2 [52:54:00:c5:98:1c] 1.450ms
      Sent 1 probe(s) (0 broadcast(s))
      Received 1 response(s) (0 request(s), 0 broadcast(s))

      如果命令显示回复,虚拟机位于相同的第 2 层域中,在这种情况下,在同一 VXLAN 中。

      安装 iputils 软件包以使用 arping 工具。

其他资源

  • virt-install(1) man page
  • virt-xml(1) man page
  • virsh(1) man page
  • arping(8) man page

第 10 章 配置网络桥接

网络桥接是一个链路层设备,它可根据 MAC 地址列表转发网络间的流量。网桥通过侦听网络流量并了解连接到每个网络的主机来构建 MAC 地址表。例如,您可以使用 Red Hat Enterprise Linux 主机上的软件桥接模拟硬件桥接或在虚拟化环境中,将虚拟机(VM)集成到与主机相同的网络中。

桥接需要在桥接应该连接的每个网络中有一个网络设备。当您配置网桥时,网桥被称为 controller,其使用的设备为 ports

您可以在不同类型的设备中创建桥接,例如:

  • 物理和虚拟以太网设备
  • 网络绑定
  • 网络团队(team)
  • VLAN 设备

由于 IEEE 802.11 标准指定在 Wi-Fi 中使用 3 个地址帧以便有效地使用随机时间,您无法通过 Ad-Hoc 或者 Infrastructure 模式中的 Wi-Fi 网络配置网桥。

10.1. 使用 nmcli 命令配置网络桥接

本节介绍如何使用 nmcli 实用程序配置网络桥接。

先决条件

步骤

  1. 创建网桥接口:

    # nmcli connection add type bridge con-name bridge0 ifname bridge0

    这个命令会创建一个名为 bridge0 的网桥,输入:

  2. 显示网络接口,并记录您要添加到网桥中的接口名称:

    # nmcli device status
    DEVICE  TYPE      STATE         CONNECTION
    enp7s0  ethernet  disconnected  --
    enp8s0  ethernet  disconnected  --
    bond0   bond      connected     bond0
    bond1   bond      connected     bond1
    ...

    在本例中:

    • enp7s0enp8s0 未配置。要将这些设备用作端口,请在下一步中添加连接配置集。
    • bond0bond1 已有连接配置集。要将这些设备用作端口,请在下一步中修改其配置集。
  3. 将接口分配给网桥。

    1. 如果没有配置您要分配给网桥的接口,为其创建新的连接配置集:

      # nmcli connection add type ethernet slave-type bridge con-name bridge0-port1 ifname enp7s0 master bridge0
      # nmcli connection add type ethernet slave-type bridge con-name bridge0-port2 ifname enp8s0 master bridge0

      这些命令为 enp7s0enp8s0 创建配置集,并将它们添加到 bridge0 连接。

    2. 如果要为网桥分配现有连接配置集,将这些连接的 master 参数设置为 bridge0

      # nmcli connection modify bond0 master bridge0
      # nmcli connection modify bond1 master bridge0

      这些命令将名为 bond0bond1 的现有连接配置集分配给 bridge0 连接。

  4. 配置网桥的 IP 设置。如果要使用这个网桥作为其它设备的端口,请跳过这一步。

    1. 配置 IPv4 设置。例如:要设置 bridge0 连接的静态 IPv4 地址、网络掩码、默认网关、DNS 服务器和DNS 搜索域,请输入:

      # nmcli connection modify bridge0 ipv4.addresses '192.0.2.1/24'
      # nmcli connection modify bridge0 ipv4.gateway '192.0.2.254'
      # nmcli connection modify bridge0 ipv4.dns '192.0.2.253'
      # nmcli connection modify bridge0 ipv4.dns-search 'example.com'
      # nmcli connection modify bridge0 ipv4.method manual
    2. 配置 IPv6 设置。例如:要设置 bridge0 连接的静态 IPv6 地址、网络掩码、默认网关、DNS 服务器和 DNS 搜索域,请输入:

      # nmcli connection modify bridge0 ipv6.addresses '2001:db8:1::1/64'
      # nmcli connection modify bridge0 ipv6.gateway '2001:db8:1::fffe'
      # nmcli connection modify bridge0 ipv6.dns '2001:db8:1::fffd'
      # nmcli connection modify bridge0 ipv6.dns-search 'example.com'
      # nmcli connection modify bridge0 ipv6.method manual
  5. 可选:配置网桥的其他属性。例如,要将 bridge0 的生成树协议(STP)优先级设置为 16384,请输入:

    # nmcli connection modify bridge0 bridge.priority '16384'

    默认情况下启用 STP。

  6. 激活连接:

    # nmcli connection up bridge0
  7. 验证端口已连接,CONNECTION 列显示端口的连接名称:

    # nmcli device
    DEVICE   TYPE      STATE      CONNECTION
    ...
    enp7s0   ethernet  connected  bridge0-port1
    enp8s0   ethernet  connected  bridge0-port2

    当您激活连接的任何端口时,NetworkManager 也激活网桥,但不会激活它的端口。您可以在启用桥接时配置 Red Hat Enterprise Linux 时自动启用所有端口:

    1. 启用网桥连接的 connection.autoconnect-slaves 参数:

      # nmcli connection modify bridge0 connection.autoconnect-slaves 1
    2. 重新激活桥接:

      # nmcli connection up bridge0

验证步骤

  • 使用 ip 实用程序显示作为特定网桥端口的以太网设备的链接状态:

    # ip link show master bridge0
    3: enp7s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel master bridge0 state UP mode DEFAULT group default qlen 1000
        link/ether 52:54:00:62:61:0e brd ff:ff:ff:ff:ff:ff
    4: enp8s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel master bridge0 state UP mode DEFAULT group default qlen 1000
        link/ether 52:54:00:9e:f1:ce brd ff:ff:ff:ff:ff:ff
  • 使用 bridge 工具显示作为任意网桥设备端口的以太网设备状态:

    # bridge link show
    3: enp7s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 master bridge0 state forwarding priority 32 cost 100
    4: enp8s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 master bridge0 state listening priority 32 cost 100
    5: enp9s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 master bridge1 state forwarding priority 32 cost 100
    6: enp11s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 master bridge1 state blocking priority 32 cost 100
    ...

    要显示特定以太网设备的状态,请使用 bridge link show dev ethernet_device_name 命令。

其他资源

10.2. 使用 RHEL web 控制台配置网络桥接

本节介绍如何使用 RHEL web 控制台配置网络桥接。

先决条件

步骤

  1. 在屏幕左侧的导航中选择 Networking 选项卡。
  2. Interfaces 部分点 Add bridge
  3. 输入您要创建的网桥设备名称。
  4. 选择应该是网桥端口的接口。
  5. 可选:启用 Spanning tree 协议(STP) 功能,以避免桥接循环和广播。

    网桥设置
  6. 应用
  7. 默认情况下,网桥使用动态 IP 地址。如果要设置静态 IP 地址:

    1. Interfaces 部分,点网桥的名称。
    2. 点您要配置的协议旁的 Edit
    3. 选择 地址 旁边的 "手动 ",并输入 IP 地址、前缀和默认网关。
    4. DNS 部分,点 + 按钮,并输入 DNS 服务器的 IP 地址。重复此步骤来设置多个 DNS 服务器。
    5. DNS 搜索域 部分中,点 + 按钮并输入搜索域。
    6. 如果接口需要静态路由,请在 Routes 部分配置它们。

      bond team bridge vlan.ipv4
    7. 应用

验证

  1. 在屏幕左侧的导航中选择 Networking 选项卡,并检查接口上是否有传入和传出流量:

    网桥验证

10.3. 使用 nm-connection-editor 配置网络桥接

本节介绍如何使用 nm-connection-editor 应用程序配置网络桥接。

请注意,nm-connection-editor 只能向网桥添加新端口。要使用现有连接配置集作为端口,请使用 nmcli 实用程序创建网桥,如使用 nmcli 命令配置网络桥接 所述。

先决条件

  • 在服务器中安装两个或者两个以上物理或者虚拟网络设备。
  • 要将以太网设备用作网桥的端口,必须在服务器中安装物理或者虚拟以太网设备。
  • 要使用 team、bond 或 VLAN 设备作为网桥的端口,请确保这些设备还没有配置。

步骤

  1. 打开终端并输入 nm-connection-editor

    $ nm-connection-editor
  2. + 按钮添加新连接。
  3. 选择 Bridge 连接类型,然后点 Create
  4. Bridge 选项卡中:

    1. 可选:在 Interface name 字段中设置桥接接口的名称。
    2. Add 按钮为网络接口创建新连接配置集,并将配置集作为端口添加到网桥。

      1. 选择接口的连接类型。例如,为有线连接选择 Ethernet
      2. 另外,还可为端口设备设置连接名称。
      3. 如果您是为以太网设备创建连接配置集,打开 Ethernet 选项卡,在 Device 字段中选择您要添加为网桥的端口。如果您选择了不同的设备类型,请相应地进行配置。
      4. Save
    3. 对您要添加到桥接的每个接口重复前面的步骤。

      add nic to bridge in nm connection editor

  5. 可选:配置其他网桥设置,如生成树协议(STP)选项。
  6. 配置网桥的 IP 设置。如果要使用这个网桥作为其它设备的端口,请跳过这一步。

    1. IPv4 Settings 选项卡中,配置 IPv4 设置。例如,设置静态 IPv4 地址、网络掩码、默认网关、DNS 服务器和 DNS 搜索域:

      bridge IPv4 settings nm connection editor

    2. IPv6 Settings 选项卡中,配置 IPv6 设置。例如,设置静态 IPv6 地址、网络掩码、默认网关、DNS 服务器和 DNS 搜索域:

      bridge IPv6 settings nm connection editor

  7. 保存网桥连接。
  8. 关闭 nm-connection-editor

验证步骤

  • 使用 ip 实用程序显示作为特定网桥端口的以太网设备的链接状态。

    # ip link show master bridge0
    3: enp7s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel master bridge0 state UP mode DEFAULT group default qlen 1000
        link/ether 52:54:00:62:61:0e brd ff:ff:ff:ff:ff:ff
    4: enp8s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel master bridge0 state UP mode DEFAULT group default qlen 1000
        link/ether 52:54:00:9e:f1:ce brd ff:ff:ff:ff:ff:ff
  • 使用 bridge 工具显示作为任意网桥设备端口的以太网设备状态:

    # bridge link show
    3: enp7s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 master bridge0 state forwarding priority 32 cost 100
    4: enp8s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 master bridge0 state listening priority 32 cost 100
    5: enp9s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 master bridge1 state forwarding priority 32 cost 100
    6: enp11s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 master bridge1 state blocking priority 32 cost 100
    ...

    要显示特定以太网设备的状态,请使用 bridge link show dev ethernet_device_name 命令。

10.4. 使用 nmstatectl 配置网络桥接

这部分论述了如何使用 nmstatectl 工具配置带有以下设置的 Linux 网桥 bridge0

  • 网桥中的网络接口: enp1s0enp7s0
  • Spanning Tree Protocol (STP): 启用
  • 静态 IPv4 地址: 192.0.2.1,子网掩码为 /24
  • 静态 IPv6 地址: 2001:db8:1::1,子网掩码为 /64
  • IPv4 默认网关: 192.0.2.254
  • IPv6 默认网关: 2001:db8:1::fffe
  • IPv4 DNS server: 192.0.2.200
  • IPv6 DNS server: 2001:db8:1::ffbb
  • DNS 搜索域: example.com

先决条件

  • 在服务器中安装两个或者两个以上物理或者虚拟网络设备。
  • 要将以太网设备用作网桥中的端口,必须在服务器中安装物理或者虚拟以太网设备。
  • 要使用 team、bond 或 VLAN 设备作为网桥中的端口,在 port 列表中设置接口名称,并定义对应的接口。
  • 已安装 nmstate 软件包。

步骤

  1. 创建包含以下内容的 YAML 文件,如 ~/create-bridge.yml

    ---
    interfaces:
    - name: bridge0
      type: linux-bridge
      state: up
      ipv4:
        enabled: true
        address:
        - ip: 192.0.2.1
          prefix-length: 24
        dhcp: false
      ipv6:
        enabled: true
        address:
        - ip: 2001:db8:1::1
          prefix-length: 64
        autoconf: false
        dhcp: false
      bridge:
        options:
          stp:
            enabled: true
        port:
          - name: enp1s0
          - name: enp7s0
    - name: enp1s0
      type: ethernet
      state: up
    - name: enp7s0
      type: ethernet
      state: up
    
    routes:
      config:
      - destination: 0.0.0.0/0
        next-hop-address: 192.0.2.254
        next-hop-interface: bridge0
      - destination: ::/0
        next-hop-address: 2001:db8:1::fffe
        next-hop-interface: bridge0
    dns-resolver:
      config:
        search:
        - example.com
        server:
        - 192.0.2.200
        - 2001:db8:1::ffbb
  2. 将设置应用到系统:

    # nmstatectl apply ~/create-bridge.yml

验证步骤

  1. 显示设备和连接的状态:

    # nmcli device status
    DEVICE      TYPE      STATE      CONNECTION
    bridge0     bridge    connected  bridge0
  2. 显示连接配置集的所有设置:

    # nmcli connection show bridge0
    connection.id:              bridge0
    connection.uuid:            e2cc9206-75a2-4622-89cf-1252926060a9
    connection.stable-id:       --
    connection.type:            bridge
    connection.interface-name:  bridge0
    ...
  3. 以 YAML 格式显示连接设置:

    # nmstatectl show bridge0

其他资源

第 11 章 配置网络团队(team)

这部分论述了网络团队的基础知识、绑定和团队之间的不同以及如何在 Red Hat Enterprise Linux 中配置网络团队。

重要

网络 teaming 在 Red Hat Enterprise Linux 9 中已弃用。考虑使用网络绑定驱动程序作为替代方案。详情请参阅 配置网络绑定

您可以在不同类型的设备中创建网络团队,例如:

  • 物理和虚拟以太网设备
  • 网络绑定
  • 网络桥接
  • VLAN 设备

11.1. 将网络团队配置迁移到网络绑定

网络 teaming 在 Red Hat Enterprise Linux 9 中已弃用。如果您已经配置了正常工作的网络团队,例如,因为从以前的 RHEL 版本升级,您可以将配置迁移到由 NetworkManager 管理的网络绑定。

重要

team2bond 程序可以将网络团队配置转换为绑定。之后,您必须手动配置绑定的进一步设置,如 IP 地址和 DNS 配置。

先决条件

  • team-team0 NetworkManager 连接配置集被配置并管理 team0 设备。
  • 已安装 teamd 软件包。

步骤

  1. 可选:显示 team-team0 NetworkManager 连接的 IP 配置:

    # nmcli connection show team-team0 | egrep "^ip"
    ...
    ipv4.method:                            manual
    ipv4.dns:                               192.0.2.253
    ipv4.dns-search:                        example.com
    ipv4.addresses:                         192.0.2.1/24
    ipv4.gateway:                           192.0.2.254
    ...
    ipv6.method:                            manual
    ipv6.dns:                               2001:db8:1::fffd
    ipv6.dns-search:                        example.com
    ipv6.addresses:                         2001:db8:1::1/64
    ipv6.gateway:                           2001:db8:1::fffe
    ...
  2. team0 设备的配置导出到 JSON 文件中:

    # teamdctl team0 config dump actual > /tmp/team0.json
  3. 删除网络组。例如,如果您在 NetworkManager 中配置了团队,请删除 team-team0 连接配置集以及相关端口的配置集:

    # nmcli connection delete team-team0
    # nmcli connection delete team-team0-port1
    # nmcli connection delete team-team0-port2
  4. 以空运行模式运行 team2bond 程序,显示 nmcli 命令,该命令使用类似设置的网络绑定设置为团队设备:

    # team2bond --config=/tmp/team0.json --rename=bond0
    nmcli con add type bond ifname bond0 bond.options "mode=active-backup,num_grat_arp=1,num_unsol_na=1,resend_igmp=1,miimon=100,miimon=100"
    nmcli con add type ethernet ifname enp7s0 master bond0
    nmcli con add type ethernet ifname enp8s0 master bond0

    第一个命令包含两个 miimon 选项,因为团队配置文件包含两个 link_watch 条目。请注意,这不会影响创建绑定。

    如果您将服务绑定到团队的设备名称并希望避免更新或破坏这些服务,请省略 --rename=bond0 选项。在这种情况下,team2bond 为绑定使用与团队相同的接口名称。

  5. 验证推荐 team2bond 工具的绑定选项是否正确。
  6. 创建绑定。您可以执行建议的 nmcli 命令,或使用 --exec-cmd 选项重新运行 team2bond 命令:

    # team2bond --config=/tmp/team0.json --rename=bond0 --exec-cmd
    Connection 'bond-bond0' (0241a531-0c72-4202-80df-73eadfc126b5) successfully added.
    Connection 'bond-slave-enp7s0' (38489729-b624-4606-a784-1ccf01e2f6d6) successfully added.
    Connection 'bond-slave-enp8s0' (de97ec06-7daa-4298-9a71-9d4c7909daa1) successfully added.

    下一步需要绑定连接配置集的名称(bond-bond0)。

  7. 将之前在 team-team0 中配置的 IPv4 设置设置为 bond-bond0 连接:

    # nmcli connection modify bond-bond0 ipv4.addresses '192.0.2.1/24'
    # nmcli connection modify bond-bond0 ipv4.gateway '192.0.2.254'
    # nmcli connection modify bond-bond0 ipv4.dns '192.0.2.253'
    # nmcli connection modify bond-bond0 ipv4.dns-search 'example.com'
    # nmcli connection modify bond-bond0 ipv4.method manual
  8. 将之前在 team-team0 中配置的 IPv6 设置设置为 bond-bond0 连接:

    # nmcli connection modify bond-bond0 ipv6.addresses '2001:db8:1::1/64'
    # nmcli connection modify bond-bond0 ipv6.gateway '2001:db8:1::fffe'
    # nmcli connection modify bond-bond0 ipv6.dns '2001:db8:1::fffd'
    # nmcli connection modify bond-bond0 ipv6.dns-search 'example.com'
    # nmcli connection modify bond-bond0 ipv6.method manual
  9. 激活连接:

    # nmcli connection up bond-bond0

验证

  1. 显示 bond-bond0 NetworkManager 连接的 IP 配置:

    # nmcli connection show bond-bond0 | egrep "^ip"
    ...
    ipv4.method:                            manual
    ipv4.dns:                               192.0.2.253
    ipv4.dns-search:                        example.com
    ipv4.addresses:                         192.0.2.1/24
    ipv4.gateway:                           192.0.2.254
    ...
    ipv6.method:                            manual
    ipv6.dns:                               2001:db8:1::fffd
    ipv6.dns-search:                        example.com
    ipv6.addresses:                         2001:db8:1::1/64
    ipv6.gateway:                           2001:db8:1::fffe
    ...
  2. 显示绑定状态:

    # cat /proc/net/bonding/bond0
    Ethernet Channel Bonding Driver: v5.13.0-0.rc7.51.el9.x86_64
    
    Bonding Mode: fault-tolerance (active-backup)
    Primary Slave: None
    Currently Active Slave: enp7s0
    MII Status: up
    MII Polling Interval (ms): 100
    Up Delay (ms): 0
    Down Delay (ms): 0
    Peer Notification Delay (ms): 0
    
    Slave Interface: enp7s0
    MII Status: up
    Speed: Unknown
    Duplex: Unknown
    Link Failure Count: 0
    Permanent HW addr: 52:54:00:bf:b1:a9
    Slave queue ID: 0
    
    Slave Interface: enp8s0
    MII Status: up
    Speed: Unknown
    Duplex: Unknown
    Link Failure Count: 0
    Permanent HW addr: 52:54:00:04:36:0f
    Slave queue ID: 0

    在这个示例中,两个端口都是上线的。

  3. 验证绑定故障切换是否正常工作:

    1. 从主机中临时删除网络电缆。请注意,无法使用命令行正确测试链路失败事件。
    2. 显示绑定状态:

      # cat /proc/net/bonding/bond0

11.2. 了解网络团队

网络团队(network teaming)是一个合并或聚合网络接口的功能,它提供了一个高吞吐量或冗余的逻辑接口。

网络团队使用内核驱动程序来实现对数据包流、用户空间库以及用于其他任务的服务的快速处理。因此,网络团队是一个易扩展的解决方案,来满足负载平衡和冗余的要求。

重要

某些网络团队的功能,比如故障切换机制,不支持不通过网络交换机的直接电缆连接。详情请查看是否支持直接连接的绑定?

11.3. 了解控制器和端口接口的默认行为

使用 NetworkManager 服务管理团队或绑定端口接口时,请考虑以下默认行为:

  • 启动控制器接口不会自动启动端口接口。
  • 启动端口接口总会启动控制器接口。
  • 停止控制器接口也会停止端口接口。
  • 没有端口的控制器可以启动静态 IP 连接。
  • 没有端口的控制器在启动 DHCP 连接时会等待端口。
  • 当您添加具有载体的端口时,等待端口且具有 DHCP 连接的控制器会完成。
  • 当您添加不具有载体的端口时,等待端口且具有 DHCP 连接的控制器将继续等待。

11.5. 安装 teamd 服务

要在 NetworkManager 中配置网络团队,您需要 NetworkManagerteamd 服务和 team 插件。默认情况下,它们都会在 Red Hat Enterprise Linux 上安装。这部分论述了如何在删除所需软件包时安装它们。

先决条件

  • 为主机分配了活跃的红帽订阅。

步骤

  • 安装 teamdNetworkManager-team 软件包:

    # dnf install teamd NetworkManager-team

11.6. 使用 nmcli 命令配置网络团队

这部分论述了如何使用 nmcli 工具配置网络团队。

重要

网络 teaming 在 Red Hat Enterprise Linux 9 中已弃用。考虑使用网络绑定驱动程序作为替代方案。详情请参阅 配置网络绑定

先决条件

流程

  1. 创建团队接口:

    # nmcli connection add type team con-name team0 ifname team0 team.runner activebackup

    此命令创建名为 team0 的网络组,它使用 activebackup 运行程序。

  2. 另外,还可设置链接监视器。例如,要在 team0 连接配置集中设置 ethtool 链接监视器:

    # nmcli connection modify team0 team.link-watchers "name=ethtool"

    链路监视器支持不同的参数。要为链路监视器设置参数,请在 name 属性中指定它们,以空格分隔。请注意,name 属性必须用引号包围起来。例如,要使用 ethtool 链接监视器,并将其 delay-up 参数设置为 2500 毫秒(2.5 秒):

    # nmcli connection modify team0 team.link-watchers "name=ethtool delay-up=2500"

    要设置多个链路监视器,每个都使用特定的参数,不同的连接监视器以逗号分隔。以下示例使用 delay-up 参数设置 ethtool 链接监视器,使用 source-hosttarget-host 参数设置 arp_ping 链路监视器:

    # nmcli connection modify team0 team.link-watchers "name=ethtool delay-up=2, name=arp_ping source-host=192.0.2.1 target-host=192.0.2.2"
  3. 显示网络接口,并记录您要添加到团队中的接口名称:

    # nmcli device status
    DEVICE  TYPE      STATE         CONNECTION
    enp7s0  ethernet  disconnected  --
    enp8s0  ethernet  disconnected  --
    bond0   bond      connected  bond0
    bond1   bond      connected  bond1
    ...

    在本例中:

    • enp7s0enp8s0 未配置。要将这些设备用作端口,请在下一步中添加连接配置集。请注意,您只能在没有分配给任何连接的团队中使用以太网接口。
    • bond0bond1 已有连接配置集。要将这些设备用作端口,请在下一步中修改其配置集。
  4. 为团队分配端口接口:

    1. 如果没有配置您要分配给团队的接口,为其创建新的连接配置集:

      # nmcli connection add type ethernet slave-type team con-name team0-port1 ifname enp7s0 master team0
      # nmcli connection add type ethernet slave-type team con-name team0-port2 ifname enp8s0 master team0

      .这些命令为 enp7s0enp8s0 创建配置文件,并将它们添加到 team0 连接。

    2. 要为团队分配现有连接配置集,将这些连接的 master 参数设置为 team0

      # nmcli connection modify bond0 master team0
      # nmcli connection modify bond1 master team0

      这些命令将名为 bond0bond1 的现有连接配置集分配给 team0 连接。

  5. 配置团队的 IP 设置。如果要使用这个团队作为其它设备的端口,请跳过这一步。

    1. 配置 IPv4 设置。例如:要设置 team0 连接的静态 IPv4 地址、网络掩码、默认网关、DNS 服务器和 DNS 搜索域,请输入:

      # nmcli connection modify team0 ipv4.addresses '192.0.2.1/24'
      # nmcli connection modify team0 ipv4.gateway '192.0.2.254'
      # nmcli connection modify team0 ipv4.dns '192.0.2.253'
      # nmcli connection modify team0 ipv4.dns-search 'example.com'
      # nmcli connection modify team0 ipv4.method manual
    2. 配置 IPv6 设置。例如:要设置 team0 连接的静态 IPv6 地址、网络掩码、默认网关、DNS 服务器和 DNS 搜索域,请输入:

      # nmcli connection modify team0 ipv6.addresses '2001:db8:1::1/64'
      # nmcli connection modify team0 ipv6.gateway '2001:db8:1::fffe'
      # nmcli connection modify team0 ipv6.dns '2001:db8:1::fffd'
      # nmcli connection modify team0 ipv6.dns-search 'example.com'
      # nmcli connection modify team0 ipv6.method manual
  6. 激活连接:

    # nmcli connection up team0

验证步骤

  • 显示团队状态:

    # teamdctl team0 state
    setup:
      runner: activebackup
    ports:
      enp7s0
        link watches:
          link summary: up
          instance[link_watch_0]:
            name: ethtool
            link: up
            down count: 0
      enp8s0
        link watches:
          link summary: up
          instance[link_watch_0]:
            name: ethtool
            link: up
            down count: 0
    runner:
      active port: enp7s0

    在这个示例中,两个端口都是上线的。

其他资源

11.7. 使用 RHEL web 控制台配置网络团队

本节论述了如何使用 RHEL web 控制台配置网络团队。

重要

网络 teaming 在 Red Hat Enterprise Linux 9 中已弃用。考虑使用网络绑定驱动程序作为替代方案。详情请参阅 配置网络绑定

先决条件

步骤

  1. 在屏幕左侧的导航中选择 Networking 选项卡。
  2. Interfaces 部分点 Add team
  3. 输入您要创建的团队设备名称。
  4. 选择应该是团队端口的接口。
  5. 选择团队的运行程序。

    如果您选择 Load balancing802.3ad LACP,Web 控制台会显示额外的字段。

  6. 设置链接监视器:

    • 如果您选择 Ethtool,请设置链接并关闭延迟。
    • 如果您设置了 ARP pingNSNA ping,还要设置 ping 间隔并 ping 目标。
    团队设置
  7. 应用
  8. 默认情况下,团队使用动态 IP 地址。如果要设置静态 IP 地址:

    1. Interfaces 部分点团队的名称。
    2. 点您要配置的协议旁的 Edit
    3. 选择 地址 旁边的 "手动 ",并输入 IP 地址、前缀和默认网关。
    4. DNS 部分,点 + 按钮,并输入 DNS 服务器的 IP 地址。重复此步骤来设置多个 DNS 服务器。
    5. DNS 搜索域 部分中,点 + 按钮并输入搜索域。
    6. 如果接口需要静态路由,请在 Routes 部分配置它们。

      bond team bridge vlan.ipv4
    7. 应用

验证

  1. 在屏幕左侧的导航中选择 Networking 选项卡,并检查接口上是否有传入和传出流量。

    团队验证
  2. 显示团队状态:

    # teamdctl team0 state
    setup:
      runner: activebackup
    ports:
      enp7s0
        link watches:
          link summary: up
          instance[link_watch_0]:
            name: ethtool
            link: up
            down count: 0
      enp8s0
        link watches:
          link summary: up
          instance[link_watch_0]:
            name: ethtool
            link: up
            down count: 0
    runner:
      active port: enp7s0

    在这个示例中,两个端口都是上线的。

11.8. 使用 nm-connection-editor 配置网络团队

本节论述了如何使用 nm-connection-editor 应用程序配置网络团队。

请注意: nm-connection-editor 只能向团队添加新端口。要使用现有连接配置集作为端口,请使用 nmcli 实用程序创建团队,如使用 nmcli 命令配置网络团队 所述。

重要

网络 teaming 在 Red Hat Enterprise Linux 9 中已弃用。考虑使用网络绑定驱动程序作为替代方案。详情请参阅 配置网络绑定

先决条件

  • 在服务器中安装两个或者两个以上物理或者虚拟网络设备。
  • 要将以太网设备用作组的端口,必须在服务器中安装物理或者虚拟以太网设备。
  • 要使用 team、bond 或 VLAN 设备作为团队的端口,请确保这些设备还没有配置。

步骤

  1. 打开终端并输入 nm-connection-editor

    $ nm-connection-editor
  2. + 按钮添加新连接。
  3. 选择 Team 连接类型,然后单击 Create
  4. 团队 选项卡中:

    1. 可选:在 接口名称 字段中设置组接口的名称。
    2. Add 按钮为网络接口添加新连接配置集,并将配置集作为端口添加到团队。

      1. 选择接口的连接类型。例如,为有线连接选择 Ethernet
      2. 可选:为端口设置连接名称。
      3. 如果您是为以太网设备创建连接配置集,打开 Ethernet 选项卡,然后在 Device 字段中选择您要添加为团队的端口。如果您选择了不同的设备类型,请相应地进行配置。请注意,您只能在没有分配给任何连接的团队中使用以太网接口。
      4. Save
    3. 对您要添加到团队的每个接口重复前面的步骤。

      add nic to team in nm connection editor

    4. Advanced 按钮将高级选项设置为团队连接。

      1. Runner 选项卡中,选择 runner。
      2. Link Watcher 选项卡中,设置 link watcher 及其可选设置。
      3. 确定
  5. 配置团队的 IP 设置。如果要使用这个团队作为其它设备的端口,请跳过这一步。

    1. IPv4 Settings 选项卡中,配置 IPv4 设置。例如,设置静态 IPv4 地址、网络掩码、默认网关、DNS 服务器和 DNS 搜索域: team IPv4 settings nm connection editor
    2. IPv6 Settings 选项卡中,配置 IPv6 设置。例如,设置静态 IPv6 地址、网络掩码、默认网关、DNS 服务器和 DNS 搜索域: team IPv6 settings nm connection editor
  6. 保存团队连接。
  7. 关闭 nm-connection-editor

验证步骤

  • 显示团队状态:

    # teamdctl team0 state
    setup:
      runner: activebackup
    ports:
      enp7s0
        link watches:
          link summary: up
          instance[link_watch_0]:
            name: ethtool
            link: up
            down count: 0
      enp8s0
        link watches:
          link summary: up
          instance[link_watch_0]:
            name: ethtool
            link: up
            down count: 0
    runner:
      active port: enp7s0

第 12 章 配置网络绑定

这部分论述了网络绑定的基础知识、绑定和团队之间的不同,以及如何在 Red Hat Enterprise Linux 中配置网络绑定。

您可以在不同类型的设备中创建绑定,例如:

  • 物理和虚拟以太网设备
  • 网络桥接
  • 网络团队(team)
  • VLAN 设备

12.1. 了解网络绑定

网络绑定(network bonding)是组合或者整合网络接口的方法,以便提供一个高吞吐量或冗余的逻辑接口。

active-backupbalance-tlbbalance-alb 模式不需要任何网络交换机的具体配置。然而,其他绑定模式需要配置交换机来聚合链接。例如,Cisco 交换机需要 EtherChannel 来实现模式 0、2 和 3,但对于模式 4,需要链接聚合控制协议(LACP)和 EtherChannel

详情请查看您的交换机和 Linux 以太网捆绑驱动程序 HOWTO 文档

重要

某些网络绑定的功能,比如故障切换机制,不支持不通过网络交换机的直接电缆连接。详情请查看是否支持直接连接的绑定?KCS 解决方案。

12.2. 了解控制器和端口接口的默认行为

使用 NetworkManager 服务管理团队或绑定端口接口时,请考虑以下默认行为:

  • 启动控制器接口不会自动启动端口接口。
  • 启动端口接口总会启动控制器接口。
  • 停止控制器接口也会停止端口接口。
  • 没有端口的控制器可以启动静态 IP 连接。
  • 没有端口的控制器在启动 DHCP 连接时会等待端口。
  • 当您添加具有载体的端口时,等待端口且具有 DHCP 连接的控制器会完成。
  • 当您添加不具有载体的端口时,等待端口且具有 DHCP 连接的控制器将继续等待。

12.3. 上游交换配置取决于绑定模式

下表描述了根据绑定模式,您必须对上游交换机应用哪些设置:

绑定模式交换机上的配置

0 - balance-rr

需要启用静态的 Etherchannel(未启用 LACP 协商)

1 - active-backup

需要可自主端口

2 - balance-xor

需要启用静态的 Etherchannel(未启用 LACP 协商)

3 - broadcast

需要启用静态的 Etherchannel(未启用 LACP 协商)

4 - 802.3ad

需要启用 LACP 协商的 Etherchannel

5 - balance-tlb

需要可自主端口

6 - balance-alb

需要可自主端口

有关在交换机中配置这些设置,请查看交换机文档。

12.4. 使用 nmcli 命令配置网络绑定

这部分论述了如何使用 nmcli 命令配置网络绑定。

先决条件

步骤

  1. 创建绑定接口:

    # nmcli connection add type bond con-name bond0 ifname bond0 bond.options "mode=active-backup"

    这个命令会创建一个名为 bond0 的绑定,它使用 active-backup 模式。

    要额外设置介质独立接口(MII)监控间隔,请在 bond.options 属性中添加 miimon=interval 选项。例如,要使用同样的命令,但还需要将 MII 监控间隔设置为 1000 毫秒(1 秒),请输入:

    # nmcli connection add type bond con-name bond0 ifname bond0 bond.options "mode=active-backup,miimon=1000"
  2. 显示网络接口以及您要添加到绑定中的接口名称:

    # nmcli device status
    DEVICE   TYPE      STATE         CONNECTION
    enp7s0   ethernet  disconnected  --
    enp8s0   ethernet  disconnected  --
    bridge0  bridge    connected     bridge0
    bridge1  bridge    connected     bridge1
    ...

    在本例中:

    • enp7s0enp8s0 未配置。要将这些设备用作端口,请在下一步中添加连接配置集。
    • bridge0bridge1 现有的连接配置集。要将这些设备用作端口,请在下一步中修改其配置集。
  3. 为绑定分配接口:

    1. 如果没有配置您要分配给绑定的接口,为其创建新的连接配置集:

      # nmcli connection add type ethernet slave-type bond con-name bond0-port1 ifname enp7s0 master bond0
      # nmcli connection add type ethernet slave-type bond con-name bond0-port2 ifname enp8s0 master bond0

      这些命令为 enp7s0enp8s0 创建配置集,并将它们添加到 bond0 连接。

    2. 要为绑定分配现有连接配置集,将这些连接的 master 参数设置为 bond0

      # nmcli connection modify bridge0 master bond0
      # nmcli connection modify bridge1 master bond0

      这些命令将名为 bridge0bridge1 的现有连接配置集分配给 bond0 连接。

  4. 配置绑定的 IP 设置。如果要使用这个绑定作为其它设备的端口,请跳过这一步。

    1. 配置 IPv4 设置。例如,要为 bond0 连接设置静态 IPv4 地址、网络掩码、默认网关、DNS 服务器和 DNS 搜索域设置,请输入:

      # nmcli connection modify bond0 ipv4.addresses '192.0.2.1/24'
      # nmcli connection modify bond0 ipv4.gateway '192.0.2.254'
      # nmcli connection modify bond0 ipv4.dns '192.0.2.253'
      # nmcli connection modify bond0 ipv4.dns-search 'example.com'
      # nmcli connection modify bond0 ipv4.method manual
    2. 配置 IPv6 设置。例如,要为 bond0 连接设置静态 IPv6 地址、网络掩码、默认网关、DNS 服务器和 DNS 搜索域设置,请输入:

      # nmcli connection modify bond0 ipv6.addresses '2001:db8:1::1/64'
      # nmcli connection modify bond0 ipv6.gateway '2001:db8:1::fffe'
      # nmcli connection modify bond0 ipv6.dns '2001:db8:1::fffd'
      # nmcli connection modify bond0 ipv6.dns-search 'example.com'
      # nmcli connection modify bond0 ipv6.method manual
  5. 激活连接:

    # nmcli connection up bond0
  6. 验证端口已连接,CONNECTION 列显示端口的连接名称:

    # nmcli device
    DEVICE   TYPE      STATE      CONNECTION
    ...
    enp7s0   ethernet  connected  bond0-port1
    enp8s0   ethernet  connected  bond0-port2

    当您激活连接的任何端口时,NetworkManager 也激活绑定,但不会激活它的端口。您可以配置 Red Hat Enterprise Linux 在启用绑定时自动启用所有端口:

    1. 启用绑定连接的 connection.autoconnect-slaves 参数:

      # nmcli connection modify bond0 connection.autoconnect-slaves 1
    2. 重新激活桥接:

      # nmcli connection up bond0

验证步骤

  1. 从主机中临时删除网络电缆。

    请注意,无法使用软件实用程序正确地测试链接失败事件。停用连接的工具(如 nmcli )仅显示绑定驱动程序处理端口配置更改的能力,而不是实际的链接失败事件。

  2. 显示绑定状态:

    # cat /proc/net/bonding/bond0

12.5. 使用 RHEL web 控制台配置网络绑定

本节论述了如何使用 RHEL web 控制台配置网络绑定。

先决条件

步骤

  1. 在屏幕左侧的导航中选择 Networking 选项卡。
  2. Interfaces 部分点 Add bond
  3. 输入您要创建的绑定设备名称。
  4. 选择应该是绑定成员的接口。
  5. 选择绑定模式。

    如果您选择 Active backup,Web 控制台会显示附加字段,您可以在其中选择首选的活动设备。

  6. 设置链路监控模式。例如,当您使用 Adaptive 负载均衡 模式时,将它设置为 ARP
  7. 可选:调整监控间隔、链接延迟和连接延迟设置。通常,您只需要更改默认值以进行故障排除。

    绑定设置
  8. 应用
  9. 默认情况下,绑定使用动态 IP 地址。如果要设置静态 IP 地址:

    1. Interfaces 部分点绑定的名称。
    2. 点您要配置的协议旁的 Edit
    3. 选择 地址 旁边的 "手动 ",并输入 IP 地址、前缀和默认网关。
    4. DNS 部分,点 + 按钮,并输入 DNS 服务器的 IP 地址。重复此步骤来设置多个 DNS 服务器。
    5. DNS 搜索域 部分中,点 + 按钮并输入搜索域。
    6. 如果接口需要静态路由,请在 Routes 部分配置它们。

      bond team bridge vlan.ipv4
    7. 应用

验证

  1. 在屏幕左侧的导航中选择 Networking 选项卡,并检查接口上是否有传入和传出流量:

    bond 验证
  2. 从主机中临时删除网络电缆。

    请注意,无法使用软件实用程序正确地测试链接失败事件。取消激活连接的工具(如 Web 控制台)只显示处理成员配置更改且没有实际链路失败事件的能力。

  3. 显示绑定状态:

    # cat /proc/net/bonding/bond0

12.6. 使用 nm-connection-editor 配置网络绑定

这部分论述了如何使用 nm-connection-editor 应用程序配置网络绑定。

请注意: nm-connection-editor 只能向绑定添加新端口。要使用现有连接配置集作为端口,请使用 nmcli 实用程序创建绑定,如使用 nmcli 命令配置网络绑定所述。

先决条件

  • 在服务器中安装两个或者两个以上物理或者虚拟网络设备。
  • 要将以太网设备用作绑定的端口,必须在服务器中安装物理或者虚拟以太网设备。
  • 要使用 team、bond 或 VLAN 设备作为绑定的端口,请确保这些设备还没有配置。

步骤

  1. 打开终端并输入 nm-connection-editor

    $ nm-connection-editor
  2. + 按钮添加新连接。
  3. 选择 Bond 连接类型,再单击 Create
  4. Bond 选项卡中:

    1. 可选:在 Interface name 字段中设置绑定接口的名称。
    2. Add 按钮将网络接口作为端口添加到绑定。

      1. 选择接口的连接类型。例如,为有线连接选择 Ethernet
      2. 可选:为端口设置连接名称。
      3. 如果您是为以太网设备创建连接配置集,打开 Ethernet 选项卡,在 Device 字段中选择您要添加为绑定的端口。如果您选择了不同的设备类型,请相应地进行配置。请注意,您只能在没有配置的绑定中使用以太网接口。
      4. Save
    3. 对您要添加到绑定的每个接口重复前面的步骤:

      add nic to bond in nm connection editor

    4. 可选:设置其他选项,如介质独立接口(MII)监控间隔。
  5. 配置绑定的 IP 设置。如果要使用这个绑定作为其它设备的端口,请跳过这一步。

    1. IPv4 Settings 选项卡中,配置 IPv4 设置。例如,设置静态 IPv4 地址、网络掩码、默认网关、DNS 服务器和 DNS 搜索域:

      bond IPv4 settings nm connection editor

    2. IPv6 Settings 选项卡中,配置 IPv6 设置。例如,设置静态 IPv6 地址、网络掩码、默认网关、DNS 服务器和 DNS 搜索域:

      bond IPv6 settings nm connection editor

  6. Save 保存绑定连接。
  7. 关闭 nm-connection-editor

验证步骤

  1. 从主机中临时删除网络电缆。

    请注意,无法使用软件实用程序正确地测试链接失败事件。停用连接的工具(如 nmcli )仅显示绑定驱动程序处理端口配置更改的能力,而不是实际的链接失败事件。

  2. 显示绑定状态:

    # cat /proc/net/bonding/bond0

12.7. 使用 nmstatectl 配置网络绑定

本节论述了如何使用 nmstatectl 工具配置网络绑定 bond0,并使用以下设置:

  • 绑定中的网络接口: enp1s0enp7s0
  • Mode: active-backup
  • 静态 IPv4 地址: 192.0.2.1,子网掩码为 /24
  • 静态 IPv6 地址: 2001:db8:1::1,子网掩码为 /64
  • IPv4 默认网关: 192.0.2.254
  • IPv6 默认网关: 2001:db8:1::fffe
  • IPv4 DNS server: 192.0.2.200
  • IPv6 DNS server: 2001:db8:1::ffbb
  • DNS 搜索域: example.com

先决条件

  • 在服务器中安装两个或者两个以上物理或者虚拟网络设备。
  • 要将以太网设备用作绑定中的端口,必须在服务器中安装物理或者虚拟以太网设备。
  • 要使用 team、网桥或 VLAN 设备作为绑定中的端口,在 port 列表中设置接口名称,并定义对应的接口。
  • 已安装 nmstate 软件包。

步骤

  1. 创建包含以下内容的 YAML 文件,如 ~/create-bond.yml

    ---
    interfaces:
    - name: bond0
      type: bond
      state: up
      ipv4:
        enabled: true
        address:
        - ip: 192.0.2.1
          prefix-length: 24
        dhcp: false
      ipv6:
        enabled: true
        address:
        - ip: 2001:db8:1::1
          prefix-length: 64
        autoconf: false
        dhcp: false
      link-aggregation:
        mode: active-backup
        port:
        - enp1s0
        - enp7s0
    - name: enp1s0
      type: ethernet
      state: up
    - name: enp7s0
      type: ethernet
      state: up
    
    routes:
      config:
      - destination: 0.0.0.0/0
        next-hop-address: 192.0.2.254
        next-hop-interface: bond0
      - destination: ::/0
        next-hop-address: 2001:db8:1::fffe
        next-hop-interface: bond0
    
    dns-resolver:
      config:
        search:
        - example.com
        server:
        - 192.0.2.200
        - 2001:db8:1::ffbb
  2. 将设置应用到系统:

    # nmstatectl apply ~/create-bond.yml

验证步骤

  1. 显示设备和连接的状态:

    # nmcli device status
    DEVICE      TYPE      STATE      CONNECTION
    bond0       bond      connected  bond0
  2. 显示连接配置集的所有设置:

    # nmcli connection show bond0
    connection.id:              bond0
    connection.uuid:            79cbc3bd-302e-4b1f-ad89-f12533b818ee
    connection.stable-id:       --
    connection.type:            bond
    connection.interface-name:  bond0
    ...
  3. 以 YAML 格式显示连接设置:

    # nmstatectl show bond0

其他资源

  • nmstatectl(8) man page
  • /usr/share/doc/nmstate/examples/

12.8. 使用 RHEL 系统角色配置网络绑定

您可以使用网络 RHEL 系统角色配置网络绑定。这个步骤描述了如何在使用两个以太网设备的主动备份模式中配置绑定,并设置 IPv4 和 IPv6 地址、默认网关和 DNS 配置。

注意

在绑定上,而不是在 Linux 绑定的端口上设置 IP 配置。

先决条件

  • ansible-core 软件包和 rhel-system-roles 软件包安装在控制节点上。
  • 如果您在运行 playbook 时使用了与 root 不同的远程用户,则此用户在受管节点上具有合适的 sudo 权限。
  • 在服务器中安装两个或者两个以上物理或者虚拟网络设备。

步骤

  1. 如果您要在其上执行 playbook 中指令的主机还没有被列入清单,请将此主机的 IP 或名称添加到 /etc/ansible/hosts Ansible 清单文件中:

    node.example.com
  2. 使用以下内容创建 ~/bond-ethernet.yml playbook:

    ---
    - name: Configure a network bond that uses two Ethernet ports
      hosts: node.example.com
      become: true
      tasks:
      - include_role:
          name: rhel-system-roles.network
    
        vars:
          network_connections:
            # Define the bond profile
            - name: bond0
              type: bond
              interface_name: bond0
              ip:
                address:
                  - "192.0.2.1/24"
                  - "2001:db8:1::1/64"
                gateway4: 192.0.2.254
                gateway6: 2001:db8:1::fffe
                dns:
                  - 192.0.2.200
                  - 2001:db8:1::ffbb
                dns_search:
                  - example.com
              bond:
                mode: active-backup
              state: up
    
            # Add an Ethernet profile to the bond
            - name: bond0-port1
              interface_name: enp7s0
              type: ethernet
              controller: bond0
              state: up
    
            # Add a second Ethernet profile to the bond
            - name: bond0-port2
              interface_name: enp8s0
              type: ethernet
              controller: bond0
              state: up
  3. 运行 playbook:

    • 要以 root 用户身份连接到受管主机,请输入:

      # ansible-playbook -u root ~/bond-ethernet.yml
    • 以用户身份连接到受管主机,请输入:

      # ansible-playbook -u user_name --ask-become-pass ~/bond-ethernet.yml

      --ask-become-pass 选项确保 ansible-playbook 命令提示输入 -u user_name 选项中定义的用户的 sudo 密码。

    如果没有指定 -u user_name 选项,ansible-playbook 以当前登录到控制节点的用户身份连接到受管主机。

其他资源

  • /usr/share/ansible/roles/rhel-system-roles.network/README.md 文件
  • ansible-playbook(1) 手册页

12.9. 创建网络绑定以便在不中断 VPN 的情况下在以太网和无线连接间进行切换

将工作站连接到公司网络的 RHEL 用户通常会使用 VPN 访问远程资源。然而,如果工作站在以太网和 Wi-Fi 连接间切换,例如:如果您是从带以太网连接的 docking 站中释放的笔记本电脑,VPN 连接就中断。要避免这个问题,您可以在 active-backup 模式中创建使用以太网和 Wi-Fi 连接的网络绑定。

先决条件

  • 主机包含以太网和 Wi-Fi 设备。
  • 已创建以太网和 Wi-Fi 网络管理器连接配置集,且两个连接都可以独立工作。

    此流程使用以下连接配置集来创建名为 bond0 的网络绑定:

    • enp11s0u1 以太网设备关联的 Docking_station
    • Wi-Fiwlp1s0 Wi-Fi 设备关联

步骤

  1. active-backup 模式中创建绑定接口:

    # nmcli connection add type bond con-name bond0 ifname bond0 bond.options "mode=active-backup"

    这个命令为接口和连接配置集 bond0 命名。

  2. 配置绑定的 IPv4 设置:

    • 如果您的网络中的 DHCP 服务器为主机分配 IPv4 地址,则不需要任何操作。
    • 如果您的本地网络需要静态 IPv4 地址,请将地址、网络掩码、默认网关、DNS 服务器和 DNS 搜索域设置为 bond0 连接:

      # nmcli connection modify bond0 ipv4.addresses '192.0.2.1/24'
      # nmcli connection modify bond0 ipv4.gateway '192.0.2.254'
      # nmcli connection modify bond0 ipv4.dns '192.0.2.253'
      # nmcli connection modify bond0 ipv4.dns-search 'example.com'
      # nmcli connection modify bond0 ipv4.method manual
  3. 配置绑定的 IPv6 设置:

    • 如果您的网络中的路由器或者 DHCP 服务器为主机分配 IPv6 地址,则不需要任何操作。
    • 如果您的本地网络需要静态 IPv6 地址,请将地址、网络掩码、默认网关、DNS 服务器和 DNS 搜索域设置为 bond0 连接:

      # nmcli connection modify bond0 ipv6.addresses '2001:db8:1::1/64'
      # nmcli connection modify bond0 ipv6.gateway '2001:db8:1::fffe'
      # nmcli connection modify bond0 ipv6.dns '2001:db8:1::fffd'
      # nmcli connection modify bond0 ipv6.dns-search 'example.com'
      # nmcli connection modify bond0 ipv6.method manual
  4. 显示连接配置集:

    # nmcli connection show
    NAME             UUID                                  TYPE      DEVICE
    Docking_station  256dd073-fecc-339d-91ae-9834a00407f9  ethernet  enp11s0u1
    Wi-Fi            1f1531c7-8737-4c60-91af-2d21164417e8  wifi      wlp1s0
    ...

    下一步需要连接配置集的名称和以太网设备名称。

  5. 为绑定分配以太网连接的配置:

    # nmcli connection modify Docking_station master bond0
  6. 为绑定分配 Wi-Fi 连接的连接配置集:

    # nmcli connection modify Wi-Fi master bond0
  7. 如果您的 Wi-Fi 网络使用 MAC 过滤来只允许列表中的 MAC 地址访问网络,请配置 NetworkManager 将活跃端口的 MAC 地址动态分配给绑定:

    # nmcli connection modify bond0 +bond.options fail_over_mac=1

    使用这个设置时,您必须将 Wi-Fi 设备的 MAC 地址设置为 allow 列表,而不是以太网和 Wi-Fi 设备的 MAC 地址。

  8. 将与以太连接关联的设备设置为绑定的主设备:

    # nmcli con modify bond0 +bond.options "primary=enp11s0u1"

    使用这个设置时,如果可用,绑定总是使用以太网连接。

  9. 配置在激活 bond0 设备时 NetworkManager 会自动激活端口:

    # nmcli connection modify bond0 connection.autoconnect-slaves 1
  10. 激活 bond0 连接:

    # nmcli connection up bond0

验证步骤

  • 显示当前激活的设备,绑定及其端口的状态:

    # cat /proc/net/bonding/bond0
    Ethernet Channel Bonding Driver: v3.7.1 (April 27, 2011)
    
    Bonding Mode: fault-tolerance (active-backup) (fail_over_mac active)
    Primary Slave: enp11s0u1 (primary_reselect always)
    Currently Active Slave: enp11s0u1
    MII Status: up
    MII Polling Interval (ms): 1
    Up Delay (ms): 0
    Down Delay (ms): 0
    Peer Notification Delay (ms): 0
    
    Slave Interface: enp11s0u1
    MII Status: up
    Speed: 1000 Mbps
    Duplex: full
    Link Failure Count: 0
    Permanent HW addr: 00:53:00:59:da:b7
    Slave queue ID: 0
    
    Slave Interface: wlp1s0
    MII Status: up
    Speed: Unknown
    Duplex: Unknown
    Link Failure Count: 2
    Permanent HW addr: 00:53:00:b3:22:ba
    Slave queue ID: 0

第 13 章 设置 WireGuard VPN

WireGuard 是一个在 Linux 内核中运行的高性能 VPN 解决方案。它使用现代加密机制,并且比许多其他 VPN 解决方案更容易配置。另外,WireGuard 的小代码库降低了安全攻击的攻击面,因此提高安全性。对于身份验证和加密,WireGuard 使用类似于 SSH 的键。

重要

WireGuard 只作为技术预览提供。红帽产品服务级别协议(SLA)不支持技术预览功能,且其功能可能并不完善,因此红帽不建议在生产环境中使用它们。这些预览可让用户早期访问将来的产品功能,让用户在开发过程中测试并提供反馈意见。

如需有关 技术预览功能支持范围 的信息,请参阅红帽客户门户网站中的技术预览功能支持范围。

要设置 WireGuard VPN,您必须完成以下步骤。您可以使用不同的选项执行每个步骤:

  1. 为 VPN 中的每个主机创建公钥和私钥
  2. 使用 nmclinmtuinmn-connection-editorwg-quick 服务来配置 WireGuard 服务器。
  3. 使用命令行图形界面,在 WireGuard 服务器上配置 firewalld。
  4. 使用 nmclinm-connection-editorwg-quick 服务来配置 WireGuard 客户端。

WireGuard 在网络层(层 3)上运行。因此,您无法使用 DHCP,且必须为服务器和客户端上的隧道设备分配静态 IP 地址或 IPv6 本地链接地址。

重要

只有在禁用 RHEL 中的 Federal Information Processing Standard(FIPS)模式时,才能使用 WireGuard。

请注意,参与 WireGuard VPN 的所有主机都是同级的。本文档中,使用术语 客户端(client)代表建立连接的主机;并使用术语服务器(server)代表带有固定主机名或 IP 地址的主机,客户端会连接到这个主机或通过这个主机路由所有流量。

13.1. WireGuard 使用的协议和原语

WireGuard 使用以下协议和原语:

  • ChaCha20 用于通过 Poly1305 进行身份验证,使用带有关联数据(AEAD)的 Authenticated Encryption,如 RFC7539 所述
  • Curve25519 用于 Elliptic-curve Diffie-Hellman(ECDH)密钥交换
  • 用于哈希和密钥哈希的 BLAKE2s,如 RFC7693所述
  • 用于哈希表键的 SipHash24
  • 用于密钥派生的 HKDF,如 RFC5869所述

13.2. WireGuard 如何使用隧道 IP 地址、公钥和远程端点

当 WireGuard 将网络数据包发送到对等点时:

  1. WireGuard 从数据包读取目标 IP,并将其与本地配置中允许的 IP 地址列表进行比较。如果未找到 peer,WireGuard 会丢弃数据包。
  2. 如果 peer 有效,WireGuard 使用对等的公钥对数据包进行加密。
  3. 发送主机查找主机的最新互联网 IP 地址,并将加密数据包发送到此地址。

当 WireGuard 接收数据包时:

  1. WireGuard 使用远程主机的私钥解密数据包。
  2. WireGuard 从数据包读取内部源地址,并在本地主机上对等点的设置中查询 IP 地址是否配置。如果源 IP 位于允许列表中,WireGuard 会接受数据包。如果 IP 地址不在列表中,WireGuard 会丢弃数据包。

公钥和允许的 IP 地址的关联被称为 Cryptokey Routing Table。这意味着,当发送数据包时,IP 地址列表的行为与路由表相似,在接收数据包时作为一种访问控制列表。

13.3. 使用 NAT 和防火墙后面的 WireGuard 客户端

WireGuard 使用 UDP 协议,只有在对等点发送数据包时才会传输数据。路由器上的有状态防火墙和网络地址转换(NAT)可跟踪连接,以启用 NAT 或防火墙接收数据包的对等点。

为保持连接处于活动状态,WireGuard 支持 persistent keepalives。这意味着您可以设置一个间隔,其中 WireGuard 发送 keepalive 数据包。默认情况下,禁用持久的 keep-alive 功能来减少网络流量。如果您在带有 NAT 的网络中使用客户端,或者防火墙在一定时间不活动状态后关闭连接,在客户端上启用此功能。

13.4. 创建在 WireGuard 连接中使用的私钥和公钥

WireGuard 使用 base64 编码的私钥和公钥来互相验证主机。因此,您必须在参与 WireGuard VPN 的每个主机上创建密钥。

重要

对于安全连接,请为每个主机创建不同的密钥,并确保只使用远程 WireGuard 主机共享公钥。不要使用本文档中使用的示例键。

步骤

  1. 安装 wireguard-tools 软件包:

    # dnf install wireguard-tools
  2. 为主机创建私钥和对应的公钥:

    # wg genkey | tee /etc/wireguard/$HOSTNAME.private.key | wg pubkey > /etc/wireguard/$HOSTNAME.public.key

    您需要密钥文件的内容,而不是文件本身。但是,红帽建议在将来需要记住密钥时保留文件。

  3. 在密钥文件中设置安全权限:

    # chmod 600 /etc/wireguard/$HOSTNAME.private.key /etc/wireguard/$HOSTNAME.public.key
  4. 显示私钥:

    # cat /etc/wireguard/$HOSTNAME.private.key
    YFAnE0psgIdiAF7XR4abxiwVRnlMfeltxu10s/c4JXg=

    您需要私钥在本地主机上配置 WireGuard 连接。不要共享私钥。

  5. 显示公钥:

    # cat /etc/wireguard/$HOSTNAME.public.key
    UtjqCJ57DeAscYKRfp7cFGiQqdONRn69u249Fa4O6BE=

    您需要公钥在远程主机上配置 WireGuard 连接。

其他资源

  • wg(8) man page

13.5. 使用 nmcli 配置 WireGuard 服务器

您可以通过在 NetworkManager 中创建连接配置集来配置 WireGuard 服务器。使用此方法让 NetworkManager 管理 WireGuard 连接。

此流程假设以下设置:

  • server:

    • Private key: YFAnE0psgIdiAF7XR4abxiwVRnlMfeltxu10s/c4JXg=
    • Tunnel IPv4 address: 192.0.2.1/24
    • Tunnel IPv6 address: 2001:db8:1::1/32
  • Client:

    • Public key: bnwfQcC8/g2i4vvEqcRUM2e6Hi3Nskk6G9t4r26nFVM=
    • 隧道 IPv4 地址: 192.0.2.2/24
    • Tunnel IPv6 address: 2001:db8:1::2/32

先决条件

  • 您已为服务器和客户端生成了公钥和私钥。
  • 您知道以下信息:

    • 服务器的私钥
    • 客户端的静态隧道 IP 地址和子网掩码
    • 客户端的公钥
    • 服务器的静态隧道 IP 地址和子网掩码

步骤

  1. 添加 NetworkManager WireGuard 连接配置集:

    # nmcli connection add type wireguard con-name server-wg0 ifname wg0 autoconnect no

    这个命令会创建一个名为 server-wg0 的配置集,并为其分配虚拟接口 wg0。要防止连接在添加没有最终配置的情况下自动启动,请禁用 autoconnect 参数。

  2. 设置服务器的隧道 IPv4 地址和子网掩码:

    # nmcli connection modify server-wg0 ipv4.method manual ipv4.addresses 192.0.2.1/24
  3. 设置服务器的隧道 IPv6 地址和子网掩码:

    # nmcli connection modify server-wg0 ipv6.method manual ipv6.addresses 2001:db8:1::1/32
  4. 将服务器的私钥添加到连接配置集中:

    # nmcli connection modify server-wg0 wireguard.private-key "YFAnE0psgIdiAF7XR4abxiwVRnlMfeltxu10s/c4JXg="
  5. 为传入的 WireGuard 连接设定端口:

    # nmcli connection modify server-wg0 wireguard.listen-port 51820

    在主机上始终设置固定端口号,接收传入的 WireGuard 连接。如果您没有设置端口,WireGuard 每次激活 wg0 接口时会使用一个随机的空闲端口。

  6. 为您要允许与此服务器通信的每个客户端添加对等配置。您必须手动添加这些设置,因为 nmcli 实用程序不支持设置对应的连接属性。

    1. 编辑 /etc/NetworkManager/system-connections/server-wg0.nmconnection 文件,并附加:

      [wireguard-peer.bnwfQcC8/g2i4vvEqcRUM2e6Hi3Nskk6G9t4r26nFVM=]
      allowed-ips=192.0.2.2;2001:db8:1::2;
      • [wireguard-peer.<public_key_of_the_client>] 条目定义了客户端的对等部分,部分名称包含客户端的公钥。
      • allowed-ips 参数设置允许向这个服务器发送数据的客户端的隧道 IP 地址。

        为每个客户端添加一个部分。

    2. 重新载入 server-wg0 连接配置集:

      # nmcli connection load /etc/NetworkManager/system-connections/server-wg0.nmconnection
  7. 可选:将连接配置为自动启动,请输入:

    # nmcli connection modify server-wg0 autoconnect yes
  8. 重新激活 server-wg0 连接:

    # nmcli connection up server-wg0

验证

  1. 显示 wg0 设备的接口配置:

    # wg show wg0
    interface: wg0
      public key: UtjqCJ57DeAscYKRfp7cFGiQqdONRn69u249Fa4O6BE=
      private key: (hidden)
      listening port: 51820
    
    peer: bnwfQcC8/g2i4vvEqcRUM2e6Hi3Nskk6G9t4r26nFVM=
      allowed ips: 192.0.2.2/32, 2001:db8:1::2/128

    要在输出中显示私钥,请使用 WG_HIDE_KEYS=never wg 显示 wg0 命令。

  2. 显示 wg0 设备的 IP 配置:

    # ip address show wg0
    20: wg0: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1420 qdisc noqueue state UNKNOWN group default qlen 1000
        link/none
        inet 192.0.2.1/24 brd 192.0.2.255 scope global noprefixroute wg0
           valid_lft forever preferred_lft forever
        inet6 2001:db8:1::1/32 scope global noprefixroute
           valid_lft forever preferred_lft forever
        inet6 fe80::3ef:8863:1ce2:844/64 scope link noprefixroute
           valid_lft forever preferred_lft forever

其他资源

  • wg(8) man page
  • nm-settings(5) man page 中的 WireGuard 设置 部分

13.6. 使用 nmtui 配置 WireGuard 服务器

您可以通过在 NetworkManager 中创建连接配置集来配置 WireGuard 服务器。使用此方法让 NetworkManager 管理 WireGuard 连接。

此流程假设以下设置:

  • server:

    • Private key: YFAnE0psgIdiAF7XR4abxiwVRnlMfeltxu10s/c4JXg=
    • 隧道 IPv4 地址:192.0.2.1/24
    • 频道 IPv6 地址:2001:db8:1::1/32
  • Client:

    • Public key: bnwfQcC8/g2i4vvEqcRUM2e6Hi3Nskk6G9t4r26nFVM=
    • 隧道 IPv4 地址:192.0.2.2/24
    • 频道 IPv6 地址:2001:db8:1::2/32

先决条件

  • 您已为服务器和客户端生成了公钥和私钥。
  • 您知道以下信息:

    • 服务器的私钥
    • 客户端的静态隧道 IP 地址和子网掩码
    • 客户端的公钥
    • 服务器的静态隧道 IP 地址和子网掩码
  • 已安装 NetworkManager-tui 软件包。

步骤

  1. 启动 nmtui 应用程序:

    # nmtui
  2. 选择 Edit a connection,点 Enter
  3. 选择 添加,然后按 Enter 键。
  4. 选择列表中的 WireGuard 连接类型,然后按 Enter 键。
  5. Edit connection 窗口中:

    1. 输入连接名称和虚拟接口,如 wg0,以便 NetworkManager 应分配给连接。
    2. 输入服务器的私钥。
    3. 为传入的 WireGuard 连接设置侦听端口号,如 51820

      在主机上始终设置固定端口号,接收传入的 WireGuard 连接。如果您没有设置端口,WireGuard 会在每次激活接口时都使用一个随机的空闲端口。

      nmtui WireGuard server general
    4. Peers 窗格旁的 Add s:

      1. 输入客户端的公钥。
      2. Allowed IP 字段设置为允许向这个服务器发送数据的客户端的隧道 IP 地址。
      3. 选择 确定,然后按 Enter 键。

        nmtui WireGuard 服务器 peer 配置
    5. 选择 IPv4 Configuration 旁边的 显示,然后按 Enter 键。

      1. 选择 IPv4 配置方法 Manual
      2. 输入隧道 IPv4 地址和子网掩码。将 Gateway 字段留空。
    6. 选择 IPv6 Configuration 旁边的 显示,然后按 Enter 键。

      1. 选择 IPv6 配置方法 Manual
      2. 输入隧道 IPv6 地址和子网掩码。将 Gateway 字段留空。
    7. 选择 确定,然后按 Enter

      nmtui WireGuard server ip config
  6. 在带有连接列表的窗口中,选择 Back,然后按 Enter 键。
  7. NetworkManager TUI 主窗口中,选择 Quit,然后按 Enter 键。

验证

  1. 显示 wg0 设备的接口配置:

    # wg show wg0
    interface: wg0
      public key: UtjqCJ57DeAscYKRfp7cFGiQqdONRn69u249Fa4O6BE=
      private key: (hidden)
      listening port: 51820
    
    peer: bnwfQcC8/g2i4vvEqcRUM2e6Hi3Nskk6G9t4r26nFVM=
      allowed ips: 192.0.2.2/32, 2001:db8:1::2/128

    要在输出中显示私钥,请使用 WG_HIDE_KEYS=never wg show wg0 命令。

  2. 显示 wg0 设备的 IP 配置:

    # ip address show wg0
    20: wg0: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1420 qdisc noqueue state UNKNOWN group default qlen 1000
        link/none
        inet 192.0.2.1/24 brd 192.0.2.255 scope global noprefixroute wg0
           valid_lft forever preferred_lft forever
        inet6 2001:db8:1::1/32 scope global noprefixroute
           valid_lft forever preferred_lft forever
        inet6 fe80::3ef:8863:1ce2:844/64 scope link noprefixroute
           valid_lft forever preferred_lft forever

其他资源

  • wg(8) man page

13.7. 使用 nm-connection-editor 配置 WireGuard 服务器

您可以通过在 NetworkManager 中创建连接配置集来配置 WireGuard 服务器。使用此方法让 NetworkManager 管理 WireGuard 连接。

先决条件

  • 您已为服务器和客户端生成了公钥和私钥。
  • 您知道以下信息:

    • 服务器的私钥
    • 客户端的静态隧道 IP 地址和子网掩码
    • 客户端的公钥
    • 服务器的静态隧道 IP 地址和子网掩码

步骤

  1. 打开终端窗口,输入:

    # nm-connection-editor
  2. + 按钮添加新连接。
  3. 选择 WireGuard 连接类型,然后单击 Create
  4. 可选:更新连接名称。
  5. General 选项卡中,选择 Connect automatically with priority。另外,还可设置优先级值。
  6. WireGuard 选项卡中:

    1. 输入虚拟接口的名称,如 wg0,以便 NetworkManager 将其分配给连接。
    2. 输入服务器的私钥。
    3. 为传入的 WireGuard 连接设置侦听端口号,如 51820

      在主机上始终设置固定端口号,接收传入的 WireGuard 连接。如果您没有设置端口,WireGuard 会在每次激活接口时都使用一个随机的空闲端口。

    4. Add 添加对等点:

      1. 输入客户端的公钥。
      2. Allowed IP 字段设置为允许向这个服务器发送数据的客户端的隧道 IP 地址。
      3. 应用
  7. IPv4 Settings 选项卡中:

    1. Method 列表中选择 Manual
    2. 单击 Add 以进入隧道 IPv4 地址和子网掩码。将 Gateway 字段留空。
  8. IPv6 设置 选项卡中:

    1. Method 列表中选择 Manual
    2. 单击 Add 以进入隧道 IPv6 地址和子网掩码。将 Gateway 字段留空。
  9. Save 存储连接配置集。

验证

  1. 显示 wg0 设备的接口配置:

    # wg show wg0
    interface: wg0
      public key: UtjqCJ57DeAscYKRfp7cFGiQqdONRn69u249Fa4O6BE=
      private key: (hidden)
      listening port: 51820
    
    peer: bnwfQcC8/g2i4vvEqcRUM2e6Hi3Nskk6G9t4r26nFVM=
      allowed ips: 192.0.2.2/32, 2001:db8:1::2/128

    要在输出中显示私钥,请使用 WG_HIDE_KEYS=never wg 显示 wg0 命令。

  2. 显示 wg0 设备的 IP 配置:

    # ip address show wg0
    20: wg0: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1420 qdisc noqueue state UNKNOWN group default qlen 1000
        link/none
        inet 192.0.2.1/24 brd 192.0.2.255 scope global noprefixroute wg0
           valid_lft forever preferred_lft forever
        inet6 2001:db8:1::1/32 scope global noprefixroute
           valid_lft forever preferred_lft forever
        inet6 fe80::3ef:8863:1ce2:844/64 scope link noprefixroute
           valid_lft forever preferred_lft forever

其他资源

  • wg(8) man page

13.8. 使用 wg-quick 服务配置 WireGuard 服务器

您可以通过在 /etc/wireguard/ 目录中创建配置文件来配置 WireGuard 服务器。使用此方法独立于 NetworkManager 配置服务。

此流程假设以下设置:

  • server:

    • Private key: YFAnE0psgIdiAF7XR4abxiwVRnlMfeltxu10s/c4JXg=
    • Tunnel IPv4 address: 192.0.2.1/24
    • Tunnel IPv6 address: 2001:db8:1::1/32
  • Client:

    • Public key: bnwfQcC8/g2i4vvEqcRUM2e6Hi3Nskk6G9t4r26nFVM=
    • 隧道 IPv4 地址: 192.0.2.2/24
    • Tunnel IPv6 address: 2001:db8:1::2/32

先决条件

  • 您已为服务器和客户端生成了公钥和私钥。
  • 您知道以下信息:

    • 服务器的私钥
    • 客户端的静态隧道 IP 地址和子网掩码
    • 客户端的公钥
    • 服务器的静态隧道 IP 地址和子网掩码

步骤

  1. 安装 wireguard-tools 软件包:

    # dnf install wireguard-tools
  2. 使用以下内容创建 /etc/wireguard/wg0.conf 文件:

    [Interface]
    Address = 192.0.2.1/24, 2001:db8:1::1/32
    ListenPort = 51820
    PrivateKey = YFAnE0psgIdiAF7XR4abxiwVRnlMfeltxu10s/c4JXg=
    
    [Peer]
    PublicKey = bnwfQcC8/g2i4vvEqcRUM2e6Hi3Nskk6G9t4r26nFVM=
    AllowedIPs = 192.0.2.2, 2001:db8:1::2
    • [Interface] 部分描述了服务器中接口的 WireGuard 设置:

      • Address:服务器的隧道 IP 地址的逗号分隔列表。
      • PrivateKey :服务器的私钥。
      • ListenPort :WireGuard 侦听传入 UDP 连接的端口。

        在主机上始终设置固定端口号,接收传入的 WireGuard 连接。如果您没有设置端口,WireGuard 每次激活 wg0 接口时会使用一个随机的空闲端口。

    • 每个 [Peer] 部分描述了一个客户端的设置:

      • PublicKey :客户端的公钥.
      • AllowedIPs :允许向这个服务器发送数据的客户端的隧道 IP 地址。
  3. 启用并启动 WireGuard 连接:

    # systemctl enable --now wg-quick@wg0

    systemd 实例名称必须与 /etc/wireguard/ 目录中的配置文件的名称匹配(没有 .conf 后缀)。该服务还会将这个名称用于虚拟网络接口。

验证

  1. 显示 wg0 设备的接口配置:

    # wg show wg0
    interface: wg0
      public key: UtjqCJ57DeAscYKRfp7cFGiQqdONRn69u249Fa4O6BE=
      private key: (hidden)
      listening port: 51820
    
    peer: bnwfQcC8/g2i4vvEqcRUM2e6Hi3Nskk6G9t4r26nFVM=
      allowed ips: 192.0.2.2/32, 2001:db8:1::2/128

    要在输出中显示私钥,请使用 WG_HIDE_KEYS=never wg 显示 wg0 命令。

  2. 显示 wg0 设备的 IP 配置:

    # ip address show wg0
    20: wg0: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1420 qdisc noqueue state UNKNOWN group default qlen 1000
        link/none
        inet 192.0.2.1/24 scope global wg0
           valid_lft forever preferred_lft forever
        inet6 2001:db8:1::1/32 scope global
           valid_lft forever preferred_lft forever

其他资源

  • wg(8) man page
  • wg-quick(8) man page

13.9. 使用命令行在 WireGuard 服务器中配置 firewalld

您必须在 WireGuard 服务器上配置 firewalld 服务,以允许来自客户端的进入连接。另外,如果客户端能够使用 WireGuard 服务器作为默认网关,并通过隧道路由所有流量,则必须启用伪装。

步骤

  1. firewalld 服务中的传入连接打开 WireGuard 端口:

    # firewall-cmd --permanent --add-port=51820/udp --zone=public
  2. 如果客户端应该通过隧道路由所有流量,并使用 WireGuard 服务器作为默认网关,请为 public 区启用伪装 :

    # firewall-cmd --permanent --zone=public --add-masquerade
  3. 重新加载 firewalld 规则。

    # firewall-cmd --reload

验证

  • 显示 public 区的配置:

    # firewall-cmd --list-all
    public (active)
      ...
      ports: 51820/udp
      masquerade: yes
      ...

其他资源

  • firewall-cmd(1) man page

13.10. 使用图形界面在 WireGuard 服务器中配置 firewalld

您必须在 WireGuard 服务器上配置 firewalld 服务,以允许来自客户端的进入连接。另外,如果客户端能够使用 WireGuard 服务器作为默认网关,并通过隧道路由所有流量,则必须启用伪装。

步骤

  1. Super 键,输入 firewall,然后从结果中选择 Firewall 应用程序。
  2. Configuration 列表中选择 Permanent
  3. 选择 public 区域。
  4. 允许到 WireGuard 端口的传入连接:

    1. 端口选项卡上,单击 添加
    2. 输入您为传入 WireGuard 连接设置的端口号:
    3. 协议 列表中选择 udp
    4. 确定
  5. 如果客户端应该通过隧道路由所有流量,并使用 WireGuard 服务器作为默认网关:

    1. 导航到 public 区域的 Masquerading 选项卡。
    2. 选择 Masquerade zone
  6. 选择 OptionsReload Firewalld

验证

  • 显示 public 区的配置:

    # firewall-cmd --list-all
    public (active)
      ...
      ports: 51820/udp
      masquerade: yes
      ...

13.11. 使用 nmcli 配置 WireGuard 客户端

您可以通过在 NetworkManager 中创建连接配置集来配置 WireGuard 客户端。使用此方法让 NetworkManager 管理 WireGuard 连接。

此流程假设以下设置:

  • Client:

    • Private key: aPUcp5vHz8yMLrzk8SsDyYnV33IhE/k20e52iKJFV0A=
    • 隧道 IPv4 地址: 192.0.2.2/24
    • Tunnel IPv6 address: 2001:db8:1::2/32
  • server:

    • Public key: UtjqCJ57DeAscYKRfp7cFGiQqdONRn69u249Fa4O6BE=
    • Tunnel IPv4 address: 192.0.2.1/24
    • Tunnel IPv6 address: 2001:db8:1::1/32

先决条件

  • 您已为服务器和客户端生成了公钥和私钥。
  • 您知道以下信息:

    • 客户端的私钥
    • 客户端的静态隧道 IP 地址和子网掩码
    • 服务器的公钥
    • 服务器的静态隧道 IP 地址和子网掩码

步骤

  1. 添加 NetworkManager WireGuard 连接配置集:

    # nmcli connection add type wireguard con-name client-wg0 ifname wg0 autoconnect no

    这个命令会创建一个名为 client-wg0 的配置集,并将虚拟接口 wg0 分配给它。要防止连接在添加没有最终配置的情况下自动启动,请禁用 autoconnect 参数。

  2. 可选:配置 NetworkManager,使其不会自动启动 client-wg 连接:

    # nmcli connection modify client-wg0 autoconnect no
  3. 设置客户端的隧道 IPv4 地址和子网掩码:

    # nmcli connection modify client-wg0 ipv4.method manual ipv4.addresses 192.0.2.2/24
  4. 设置客户端的隧道 IPv6 地址和子网掩码:

    # nmcli connection modify client-wg0 ipv6.method manual ipv6.addresses 2001:db8:1::2/32
  5. 如果要通过隧道路由所有流量,请将服务器的隧道 IP 地址设置为默认网关:

    # nmcli connection modify client-wg0 ipv4.gateway 192.0.2.1 ipv6.gateway 2001:db8:1::1
  6. 将服务器的私钥添加到连接配置集中:

    # nmcli connection modify client-wg0 wireguard.private-key "aPUcp5vHz8yMLrzk8SsDyYnV33IhE/k20e52iKJFV0A="
    1. 编辑 /etc/NetworkManager/system-connections/client-wg0.nmconnection 文件,并附加:

      [wireguard-peer.UtjqCJ57DeAscYKRfp7cFGiQqdONRn69u249Fa4O6BE=]
      endpoint=server.example.com:51820
      allowed-ips=192.0.2.1;2001:db8:1::1;
      persistent-keepalive=20
      • [wireguard-peer.<public_key_of_the_server>] 条目定义了服务器的 peer 部分,部分名称包含服务器的公钥。
      • endpoint 参数设置服务器的主机名或 IP 地址以及服务器的端口。客户端使用此信息来建立连接。
      • allowed-ips 参数设置允许向此客户端发送数据的 IP 地址列表。例如,将参数设置为:

        • 服务器隧道 IP 地址,以仅允许服务器与此客户端通信。上例中的值可配置这种情况。
        • 0.0.0.0/0;::/0; 用于允许任何远程 IPv4 和 IPv6 地址与此客户端通信。使用此设置通过隧道路由所有流量,并使用 WireGuard 服务器作为默认网关。
      • 可选的 persistent-keepalive 参数定义一个 WireGuard 发送 keepalive 数据包到服务器的间隔(以秒为单位)。如果您在网络中使用具有网络地址转换(NAT)的客户端,或者防火墙在一段时间不活跃后关闭 UDP 连接,则设置此参数。
    2. 重新载入 client-wg0 连接配置集:

      # nmcli connection load /etc/NetworkManager/system-connections/client-wg0.nmconnection
  7. 重新激活 client-wg0 连接:

    # nmcli connection up client-wg0

验证

  1. Ping 服务器的 IP 地址:

    # ping 192.0.2.1
    # ping6 2001:db8:1::1
  2. 显示 wg0 设备的接口配置:

    # wg show wg0
    interface: wg0
      public key: bnwfQcC8/g2i4vvEqcRUM2e6Hi3Nskk6G9t4r26nFVM=
      private key: (hidden)
      listening port: 51820
    
    peer: UtjqCJ57DeAscYKRfp7cFGiQqdONRn69u249Fa4O6BE=
      endpoint: server.example.com:51820
      allowed ips: 192.0.2.1/32, 2001:db8:1::1/128
      latest handshake: 1 minute, 41 seconds ago
      transfer: 824 B received, 1.01 KiB sent
      persistent keepalive: every 20 seconds

    要在输出中显示私钥,请使用 WG_HIDE_KEYS=never wg 显示 wg0 命令。

    请注意,如果已经通过 VPN 隧道发送流量,输出只会包含 latest handshaketransfer 条目。

  3. 显示 wg0 设备的 IP 配置:

    # ip address show wg0
    10: wg0: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1420 qdisc noqueue state UNKNOWN group default qlen 1000
        link/none
        inet 192.0.2.2/24 brd 192.0.2.255 scope global noprefixroute wg0
           valid_lft forever preferred_lft forever
        inet6 2001:db8:1::2/32 scope global noprefixroute
           valid_lft forever preferred_lft forever
        inet6 fe80::73d9:6f51:ea6f:863e/64 scope link noprefixroute
           valid_lft forever preferred_lft forever

其他资源

  • wg(8) man page
  • nm-settings(5) man page 中的 WireGuard 设置 部分

13.12. 使用 nmtui 配置 WireGuard 客户端

您可以通过在 NetworkManager 中创建连接配置集来配置 WireGuard 客户端。使用此方法让 NetworkManager 管理 WireGuard 连接。

此流程假设以下设置:

  • Client:

    • Private key: aPUcp5vHz8yMLrzk8SsDyYnV33IhE/k20e52iKJFV0A=
    • 隧道 IPv4 地址:192.0.2.2/24
    • 频道 IPv6 地址:2001:db8:1::2/32
  • server:

    • 公钥:UtjqCJ57DeAscYKRfp7cFGiQqdONRn69u249Fa4O6BE=
    • 隧道 IPv4 地址:192.0.2.1/24
    • 频道 IPv6 地址:2001:db8:1::1/32

先决条件

  • 您已为服务器和客户端生成了公钥和私钥。
  • 您知道以下信息:

    • 客户端的私钥
    • 客户端的静态隧道 IP 地址和子网掩码
    • 服务器的公钥
    • 服务器的静态隧道 IP 地址和子网掩码
  • 已安装 NetworkManager-tui 软件包

步骤

  1. 启动 nmtui 应用程序:

    # nmtui
  2. 选择 Edit a connection,点 Enter
  3. 选择 添加,然后按 Enter 键。
  4. 选择列表中的 WireGuard 连接类型,然后按 Enter 键。
  5. Edit connection 窗口中:

    1. 输入连接名称和虚拟接口,如 wg0,以便 NetworkManager 应分配给连接。
    2. 输入客户端的私钥。

      nmtui WireGuard client general
    3. Peers 窗格旁的 Add s:

      1. 输入服务器的公钥。
      2. 设置 Allowed IPs 字段。例如,将其设置为:

        • 服务器隧道 IP 地址,以仅允许服务器与此客户端通信。
        • 0.0.0.0/0,::/0 以允许任何远程 IPv4 和 IPv6 地址与此客户端通信。使用此设置通过隧道路由所有流量,并使用 WireGuard 服务器作为默认网关。
      3. Endpoint 字段中输入 WireGuard 服务器的主机名或 IP 地址和端口。使用以下格式: hostname_or_IP:port_number
      4. 可选: 如果您在带有网络地址转换(NAT)的网络中使用客户端,或者防火墙在一定时间不活动状态后关闭 UDP 连接,则设置持久的间隔(以秒为单位)。在这个间隔中,客户端向服务器发送一个保留数据包。
      5. 选择 确定,然后按 Enter 键。

        nmtui WireGuard 客户端对等配置
    4. 选择 IPv4 Configuration 旁边的 显示,然后按 Enter 键。

      1. 选择 IPv4 配置方法 Manual
      2. 输入隧道 IPv4 地址和子网掩码。将 Gateway 字段留空。
    5. 选择 IPv6 Configuration 旁边的 显示,然后按 Enter 键。

      1. 选择 IPv6 配置方法 Manual
      2. 输入隧道 IPv6 地址和子网掩码。将 Gateway 字段留空。
    6. 可选: 选择 Automatically connect
    7. 选择 确定,然后按 Enter

      nmtui WireGuard client ip config
  6. 在带有连接列表的窗口中,选择 Back,然后按 Enter 键。
  7. NetworkManager TUI 主窗口中,选择 Quit,然后按 Enter 键。

验证

  1. Ping 服务器的 IP 地址:

    # ping 192.0.2.1
    # ping6 2001:db8:1::1
  2. 显示 wg0 设备的接口配置:

    # wg show wg0
    interface: wg0
      public key: bnwfQcC8/g2i4vvEqcRUM2e6Hi3Nskk6G9t4r26nFVM=
      private key: (hidden)
      listening port: 51820
    
    peer: UtjqCJ57DeAscYKRfp7cFGiQqdONRn69u249Fa4O6BE=
      endpoint: server.example.com:51820
      allowed ips: 192.0.2.1/32, 2001:db8:1::1/128
      latest handshake: 1 minute, 41 seconds ago
      transfer: 824 B received, 1.01 KiB sent
      persistent keepalive: every 20 seconds

    要在输出中显示私钥,请使用 WG_HIDE_KEYS=never wg show wg0 命令。

    请注意,如果已经通过 VPN 隧道发送流量,输出只会包含 latest handshaketransfer 条目。

  3. 显示 wg0 设备的 IP 配置:

    # ip address show wg0
    10: wg0: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1420 qdisc noqueue state UNKNOWN group default qlen 1000
        link/none
        inet 192.0.2.2/24 brd 192.0.2.255 scope global noprefixroute wg0
           valid_lft forever preferred_lft forever
        inet6 2001:db8:1::2/32 scope global noprefixroute
           valid_lft forever preferred_lft forever
        inet6 fe80::73d9:6f51:ea6f:863e/64 scope link noprefixroute
           valid_lft forever preferred_lft forever

其他资源

  • wg(8) man page

13.13. 使用 nm-connection-editor 配置 WireGuard 客户端

您可以通过在 NetworkManager 中创建连接配置集来配置 WireGuard 客户端。使用此方法让 NetworkManager 管理 WireGuard 连接。

先决条件

  • 您已为服务器和客户端生成了公钥和私钥。
  • 您知道以下信息:

    • 客户端的私钥
    • 客户端的静态隧道 IP 地址和子网掩码
    • 服务器的公钥
    • 服务器的静态隧道 IP 地址和子网掩码

步骤

  1. 打开终端窗口,输入:

    # nm-connection-editor
  2. + 按钮添加新连接。
  3. 选择 WireGuard 连接类型,然后单击 Create
  4. 可选:更新连接名称。
  5. 可选: 在 General 选项卡中,选择 Connect automatically with priority
  6. WireGuard 选项卡中:

    1. 输入虚拟接口的名称,如 wg0,以便 NetworkManager 将其分配给连接。
    2. 输入客户端的私钥。
    3. Add 添加对等点:

      1. 输入服务器的公钥。
      2. 设置 Allowed IPs 字段。例如,将其设置为:

        • 服务器隧道 IP 地址,以仅允许服务器与此客户端通信。
        • 0.0.0.0/0;::/0; 用于允许任何远程 IPv4 和 IPv6 地址与此客户端通信。使用此设置通过隧道路由所有流量,并使用 WireGuard 服务器作为默认网关。
      3. Endpoint 字段中输入 WireGuard 服务器的主机名或 IP 地址和端口。使用以下格式: hostname_or_IP:port_number
      4. 可选: 如果您在带有网络地址转换(NAT)的网络中使用客户端,或者防火墙在一定时间不活动状态后关闭 UDP 连接,则设置持久的间隔(以秒为单位)。在这个间隔中,客户端向服务器发送一个保留数据包。
      5. 应用
  7. IPv4 Settings 选项卡中:

    1. Method 列表中选择 Manual
    2. 单击 Add 以进入隧道 IPv4 地址和子网掩码。
    3. 如果要通过隧道路由所有流量,请在 Gateway 字段中设置服务器的隧道 IPv4 地址。否则,将字段留空。
  8. IPv6 设置 选项卡中:

    1. Method 列表中选择 Manual
    2. 单击 Add 以进入隧道 IPv6 地址和子网掩码。
    3. 如果要通过隧道路由所有流量,请在 Gateway 字段中设置服务器的隧道 IPv6 地址。否则,将字段留空。
  9. Save 存储连接配置集。

验证

  1. Ping 服务器的 IP 地址:

    # ping 192.0.2.1
    # ping6 2001:db8:1::1
  2. 显示 wg0 设备的接口配置:

    # wg show wg0
    interface: wg0
      public key: bnwfQcC8/g2i4vvEqcRUM2e6Hi3Nskk6G9t4r26nFVM=
      private key: (hidden)
      listening port: 51820
    
    peer: UtjqCJ57DeAscYKRfp7cFGiQqdONRn69u249Fa4O6BE=
      endpoint: server.example.com:51820
      allowed ips: 192.0.2.1/32, 2001:db8:1::1/128
      latest handshake: 1 minute, 41 seconds ago
      transfer: 824 B received, 1.01 KiB sent
      persistent keepalive: every 20 seconds

    要在输出中显示私钥,请使用 WG_HIDE_KEYS=never wg 显示 wg0 命令。

    请注意,如果已经通过 VPN 隧道发送流量,输出只会包含 latest handshaketransfer 条目。

  3. 显示 wg0 设备的 IP 配置:

    # ip address show wg0
    10: wg0: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1420 qdisc noqueue state UNKNOWN group default qlen 1000
        link/none
        inet 192.0.2.2/24 brd 192.0.2.255 scope global noprefixroute wg0
           valid_lft forever preferred_lft forever
        inet6 2001:db8:1::2/32 scope global noprefixroute
           valid_lft forever preferred_lft forever
        inet6 fe80::73d9:6f51:ea6f:863e/64 scope link noprefixroute
           valid_lft forever preferred_lft forever

其他资源

  • wg(8) man page

13.14. 使用 wg-quick 服务配置 WireGuard 客户端

您可以通过在 /etc/wireguard/ 目录中创建配置文件来配置 WireGuard 客户端。使用此方法独立于 NetworkManager 配置服务。

此流程假设以下设置:

  • Client:

    • Private key: aPUcp5vHz8yMLrzk8SsDyYnV33IhE/k20e52iKJFV0A=
    • 隧道 IPv4 地址: 192.0.2.2/24
    • Tunnel IPv6 address: 2001:db8:1::2/32
  • server:

    • Public key: UtjqCJ57DeAscYKRfp7cFGiQqdONRn69u249Fa4O6BE=
    • Tunnel IPv4 address: 192.0.2.1/24
    • Tunnel IPv6 address: 2001:db8:1::1/32

先决条件

  • 您已为服务器和客户端生成了公钥和私钥。
  • 您知道以下信息:

    • 客户端的私钥
    • 客户端的静态隧道 IP 地址和子网掩码
    • 服务器的公钥
    • 服务器的静态隧道 IP 地址和子网掩码

步骤

  1. 安装 wireguard-tools 软件包:

    # dnf install wireguard-tools
  2. 使用以下内容创建 /etc/wireguard/wg0.conf 文件:

    [Interface]
    Address = 192.0.2.2/24, 2001:db8:1::2/32
    PrivateKey = aPUcp5vHz8yMLrzk8SsDyYnV33IhE/k20e52iKJFV0A=
    
    [Peer]
    PublicKey = UtjqCJ57DeAscYKRfp7cFGiQqdONRn69u249Fa4O6BE=
    AllowedIPs = 192.0.2.1, 2001:db8:1::1
    Endpoint = server.example.com:51820
    PersistentKeepalive = 20
    • [Interface] 部分描述了客户端上接口的 WireGuard 设置:

      • Address :以逗号分隔的客户端隧道 IP 地址列表。
      • PrivateKey :客户端的私钥。
    • [Peer] 部分描述了服务器的设置:

      • PublicKey :服务器的公钥.
      • AllowedIPs :允许向这个客户端发送数据的 IP 地址。例如,将参数设置为:

        • 服务器隧道 IP 地址,以仅允许服务器与此客户端通信。上例中的值可配置这种情况。
        • 0.0.0.0/0, ::/0 以允许任何远程 IPv4 和 IPv6 地址与此客户端通信。使用此设置通过隧道路由所有流量,并使用 WireGuard 服务器作为默认网关。
      • Endpoint :设置服务器的主机名或 IP 地址以及服务器的端口。客户端使用此信息来建立连接。
      • 可选的 persistent-keepalive 参数定义一个 WireGuard 发送 keepalive 数据包到服务器的间隔(以秒为单位)。如果您在网络中使用具有网络地址转换(NAT)的客户端,或者防火墙在一段时间不活跃后关闭 UDP 连接,则设置此参数。
  3. 启用并启动 WireGuard 连接:

    # systemctl enable --now wg-quick@wg0

    systemd 实例名称必须与 /etc/wireguard/ 目录中的配置文件的名称匹配(没有 .conf 后缀)。该服务还会将这个名称用于虚拟网络接口。

验证

  1. Ping 服务器的 IP 地址:

    # ping 192.0.2.1
    # ping6 2001:db8:1::1
  2. 显示 wg0 设备的接口配置:

    # wg show wg0
    interface: wg0
      public key: bnwfQcC8/g2i4vvEqcRUM2e6Hi3Nskk6G9t4r26nFVM=
      private key: (hidden)
      listening port: 51820
    
    peer: UtjqCJ57DeAscYKRfp7cFGiQqdONRn69u249Fa4O6BE=
      endpoint: server.example.com:51820
      allowed ips: 192.0.2.1/32, 2001:db8:1::1/128
      latest handshake: 1 minute, 41 seconds ago
      transfer: 824 B received, 1.01 KiB sent
      persistent keepalive: every 20 seconds

    要在输出中显示私钥,请使用 WG_HIDE_KEYS=never wg 显示 wg0 命令。

    请注意,如果已经通过 VPN 隧道发送流量,输出只会包含 latest handshaketransfer 条目。

  3. 显示 wg0 设备的 IP 配置:

    # ip address show wg0
    10: wg0: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1420 qdisc noqueue state UNKNOWN group default qlen 1000
        link/none
        inet 192.0.2.2/24 scope global wg0
           valid_lft forever preferred_lft forever
        inet6 2001:db8:1::2/32__ scope global
           valid_lft forever preferred_lft forever

其他资源

  • wg(8) man page
  • wg-quick(8) man page

第 14 章 配置 VPN 连接

这部分论述了如何配置虚拟专用网络(VPN)连接。

VPN 是通过互联网连接到本地网络的一种方式。Libreswan 提供的 IPsec 是创建 VPN 的首选方法。libreswan 是 VPN 的用户空间 IPsec 实现。VPN 通过在中间网络(比如互联网)设置隧道,启用 LAN 和另一个远程 LAN 之间的通信。为了安全起见,VPN 隧道总是使用认证和加密。对于加密操作,Libreswan 使用 NSS 库。

14.1. 使用 control-center 配置 VPN 连接

这个步骤描述了如何使用 control-center 配置 VPN 连接。

先决条件

  • 已安装 NetworkManager-libreswan-gnome 软件包。

步骤

  1. Super 键,键入 Settings,然后按 Enter 键打开 control-center 应用程序。
  2. 选择左侧的 Network 条目。
  3. + 图标。
  4. 选择 VPN
  5. 选择 Identity 菜单项来查看基本配置选项:

    General

    Gateway - 远程 VPN 网关的名称或 IP 地址。

    认证

    类型

    • IKEv2(Certificate)- 客户端通过证书进行身份验证。它更安全(默认)。
    • IKEv1(XAUTH) - 客户端通过用户名和密码或预共享密钥(PSK)进行身份验证。

      以下配置设置位于 高级 部分:

      图 14.1. VPN 连接的高级选项

      网络 vpn 高级选项
      警告

      当使用 gnome-control-center 应用程序配置基于 IPsec 的 VPN 连接时,高级 对话框会显示配置,但它不允许任何更改。因此,用户无法更改任何高级 IPsec 选项。使用 nm-connection-editornmcli 工具来配置高级属性。

      身份识别

    • - 如果需要,输入域名。

      安全性

    • Phase1 Algorithms - 对应于 ike Libreswan 参数 - 输入用来验证和设置加密频道的算法。
    • Phase2 Algorithms - 对应于 esp Libreswan 参数 - 输入用于 IPsec 协商的算法。

      选择 Disable PFS 字段来关闭 Perfect Forward Secrecy(PFS),以确保与不支持 PFS 的旧服务器兼容。

    • Phase1 Lifetime - 对应于 ikelifetime Libreswan 参数 - 用于加密流量的密钥的有效期。
    • Phase2 Lifetime - 对应于 salifetime Libreswan 参数 - 在过期前连接的特定实例应多久。

      注意:为了安全起见,加密密钥应该不时地更改。

    • Remote network - 对应于 rightsubnet Libreswan 参数 - 应该通过 VPN 访问的目标专用远程网络。

      检查 缩减 字段以启用缩小字段。请注意,它只在 IKEv2 协商中有效。

    • Enable fragmentation - 对应于 fragmentation Libreswan 参数 - 是否允许 IKE 分段。有效值为 yes (默认)或 no
    • Enable Mobike - 对应于 mobike Libreswan 参数 - 是否允许 Mobility and Multihoming Protocol(MOBIKE、RFC 4555)启用连接来迁移其端点,而无需从头开始重启连接。这可用于在有线、无线或者移动数据连接之间进行切换的移动设备。值为 no (默认)或 yes
  6. 选择 IPv4 菜单条目:

    IPv4 方法

    • 自动(DHCP) - 如果您要连接的网络使用 DHCP 服务器来分配动态 IP 地址,请选择此选项。
    • Link-Local Only - 如果您要连接的网络没有 DHCP 服务器且您不想手动分配 IP 地址,请选择这个选项。随机地址将根据 RFC 3927 分配,带有前缀 169.254/16
    • 手动 - 如果您要手动分配 IP 地址,请选择这个选项。
    • Disable - 在这个连接中禁用 IPv4

      DNS

      DNS 部分,当 AutomaticON 时,将其切换到 OFF 以进入您要用逗号分开的 DNS 服务器的 IP 地址。

      Routes

      请注意,在 Routes 部分,当 AutomaticON 时,会使用 DHCP 的路由,但您也可以添加额外的静态路由。当 OFF 时,只使用静态路由。

    • Address - 输入远程网络或主机的 IP 地址。
    • Netmask - 以上输入的 IP 地址的子网掩码或前缀长度。
    • Gateway - 上面输入的远程网络或主机的网关的 IP 地址。
    • Metric - 网络成本,赋予此路由的首选值。数值越低,优先级越高。

      仅将此连接用于其网络上的资源

      选择这个复选框以防止连接成为默认路由。选择这个选项意味着只有特别用于路由的流量才会通过连接自动获得,或者手动输入到连接上。

  7. 要在 VPN 连接中配置 IPv6 设置,请选择 IPv6 菜单条目:

    IPv6 Method

    • Automatic - 选择这个选项使用 IPv6 Stateless Address AutoConfiguration(SLAAC)根据硬件地址和路由器公告(RA)创建自动的、无状态的配置。
    • Automatic, DHCP only - 选择这个选项以不使用 RA,但从 DHCPv6 请求信息以创建有状态的配置。
    • Link-Local Only - 如果您要连接的网络没有 DHCP 服务器且您不想手动分配 IP 地址,请选择这个选项。随机地址将根据 RFC 4862 分配,前缀为 FE80::0
    • 手动 - 如果您要手动分配 IP 地址,请选择这个选项。
    • Disable - 在这个连接中禁用 IPv6

      请注意,DNS, Routes, Use this connection only for resources on its network 项是 IPv4 的常规设置。

  8. 编辑完 VPN 连接后,点添加按钮自定义配置或应用按钮为现有配置保存它。
  9. 将配置集切换为 ON 以激活 VPN 连接。

其他资源

  • nm-settings-libreswan(5)

14.2. 使用 nm-connection-editor 配置 VPN 连接

这个步骤描述了如何使用 nm-connection-editor 配置 VPN 连接。

先决条件

  • 已安装 NetworkManager-libreswan-gnome 软件包。
  • 如果您配置了互联网密钥交换版本 2(IKEv2)连接:

    • 证书导入到 IPsec 网络安全服务(NSS)数据库中。
    • NSS 数据库中的证书 nickname 是已知的。

流程

  1. 打开终端窗口,输入:

    $ nm-connection-editor
  2. + 按钮添加新连接。
  3. 选择 基于 IPsec 的 VPN 连接类型,然后点 Create
  4. VPN 标签页中:

    1. Gateway 字段中输入 VPN 网关的主机名或 IP 地址,然后选择验证类型。根据验证类型,您必须输入不同的附加信息:

      • IKEv2(认证) 使用证书验证客户端,这会更安全。这个设置需要在 IPsec NSS 数据库中指定证书的 nickname
      • IKEv1(XAUTH) 使用用户名和密码(预共享密钥)验证用户身份。此设置要求您输入以下值:

        • 用户名
        • 密码
        • 组名称
        • Secret
    2. 如果远程服务器为 IKE 交换指定本地标识符,在 Remote ID 字段中输入具体字符串。在运行 Libreswan 的远程服务器中,这个值在服务器的 leftid 参数中设置。

      nm connection editor vpn tab

    3. (可选)点击高级按钮配置附加设置。您可以配置以下设置:

      • 身份识别

        • - 如果需要,请输入域名。
      • 安全性

        • Phase1 Algorithms 对应于 ike Libreswan 参数。输入用来验证和设置加密频道的算法。
        • Phase2 Algorithms 对应于 esp Libreswan 参数。输入用于 IPsec 协商的算法。

          选择 Disable PFS 字段来关闭 Perfect Forward Secrecy(PFS),以确保与不支持 PFS 的旧服务器兼容。

        • Phase1 Lifetimeikelifetime Libreswan 参数对应。此参数定义用于加密流量的密钥的有效期。
        • Phase2 Lifetimesalifetime Libreswan 参数对应。这个参数定义安全关联有效期。
      • 连接性

        • 远程网络rightsubnet Libreswan 参数对应,并定义应通过 VPN 访问的目标专用远程网络。

          检查 缩减 字段以启用缩小字段。请注意,它只在 IKEv2 协商中有效。

        • Enable fragmentationsegmentation Libreswan 参数对应,并定义是否允许 IKE 分段。有效值为 yes (默认)或 no
        • Enable Mobikemobike 参数对应。参数定义是否允许移动和多功能协议(MOBIKE)(RFC 4555)启用连接来迁移其端点而无需从头开始重启连接。这可用于在有线、无线或者移动数据连接之间进行切换的移动设备。值为 no (默认)或 yes
  5. IPv4 Settings 选项卡中,选择 IP 分配方法,并可选择设置额外的静态地址、DNS 服务器、搜索域和路由。

    IPsec IPv4 tab

  6. 保存连接。
  7. 关闭 nm-connection-editor
注意

当您点 + 按钮添加新连接时, NetworkManager 会为那个连接创建新配置文件,然后打开同一个对话框来编辑现有连接。这两个对话框之间的区别在于现有连接配置集有详情菜单条目。

其他资源

  • nm-settings-libreswan(5) man page

14.3. 配置自动检测和使用 ESP 硬件卸载以加快 IPsec 连接

将安全 Payload(ESP)卸载卸载到硬件加速了通过以太网的 IPsec 连接。默认情况下,Libreswan 会检测硬件是否支持此功能,因此启用 ESP 硬件卸载。这个步骤描述了如何在禁用或显式启用该功能时启用自动检测。

先决条件

  • 网卡支持 ESP 硬件卸载。
  • 网络驱动程序支持 ESP 硬件卸载。
  • IPsec 连接已配置且可以正常工作。

步骤

  1. 编辑连接的 /etc/ipsec.d/ 目录中的 Libreswan 配置文件,它应使用自动检测 ESP 硬件卸载支持。
  2. 确保在连接设置中没有设置 nic-offload 参数。
  3. 如果您删除了 nic-offload,重启 ipsec 服务:

    # systemctl restart ipsec

验证

如果网卡支持 ESP 硬件卸载支持,请按照以下步骤验证结果:

  1. 显示 IPsec 连接使用的以太网设备的 tx_ipsecrx_ipsec 计数器:

    # ethtool -S enp1s0 | egrep "_ipsec"
         tx_ipsec: 10
         rx_ipsec: 10
  2. 通过 IPsec 隧道发送流量。例如,ping 远程 IP 地址:

    # ping -c 5 remote_ip_address
  3. 再次显示以太网设备的 tx_ipsecrx_ipsec 计数器:

    # ethtool -S enp1s0 | egrep "_ipsec"
         tx_ipsec: 15
         rx_ipsec: 15

    如果计数器值增加了,ESP 硬件卸载正常工作。

14.4. 在绑定中配置 ESP 硬件卸载以加快 IPsec 连接

将封装安全负载(ESP)卸载到硬件可加速 IPsec 连接。如果出于故障转移原因而使用网络绑定,配置 ESP 硬件卸载的要求和流程与使用常规以太网设备的要求和流程不同。例如,在这种情况下,您可以对绑定启用卸载支持,内核会将设置应用到绑定的端口。

先决条件

  • 绑定中的所有网卡都支持 ESP 硬件卸载。
  • 网络驱动程序支持对绑定设备的 ESP 硬件卸载。在 RHEL 中,只有 ixgbe 驱动程序支持此功能。
  • 绑定已配置且可以正常工作。
  • 该绑定使用 active-backup 模式。绑定驱动程序不支持此功能的任何其他模式。
  • IPsec 连接已配置且可以正常工作。

步骤

  1. 对网络绑定启用 ESP 硬件卸载支持:

    # nmcli connection modify bond0 ethtool.feature-esp-hw-offload on

    这个命令在对 bond0 连接启用 ESP 硬件卸载支持。

  2. 重新激活 bond0 连接:

    # nmcli connection up bond0
  3. 编辑应使用 ESP 硬件卸载的连接的 /etc/ipsec.d/ 目录中的 Libreswan 配置文件,并将 nic-offload=yes 语句附加到连接条目:

    conn example
        ...
        nic-offload=yes
  4. 重启 ipsec 服务:

    # systemctl restart ipsec

验证

  1. 显示绑定的活动端口:

    # grep "Currently Active Slave" /proc/net/bonding/bond0
    Currently Active Slave: enp1s0
  2. 显示活动端口的 tx_ipsecrx_ipsec 计数器:

    # ethtool -S enp1s0 | egrep "_ipsec"
         tx_ipsec: 10
         rx_ipsec: 10
  3. 通过 IPsec 隧道发送流量。例如,ping 远程 IP 地址:

    # ping -c 5 remote_ip_address
  4. 再次显示活动端口的 tx_ipsecrx_ipsec 计数器:

    # ethtool -S enp1s0 | egrep "_ipsec"
         tx_ipsec: 15
         rx_ipsec: 15

    如果计数器值增加了,ESP 硬件卸载正常工作。

其他资源

第 15 章 配置 IP 隧道

与 VPN 类似,IP 隧道通过网络(如互联网)直接连接两个网络。然而,不是所有的隧道协议都支持加密。

两个建立隧道网络的路由器至少需要两个接口:

  • 一个连接到本地网络的接口
  • 一个连接到建立隧道的网络的接口。

要建立隧道,您可以在两个路由器中使用来自远程子网的 IP 地址创建一个虚拟接口。

NetworkManager 支持以下 IP 隧道:

  • 通用路由封装(GRE)
  • IPv6 上的通用路由封装(IP6GRE)
  • 通用路由封装终端接入点(GRETAP)
  • 通用路由登录在 IPv6(IP6GRETAP)上
  • IPv4 over IPv4(IPIP)
  • IPv4 over IPv6(IPIP6)
  • IPv6 over IPv6(IP6IP6)
  • 简单的互联网转换(SIT)

根据类型,这些通道在 Open Systems Interconnection(OSI)的第 2 层或 3 层动作。

15.1. 使用 nmcli 配置 IPIP 隧道来封装 IPv4 数据包中的 IPv4 流量

IP over IP(IPIP)隧道在 OSI 层 3 上运行,并封装 IPv4 数据包中的 IPv4 流量,如 RFC 2003 所述

重要

通过 IPIP 隧道发送的数据没有加密。出于安全考虑,只在已经加密的数据中使用隧道,比如 HTTPS。

请注意,IPIP 隧道只支持单播数据包。如果您需要支持多播的 IPv4 隧道,请参阅使用 nmcli 配置 GRE 隧道来封装 IPv4 数据包中的第 3 层流量

此流程描述了如何在两个 RHEL 路由器之间创建 IPIP 隧道以通过互联网连接两个内部子网,如下图所示:

IPIP 隧道

先决条件

  • 每个 RHEL 路由器都有一个网络接口,它连接到其本地子网。
  • 每个 RHEL 路由器都有一个网络接口,它连接到互联网。
  • 您需要通过隧道发送的流量是 IPv4 单播。

流程

  1. 在网络 A 的 RHEL 路由器上:

    1. 创建名为 tun0 的 IPIP 隧道接口:

      # nmcli connection add type ip-tunnel ip-tunnel.mode ipip con-name tun0 ifname tun0 remote 198.51.100.5 local 203.0.113.10

      remotelocal 参数设置远程和本地路由器的公共 IP 地址。

    2. 将 IPv4 地址设为 tun0 设备:

      # nmcli connection modify tun0 ipv4.addresses '10.0.1.1/30'

      请注意,具有两个可用 IP 地址的 /30 子网足以满足隧道的需要。

    3. 配置 tun0 连接以使用手动 IPv4 配置:

      # nmcli connection modify tun0 ipv4.method manual
    4. 添加一个静态路由,其将到 172.16.0.0/24 网络的流量路由到路由器 B 上的隧道 IP:

      # nmcli connection modify tun0 +ipv4.routes "172.16.0.0/24 10.0.1.2"
    5. 启用 tun0 连接。

      # nmcli connection up tun0
    6. 启用数据包转发:

      # echo "net.ipv4.ip_forward=1" > /etc/sysctl.d/95-IPv4-forwarding.conf
      # sysctl -p /etc/sysctl.d/95-IPv4-forwarding.conf
  2. 在网络 B 中的 RHEL 路由器中:

    1. 创建名为 tun0 的 IPIP 隧道接口:

      # nmcli connection add type ip-tunnel ip-tunnel.mode ipip con-name tun0 ifname tun0 remote 203.0.113.10 local 198.51.100.5

      remotelocal 参数设置远程和本地路由器的公共 IP 地址。

    2. 将 IPv4 地址设为 tun0 设备:

      # nmcli connection modify tun0 ipv4.addresses '10.0.1.2/30'
    3. 配置 tun0 连接以使用手动 IPv4 配置:

      # nmcli connection modify tun0 ipv4.method manual
    4. 添加一个静态路由,将路由到 192.0.2.0/24 网络的流量路由到路由器 A 上的隧道 IP:

      # nmcli connection modify tun0 +ipv4.routes "192.0.2.0/24 10.0.1.1"
    5. 启用 tun0 连接。

      # nmcli connection up tun0
    6. 启用数据包转发:

      # echo "net.ipv4.ip_forward=1" > /etc/sysctl.d/95-IPv4-forwarding.conf
      # sysctl -p /etc/sysctl.d/95-IPv4-forwarding.conf

验证步骤

  • 从每个 RHEL 路由器中,ping 路由器的内部接口的 IP 地址:

    1. 在路由器 A 上,ping 172.16.0.1:

      # ping 172.16.0.1
    2. 在路由器 B 上,ping 192.0.2.1

      # ping 192.0.2.1

其他资源

  • nmcli man page
  • nm-settings(5) 书册页中的 ip-tunnel 设置 部分

15.2. 使用 nmcli 配置 GRE 隧道来封装 IPv4 数据包中的层 3 流量

Generic Routing Encapsulation(GRE)隧道封装 IPv4 数据包中的第 3 层流量,如 RFC 2784 所述。GRE 隧道可以使用有效的以太网类型封装任何第 3 层协议。

重要

通过 GRE 隧道发送的数据没有加密。出于安全考虑,只在已经加密的数据中使用隧道,比如 HTTPS。

此流程描述了如何在两个 RHEL 路由器之间创建 GRE 隧道以通过互联网连接两个内部子网,如下图所示:

GRE 隧道
注意

保留 gre0 设备名称。对该设备使用 gre1 或者不同的名称。

先决条件

  • 每个 RHEL 路由器都有一个网络接口,它连接到其本地子网。
  • 每个 RHEL 路由器都有一个网络接口,它连接到互联网。

流程

  1. 在网络 A 的 RHEL 路由器上:

    1. 创建名为 gre1 的 GRE 隧道接口:

      # nmcli connection add type ip-tunnel ip-tunnel.mode gre con-name gre1 ifname gre1 remote 198.51.100.5 local 203.0.113.10

      remotelocal 参数设置远程和本地路由器的公共 IP 地址。

    2. 将 IPv4 地址设为 gre1 设备:

      # nmcli connection modify gre1 ipv4.addresses '10.0.1.1/30'

      请注意,具有两个可用 IP 地址的 /30 子网足以满足隧道的需要。

    3. 配置 gre1 连接以使用手动 IPv4 配置:

      # nmcli connection modify gre1 ipv4.method manual
    4. 添加一个静态路由,其将到 172.16.0.0/24 网络的流量路由到路由器 B 上的隧道 IP:

      # nmcli connection modify gre1 +ipv4.routes "172.16.0.0/24 10.0.1.2"
    5. 启用 gre1 连接。

      # nmcli connection up gre1
    6. 启用数据包转发:

      # echo "net.ipv4.ip_forward=1" > /etc/sysctl.d/95-IPv4-forwarding.conf
      # sysctl -p /etc/sysctl.d/95-IPv4-forwarding.conf
  2. 在网络 B 中的 RHEL 路由器中:

    1. 创建名为 gre1 的 GRE 隧道接口:

      # nmcli connection add type ip-tunnel ip-tunnel.mode gre con-name gre1 ifname gre1 remote 203.0.113.10 local 198.51.100.5

      remotelocal 参数设置远程和本地路由器的公共 IP 地址。

    2. 将 IPv4 地址设为 gre1 设备:

      # nmcli connection modify gre1 ipv4.addresses '10.0.1.2/30'
    3. 配置 gre1 连接以使用手动 IPv4 配置:

      # nmcli connection modify gre1 ipv4.method manual
    4. 添加一个静态路由,将路由到 192.0.2.0/24 网络的流量路由到路由器 A 上的隧道 IP:

      # nmcli connection modify gre1 +ipv4.routes "192.0.2.0/24 10.0.1.1"
    5. 启用 gre1 连接。

      # nmcli connection up gre1
    6. 启用数据包转发:

      # echo "net.ipv4.ip_forward=1" > /etc/sysctl.d/95-IPv4-forwarding.conf
      # sysctl -p /etc/sysctl.d/95-IPv4-forwarding.conf

验证步骤

  1. 从每个 RHEL 路由器中,ping 路由器的内部接口的 IP 地址:

    1. 在路由器 A 上,ping 172.16.0.1:

      # ping 172.16.0.1
    2. 在路由器 B 上,ping 192.0.2.1

      # ping 192.0.2.1

其他资源

  • nmcli man page
  • nm-settings(5) 书册页中的 ip-tunnel 设置 部分

15.3. 配置 GRETAP 隧道来通过 IPv4 传输以太网帧

通用路由封装终端访问点(GRETAP)隧道在 OSI 级别 2 上运行,并封装 IPv4 数据包中的以太网流量,如 RFC 2784 所述。

重要

通过 GRETAP 隧道发送的数据没有加密。出于安全考虑,通过 VPN 或不同的加密连接建立隧道。

此流程描述了如何在两个 RHEL 路由器之间创建 GRETAP 隧道以使用桥接连接两个网络,如下图所示:

GRETAP 隧道
注意

保留 gretap0 设备名称。对该设备使用 gretap1 或者不同的名称。

先决条件

  • 每个 RHEL 路由器都有一个网络接口,它连接到其本地网络,接口没有分配 IP 配置。
  • 每个 RHEL 路由器都有一个网络接口,它连接到互联网。

流程

  1. 在网络 A 的 RHEL 路由器上:

    1. 创建名为 bridge0 的网桥接口:

      # nmcli connection add type bridge con-name bridge0 ifname bridge0
    2. 配置网桥的 IP 设置:

      # nmcli connection modify bridge0 ipv4.addresses '192.0.2.1/24'
      # nmcli connection modify bridge0 ipv4.method manual
    3. 为连接到本地网络的接口添加新连接配置集到网桥:

      # nmcli connection add type ethernet slave-type bridge con-name bridge0-port1 ifname enp1s0 master bridge0
    4. 为网桥添加 GRETAP 隧道接口的新连接配置集:

      # nmcli connection add type ip-tunnel ip-tunnel.mode gretap slave-type bridge con-name bridge0-port2 ifname gretap1 remote 198.51.100.5 local 203.0.113.10 master bridge0

      remotelocal 参数设置远程和本地路由器的公共 IP 地址。

    5. 可选:如果您不需要,STP(Spanning Tree Protocol):

      # nmcli connection modify bridge0 bridge.stp no

      默认情况下,STP 被启用并导致在使用连接前出现延迟。

    6. 配置激活 bridge0 连接会自动激活网桥端口:

      # nmcli connection modify bridge0 connection.autoconnect-slaves 1
    7. 激活 bridge0 连接:

      # nmcli connection up bridge0
  2. 在网络 B 中的 RHEL 路由器中:

    1. 创建名为 bridge0 的网桥接口:

      # nmcli connection add type bridge con-name bridge0 ifname bridge0
    2. 配置网桥的 IP 设置:

      # nmcli connection modify bridge0 ipv4.addresses '192.0.2.2/24'
      # nmcli connection modify bridge0 ipv4.method manual
    3. 为连接到本地网络的接口添加新连接配置集到网桥:

      # nmcli connection add type ethernet slave-type bridge con-name bridge0-port1 ifname enp1s0 master bridge0
    4. 为网桥添加 GRETAP 隧道接口的新连接配置集:

      # nmcli connection add type ip-tunnel ip-tunnel.mode gretap slave-type bridge con-name bridge0-port2 ifname gretap1 remote 203.0.113.10 local 198.51.100.5 master bridge0

      remotelocal 参数设置远程和本地路由器的公共 IP 地址。

    5. 可选:如果您不需要,STP(Spanning Tree Protocol):

      # nmcli connection modify bridge0 bridge.stp no
    6. 配置激活 bridge0 连接会自动激活网桥端口:

      # nmcli connection modify bridge0 connection.autoconnect-slaves 1
    7. 激活 bridge0 连接:

      # nmcli connection up bridge0

验证步骤

  1. 在两个路由器上,验证 enp1s0gretap1 连接是否已连接,并且 CONNECTION 列显示端口的连接名称:

    # nmcli device
    nmcli device
    DEVICE   TYPE      STATE      CONNECTION
    ...
    bridge0  bridge    connected  bridge0
    enp1s0   ethernet  connected  bridge0-port1
    gretap1  iptunnel  connected  bridge0-port2
  2. 从每个 RHEL 路由器中,ping 路由器的内部接口的 IP 地址:

    1. 在路由器 A 上,ping 192.0.2.2

      # ping 192.0.2.2
    2. 在路由器 B 上,ping 192.0.2.1

      # ping 192.0.2.1

其他资源

  • nmcli man page
  • nm-settings(5) 书册页中的 ip-tunnel 设置 部分

15.4. 其他资源

  • ip-link(8) man page

第 16 章 端口镜像

网络管理员可以使用端口镜像将入站和出站网络流量从一个网络设备传输到另一个网络设备。管理员使用端口镜像来监控网络流量并收集网络流量以:

  • 调试网络问题并调整网络流
  • 检查和分析网络流量以对网络问题进行故障排除
  • 检测入侵

16.1. 使用 nmcli 对网络接口进行镜像(mirror)

您可以使用 NetworkManager 配置端口镜像。以下流程通过将流量控制(tc)规则和过滤器添加到 enp1s0,将网络流量从 enp1s0 镜像到 enp7s0 网络接口。

先决条件

  • 将网络流量镜像到的网络接口。

步骤

  1. 添加您要镜像网络流量的网络连接配置集:

    # nmcli connection add type ethernet ifname enp1s0 con-name enp1s0 autoconnect no
  2. prio qdisc 附加到带有 10: handle 的出口(传出)流量的 enp1s0

    # nmcli connection modify enp1s0 +tc.qdisc "root prio handle 10:"

    在没有子项的情况下附加 prio qdisc 可让附加过滤器。

  3. 为入口流量添加 qdisc,使用 ffff: handle 添加 qdisc:

    # nmcli connection modify enp1s0 +tc.qdisc "ingress handle ffff:"
  4. 添加以下过滤器,以匹配入口和出口 qdiscs 上的数据包,并将其镜像到 enp7s0

    # nmcli connection modify enp1s0 +tc.tfilter "parent ffff: matchall action mirred egress mirror dev enp7s0"
    
    # nmcli connection modify enp1s0 +tc.tfilter "parent 10: matchall action mirred egress mirror dev enp7s0"

    matchall 过滤器与所有数据包匹配,mirred 操作会将数据包重定向到目的地。

  5. 激活连接:

    # nmcli connection up enp1s0

验证步骤

  1. 安装 tcpdump 实用程序:

    # dnf install tcpdump
  2. 显示目标设备上镜像的流量(enp7s0):

    # tcpdump -i enp7s0

第 17 章 配置网络设备以接受来自所有 MAC 地址的流量

网络设备通常截获并读取其控制器被编程为接收的数据包。您可以配置网络设备,以接受来自虚拟交换机或端口组级别所有 MAC 地址的流量。

您可以使用这个网络模式:

  • 诊断网络连接问题,
  • 出于安全考虑,监控网络活动,
  • 截获网络中的私有数据转换或入侵。

本节论述了如何将网络设备配置为使用 iproute2nmclinmstatectl 工具接受来自所有 MAC 地址的流量。除 InfiniBand 外,您可以为任何类型的网络设备启用此模式。

17.1. 临时配置网络设备,以使用 iproute2 接受所有流量

这个步骤描述了如何配置网络设备以接受所有流量,而不考虑 MAC 地址。使用 iproute2 工具所做的任何更改都是暂时的,并在机器重启后丢失。

步骤

  1. 可选:显示要识别要接收所有流量的网络接口:

    # ip a
    1: enp1s0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc fq_codel state DOWN group default qlen 1000
        link/ether 98:fa:9b:a4:34:09 brd ff:ff:ff:ff:ff:ff
    2: bond0: <NO-CARRIER,BROADCAST,MULTICAST,MASTER,UP> mtu 1500 qdisc noqueue state DOWN group default qlen 1000
        link/ether 6a:fd:16:b0:83:5c brd ff:ff:ff:ff:ff:ff
    3: wlp1s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    ...
  2. 修改设备以启用或禁用此属性。

    • enp1s0 启用 accept-all-mac-addresses 模式:

      # ip link set enp1s0 promisc on
    • enp1s0 禁用 accept-all-mac-addresses 模式:

      # ip link set enp1s0 promisc off

验证步骤

  • 验证 accept-all-mac-addresses 模式是否已启用:

    # ip link show enp1s0
    1: enp1s0: <NO-CARRIER,BROADCAST,MULTICAST,PROMISC,UP> mtu 1500 qdisc fq_codel state DOWN mode DEFAULT group default qlen 1000
        link/ether 98:fa:9b:a4:34:09 brd ff:ff:ff:ff:ff:ff

设备描述中的 PROMISC 标志表示启用了该模式。

17.2. 使用 nmcli 永久配置网络设备以接受所有流量

这个步骤描述了如何使用 nmcli 命令配置网络设备以接受流量,而无论 MAC 地址是什么。

步骤

  1. 可选:显示要识别要接收所有流量的网络接口:

    # ip a
    1: enp1s0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc fq_codel state DOWN group default qlen 1000
        link/ether 98:fa:9b:a4:34:09 brd ff:ff:ff:ff:ff:ff
    2: bond0: <NO-CARRIER,BROADCAST,MULTICAST,MASTER,UP> mtu 1500 qdisc noqueue state DOWN group default qlen 1000
        link/ether 6a:fd:16:b0:83:5c brd ff:ff:ff:ff:ff:ff
    3: wlp1s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    ...

    如果没有任何连接,可以创建新连接。

  2. 修改网络设备以启用或禁用此属性。

    • enp1s0 启用 ethernet.accept-all-mac-addresses 模式:

      # nmcli connection modify enp1s0 ethernet.accept-all-mac-addresses yes
    • enp1s0 禁用 accept-all-mac-addresses 模式:

      # nmcli connection modify enp1s0 ethernet.accept-all-mac-addresses no
  3. 要应用这些更改,请重新激活连接:

    # nmcli connection up enp1s0

验证步骤

  • 验证 ethernet.accept-all-mac-addresses 模式是否已启用:

    # nmcli connection show enp1s0
    ...
    802-3-ethernet.accept-all-mac-addresses:1     (true)

802-3-ethernet.accept-all-mac-addresses: true 表示已启用该模式。

17.3. 使用 nmstatectl 永久配置网络网络设备以接受所有流量

这个流程描述了如何使用 nmstatectl 工具配置网络设备来接受所有流量,而不考虑 MAC 地址。

先决条件

  • 已安装 nmstate 软件包。
  • 您用来配置该设备的 .yml 文件可用。

步骤

  1. 编辑 enp1s0 连接的 enp1s0.yml 文件,并在其中添加以下内容:

    ---
    interfaces:
      - name: enp1s0
        type: ethernet
        state: up
        accept -all-mac-address: true
  2. 应用网络设置。

    # nmstatectl apply ~/enp1s0.yml

验证步骤

  • 验证是否启用了 802-3-ethernet.accept-all-mac-addresses 模式:

    # nmstatectl show enp1s0
    interfaces:
      - name: enp1s0
        type: ethernet
        state: up
        accept-all-mac-addresses:     true
    ...

802-3-ethernet.accept-all-mac-addresses: true 表示已启用该模式。

其他资源

  • 有关 nmstatectl 的详情,请查看 nmstatectl(8) 手册页。
  • 有关更多的配置示例,请参阅 /usr/share/doc/nmstate/examples/ 目录。

第 18 章 使用带有 FreeRADIUS 后端的主机apd 为 LAN 客户端设置 802.1x 网络身份验证服务

IEEE 802.1X 标准定义了安全身份验证和授权方法,以保护网络不受未授权的客户端的影响。使用 hostapd 服务和 FreeRADIUS,您可以在网络中提供网络访问控制(NAC)。

在本文档中,RHEL 主机充当一个网桥,用于将不同客户端与现有网络连接。但是,RHEL 主机只授予验证客户端对网络的访问权限。

RHEL authenticator 802 1x

18.1. 先决条件

  • 完全安装 FreeRADIUS.

    如果已安装 freeradius 软件包,删除 /etc/raddb/ 目录,卸载,然后再次安装该软件包。不要使用 dnf reinstall 命令重新安装软件包,因为 /etc/raddb/ 目录中的权限和符号链接会不同。

18.2. 在 authenticator 中设置桥接

网桥是一个链路层设备,它根据 MAC 地址表转发主机和网络之间的流量。如果将 RHEL 设置为 802.1X authenticator,请将要在其上执行身份验证和 LAN 接口的接口添加到网桥。

先决条件

  • 服务器有多个以太网接口。

步骤

  1. 创建网桥接口:

    # nmcli connection add type bridge con-name br0 ifname br0
  2. 为网桥分配以太网接口:

    # nmcli connection add type ethernet slave-type bridge con-name br0-port1 ifname enp1s0 master br0
    # nmcli connection add type ethernet slave-type bridge con-name br0-port2 ifname enp7s0 master br0
    # nmcli connection add type ethernet slave-type bridge con-name br0-port3 ifname enp8s0 master br0
    # nmcli connection add type ethernet slave-type bridge con-name br0-port4 ifname enp9s0 master br0
  3. 启用网桥通过 LAN(EAPOL)数据包转发可扩展验证协议:

    # nmcli connection modify br0 group-forward-mask 8
  4. 配置连接以自动激活端口:

    # nmcli connection modify br0 connection.autoconnect-slaves 1
  5. 激活连接:

    # nmcli connection up br0

验证

  1. 显示作为特定网桥端口的以太网设备的链接状态:

    # ip link show master br0
    3: enp1s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel master br0 state UP mode DEFAULT group default qlen 1000
        link/ether 52:54:00:62:61:0e brd ff:ff:ff:ff:ff:ff
    ...
  2. 验证 br0 设备上是否启用了 EAPOL 数据包的转发:

    # cat /sys/class/net/br0/bridge/group_fwd_mask
    0x8

    如果命令返回 0x8,则启用转发。

其他资源

  • nm-settings(5) man page

18.3. FreeRADIUS 的证书要求

对于安全的 FreeRADIUS 服务,您需要 TLS 证书来满足不同的目的:

  • 用于加密到服务器的连接的 TLS 服务器证书。使用可信证书颁发机构(CA)发布证书。

    服务器证书要求将扩展密钥使用(EKU)字段设为 TLS Web 服务器身份验证

  • 由同一 CA 发布的客户端证书,用于扩展身份验证协议传输层安全(EAP-TLS)。EAP-TLS 提供基于证书的身份验证,并默认启用。

    客户端证书需要其 EKU 字段设置为 TLS Web 客户端身份验证

警告

要安全连接,请使用您公司的 CA 或创建自己的 CA 为 FreeRADIUS 发布证书。如果使用公共 CA,您可以允许用户验证用户并为 EAP-TLS 发布客户端证书。

18.4. 在 FreeRADIUS 服务器上创建一组证书用于测试

出于测试目的,freeradius 软件包会在 /etc/raddb/certs/ 目录中安装脚本和配置文件,以创建您自己的证书颁发机构(CA)和问题证书。

重要

如果您使用默认配置,这些脚本生成的证书会在 60 天后过期,密钥使用不安全的密码("whatever")。但是,您可以自定义 CA、服务器和客户端配置。

执行此步骤后,会创建本文档稍后需要的以下文件:

  • /etc/raddb/certs/ca.pem: CA 证书
  • /etc/raddb/certs/server.key: 服务器证书的私钥
  • /etc/raddb/certs/server.pem: 服务器证书
  • /etc/raddb/certs/client.key: 客户端证书的私钥
  • /etc/raddb/certs/client.pem: 客户端证书

先决条件

  • 已安装 freeradius 软件包。

步骤

  1. 进入 /etc/raddb/certs/ 目录:

    # cd /etc/raddb/certs/
  2. 可选:自定义 CA 配置:

    ...
    [ req ]
    default_bits            = 2048
    input_password          = ca_password
    output_password         = ca_password
    ...
    [certificate_authority]
    countryName             = US
    stateOrProvinceName     = North Carolina
    localityName            = Raleigh
    organizationName        = Example Inc.
    emailAddress            = admin@example.org
    commonName              = "Example Certificate Authority"
    ...
  3. 可选:自定义服务器配置:

    ...
    [ CA_default ]
    default_days            = 730
    ...
    [ req ]
    distinguished_name      = server
    default_bits            = 2048
    input_password          = key_password
    output_password         = key_password
    ...
    [server]
    countryName             = US
    stateOrProvinceName     = North Carolina
    localityName            = Raleigh
    organizationName        = Example Inc.
    emailAddress            = admin@example.org
    commonName              = "Example Server Certificate"
    ...
  4. 可选:自定义客户端配置:

    ...
    [ CA_default ]
    default_days            = 365
    ...
    [ req ]
    distinguished_name      = client
    default_bits            = 2048
    input_password          = password_on_private_key
    output_password         = password_on_private_key
    ...
    [client]
    countryName             = US
    stateOrProvinceName     = North Carolina
    localityName            = Raleigh
    organizationName        = Example Inc.
    emailAddress            = user@example.org
    commonName              = user@example.org
    ...
  5. 创建证书:

    # make all
  6. /etc/raddb/certs/server.pem 文件中的组更改为 radiusd

    # chgrp radiusd /etc/raddb/certs/server.pem*

其他资源

  • /etc/raddb/certs/README.md

18.5. 使用 EAP 配置 FreeRADIUS 以安全地验证网络客户端

FreeRADIUS 支持通过不同的扩展验证协议(EAP)的方法。但是,对于安全网络,本文档介绍了如何配置 FreeRADIUS 来支持以下安全 EAP 身份验证方法:

  • EAP-TLS(传输层安全)使用安全 TLS 连接来使用证书对客户端进行身份验证。要使用 EAP-TLS,需要每个网络客户端以及用于服务器的服务器证书。请注意,同样的证书颁发机构(CA)必须签发证书。始终使用您自己的 CA 创建证书,因为您使用的 CA 发布的所有客户端证书都可以向 FreeRADIUS 服务器进行身份验证。
  • EAP-TTLS(隧道传输层安全)使用安全 TLS 连接,并使用密码认证协议(PAP)或挑战握手身份验证协议(CHAP)等机制验证客户端。要使用 EAP-TTLS,需要一个 TLS 服务器证书。
  • EAP-PEAP(受保护的身份验证协议)使用安全 TLS 连接作为外部身份验证协议来设置隧道。验证器验证 RADIUS 服务器的证书。之后,使用 Microsoft 挑战传递验证协议版本 2(MS-CHAPv2)或其他方法的加密隧道通过加密隧道进行身份验证。
注意

默认的 FreeRADIUS 配置文件充当文档,并描述所有参数和指令。如果要禁用某些功能,请注释掉它们,而不删除配置文件中的对应部分。这可让您保留配置文件和包含的文档的结构。

先决条件

  • 已安装 freeradius 软件包。
  • /etc/raddb/ 目录中的配置文件保持不变,由 freeradius 软件包提供。
  • 服务器上存在以下文件:

    • FreeRADIUS 主机的 TLS 私钥: /etc/raddb/certs/server.key
    • FreeRADIUS 主机的 TLS 服务器证书: /etc/raddb/certs/server.pem
    • TLS CA 证书: /etc/raddb/certs/ca.pem

    如果您将文件存储在不同的位置或者它们具有不同的名称,请相应地将 private_key_filecert_fileca_file 参数设置到 /etc/raddb/mods-available/eap 文件中。

流程

  1. 如果带有 Diffie-Hellman(DH)参数的 /etc/raddb/certs/dh 不存在,则创建一个。例如,要创建带有 2048 位 prime 的 DH 文件,请输入:

    # openssl dhparam -out /etc/raddb/certs/dh 2048

    为了安全起见,请不要使用小于 2048位的 DH 文件。取决于具体位数,文件的创建可能需要几分钟。

  2. 使用 DH 参数在 TLS 私钥、服务器证书、CA 证书和密钥文件上设置安全权限:

    # chmod 640 /etc/raddb/certs/server.key /etc/raddb/certs/server.pem /etc/raddb/certs/ca.pem /etc/raddb/certs/dh
    # chown root:radiusd /etc/raddb/certs/server.key /etc/raddb/certs/server.pem /etc/raddb/certs/ca.pem /etc/raddb/certs/dh
  3. 编辑 /etc/raddb/mods-available/eap 文件:

    1. private_key_password 参数中设置私钥的密码:

      eap {
          ...
          tls-config tls-common {
              ...
              private_key_password = key_password
              ...
          }
      }
    2. 根据您的环境,将 eap 指令中的 default_eap_type 参数设置为您使用的主要 EAP 类型:

      eap {
          ...
          default_eap_type = ttls
          ...
      }

      对于安全环境,请仅使用 ttlstlspeap

    3. 注释掉 md5 指令,以禁用不安全的 EAP-MD5 身份验证方法:

      eap {
          ...
          # md5 {
          # }
          ...
      }

      请注意,在默认配置文件中,其他不安全的 EAP 身份验证方法默认被注释掉。

  4. 编辑 /etc/raddb/sites-available/default 文件,然后注释掉 eap 以外的所有身份验证方法:

    authenticate {
        ...
        # Auth-Type PAP {
        #     pap
        # }
    
        # Auth-Type CHAP {
        #     chap
        # }
    
        # Auth-Type MS-CHAP {
        #     mschap
        # }
    
        # mschap
    
        # digest
        ...
    }

    这只会启用 EAP,并禁用纯文本身份验证方法。

  5. 编辑 /etc/raddb/clients.conf 文件:

    1. localhostlocalhost_ipv6 客户端指令中设置安全密码:

      client localhost {
          ipaddr = 127.0.0.1
          ...
          secret = client_password
          ...
      }
      
      client localhost_ipv6 {
          ipv6addr = ::1
          secret = client_password
      }
    2. 如果 RADIUS 客户端(如网络验证器)应能够访问 FreeRADIUS 服务,请为它们添加对应的客户端指令:

      client hostapd.example.org {
          ipaddr = 192.0.2.2/32
          secret = client_password
      }

      ipaddr 参数接受 IPv4 和 IPv6 地址,您可以使用可选的无类别域间路由(CIDR)标记来指定范围。但是,在这个参数中只能设置一个值。例如,若要授予对 IPv4 和 IPv6 地址的访问权限,请添加两个客户端指令。

      为 client 指令使用一个描述性名称,如主机名或词语描述使用 IP 范围的位置。

  6. 如果要使用 EAP-TTLS 或 EAP-PEAP,请将用户添加到 /etc/raddb/users 文件中:

    example_user        Cleartext-Password := "user_password"

    对于应使用基于证书的身份验证(EAP-TLS)的用户,不要添加任何条目。

  7. 验证配置文件:

    # radiusd -XC
    ...
    Configuration appears to be OK
  8. 启用并启动 radiusd 服务:

    # systemctl enable --now radiusd

故障排除

  1. 停止 radiusd 服务:

    # systemctl stop radiusd
  2. 以 debug 模式启动该服务:

    # radiusd -X
    ...
    Ready to process requests
  3. 在 FreeRADIUS 主机上执行验证测试,如验证部分中所述。

后续步骤

  • 禁用未必需验证方法以及您不使用的其他功能。

18.6. 在有线网络中将 hostapd 配置为验证器

主机访问点守护进程(hostapd)服务可在有线网络上充当验证器,以提供 802.1X 身份验证。为此,hostapd 服务需要一个用来验证客户端的 RADIUS 服务器。

hostapd 服务提供集成的 RADIUS 服务器。但是,只针对测试目的使用集成的 RADIUS 服务器。对于生产环境,请使用 FreeRADIUS 服务器,它支持其他功能,如不同的身份验证方法和访问控制。

重要

hostapd 服务不与 traffic plane 交互。该服务仅充当身份验证器。例如,使用 hostapd 控制接口根据身份验证事件的结果来允许或拒绝流量的脚本或服务。

先决条件

  • 已安装 hostapd 软件包。
  • FreeRADIUS 服务器已配置,它已准备好对客户端进行身份验证。

流程

  1. 使用以下内容创建 /etc/hostapd/hostapd.conf 文件:

    # General settings of hostapd
    # ===========================
    
    # Control interface settings
    ctrl_interface=/var/run/hostapd
    ctrl_interface_group=wheel
    
    # Enable logging for all modules
    logger_syslog=-1
    logger_stdout=-1
    
    # Log level
    logger_syslog_level=2
    logger_stdout_level=2
    
    
    # Wired 802.1X authentication
    # ===========================
    
    # Driver interface type
    driver=wired
    
    # Enable IEEE 802.1X authorization
    ieee8021x=1
    
    # Use port access entry (PAE) group address
    # (01:80:c2:00:00:03) when sending EAPOL frames
    use_pae_group_addr=1
    
    
    # Network interface for authentication requests
    interface=br0
    
    
    # RADIUS client configuration
    # ===========================
    
    # Local IP address used as NAS-IP-Address
    own_ip_addr=192.0.2.2
    
    # Unique NAS-Identifier within scope of RADIUS server
    nas_identifier=hostapd.example.org
    
    # RADIUS authentication server
    auth_server_addr=192.0.2.1
    auth_server_port=1812
    auth_server_shared_secret=client_password
    
    # RADIUS accounting server
    acct_server_addr=192.0.2.1
    acct_server_port=1813
    acct_server_shared_secret=client_password

    有关此配置使用的参数的详情,请查看 /usr/share/doc/hostapd/hostapd/hostapd.conf 示例配置文件中的描述。

  2. 启用并启动 hostapd 服务:

    # systemctl enable --now hostapd

故障排除

  1. 停止 hostapd 服务:

    # systemctl stop hostapd
  2. 以 debug 模式启动该服务:

    # hostapd -d /etc/hostapd/hostapd.conf
  3. 在 FreeRADIUS 主机上执行验证测试,如验证部分中所述。

其他资源

  • hostapd.conf(5) man page
  • /usr/share/doc/hostapd/hostapd.conf

18.7. 针对 FreeRADIUS 服务器或验证器测试 EAP-TTLS 身份验证

要测试通过隧道传输层安全(EAP-TTLS)使用可扩展身份验证协议(EAP-TTLS)进行身份验证,请运行此流程:

  • 设置 FreeRADIUS 服务器后
  • hostapd 服务设置为 802.1X 网络身份验证验证器后。

此流程中使用的测试实用程序的输出提供有关 EAP 通信的其他信息,并帮助您调试问题。

先决条件

  • 当您要验证时:

    • FreeRADIUS 服务器:

      • 已安装 hostapd 软件包提供的 eapol_test 实用程序。
      • 运行此流程的客户端已授权在 FreeRADIUS 服务器的客户端数据库中。
    • 已安装由同一命名软件包提供的验证器( wpa_supplicant 实用程序)。
  • 您在 /etc/pki/tls/certs/ca.pem 文件中存储了证书颁发机构(CA)证书。

步骤

  1. 使用以下内容创建 /etc/wpa_supplicant/wpa_supplicant-TTLS.conf 文件:

    ap_scan=0
    
    network={
        eap=TTLS
        eapol_flags=0
        key_mgmt=IEEE8021X
    
        # Anonymous identity (sent in unencrypted phase 1)
        # Can be any string
        anonymous_identity="anonymous"
    
        # Inner authentication (sent in TLS-encrypted phase 2)
        phase2="auth=PAP"
        identity="example_user"
        password="user_password"
    
        # CA certificate to validate the RADIUS server's identity
        ca_cert="/etc/pki/tls/certs/ca.pem"
    }
  2. 要进行身份验证以进行身份验证:

    • FreeRADIUS 服务器,输入:

      # eapol_test -c /etc/wpa_supplicant/wpa_supplicant-TTLS.conf -a 192.0.2.1 -s client_password
      ...
      EAP: Status notification: remote certificate verification (param=success)
      ...
      CTRL-EVENT-EAP-SUCCESS EAP authentication completed successfully
      ...
      SUCCESS

      a 选项定义 FreeRADIUS 服务器的 IP 地址,而 -s 选项指定您在 FreeRADIUS 服务器客户端配置中运行命令的主机的密码。

    • 验证器,输入:

      # wpa_supplicant -c /etc/wpa_supplicant/wpa_supplicant-TTLS.conf -D wired -i enp0s31f6
      ...
      enp0s31f6: CTRL-EVENT-EAP-SUCCESS EAP authentication completed successfully
      ...

      i 选项指定 wpa_supplicant 通过 LAN (EAPOL)数据包发送扩展验证协议的网络接口名称。

      若要了解更多信息,请将 -d 选项传递给命令。

其他资源

  • /usr/share/doc/wpa_supplicant/wpa_supplicant.conf

18.8. 针对 FreeRADIUS 服务器或验证器测试 EAP-TLS 身份验证

要测试使用可扩展身份验证协议(EAP)传输层安全(EAP-TLS)进行身份验证,请执行以下步骤:

  • 设置 FreeRADIUS 服务器后
  • hostapd 服务设置为 802.1X 网络身份验证验证器后。

此流程中使用的测试实用程序的输出提供有关 EAP 通信的其他信息,并帮助您调试问题。

先决条件

  • 当您要验证时:

    • FreeRADIUS 服务器:

      • 已安装 hostapd 软件包提供的 eapol_test 实用程序。
      • 运行此流程的客户端已授权在 FreeRADIUS 服务器的客户端数据库中。
    • 已安装由同一命名软件包提供的验证器( wpa_supplicant 实用程序)。
  • 您在 /etc/pki/tls/certs/ca.pem 文件中存储了证书颁发机构(CA)证书。
  • 发布客户端证书的 CA 与签发 FreeRADIUS 服务器的服务器证书相同。
  • 您将客户端证书存储在 /etc/pki/tls/certs/client.pem 文件中。
  • 将客户端的私钥存储在 /etc/pki/tls/private/client.key

步骤

  1. 使用以下内容创建 /etc/wpa_supplicant/wpa_supplicant-TLS.conf 文件:

    ap_scan=0
    
    network={
        eap=TLS
        eapol_flags=0
        key_mgmt=IEEE8021X
    
        identity="user@example.org"
        client_cert="/etc/pki/tls/certs/client.pem"
        private_key="/etc/pki/tls/private/client.key"
        private_key_passwd="password_on_private_key"
    
        # CA certificate to validate the RADIUS server's identity
        ca_cert="/etc/pki/tls/certs/ca.pem"
    }
  2. 要进行身份验证以进行身份验证:

    • FreeRADIUS 服务器,输入:

      # eapol_test -c /etc/wpa_supplicant/wpa_supplicant-TLS.conf -a 192.0.2.1 -s client_password
      ...
      EAP: Status notification: remote certificate verification (param=success)
      ...
      CTRL-EVENT-EAP-SUCCESS EAP authentication completed successfully
      ...
      SUCCESS

      a 选项定义 FreeRADIUS 服务器的 IP 地址,而 -s 选项指定您在 FreeRADIUS 服务器客户端配置中运行命令的主机的密码。

    • 验证器,输入:

      # wpa_supplicant -c /etc/wpa_supplicant/wpa_supplicant-TLS.conf -D wired -i enp0s31f6
      ...
      enp0s31f6: CTRL-EVENT-EAP-SUCCESS EAP authentication completed successfully
      ...

      i 选项指定 wpa_supplicant 通过 LAN (EAPOL)数据包发送扩展验证协议的网络接口名称。

      若要了解更多信息,请将 -d 选项传递给命令。

其他资源

  • /usr/share/doc/wpa_supplicant/wpa_supplicant.conf

18.9. 根据 hostapd 验证事件阻止和允许流量

hostapd 服务不与 traffic plane 交互。该服务仅充当身份验证器。但是,您可以编写脚本,以根据身份验证事件的结果来允许或拒绝流量。

重要

此步骤不受支持,没有企业级的解决方案。它演示了如何通过评估由 hostapd_cli 检索的事件来阻止或允许流量。

802-1x-tr-mgmt systemd 服务启动时,RHEL 会阻止监听 hostapd 端口的所有流量,但通过 LAN(EAPOL)数据包可扩展验证协议并使用 hostapd_cli 实用程序连接到 hostapd 控制接口。/usr/local/bin/802-1x-tr-mgmt 脚本随后评估事件。根据 hostapd_cli 接收的不同事件,该脚本允许或阻止 MAC 地址的流量。请注意,当 802-1x-tr-mgmt 服务停止时,所有流量会自动允许。

hostapd 服务器上执行这个步骤。

先决条件

  • hostapd 服务已经配置,服务已准备好对客户端进行身份验证。

步骤

  1. 使用以下内容创建 /usr/local/bin/802-1x-tr-mgmt 文件:

    #!/bin/sh
    
    if [ "x$1" == "xblock_all" ]
    then
    
        nft delete table bridge tr-mgmt-br0 2>/dev/null || true
        nft -f - << EOF
    table bridge tr-mgmt-br0 {
            set allowed_macs {
                    type ether_addr
            }
    
            chain accesscontrol {
                    ether saddr @allowed_macs accept
                    ether daddr @allowed_macs accept
                    drop
            }
    
            chain forward {
                    type filter hook forward priority 0; policy accept;
                    meta ibrname "br0" jump accesscontrol
            }
    }
    EOF
        echo "802-1x-tr-mgmt Blocking all traffic through br0. Traffic for given host will be allowed after 802.1x authentication"
    
    elif [ "x$1" == "xallow_all" ]
    then
    
        nft delete table bridge tr-mgmt-br0
        echo "802-1x-tr-mgmt Allowed all forwarding again"
    
    fi
    
    case ${2:-NOTANEVENT} in
    
        AP-STA-CONNECTED | CTRL-EVENT-EAP-SUCCESS | CTRL-EVENT-EAP-SUCCESS2)
            nft add element bridge tr-mgmt-br0 allowed_macs { $3 }
            echo "$1: Allowed traffic from $3"
            ;;
    
        AP-STA-DISCONNECTED | CTRL-EVENT-EAP-FAILURE)
            nft delete element bridge tr-mgmt-br0 allowed_macs { $3 }
            echo "802-1x-tr-mgmt $1: Denied traffic from $3"
            ;;
    
    esac
  2. 使用以下内容创建 /etc/systemd/system/802-1x-tr-mgmt@.service systemd 服务文件:

    [Unit]
    Description=Example 802.1x traffic management for hostapd
    After=hostapd.service
    After=sys-devices-virtual-net-%i.device
    
    [Service]
    Type=simple
    ExecStartPre=-/bin/sh -c '/usr/sbin/tc qdisc del dev %i ingress > /dev/null 2>&1'
    ExecStartPre=-/bin/sh -c '/usr/sbin/tc qdisc del dev %i clsact > /dev/null 2>&1'
    ExecStartPre=/usr/sbin/tc qdisc add dev %i clsact
    ExecStartPre=/usr/sbin/tc filter add dev %i ingress pref 10000 protocol 0x888e matchall action ok index 100
    ExecStartPre=/usr/sbin/tc filter add dev %i ingress pref 10001 protocol all matchall action drop index 101
    ExecStart=/usr/sbin/hostapd_cli -i %i -a /usr/local/bin/802-1x-tr-mgmt
    ExecStopPost=-/usr/sbin/tc qdisc del dev %i clsact
    
    [Install]
    WantedBy=multi-user.target
  3. 重新载入 systemd:

    # systemctl daemon-reload
  4. 启用并启动带有接口名称 hostapd 正在侦听的 802-1x-tr-mgmt 服务:

    # systemctl enable --now 802-1x-tr-mgmt@br0.service

其他资源

  • systemd.service(5) man page

第 19 章 使用存储在文件系统中的证书使用 802.1X 标准向网络验证 RHEL 客户端

管理员通常使用基于 IEEE 802.1X 标准的基于端口的网络访问控制(NAC)来保护网络不受未授权 LAN 和 Wi-Fi 客户端的影响。本节中的步骤描述了配置网络身份验证的不同选项。

19.1. 使用 nmcli 在现有以太网连接中配置 802.1X 网络身份验证

使用 nmcli 工具,您可以配置客户端来向网络验证其自身。此流程描述了如何在名为 enp1s0 的现有 NetworkManager 以太网连接配置文件中配置 TLS 身份验证以向网络进行身份验证。

先决条件

  • 网络支持 802.1X 网络身份验证。
  • 以太网连接配置集存在于 NetworkManager 中,且具有有效的 IP 配置。
  • 客户端上存在 TLS 身份验证所需的以下文件:

    • 客户端密钥存储于 /etc/pki/tls/private/client.key 文件中,该文件的所有者为 root 用户且只能由 root 用户读取。
    • 客户端证书存储在 /etc/pki/tls/certs/client.crt 文件中。
    • 证书颁发机构(CA)证书存储在 /etc/pki/tls/certs/ca.crt 文件中。
  • 已安装 wpa_supplicant 软件包。

步骤

  1. 将可扩展身份验证协议(EAP)设为 tls,将路径设为客户端证书和密钥文件:

    # nmcli connection modify enp1s0 802-1x.eap tls 802-1x.client-cert /etc/pki/tls/certs/client.crt 802-1x.private-key /etc/pki/tls/certs/certs/client.key

    请注意,您必须在单个命令中设置 802-1x.eap802-1x.client-cert802-1x.private-key 参数。

  2. 设置 CA 证书的路径:

    # nmcli connection modify enp1s0 802-1x.ca-cert /etc/pki/tls/certs/ca.crt
  3. 设置证书中使用的用户身份:

    # nmcli connection modify enp1s0 802-1x.identity user@example.com
  4. 另外,还可将该密码存储在配置中:

    # nmcli connection modify enp1s0 802-1x.private-key-password password
    重要

    默认情况下,NetworkManager 将密码以明文形式存储在 /etc/sysconfig/network-scripts/keys-connection_name 文件中,该文件只对 root 用户可读。但是,在配置文件中清除文本密码会有安全隐患。

    要提高安全性,请将 802-1x.password-flags 参数设为 0x1。有了这个设置,在具有 GNOME 桌面环境或运行nm-applet 的服务器上,NetworkManager 从这些服务检索密码。在其他情况下,NetworkManager 会提示输入密码。

  5. 激活连接配置集:

    # nmcli connection up enp1s0

验证步骤

  • 访问需要网络身份验证的网络上的资源。

其他资源

19.2. 使用 nmstatectl 使用 802.1X 网络身份验证配置静态以太网连接

使用 nmstate 工具,您可以创建一个以太网连接,该连接使用 802.1X 标准来验证客户端。这个流程描述了如何使用以下设置为 enp1s0 接口添加以太网连接:

  • 静态 IPv4 地址 - 192.0.2.1/24 子网掩码
  • 静态 IPv6 地址 - 2001:db8:1::1/64 子网掩码
  • IPv4 默认网关 - 192.0.2.254
  • IPv6 默认网关 - 2001:db8:1::fffe
  • IPv4 DNS 服务器 - 192.0.2.200
  • IPv6 DNS 服务器 - 2001:db8:1::ffbb
  • DNS 搜索域 - example.com
  • 使用 TLS 可扩展身份验证协议(EAP)进行 802.1X 网络身份验证.
注意

nmstate 库只支持 TLS EAP 方法。

先决条件

  • 网络支持 802.1X 网络身份验证。
  • 受管节点使用 NetworkManager。
  • 客户端上存在 TLS 身份验证所需的以下文件:

    • 存储的客户端密钥位于 /etc/pki/tls/private/client.key 文件中,该文件归 root 用户所有,并仅对其可读。
    • 客户端证书存储在 /etc/pki/tls/certs/client.crt 文件中。
    • 证书颁发机构(CA)证书存储在 /etc/pki/tls/certs/ca.crt 文件中。

步骤

  1. 创建包含以下内容的 YAML 文件,如 ~/create-ethernet-profile.yml

    ---
    interfaces:
    - name: enp1s0
      type: ethernet
      state: up
      ipv4:
        enabled: true
        address:
        - ip: 192.0.2.1
          prefix-length: 24
        dhcp: false
      ipv6:
        enabled: true
        address:
        - ip: 2001:db8:1::1
          prefix-length: 64
        autoconf: false
        dhcp: false
      802.1x:
        ca-cert: /etc/pki/tls/certs/ca.crt
        client-cert: /etc/pki/tls/certs/client.crt
        eap-methods:
          - tls
        identity: client.example.org
        private-key: /etc/pki/tls/private/client.key
        private-key-password: password
    routes:
      config:
      - destination: 0.0.0.0/0
        next-hop-address: 192.0.2.254
        next-hop-interface: enp1s0
      - destination: ::/0
        next-hop-address: 2001:db8:1::fffe
        next-hop-interface: enp1s0
    dns-resolver:
      config:
        search:
        - example.com
        server:
        - 192.0.2.200
        - 2001:db8:1::ffbb
  2. 将设置应用到系统:

    # nmstatectl apply ~/create-ethernet-profile.yml

验证

  • 访问需要网络身份验证的网络上的资源。

19.3. 使用 RHEL 系统角色通过 802.1X 网络身份验证配置静态以太网连接

使用网络 RHEL 系统角色,您可以自动创建使用 802.1X 标准验证客户端的以太网连接。此流程描述了如何通过运行 Ansible playbook 为具有以下设置的 enp1s0 接口远程添加以太网连接:

  • 静态 IPv4 地址 - 192.0.2.1/24 子网掩码
  • 静态 IPv6 地址 - 2001:db8:1::1/64 子网掩码
  • IPv4 默认网关 - 192.0.2.254
  • IPv6 默认网关 - 2001:db8:1::fffe
  • IPv4 DNS 服务器 - 192.0.2.200
  • IPv6 DNS 服务器 - 2001:db8:1::ffbb
  • DNS 搜索域 - example.com
  • 使用 TLS 可扩展身份验证协议(EAP)进行 802.1X 网络身份验证.

在 Ansible 控制节点上运行此步骤。

先决条件

  • ansible-corerhel-system-roles 软件包在控制节点上安装。
  • 如果您在运行 playbook 时使用了与 root 不同的远程用户,则您必须在受管节点上具有合适的 sudo 权限。
  • 网络支持 802.1X 网络身份验证。
  • 受管节点使用 NetworkManager。
  • control 节点上存在 TLS 身份验证所需的以下文件:

    • 客户端密钥存储在 /srv/data/client.key 文件中。
    • 客户端证书存储在 /srv/data/client.crt 文件中。
    • 证书颁发机构(CA)证书存储在 /srv/data/ca.crt 文件中。

步骤

  1. 如果您要在其上执行 playbook 中指令的主机还没有被列入清单,请将此主机的 IP 或名称添加到 /etc/ansible/hosts Ansible 清单文件中:

    node.example.com
  2. 使用以下内容创建 ~/enable-802.1x.yml playbook:

    ---
    - name: Configure an Ethernet connection with 802.1X authentication
      hosts: node.example.com
      become: true
      tasks:
        - name: Copy client key for 802.1X authentication
          copy:
            src: "/srv/data/client.key"
            dest: "/etc/pki/tls/private/client.key"
            mode: 0600
    
        - name: Copy client certificate for 802.1X authentication
          copy:
            src: "/srv/data/client.crt"
            dest: "/etc/pki/tls/certs/client.crt"
    
        - name: Copy CA certificate for 802.1X authentication
          copy:
            src: "/srv/data/ca.crt"
            dest: "/etc/pki/ca-trust/source/anchors/ca.crt"
    
        - include_role:
            name: rhel-system-roles.network
          vars:
            network_connections:
              - name: enp1s0
                type: ethernet
                autoconnect: yes
                ip:
                  address:
                    - 192.0.2.1/24
                    - 2001:db8:1::1/64
                  gateway4: 192.0.2.254
                  gateway6: 2001:db8:1::fffe
                  dns:
                    - 192.0.2.200
                    - 2001:db8:1::ffbb
                  dns_search:
                    - example.com
                ieee802_1x:
                  identity: user_name
                  eap: tls
                  private_key: "/etc/pki/tls/private/client.key"
                  private_key_password: "password"
                  client_cert: "/etc/pki/tls/certs/client.crt"
                  ca_cert: "/etc/pki/ca-trust/source/anchors/ca.crt"
                  domain_suffix_match: example.com
                state: up
  3. 运行 playbook:

    • 要以 root 用户身份连接到受管主机,请输入:

      # ansible-playbook -u root ~/enable-802.1x.yml
    • 以用户身份连接到受管主机,请输入:

      # ansible-playbook -u user_name --ask-become-pass ~/ethernet-static-IP.yml

      --ask-become-pass 选项确保 ansible-playbook 命令提示输入 -u user_name 选项中定义的用户的 sudo 密码。

    如果没有指定 -u user_name 选项,ansible-playbook 以当前登录到控制节点的用户身份连接到受管主机。

其他资源

  • /usr/share/ansible/roles/rhel-system-roles.network/README.md 文件
  • /usr/share/ansible/roles/rhel-system-roles.network/README.md 文件
  • ansible-playbook(1) 手册页

19.4. 使用 RHEL 系统角色使用 802.1X 网络身份验证配置 Wi-Fi 连接

使用 RHEL 系统角色,您可以自动创建 Wi-Fi 连接。此流程描述了如何使用 Ansible playbook 为 wlp1s0 接口远程添加无线连接配置集。创建的配置集使用 802.1X 标准将客户端验证到 Wi-Fi 网络。该 playbook 将连接配置集配置为使用 DHCP。要配置静态 IP 设置,相应地调整 ip 字典中的参数。

先决条件

  • 您已在控制节点上安装了 ansible 和 rhel-system-roles 软件包。
  • 网络支持 802.1X 网络身份验证。
  • 如果您在运行 playbook 时使用了与 root 不同的远程用户,则您必须在受管节点上具有合适的 sudo 权限。
  • 您已在受管节点上安装了 wpa_supplicant 软件包。
  • DHCP 位于受管节点的网络中。
  • control 节点上存在 TLS 身份验证所需的以下文件:

    • 客户端密钥存储在 /srv/data/client.key 文件中。
    • 客户端证书存储在 /srv/data/client.crt 文件中。
    • CA 证书存储在 /srv/data/ca.crt 文件中。

Ansible 控制节点上执行以下步骤。

流程

  1. 如果您要在其上执行 playbook 中指令的主机还没有被列入清单,请将此主机的 IP 或名称添加到 /etc/ansible/hosts Ansible 清单文件中:

    node.example.com
  2. 使用以下内容创建 ~/enable-802.1x.yml playbook:

    ---
    - name: Configure a Wi-Fi connection with 802.1X authentication
      hosts: "node.example.com"
      become: true
      tasks:
        - name: Copy client key for 802.1X authentication
          copy:
            src: "/srv/data/client.key"
            dest: "/etc/pki/tls/private/client.key"
            mode: 0400
    
        - name: Copy client certificate for 802.1X authentication
          copy:
            src: "/srv/data/client.crt"
            dest: "/etc/pki/tls/certs/client.crt"
    
        - name: Copy CA certificate for 802.1X authentication
          copy:
            src: "/srv/data/ca.crt"
            dest: "/etc/pki/ca-trust/source/anchors/ca.crt"
    
        - block:
            - import_role:
                name: linux-system-roles.network
              vars:
                network_connections:
                  - name: Configure the Example-Wi-Fi profile
                    interface_name: wlp1s0
                    state: up
                    type: wireless
                    autoconnect: yes
                    ip:
                      dhcp4: true
                      auto6: true
                    wireless:
                      ssid: "Example-Wi-Fi"
                      key_mgmt: "wpa-eap"
                    ieee802_1x:
                      identity: "user_name"
                      eap: tls
                      private_key: "/etc/pki/tls/client.key"
                      private_key_password: "password"
                      private_key_password_flags: none
                      client_cert: "/etc/pki/tls/client.pem"
                      ca_cert: "/etc/pki/tls/cacert.pem"
                      domain_suffix_match: "example.com"
  3. 运行 playbook:

    • 要以 root 用户身份连接到受管主机,请输入:

      # ansible-playbook -u root ~/enable-802.1x.yml
    • 以用户身份连接到受管主机,请输入:

      # ansible-playbook -u user_name --ask-become-pass ~/ethernet-static-IP.yml

      --ask-become-pass 选项确保 ansible-playbook 命令提示输入 -u user_name 选项中定义的用户的 sudo 密码。

    如果没有指定 -u user_name 选项,ansible-playbook 以当前登录到控制节点的用户身份连接到受管主机。

其他资源

  • /usr/share/ansible/roles/rhel-system-roles.network/README.md 文件
  • ansible-playbook(1) 手册页

第 20 章 管理默认网关设置

默认网关是路由器,在任何其他路由都不匹配数据包的目的地时转发网络数据包。在本地网络中,默认网关通常是一个最接近互联网的主机。

20.1. 使用 nmcli 在现有连接上设置默认网关

在大多数情况下,管理员在创建连接时设置默认网关,例如,使用 nmcli 配置静态以太网连接

本节描述了如何使用 nmcli 工具在之前创建的连接中设置或更新默认网关。

先决条件

  • 至少需要在设置默认网关的连接上配置一个静态 IP 地址。
  • 如果用户在物理控制台中登录,用户权限就足够了。否则,用户必须具有 root 权限。

步骤

  1. 设置默认网关的 IP 地址。

    例如,要在 example 连接上将默认网关的 IPv4 地址设为 192.0.2.1

    $ sudo nmcli connection modify example ipv4.gateway "192.0.2.1"

    例如,要在 example 连接上将默认网关的 IPv6 地址设为 2001:db8:1::1

    $ sudo nmcli connection modify example ipv6.gateway "2001:db8:1::1"
  2. 重启网络连接以使更改生效。例如,要使用命令行重启 example 连接:

    $ sudo nmcli connection up example
    警告

    所有目前使用这个网络连接的连接在重启过程中暂时中断。

  3. (可选)验证路由是否活跃。

    显示 IPv4 默认网关:

    $ ip -4 route
    default via 192.0.2.1 dev example proto static metric 100

    显示 IPv6 默认网关:

    $ ip -6 route
    default via 2001:db8:1::1 dev example proto static metric 100 pref medium

20.2. 使用 nmcli 互动模式在现有连接上设置默认网关

在大多数情况下,管理员在创建连接时设置默认网关,例如,使用 nmcli 互动编辑器配置动态以太网连接

这部分论述了如何使用 nmcli 实用程序的互动模式在之前创建的连接中设置或更新默认网关。

先决条件

  • 至少需要在设置默认网关的连接上配置一个静态 IP 地址。
  • 如果用户在物理控制台中登录,用户权限就足够了。否则,该用户必须具有 root 权限。

步骤

  1. 为所需连接打开 nmcli 互动模式。例如,要为 example 连接打开 nmcli 互动模式:

    $ sudo nmcli connection edit example
  2. 设置默认网关。

    例如,要在 example 连接上将默认网关的 IPv4 地址设为 192.0.2.1

    nmcli> set ipv4.gateway 192.0.2.1

    例如,要在 example 连接上将默认网关的 IPv6 地址设为 2001:db8:1::1

    nmcli> set ipv6.gateway 2001:db8:1::1
  3. 另外,还可验证默认网关是否正确设置:

    nmcli> print
    ...
    ipv4.gateway:                           192.0.2.1
    ...
    ipv6.gateway:                           2001:db8:1::1
    ...
  4. 保存配置:

    nmcli> save persistent
  5. 重启网络连接以使更改生效:

    nmcli> activate example
    警告

    所有目前使用这个网络连接的连接在重启过程中暂时中断。

  6. 保留 nmcli 互动模式:

    nmcli> quit
  7. (可选)验证路由是否活跃。

    显示 IPv4 默认网关:

    $ ip -4 route
    default via 192.0.2.1 dev example proto static metric 100

    显示 IPv6 默认网关:

    $ ip -6 route
    default via 2001:db8:1::1 dev example proto static metric 100 pref medium

20.3. 使用 nm-connection-editor 在现有连接上设置默认网关

在大多数情况下,管理员在创建连接时设置默认网关。这部分论述了如何使用 nm-connection-editor 应用程序在之前创建的连接中设置或更新默认网关。

先决条件

  • 至少需要在设置默认网关的连接上配置一个静态 IP 地址。

步骤

  1. 打开终端并输入 nm-connection-editor

    $ nm-connection-editor
  2. 选择要修改的连接,并点击 gear wheel 图标编辑现有连接。
  3. 设置 IPv4 默认网关。例如,要将连接上默认网关的 IPv4 地址设为 192.0.2.1

    1. 打开 IPv4 Settings 选项卡。
    2. 在网关地址的 IP 范围旁边的 gateway 字段中输入地址:

      set default gw in nm connection editor ipv4

  4. 设置 IPv6 默认网关。例如,将连接上默认网关的 IPv6 地址设为 2001:db8:1::1

    1. 打开 IPv6 选项卡。
    2. 在网关地址的 IP 范围旁边的 gateway 字段中输入地址:

      set default gw in nm connection editor ipv6

  5. 点击 确定
  6. 点击 Save
  7. 重启网络连接以使更改生效。例如,要使用命令行重启 example 连接:

    $ sudo nmcli connection up example
    警告

    所有目前使用这个网络连接的连接在重启过程中暂时中断。

  8. (可选)验证路由是否活跃。

    显示 IPv4 默认网关:

    $ ip -4 route
    default via 192.0.2.1 dev example proto static metric 100

    显示 IPv6 默认网关:

    $ ip -6 route
    default via 2001:db8:1::1 dev example proto static metric 100 pref medium

20.4. 使用 control-center 在现有连接上设置默认网关

在大多数情况下,管理员在创建连接时设置默认网关。本节描述了如何使用 control-center 应用程序在之前创建的连接上设置或更新默认网关。

先决条件

  • 至少需要在设置默认网关的连接上配置一个静态 IP 地址。
  • 连接的网络配置在 control-center 应用中打开。

步骤

  1. 设置 IPv4 默认网关。例如,要将连接上默认网关的 IPv4 地址设为 192.0.2.1

    1. 打开 IPv4 选项卡。
    2. 在网关地址的 IP 范围旁边的 gateway 字段中输入地址:

      set default gw in control center ipv4

  2. 设置 IPv6 默认网关。例如,将连接上默认网关的 IPv6 地址设为 2001:db8:1::1

    1. 打开 IPv6 选项卡。
    2. 在网关地址的 IP 范围旁边的 gateway 字段中输入地址:

      set default gw in control center ipv6

  3. 应用
  4. 回到 网络 窗口中,通过将连接按钮切换到 Off 及回到 On 来禁用及重新启用连接,以使更改生效。

    警告

    所有目前使用这个网络连接的连接在重启过程中暂时中断。

  5. (可选)验证路由是否活跃。

    显示 IPv4 默认网关:

    $ ip -4 route
    default via 192.0.2.1 dev example proto static metric 100

    显示 IPv6 默认网关:

    $ ip -6 route
    default via 2001:db8:1::1 dev example proto static metric 100 pref medium

20.5. 使用 nmstatectl 在现有连接上设置默认网关

您可以使用 nmstatectl 工具设置网络连接的默认网关。这个步骤描述了如何将现有 enp1s0 连接的默认网关设置为 192.0.2.1

先决条件

  • 至少需要在设置默认网关的连接上配置一个静态 IP 地址。
  • enp1s0 接口已配置,默认网关的 IP 地址位于此接口的 IP 配置子网中。
  • 已安装 nmstate 软件包。

步骤

  1. 创建包含以下内容的 YAML 文件,如 ~/set-default-gateway.yml

    ---
    routes:
      config:
      - destination: 0.0.0.0/0
        next-hop-address: 192.0.2.1
        next-hop-interface: enp1s0
  2. 将设置应用到系统:

    # nmstatectl apply ~/set-default-gateway.yml

其他资源

  • 有关 nmstatectl 的详情,请查看 nmstatectl(8) 手册页。
  • 有关更多的配置示例,请参阅 /usr/share/doc/nmstate/examples/ 目录。

20.6. 使用系统角色在现有连接上设置默认网关

您可以使用网络 RHEL 系统角色设置默认网关。

重要

当您运行使用 Networking RHEL 系统角色的 play 时,如果设置的值与 play 中指定的名称不匹配,则系统角色会覆盖具有相同名称的连接配置集。因此,始终在剧本中指定网络连接配置文件的完整配置,即使 IP 配置已经存在。否则,角色会将这些值重置为默认值。

根据它是否已存在,流程使用以下设置创建或更新 enp1s0 连接配置文件:

  • 静态 IPv4 地址 - 198.51.100.20,子网掩码为/24
  • 静态 IPv6 地址 - 2001:db8:1::1/64 子网掩码
  • IPv4 默认网关 - 198.51.100.254
  • IPv6 默认网关 - 2001:db8:1::fffe
  • IPv4 DNS 服务器 - 198.51.100.200
  • IPv6 DNS 服务器 - 2001:db8:1::ffbb
  • DNS 搜索域 - example.com

先决条件

  • ansible-corerhel-system-roles 软件包在控制节点上安装。
  • 如果您在运行 playbook 时使用了与 root 不同的远程用户,则此用户在受管节点上具有合适的 sudo 权限。

步骤

  1. 如果您要在其上执行 playbook 中指令的主机还没有被列入清单,请将此主机的 IP 或名称添加到 /etc/ansible/hosts Ansible 清单文件中:

    node.example.com
  2. 使用以下内容创建 ~/ethernet-connection.yml playbook:

    ---
    - name: Configure an Ethernet connection with static IP and default gateway
      hosts: node.example.com
      become: true
      tasks:
      - include_role:
          name: rhel-system-roles.network
    
        vars:
          network_connections:
            - name: enp1s0
              type: ethernet
              autoconnect: yes
              ip:
                address:
                  - 198.51.100.20/24
                  - 2001:db8:1::1/64
                gateway4: 198.51.100.254
                gateway6: 2001:db8:1::fffe
                dns:
                  - 198.51.100.200
                  - 2001:db8:1::ffbb
                dns_search:
                  - example.com
              state: up
  3. 运行 playbook:

    • 要以 root 用户身份连接到受管主机,请输入:

      # ansible-playbook -u root ~/ethernet-connection.yml
    • 以用户身份连接到受管主机,请输入:

      # ansible-playbook -u user_name --ask-become-pass ~/ethernet-connection.yml

      --ask-become-pass 选项确保 ansible-playbook 命令提示输入 -u user_name 选项中定义的用户的 sudo 密码。

    如果没有指定 -u user_name 选项,ansible-playbook 以当前登录到控制节点的用户身份连接到受管主机。

其他资源

  • /usr/share/ansible/roles/rhel-system-roles.network/README.md
  • ansible-playbook(1) 手册页

20.7. NetworkManager 如何管理多个默认网关

在某些情况下,您可能需要在主机上设置多个默认网关。但是,为了避免异步路由问题,同一协议的每个默认网关都需要单独的指标值。请注意,RHEL 只使用与设置最低指标的默认网关的连接。

您可以使用以下命令为连接的 IPv4 和 IPv6 网关设置指标:

# nmcli connection modify connection-name ipv4.route-metric value ipv6.route-metric value
重要

不要为多个连接配置集中的同一协议设置相同的指标值以避免路由问题。

如果您在没有指标值的情况下设置了默认网关,NetworkManager 会自动根据接口类型设置指标值。为此,NetworkManager 将此网络类型的默认值分配给激活的第一个连接,并根据它们激活的顺序为同一类型的每个其他连接设置递增值。例如,如果两个带有默认网关的以太网连接存在,则 NetworkManager 会将路由上 100 的指标设置给您首先激活的连接的默认网关。对于第二个连接,NetworkManager 会设置 101

以下是经常使用的网络类型及其默认指标的概述:

连接类型默认指标值

VPN

50

Ethernet

100

MACsec

125

InfiniBand

150

Bond

300

Team

350

VLAN

400

Bridge

425

TUN

450

Wi-Fi

600

IP tunnel

675

20.8. 配置 NetworkManager 以避免使用特定配置集提供默认网关

您可以配置 NetworkManager,使其不会使用特定配置集提供默认网关。对于没有连接到默认网关的连接配置集,请按照以下步骤操作。

先决条件

  • 存在未连接到默认网关的连接的 NetworkManager 连接配置集。

流程

  1. 如果连接使用动态 IP 配置,请配置 NetworkManager 不使用连接作为 IPv4 和 IPv6 连接的默认路由:

    # nmcli connection modify connection_name ipv4.never-default yes ipv6.never-default yes

    请注意,将 ipv4.never-defaultipv6.never-default 设为 yes 时,会自动从连接配置文件中删除相应协议的默认网关的 IP 地址。

  2. 激活连接:

    # nmcli connection up connection_name

验证步骤

  • 使用 ip -4 routeip -6 route 命令来验证 RHEL 是否没有将网络接口用于 IPv4 和 IPv6 协议的默认路由。

20.9. 修复因为多个默认网关导致的意外路由行为

只有在很少情况下(比如使用多路径 TCP 时),在主机上需要多个默认网关。在大多数情况下,您只配置一个默认网关以避免意外路由行为或异步路由问题。

注意

要将流量路由到不同的互联网供应商,请使用基于策略的路由而不是多个默认网关。

先决条件

  • 主机使用 NetworkManager 管理网络连接,这是默认设置。
  • 主机有多个网络接口。
  • 主机配置了多个默认网关。

流程

  1. 显示路由表:

    • 对于 IPv4,请输入:

      # ip -4 route
      default via 192.0.2.1 dev enp1s0 proto static metric 101
      default via 198.51.100.1 dev enp7s0 proto static metric 102
      ...
    • 对于 IPv6,请输入:

      # ip -6 route
      default via 2001:db8:1::1 dev enp1s0 proto static metric 101 pref medium
      default via 2001:db8:2::1 dev enp7s0 proto static metric 102 pref medium
      ...

    default 开头的条目表示默认路由。记下 dev 旁边显示这些条目的接口名称。

  2. 使用以下命令显示使用您在上一步中获得的接口的 NetworkManager 连接:

    # nmcli -f GENERAL.CONNECTION,IP4.GATEWAY,IP6.GATEWAY device show enp1s0
    GENERAL.CONNECTION:      Corporate-LAN
    IP4.GATEWAY:             192.168.122.1
    IP6.GATEWAY:             2001:db8:1::1
    
    # nmcli -f GENERAL.CONNECTION,IP4.GATEWAY,IP6.GATEWAY device show enp7s0
    GENERAL.CONNECTION:      Internet-Provider
    IP4.GATEWAY:             198.51.100.1
    IP6.GATEWAY:             2001:db8:2::1

    在这些示例中,名为 Corporate-LANInternet-Provider 的配置文件设置了默认网关集。因为在本地网络中,默认网关通常是与互联网只有一跳的主机,此流程的其余部分假定 Corporate-LAN 中的默认网关是不正确的。

  3. 配置 NetworkManager 不使用 Corporate-LAN 连接作为 IPv4 和 IPv6 连接的默认路由:

    # nmcli connection modify Corporate-LAN ipv4.never-default yes ipv6.never-default yes

    请注意,将 ipv4.never-defaultipv6.never-default 设为 yes 时,会自动从连接配置文件中删除相应协议的默认网关的 IP 地址。

  4. 激活 Corporate-LAN 连接:

    # nmcli connection up Corporate-LAN

验证步骤

  • 显示 IPv4 和 IPv6 路由表,并确认每个协议都只有一个默认网关:

    • 对于 IPv4,请输入:

      # ip -4 route
      default via 192.0.2.1 dev enp1s0 proto static metric 101
      ...
    • 对于 IPv6,请输入:

      # ip -6 route
      default via 2001:db8:1::1 dev enp1s0 proto static metric 101 pref medium
      ...

第 21 章 配置静态路由

路由可确保您可以在相互连接的网络间发送和接收流量。在较大环境中,管理员通常配置服务以便路由器可以动态地了解其他路由器。在较小的环境中,管理员通常会配置静态路由,以确保流量可以从一个网络到下一个网络访问。

如果适用所有这些条件,您需要静态路由以在多个网络间获得正常运行的通信:

  • 流量必须通过多个网络。
  • 通过默认网关的独占流量流不足。

第 21.1 节 “需要静态路由的网络示例” 描述没有配置静态路由时不同网络间的流量流的情况。

21.1. 需要静态路由的网络示例

您需要在这个示例中的静态路由,因为并非所有 IP 网络都通过一个路由器直接连接。如果没有静态路由,一些网络无法相互通信。此外,某些网络流的流量仅有一个方向。

注意

本例中的网络拓扑是 artificial,仅用于解释静态路由的概念。在生产环境中并不是推荐的拓扑。

对于本示例中所有网络中的一个正常运行的通信,请将静态路由配置为 Raleigh(198.51.100.0/24),并下一跳路由器 2(203.0.113.10)。下一个跃点的 IP 地址是数据中心网络中的一个路由器 2(203.0.113.0/24)。

您可以配置静态路由,如下所示:

  • 对于简化的配置,仅在路由器 1 上设置此静态路由。但是,这会增加路由器 1 上的流量,因为来自数据中心(203.0.113.0/24的主机)将流量发送到罗利(198.51.100.0/24),始终通过路由器 1 到路由器 2。
  • 对于更复杂的配置,请在数据中心的所有主机上配置此静态路由(203.0.113.0/24)。然后,此子网中的所有主机直接向路由器 2(203.0.113.10)发送更接近 Raleigh 的主机(198.51.100.0/24)。

有关网络流量流或不符的更多详情,请参见以下示意图中的说明。

路由示例

如果没有配置所需的静态路由,下面描述了通信是否正常工作,且无法正常工作:

  • Berlin 网络中的主机(192.0.2.0/24):

    • 可以与同一子网中的其他主机通信,因为它们是直接连接的。
    • 可以与互联网通信,因为路由器 1 位于 Berlin 网络(192.0.2.0/24)中,并有一个默认网关,这会导致互联网。
    • 可以与数据中心网络通信(203.0.113.0/24),因为路由器 1 在 Berlin(192.0.2.0/24)和数据中心(203.0.113.0/24)网络中有接口。
    • 无法与 Raleigh 网络(198.51.100.0/24)通信,因为路由器 1 在此网络中没有接口。因此,路由器 1 将流量发送到自己的默认网关(Internet)。
  • 数据中心网络中的主机(203.0.113.0/24):

    • 可以与同一子网中的其他主机通信,因为它们是直接连接的。
    • 可以与互联网通信,因为它们的默认网关设置为路由器 1,路由器 1 在网络、数据中心(203.0.113.0/24)和互联网上均有接口。
    • 可以与 Berlin 网络(192.0.2.0/24)通信,因为它们的默认网关设置为路由器 1,并且路由器 1 在数据中心(203.0.113.0/24)和 Berlin(192.0.2.0/24)网络中都存在接口。
    • 无法与 Raleigh 网络(198.51.100.0/24)通信,因为该网络中没有接口。因此,数据中心中的主机(203.0.113.0/24)将流量发送到其默认网关(Router 1)。路由器 1 在罗利网络(198.51.100.0/24中)没有接口,因此 Router 1 会将这个流量发送到自己的默认网关(Internet)。
  • Raleigh 网络中的主机(198.51.100.0/24):

    • 可以与同一子网中的其他主机通信,因为它们是直接连接的。
    • 无法与互联网上的主机通信。路由器 2 将流量发送到路由器 1,因为默认网关设置。路由器 1 的实际行为取决于反向路径过滤器(rp_filter)系统控制(sysctl)设置。默认情况下,在 RHEL 中,路由器 1 会丢弃传出流量,而不是将其路由到互联网。但是,无论配置的行为如何,都无法在没有静态路由的情况下进行通信。
    • 无法与数据中心网络通信(203.0.113.0/24)。由于默认网关设置,传出流量通过路由器 2 到达目的地。但是,对数据包的回复不会到达发送者,因为数据中心网络中的主机(203.0.113.0/24)将回复发送到其默认网关(Router 1)。然后,路由器 1 将流量发送到互联网。
    • 无法与 Berlin 网络通信(192.0.2.0/24)。路由器 2 将流量发送到路由器 1,因为默认网关设置。路由器 1 的实际行为取决于 rp_filter sysctl 设置。默认情况下,在 RHEL 中,路由器 1 会丢弃传出流量,而不是将其发送到 Berlin 网络(192.0.2.0/24)。但是,无论配置的行为如何,都无法在没有静态路由的情况下进行通信。
注意

除了配置静态路由外,还必须在两个路由器上启用 IP 转发。

21.2. 如何使用 nmcli 命令配置静态路由

要配置静态路由,请使用具有以下语法的 nmcli 工具:

$ nmcli connection modify connection_name ipv4.routes "ip[/prefix] [next_hop] [metric] [attribute=value] [attribute=value] ..."

该命令支持以下路由属性:

  • cwnd=n :设置拥塞窗口(CWND)大小,以数据包数量定义。
  • lock-cwnd=true|false :定义内核是否能够更新 CWND 值。
  • lock-mtu=true|false :定义内核是否可以将 MTU 更新为路径 MTU 发现。
  • lock-window=true|false :定义内核是否可更新 TCP 数据包的最大窗口大小。
  • mtu=n :设置要与目的地的路径一起使用的最大传输单元(MTU)。
  • onlink=true|false :定义下一个跃点是否直接附加到此链接,即使它与任何接口前缀都不匹配。
  • scope=n: 对于 IPv4 路由,此属性设置路由前缀所涵盖的目的地的范围。将值设为整数(0-255)。
  • src=address :将源地址设置为偏好将流量发送到路由前缀所涵盖的目的地。
  • table=table_id :设置路由应添加到的表的 ID。如果省略此参数,NetworkManager 将使用 main 表。
  • tos=n :设置服务(TOS)密钥类型。将值设为整数(0-255)。
  • type=value :设置路由类型。NetworkManager 支持 unicast, local, blackhole, unreachable, prohibit, 和 throw 路由类型。默认为 unicast
  • window=n :设置 TCP 的最大窗口大小,以字节形式播发这些目的地。

如果使用 ipv4.routes 子命令,nmcli 会覆盖这个参数的所有当前设置。

添加路由:

$ nmcli connection modify connection_name +ipv4.routes "..."

同样,要删除一个特定的路由:

$ nmcli connection modify connection_name -ipv4.routes "..."

21.3. 使用 nmcli 命令配置静态路由

您可以使用 nmcli connection modify 命令在网络连接配置中添加静态路由。

本节中的流程描述了如何将路由添加到 192.0.2.0/24 网络,该网络 使用运行在 198.51.100.1 上的网关,该网关可通过 example 连接访问。

先决条件

  • 网络已配置
  • 静态路由的网关必须在接口上直接访问。
  • 如果用户在物理控制台中登录,用户权限就足够了。否则,命令需要 root 权限。

步骤

  1. 将静态路由添加到 example 连接中:

    $ sudo nmcli connection modify example +ipv4.routes "192.0.2.0/24 198.51.100.1"

    要在一个步骤中设置多个路由,使用逗号分隔单个路由传递给该命令。例如,要将路由添加到 192.0.2.0/24203.0.113.0/24 网络,并且它们都通过 198.51.100.1 网关进行路由,请输入:

    $ sudo nmcli connection modify example +ipv4.routes "192.0.2.0/24 198.51.100.1, 203.0.113.0/24 198.51.100.1"
  2. (可选)验证路由是否已正确添加到配置中:

    $ nmcli connection show example
    ...
    ipv4.routes:        { ip = 192.0.2.1/24, nh = 198.51.100.1 }
    ...
  3. 重启网络连接:

    $ sudo nmcli connection up example
    警告

    重启连接会破坏那个接口的连接。

  4. (可选)验证路由是否活跃:

    $ ip route
    ...
    192.0.2.0/24 via 198.51.100.1 dev example proto static metric 100

其他资源

  • nmcli(1) man page

21.4. 使用 control-center 配置静态路由

您可以使用 GNOME 中的 control-center 来将静态路由添加到网络连接配置中。

本节中的流程描述了如何将路由添加到 192.0.2.0/24 网络,该网络使用运行在 198.51.100.1 上的网关。

先决条件

步骤

  1. 打开 IPv4 选项卡。
  2. (可选)点击 IPv4 选项卡的 Routes 部分中的 On 按钮来禁用自动路由,来仅使用静态路由。如果启用了自动路由,Red Hat Enterprise Linux 将使用静态路由和从 DHCP 服务器接收的路由。
  3. 输入地址、子网掩码、网关和可选的指标值:

    IPv4 static route in control center

  4. 应用
  5. 回到 网络 窗口中,通过将连接按钮切换到 Off 及回到 On 来禁用及重新启用连接,以使更改生效。

    警告

    重启连接会破坏那个接口的连接。

  6. (可选)验证路由是否活跃:

    $ ip route
    ...
    192.0.2.0/24 via 198.51.100.1 dev example proto static metric 100

21.5. 使用 nm-connection-editor 配置静态路由

您可以使用 nm-connection-editor 应用程序将静态路由添加到网络连接的配置中。

本节中的流程描述了如何将路由添加到 192.0.2.0/24 网络,该网络使用运行在 198.51.100.1 上的网关,该网关可通过 example 连接进行访问。

先决条件

  • 网络已配置。
  • 静态路由的网关必须在接口上直接访问。

步骤

  1. 打开终端并输入 nm-connection-editor

    $ nm-connection-editor
  2. 选择 example 连接,并点击齿轮图标来编辑现有连接。
  3. 打开 IPv4 选项卡。
  4. 点击 路由 按钮。
  5. 点击 添加 按钮并输入地址、子网掩码、网关以及可选的指标值。

    IPv4 static route in nm connection editor

  6. 点击 确定
  7. 点击 Save
  8. 重启网络连接以使更改生效。例如,要使用命令行重启 example 连接:

    $ sudo nmcli connection up example
  9. (可选)验证路由是否活跃:

    $ ip route
    ...
    192.0.2.0/24 via 198.51.100.1 dev example proto static metric 100

21.6. 使用 nmcli 互动模式配置静态路由

您可以使用 nmcli 工具的交互模式来将静态路由添加到网络连接的配置中。

本节中的流程描述了如何将路由添加到 192.0.2.0/24 网络,该网络使用运行在 198.51.100.1 上的网关,该网关可通过 example 连接进行访问。

先决条件

  • 网络已配置
  • 静态路由的网关必须在接口上直接访问。
  • 如果用户在物理控制台中登录,用户权限就足够了。否则,命令需要 root 权限。

步骤

  1. example 连接打开 nmcli 交互模式:

    $ sudo nmcli connection edit example
  2. 添加静态路由:

    nmcli> set ipv4.routes 192.0.2.0/24 198.51.100.1
  3. (可选)验证路由是否已正确添加到配置中:

    nmcli> print
    ...
    ipv4.routes:        { ip = 192.0.2.1/24, nh = 198.51.100.1 }
    ...

    ip 属性显示到路由的网络,nh 属性显示到路由的网关(下一跳)。

  4. 保存配置:

    nmcli> save persistent
  5. 重启网络连接:

    nmcli> activate example
    警告

    当您重启连接时,所有当前使用这个连接的连接将会被暂时中断。

  6. 保留 nmcli 互动模式:

    nmcli> quit
  7. (可选)验证路由是否活跃:

    $ ip route
    ...
    192.0.2.0/24 via 198.51.100.1 dev example proto static metric 100

21.7. 使用 nmstatectl 配置静态路由

您可以使用 nmstatectl 工具将静态路由添加到网络连接的配置中。

本节中的流程描述了如何将路由添加到 192.0.2.0/24 网络,该网络使用运行在 198.51.100.1 上的网关,该网关可通过 enp1s0 接口访问。

先决条件

  • enp1s0 网络接口已配置。
  • 静态路由的网关必须在接口上直接访问。
  • 已安装 nmstate 软件包。

步骤

  1. 创建一个 YAML 文件,如 ~/add-static-route-to-enp1s0.yml,其内容如下:

    ---
    routes:
      config:
      - destination: 192.0.2.0/24
        next-hop-address: 198.51.100.1
        next-hop-interface: enp1s0
  2. 将设置应用到系统:

    # nmstatectl apply ~/add-static-route-to-enp1s0.yml

其他资源

  • nmstatectl(8) man page
  • /usr/share/doc/nmstate/examples/

21.8. 使用 RHEL 系统角色配置静态路由

您可以使用网络 RHEL 系统角色配置静态路由。

重要

当您运行使用 Networking RHEL 系统角色的 play 时,如果设置的值与 play 中指定的名称不匹配,则系统角色会覆盖具有相同名称的连接配置集。因此,始终在剧本中指定网络连接配置文件的完整配置,即使 IP 配置已经存在。否则,角色会将这些值重置为默认值。

根据它是否已存在,流程使用以下设置创建或更新 enp7s0 连接配置文件:

  • 静态 IPv4 地址 - 198.51.100.20,子网掩码为/24
  • 静态 IPv6 地址 - 2001:db8:1::1/64 子网掩码
  • IPv4 默认网关 - 198.51.100.254
  • IPv6 默认网关 - 2001:db8:1::fffe
  • IPv4 DNS 服务器 - 198.51.100.200
  • IPv6 DNS 服务器 - 2001:db8:1::ffbb
  • DNS 搜索域 - example.com
  • 静态路由:

    • 192.0.2.0/24,网关为 198.51.100.1
    • 203.0.113.0/24,网关为 198.51.100.2

先决条件

  • ansible-corerhel-system-roles 软件包在控制节点上安装。
  • 如果您在运行 playbook 时使用了与 root 不同的远程用户,则此用户在受管节点上具有合适的 sudo 权限。

步骤

  1. 如果您要在其上执行 playbook 中指令的主机还没有被列入清单,请将此主机的 IP 或名称添加到 /etc/ansible/hosts Ansible 清单文件中:

    node.example.com
  2. 使用以下内容创建 ~/add-static-routes.yml playbook:

    ---
    - name: Configure an Ethernet connection with static IP and additional routes
      hosts: node.example.com
      become: true
      tasks:
      - include_role:
          name: rhel-system-roles.network
    
        vars:
          network_connections:
            - name: enp7s0
              type: ethernet
              autoconnect: yes
              ip:
                address:
                  - 198.51.100.20/24
                  - 2001:db8:1::1/64
                gateway4: 198.51.100.254
                gateway6: 2001:db8:1::fffe
                dns:
                  - 198.51.100.200
                  - 2001:db8:1::ffbb
                dns_search:
                  - example.com
                route:
                  - network: 192.0.2.0
                    prefix: 24
                    gateway: 198.51.100.1
                  - network: 203.0.113.0
                    prefix: 24
                    gateway: 198.51.100.2
              state: up
  3. 运行 playbook:

    • 要以 root 用户身份连接到受管主机,请输入:

      # ansible-playbook -u root ~/add-static-routes.yml
    • 以用户身份连接到受管主机,请输入:

      # ansible-playbook -u user_name --ask-become-pass ~/add-static-routes.yml

      --ask-become-pass 选项确保 ansible-playbook 命令提示输入 -u user_name 选项中定义的用户的 sudo 密码。

    如果没有指定 -u user_name 选项,ansible-playbook 以当前登录到控制节点的用户身份连接到受管主机。

验证步骤

  • 显示路由表:

    # ip -4 route
    default via 198.51.100.254 dev enp7s0 proto static metric 100
    192.0.2.0/24 via 198.51.100.1 dev enp7s0 proto static metric 100
    203.0.113.0/24 via 198.51.100.2 dev enp7s0 proto static metric 100
    ...

其他资源

  • /usr/share/ansible/roles/rhel-system-roles.network/README.md 文件
  • ansible-playbook(1) 手册页

第 22 章 配置基于策略的路由以定义其他路由

默认情况下,RHEL 中的内核决定使用路由表根据目标地址转发网络数据包。基于策略的路由允许您配置复杂的路由场景。例如,您可以根据各种条件路由数据包,如源地址、数据包元数据或协议。

本节论述了如何使用 NetworkManager 配置基于策略的路由。

注意

在使用 NetworkManager 的系统中,只有 nmcli 工具支持设置路由规则,并将路由分配到特定表。

22.1. 使用 NetworkManager 将特定子网的流量路由到不同的默认网关

本节论述了如何将 RHEL 配置为默认路由将所有流量路由到互联网供应商 A 的路由器。使用基于策略的路由,RHEL 会将从内部工作站子网接收的流量路由到供应商 B。

该流程假设以下网络拓扑:

policy based routing

先决条件

  • 系统使用 NetworkManager 配置网络,这是默认设置。
  • 要在流程中设置的 RHEL 路由器有四个网络接口:

    • enp7s0 接口连接到提供商 A 的网络。提供商网络中的网关 IP 是 198.51.100.2,网络使用 /30 网络掩码。
    • enp1s0 接口连接到提供商 B 的网络。提供商网络中的网关 IP 是 192.0.2.2,网络使用 /30 网络掩码。
    • enp8s0 接口与内部工作站一起连接到 10.0.0.0/24 子网。
    • enp9s0 接口与公司服务器的 203.0.113.0/24 子网相连。
  • 内部工作站子网中的主机使用 10.0.0.1 作为默认网关。在此过程中,您可以将这个 IP 地址分配给路由器的 enp8s0 网络接口。
  • 服务器子网中的主机使用 203.0.113.1 作为默认网关。在此过程中,您可以将这个 IP 地址分配给路由器的 enp9s0 网络接口。
  • firewalld 服务已启用并激活。

步骤

  1. 将网络接口配置为供应商 A:

    # nmcli connection add type ethernet con-name Provider-A ifname enp7s0 ipv4.method manual ipv4.addresses 198.51.100.1/30 ipv4.gateway 198.51.100.2 ipv4.dns 198.51.100.200 connection.zone external

    nmcli connection add 命令创建 NetworkManager 连接配置集。以下列表描述了该命令的选项:

    • type ethernet: 定义连接类型是以太网。
    • con-name connection_name :设置配置文件的名称。使用有意义的名称以避免混淆。
    • ifname network_device :设置网络接口。
    • ipv4.method manual :用来配置静态 IP 地址。
    • ipv4.addresses IP_address/subnet_mask :设置 IPv4 地址和子网掩码。
    • ipv4.gateway IP_address :设置默认网关地址。
    • ipv4.dns IP_of_DNS_server :设置 DNS 服务器的 IPv4 地址。
    • connection.zone firewalld_zone :将网络接口分配给定义的 firewalld 区域。请注意,firewalld 会自动启用分配给 外部 区的接口的伪装。
  2. 将网络接口配置为供应商 B:

    # nmcli connection add type ethernet con-name Provider-B ifname enp1s0 ipv4.method manual ipv4.addresses 192.0.2.1/30 ipv4.routes "0.0.0.0/0 192.0.2.2 table=5000" connection.zone external

    此命令使用 ipv4.routes 参数,而不是 ipv4.gateway 来设置默认网关。这需要将此连接的默认网关分配给默认路由表之外的路由表(5000)。当连接被激活时,NetworkManager 会自动创建这个新的路由表。

  3. 将网络接口配置为内部工作站子网:

    # nmcli connection add type ethernet con-name Internal-Workstations ifname enp8s0 ipv4.method manual ipv4.addresses 10.0.0.1/24 ipv4.routes "10.0.0.0/24 table=5000" ipv4.routing-rules "priority 5 from 10.0.0.0/24 table 5000" connection.zone trusted

    此命令使用 ipv4.routes 参数来将静态路由添加到 ID 为 5000 的路由表。10.0.0.0/24 子网的这个静态路由使用本地网络接口的 IP 地址到供应商 B(192.0.2.1)作为下一个跃点。

    此外,该命令使用 ipv4.routing-rules 参数添加优先级为 5 的路由规则,该规则将来自 10.0.0.0/24 子网的流量路由到表 5000。低的值具有更高的优先级。

    请注意,ipv4.routing-rules 参数的语法与 ip rule add 命令中的语法相同,但 ipv4.routing-rules 总是需要指定优先级。

  4. 将网络接口配置为服务器子网:

    # nmcli connection add type ethernet con-name Servers ifname enp9s0 ipv4.method manual ipv4.addresses 203.0.113.1/24 connection.zone trusted

验证步骤

  1. 在内部工作站子网的 RHEL 主机上:

    1. 安装 traceroute 软件包:

      # dnf install traceroute
    2. 使用 traceroute 工具显示到互联网主机的路由:

      # traceroute redhat.com
      traceroute to redhat.com (209.132.183.105), 30 hops max, 60 byte packets
       1  10.0.0.1 (10.0.0.1)     0.337 ms  0.260 ms  0.223 ms
       2  192.0.2.1 (192.0.2.1)   0.884 ms  1.066 ms  1.248 ms
       ...

      命令的输出显示路由器通过 192.0.2.1 (其是提供商 B 的网络)发送数据包。

  2. 在服务器子网的 RHEL 主机上:

    1. 安装 traceroute 软件包:

      # dnf install traceroute
    2. 使用 traceroute 工具显示到互联网主机的路由:

      # traceroute redhat.com
      traceroute to redhat.com (209.132.183.105), 30 hops max, 60 byte packets
       1  203.0.113.1 (203.0.113.1)    2.179 ms  2.073 ms  1.944 ms
       2  198.51.100.2 (198.51.100.2)  1.868 ms  1.798 ms  1.549 ms
       ...

      命令的输出显示路由器通过 198.51.100.2 发送数据包,即供应商 A 的网络。

故障排除步骤

在 RHEL 路由器中:

  1. 显示规则列表:

    # ip rule list
    0:	from all lookup local
    5:	from 10.0.0.0/24 lookup 5000
    32766:	from all lookup main
    32767:	from all lookup default

    默认情况下,RHEL 包含表 localmaindefault 的规则。

  2. 显示表 5000 中的路由:

    # ip route list table 5000
    0.0.0.0/0 via 192.0.2.2 dev enp1s0 proto static metric 100
    10.0.0.0/24 dev enp8s0 proto static scope link src 192.0.2.1 metric 102
  3. 显示接口和防火墙区:

    # firewall-cmd --get-active-zones
    external
      interfaces: enp1s0 enp7s0
    trusted
      interfaces: enp8s0 enp9s0
  4. 验证 外部 区是否启用了伪装:

    # firewall-cmd --info-zone=external
    external (active)
      target: default
      icmp-block-inversion: no
      interfaces: enp1s0 enp7s0
      sources:
      services: ssh
      ports:
      protocols:
      masquerade: yes
      ...

其他资源

第 23 章 创建 dummy 接口

作为 Red Hat Enterprise Linux 用户,您可以创建并使用 dummy 网络接口进行调试和测试。dummy 接口提供了一个设备来路由数据包而无需实际传送数据包。它可让您创建使用网络管理器(NetworkManager)管理的其他回送设备,使不活跃 SLIP(Serial Line Internet Protocol)地址类似本地程序的实际地址。

23.1. 使用 nmcli 使用 IPv4 和 IPv6 地址创建 dummy 接口

您可以创建带有各种设置的 dummy 接口。这个步骤描述了如何使用 IPv4 和 IPv6 地址创建 dummy 接口。创建虚拟接口后,NetworkManager 会自动将其分配给默认的 public 防火墙区域。

注意

要配置没有 IPv4 或 IPv6 地址的虚拟接口,请将 ipv4.methodipv6.method 参数设为 disabled。否则,IP 自动配置失败,NetworkManager 会取消激活连接并删除 dummy 设备。

流程

  1. 要创建一个名为 dummy0 的、带有静态 IPv4 和 IPv6 地址的 dummy 接口,请输入:

    # nmcli connection add type dummy ifname dummy0 ipv4.method manual ipv4.addresses 192.0.2.1/24 ipv6.method manual ipv6.addresses 2001:db8:2::1/64
  2. 可选: 要查看 dummy 接口,请输入:

    # nmcli connection show
    NAME            UUID                                  TYPE      DEVICE
    enp1s0          db1060e9-c164-476f-b2b5-caec62dc1b05  ethernet    ens3
    dummy-dummy0    aaf6eb56-73e5-4746-9037-eed42caa8a65  dummy    dummy0

其它资源

  • nm-settings(5) man page

第 24 章 使用 nmstate-autoconf 使用 LLDP 自动配置网络状态

网络设备可以使用 Link Layer Discovery Protocol(LLDP)在 LAN 中公告其身份、功能和邻居。nmstate-autoconf 实用程序可使用这些信息来自动配置本地网络接口。

重要

nmstate-autoconf 工具仅作为技术预览提供。红帽产品服务级别协议(SLA)不支持技术预览功能,且其功能可能并不完善,因此红帽不建议在生产环境中使用它们。这些预览可让用户早期访问将来的产品功能,让用户在开发过程中测试并提供反馈意见。

如需有关 技术预览功能支持范围 的信息,请参阅红帽客户门户网站中的技术预览功能支持范围。

24.1. 使用 nmstate-autoconf 自动配置网络接口

nmstate-autoconf 工具使用 LLDP 来标识连接到交换机的接口的 VLAN 设置,以配置本地设备。

此流程假设以下场景,交换机使用 LLDP 广播 VLAN 设置:

  • RHEL 服务器的 enp1s0enp2s0 接口连接到交换机端口,该端口 VLAN ID 为 100 ,VLAN 名称为 prod-net
  • RHEL 服务器的 enp3s0 接口连接到交换机端口,该端口 VLAN ID 为200 , VLAN 名称为 mgmt-net

然后,nmstate-autoconf 工具使用此信息在服务器上创建以下接口:

  • bond100 - 将 enp1s0 enp2s0 作为端口的绑定接口。
  • prod-net - VLAN ID 为 100bond100 上的 VLAN 接口。
  • mgmt-net - VLAN ID 为 200enp3s0 上的 VLAN 接口。

如果您将多个网络接口连接到 LLDP 广播的同一 VLAN ID 的不同交换机端口,则 nmstate-autoconf 会创建具有这些接口的绑定,并在此之上配置通用的 VLAN ID。

先决条件

  • 已安装 nmstate 软件包。
  • 在网络交换机上启用了 LLDP。
  • 以太网接口为 up。

步骤

  1. 在以太网接口上启用 LLDP:

    1. 创建包含以下内容的 YAML 文件,如 ~/enable-lldp.yml

      interfaces:
        - name: enp1s0
          type: ethernet
          lldp:
            enabled: true
        - name: enp2s0
          type: ethernet
          lldp:
            enabled: true
        - name: enp3s0
          type: ethernet
          lldp:
            enabled: true
    2. 将设置应用到系统:

      # nmstatectl apply ~/enable-lldp.yml
  2. 使用 LLDP 配置网络接口:

    1. 可选,启动一个试运行,来显示并验证 nmstate-autoconf 生成的 YAML 配置:

      # nmstate-autoconf -d enp1s0,enp2s0,enp3s0
      ---
      interfaces:
      - name: prod-net
        type: vlan
        state: up
        vlan:
          base-iface: bond100
          id: 100
      - name: mgmt-net
        type: vlan
        state: up
        vlan:
          base-iface: enp3s0
          id: 200
      - name: bond100
        type: bond
        state: up
        link-aggregation:
          mode: balance-rr
          port:
          - enp1s0
          - enp2s0
    2. 使用 nmstate-autoconf ,根据从 LLDP 收到的信息生成配置,并将设置应用到系统:

      # nmstate-autoconf enp1s0,enp2s0,enp3s0

后续步骤

验证

  1. 显示单个接口的设置:

    # nmstatectl show <interface_name>

其他资源

  • nmstate-autoconf(8) man page

第 25 章 使用 LLDP 调试网络配置问题

您可以使用 Link Layer Discovery Protocol(LLDP)来调试拓扑中的网络配置问题。这意味着 LLDP 可能会报告与其他主机或路由器和交换机的配置不一致。

25.1. 使用 LLDP 信息调试不正确的 VLAN 配置

如果您将交换机端口配置为使用特定的 VLAN 和主机收到这些 VLAN 数据包,您可以使用 Link Layer Discovery Protocol(LLDP)来调试问题。在没有接收数据包的主机上执行这个步骤。

先决条件

  • 已安装 nmstate 软件包。
  • 交换机支持 LLDP。
  • LLDP 在邻居设备上已启用。

步骤

  1. 使用以下内容创建 ~/enable-LLDP-enp1s0.yml 文件:

    interfaces:
      - name: enp1s0
        type: ethernet
        lldp:
          enabled: true
  2. 使用 ~/enable-LLDP-enp1s0.yml 文件,在接口 enp1s0 上启用 LLDP:

    # nmstatectl apply ~/enable-LLDP-enp1s0.yml
  3. 显示 LLDP 信息:

    # nmstatectl show enp1s0
    - name: enp1s0
      type: ethernet
      state: up
      ipv4:
        enabled: false
        dhcp: false
      ipv6:
        enabled: false
        autoconf: false
        dhcp: false
      lldp:
        enabled: true
        neighbors:
        - - type: 5
            system-name: Summit300-48
          - type: 6
            system-description: Summit300-48 - Version 7.4e.1 (Build 5)
              05/27/05 04:53:11
          - type: 7
            system-capabilities:
            - MAC Bridge component
            - Router
          - type: 1
            _description: MAC address
            chassis-id: 00:01:30:F9:AD:A0
            chassis-id-type: 4
          - type: 2
            _description: Interface name
            port-id: 1/1
            port-id-type: 5
          - type: 127
            ieee-802-1-vlans:
            - name: v2-0488-03-0505
              vid: 488
            oui: 00:80:c2
            subtype: 3
          - type: 127
            ieee-802-3-mac-phy-conf:
              autoneg: true
              operational-mau-type: 16
              pmd-autoneg-cap: 27648
            oui: 00:12:0f
            subtype: 1
          - type: 127
            ieee-802-1-ppvids:
            - 0
            oui: 00:80:c2
            subtype: 2
          - type: 8
            management-addresses:
            - address: 00:01:30:F9:AD:A0
              address-subtype: MAC
              interface-number: 1001
              interface-number-subtype: 2
          - type: 127
            ieee-802-3-max-frame-size: 1522
            oui: 00:12:0f
            subtype: 4
      mac-address: 82:75:BE:6F:8C:7A
      mtu: 1500
  4. 验证输出,以确保设置与您的预期配置匹配。例如,连接到交换机的接口的 LLDP 信息显示此主机的交换机端口已连接到使用 VLAN ID 448:

    - type: 127
            ieee-802-1-vlans:
            - name: v2-0488-03-0505
              vid: 488

    如果 enp1s0 接口的网络配置使用不同的 VLAN ID,请相应地进行修改。

其他资源

配置 VLAN 标记

第 26 章 使用密钥文件格式手动创建 NetworkManager 配置集

默认情况下,NetworkManager 以密钥文件格式存储配置集。例如,nmcli 实用程序、networking RHEL 系统角色或 nmstate API 来管理配置集使用这种格式。但是,NetworkManager 仍然支持已弃用的 ifcfg 格式的配置集。

26.1. NetworkManager 配置集的密钥文件格式

NetworkManager 在磁盘上存储连接配置集时使用 INI 样式的密钥文件格式。

使用密钥文件格式的以太网连接配置集示例

[connection]
id=example_connection
uuid=82c6272d-1ff7-4d56-9c7c-0eb27c300029
type=ethernet
autoconnect=true

[ipv4]
method=auto

[ipv6]
method=auto

[ethernet]
mac-address=00:53:00:8f:fa:66

每个部分对应于 NetworkManager 设置名称,如 nm-settings(5)nm-settings-keyfile(5) 手册页中所述。每个部分中的每个键值对是 man page 设置规格中列出的属性之一。

NetworkManager 密钥文件中大多数变量都有一个一对一的映射。这意味着 NetworkManager 属性作为相同名称的变量和相同格式存储在密钥文件中。但存在一些例外情况,主要是为了使密钥文件语法更易于阅读。有关这些例外列表,请查看 nm-settings-keyfile(5) man page。

重要

出于安全考虑,由于连接配置文件可能会包含敏感信息,如私钥和密码短语,因此 NetworkManager 仅使用 root 所拥有的配置文件,这些文件仅对 root 可读写。

根据连接配置集的目的,将其保存在以下目录中:

  • /etc/NetworkManager/system-connections/ :用户创建的、可编辑的持久性配置文件的通用位置。NetworkManager 会自动将它们复制到 /etc/NetworkManager/system-connections/
  • /run/NetworkManager/system-connections/ :用于重新引导系统时自动删除的临时配置文件。
  • /usr/lib/NetworkManager/system-connections/ :用于预部署的不可变配置集。当您使用 NetworkManager API 编辑此类配置集时,NetworkManager 会把这个配置集复制到持久或临时存储。

NetworkManager 不会从磁盘自动重新载入配置集。当您使用密钥文件格式创建或更新连接配置集时,请使用 nmcli connection reload 命令告知 NetworkManager 相关的变化。

26.2. 使用密钥文件格式创建 NetworkManager 配置集

本节介绍如何以密钥文件格式手动创建 NetworkManager 连接配置集的一般步骤。

注意

手动创建或更新配置文件可能会导致意外或无法正常工作的网络配置。红帽建议您使用 NetworkManager 工具,如 nmclinetwork RHEL 系统角色或 nmstate API 来管理 NetworkManager 连接。

步骤

  1. 如果您是为硬件接口(如以太网)创建配置集,请显示这个接口的 MAC 地址:

    # ip address show enp1s0
    2: enp1s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
        link/ether 00:53:00:8f:fa:66 brd ff:ff:ff:ff:ff:ff
  2. 创建连接配置集。例如,对于使用 DHCP 的以太网设备的连接配置集,请使用以下内容创建 /etc/NetworkManager/system-connections/example.nmconnection 文件:

    [connection]
    id=example_connection
    type=ethernet
    autoconnect=true
    
    [ipv4]
    method=auto
    
    [ipv6]
    method=auto
    
    [ethernet]
    mac-address=00:53:00:8f:fa:66
    注意

    您可以使用带有 .nmconnection 后缀的任何文件名。但是,当您稍后使用 nmcli 命令来管理连接时,您必须在引用此连接时使用 id 变量中设置的连接名称。当省略 id 变量时,请使用不带 .nmconnection 的文件名来引用此连接。

  3. 设置配置文件的权限,以便只有 root 用户可以读取和更新它:

    # chown root:root /etc/NetworkManager/system-connections/example.nmconnection
    # chmod 600 /etc/NetworkManager/system-connections/example.nmconnection
  4. 重新载入连接配置集:

    # nmcli connection reload
  5. 验证 NetworkManager 是否从配置文件读取配置集:

    # nmcli -f NAME,UUID,FILENAME connection
    NAME                UUID                                  FILENAME
    example-connection  86da2486-068d-4d05-9ac7-957ec118afba  /etc/NetworkManager/system-connections/example.nmconnection
    ...

    如果命令不显示新添加的连接,请验证文件权限和您在文件中使用的语法是否正确。

  6. 可选:如果您将配置集中的 autoconnect 变量设置为 false,激活连接:

    # nmcli connection up example_connection

验证

  1. 显示连接配置集:

    # nmcli connection show example_connection
  2. 显示接口的 IP 设置:

    # ip address show enp1s0

其他资源

  • nm-settings-keyfile(5)

26.3. 将 NetworkManager 配置集从 ifcfg 迁移到密钥文件格式

您可以使用 nmcli 连接迁移 命令将现有 ifcfg 连接配置集迁移到密钥文件格式。这样,所有连接配置集都将位于一个位置和首选格式。

先决条件

  • /etc/sysconfig/network-scripts/ 目录中有 ifcfg 格式的连接配置集。

步骤

  • 迁移连接配置集:

    # nmcli connection migrate
    Connection 'enp1s0' (43ed18ab-f0c4-4934-af3d-2b3333948e45) successfully migrated.
    Connection 'enp2s0' (883333e8-1b87-4947-8ceb-1f8812a80a9b) successfully migrated.
    ...

验证

  • 另外,您可以验证是否成功迁移了所有连接配置集:

    # nmcli -f TYPE,FILENAME,NAME connection
    TYPE      FILENAME                                                           NAME
    ethernet  /etc/NetworkManager/system-connections/enp1s0.nmconnection         enp1s0
    ethernet  /etc/NetworkManager/system-connections/enp2s0.nmconnection         enp2s0
    ...

其他资源

  • nm-settings-keyfile(5)
  • nm-settings-ifcfg-rh(5)
  • nmcli(1)

第 27 章 使用 netconsole 通过网络记录内核信息

使用 netconsole 内核模块和同名的服务,您可以在登录到磁盘或者无法使用串口控制台时,通过网络记录内核信息来调试内核。

27.1. 配置 netconsole 服务为将内核信息记录到远程主机

使用 netconsole 内核模块,您可以将内核信息记录到远程系统日志服务。

先决条件

  • 远程主机上安装系统日志服务,如 rsyslog
  • 远程系统日志服务被配置为接收来自此主机的日志条目。

步骤

  1. 安装 netconsole-service 软件包:

    # dnf install netconsole-service
  2. 编辑 /etc/sysconfig/netconsole 文件,并将 SYSLOGADDR 参数设置为远程主机的 IP 地址:

    # SYSLOGADDR=192.0.2.1
  3. 启用并启动 netconsole 服务:

    # systemctl enable --now netconsole

验证步骤

  • 在远程系统日志服务器上显示 /var/log/messages 文件。

第 28 章 systemd 网络目标和服务

NetworkManager 在系统引导过程中配置网络。但是,当使用远程根(/)引导时,比如,如果根目录存储在 iSCSI 设备中,则在启动 RHEL 之前,则会在初始 RAM 磁盘(initrd)中应用网络设置。例如,如果在内核命令行中使用 rd.neednet=1 指定网络配置,或者指定配置来挂载远程文件系统,则在 initrd 中应用网络设置。

这部分论述了应用网络设置时使用的不同目标,如 network, network-online, 和 NetworkManager-wait-online 服务,以及在 network-online 服务启动后,如何配置 systemd 服务来启动。

28.1. network 和 network-online systemd target 的不同

systemd 维护 networknetwork-online 目标单元。特殊单元,如 NetworkManager-wait-online.service,具有 WantedBy=network-online.targetBefore=network-online.target 参数。如果启用,这些单元从 network-online.target 开始,并延迟达到的目标,直到建立了某种形式的网络连接。它们会延迟 网络在线 目标,直到网络连接。

network-online 目标启动一个服务,这会增加更长的延迟来进一步执行。systemd 会自动将这个目标单元的 WantsAfter 参数的依赖项添加到所有 System V(SysV) init 脚本服务单元,并带有一个 Linux Standard Base(LSB)标头引用 $network 工具。LSB 标头是 init 脚本的元数据。您可以使用它指定依赖项。这与 systemd 目标类似。

网络 目标不会显著延迟引导过程的执行。到达 网络 目标意味着,负责设置网络的服务已启动。但并不意味着已经配置了一个网络设备。这个目标在关闭系统的过程中非常重要。例如,如果您在引导过程中有一个在网络目标后排序的服务,则在关闭过程中会取消这个依赖关系。在服务停止后,网络才会断开连接。远程网络文件系统的所有挂载单元都自动启动网络目标单元,并在其后面执行顺序。

注意

网络在线目标单元只在系统启动时有用。系统完成引导后,这个目标不会跟踪网络的在线状态。因此,您无法使用 network-online 监控网络连接。这个目标提供了一个一次性系统启动概念。

28.2. NetworkManager-wait-online 概述

NetworkManager-wait-online 服务会等待网络配置网络超时。这个网络配置涉及插入以太网设备、扫描 Wi-Fi 设备等。NetworkManager 会自动激活配置为自动启动的适当配置集。因 DHCP 超时或类似事件导致自动激活失败,网络管理器(NetworkManager)可能会在一定时间内处于忙碌状态。根据配置,NetworkManager 会重新尝试激活同一配置集或不同的配置集。

当启动完成后,所有配置集都处于断开连接的状态,或被成功激活。您可以配置配置集来自动连接。以下是一些参数示例,这些参数设定超时或者在连接被视为活跃时定义:

  • connection.wait-device-timeout - 设置驱动程序用于检测设备的超时时间
  • ipv4.may-failipv6.may-fail - 使用一个 IP 地址系列设置激活,或者一个特定的地址系列是否需要完成配置。
  • ipv4.gateway-ping-timeout - 延迟激活。

其他资源

  • nm-settings(5) man page

28.3. 将 systemd 服务配置为在网络已启动后再启动

Red Hat Enterprise Linux 在 /usr/lib/systemd/system/ 目录中安装 systemd 服务文件。此流程为 /etc/systemd/system/service_name.service.d/ 中的服务文件创建一个置入片断,该文件与 /usr/lib/systemd/system/ 中的服务文件一起使用,以在网络在线后启动一个特定的服务。如果在 drop-in 片断中的设置与 /usr/lib/systemd/system/ 中的服务文件中的设置重叠,则其具有更高优先级。

步骤

  1. 要在编辑器中打开服务文件,请输入:

    # systemctl edit service_name

  2. 输入以下内容并保存更改:

    [Unit]
    After=network-online.target
  3. 重新加载 systemd 服务。

    # systemctl daemon-reload

第 29 章 Linux 流量控制

Linux 提供管理和操作数据包传输的工具。Linux 流量控制(TC)子系统帮助进行策略、分类、控制以及调度网络流量。TC 还可以通过使用过滤器和动作在分类过程中利用数据包内容分栏。TC 子系统使用排队规则(qdisc)(TC 架构的一个基本元素)来实现此目的。

调度机制在进入或退出不同的队列前确定或者重新安排数据包。最常见的调度程序是先入先出(FIFO)调度程序。您可以使用 tc 实用程序或永久使用 NetworkManager 进行 qdiscs 操作。

本节介绍排队规则,并描述了如何更新 RHEL 中的默认 qdisc

29.1. 排队规则概述

排队规则(qdiscs)帮助排队和之后,通过网络接口调度流量传输。qdisc 有两个操作:

  • 排队请求,以便可以对数据包进行排队以进行稍后传输和
  • 取消队列请求,以便可以选择其中一个已排队的数据包以便立即传输。

每个 qdisc 都有一个 16 位十六进制数字,称为 handle(句柄),带有附加的冒号,如 1:abcd:这个数字被称为 qdisc 主号码。如果 qdisc 有类,则标识符为一个由两个数字组成的对,主数字在次数字之前, <major>:<minor>,例如 abcd:1。次要数字的编号方案取决于 qdisc 类型。有时,编号是系统性的,第一类有 ID <major>:1、第 2 类 <major>:2 等。一些 qdiscs 允许用户在创建类时随机设置类次要号码。

classful qdiscs

存在不同的 qdiscs,有助于将数据包传输到网络接口或从网络接口传输。您可以使用 root、parent 或 child 类配置 qdiscs。子对象可以被附加的位置被称为 class。qdisc 中的类灵活,始终需要包含多个子类或一个单一子类 qdisc。对于包含类 qdisc 本身的类,这无法实现复杂的流量控制场景。

classful qdiscs 不存储任何数据包本身。反之,它们根据 qdisc 的具体条件把子队列和出队请求降到他们的子对象中。最后,这个递归数据包传递最终结束保存数据包的位置(在出现排队时从中提取)。

无类别
有些 qdiscs 不包含子类,它们名为无类别 qdiscs。与类 qdiscs 相比,无类别 qdiscs 需要较少的自定义。通常情况下,将它们附加到接口就足够了。

其他资源

  • TC(8) 手册页
  • TC-actions.8 man page

29.2. RHEL 中可用的 qdiscs

每个 qdisc 解决了唯一的与网络相关的问题。以下是 RHEL 中可用的 qdiscs 列表。您可以使用以下 qdisc 来根据您的网络要求创建网络流量。

表 29.1. RHEL 中的可用调度程序

qdisc 名称包含在卸载支持

异步传输模式(ATM)

kernel-modules-extra

 

基于类的队列

kernel-modules-extra

 

Credit-Based Shaper

kernel-modules-extra

CHOose 和 Keep 用于有响应的流量,CHOose 和 Kill 用于没有响应的流量(CHOKE)

kernel-modules-extra

 

受控的延迟(CoDel)

kernel-core

 

Deficit Round Robin(DRR)

kernel-modules-extra

 

Differentiated Services marker (DSMARK)

kernel-modules-extra

 

Enhanced Transmission Selection (ETS)

kernel-modules-extra

Fair Queue (FQ)

kernel-core

 

Fair Queuing Controlled Delay (FQ_CODel)

kernel-core

 

Generalized Random Early Detection (GRED)

kernel-modules-extra

 

Hierarchical Fair Service Curve (HSFC)

kernel-core

 

Heavy-Hitter Filter (HHF)

kernel-core

 

Hierarchy Token Bucket (HTB)

kernel-core

 

INGRESS

kernel-core

Multi Queue Priority (MQPRIO)

kernel-modules-extra

Multiqueue (MULTIQ)

kernel-modules-extra

Network Emulator (NETEM)

kernel-modules-extra

 

Proportional Integral-controller Enhanced (PIE)

kernel-core

 

PLUG

kernel-core

 

Quick Fair Queueing (QFQ)

kernel-modules-extra

 

Random Early Detection (RED)

kernel-modules-extra

Stochastic Fair Blue (SFB)

kernel-modules-extra

 

Stochastic Fairness Queueing (SFQ)

kernel-core

 

Token Bucket Filter (TBF)

kernel-core

Trivial Link Equalizer (TEQL)

kernel-modules-extra

 
重要

qdisc 卸载需要在 NIC 上支持硬件和驱动程序。

其他资源

  • tc(8), cbq, cbs, choke, CoDel, drr, fq, htb, mqprio, netem, pie, sfb, pfifo, tc-red, sfq, tbf, 和prio man pages.

29.3. 使用 tc 工具检查网络接口的 qdiscs

默认情况下,Red Hat Enterprise Linux 系统使用 fq_codel qdisc。这个步骤描述了如何检查 qdisc 计数器。

步骤

  1. 可选:查看您当前的 qdisc

    # tc qdisc show dev enp0s1

  2. 检查当前的 qdisc 计数器:

    # tc -s qdisc show dev enp0s1
    qdisc fq_codel 0: root refcnt 2 limit 10240p flows 1024 quantum 1514 target 5.0ms interval 100.0ms memory_limit 32Mb ecn
    Sent 1008193 bytes 5559 pkt (dropped 233, overlimits 55 requeues 77)
    backlog 0b 0p requeues 0
    ....
  • dropped - 由于所有队列已满而丢弃数据包的次数
  • overlimits - 配置的链路容量已满的次数
  • sent - 出队的数量

29.4. 更新默认的 qdisc

如果使用当前的 qdisc 观察网络数据包丢失,您可以根据您的网络要求更改 qdisc。您可以选择 qdisc 来满足您的网络要求。这个步骤描述了如何更改 Red Hat Enterprise Linux 中的默认 qdisc

步骤

  1. 查看当前的默认 qdisc

    # sysctl -a | grep qdisc
    net.core.default_qdisc = fq_codel
  2. 查看当前以太网连接的 qdisc

    # tc -s qdisc show dev enp0s1
    qdisc fq_codel 0: root refcnt 2 limit 10240p flows 1024 quantum 1514 target 5.0ms interval 100.0ms memory_limit 32Mb ecn
    Sent 0 bytes 0 pkt (dropped 0, overlimits 0 requeues 0)
    backlog 0b 0p requeues 0
    maxpacket 0 drop_overlimit 0 new_flow_count 0 ecn_mark 0
    new_flows_len 0 old_flows_len 0
  3. 更新现有的 qdisc

    # sysctl -w net.core.default_qdisc=pfifo_fast

  4. 要应用这些更改,重新载入网络驱动程序:

    # rmmod NETWORKDRIVERNAME

    # modprobe NETWORKDRIVERNAME

  5. 启动网络接口:

    # ip link set enp0s1 up

验证步骤

  • 查看以太网连接的 qdisc

    # tc -s qdisc show dev enp0s1
    qdisc pfifo_fast 0: root refcnt 2 bands 3 priomap  1 2 2 2 1 2 0 0 1 1 1 1 1 1 1 1
     Sent 373186 bytes 5333 pkt (dropped 0, overlimits 0 requeues 0)
     backlog 0b 0p requeues 0
    ....

29.5. 使用 tc 工具临时设置网络接口的当前 qdisk

您可以在不更改默认文件的情况下更新当前的 qdisc。这个步骤描述了如何更改 Red Hat Enterprise Linux 中的当前 qdisc

步骤

  1. 可选:查看当前的 qdisc

    # tc -s qdisc show dev enp0s1

  2. 更新当前的 qdisc

    # tc qdisc replace dev enp0s1 root htb

验证步骤

  • 查看更新的当前 qdisc

    # tc -s qdisc show dev enp0s1
    qdisc htb 8001: root refcnt 2 r2q 10 default 0 direct_packets_stat 0 direct_qlen 1000
    Sent 0 bytes 0 pkt (dropped 0, overlimits 0 requeues 0)
    backlog 0b 0p requeues 0

29.6. 使用 NetworkManager 永久设置网络接口的当前 qdisk

您可以更新 NetworkManager 连接的当前 qdisc 值。

步骤

  1. 可选:查看当前的 qdisc

    # tc qdisc show dev enp0s1
      qdisc fq_codel 0: root refcnt 2
  2. 更新当前的 qdisc

    # nmcli connection modify enp0s1 tc.qdiscs ‘root pfifo_fast’
  3. 可选: 要在现有 qdisc 中添加另一个 qdisc,请使用 +tc.qdisc 选项:

    # nmcli connection modify enp0s1 +tc.qdisc ‘ingress handle ffff:’
  4. 激活更改:

    # nmcli connection up enp0s1

验证步骤

  • 查看当前的 qdisc 网络接口:

    # tc qdisc show dev enp0s1
    qdisc pfifo_fast 8001: root refcnt 2 bands 3 priomap  1 2 2 2 1 2 0 0 1 1 1 1 1 1 1 1
    qdisc ingress ffff: parent ffff:fff1 ----------------

其他资源

  • nm-settings(5) man page

第 30 章 多路径 TCP 入门

多路径 TCP(MPTCP)是传输控制协议(TCP)的扩展。使用 Internet 协议(IP),主机可以将数据包发送到目的地。TCP 可确保通过互联网可靠地提供数据,并自动调整其带宽以响应网络负载。

本节描述了如何:

  • 创建新的 MPTCP 连接
  • 启用服务器使用 MPTCP
  • 在内核中禁用 MPTCP

它还包括使用 MPTCP 的优点。

30.1. MPTCP 的优点

多路径 TCP(MPTCP)设计改进了连接稳定性。请注意,在 MPTCP 术语中,链接被视为路径。

以下是 MPTCP 的优点:

  • 它允许连接同时使用多个网络接口。
  • 如果连接绑定到一个链路速度,使用多个链接的使用量可提高连接吞吐量。请注意,如果连接绑定到 CPU,则多个链接的使用情况会导致连接较慢。
  • 它提高了链接故障的恢复能力。

30.2. 准备 RHEL 启用 MPTCP 支持

默认情况下,RHEL 中禁用了 MPTCP 支持。启用 MPTCP,以便支持这个功能的应用程序可以使用它。另外,如果应用程序默认有 TCP 套接字,则必须配置用户空间应用程序来强制使用 MPTCP 套接字。

先决条件

安装以下软件包:

  • iperf3
  • mptcpd

步骤

  1. 在内核中启用 MPTCP 套接字:

    # echo "net.mptcp.enabled=1" > /etc/sysctl.d/90-enable-MPTCP.conf
    # sysctl -p /etc/sysctl.d/90-enable-MPTCP.conf
  2. 启动 iperf3 服务器,并强制它创建 MPTCP 套接字而不是 TCP 套接字:

    # mptcpize run iperf3 -s
    
    Server listening on 5201
  3. 将客户端连接到服务器,并强制它创建 MPTCP 套接字而不是 TCP 套接字:

    # mptcpize iperf3 -c 127.0.0.1 -t 3
  4. 建立连接后,验证 ss 输出以查看特定于子流的状态:

    # ss -nti '( dport :5201 )'
    
    State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
    ESTAB 0      0      127.0.0.1:41842    127.0.0.1:5201
    cubic wscale:7,7 rto:205 rtt:4.455/8.878 ato:40 mss:21888 pmtu:65535 rcvmss:536 advmss:65483 cwnd:10 bytes_sent:141 bytes_acked:142 bytes_received:4 segs_out:8 segs_in:7 data_segs_out:3 data_segs_in:3 send 393050505bps lastsnd:2813 lastrcv:2772 lastack:2772 pacing_rate 785946640bps delivery_rate 10944000000bps delivered:4 busy:41ms rcv_space:43690 rcv_ssthresh:43690 minrtt:0.008 tcp-ulp-mptcp flags:Mmec token:0000(id:0)/2ff053ec(id:0) seq:3e2cbea12d7673d4 sfseq:3 ssnoff:ad3d00f4 maplen:2
  5. 使用 nstat MPTcp* 命令验证 MPTCP 计数器:

    # nstat MPTcp*
    
    #kernel
    MPTcpExtMPCapableSYNRX          2                  0.0
    MPTcpExtMPCapableSYNTX          2                  0.0
    MPTcpExtMPCapableSYNACKRX       2                  0.0
    MPTcpExtMPCapableACKRX          2                  0.0

其他资源

  • TCP(7) man page
  • mptcpize(8) 手册页

30.3. 使用 iproute2 为 MPTCP 应用程序配置并启用多个路径

每个 MPTCP 连接都使用类似于纯 TCP 的单个子流。要使用 MPTCP 的好处,为每个 MPTCP 连接指定最大的子流数,并配置附加端点来创建这些子流。

请注意,MPTCP 尚不支持为同一套接字混合 IPv6 和 IPv4 端点。使用属于同一地址系列的端点。

先决条件

  • 已安装 mptcpd 软件包
  • 安装了 iperf3 软件包
  • 服务器网络接口设置:

    • enp4s0: 192.0.2.1/24
    • enp1s0: 198.51.100.1/24
  • 客户端网络接口设置:

    • enp4s0f0: 192.0.2.2/24
    • enp4s0f1: 198.51.100.2/24

步骤

  1. 将服务器上每个连接的额外子流限值设置为 1:

    # ip mptcp limits set subflow 1

    请注意,可设置每个连接可以拥有的 additional 子流的最大数量,不包括初始流。

  2. 将客户端上的每个连接和其他子流限制设置为 1

    # ip mptcp limits set subflow 1 add_addr_accepted 1
  3. 在服务器中添加 IP 地址 198.51.100.1 作为新的 MPTCP 端点:

    # ip mptcp endpoint add 198.51.100.1 dev enp1s0 signal
    重要

    您可以将标志的下列值设置为 subflowbackupsignal。将标签设置为:

    • signal,在三方握手完成后发送 ADD_ADDR 数据包
    • subflow,由客户端发送 MP_JOIN SYN
    • backup,将端点设置为备份地址
  4. 启动 iperf3 服务器,并强制它创建 MPTCP 套接字而不是 TCP 套接字:

    # mptcpize run iperf3 -s
    
    Server listening on 5201
  5. 将客户端连接到服务器,并强制它创建 MPTCP 套接字而不是 TCP 套接字:

    # mptcpize iperf3 -c 192.0.2.1 -t 3

验证步骤

  1. 验证连接是否已建立:

    # ss -nti '( sport :5201 )'
  2. 验证连接和 IP 地址限制:

    # ip mptcp limit show
  3. 验证新添加的端点:

    # ip mptcp endpoint show
  4. 在服务器中使用 nstat MPTcp* 命令验证 MPTCP 计数器:

    # nstat MPTcp*
    
    #kernel
    MPTcpExtMPCapableSYNRX          2                  0.0
    MPTcpExtMPCapableACKRX          2                  0.0
    MPTcpExtMPJoinSynRx             2                  0.0
    MPTcpExtMPJoinAckRx             2                  0.0
    MPTcpExtEchoAdd                 2                  0.0

其他资源

  • ip-mptcp(8) man page
  • mptcpize(8) 手册页

30.4. 监控 MPTCP 子流

多路径 TCP(MPTCP)套接字的生命周期可能比较复杂:创建了主 MPTCP 套接字,MPTCP 路径会被验证,并最终会创建一个或多个子流。最后,MPTCP 套接字会被终止。

MPTCP 协议允许使用 iproute 软件包提供的 ip 工具监控与套接字和子流创建和删除相关的 MPTCP 事件。这个工具使用 netlink 接口来监控 MPTCP 事件。

此流程演示了如何监控 MPTCP 事件。因此,它会模拟 MPTCP 服务器应用程序,客户端会连接到这个服务。本例中涉及的客户端使用以下接口和 IP 地址:

  • 服务器:192.0.2.1
  • 客户端(Ethernet 连接): 192.0.2.2
  • 客户端(WiFi 连接): 192.0.2.3

为简化这一示例,所有接口都在同一个子网中。这不是必须的。但是,务必要正确配置路由,并且客户端能够通过两个接口访问服务器。

先决条件

  • 有两个网络接口的 RHEL 客户端,如使用以太网和 WiFi 的笔记本电脑
  • 客户端可以通过两个接口连接到服务器
  • RHEL 服务器
  • 客户端和服务器运行 RHEL 9.0 或更高版本
  • 在客户端和服务器上安装了 mptcpd 软件包

流程

  1. 将客户端和服务器上的每个连接额外子流限制设置为 1

    # ip mptcp limits set add_addr_accepted 0 subflows 1
  2. 在服务器中,要模拟 MPTCP 服务器应用程序,使用强制的 MPTCP 套接字而不是 TCP 套接字以侦听模式启动 netcat (nc):

    # mptcpize run nc -l -k -p 12345

    k 选项可使 nc 在第一次接受连接后不关闭监听程序。这要求演示子流的监控。

  3. 在客户端中:

    1. 识别具有最低指标的接口:

      # ip -4 route
      192.0.2.0/24 dev enp1s0 proto kernel scope link src 192.0.2.2 metric 100
      192.0.2.0/24 dev wlp1s0 proto kernel scope link src 192.0.2.3 metric 600

      enp1s0 接口具有比 wlp1s0 更低的指标。因此,RHEL 默认使用 enp1s0

    2. 在第一个终端中,启动监控:

      # ip mptcp monitor
    3. 在第二个终端中,启动到服务器的 MPTCP 连接:

      # mptcpize run nc 192.0.2.1 12345

      RHEL 使用 enp1s0 接口及其关联的 IP 地址作为此连接的源。

      在监控终端中,"ip mptcp 监控"命令现在的日志:

      [       CREATED] token=63c070d2 remid=0 locid=0 saddr4=192.0.2.2 daddr4=192.0.2.1 sport=36444 dport=12345

      这个令牌将 MPTCP 套接字标识为唯一 ID,以后它会在同一套接字上关联 MPTCP 事件。

    4. 在带有运行 nc 连接到服务器的终端,按 Enter 键。第一个数据数据包完全建立连接。请注意,只要没有发送任何数据,就不会建立连接。

      在监控终端中,ip mptcp monitor 命令现在的日志:

      [   ESTABLISHED] token=63c070d2 remid=0 locid=0 saddr4=192.0.2.2 daddr4=192.0.2.1 sport=36444 dport=12345
    5. 可选:显示与服务器上端口 12345 的连接:

      # ss -taunp | grep ":12345"
      tcp ESTAB  0  0         192.0.2.2:36444 192.0.2.1:12345

      此时,只建立与服务器的连接。

    6. 在第三个终端中,创建另一个端点:

      # ip mptcp endpoint add dev wlp1s0 192.0.2.3 subflow

      此命令设置此命令中客户端的 WiFi 接口的名称和 IP 地址。

      在监控终端中,ip mptcp monitor 命令现在的日志:

      [SF_ESTABLISHED] token=63c070d2 remid=0 locid=2 saddr4=192.0.2.3 daddr4=192.0.2.1 sport=53345 dport=12345 backup=0 ifindex=3

      locid 字段显示新子流的本地地址 ID,即使连接使用了网络地址转换(NAT),也标识此子流。saddr4 字段与 ip mptcp endpoint add 命令的端点 IP 地址匹配。

    7. 可选:显示与服务器上端口 12345 的连接:

      # ss -taunp | grep ":12345"
      tcp ESTAB  0  0         192.0.2.2:36444 192.0.2.1:12345
      tcp ESTAB  0  0  192.0.2.3%wlp1s0:53345 192.0.2.1:12345

      该命令现在显示两个连接:

      • 与源地址 192.0.2.2 的连接与之前建立的第一个 MPTCP 子流对应。
      • 来自 wlp1s0 接口及源地址 192.0.2.3 的子流的连接。
    8. 在第三个终端上,删除端点:

      # ip mptcp endpoint delete id 2

      使用 ip mptcp monitor 输出中的 locid 字段的 ID,或者使用 ip mptcp endpoint show 命令来检索端点 ID。

      在监控终端中,ip mptcp monitor 命令现在的日志:

      [     SF_CLOSED] token=63c070d2 remid=0 locid=2 saddr4=192.0.2.3 daddr4=192.0.2.1 sport=53345 dport=12345 backup=0 ifindex=3
    9. 在第一个带有 nc 客户端的终端上,按 Ctrl+C 终止会话。

      在监控终端中,ip mptcp monitor 命令现在的日志:

      [        CLOSED] token=63c070d2

其他资源

30.5. 在内核中禁用多路径 TCP

这个步骤描述了如何在内核中禁用 MPTCP 选项。

步骤

  • 禁用 mptcp.enabled 选项。

    # echo "net.mptcp.enabled=0" > /etc/sysctl.d/90-enable-MPTCP.conf
    # sysctl -p /etc/sysctl.d/90-enable-MPTCP.conf

验证步骤

  • 验证 mptcp.enabled 是否在内核中被禁用。

    # sysctl -a | grep mptcp.enabled
    net.mptcp.enabled = 0

第 31 章 管理 mptcpd 服务

本节介绍 mptcpd 服务的基本管理。mptcpd 软件包提供 mptcpize 工具,该工具在 TCP 环境中的 mptcp 协议上切换。

31.1. 配置 mptcpd

mptcpd 服务是 mptcp 协议的一个组件,它提供对配置 mptcp 端点的检测。mptcpd 服务默认为每个地址创建一个子流端点。端点列表根据正在运行的主机上的 IP 地址修改动态更新。mptcpd 服务自动创建端点列表。它使多个路径作为使用 ip 工具的替代选择。

先决条件

  • 已安装 mptcpd 软件包

步骤

  1. 使用以下命令在内核中启用 mptcp.enabled 选项:

    # echo "net.mptcp.enabled=1" > /etc/sysctl.d/90-enable-MPTCP.conf
    # sysctl -p /etc/sysctl.d/90-enable-MPTCP.conf
  2. 启动 mptcpd 服务:

    # systemctl start mptcp.service

  3. 验证端点创建:

    # ip mptcp endpoint

  4. 要停止 mptcpd 服务,请使用以下命令:

    # systemctl stop mptcp.service

  5. 要手动配置 mptcpd 服务,修改 /etc/mptcpd/mptcpd.conf 配置文件。

请注意,端点 mptcpd 服务创建,最后一个主机关闭。

其他资源

  • mptcpd(8) man page。

31.2. 使用 mptcpize 工具管理应用程序

使用 mptcpize 工具管理应用程序和服务。

以下指令演示了如何使用 mptcpize 工具在 TCP 环境中管理应用程序。

假设需要使用启用的 MPTCP 套接字运行 iperf3 工具。您可以按照以下过程来实现此目标。

先决条件

  • 已安装 mptcpd 软件包
  • 安装了 iperf3 软件包

步骤

  • 启动启用 MPTCP 套接字的 iperf3 工具:

    # mptcpize run iperf3 -s &

31.3. 使用 mptcpize 程序为服务启用 MPTCP 套接字

以下一组命令演示了如何使用 mptcpize 工具管理服务。您可以为服务启用或禁用 mptcp 套接字。

假设需要管理 nginx 服务的 mptcp 套接字。您可以按照以下过程来实现此目标。

先决条件

  • 已安装 mptcpd 软件包
  • 安装了 nginx 软件包

步骤

  1. 为服务启用 MPTCP 套接字:

    # mptcpize enable nginx
  2. 为服务禁用 MPTCP 套接字:

    # mptcpize disable nginx
  3. 重启该服务以使更改生效:

    # systemctl restart nginx

第 32 章 配置 DNS 服务器顺序

大多数应用程序使用 glibc 库的 getaddrinfo() 函数来解决 DNS 请求。默认情况下,glibc 将所有 DNS 请求发送到 /etc/resolv.conf 文件中指定的第一个 DNS 服务器。如果这个服务器没有回复,Red Hat Enterprise Linux 会使用这个文件中的下一个服务器。

这部分论述了如何自定义 DNS 服务器顺序。

32.1. NetworkManager 如何在 /etc/resolv.conf 中对 DNS 服务器进行排序

NetworkManager 根据以下规则对 /etc/resolv.conf 文件中的 DNS 服务器排序:

  • 如果只有一个连接配置集,NetworkManager 将使用那个连接中指定的 IPv4 和 IPv6 DNS 服务器顺序。
  • 如果激活多个连接配置集,NetworkManager 会根据 DNS 优先级值对 DNS 服务器进行排序。如果您设置了 DNS 优先级,NetworkManager 的行为取决于 dns 参数中设置的值。您可以在 /etc/NetworkManager/NetworkManager.conf 文件的 [main] 部分中设置此参数:

    • dns=default 或者如果没有设置 dns 参数:

      NetworkManager 根据每个连接中的 ipv4.dns-priorityipv6.dns-priority 参数将 DNS 服务器从不同的连接中排序。

      如果没有设置值,或者将 ipv4.dns-priorityipv6.dns-priority 设置为 0,NetworkManager 将使用全局默认值。请参阅 DNS 优先级参数的默认值

    • dns=dnsmasqdns=systemd-resolved:

      当您使用这些设置之一时,NetworkManager 将 dnsmasq127.0.0.1127.0.0.53 设置为 /etc/resolv.conf 文件中的 nameserver 条目。

      dnsmasqsystemd-resolved 服务都转发网络管理器(NetworkManager)中与连接中指定的 DNS 服务器连接中设置的搜索域的查询,并将查询转发到其他域与默认路由的连接。当多个连接有相同的搜索域集时,dnsmasqsystemd-resolved 将这个域的查询转发到连接中带有最低优先级值的 DNS 服务器。

DNS 优先级参数的默认值

NetworkManager 对连接使用以下默认值:

  • 50 用于 VPN 连接
  • 100 用于其他连接

有效的 DNS 优先级值:

您可以将全局默认和特定于连接的 ipv4.dns-priorityipv6.dns-priority 参数设置为值 -21474836472147483647

  • 低的值具有更高的优先级。
  • 负值具有一个特殊的效果,它会排除其他带有更大值的配置。例如,如果至少有一个连接具有负优先级值,NetworkManager 只使用在连接配置集中指定的具有最低优先级的 DNS 服务器。
  • 如果多个连接具有相同的 DNS 优先级,NetworkManager 会按照以下顺序排列 DNS 的优先顺序:

    1. VPN 连接
    2. 带有活跃的默认路由的连接。活跃的默认路由是具有最低指标的默认路由。

其他资源

32.2. 设置 NetworkManager 范围默认 DNS 服务器优先级值

NetworkManager 为连接使用以下 DNS 优先级默认值:

  • 50 用于 VPN 连接
  • 100 用于其他连接

这部分论述了如何使用 IPv4 和 IPv6 连接的自定义默认值覆盖这些系统范围的默认值。

步骤

  1. 编辑 /etc/NetworkManager/NetworkManager.conf 文件:

    1. 添加 [connection] 部分(如果不存在):

      [connection]
    2. 将自定义默认值添加到 [connection] 部分。例如,要将 IPv4 和 IPv6 的新默认值设置为 200,请添加:

      ipv4.dns-priority=200
      ipv6.dns-priority=200

      您可以将参数设置为 -21474836472147483647 之间的值。请注意,将参数设置为 0 可启用内置默认值(50 个用于 VPN 连接,100 个用于其他连接 )。

  2. 重新载入 NetworkManager 服务:

    # systemctl reload NetworkManager

其他资源

  • NetworkManager.conf(5) man page 中的 Connection 部分

32.3. 设置网络管理器连接的 DNS 优先级

这部分论述了如何在 NetworkManager 创建或更新 /etc/resolv.conf 文件时定义 DNS 服务器顺序。

请注意,只有在您配置了多个与不同 DNS 服务器的连接时,设置 DNS 优先级才有意义。如果您只有一个与多个 DNS 服务器的连接,请在连接配置集中按首选顺序手动设置 DNS 服务器。

先决条件

  • 系统配置了多个网络管理器连接。
  • 系统在 /etc/NetworkManager/NetworkManager.conf 文件中未设置 dns 参数,或者参数设置为 default

步骤

  1. 另外,还可显示可用的连接:

    # nmcli connection show
    NAME           UUID                                  TYPE      DEVICE
    Example_con_1  d17ee488-4665-4de2-b28a-48befab0cd43  ethernet  enp1s0
    Example_con_2  916e4f67-7145-3ffa-9f7b-e7cada8f6bf7  ethernet  enp7s0
    ...
  2. 设置 ipv4.dns-priorityipv6.dns-priority 参数。例如,为 Example_con_1 连接将两个参数都设置为 10

    # nmcli connection modify Example_con_1 ipv4.dns-priority 10 ipv6.dns-priority 10
  3. 另外,还可为其他连接重复前面的步骤。
  4. 重新激活您更新的连接:

    # nmcli connection up Example_con_1

验证步骤

  • 显示 /etc/resolv.conf 文件的内容以验证 DNS 服务器顺序是否正确:

    # cat /etc/resolv.conf

第 33 章 使用 NetworkManager 为特定连接禁用 IPv6

这部分论述了如何在使用 NetworkManager 管理网络接口的系统中禁用 IPv6 协议。如果您禁用 IPv6,NetworkManager 会自动在内核中设置对应的 sysctl 值。

注意

如果使用内核可调项或内核引导参数禁用 IPv6,则必须为系统配置指定其他注意事项。如需更多信息,请参阅如何在 RHEL 中禁用或启用 IPv6 协议?

先决条件

  • 系统使用 NetworkManager 管理网络接口,这是 Red Hat Enterprise Linux 中的默认设置。

33.1. 使用 nmcli 在连接上禁用 IPv6

这个步骤描述了如何使用 nmcli 工具禁用 IPv6 协议。

步骤

  1. 另外,还可显示网络连接列表:

    # nmcli connection show
    NAME    UUID                                  TYPE      DEVICE
    Example 7a7e0151-9c18-4e6f-89ee-65bb2d64d365  ethernet  enp1s0
    ...
  2. 将连接的 ipv6.method 参数设置为 disabled

    # nmcli connection modify Example ipv6.method "disabled"
  3. 重启网络连接:

    # nmcli connection up Example

验证步骤

  1. 输入 ip address show 命令显示设备的 IP 设置:

    # ip address show enp1s0
    2: enp1s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
        link/ether 52:54:00:6b:74:be brd ff:ff:ff:ff:ff:ff
        inet 192.0.2.1/24 brd 192.10.2.255 scope global noprefixroute enp1s0
           valid_lft forever preferred_lft forever

    如果没有 inet6 条目,则在该设备中禁用 IPv6

  2. 验证 /proc/sys/net/ipv6/conf/enp 1 s0/disable_ipv6 文件现在是否包含值 1:

    # cat /proc/sys/net/ipv6/conf/enp1s0/disable_ipv6
    1

    1 代表设备禁用 IPv6

第 34 章 监控并调整 RX 环缓冲

接收(RX)环缓冲在设备驱动程序和网络接口卡(NIC)之间是共享缓冲区,并存储传入的数据包,直到设备驱动程序能够处理它们。

如果数据包丢失率导致应用程序报告,您可以增大以太网设备 RX 环缓冲的大小:

  • 数据丢失,
  • 集群隔离,
  • 性能较慢,
  • 超时,以及
  • 备份失败。

这部分论述了如何识别丢弃的数据包数量,增加 RX 环缓冲来降低高数据包的降低率。

34.1. 显示丢弃的数据包数量

ethtool 实用程序可让管理员查询、配置或控制网络驱动程序设置。

RX 环缓冲的耗尽会导致计数器的递增,如 ethtool -S interface_name 输出中的 "discard" 或 "drop"。丢弃的数据包表示可用的缓冲区填满的速度比内核可以处理数据包的速度快。

这个步骤描述了如何使用 ethtool 显示丢弃计数器。

步骤

  • 要查看 enp1s0 接口的丢弃计数器,请输入:

    $ ethtool -S enp1s0

34.2. 增加 RX 环缓冲以降低数据包丢弃的比率

ethtool 程序有助于提高 RX 缓冲,以减少数据包的高丢弃率。

步骤

  1. 查看 RX 环缓冲的最大值:

    # ethtool -g enp1s0
     Ring parameters for enp1s0:
     Pre-set maximums:
     RX:             4080
     RX Mini:        0
     RX Jumbo:       16320
     TX:             255
     Current hardware settings:
     RX:             255
     RX Mini:        0
     RX Jumbo:       0
     TX:             255
  2. 如果 Pre-set maximums 部分中的值大于 Current hardware settings 部分,请提高 RX 环缓冲:

重要

根据您的网卡使用的驱动,环缓冲的改变会很快中断网络连接。

第 36 章 配置 ethtool offload 功能

网络接口卡可使用 TCP 卸载引擎(TOE)将某些操作卸载到网络控制器以提高网络吞吐量。

这部分论述了如何设置卸载功能。

36.1. NetworkManager 支持的卸载功能

您可以使用 NetworkManager 设置以下 ethtool offload 功能:

  • ethtool.feature-esp-hw-offload
  • ethtool.feature-esp-tx-csum-hw-offload
  • ethtool.feature-fcoe-mtu
  • ethtool.feature-gro
  • ethtool.feature-gso
  • ethtool.feature-highdma
  • ethtool.feature-hw-tc-offload
  • ethtool.feature-l2-fwd-offload
  • ethtool.feature-loopback
  • ethtool.feature-lro
  • ethtool.feature-macsec-hw-offload
  • ethtool.feature-ntuple
  • ethtool.feature-rx
  • ethtool.feature-rx-all
  • ethtool.feature-rx-fcs
  • ethtool.feature-rx-gro-hw
  • ethtool.feature-rx-gro-list
  • ethtool.feature-rx-udp_tunnel-port-offload
  • ethtool.feature-rx-udp-gro-forwarding
  • ethtool.feature-rx-vlan-filter
  • ethtool.feature-rx-vlan-stag-filter
  • ethtool.feature-rx-vlan-stag-hw-parse
  • ethtool.feature-rxhash
  • ethtool.feature-rxvlan
  • ethtool.feature-sg
  • ethtool.feature-tls-hw-record
  • ethtool.feature-tls-hw-rx-offload
  • ethtool.feature-tls-hw-tx-offload
  • ethtool.feature-tso
  • ethtool.feature-tx
  • ethtool.feature-tx-checksum-fcoe-crc
  • ethtool.feature-tx-checksum-ip-generic
  • ethtool.feature-tx-checksum-ipv4
  • ethtool.feature-tx-checksum-ipv6
  • ethtool.feature-tx-checksum-sctp
  • ethtool.feature-tx-esp-segmentation
  • ethtool.feature-tx-fcoe-segmentation
  • ethtool.feature-tx-gre-csum-segmentation
  • ethtool.feature-tx-gre-segmentation
  • ethtool.feature-tx-gso-list
  • ethtool.feature-tx-gso-partial
  • ethtool.feature-tx-gso-robust
  • ethtool.feature-tx-ipxip4-segmentation
  • ethtool.feature-tx-ipxip6-segmentation
  • ethtool.feature-tx-nocache-copy
  • ethtool.feature-tx-scatter-gather
  • ethtool.feature-tx-scatter-gather-fraglist
  • ethtool.feature-tx-sctp-segmentation
  • ethtool.feature-tx-tcp-ecn-segmentation
  • ethtool.feature-tx-tcp-mangleid-segmentation
  • ethtool.feature-tx-tcp-segmentation
  • ethtool.feature-tx-tcp6-segmentation
  • ethtool.feature-tx-tunnel-remcsum-segmentation
  • ethtool.feature-tx-udp-segmentation
  • ethtool.feature-tx-udp_tnl-csum-segmentation
  • ethtool.feature-tx-udp_tnl-segmentation
  • ethtool.feature-tx-vlan-stag-hw-insert
  • ethtool.feature-txvlan

有关各个卸载功能的详情,请查看 ethtool 实用程序文档和内核文档。

36.2. 使用 NetworkManager 配置 ethtool offload 功能

这部分论述了如何使用 NetworkManager 启用和禁用 ethtool offload 功能,以及如何从 NetworkManager 连接配置集中删除功能设置。

步骤

  1. 例如:要启用 RX 卸载功能并在 enp1s0 连接配置集中禁用 TX 卸载,请输入:

    # nmcli con modify enp1s0 ethtool.feature-rx on ethtool.feature-tx off

    这个命令明确启用 RX 卸载并禁用 TX 卸载功能。

  2. 要删除之前启用或禁用的卸载功能的设置,请将功能的参数设置为 ignore。例如,要删除 TX 卸载的配置,请输入:

    # nmcli con modify enp1s0 ethtool.feature-tx ignore
  3. 重新激活网络配置集:

    # nmcli connection up enp1s0

验证步骤

  • 使用 ethtool -k 命令显示网络设备的当前卸载功能:

    # ethtool -k network_device

36.3. 使用 RHEL 系统角色设置 ethtool 功能

您可以使用网络 RHEL 系统角色配置 NetworkManager 连接的 ethtool 功能。

重要

当您运行使用 Networking RHEL 系统角色的 play 时,如果设置的值与 play 中指定的名称不匹配,则系统角色会覆盖具有相同名称的连接配置集。因此,始终在剧本中指定网络连接配置文件的整个配置,即使 IP 配置已经存在。否则,角色会将这些值重置为默认值。

根据它是否已存在,流程使用以下设置创建或更新 enp1s0 连接配置文件:

  • 静态 IPv4 地址 - 198.51.100.20 ,子网掩码为 /24
  • 静态 IPv6 地址 - 2001:db8:1::1 ,子网掩码为 /64
  • IPv4 默认网关 - 198.51.100.254
  • IPv6 默认网关 - 2001:db8:1::fffe
  • IPv4 DNS 服务器 - 198.51.100.200
  • IPv6 DNS 服务器 - 2001:db8:1::ffbb
  • DNS 搜索域 - example.com
  • ethtool 功能:

    • 通用接收卸载(GRO):禁用
    • 通用分段卸载(GSO):启用
    • TX 流控制传输协议(SCTP)段:禁用

先决条件

  • ansible-core 软件包和 rhel-system-roles 软件包安装在控制节点上。
  • 如果您在运行 playbook 时使用了与 root 不同的远程用户,则此用户在受管节点上具有合适的 sudo 权限。

步骤

  1. 如果您要在其上执行 playbook 中指令的主机还没有被列入清单,请将此主机的 IP 或名称添加到 /etc/ansible/hosts Ansible 清单文件中:

    node.example.com
  2. 使用以下内容创建 ~/configure-ethernet-device-with-ethtool-features.yml playbook:

    ---
    - name: Configure an Ethernet connection with ethtool features
      hosts: node.example.com
      become: true
      tasks:
      - include_role:
          name: rhel-system-roles.network
    
        vars:
          network_connections:
            - name: enp1s0
              type: ethernet
              autoconnect: yes
              ip:
                address:
                  - 198.51.100.20/24
                  - 2001:db8:1::1/64
                gateway4: 198.51.100.254
                gateway6: 2001:db8:1::fffe
                dns:
                  - 198.51.100.200
                  - 2001:db8:1::ffbb
                dns_search:
                  - example.com
              ethtool:
                features:
                  gro: "no"
                  gso: "yes"
                  tx_sctp_segmentation: "no"
              state: up
  3. 运行 playbook:

    • 要以 root 用户身份连接到受管主机,请输入:

      #