配置和管理网络


Red Hat Enterprise Linux 9

管理网络接口和高级网络功能

Red Hat Customer Content Services

摘要

利用 Red Hat Enterprise Linux (RHEL)的网络功能,您可以配置主机以满足您组织的网络和安全要求。例如:
  • 您可以配置绑定、VLAN、网桥、隧道和其他网络类型,以将主机连接到网络。
  • IPsec 和 WireGuard 在主机和网络之间提供安全 VPN。
  • RHEL 还支持高级网络功能,如基于策略的路由和多路径 TCP (MPTCP)。

对红帽文档提供反馈

我们感谢您对我们文档的反馈。让我们了解如何改进它。

通过 Jira 提交反馈(需要帐户)

  1. 登录到 Jira 网站。
  2. 在顶部导航栏中点 Create
  3. Summary 字段中输入描述性标题。
  4. Description 字段中输入您对改进的建议。包括文档相关部分的链接。
  5. 点对话框底部的 Create

第 1 章 实现一致的网络接口命名

udev 设备管理器在 Red Hat Enterprise Linux 中实现一致的设备命名。设备管理器支持不同的命名方案,默认情况下,根据固件、拓扑和位置信息分配固定的名称。

如果没有一致的设备命名,Linux 内核通过组合固定前缀和索引来为网络接口分配名称。当内核初始化网络设备时,索引会增加。例如:eth0 代表启动时探测到的第一个以太网设备。如果您在系统中添加了另一个网络接口控制器,则内核设备名称的分配不再固定,因为重启后,设备可以以不同的顺序初始化。在这种情况下,内核可以以不同的方式命名设备。

要解决这个问题,udev 需分配一致的设备名称。它有以下优点:

  • 设备名称在重启后是稳定的。
  • 即使添加或删除了硬件,设备名称也会保持不变。
  • 因此,有问题的硬件可以被无缝地替换。
  • 网络命名是无状态的,不需要显式配置文件。
警告

通常,红帽不支持禁用了一致设备命名的系统。有关例外情况,请参阅红帽知识库解决方案 设置 net.ifnames=0 安全吗

1.1. udev 设备管理器如何重命名网络接口

udev 设备管理器处理一组规则,以便为网络接口实施一致的命名方案。

规则文件顺序:

  1. 可选:/usr/lib/udev/rules.d/60-net.rules

    只有在安装 initscripts-rename-device 软件包时,该文件才存在。定义了弃用的 /usr/lib/udev/rename_device 助手工具的/usr/lib/udev/rules.d/60-net.rules 文件在 /etc/sysconfig/network-scripts/ifcfg-* 文件中查找 HWADDR 参数。如果变量中设置的值与接口的 MAC 地址匹配,则助手工具会将接口重命名为 ifcfg 文件的 DEVICE 参数中设置的名称。

    如果系统只使用 keyfile 格式的 NetworkManager 连接配置文件,udev 会跳过这一步。

  2. 只在 Dell 系统上:/usr/lib/udev/rules.d/71-biosdevname.rules

    只有安装了 biosdevname 软件包,且规则文件定义了 biosdevname 工具根据其命名策略重命名了接口,如果其没有在之前的步骤中被重命名,该文件才存在。

    注意

    仅在 Dell 系统上安装和使用 biosdevname

  3. /usr/lib/udev/rules.d/75-net-description.rules

    此文件定义了 udev 如何检查网络接口,并在 udev-internal 变量中设置属性。然后,这些变量由 /usr/lib/udev/rules.d/80-net-setup-link.rules 文件在下一步中进行处理。其中一些属性可以未定义。

  4. /usr/lib/udev/rules.d/80-net-setup-link.rules

    此文件调用 udev 服务的 net_setup_link builtin,并且 udev 根据 /usr/lib/systemd/network/99-default.link 文件中 NamePolicy 参数中策略的顺序重命名接口。详情请查看 网络接口命名策略

    如果没有应用任何策略,则 udev 不会重命名接口。

1.2. 网络接口命名策略

默认情况下,udev 设备管理器使用 /usr/lib/systemd/network/99-default.link 文件来确定它如何重命名接口。此文件中的 NamePolicy 参数定义哪个命名策略 udev 应用以及顺序。

默认顺序:

NamePolicy=keep kernel database onboard slot path
Copy to Clipboard Toggle word wrap

根据哪个策略与 NamePolicy 参数指定的首先匹配,下表描述了 udev 的不同操作:

Expand
policy描述名称示例

keep

如果设备在用户空间中已有分配的名称,则 udev 不会重命名此设备。例如,如果在创建设备期间或通过重命名操作分配了名称,则会出现这种情况。

 

kernel

如果内核表示设备名称是可预测的,则 udev 不会重命名这个设备。

lo

database

此策略根据 udev 硬件数据库中的映射分配名称。详情请查看您系统上的 hwdb (7) 手册页。

idrac

onboard

设备名称包含固件或者 BIOS 提供的索引号,用于板上的设备。

eno1

slot

设备名称包含固件或 BIOS 提供的 PCI Express (PCIe)热插拔插槽索引号。

ens1

path

设备名称包含硬件连接器的物理位置。

enp1s0

mac

设备名称包含 MAC 地址。默认情况下,Red Hat Enterprise Linux 不使用此策略,但管理员可以启用它。

enx525400d5e0fb

1.3. 网络接口命名方案

udev 设备管理器使用设备驱动程序提供的某些稳定的接口属性,来生成一致的设备名称。

如果新的 udev 版本更改了服务如何为某些接口创建名称的方式,红帽会添加一个新的方案版本,并在您系统上的 systemd.net-naming-scheme (7) 手册页中记录详细信息。默认情况下,Red Hat Enterprise Linux (RHEL) 9 使用 rhel-9.0 命名方案,即使您安装或升级到更新的 RHEL 次版本。

为了防止新驱动程序为网络接口提供更多或其他属性,rhel-net-naming-sysattrs 软件包提供了 /usr/lib/udev/hwdb.d/50-net-naming-sysattr-allowlist.hwdb 数据库。此数据库定义了 udev 服务可使用哪些 sysfs 值来创建网络接口名称。数据库中的条目也是版本控制的,并受到方案版本影响。

注意

在 RHEL 9.4 及更高版本上,您还可以使用所有 rhel-8.* 命名方案。

如果要使用默认方案以外的方案,您可以 切换网络接口命名方案

有关不同设备类型和平台的命名方案的详情,请查看您系统上的 systemd.net-naming-scheme (7) 手册页。

1.4. 切换到不同的网络接口命名方案

默认情况下,(RHEL)使用 rhel-9.0 命名方案,即使您安装或升级到更新的 RHEL 次版本。虽然在大多数情况下,默认命名方案适合使用,但可能存在切换到其他方案版本的原因。

您必须更改命名方案时的示例:

  • 如果其向接口名称添加了额外的属性(如插槽号),则新方案可以帮助更好地识别设备。
  • 新方案可以防止 udev 回退到内核分配的设备名称(eth*)。如果驱动程序没有为两个或多个接口提供足够的唯一属性,来为它们生成唯一名称,则会发生这种情况。

先决条件

  • 您可以访问服务器的控制台。

步骤

  1. 列出网络接口:

    # ip link show
    2: eno1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP mode DEFAULT group default qlen 1000
        link/ether 00:00:5e:00:53:1a brd ff:ff:ff:ff:ff:ff
    ...
    Copy to Clipboard Toggle word wrap

    记录接口的 MAC 地址。

  2. 可选:显示网络接口的 ID_NET_NAMING_SCHEME 属性,来识别 RHEL 当前使用的命名方案:

    # udevadm info --query=property --property=ID_NET_NAMING_SCHEME /sys/class/net/eno1
    ID_NET_NAMING_SCHEME=rhel-9.0
    Copy to Clipboard Toggle word wrap

    请注意,属性在 lo loopback 设备上不可用。

  3. net.naming-scheme=<scheme> 选项附加到所有安装的内核的命令行中,例如:

    # grubby --update-kernel=ALL --args=net.naming-scheme=rhel-9.4
    Copy to Clipboard Toggle word wrap
  4. 重启系统。

    # reboot
    Copy to Clipboard Toggle word wrap
  5. 根据您记录的 MAC 地址,识别因不同的命名方案而更改的网络接口的新名称:

    # ip link show
    2: eno1np0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP mode DEFAULT group default qlen 1000
        link/ether 00:00:5e:00:53:1a brd ff:ff:ff:ff:ff:ff
    ...
    Copy to Clipboard Toggle word wrap

    切换方案后,udev 将具有指定 MAC 地址的设备命名为 eno1np0,而之前被命名为 eno1

  6. 确定哪个 NetworkManager 连接配置文件使用之前名称的接口:

    # nmcli -f device,name connection show
    DEVICE  NAME
    eno1  example_profile
    ...
    Copy to Clipboard Toggle word wrap
  7. 将连接配置文件中的 connection.interface-name 属性设置为新接口名称:

    # nmcli connection modify example_profile connection.interface-name "eno1np0"
    Copy to Clipboard Toggle word wrap
  8. 重新激活连接配置文件:

    # nmcli connection up example_profile
    Copy to Clipboard Toggle word wrap

验证

  • 通过显示网络接口的 ID_NET_NAMING_SCHEME 属性来识别 RHEL 现在使用的命名方案:

    # udevadm info --query=property --property=ID_NET_NAMING_SCHEME /sys/class/net/eno1np0
    ID_NET_NAMING_SCHEME=_rhel-9.4
    Copy to Clipboard Toggle word wrap

1.5. 在安装过程中为以太网接口自定义前缀

如果您不想将默认 device-naming 策略用于以太网接口,您可以在 Red Hat Enterprise Linux (RHEL)安装过程中设置一个自定义设备前缀。

重要

只有您在 RHEL 安装过程中设置了前缀,红帽才支持带有自定义以太网前缀的系统。不支持在已部署的系统上使用 prefixdevname 工具。

如果您在安装过程中设置了设备前缀,则 udev 服务在安装后对以太网接口使用 <prefix><index> 格式。例如,如果您设置了前缀 net,服务会将名称 net0net1 等分配给以太网接口。

udev 服务将索引附加到自定义前缀,并保留已知以太网接口的索引值。如果您添加一个接口,udev 会为新接口分配一个比之前分配的索引值大的索引值。

先决条件

  • 前缀由 ASCII 字符组成。
  • 前缀是一个字母数字字符串。
  • 前缀少于 16 个字符。
  • 前缀不会与任何其他熟知的网络接口前缀冲突,如 ethenoensem

步骤

  1. 引导 Red Hat Enterprise Linux 安装介质。
  2. 在引导管理器中,请按照以下步骤操作:

    1. 选择 Install Red Hat Enterprise Linux <version> 条目。
    2. Tab 编辑条目。
    3. net.ifnames.prefix=<prefix> 追加到在内核选项中。
    4. 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:00:5e:00:53:1a brd ff:ff:ff:ff:ff:ff
    ...
    Copy to Clipboard Toggle word wrap

您可以使用 udev 规则来实现反映您机构要求的自定义网络接口名称。

流程

  1. 识别您要重命名的网络接口:

    # ip link show
    ...
    enp1s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP mode DEFAULT group default qlen 1000
        link/ether 00:00:5e:00:53:1a brd ff:ff:ff:ff:ff:ff
    ...
    Copy to Clipboard Toggle word wrap

    记录接口的 MAC 地址。

  2. 显示接口的设备类型 ID:

    # cat /sys/class/net/enp1s0/type
    1
    Copy to Clipboard Toggle word wrap
  3. 创建 /etc/udev/rules.d/70-persistent-net.rules 文件,并为您要重命名的每个接口添加一个规则:

    SUBSYSTEM=="net",ACTION=="add",ATTR{address}=="<MAC_address>",ATTR{type}=="<device_type_id>",NAME="<new_interface_name>"
    Copy to Clipboard Toggle word wrap
    重要

    如果您在引导过程中需要一致的设备名称,则只使用 70-persistent-net.rules 作为文件名。如果您重新生成 RAM 磁盘镜像,则 dracut 工具会在 initrd 镜像中添加具有此名称的文件。

    例如,使用以下规则将 MAC 地址为 00:00:5e:00:53:1a 的接口重命名为 provider0

    SUBSYSTEM=="net",ACTION=="add",ATTR{address}=="00:00:5e:00:53:1a",ATTR{type}=="1",NAME="provider0"
    Copy to Clipboard Toggle word wrap
  4. 可选:重新生成 initrd RAM 磁盘镜像:

    # dracut -f
    Copy to Clipboard Toggle word wrap

    只有在 RAM 磁盘中需要网络功能时才需要这一步。例如,如果 root 文件系统存储在网络设备上,如 iSCSI,则是这种情况。

  5. 确定哪个 NetworkManager 连接配置文件使用您要重命名的接口:

    # nmcli -f device,name connection show
    DEVICE  NAME
    enp1s0  example_profile
    ...
    Copy to Clipboard Toggle word wrap
  6. 在连接配置文件中取消 connection.interface-name 属性的设置:

    # nmcli connection modify example_profile connection.interface-name ""
    Copy to Clipboard Toggle word wrap
  7. 临时配置连接配置文件,以匹配新的和以前的接口名称:

    # nmcli connection modify example_profile match.interface-name "provider0 enp1s0"
    Copy to Clipboard Toggle word wrap
  8. 重启系统:

    # reboot
    Copy to Clipboard Toggle word wrap
  9. 验证具有您在链接文件中指定的 MAC 地址的设备已重命名为 provider0

    # ip link show
    provider0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP mode DEFAULT group default qlen 1000
        link/ether 00:00:5e:00:53:1a brd ff:ff:ff:ff:ff:ff
    ...
    Copy to Clipboard Toggle word wrap
  10. 将连接配置文件配置为仅匹配新接口名称:

    # nmcli connection modify example_profile match.interface-name "provider0"
    Copy to Clipboard Toggle word wrap

    现在,您已从连接配置文件中删除了旧接口名称。

  11. 重新激活连接配置文件:

    # nmcli connection up example_profile
    Copy to Clipboard Toggle word wrap

第 2 章 配置以太网连接

NetworkManager 为主机上安装的每个以太网适配器创建一个连接配置文件。默认情况下,此配置文件将 DHCP 用于 IPv4 和 IPv6 连接。

修改此自动创建的配置文件,或在以下情况下添加新配置文件:

  • 网络需要自定义设置,如静态 IP 地址配置。
  • 您需要多个配置文件,因为主机在不同的网络中漫游。

Red Hat Enterprise Linux 为管理员提供不同的选项来配置以太网连接。例如:

  • 在命令行中使用 nmcli 配置连接。
  • 使用 nmtui 在基于文本的用户界面中配置连接。
  • 使用 GNOME Settings 菜单或 nm-connection-editor 应用程序在图形界面中配置连接。
  • 使用 nmstatectl 通过 nmstate API 配置连接。
  • 使用 RHEL 系统角色自动化一个或多个主机上连接的配置。
注意

如果要对运行在 Microsoft Azure 云中的主机手动配置以太网连接,请禁用 cloud-init 服务或将其配置为忽略从云环境检索到的网络设置。否则,cloud-init 将在下次重启时覆盖您手动配置的网络设置。

2.1. 使用 nmcli 配置以太网连接

如果您通过以太网将主机连接到网络,您可以使用 nmcli 工具在命令行上管理连接的设置。

先决条件

  • 服务器配置中存在物理或虚拟以太网网络接口控制器(NIC)。

步骤

  1. 列出 NetworkManager 连接配置文件:

    # nmcli connection show
    NAME                UUID                                  TYPE      DEVICE
    Wired connection 1  a5eb6490-cc20-3668-81f8-0314a27f3f75  ethernet  enp1s0
    Copy to Clipboard Toggle word wrap

    默认情况下,NetworkManager 为主机中的每个 NIC 创建一个配置文件。如果您计划仅将这个 NIC 连接到特定的网络,请调整自动创建的配置文件。如果您计划使用不同的设置将这个 NIC 连接到网络,请为每个网络创建单独的配置文件。

  2. 如果要创建额外的连接配置文件,请输入:

    # nmcli connection add con-name <connection-name> ifname <device-name> type ethernet
    Copy to Clipboard Toggle word wrap

    跳过此步骤来修改现有的配置文件。

  3. 可选:重命名连接配置文件:

    # nmcli connection modify "Wired connection 1" connection.id "Internal-LAN"
    Copy to Clipboard Toggle word wrap

    在有多个配置文件的主机上,有意义的名称可以更容易识别配置文件的用途。

  4. 显示连接配置文件的当前设置:

    # nmcli connection show Internal-LAN
    ...
    connection.interface-name:     enp1s0
    connection.autoconnect:        yes
    ipv4.method:                   auto
    ipv6.method:                   auto
    ...
    Copy to Clipboard Toggle word wrap
  5. 配置 IPv4 设置:

    • 要使用 DHCP,请输入:

      # nmcli connection modify Internal-LAN ipv4.method auto
      Copy to Clipboard Toggle word wrap

      如果 ipv4.method 已设置为 auto(默认),请跳过这一步。

    • 要设置静态 IPv4 地址、网络掩码、默认网关、DNS 服务器和搜索域,请输入:

      # nmcli connection modify Internal-LAN ipv4.method manual ipv4.addresses 192.0.2.1/24 ipv4.gateway 192.0.2.254 ipv4.dns 192.0.2.200 ipv4.dns-search example.com
      Copy to Clipboard Toggle word wrap
  6. 配置 IPv6 设置:

    • 要使用无状态地址自动配置(SLAAC),请输入:

      # nmcli connection modify Internal-LAN ipv6.method auto
      Copy to Clipboard Toggle word wrap

      如果 ipv6.method 已设置为 auto(默认),请跳过这一步。

    • 要设置静态 IPv6 地址、网络掩码、默认网关、DNS 服务器和搜索域,请输入:

      # nmcli connection modify Internal-LAN ipv6.method manual ipv6.addresses 2001:db8:1::fffe/64 ipv6.gateway 2001:db8:1::fffe ipv6.dns 2001:db8:1::ffbb ipv6.dns-search example.com
      Copy to Clipboard Toggle word wrap
  7. 要在配置文件中自定义其他设置,请使用以下命令:

    # nmcli connection modify <connection-name> <setting> <value>
    Copy to Clipboard Toggle word wrap

    用空格或分号将值括起来。

  8. 激活配置文件:

    # nmcli connection up Internal-LAN
    Copy to Clipboard Toggle word wrap

验证

  1. 显示 NIC 的 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:17:b8:b6 brd ff:ff:ff:ff:ff:ff
        inet 192.0.2.1/24 brd 192.0.2.255 scope global noprefixroute enp1s0
           valid_lft forever preferred_lft forever
        inet6 2001:db8:1::fffe/64 scope global noprefixroute
           valid_lft forever preferred_lft forever
    Copy to Clipboard Toggle word wrap
  2. 显示 IPv4 默认网关:

    # ip route show default
    default via 192.0.2.254 dev enp1s0 proto static metric 102
    Copy to Clipboard Toggle word wrap
  3. 显示 IPv6 默认网关:

    # ip -6 route show default
    default via 2001:db8:1::fffe dev enp1s0 proto static metric 102 pref medium
    Copy to Clipboard Toggle word wrap
  4. 显示 DNS 设置:

    # cat /etc/resolv.conf
    search example.com
    nameserver 192.0.2.200
    nameserver 2001:db8:1::ffbb
    Copy to Clipboard Toggle word wrap

    如果多个连接配置文件同时处于活跃状态,则 nameserver 条目的顺序取决于这些配置文件中的 DNS 优先级值和连接类型。

  5. 使用 ping 工具验证这个主机是否可以向其他主机发送数据包:

    # ping <host-name-or-IP-address>
    Copy to Clipboard Toggle word wrap

故障排除

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

2.2. 使用 nmcli 交互式编辑器配置以太网连接

如果您通过以太网将主机连接到网络,您可以使用 nmcli 工具在命令行上管理连接的设置。

先决条件

  • 服务器配置中存在物理或虚拟以太网网络接口控制器(NIC)。

步骤

  1. 列出 NetworkManager 连接配置文件:

    # nmcli connection show
    NAME                UUID                                  TYPE      DEVICE
    Wired connection 1  a5eb6490-cc20-3668-81f8-0314a27f3f75  ethernet  enp1s0
    Copy to Clipboard Toggle word wrap

    默认情况下,NetworkManager 为主机中的每个 NIC 创建一个配置文件。如果您计划仅将这个 NIC 连接到特定的网络,请调整自动创建的配置文件。如果您计划使用不同的设置将这个 NIC 连接到网络,请为每个网络创建单独的配置文件。

  2. 以互动模式启动 nmcli

    • 要创建额外的连接配置文件,请输入:

      # nmcli connection edit type ethernet con-name "<connection-name>"
      Copy to Clipboard Toggle word wrap
    • 要修改现有的连接配置文件,请输入:

      # nmcli connection edit con-name "<connection-name>"
      Copy to Clipboard Toggle word wrap
  3. 可选:重命名连接配置文件:

    nmcli> set connection.id Internal-LAN
    Copy to Clipboard Toggle word wrap

    在有多个配置文件的主机上,有意义的名称可以更容易识别配置文件的用途。

    不要使用引号来设置包含空格的 ID,以避免 nmcli 将引号作为名称的一部分。例如,要将 Example Connection 设置为 ID,请输入 set connection.id Example Connection

  4. 显示连接配置文件的当前设置:

    nmcli> print
    ...
    connection.interface-name:     enp1s0
    connection.autoconnect:        yes
    ipv4.method:                   auto
    ipv6.method:                   auto
    ...
    Copy to Clipboard Toggle word wrap
  5. 如果创建一个新的连接配置文件,请设置网络接口:

    nmcli> set connection.interface-name enp1s0
    Copy to Clipboard Toggle word wrap
  6. 配置 IPv4 设置:

    • 要使用 DHCP,请输入:

      nmcli> set ipv4.method auto
      Copy to Clipboard Toggle word wrap

      如果 ipv4.method 已设置为 auto(默认),请跳过这一步。

    • 要设置静态 IPv4 地址、网络掩码、默认网关、DNS 服务器和搜索域,请输入:

      nmcli> ipv4.addresses 192.0.2.1/24
      Do you also want to set 'ipv4.method' to 'manual'? [yes]: yes
      nmcli> ipv4.gateway 192.0.2.254
      nmcli> ipv4.dns 192.0.2.200
      nmcli> ipv4.dns-search example.com
      Copy to Clipboard Toggle word wrap
  7. 配置 IPv6 设置:

    • 要使用无状态地址自动配置(SLAAC),请输入:

      nmcli> set ipv6.method auto
      Copy to Clipboard Toggle word wrap

      如果 ipv6.method 已设置为 auto(默认),请跳过这一步。

    • 要设置静态 IPv6 地址、网络掩码、默认网关、DNS 服务器和搜索域,请输入:

      nmcli> ipv6.addresses 2001:db8:1::fffe/64
      Do you also want to set 'ipv6.method' to 'manual'? [yes]: yes
      nmcli> ipv6.gateway 2001:db8:1::fffe
      nmcli> ipv6.dns 2001:db8:1::ffbb
      nmcli> ipv6.dns-search example.com
      Copy to Clipboard Toggle word wrap
  8. 保存并激活连接:

    nmcli> save persistent
    Copy to Clipboard Toggle word wrap
  9. 保留为互动模式:

    nmcli> quit
    Copy to Clipboard Toggle word wrap

验证

  1. 显示 NIC 的 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:17:b8:b6 brd ff:ff:ff:ff:ff:ff
        inet 192.0.2.1/24 brd 192.0.2.255 scope global noprefixroute enp1s0
           valid_lft forever preferred_lft forever
        inet6 2001:db8:1::fffe/64 scope global noprefixroute
           valid_lft forever preferred_lft forever
    Copy to Clipboard Toggle word wrap
  2. 显示 IPv4 默认网关:

    # ip route show default
    default via 192.0.2.254 dev enp1s0 proto static metric 102
    Copy to Clipboard Toggle word wrap
  3. 显示 IPv6 默认网关:

    # ip -6 route show default
    default via 2001:db8:1::fffe dev enp1s0 proto static metric 102 pref medium
    Copy to Clipboard Toggle word wrap
  4. 显示 DNS 设置:

    # cat /etc/resolv.conf
    search example.com
    nameserver 192.0.2.200
    nameserver 2001:db8:1::ffbb
    Copy to Clipboard Toggle word wrap

    如果多个连接配置文件同时处于活跃状态,则 nameserver 条目的顺序取决于这些配置文件中的 DNS 优先级值和连接类型。

  5. 使用 ping 工具验证这个主机是否可以向其他主机发送数据包:

    # ping <host-name-or-IP-address>
    Copy to Clipboard Toggle word wrap

故障排除

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

2.3. 使用 nmtui 配置以太网连接

如果您将主机连接到以太网网络,您可以在基于文本的用户界面中管理连接的设置。使用 nmtui 应用程序创建新配置集,并在没有图形界面的主机上更新现有配置集。

注意

nmtui 中:

  • 使用光标键导航。
  • 选择一个按钮并按 Enter 键。
  • 使用 空格 选择和清除复选框。
  • 要返回上一个屏幕,请使用 ESC

先决条件

  • 服务器配置中存在物理或虚拟以太网网络接口控制器(NIC)。

流程

  1. 如果您不知道连接中使用的网络设备名称,显示可用的设备:

    # nmcli device status
    DEVICE     TYPE      STATE                   CONNECTION
    enp1s0     ethernet  unavailable             --
    ...
    Copy to Clipboard Toggle word wrap
  2. 启动 nmtui

    # nmtui
    Copy to Clipboard Toggle word wrap
  3. 选择 Edit a connection,然后按 Enter
  4. 选择是否添加新连接配置文件或修改现有连接配置文件:

    • 要创建新配置文件:

      1. Add
      2. 从网络类型列表中选择 Ethernet,然后按 Enter
    • 要修改现有的配置文件,请从列表中选择配置文件,然后按 Enter
  5. 可选:更新连接配置文件的名称。

    在有多个配置文件的主机上,有意义的名称可以更容易识别配置文件的用途。

  6. 如果创建新连接配置文件,清在 Device 字段中输入网络设备名称。
  7. 根据您的环境,相应地在 IPv4 configurationIPv6 configuration 区中配置 IP 地址。为此,请按这些区域旁边的按钮,并选择:

    • Disabled,如果此连接不需要 IP 地址。
    • Automatic,如果 DHCP 服务器动态为这个 NIC 分配一个 IP 地址。
    • Manual,如果网络需要静态 IP 地址设置。在这种情况下,您必须填写更多字段:

      1. 在您要配置的协议旁边按 Show 以显示其他字段。
      2. Addresses 旁边的 Add,并输入无类别域间路由(CIDR)格式的 IP 地址和子网掩码。

        如果没有指定子网掩码,NetworkManager 会为 IPv4 地址设置 /32 子网掩码,并为 IPv6 地址设置 /64

      3. 输入默认网关的地址。
      4. DNS servers 旁边的 Add,并输入 DNS 服务器地址。
      5. Search domains 旁边的 Add,并输入 DNS 搜索域。

    图 2.1. 使用静态 IP 地址设置的以太网连接示例

  8. OK 创建并自动激活新连接。
  9. Back 返回到主菜单。
  10. 选择 Quit,然后按 Enter 键关闭 nmtui 应用程序。

验证

  1. 显示 NIC 的 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:17:b8:b6 brd ff:ff:ff:ff:ff:ff
        inet 192.0.2.1/24 brd 192.0.2.255 scope global noprefixroute enp1s0
           valid_lft forever preferred_lft forever
        inet6 2001:db8:1::fffe/64 scope global noprefixroute
           valid_lft forever preferred_lft forever
    Copy to Clipboard Toggle word wrap
  2. 显示 IPv4 默认网关:

    # ip route show default
    default via 192.0.2.254 dev enp1s0 proto static metric 102
    Copy to Clipboard Toggle word wrap
  3. 显示 IPv6 默认网关:

    # ip -6 route show default
    default via 2001:db8:1::fffe dev enp1s0 proto static metric 102 pref medium
    Copy to Clipboard Toggle word wrap
  4. 显示 DNS 设置:

    # cat /etc/resolv.conf
    search example.com
    nameserver 192.0.2.200
    nameserver 2001:db8:1::ffbb
    Copy to Clipboard Toggle word wrap

    如果多个连接配置文件同时处于活跃状态,则 nameserver 条目的顺序取决于这些配置文件中的 DNS 优先级值和连接类型。

  5. 使用 ping 工具验证这个主机是否可以向其他主机发送数据包:

    # ping <host-name-or-IP-address>
    Copy to Clipboard Toggle word wrap

故障排除

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

2.4. 使用控制中心配置以太网连接

如果您通过以太网将主机连接到网络,您可以使用 GNOME Settings 菜单,通过图形界面管理连接的设置。

请注意,control-center 不支持与 nm-connection-editor 应用程序或 nmcli 实用程序一样多的配置选项。

先决条件

  • 服务器配置中存在物理或虚拟以太网网络接口控制器(NIC)。
  • 已安装了 GNOME。

步骤

  1. Super 键,输入 Settings,然后按 Enter 键。
  2. 在左侧导航中选择 Network
  3. 选择是否添加新连接配置文件或修改现有连接配置文件:

    • 要创建新配置文件,请单击 Ethernet 条目旁边的 + 按钮。
    • 要修改现有配置文件,请点击配置文件条目旁的齿轮图标。
  4. 可选:在 Identity 选项卡中,更新连接配置文件的名称。

    在有多个配置文件的主机上,有意义的名称可以更容易识别配置文件的用途。

  5. 根据您的环境,相应地在 IPv4IPv6 标签页中配置 IP 地址设置:

    • 要使用 DHCP 或 IPv6 无状态地址自动配置(SLAAC),请选择 Automatic (DHCP) 作为方法(默认)。
    • 要设置静态 IP 地址、网络掩码、默认网关、DNS 服务器和搜索域,请选择 Manual 作为方法,并在标签页中填写字段:

  6. 根据您是否添加或修改连接配置文件,点 AddApply 按钮保存连接。

    GNOME control-center 会自动激活连接。

验证

  1. 显示 NIC 的 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:17:b8:b6 brd ff:ff:ff:ff:ff:ff
        inet 192.0.2.1/24 brd 192.0.2.255 scope global noprefixroute enp1s0
           valid_lft forever preferred_lft forever
        inet6 2001:db8:1::fffe/64 scope global noprefixroute
           valid_lft forever preferred_lft forever
    Copy to Clipboard Toggle word wrap
  2. 显示 IPv4 默认网关:

    # ip route show default
    default via 192.0.2.254 dev enp1s0 proto static metric 102
    Copy to Clipboard Toggle word wrap
  3. 显示 IPv6 默认网关:

    # ip -6 route show default
    default via 2001:db8:1::fffe dev enp1s0 proto static metric 102 pref medium
    Copy to Clipboard Toggle word wrap
  4. 显示 DNS 设置:

    # cat /etc/resolv.conf
    search example.com
    nameserver 192.0.2.200
    nameserver 2001:db8:1::ffbb
    Copy to Clipboard Toggle word wrap

    如果多个连接配置文件同时处于活跃状态,则 nameserver 条目的顺序取决于这些配置文件中的 DNS 优先级值和连接类型。

  5. 使用 ping 工具验证这个主机是否可以向其他主机发送数据包:

    # ping <host-name-or-IP-address>
    Copy to Clipboard Toggle word wrap

故障排除步骤

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

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

如果通过以太网将主机连接到网络,您可以通过 nm-connection-editor 应用程序,使用图形界面管理连接的设置。

先决条件

  • 服务器配置中存在物理或虚拟以太网网络接口控制器(NIC)。
  • 已安装了 GNOME。

流程

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

    $ nm-connection-editor
    Copy to Clipboard Toggle word wrap
  2. 选择是否添加新连接配置文件或修改现有连接配置文件:

    • 要创建新配置文件:

      1. + 按钮
      2. 选择 Ethernet 作为连接类型,然后单击 Create
    • 要修改现有配置文件,请双击配置文件条目。
  3. 可选:在 Connection Name 字段中更新配置文件的名称。

    在有多个配置文件的主机上,有意义的名称可以更容易识别配置文件的用途。

  4. 如果您创建新配置文件,请在 Ethernet 选项卡中选择设备:

    ethernet connection settings

  5. 根据您的环境,相应地在 IPv4 SettingsIPv6 Settings 选项卡中配置 IP 地址设置:

    • 要使用 DHCP 或 IPv6 无状态地址自动配置(SLAAC),请选择 Automatic (DHCP) 作为方法(默认)。
    • 要设置静态 IP 地址、网络掩码、默认网关、DNS 服务器和搜索域,请选择 Manual 作为方法,并在标签页中填写字段:

  6. 点击 Save
  7. 关闭 nm-connection-editor

验证

  1. 显示 NIC 的 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:17:b8:b6 brd ff:ff:ff:ff:ff:ff
        inet 192.0.2.1/24 brd 192.0.2.255 scope global noprefixroute enp1s0
           valid_lft forever preferred_lft forever
        inet6 2001:db8:1::fffe/64 scope global noprefixroute
           valid_lft forever preferred_lft forever
    Copy to Clipboard Toggle word wrap
  2. 显示 IPv4 默认网关:

    # ip route show default
    default via 192.0.2.254 dev enp1s0 proto static metric 102
    Copy to Clipboard Toggle word wrap
  3. 显示 IPv6 默认网关:

    # ip -6 route show default
    default via 2001:db8:1::fffe dev enp1s0 proto static metric 102 pref medium
    Copy to Clipboard Toggle word wrap
  4. 显示 DNS 设置:

    # cat /etc/resolv.conf
    search example.com
    nameserver 192.0.2.200
    nameserver 2001:db8:1::ffbb
    Copy to Clipboard Toggle word wrap

    如果多个连接配置文件同时处于活跃状态,则 nameserver 条目的顺序取决于这些配置文件中的 DNS 优先级值和连接类型。

  5. 使用 ping 工具验证这个主机是否可以向其他主机发送数据包:

    # ping <host-name-or-IP-address>
    Copy to Clipboard Toggle word wrap

故障排除步骤

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

您可以使用声明 Nmstate API 配置带有静态 IP 地址、网关和 DNS 设置的以太网连接,并将它们分配给指定的接口名称。nmstate 可确保结果与配置文件匹配或回滚更改。

先决条件

  • 服务器配置中存在物理或虚拟以太网网络接口控制器(NIC)。
  • nmstate 软件包已安装。

步骤

  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
    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
    Copy to Clipboard Toggle word wrap

    这些设置使用以下设置为 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
  2. 可选:您可以在 interfaces 属性中定义 identifier: mac-addressmac-address: <mac_address> 属性,来通过其 MAC 地址而不是其名称来识别网络接口卡,例如:

    ---
    interfaces:
    - name: <profile_name>
      type: ethernet
      identifier: mac-address
      mac-address: <mac_address>
      ...
    Copy to Clipboard Toggle word wrap
  3. 将设置应用到系统:

    # nmstatectl apply ~/create-ethernet-profile.yml
    Copy to Clipboard Toggle word wrap

验证

  1. 以 YAML 格式显示当前状态:

    # nmstatectl show enp1s0
    Copy to Clipboard Toggle word wrap
  2. 显示 NIC 的 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:17:b8:b6 brd ff:ff:ff:ff:ff:ff
        inet 192.0.2.1/24 brd 192.0.2.255 scope global noprefixroute enp1s0
           valid_lft forever preferred_lft forever
        inet6 2001:db8:1::fffe/64 scope global noprefixroute
           valid_lft forever preferred_lft forever
    Copy to Clipboard Toggle word wrap
  3. 显示 IPv4 默认网关:

    # ip route show default
    default via 192.0.2.254 dev enp1s0 proto static metric 102
    Copy to Clipboard Toggle word wrap
  4. 显示 IPv6 默认网关:

    # ip -6 route show default
    default via 2001:db8:1::fffe dev enp1s0 proto static metric 102 pref medium
    Copy to Clipboard Toggle word wrap
  5. 显示 DNS 设置:

    # cat /etc/resolv.conf
    search example.com
    nameserver 192.0.2.200
    nameserver 2001:db8:1::ffbb
    Copy to Clipboard Toggle word wrap

    如果多个连接配置文件同时处于活跃状态,则 nameserver 条目的顺序取决于这些配置文件中的 DNS 优先级值和连接类型。

  6. 使用 ping 工具验证这个主机是否可以向其他主机发送数据包:

    # ping <host-name-or-IP-address>
    Copy to Clipboard Toggle word wrap

您可以使用声明 Nmstate API 配置带有静态 IP 地址、网关和 DNS 设置的以太网连接,并将它们分配给基于其 PCI 地址的设备。nmstate 可确保结果与配置文件匹配或回滚更改。

先决条件

  • 服务器配置中存在物理以太网网络接口控制器(NIC)。
  • 您知道设备的 PCI 地址。您可以使用 ethtool -i < interface_name&gt; | grep bus-info 命令显示 PCI 地址。
  • nmstate 软件包已安装。

步骤

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

    ---
    interfaces:
    - name: <profile_name>
      type: ethernet
      state: up
      identifier: pci-address
      pci-address: 0000:00:14.3
      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: <profile_name>
      - destination: ::/0
        next-hop-address: 2001:db8:1::fffe
        next-hop-interface: <profile_name>
    dns-resolver:
      config:
        search:
        - example.com
        server:
        - 192.0.2.200
        - 2001:db8:1::ffbb
    Copy to Clipboard Toggle word wrap

    这些设置通过以下设置为 ID 为 0000:00:14.3 的设备定义以太网连接配置文件:

    • 静态 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
  2. 将设置应用到系统:

    # nmstatectl apply ~/create-ethernet-profile.yml
    Copy to Clipboard Toggle word wrap

验证

  1. 以 YAML 格式显示当前状态:

    # nmstatectl show <interface_name>
    Copy to Clipboard Toggle word wrap
  2. 显示 NIC 的 IP 设置:

    # ip address show <interface_name>
    2: :<interface_name> <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
        link/ether 52:54:00:17:b8:b6 brd ff:ff:ff:ff:ff:ff
        inet 192.0.2.1/24 brd 192.0.2.255 scope global noprefixroute <interface_name>
           valid_lft forever preferred_lft forever
        inet6 2001:db8:1::fffe/64 scope global noprefixroute
           valid_lft forever preferred_lft forever
    Copy to Clipboard Toggle word wrap
  3. 显示 IPv4 默认网关:

    # ip route show default
    default via 192.0.2.254 dev <interface_name> proto static metric 102
    Copy to Clipboard Toggle word wrap
  4. 显示 IPv6 默认网关:

    # ip -6 route show default
    default via 2001:db8:1::fffe dev <interface_name> proto static metric 102 pref medium
    Copy to Clipboard Toggle word wrap
  5. 显示 DNS 设置:

    # cat /etc/resolv.conf
    search example.com
    nameserver 192.0.2.200
    nameserver 2001:db8:1::ffbb
    Copy to Clipboard Toggle word wrap
  6. 使用 ping 工具验证这个主机是否可以向其他主机发送数据包:

    # ping <host-name-or-IP-address>
    Copy to Clipboard Toggle word wrap

您可以使用 network RHEL 系统角色配置具有静态 IP 地址、网关和 DNS 的以太网连接,并将它们分配给指定的接口名称。

要将 Red Hat Enterprise Linux 主机连接到以太网网络,请为网络设备创建一个 NetworkManager 连接配置文件。通过使用 Ansible 和 network RHEL 系统角色,您可以自动化此过程,并在 playbook 中定义的主机上远程配置连接配置文件。

通常,管理员希望重复使用 playbook,且不会为 Ansible 应该为其分配静态 IP 地址的每个主机维护单独的 playbook。在本例中,您可以在 playbook 中使用变量,并在清单中维护设置。因此,您只需要一个 playbook 来动态地将单个设置分配给多个主机。

先决条件

  • 您已准备好控制节点和受管节点
  • 您以可在受管主机上运行 playbook 的用户身份登录到控制节点。
  • 您用于连接到受管节点的帐户对它们具有 sudo 权限。
  • 物理或者虚拟以太网设备在服务器配置中存在。
  • 受管节点使用 NetworkManager 配置网络。

流程

  1. 编辑 ~/inventory 文件,并将特定于主机的设置附加到主机条目中:

    managed-node-01.example.com interface=enp1s0 ip_v4=192.0.2.1/24 ip_v6=2001:db8:1::1/64 gateway_v4=192.0.2.254 gateway_v6=2001:db8:1::fffe
    
    managed-node-02.example.com interface=enp1s0 ip_v4=192.0.2.2/24 ip_v6=2001:db8:1::2/64 gateway_v4=192.0.2.254 gateway_v6=2001:db8:1::fffe
    Copy to Clipboard Toggle word wrap
  2. 创建一个包含以下内容的 playbook 文件,如 ~/playbook.yml

    ---
    - name: Configure the network
      hosts: managed-node-01.example.com,managed-node-02.example.com
      tasks:
        - name: Ethernet connection profile with static IP address settings
          ansible.builtin.include_role:
            name: redhat.rhel_system_roles.network
          vars:
            network_connections:
              - name: "{{ interface }}"
                interface_name: "{{ interface }}"
                type: ethernet
                autoconnect: yes
                ip:
                  address:
                    - "{{ ip_v4 }}"
                    - "{{ ip_v6 }}"
                  gateway4: "{{ gateway_v4 }}"
                  gateway6: "{{ gateway_v6 }}"
                  dns:
                    - 192.0.2.200
                    - 2001:db8:1::ffbb
                  dns_search:
                    - example.com
                state: up
    Copy to Clipboard Toggle word wrap

    此 playbook 从清单文件中动态读取每个主机的某些值,并在 playbook 中对所有主机相同的设置使用静态值。

    有关 playbook 中使用的所有变量的详情,请查看控制节点上的 /usr/share/ansible/roles/rhel-system-roles.network/README.md 文件。

  3. 验证 playbook 语法:

    $ ansible-playbook --syntax-check ~/playbook.yml
    Copy to Clipboard Toggle word wrap

    请注意,这个命令只验证语法,不能防止错误的、但有效的配置。

  4. 运行 playbook:

    $ ansible-playbook ~/playbook.yml
    Copy to Clipboard Toggle word wrap

验证

  • 查询受管节点的 Ansible 事实,并验证活跃的网络设置:

    # ansible managed-node-01.example.com -m ansible.builtin.setup
    ...
            "ansible_default_ipv4": {
                "address": "192.0.2.1",
                "alias": "enp1s0",
                "broadcast": "192.0.2.255",
                "gateway": "192.0.2.254",
                "interface": "enp1s0",
                "macaddress": "52:54:00:17:b8:b6",
                "mtu": 1500,
                "netmask": "255.255.255.0",
                "network": "192.0.2.0",
                "prefix": "24",
                "type": "ether"
            },
            "ansible_default_ipv6": {
                "address": "2001:db8:1::1",
                "gateway": "2001:db8:1::fffe",
                "interface": "enp1s0",
                "macaddress": "52:54:00:17:b8:b6",
                "mtu": 1500,
                "prefix": "64",
                "scope": "global",
                "type": "ether"
            },
            ...
            "ansible_dns": {
                "nameservers": [
                    "192.0.2.1",
                    "2001:db8:1::ffbb"
                ],
                "search": [
                    "example.com"
                ]
            },
    ...
    Copy to Clipboard Toggle word wrap

您可以使用 network RHEL 系统角色配置带有静态 IP 地址、网关和 DNS 设置的以太网连接,并根据其路径而不是其名称将它们分配给设备。

要将 Red Hat Enterprise Linux 主机连接到以太网网络,请为网络设备创建一个 NetworkManager 连接配置文件。通过使用 Ansible 和 network RHEL 系统角色,您可以自动化此过程,并在 playbook 中定义的主机上远程配置连接配置文件。

先决条件

  • 您已准备好控制节点和受管节点
  • 您以可在受管主机上运行 playbook 的用户身份登录到控制节点。
  • 您用于连接到受管节点的帐户对它们具有 sudo 权限。
  • 服务器配置中有一个物理或者虚拟以太网设备。
  • 受管节点使用 NetworkManager 配置网络。
  • 您知道设备的路径。您可以使用 udevadm info /sys/class/net/<device_name> | grep ID_PATH= 命令显示设备路径。

流程

  1. 创建一个包含以下内容的 playbook 文件,如 ~/playbook.yml

    ---
    - name: Configure the network
      hosts: managed-node-01.example.com
      tasks:
        - name: Ethernet connection profile with static IP address settings
          ansible.builtin.include_role:
            name: redhat.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
    Copy to Clipboard Toggle word wrap

    示例 playbook 中指定的设置包括如下:

    match
    定义一个应用设置所必须满足的条件。您只能将此变量与 path 选项一起使用。
    path
    定义设备的持久路径。您可以将它设置为固定路径或表达式。其值可以包含修饰符和通配符。这个示例将设置应用到与 PCI ID 0000:00:0[1-3].0 而不是 0000:00:02.0 匹配的设备。

    有关 playbook 中使用的所有变量的详情,请查看控制节点上的 /usr/share/ansible/roles/rhel-system-roles.network/README.md 文件。

  2. 验证 playbook 语法:

    $ ansible-playbook --syntax-check ~/playbook.yml
    Copy to Clipboard Toggle word wrap

    请注意,这个命令只验证语法,不能防止错误的、但有效的配置。

  3. 运行 playbook:

    $ ansible-playbook ~/playbook.yml
    Copy to Clipboard Toggle word wrap

验证

  • 查询受管节点的 Ansible 事实,并验证活跃的网络设置:

    # ansible managed-node-01.example.com -m ansible.builtin.setup
    ...
            "ansible_default_ipv4": {
                "address": "192.0.2.1",
                "alias": "enp1s0",
                "broadcast": "192.0.2.255",
                "gateway": "192.0.2.254",
                "interface": "enp1s0",
                "macaddress": "52:54:00:17:b8:b6",
                "mtu": 1500,
                "netmask": "255.255.255.0",
                "network": "192.0.2.0",
                "prefix": "24",
                "type": "ether"
            },
            "ansible_default_ipv6": {
                "address": "2001:db8:1::1",
                "gateway": "2001:db8:1::fffe",
                "interface": "enp1s0",
                "macaddress": "52:54:00:17:b8:b6",
                "mtu": 1500,
                "prefix": "64",
                "scope": "global",
                "type": "ether"
            },
            ...
            "ansible_dns": {
                "nameservers": [
                    "192.0.2.1",
                    "2001:db8:1::ffbb"
                ],
                "search": [
                    "example.com"
                ]
            },
    ...
    Copy to Clipboard Toggle word wrap

您可以使用声明 Nmstate API 配置带有静态 IP 地址、网关和 DNS 设置的以太网连接,并根据其 PCI 地址将配置分配给设备。nmstate 可确保结果与配置文件匹配或回滚更改。

先决条件

  • 服务器配置中存在物理或虚拟以太网网络接口控制器(NIC)。
  • 网络中有 DHCP 服务器。
  • nmstate 软件包已安装。

步骤

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

    ---
    interfaces:
    - name: enp1s0
      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
    Copy to Clipboard Toggle word wrap

    这些设置为 enp1s0 设备定义了一个以太网连接配置文件。连接从 DHCP 服务器检索 IPv4 地址、IPv6 地址、默认网关、路由、DNS 服务器和搜索域,以及 IPv6 无状态地址自动配置(SLAAC)。

  2. 可选:您可以在 interfaces 属性中定义 identifier: mac-addressmac-address: <mac_address> 属性,来通过其 MAC 地址而不是其名称来识别网络接口卡,例如:

    ---
    interfaces:
    - name: <profile_name>
      type: ethernet
      identifier: mac-address
      mac-address: <mac_address>
      ...
    Copy to Clipboard Toggle word wrap
  3. 将设置应用到系统:

    # nmstatectl apply ~/create-ethernet-profile.yml
    Copy to Clipboard Toggle word wrap

验证

  1. 以 YAML 格式显示当前状态:

    # nmstatectl show enp1s0
    Copy to Clipboard Toggle word wrap
  2. 显示 NIC 的 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:17:b8:b6 brd ff:ff:ff:ff:ff:ff
        inet 192.0.2.1/24 brd 192.0.2.255 scope global noprefixroute enp1s0
           valid_lft forever preferred_lft forever
        inet6 2001:db8:1::fffe/64 scope global noprefixroute
           valid_lft forever preferred_lft forever
    Copy to Clipboard Toggle word wrap
  3. 显示 IPv4 默认网关:

    # ip route show default
    default via 192.0.2.254 dev enp1s0 proto static metric 102
    Copy to Clipboard Toggle word wrap
  4. 显示 IPv6 默认网关:

    # ip -6 route show default
    default via 2001:db8:1::fffe dev enp1s0 proto static metric 102 pref medium
    Copy to Clipboard Toggle word wrap
  5. 显示 DNS 设置:

    # cat /etc/resolv.conf
    search example.com
    nameserver 192.0.2.200
    nameserver 2001:db8:1::ffbb
    Copy to Clipboard Toggle word wrap

    如果多个连接配置文件同时处于活跃状态,则 nameserver 条目的顺序取决于这些配置文件中的 DNS 优先级值和连接类型。

  6. 使用 ping 工具验证这个主机是否可以向其他主机发送数据包:

    # ping <host-name-or-IP-address>
    Copy to Clipboard Toggle word wrap

您可以使用声明 Nmstate API 配置 DHCP 和 IPv6 无状态地址自动配置(SLAAC)的以太网连接,并根据其 PCI 地址将配置分配给设备。nmstate 可确保结果与配置文件匹配或回滚更改。

先决条件

  • 服务器配置中存在物理以太网设备。
  • 网络中有 DHCP 服务器和 SLAAC。
  • 受管主机使用 NetworkManager 配置网络。
  • 您知道设备的 PCI 地址。您可以使用 ethtool -i < interface_name&gt; | grep bus-info 命令显示 PCI 地址。
  • nmstate 软件包已安装。

步骤

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

    ---
    interfaces:
    - name: <profile_name>
      type: ethernet
      state: up
      identifier: pci-address
      pci-address: 0000:00:14.3
      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
    Copy to Clipboard Toggle word wrap

    这些设置为 ID 为 0000:00:14.3 的设备定义以太网连接配置文件。连接从 DHCP 服务器检索 IPv4 地址、IPv6 地址、默认网关、路由、DNS 服务器和搜索域,以及 IPv6 无状态地址自动配置(SLAAC)。

  2. 将设置应用到系统:

    # nmstatectl apply ~/create-ethernet-profile.yml
    Copy to Clipboard Toggle word wrap

验证

  1. 以 YAML 格式显示当前状态:

    # nmstatectl show <interface_name>
    Copy to Clipboard Toggle word wrap
  2. 显示 NIC 的 IP 设置:

    # ip address show <interface_name>
    2: <interface_name>: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
        link/ether 52:54:00:17:b8:b6 brd ff:ff:ff:ff:ff:ff
        inet 192.0.2.1/24 brd 192.0.2.255 scope global noprefixroute <interface_name>
           valid_lft forever preferred_lft forever
        inet6 2001:db8:1::fffe/64 scope global noprefixroute
           valid_lft forever preferred_lft forever
    Copy to Clipboard Toggle word wrap
  3. 显示 IPv4 默认网关:

    # ip route show default
    default via 192.0.2.254 dev <interface_name> proto static metric 102
    Copy to Clipboard Toggle word wrap
  4. 显示 IPv6 默认网关:

    # ip -6 route show default
    default via 2001:db8:1::fffe dev <interface_name> proto static metric 102 pref medium
    Copy to Clipboard Toggle word wrap
  5. 显示 DNS 设置:

    # cat /etc/resolv.conf
    search example.com
    nameserver 192.0.2.200
    nameserver 2001:db8:1::ffbb
    Copy to Clipboard Toggle word wrap
  6. 使用 ping 工具验证这个主机是否可以向其他主机发送数据包:

    # ping <host-name-or-IP-address>
    Copy to Clipboard Toggle word wrap

您可以使用 network RHEL 系统角色配置以太网连接,该连接从 DHCP 服务器检索其 IP 地址、网关和 DNS 设置,以及 IPv6 无状态地址自动配置(SLAAC)。使用此角色,您可以将连接配置文件分配给指定的接口名称。

要将 Red Hat Enterprise Linux 主机连接到以太网网络,请为网络设备创建一个 NetworkManager 连接配置文件。通过使用 Ansible 和 network RHEL 系统角色,您可以自动化此过程,并在 playbook 中定义的主机上远程配置连接配置文件。

先决条件

  • 您已准备好控制节点和受管节点
  • 您以可在受管主机上运行 playbook 的用户身份登录到控制节点。
  • 您用于连接到受管节点的帐户对它们具有 sudo 权限。
  • 物理或者虚拟以太网设备在服务器配置中存在。
  • 网络中有 DHCP 服务器和 SLAAC。
  • 受管节点使用 NetworkManager 服务来配置网络。

流程

  1. 创建一个包含以下内容的 playbook 文件,如 ~/playbook.yml

    ---
    - name: Configure the network
      hosts: managed-node-01.example.com
      tasks:
        - name: Ethernet connection profile with dynamic IP address settings
          ansible.builtin.include_role:
            name: redhat.rhel_system_roles.network
          vars:
            network_connections:
              - name: enp1s0
                interface_name: enp1s0
                type: ethernet
                autoconnect: yes
                ip:
                  dhcp4: yes
                  auto6: yes
                state: up
    Copy to Clipboard Toggle word wrap

    示例 playbook 中指定的设置包括如下:

    dhcp4: yes
    启用来自 DHCP、PPP 或类似服务的自动 IPv4 地址分配。
    auto6: yes
    启用 IPv6 自动配置。默认情况下,NetworkManager 使用路由器公告。如果路由器宣布 managed 标记,则 NetworkManager 会从 DHCPv6 服务器请求 IPv6 地址和前缀。

    有关 playbook 中使用的所有变量的详情,请查看控制节点上的 /usr/share/ansible/roles/rhel-system-roles.network/README.md 文件。

  2. 验证 playbook 语法:

    $ ansible-playbook --syntax-check ~/playbook.yml
    Copy to Clipboard Toggle word wrap

    请注意,这个命令只验证语法,不能防止错误的、但有效的配置。

  3. 运行 playbook:

    $ ansible-playbook ~/playbook.yml
    Copy to Clipboard Toggle word wrap

验证

  • 查询受管节点的 Ansible 事实,并验证接口是否收到 IP 地址和 DNS 设置:

    # ansible managed-node-01.example.com -m ansible.builtin.setup
    ...
            "ansible_default_ipv4": {
                "address": "192.0.2.1",
                "alias": "enp1s0",
                "broadcast": "192.0.2.255",
                "gateway": "192.0.2.254",
                "interface": "enp1s0",
                "macaddress": "52:54:00:17:b8:b6",
                "mtu": 1500,
                "netmask": "255.255.255.0",
                "network": "192.0.2.0",
                "prefix": "24",
                "type": "ether"
            },
            "ansible_default_ipv6": {
                "address": "2001:db8:1::1",
                "gateway": "2001:db8:1::fffe",
                "interface": "enp1s0",
                "macaddress": "52:54:00:17:b8:b6",
                "mtu": 1500,
                "prefix": "64",
                "scope": "global",
                "type": "ether"
            },
            ...
            "ansible_dns": {
                "nameservers": [
                    "192.0.2.1",
                    "2001:db8:1::ffbb"
                ],
                "search": [
                    "example.com"
                ]
            },
    ...
    Copy to Clipboard Toggle word wrap

通过使用 network RHEL 系统角色,您可以配置以太网连接,以从 DHCP 服务器和 IPv6 无状态地址自动配置(SLAAC)检索其 IP 地址、网关和 DNS 设置。角色可以通过设备的路径分配配置集。

要将 Red Hat Enterprise Linux 主机连接到以太网网络,请为网络设备创建一个 NetworkManager 连接配置文件。通过使用 Ansible 和 network RHEL 系统角色,您可以自动化此过程,并在 playbook 中定义的主机上远程配置连接配置文件。

先决条件

  • 您已准备好控制节点和受管节点
  • 您以可在受管主机上运行 playbook 的用户身份登录到控制节点。
  • 您用于连接到受管节点的帐户对它们具有 sudo 权限。
  • 服务器配置中有一个物理或者虚拟以太网设备。
  • 网络中有 DHCP 服务器和 SLAAC。
  • 受管主机使用 NetworkManager 配置网络。
  • 您知道设备的路径。您可以使用 udevadm info /sys/class/net/<device_name> | grep ID_PATH= 命令显示设备路径。

流程

  1. 创建一个包含以下内容的 playbook 文件,如 ~/playbook.yml

    ---
    - name: Configure the network
      hosts: managed-node-01.example.com
      tasks:
        - name: Ethernet connection profile with dynamic IP address settings
          ansible.builtin.include_role:
            name: redhat.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
    Copy to Clipboard Toggle word wrap

    示例 playbook 中指定的设置包括如下:

    match: path
    定义一个应用设置所必须满足的条件。您只能将此变量与 path 选项一起使用。
    path: <path_and_expressions>
    定义设备的持久路径。您可以将它设置为固定路径或表达式。其值可以包含修饰符和通配符。这个示例将设置应用到与 PCI ID 0000:00:0[1-3].0 而不是 0000:00:02.0 匹配的设备。
    dhcp4: yes
    启用来自 DHCP、PPP 或类似服务的自动 IPv4 地址分配。
    auto6: yes
    启用 IPv6 自动配置。默认情况下,NetworkManager 使用路由器公告。如果路由器宣布 managed 标记,则 NetworkManager 会从 DHCPv6 服务器请求 IPv6 地址和前缀。

    有关 playbook 中使用的所有变量的详情,请查看控制节点上的 /usr/share/ansible/roles/rhel-system-roles.network/README.md 文件。

  2. 验证 playbook 语法:

    $ ansible-playbook --syntax-check ~/playbook.yml
    Copy to Clipboard Toggle word wrap

    请注意,这个命令只验证语法,不能防止错误的、但有效的配置。

  3. 运行 playbook:

    $ ansible-playbook ~/playbook.yml
    Copy to Clipboard Toggle word wrap

验证

  • 查询受管节点的 Ansible 事实,并验证接口是否收到 IP 地址和 DNS 设置:

    # ansible managed-node-01.example.com -m ansible.builtin.setup
    ...
            "ansible_default_ipv4": {
                "address": "192.0.2.1",
                "alias": "enp1s0",
                "broadcast": "192.0.2.255",
                "gateway": "192.0.2.254",
                "interface": "enp1s0",
                "macaddress": "52:54:00:17:b8:b6",
                "mtu": 1500,
                "netmask": "255.255.255.0",
                "network": "192.0.2.0",
                "prefix": "24",
                "type": "ether"
            },
            "ansible_default_ipv6": {
                "address": "2001:db8:1::1",
                "gateway": "2001:db8:1::fffe",
                "interface": "enp1s0",
                "macaddress": "52:54:00:17:b8:b6",
                "mtu": 1500,
                "prefix": "64",
                "scope": "global",
                "type": "ether"
            },
            ...
            "ansible_dns": {
                "nameservers": [
                    "192.0.2.1",
                    "2001:db8:1::ffbb"
                ],
                "search": [
                    "example.com"
                ]
            },
    ...
    Copy to Clipboard Toggle word wrap

NetworkManager 支持将通配符用于连接配置文件中的接口名称。这可让您为多个以太网接口创建一个配置文件,这在带有动态 IP 地址分配的以太网网络间漫长时很有用。

先决条件

  • 服务器配置中存在多个物理或虚拟以太网设备。
  • 网络中有 DHCP 服务器。
  • 主机上不存在连接配置文件。

流程

  1. 添加可应用于以 enp 开头的所有接口名称的连接配置文件:

    # nmcli connection add con-name "Wired connection 1" connection.multi-connect multiple match.interface-name enp* type ethernet
    Copy to Clipboard Toggle word wrap

验证

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

    # nmcli connection show "Wired connection 1"
    connection.id:                      Wired connection 1
    ...
    connection.multi-connect:           3 (multiple)
    match.interface-name:               enp*
    ...
    Copy to Clipboard Toggle word wrap

    3 表示接口在特定的时间可以被多次激活。连接配置文件使用与 match.interface-name 参数中的模式匹配的所有设备,因此连接配置文件具有相同的通用唯一识别符(UUID)。

  2. 显示连接的状态:

    # nmcli connection show
    NAME                UUID                                  TYPE      DEVICE
    ...
    Wired connection 1  6f22402e-c0cc-49cf-b702-eaf0cd5ea7d1  ethernet  enp7s0
    Wired connection 1  6f22402e-c0cc-49cf-b702-eaf0cd5ea7d1  ethernet  enp8s0
    Wired connection 1  6f22402e-c0cc-49cf-b702-eaf0cd5ea7d1  ethernet  enp9s0
    Copy to Clipboard Toggle word wrap

第 4 章 配置 NIC team

网络接口控制器(NIC)team 是一种组合或聚合物理和虚拟网络接口的方法,以提供具有高吞吐量或冗余的逻辑接口。NIC team 使用小内核模块来实现数据包流的快速处理和用于其他任务的用户空间服务。这样,NIC team 是一种用于负载平衡和冗余要求的易于扩展和伸缩的解决方案。

Red Hat Enterprise Linux 为管理员提供不同的选项来配置团队设备。例如:

  • 使用 nmcli 使用命令行配置团队连接。
  • 使用 RHEL web 控制台使用 Web 浏览器配置组连接。
  • 使用 nm-connection-editor 应用程序在图形界面中配置组连接。
重要

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

4.1. 将 NIC team 配置迁移到网络绑定

网络接口控制器(NIC)team 在 Red Hat Enterprise Linux 9 中已弃用。如果您已经配置了一个可工作的 NIC team,例如,因为您从较早的 RHEL 版本升级了,您可以将配置迁移到由 NetworkManager 管理的网络绑定。

重要

team2bond 工具仅将 team 配置转换为绑定。之后,您必须手动配置绑定的进一步设置,如 IP 地址和 DNS 配置。

先决条件

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

流程

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

    # nmcli connection show team-team0 | grep -E "^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
    ...
    Copy to Clipboard Toggle word wrap
  2. team0 设备的配置导出到 JSON 文件中:

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

    # nmcli connection delete team-team0
    # nmcli connection delete team-team0-port1
    # nmcli connection delete team-team0-port2
    Copy to Clipboard Toggle word wrap
  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 controller bond0
    nmcli con add type ethernet ifname enp8s0 controller bond0
    Copy to Clipboard Toggle word wrap

    第一个命令包含两个 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-port-enp7s0' (38489729-b624-4606-a784-1ccf01e2f6d6) successfully added.
    Connection 'bond-port-enp8s0' (de97ec06-7daa-4298-9a71-9d4c7909daa1) successfully added.
    Copy to Clipboard Toggle word wrap

    下一步需要绑定连接配置集的名称(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
    Copy to Clipboard Toggle word wrap
  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
    Copy to Clipboard Toggle word wrap
  9. 激活连接:

    # nmcli connection up bond-bond0
    Copy to Clipboard Toggle word wrap

验证

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

    # nmcli connection show bond-bond0 | grep -E "^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
    ...
    Copy to Clipboard Toggle word wrap
  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
    Copy to Clipboard Toggle word wrap

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

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

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

      # cat /proc/net/bonding/bond0
      Copy to Clipboard Toggle word wrap

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

在管理绑定端口接口时了解 NetworkManager 的默认行为可帮助您更有效地对问题进行故障排除。

默认行为:

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

4.4. 使用 nmcli 配置 NIC team

要在命令行上配置网络接口控制器(NIC)team ,请使用 nmcli 工具。

重要

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

先决条件

  • 已安装 teamdNetworkManager-team 软件包。
  • 在服务器中安装两个或者两个以上物理或者虚拟网络设备。
  • 要将以太网设备用作组的端口,必须在服务器中安装物理或者虚拟以太网设备并连接到交换机。
  • 要使用 bond、bridge 或 VLAN 设备作为团队的端口,您可以在创建团队时创建这些设备,或者预先创建它们,如下所述:

流程

  1. 创建团队接口:

    # nmcli connection add type team con-name team0 ifname team0 team.runner activebackup
    Copy to Clipboard Toggle word wrap

    此命令创建一个名为 team0 的 NIC team,它使用 activebackup runner 。

  2. 可选:设置链接监视程序。例如,要在 team0 连接配置文件中设置 ethtool 链接监视器:

    # nmcli connection modify team0 team.link-watchers "name=ethtool"
    Copy to Clipboard Toggle word wrap

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

    # nmcli connection modify team0 team.link-watchers "name=ethtool delay-up=2500"
    Copy to Clipboard Toggle word wrap

    要设置多个链路监视器,每个都使用特定的参数,不同的连接监视器以逗号分隔。以下示例使用 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"
    Copy to Clipboard Toggle word wrap
  3. 显示网络接口,并记录您要添加到团队中的接口名称:

    # nmcli device status
    DEVICE  TYPE      STATE         CONNECTION
    enp7s0  ethernet  disconnected  --
    enp8s0  ethernet  disconnected  --
    bond0   bond      connected  bond0
    bond1   bond      connected  bond1
    ...
    Copy to Clipboard Toggle word wrap

    在本例中:

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

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

      # nmcli connection add type ethernet port-type team con-name team0-port1 ifname enp7s0 controller team0
      # nmcli connection add type ethernet port--type team con-name team0-port2 ifname enp8s0 controller team0
      Copy to Clipboard Toggle word wrap

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

    2. 将现有的连接配置文件分配给团队:

      1. 将这些连接的 controller 参数设置为 team0

        # nmcli connection modify bond0 controller team0
        # nmcli connection modify bond1 controller team0
        Copy to Clipboard Toggle word wrap

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

      2. 重新激活连接:

        # nmcli connection up bond0
        # nmcli connection up bond1
        Copy to Clipboard Toggle word wrap
  5. 配置 IPv4 设置:

    • 要为 team0 连接设置静态 IPv4 地址、网络掩码、默认网关和 DNS 服务器设置,请输入:

      # nmcli connection modify team0 ipv4.addresses '192.0.2.1/24' ipv4.gateway '192.0.2.254' ipv4.dns '192.0.2.253' ipv4.dns-search 'example.com' ipv4.method manual
      Copy to Clipboard Toggle word wrap
    • 要使用 DHCP,不需要任何操作。
    • 如果您计划将此团队设备用作其它设备的端口,则不需要任何操作。
  6. 配置 IPv6 设置:

    • 要为 team0 连接设置静态 IPv6 地址、网络掩码、默认网关和 DNS 服务器设置,请输入:

      # nmcli connection modify team0 ipv6.addresses '2001:db8:1::1/64' ipv6.gateway '2001:db8:1::fffe' ipv6.dns '2001:db8:1::fffd' ipv6.dns-search 'example.com' ipv6.method manual
      Copy to Clipboard Toggle word wrap
    • 如果您计划将此团队设备用作其它设备的端口,则不需要任何操作。
    • 要使用无状态地址自动配置(SLAAC),不需要采取任何操作。
  7. 激活连接:

    # nmcli connection up team0
    Copy to Clipboard Toggle word wrap

验证

  • 显示团队状态:

    # 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
    Copy to Clipboard Toggle word wrap

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

4.5. 使用 RHEL web 控制台配置 NIC team

如果您喜欢使用基于 Web 浏览器的界面管理网络设置,那么请使用 RHEL web 控制台配置网络接口控制器(NIC)team 。

重要

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

先决条件

  • 您已安装了 RHEL 9 web 控制台。
  • 您已启用了 cockpit 服务。
  • 您的用户帐户被允许登录到 web 控制台。

    具体步骤请参阅安装并启用 Web 控制台

流程

  1. 登录到 RHEL 9 web 控制台。

    详情请参阅 登录到 web 控制台

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

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

  7. 设置链接监视器:

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

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

    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
    Copy to Clipboard Toggle word wrap

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

4.6. 使用 nm-connection-editor 配置 NIC team

如果使用带有图形界面的 Red Hat Enterprise Linux,您可以使用 nm-connection-editor 应用程序配置网络接口控制器(NIC)team 。

请注意:nm-connection-editor 只能向团队添加新端口。要使用现有连接配置文件作为端口,请使用 nmcli 工具创建 team ,如 使用 nmcli 配置 NIC team 中所述。

重要

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

先决条件

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

流程

  1. 打开一个终端,输入 nm-connection-editor

    $ nm-connection-editor
    Copy to Clipboard Toggle word wrap
  2. 点击 + 按钮来添加一个新的连接。
  3. 选择 Team 连接类型,然后单击 Create
  4. Team 选项卡中:

    1. 可选:在 Interface name 字段中设置团队接口的名称。
    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 选项卡中,设置链接监视器及其可选设置。
      3. OK
  5. IPv4 SettingsIPv6 Settings 标签页中配置 IP 地址设置:

    • 如果您计划将此网桥设备用作其它设备的端口,请将 Method 字段设置为 Disabled
    • 要使用 DHCP,请将 Method 字段保留为默认值 Automatic (DHCP)
    • 要使用静态 IP 设置,请将 Method 字段设置为 Manual,并相应地填写字段:

      team IP settings nm connection editor

  6. 点击 Save
  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
    Copy to Clipboard Toggle word wrap

第 5 章 配置 VLAN 标记

Virtual Local Area Network (VLAN) 是物理网络中的一个逻辑网络。当 VLAN 接口通过接口时,VLAN 接口标签带有 VLAN ID 的数据包,并删除返回的数据包的标签。

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

Red Hat Enterprise Linux 为管理员提供不同的选项来配置 VLAN 设备。例如:

  • 使用 nmcli 使用命令行配置 VLAN 标记。
  • 通过 RHEL web 控制台使用 Web 浏览器配置 VLAN 标记。
  • 使用 nmtui 在基于文本的用户界面中配置 VLAN 标记。
  • 使用 nm-connection-editor 应用程序在图形界面中配置连接。
  • 使用 nmstatectl 通过 Nmstate API 配置连接。
  • 使用 RHEL 系统角色自动化一个或多个主机上的 VLAN 配置。

5.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
    ...
    Copy to Clipboard Toggle word wrap
  2. 创建 VLAN 接口。例如,要创建一个使用 enp1s0 作为其父接口,使用 VLAN ID 10 标记数据包,名为 vlan10 的 VLAN 接口,请输入:

    # nmcli connection add type vlan con-name vlan10 ifname vlan10 vlan.parent enp1s0 vlan.id 10
    Copy to Clipboard Toggle word wrap

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

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

    # nmcli connection modify vlan10 ethernet.mtu 2000
    Copy to Clipboard Toggle word wrap
  4. 配置 IPv4 设置:

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

      # nmcli connection modify vlan10 ipv4.addresses '192.0.2.1/24' ipv4.gateway '192.0.2.254' ipv4.dns '192.0.2.253' ipv4.method manual
      Copy to Clipboard Toggle word wrap
    • 要使用 DHCP,不需要任何操作。
    • 如果您计划将此 VLAN 设备用作其它设备的端口,则不需要执行任何操作。
  5. 配置 IPv6 设置:

    • 要为 vlan10 连接设置静态 IPv6 地址、网络掩码、默认网关和 DNS 服务器设置,请输入:

      # nmcli connection modify vlan10 ipv6.addresses '2001:db8:1::1/32' ipv6.gateway '2001:db8:1::fffe' ipv6.dns '2001:db8:1::fffd' ipv6.method manual
      Copy to Clipboard Toggle word wrap
    • 要使用无状态地址自动配置(SLAAC),不需要采取任何操作。
    • 如果您计划将此 VLAN 设备用作其它设备的端口,则不需要执行任何操作。
  6. 激活连接:

    # nmcli connection up vlan10
    Copy to Clipboard Toggle word wrap

验证

  • 验证设置:

    # 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
    Copy to Clipboard Toggle word wrap

5.2. 使用 nmcli 配置嵌套 VLAN

802.1ad 是用于虚拟局域网(VLAN)标记的协议。它也被称为 Q-in-Q 标记。您可以使用此技术在单个以太网范围内创建多个 VLAN 标签。

单一帧中多个 VLAN 标签的好处:

  • 通过在 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  connected      enp1s0
    ...
    Copy to Clipboard Toggle word wrap
  2. 创建基础 VLAN 接口。例如,要创建一个名为 vlan10 的基本 VLAN 接口,它使用 enp1s0 作为其父接口,以及 VLAN ID 为 10 的标记数据包,请输入:

    # nmcli connection add type vlan con-name vlan10 dev enp1s0 vlan.id 10
    Copy to Clipboard Toggle word wrap

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

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

    # nmcli connection modify vlan10 ethernet.mtu 2000
    Copy to Clipboard Toggle word wrap
  4. 在基本 VLAN 接口之上创建嵌套的 VLAN 接口:

    # nmcli connection add type vlan con-name vlan10.20 dev enp1s0.10 id 20 vlan.protocol 802.1ad
    Copy to Clipboard Toggle word wrap

    此命令会在父 VLAN 连接 vlan10 上创建一个新的 VLAN 连接,名称为 vlan10.20,VLAN ID 为 20dev 选项指定父网络设备。在本例中,是 enp1s0.10vlan.protocol 选项指定 VLAN 封装协议。在本例中,它是 802.1ad (Q-in-Q)。

  5. 配置嵌套 VLAN 接口的 IPv4 设置:

    • 要使用 DHCP,不需要任何操作。
    • 要为 vlan10.20 连接设置静态 IPv4 地址、网络掩码、默认网关和 DNS 服务器设置,请输入:

      # nmcli connection modify vlan10.20 ipv4.method manual ipv4.addresses 192.0.2.1/24 ipv4.gateway 192.0.2.254 ipv4.dns 192.0.2.200
      Copy to Clipboard Toggle word wrap
  6. 配置嵌套 VLAN 接口的 IPv6 设置:

    • 要使用无状态地址自动配置(SLAAC),不需要采取任何操作。
    • 要为 vlan10 连接设置静态 IPv6 地址、网络掩码、默认网关和 DNS 服务器设置,请输入:

      # nmcli connection modify bridge0 ipv6.addresses '2001:db8:1::1/64' ipv6.gateway '2001:db8:1::fffe' ipv6.dns '2001:db8:1::fffd' ipv6.dns-search 'example.com' ipv6.method manual
      Copy to Clipboard Toggle word wrap
  7. 激活配置文件:

    # nmcli connection up vlan10.20
    Copy to Clipboard Toggle word wrap

验证

  • 验证嵌套 VLAN 接口的配置:

    # ip -d addr show enp1s0.10.20
    10: enp1s0.10.20@enp1s0.10: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
        link/ether 52:54:00:d2:74:3e brd ff:ff:ff:ff:ff:ff promiscuity 0 minmtu 0 maxmtu 65535
        vlan protocol 802.1ad id 20 <REORDER_HDR> numtxqueues 1 numrxqueues 1 gso_max_size 65536 gso_max_segs 65535 tso_max_size 65536 tso_max_segs 65535 gro_max_size 65536
        inet 192.0.2.1/24 brd 192.0.2.255 scope global noprefixroute enp1s0.10.20
           valid_lft forever preferred_lft forever
        inet6 2001:db8:1::1/32 scope global noprefixroute
           valid_lft forever preferred_lft forever
        inet6 fe80::ce3b:84c5:9ef8:d0e6/64 scope link noprefixroute
           valid_lft forever preferred_lft forever
    Copy to Clipboard Toggle word wrap

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

如果您更喜欢在 RHEL web 控制台中使用基于 Web 浏览器的界面管理网络设置,您可以配置 VLAN 标记。

前提条件

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

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

    具体步骤请参阅安装并启用 Web 控制台

流程

  1. 登录到 RHEL 9 web 控制台。

    详情请参阅 登录到 web 控制台

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

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

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

    7. 应用

验证

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

5.4. 使用 nmtui 配置 VLAN 标记

nmtui 应用程序为 NetworkManager 提供了一个基于文本的用户界面。您可以使用 nmtui 在没有图形界面的主机上配置 VLAN 标签。

注意

nmtui 中:

  • 使用光标键导航。
  • 选择一个按钮并按 Enter 键。
  • 使用 Space 选择并清除复选框。
  • 要返回上一个屏幕,请使用 ESC

前提条件

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

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

流程

  1. 如果您不知道要在其上配置 VLAN 标签的网络设备名称,请显示可用的设备:

    # nmcli device status
    DEVICE     TYPE      STATE                   CONNECTION
    enp1s0     ethernet  unavailable             --
    ...
    Copy to Clipboard Toggle word wrap
  2. 启动 nmtui

    # nmtui
    Copy to Clipboard Toggle word wrap
  3. 选择 Edit a connection,然后按 Enter
  4. Add
  5. 从网络类型的列表中选择 VLAN,然后按 Enter 键。
  6. 可选:为要创建的 NetworkManager 配置文件输入一个名称。

    在具有多个配置文件的主机上,有意义的名称可以更容易识别配置文件的用途。

  7. Device 字段中输入要创建的 VLAN 设备的名称。
  8. Parent 字段中输入您要在其上配置 VLAN 标记的设备的名称。
  9. 输入 VLAN ID。ID 必须在 04094 之间。
  10. 根据您的环境,在 IPv4 configurationIPv6 configuration 区域中相应地配置 IP 地址设置。为此,请按这些区域旁边的按钮,并选择:

    • Disabled,如果此 VLAN 设备不需要 IP 地址,或者您想要将其用作其它设备的端口。
    • Automatic,如果 DHCP 服务器或无状态地址自动配置(SLAAC)为 VLAN 设备动态分配一个 IP 地址。
    • Manual,如果网络需要静态 IP 地址设置。在这种情况下,您必须填写更多字段:

      1. 按您要配置的协议旁边的 Show 来显示其他字段。
      2. Addresses 旁边的 Add,并输入无类别域间路由(CIDR)格式的 IP 地址和子网掩码。

        如果没有指定子网掩码,NetworkManager 会为 IPv4 地址设置 /32 子网掩码,为 IPv6 地址设置 /64 子网掩码。

      3. 输入默认网关的地址。
      4. DNS servers 旁边的 Add,并输入 DNS 服务器地址。
      5. Search domains 旁边的 Add,并输入 DNS 搜索域。

    图 5.1. 具有静态 IP 地址设置的 VLAN 连接示例

  11. OK 创建并自动激活新连接。
  12. Back 返回到主菜单。
  13. 选择 Quit,然后按 Enter 关闭 nmtui 应用程序。

验证

  • 验证设置:

    # 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
    Copy to Clipboard Toggle word wrap

5.5. 使用 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
    Copy to Clipboard Toggle word wrap
  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. IPv4 SettingsIPv6 Settings 标签页中配置 IP 地址设置:

    • 如果您计划将此网桥设备用作其它设备的端口,请将 Method 字段设置为 Disabled
    • 要使用 DHCP,请将 Method 字段保留为默认值 Automatic (DHCP)
    • 要使用静态 IP 设置,请将 Method 字段设置为 Manual,并相应地填写字段:

      vlan IP settings nm connection editor

  6. 点击 Save
  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
    Copy to Clipboard Toggle word wrap

5.6. 使用 nmstatectl 配置 VLAN 标记

您可以使用声明性 Nmstate API 来配置 Virtual Local Area Network VLAN。nmstate 可确保结果与配置文件匹配或回滚更改。

根据您的环境,相应地调整 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
    Copy to Clipboard Toggle word wrap

    这些设置定义一个 ID 为 10 的 VLAN,它使用 enp1s0 设备。作为子设备,VLAN 连接有以下设置:

    • 静态 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
  2. 将设置应用到系统:

    # nmstatectl apply ~/create-vlan.yml
    Copy to Clipboard Toggle word wrap

验证

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

    # nmcli device status
    DEVICE      TYPE      STATE      CONNECTION
    vlan10      vlan      connected  vlan10
    Copy to Clipboard Toggle word wrap
  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
    ...
    Copy to Clipboard Toggle word wrap
  3. 以 YAML 格式显示连接设置:

    # nmstatectl show vlan10
    Copy to Clipboard Toggle word wrap

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

您可以使用 network RHEL 系统角色配置 VLAN 标记,如果 VLAN 的父设备的连接配置文件不存在,则角色也可以创建它。

如果您的网络使用 Virtual Local Area Networks (VLAN)将网络流量分隔到逻辑网络中,请创建一个 NetworkManager 连接配置文件来配置 VLAN 标记。通过使用 Ansible 和 network RHEL 系统角色,您可以自动化此过程,并在 playbook 中定义的主机上远程配置连接配置文件。

注意

如果 VLAN 设备需要一个 IP 地址、默认网关和 DNS 设置,请在 VLAN 设备上,而不是在父设备上配置它们。

先决条件

流程

  1. 创建一个包含以下内容的 playbook 文件,如 ~/playbook.yml

    ---
    - name: Configure the network
      hosts: managed-node-01.example.com
      tasks:
        - name: VLAN connection profile with Ethernet port
          ansible.builtin.include_role:
            name: redhat.rhel_system_roles.network
          vars:
            network_connections:
              # Ethernet profile
              - name: enp1s0
                type: ethernet
                interface_name: enp1s0
                autoconnect: yes
                state: up
                ip:
                  dhcp4: no
                  auto6: no
    
              # VLAN profile
              - name: enp1s0.10
                type: vlan
                vlan:
                  id: 10
                ip:
                  dhcp4: yes
                  auto6: yes
                parent: enp1s0
                state: up
    Copy to Clipboard Toggle word wrap

    示例 playbook 中指定的设置包括如下:

    type: <profile_type>
    设置要创建的配置文件的类型。示例 playbook 创建两个连接配置文件:一个用于父以太网设备,另一个用于 VLAN 设备。
    dhcp4: <value>
    如果设置为 yes,则启用从 DHCP、PPP 或类似服务的自动 IPv4 地址分配。禁用父设备上的 IP 地址配置。
    auto6: <value>
    如果设置为 yes,则启用 IPv6 自动配置。在这种情况下,NetworkManager 默认使用路由器公告,如果路由器宣布 managed 标志,则 NetworkManager 会从 DHCPv6 服务器请求 IPv6 地址和前缀。禁用父设备上的 IP 地址配置。
    parent: <parent_device>
    设置 VLAN 连接配置文件的父设备。在示例中,父设备是以太网接口。

    有关 playbook 中使用的所有变量的详情,请查看控制节点上的 /usr/share/ansible/roles/rhel-system-roles.network/README.md 文件。

  2. 验证 playbook 语法:

    $ ansible-playbook --syntax-check ~/playbook.yml
    Copy to Clipboard Toggle word wrap

    请注意,这个命令只验证语法,不能防止错误的、但有效的配置。

  3. 运行 playbook:

    $ ansible-playbook ~/playbook.yml
    Copy to Clipboard Toggle word wrap

验证

  • 验证 VLAN 设置:

    # ansible managed-node-01.example.com -m command -a 'ip -d addr show enp1s0.10'
    managed-node-01.example.com | CHANGED | rc=0 >>
    4: vlan10@enp1s0.10: <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
        ...
    Copy to Clipboard Toggle word wrap

第 6 章 配置网络桥接

网桥是一个链路层设备,它通过使用 MAC 地址表在网络之间转发流量。例如,您可以使用软件网桥将虚拟机连接到与主机相同的网络。

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

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

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

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

6.1. 使用 nmcli 配置网桥

要在命令行上配置网桥,请使用 nmcli 工具。

先决条件

  • 在服务器中安装两个或者两个以上物理或者虚拟网络设备。
  • 主机在 Red Hat Enterprise Linux 9.4 或更高版本上运行。此版本引入了在此流程中使用的 port-type,controller,connection.autoconnect-ports 选项。以前的 RHEL 版本使用 slave-typemasterconnection.autoconnect-slaves
  • 要将以太网设备用作网桥的端口,必须在服务器中安装物理或者虚拟以太网设备。
  • 要使用 team、bond 或 VLAN 设备作为网桥的端口,您可以在创建桥接时创建这些设备,或者预先创建它们,如:

流程

  1. 创建网桥接口:

    # nmcli connection add type bridge con-name bridge0 ifname bridge0
    Copy to Clipboard Toggle word wrap

    此命令创建一个名为 bridge0 的网桥。

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

    # nmcli device status
    DEVICE  TYPE      STATE         CONNECTION
    enp7s0  ethernet  disconnected  --
    enp8s0  ethernet  disconnected  --
    bond0   bond      connected     bond0
    bond1   bond      connected     bond1
    ...
    Copy to Clipboard Toggle word wrap

    在本例中:

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

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

      # nmcli connection add type ethernet port-type bridge con-name bridge0-port1 ifname enp7s0 controller bridge0
      # nmcli connection add type ethernet port-type bridge con-name bridge0-port2 ifname enp8s0 controller bridge0
      Copy to Clipboard Toggle word wrap

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

    2. 如果要将现有的连接配置文件分配给网桥:

      1. 将这些连接的 controller 参数设置为 bridge0

        # nmcli connection modify bond0 controller bridge0
        # nmcli connection modify bond1 controller bridge0
        Copy to Clipboard Toggle word wrap

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

      2. 重新激活连接:

        # nmcli connection up bond0
        # nmcli connection up bond1
        Copy to Clipboard Toggle word wrap
  4. 配置 IPv4 设置:

    • 要为 bridge0 连接设置静态 IPv4 地址、网络掩码、默认网关和 DNS 服务器设置,请输入:

      # nmcli connection modify bridge0 ipv4.addresses '192.0.2.1/24' ipv4.gateway '192.0.2.254' ipv4.dns '192.0.2.253' ipv4.dns-search 'example.com' ipv4.method manual
      Copy to Clipboard Toggle word wrap
    • 要使用 DHCP,不需要任何操作。
    • 如果您计划将此网桥设备用作其它设备的端口,则不需要执行任何操作。
  5. 配置 IPv6 设置:

    • 要为 bridge0 连接设置静态 IPv6 地址、网络掩码、默认网关和 DNS 服务器设置,请输入:

      # nmcli connection modify bridge0 ipv6.addresses '2001:db8:1::1/64' ipv6.gateway '2001:db8:1::fffe' ipv6.dns '2001:db8:1::fffd' ipv6.dns-search 'example.com' ipv6.method manual
      Copy to Clipboard Toggle word wrap
    • 要使用无状态地址自动配置(SLAAC),不需要采取任何操作。
    • 如果您计划将此网桥设备用作其它设备的端口,则不需要执行任何操作。
  6. 可选:配置网桥的其他属性。例如,要将 bridge0 的生成树协议(STP)优先级设为 16384,请输入:

    # nmcli connection modify bridge0 bridge.priority '16384'
    Copy to Clipboard Toggle word wrap

    默认情况下启用 STP。

  7. 激活连接:

    # nmcli connection up bridge0
    Copy to Clipboard Toggle word wrap
  8. 验证端口是否已连接,并且 CONNECTION 列是否显示端口的连接名称:

    # nmcli device
    DEVICE   TYPE      STATE      CONNECTION
    ...
    enp7s0   ethernet  connected  bridge0-port1
    enp8s0   ethernet  connected  bridge0-port2
    Copy to Clipboard Toggle word wrap

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

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

      # nmcli connection modify bridge0 connection.autoconnect-ports 1
      Copy to Clipboard Toggle word wrap
    2. 重新激活桥接:

      # nmcli connection up bridge0
      Copy to Clipboard Toggle word wrap

验证

  • 使用 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
    Copy to Clipboard Toggle word wrap
  • 使用 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
    ...
    Copy to Clipboard Toggle word wrap

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

6.2. 使用 RHEL web 控制台配置网桥

如果您希望通过基于 Web 浏览器的界面管理网络设置,请使用 RHEL web 控制台来配置网桥。

前提条件

  • 您已安装了 RHEL 9 web 控制台。
  • 您已启用了 cockpit 服务。
  • 您的用户帐户被允许登录到 web 控制台。

    具体步骤请参阅安装并启用 Web 控制台

流程

  1. 登录到 RHEL 9 web 控制台。

    详情请参阅 登录到 web 控制台

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

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

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

    7. 应用

验证

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

6.3. 使用 nmtui 配置网桥

nmtui 应用程序为 NetworkManager 提供了一个基于文本的用户界面。您可以使用 nmtui 在没有图形界面的主机上配置网桥。

注意

nmtui 中:

  • 使用光标键导航。
  • 选择一个按钮并按 Enter 键。
  • 使用 空格 选择和清除复选框。
  • 要返回上一个屏幕,请使用 ESC

先决条件

  • 在服务器中安装两个或者两个以上物理或者虚拟网络设备。
  • 要将以太网设备用作网桥的端口,必须在服务器中安装物理或者虚拟以太网设备。

流程

  1. 如果您不知道您要在其上配置网桥的网络设备名称,请显示可用的设备:

    # nmcli device status
    DEVICE     TYPE      STATE                   CONNECTION
    enp7s0     ethernet  unavailable             --
    enp8s0     ethernet  unavailable             --
    ...
    Copy to Clipboard Toggle word wrap
  2. 启动 nmtui

    # nmtui
    Copy to Clipboard Toggle word wrap
  3. 选择 Edit a connection,点 Enter
  4. Add
  5. 从网络类型列表中选择 Bridge,然后按 Enter
  6. 可选:为要创建的 NetworkManager 配置集输入一个名称。

    在有多个配置文件的主机上,有意义的名称可以更容易识别配置文件的用途。

  7. Device 字段中输入要创建的网桥设备名称。
  8. 将端口添加到要创建的网桥中:

    1. Ports 列表旁边的 Add
    2. 选择您要作为端口添加到网桥的接口类型,例如 Ethernet
    3. 可选:为这个网桥端口输入要创建的 NetworkManager 配置文件的名称。
    4. Device 字段中输入端口的设备名称。
    5. OK 返回到网桥设置窗口。

      图 6.1. 将以太网设备作为端口添加到网桥

    6. 重复这些步骤,来向网桥添加更多的端口。
  9. 根据您的环境,相应地在 IPv4 configurationIPv6 configuration 区中配置 IP 地址。为此,请按这些区域旁边的按钮,并选择:

    • Disabled,如果网桥不需要 IP 地址。
    • Automatic,如果 DHCP 服务器或无状态地址自动配置(SLAAC)动态将 IP 地址分配给网桥。
    • Manual,如果网络需要静态 IP 地址设置。在这种情况下,您必须填写更多字段:

      1. 按您要配置的协议旁边的 Show 来显示其他字段。
      2. Addresses 旁边的 Add,并输入无类别域间路由(CIDR)格式的 IP 地址和子网掩码。

        如果没有指定子网掩码,NetworkManager 会为 IPv4 地址设置 /32 子网掩码,并为 IPv6 地址设置 /64

      3. 输入默认网关的地址。
      4. DNS servers 旁边的 Add,并输入 DNS 服务器地址。
      5. Search domains 旁边的 Add,并输入 DNS 搜索域。

    图 6.2. 没有 IP 地址设置的网桥连接的示例

  10. OK 创建并自动激活新连接。
  11. Back 返回到主菜单。
  12. 选择 Quit,然后按 Enter 键关闭 nmtui 应用程序。

验证

  1. 使用 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
    Copy to Clipboard Toggle word wrap
  2. 使用 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
    ...
    Copy to Clipboard Toggle word wrap

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

6.4. 使用 nm-connection-editor 配置网桥

如果使用带有图形界面的 Red Hat Enterprise Linux ,您可以使用 nm-connection-editor 应用程序配置网桥。

请注意,nm-connection-editor 只能向网桥添加新端口。要使用现有连接配置文件作为端口,请使用 nmcli 工具创建网桥,如 使用 nmcli 配置网桥 中所述。

先决条件

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

流程

  1. 打开一个终端,输入 nm-connection-editor

    $ nm-connection-editor
    Copy to Clipboard Toggle word wrap
  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. IPv4 SettingsIPv6 Settings 标签页中配置 IP 地址设置:

    • 如果您计划将此网桥设备用作其它设备的端口,请将 Method 字段设置为 Disabled
    • 要使用 DHCP,请将 Method 字段保留为默认值 Automatic (DHCP)
    • 要使用静态 IP 设置,请将 Method 字段设置为 Manual,并相应地填写字段:

      bridge IP settings nm connection editor

  7. 点击 Save
  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
    Copy to Clipboard Toggle word wrap
  • 使用 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
    ...
    Copy to Clipboard Toggle word wrap

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

6.5. 使用 nmstatectl 配置网桥

您可以使用声明性 Nmstate API 来配置网桥。nmstate 可确保结果与配置文件匹配或回滚更改。

根据您的环境,相应地调整 YAML 文件。例如,要使用与网桥中以太网适配器不同的设备,请调整您在网桥中使用的端口的 base-iface 属性和 type 属性。

先决条件

  • 在服务器中安装两个或者两个以上物理或者虚拟网络设备。
  • 要将以太网设备用作网桥中的端口,必须在服务器中安装物理或者虚拟以太网设备。
  • 要使用团队、绑定或 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
    Copy to Clipboard Toggle word wrap

    这些设置使用以下设置定义一个网桥:

    • 网桥中的网络接口: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 服务器:192.0.2.200
    • IPv6 DNS 服务器:2001:db8:1::ffbb
    • DNS 搜索域:example.com
  2. 将设置应用到系统:

    # nmstatectl apply ~/create-bridge.yml
    Copy to Clipboard Toggle word wrap

验证

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

    # nmcli device status
    DEVICE      TYPE      STATE      CONNECTION
    bridge0     bridge    connected  bridge0
    Copy to Clipboard Toggle word wrap
  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
    ...
    Copy to Clipboard Toggle word wrap
  3. 以 YAML 格式显示连接设置:

    # nmstatectl show bridge0
    Copy to Clipboard Toggle word wrap

6.6. 使用 network RHEL 系统角色配置网桥

您可以使用 network RHEL 系统角色配置网桥,如果网桥的父设备的连接配置文件不存在,则角色也可以创建它。

您可以通过创建网桥,在 Open Systems Interconnection (OSI)模型的第 2 层上连接多个网络。要配置网桥,请在 NetworkManager 中创建一个连接配置文件。通过使用 Ansible 和 network RHEL 系统角色,您可以自动化此过程,并在 playbook 中定义的主机上远程配置连接配置文件。

注意

如果要为网桥分配 IP 地址、网关和 DNS 设置,请在网桥上,而不是在其端口上配置它们。

先决条件

  • 您已准备好控制节点和受管节点
  • 您以可在受管主机上运行 playbook 的用户身份登录到控制节点。
  • 您用于连接到受管节点的帐户对它们具有 sudo 权限。
  • 在服务器中安装两个或者两个以上物理或者虚拟网络设备。

流程

  1. 创建一个包含以下内容的 playbook 文件,如 ~/playbook.yml

    ---
    - name: Configure the network
      hosts: managed-node-01.example.com
      tasks:
        - name: Bridge connection profile with two Ethernet ports
          ansible.builtin.include_role:
            name: redhat.rhel_system_roles.network
          vars:
            network_connections:
              # Bridge profile
              - name: bridge0
                type: bridge
                interface_name: bridge0
                ip:
                  dhcp4: yes
                  auto6: yes
                state: up
    
              # Port profile for the 1st Ethernet device
              - name: bridge0-port1
                interface_name: enp7s0
                type: ethernet
                controller: bridge0
                port_type: bridge
                state: up
    
              # Port profile for the 2nd Ethernet device
              - name: bridge0-port2
                interface_name: enp8s0
                type: ethernet
                controller: bridge0
                port_type: bridge
                state: up
    Copy to Clipboard Toggle word wrap

    示例 playbook 中指定的设置包括如下:

    type: <profile_type>
    设置要创建的配置文件的类型。示例 playbook 创建三个连接配置文件:一个用于网桥,两个用于以太网设备。
    dhcp4: yes
    启用来自 DHCP、PPP 或类似服务的自动 IPv4 地址分配。
    auto6: yes
    启用 IPv6 自动配置。默认情况下,NetworkManager 使用路由器公告。如果路由器宣布 managed 标记,则 NetworkManager 会从 DHCPv6 服务器请求 IPv6 地址和前缀。

    有关 playbook 中使用的所有变量的详情,请查看控制节点上的 /usr/share/ansible/roles/rhel-system-roles.network/README.md 文件。

  2. 验证 playbook 语法:

    $ ansible-playbook --syntax-check ~/playbook.yml
    Copy to Clipboard Toggle word wrap

    请注意,这个命令只验证语法,不能防止错误的、但有效的配置。

  3. 运行 playbook:

    $ ansible-playbook ~/playbook.yml
    Copy to Clipboard Toggle word wrap

验证

  1. 显示作为特定网桥端口的以太网设备的链接状态:

    # ansible managed-node-01.example.com -m command -a 'ip link show master bridge0'
    managed-node-01.example.com | CHANGED | rc=0 >>
    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
    Copy to Clipboard Toggle word wrap
  2. 显示作为任意网桥设备的端口的以太网设备状态:

    # ansible managed-node-01.example.com -m command -a 'bridge link show'
    managed-node-01.example.com | CHANGED | rc=0 >>
    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
    Copy to Clipboard Toggle word wrap

第 7 章 设置 IPsec VPN

使用 IPsec 协议套件的 Libreswan 实施来配置和管理安全虚拟专用网络(VPN),以创建加密隧道来保证通过互联网进行数据传输。

IPsec 隧道可确保传输中数据的保密性和完整性。常见用例包括将分支机构连接到总部,或为远程用户提供对公司网络的安全访问权限。

RHEL 提供不同的选项来配置 Libreswan:

  • 手动编辑 Libreswan 配置文件,以精细控制高级选项。
  • 使用 vpn RHEL 系统角色自动创建 Libreswan VPN 配置的过程。
  • 使用 Nmstate 通过声明性 API 配置 Libreswan 连接。

Libreswan 不使用 "client" 和 "server" 等术语。相反,IPsec 将端点称为"左"和"右"。此设计通常允许您在两个主机上使用相同的配置,因为 Libreswan 会动态决定采用哪个角色。按照惯例,管理员通常对本地主机使用"左",对远程主机使用"右"。

注意

Libreswan 是 RHEL 中唯一支持的 VPN 技术。

IPsec 依赖于标准化协议,如互联网密钥交换(IKE),以确保不同的系统可以有效地通信。然而,在实践中,供应商如何实施这些标准的微小差异可能会导致兼容性问题。如果您在将 Libreswan 连接到第三方 IPsec 对等点时遇到这种互操作性问题,请联系红帽支持

7.1. IPsec VPN 中的组件

在设置 IPsec VPN 前,务必要了解其主要组件:用于身份验证和协商的互联网密钥交换(IKE),以及用于数据加密和传输的 IPsec。

IKE 是两个端点,用于相互验证和协商连接规则,包括加密算法。Libreswan 在名为 pluto 的守护进程中实施 IKE。

IPsec 是协议的一部分,它实际根据 IKE 协商期间同意的策略加密和传输数据。Linux 内核实现了 IPsec 协议套件。

7.2. Libreswan 身份验证方法

根据您的安全需求和网络环境,选择适当的验证方法来建立安全 VPN 连接。

Libreswan 支持以下验证方法:

预共享密钥
预共享密钥(PSK)方法涉及两个端点,方法是使用同一 secret 相互验证。PSK 提供简单和广泛的兼容性,使其适合小型部署。但是,如果密钥被重复使用或不会频繁轮转,则管理 PSK 会带来风险。对于安全性,PSK 应该包含超过 64 个随机字符,如果主机以 FIPS 模式运行,则必须满足 FIPS 强度要求。
原始 RSA 密钥
此方法在每个对等点上使用 RSA 公钥和私钥对进行相互识别。原始 RSA 密钥提供比 PSK 更强大的安全性,对于不需要完整证书基础架构的环境来说是理想的选择。
X.509 证书
此方法使用由可信证书颁发机构(CA)发布的 X.509 证书。每个对等点使用其证书和私钥来证明其身份,其他对等点会根据可信 CA 验证其身份。在为大型企业提供最高级别的安全性和可扩展性时,这种方法更为复杂,因为它需要部署和维护公钥基础架构(PKI)。
NULL 身份验证
这个方法只提供在对等点之间没有身份验证的加密。由于它不验证远程端点的身份,NULL 身份验证不安全,不提供防止中间人攻击。
保护量子计算机
虽然不是独立的身份验证方法,Libreswan 提供 Post-quantum Pre-shared Keys (PPK),以防止现代 IKEv2 连接不受量子计算机攻击。这个功能是必要的,因为旧的 IKEv1 协议或标准 IKEv2 本身都本质上是子级的。PPK 在主身份验证方法之上增加另一个安全层,其安全性依赖于使用通过外部通信频道安全分发的加密强密钥。

主机到主机 VPN 在两个设备之间建立直接、安全和加密的连接,允许应用程序通过不安全的网络(如互联网)安全地进行通信。

为进行身份验证,RSA 密钥比预共享密钥(PSK)更安全,因为其非对称加密消除了共享 secret 的风险。使用 RSA 密钥还通过避免对证书颁发机构(CA)的需求来简化部署,同时仍然提供强大的对等身份验证。

在两个主机上执行步骤。

流程

  1. 如果 Libreswan 尚未安装,请执行以下步骤:

    1. 安装 libreswan 软件包:

      # dnf install libreswan
      Copy to Clipboard Toggle word wrap
    2. 初始化网络安全服务(NSS)数据库:

      # ipsec initnss
      Copy to Clipboard Toggle word wrap

      该命令在 /var/lib/ipsec/nss/ 目录中创建数据库。

    3. 启用并启动 ipsec 服务:

      # systemctl enable --now ipsec
      Copy to Clipboard Toggle word wrap
    4. 在防火墙中打开 IPsec 端口和协议:

      # firewall-cmd --permanent --add-service="ipsec"
      # firewall-cmd --reload
      Copy to Clipboard Toggle word wrap
  2. 创建 RSA 密钥对:

    # ipsec newhostkey
    Copy to Clipboard Toggle word wrap

    ipsec 实用程序将密钥对存储在 NSS 数据库中。

  3. 指定您的同级服务器。在 IPsec 隧道中,您必须将一个主机指定为 left,另一个主机指定为 。这是任意选择。常见的做法是调用您 左侧的 本地主机和 远程主机
  4. 在左侧和右侧显示证书密钥属性 ID (CKAID):

    # ipsec showhostkey --list
    < 1> RSA keyid: <key_id> ckaid: <ckaid>
    Copy to Clipboard Toggle word wrap

    下一步需要两个对等点的 CKAID。

  5. 显示公钥:

    1. 在左侧 peer 中,输入:

      # ipsec showhostkey --left --ckaid <ckaid_of_left_peer>
      	# rsakey AwEAAdKCx
      	leftrsasigkey=0sAwEAAdKCxpc9db48cehzQiQD...
      Copy to Clipboard Toggle word wrap
    2. 在右 peer 中,输入:

      # ipsec showhostkey --right --ckaid <ckaid_of_right_peer>
      	# rsakey AwEAAcNWC
      	rightrsasigkey=0sAwEAAcNWCzZO+PR1j8WbO8X...
      Copy to Clipboard Toggle word wrap

    命令会显示公钥,以及必须在配置文件中使用的对应参数。

  6. /etc/ipsec.d/ 目录中为连接创建一个 .conf 文件。例如,使用以下设置创建 /etc/ipsec.d/host-to-host.conf 文件:

    conn <connection_name>
        # General setup and authentication type
        auto=start
        authby=rsasig
    
        # Peer A
        left=<ip_address_or_fqdn_of_left_peer>
        leftid=@peer_a
        leftrsasigkey=<public_key_of_left_peer>
    
        # Peer B
        right=<ip_address_or_fqdn_of_right_peer>
        rightid=@peer_b
        rightrsasigkey=<public_key_of_right_peer>
    Copy to Clipboard Toggle word wrap
    注意

    您可以在两个主机上使用相同的配置文件,Libreswan 使用内部信息在左侧还是右侧主机上运行。但是,务必要确保 left* 参数中的所有值都属于一个 peer,并且 right* 参数中的值属于另一个。

    示例中指定的设置包括:

    conn <connection_name>
    定义连接名称。名称是任意名称,Libreswan 使用它来识别连接。您必须在这个连接中缩进参数,至少使用一个空格或标签页。
    auto=<type>
    控制如何发起连接。如果将值设为 启动,Libreswan 会在服务启动时自动激活连接。
    authby=rsasig
    为此连接启用 RSA 签名身份验证。
    left= &lt;ip_address_or_fqdn_of_left_peer>right= &lt;ip_address_or_fqdn_of_right_peer>
    定义对等点的 IP 地址或 DNS 名称。
    leftid= &lt;id>rightid= &lt;id>
    定义如何在互联网密钥交换(IKE)协商过程中识别每个对等点。这可以是完全限定域名(FQDN)、IP 地址或字面字符串。在后者的情况下,在字符串前面加上 @ 符号。
    leftrsasigkey=<public_key> and rightrsasigkey=<public_key>
    指定对等点的公钥。使用上一步中 ipsec showhostkey 命令显示的值。
  7. 重启 ipsec 服务:

    # systemctl restart ipsec
    Copy to Clipboard Toggle word wrap

    如果您在配置文件中使用 auto=start,则连接会自动激活。使用其他方法时,需要执行额外的步骤来激活连接。详情请查看系统中的 ipsec.conf (5) 手册页。

验证

  • 显示 IPsec 状态:

    # ipsec status
    Copy to Clipboard Toggle word wrap

    如果成功建立连接,输出包含如下行:

    • 互联网密钥交换版本 2 (IKEv2)协商的阶段 1 成功完成:

      000 #1: "<connection_name>":500 STATE_V2_ESTABLISHED_IKE_SA (established IKE SA); REKEY in 27935s; REPLACE in 28610s; newest; idle;
      Copy to Clipboard Toggle word wrap

      安全关联(SA)现在可以协商实际数据加密隧道,称为子 SA 或阶段 2 SA。

    • 已建立了子 SA:

      000 #2: "<connection_name>":500 STATE_V2_ESTABLISHED_CHILD_SA (established Child SA); REKEY in 27671s; REPLACE in 28610s; IKE SA #1; idle;
      Copy to Clipboard Toggle word wrap

      这是您的数据流量通过的实际隧道。

后续步骤

站点到站点的 VPN 在两个不同的网络之间建立一个安全、加密的隧道,在不安全的公共网络(如互联网)中无缝链接。

例如,站点到站点 VPN 允许分支办公室中的设备访问公司总部中的资源,就像它们都是同一本地网络的一部分一样。

为对网关设备进行身份验证,RSA 密钥比预共享密钥(PSK)更安全,因为其非对称加密消除了共享 secret 的风险。使用 RSA 密钥还通过避免对证书颁发机构(CA)的需求来简化部署,同时仍然提供强大的对等身份验证。

在两个网关设备上执行这些步骤。

先决条件

  • 两个网络中的路由可确保通过本地 VPN 网关设备发送到远程网络的流量。

流程

  1. 如果 Libreswan 尚未安装,请执行以下步骤:

    1. 安装 libreswan 软件包:

      # dnf install libreswan
      Copy to Clipboard Toggle word wrap
    2. 初始化网络安全服务(NSS)数据库:

      # ipsec initnss
      Copy to Clipboard Toggle word wrap

      该命令在 /var/lib/ipsec/nss/ 目录中创建数据库。

    3. 启用并启动 ipsec 服务:

      # systemctl enable --now ipsec
      Copy to Clipboard Toggle word wrap
    4. 在防火墙中打开 IPsec 端口和协议:

      # firewall-cmd --permanent --add-service="ipsec"
      # firewall-cmd --reload
      Copy to Clipboard Toggle word wrap
  2. 创建 RSA 密钥对:

    # ipsec newhostkey
    Copy to Clipboard Toggle word wrap

    ipsec 实用程序将密钥对存储在 NSS 数据库中。

  3. 指定您的同级服务器。在 IPsec 隧道中,您必须将一个主机指定为 left,另一个主机指定为 。这是任意选择。常见的做法是调用您 左侧的 本地主机和 远程主机
  4. 在左侧和右侧显示证书密钥属性 ID (CKAID):

    # ipsec showhostkey --list
    < 1> RSA keyid: <key_id> ckaid: <ckaid>
    Copy to Clipboard Toggle word wrap

    下一步需要两个对等点的 CKAID。

  5. 显示公钥:

    1. 在左侧 peer 中,输入:

      # ipsec showhostkey --left --ckaid <ckaid_of_left_peer>
      	# rsakey AwEAAdKCx
      	leftrsasigkey=0sAwEAAdKCxpc9db48cehzQiQD...
      Copy to Clipboard Toggle word wrap
    2. 在右 peer 中,输入:

      # ipsec showhostkey --right --ckaid <ckaid_of_right_peer>
      	# rsakey AwEAAcNWC
      	rightrsasigkey=0sAwEAAcNWCzZO+PR1j8WbO8X...
      Copy to Clipboard Toggle word wrap

    命令会显示公钥,以及必须在配置文件中使用的对应参数。

  6. /etc/ipsec.d/ 目录中为连接创建一个 .conf 文件。例如,使用以下设置创建 /etc/ipsec.d/site-to-site.conf 文件:

    conn <connection_name>
        # General setup and authentication type
        auto=start
        authby=rsasig
    
        # Site A
        left=<ip_address_or_fqdn_of_left_peer>
        leftid=@site_a
        leftrsasigkey=<public_key_of_left_peer>
        leftsubnet=192.0.2.0/24
    
        # Site B
        right=<ip_address_or_fqdn_of_right_peer>
        rightid=@site_b
        rightrsasigkey=<public_key_of_right_peer>
        rightsubnet={198.51.100.0/24, 203.0.113.0/24}
    Copy to Clipboard Toggle word wrap
    注意

    您可以在两个网关设备上使用相同的配置文件,Libreswan 使用内部信息在左侧还是右侧主机上运行。但是,务必要确保 left* 参数中的所有值都属于一个 peer,并且 right* 参数中的值属于另一个。

    示例中指定的设置包括:

    conn <connection_name>
    定义连接名称。名称是任意名称,Libreswan 使用它来识别连接。您必须在这个连接中缩进参数,至少使用一个空格或标签页。
    auto=<type>
    控制如何发起连接。如果将值设为 启动,Libreswan 会在服务启动时自动激活连接。
    authby=rsasig
    为此连接启用 RSA 签名身份验证。
    left= &lt;ip_address_or_fqdn_of_left_peer>right= &lt;ip_address_or_fqdn_of_right_peer>
    定义对等点的 IP 地址或 DNS 名称。
    leftid= &lt;id>rightid= &lt;id>
    定义如何在互联网密钥交换(IKE)协商过程中识别每个对等点。这可以是完全限定域名(FQDN)、IP 地址或字面字符串。在后者的情况下,在字符串前面加上 @ 符号。
    leftrsasigkey=<public_key> and rightrsasigkey=<public_key>
    指定对等点的公钥。使用上一步中 ipsec showhostkey 命令显示的值。
    leftsubnet= &lt;subnet>rightsubnet= &lt;subnet>
    定义通过隧道连接的无类别域间路由(CIDR)格式的子网。如果要在一端隧道多个子网,请在大括号中指定它们,并使用逗号分隔它们。
  7. 启用数据包转发:

    # echo "net.ipv4.ip_forward=1" > /etc/sysctl.d/95-IPv4-forwarding.conf
    # sysctl -p /etc/sysctl.d/95-IPv4-forwarding.conf
    Copy to Clipboard Toggle word wrap
  8. 重启 ipsec 服务:

    # systemctl restart ipsec
    Copy to Clipboard Toggle word wrap

    如果您在配置文件中使用 auto=start,则连接会自动激活。使用其他方法时,需要执行额外的步骤来激活连接。详情请查看系统中的 ipsec.conf (5) 手册页。

验证

  1. 显示 IPsec 状态:

    # ipsec status
    Copy to Clipboard Toggle word wrap

    如果成功建立连接,输出包含如下行:

    • 互联网密钥交换版本 2 (IKEv2)协商的阶段 1 成功完成:

      000 #2: "<connection_name>":500 STATE_V2_ESTABLISHED_IKE_SA (established IKE SA); REKEY in 27935s; REPLACE in 28610s; newest; idle;
      Copy to Clipboard Toggle word wrap

      安全关联(SA)现在可以协商实际数据加密隧道,称为子 SA 或阶段 2 SA。

    • 已建立了子 SA:

      000 #3: "<connection_name>":500 STATE_V2_ESTABLISHED_CHILD_SA (established Child SA); REKEY in 27671s; REPLACE in 28610s; IKE SA #2; idle;
      Copy to Clipboard Toggle word wrap

      这是您的数据流量通过的实际隧道。

  2. 从本地子网中的客户端 ping 远程子网中的客户端。

后续步骤

主机到站点的 VPN 在单独的远程计算机和专用网络之间建立一个安全、加密的连接,允许它们在不安全的公共网络(如互联网)无缝链接。

主机到站点的 VPN 适用于需要从其计算机访问资源的远程员工,就好像在办公室中物理方式一样。

为进行身份验证,使用由证书颁发机构(CA)管理的数字证书,可提供高度安全、可扩展的解决方案。每个连接主机和网关都提供由可信 CA 签名的证书。这个方法提供强大的、可靠的身份验证,并简化了用户管理。可以在 CA 中集中授予或撤销访问权限,Libreswan 通过针对证书撤销列表(CRL)检查每个证书来强制实施这个访问权限,如果证书出现在列表中,则拒绝访问。

7.5.1. 手动设置 IPsec 网关

您必须正确配置 Libreswan IPsec 网关来启用安全远程访问。Libreswan 从网络安全服务(NSS)数据库读取服务器证书、私钥和 CA 证书。

以下示例允许经过身份验证的用户访问内部 192.0.2.0/24 子网,并将 IP 地址从虚拟 IP 池动态地分配给每个客户端。为保持安全性,网关会验证客户端证书是否由同一可信 CA 发布,并自动使用证书撤销列表(CRL)来确保拒绝任何撤销证书的访问。

前提条件

  • 公共密钥加密标准(PKCSautomationhub)文件 ~/file.p12 在带有以下内容的网关中存在:

    • 服务器的私钥
    • 服务器证书
    • CA 证书
    • 如果需要,则中间证书

    有关创建私钥和证书签名请求(CSR),以及从 CA 请求证书的详情,请查看您的 CA 文档。

  • 服务器证书包含以下字段:

    • 扩展的密钥使用(EKU)设置为 TLS Web 服务器身份验证
    • 通用名称(CN)或主题备用名称(SAN)被设置为网关的完全限定域名(FQDN)。
    • X509v3 CRL 发行版点包含证书撤销列表(CRL)的 URL。
  • VPN 客户端流量的返回路由在内部网络上配置,指向 VPN 网关。

流程

  1. 如果 Libreswan 尚未安装:

    1. 安装 libreswan 软件包:

      # dnf install libreswan
      Copy to Clipboard Toggle word wrap
    2. 初始化网络安全服务(NSS)数据库:

      # ipsec initnss
      Copy to Clipboard Toggle word wrap

      该命令在 /var/lib/ipsec/nss/ 目录中创建数据库。

    3. 启用并启动 ipsec 服务:

      # systemctl enable --now ipsec
      Copy to Clipboard Toggle word wrap
    4. 在防火墙中打开 IPsec 端口和协议:

      # firewall-cmd --permanent --add-service="ipsec"
      # firewall-cmd --reload
      Copy to Clipboard Toggle word wrap
  2. 将 PKCSautomationhub 文件导入到 NSS 数据库中:

    # ipsec import ~/file.p12
    Enter password for PKCS12 file: <password>
    pk12util: PKCS12 IMPORT SUCCESSFUL
    correcting trust bits for Example-CA
    Copy to Clipboard Toggle word wrap
  3. 显示服务器和 CA 证书的 nicknames:

    # certutil -L -d /var/lib/ipsec/nss/
    Certificate Nickname     Trust Attributes
                             SSL,S/MIME,JAR/XPI
    
    vpn-gateway              u,u,u
    Example-CA               CT,,
    ...
    Copy to Clipboard Toggle word wrap

    您需要配置文件此信息。

  4. /etc/ipsec.d/ 目录中为连接创建一个 .conf 文件。例如,使用以下设置创建 /etc/ipsec.d/host-to-site.conf 文件:

    1. 添加 config setup 部分以启用 CRL 检查:

      config setup
          crl-strict=yes
          crlcheckinterval=1h
      Copy to Clipboard Toggle word wrap

      示例中指定的设置包括:

      crl-strict=yes
      启用 CRL 检查。如果 NSS 数据库中没有 CRL,则身份验证客户端将被拒绝。
      crlcheckinterval=1h
      在指定周期后,从服务器证书中指定的 URL 重新获取 CRL。
    2. 为网关添加部分:

      conn <connection_name>
          # General setup and authentication type
          auto=start
          ikev2=insist
          authby=rsasig
      
          # VPN gateway settings
          left=%defaultroute
          leftid=%fromcert
          leftcert="<server_certificate_nickname>"
          leftrsasigkey=%cert
          leftsendcert=always
          leftsubnet=192.0.2.0/24
          rekey=no
          mobike=yes
          narrowing=yes
      
          # Client-related settings
          right=%any
          rightid=%fromcert
          rightrsasigkey=%cert
          rightaddresspool=198.51.100.129-198.51.100.254
          rightmodecfgclient=yes
          modecfgclient=yes
          modecfgdns=192.0.2.5
          modecfgdomains="example.com"
      
          # Dead Peer Detection
          dpddelay=30
          dpdtimeout=120
          dpdaction=clear
      Copy to Clipboard Toggle word wrap

      示例中指定的设置包括:

      ikev2=insist
      将现代 IKEv2 协议定义为唯一允许的协议,而不回退到 IKEv1。
      left=%defaultroute
      ipsec 服务启动时,动态设置默认路由接口的 IP 地址。或者,您可以将 left 参数设置为 IP 地址或主机的 FQDN。
      leftid=%fromcertrightid=%fromcert
      将 Libreswan 配置为从证书的可分辨名称(DN)字段检索身份。
      leftcert="<server_certificate_nickname>"
      设置 NSS 数据库中使用的服务器证书的别名。
      leftrsasigkey=%cert and rightrsasigkey=%cert
      将 Libreswan 配置为使用嵌入在证书中的 RSA 公钥。
      leftsendcert=always
      指示网关始终发送证书,以便客户端可以针对 CA 证书进行验证。
      leftsubnet=<subnets>
      指定连接到客户端可以通过隧道访问的网关的子网。
      mobike=yes
      使客户端能够在网络间无缝查找。
      rightaddresspool=<ip_range>
      指定网关可以从哪个范围分配 IP 地址到客户端。
      modecfgclient=yes
      启用客户端接收 modecfgdns 参数中设置的 DNS 服务器 IP,以及 modecfgdomains 中设置的 DNS 搜索域。

    有关示例中使用的所有参数的详情,请查看系统中的 ipsec.conf (5) 手册页。

  5. 启用数据包转发:

    # echo "net.ipv4.ip_forward=1" > /etc/sysctl.d/95-IPv4-forwarding.conf
    # sysctl -p /etc/sysctl.d/95-IPv4-forwarding.conf
    Copy to Clipboard Toggle word wrap
  6. 重启 ipsec 服务:

    # systemctl restart ipsec
    Copy to Clipboard Toggle word wrap

    如果您在配置文件中使用 auto=start,则连接会自动激活。使用其他方法时,需要执行额外的步骤来激活连接。详情请查看系统中的 ipsec.conf (5) 手册页。

验证

  1. 配置客户端并连接到 VPN 网关
  2. 检查服务是否载入 CRL 并将条目添加到 NSS 数据库中:

    # ipsec auto --listcrls
    000
    000 List of CRLs:
    000
    000 issuer: CN=Example-CA
    000 revoked certs: 1
    000 updates: this Tue Jul 15 10:22:36 2025
    000          next Sun Jan 11 10:22:36 2026
    000
    000 List of CRL fetch requests:
    000
    000 Jul 15 15:13:56 2025, trials: 1
    000        issuer:  'CN=Example-CA'
    000        distPts: 'https://ca.example.com/crl.pem'
    Copy to Clipboard Toggle word wrap

后续步骤:

要访问远程私有网络上的资源,用户必须首先配置 IPsec VPN 连接。GNOME Settings 应用程序提供了一个图形化的解决方案,来在 NetworkManager 中创建 IPsec VPN 连接配置文件并建立隧道。

先决条件

  • 您已配置了 IPsec VPN 网关
  • 已安装 NetworkManager-libreswan-gnome 软件包。
  • PKCSeffort 文件 ~/file.p12 存在于客户端上,其中包含以下内容:

    • 用户的私钥
    • 用户证书
    • CA 证书
    • 如果需要,则中间证书

    有关创建私钥和证书签名请求(CSR),以及从 CA 请求证书的详情,请查看您的 CA 文档。

  • 证书中的扩展密钥用法(EKU)被设置为 TLS Web 客户端身份验证

流程

  1. 初始化网络安全服务(NSS)数据库:

    # ipsec initnss
    Copy to Clipboard Toggle word wrap

    该命令在 /var/lib/ipsec/nss/ 目录中创建数据库。

  2. 将 PKCSautomationhub 文件导入到 NSS 数据库中:

    # ipsec import ~/file.p12
    Enter password for PKCS12 file: <password>
    pk12util: PKCS12 IMPORT SUCCESSFUL
    correcting trust bits for Example-CA
    Copy to Clipboard Toggle word wrap
  3. 显示用户和 CA 证书的别名:

    # certutil -L -d /var/lib/ipsec/nss/
    Certificate Nickname     Trust Attributes
                             SSL,S/MIME,JAR/XPI
    
    user                     u,u,u
    Example-CA               CT,,
    ...
    Copy to Clipboard Toggle word wrap

    在配置文件中,您需要此信息。

  4. Super 键,键入 Settings,然后按 Enter 键打开 GNOME Settings 应用程序。
  5. VPN 条目旁边的 + 按钮。
  6. 从列表中选择 基于 IPsec 的 VPN
  7. Identity 选项卡中,按如下所示填写字段:

    Expand
    表 7.1. 身份选项卡 设置
    字段名称value对应的 ipsec.conf 参数

    Name

    <networkmanager_profile_name>

    N/A

    网关

    <ip_address_or_fqdn_of_the_gateway>

    right

    Type

    IKEv2 (certificate)

    authby

    组名称

    %fromcert

    leftid

    证书名称

    <user_certificate_nickname>

    leftcert

    远程 ID

    %fromcert

    rightid

  8. 单击 Advanced
  9. Advanced properties 窗口中,填写 connections 选项卡的字段,如下所示:

    Expand
    表 7.2. 连接 选项卡设置
    字段名称value对应的 ipsec.conf 参数

    远程网络

    192.0.2.0/24

    rightsubnet

    缩小

    已选择

    缩小

    启用 MOBIKE

    mobike

    delay

    30

    dpddelay

    Timeout(超时)

    120

    dpdtimeout

    操作

    清除

    dpdaction

  10. Apply 返回连接设置。
  11. Apply 保存连接。
  12. Settings 应用程序的 Network 选项卡中,切换 VPN 配置集旁的开关来激活连接。

验证

  • 建立与远程网络中主机的连接或 ping 它。

后续步骤

IPsec 网格会创建一个完全互连的网络,每个服务器都可以与所有其他服务器安全通信。这是涵盖多个数据中心或云供应商的分布式数据库集群或高可用性环境的理想选择。

在每对服务器之间建立直接的加密隧道可确保安全通信,而无需中央瓶颈。为进行身份验证,使用由证书颁发机构(CA)管理的数字证书,可提供高度安全、可扩展的解决方案。网格中的每个主机都提供由可信 CA 签名的证书。这个方法提供强大的、可靠的身份验证,并简化了用户管理。可以在 CA 中集中授予或撤销访问权限,Libreswan 通过针对证书撤销列表(CRL)检查每个证书来强制实施这个访问权限,如果证书出现在列表中,则拒绝访问。

先决条件

  • 网格中的每个对等点都存在一个公共密钥加密标准(PKCS UDS)文件,其中包含以下内容:

    • 服务器的私钥
    • 服务器证书
    • CA 证书
    • 如果需要,则中间证书

    有关创建私钥和证书签名请求(CSR),以及从 CA 请求证书的详情,请查看您的 CA 文档。

  • 服务器证书包含以下字段:

    • 扩展的密钥使用(EKU)设置为 TLS Web 服务器身份验证
    • 通用名称(CN)或主题备用名称(SAN)被设置为主机的完全限定域名(FQDN)。
    • X509v3 CRL 发行版点包含证书撤销列表(CRL)的 URL。

流程

  1. 如果 Libreswan 尚未安装,请执行以下步骤:

    1. 安装 libreswan 软件包:

      # dnf install libreswan
      Copy to Clipboard Toggle word wrap
    2. 初始化网络安全服务(NSS)数据库:

      # ipsec initnss
      Copy to Clipboard Toggle word wrap

      该命令在 /var/lib/ipsec/nss/ 目录中创建数据库。

    3. 启用并启动 ipsec 服务:

      # systemctl enable --now ipsec
      Copy to Clipboard Toggle word wrap
    4. 在防火墙中打开 IPsec 端口和协议:

      # firewall-cmd --permanent --add-service="ipsec"
      # firewall-cmd --reload
      Copy to Clipboard Toggle word wrap
  2. 将 PKCSautomationhub 文件导入到 NSS 数据库中:

    # ipsec import <file>.p12
    Enter password for PKCS12 file: <password>
    pk12util: PKCS12 IMPORT SUCCESSFUL
    correcting trust bits for Example-CA
    Copy to Clipboard Toggle word wrap
  3. 显示服务器和 CA 证书的 nicknames:

    # certutil -L -d /var/lib/ipsec/nss/
    Certificate Nickname     Trust Attributes
                             SSL,S/MIME,JAR/XPI
    
    server1                  u,u,u
    Example-CA               CT,,
    ...
    Copy to Clipboard Toggle word wrap

    您需要配置文件此信息。

  4. /etc/ipsec.d/ 目录中为连接创建一个 .conf 文件。例如,使用以下设置创建 /etc/ipsec.d/mesh.conf 文件:

    1. 添加 config setup 部分以启用 CRL 检查:

      config setup
          crl-strict=yes
          crlcheckinterval=1h
      Copy to Clipboard Toggle word wrap

      示例中指定的设置包括:

      crl-strict=yes
      启用 CRL 检查。如果 NSS 数据库中没有 CRL,则身份验证对等点将被拒绝。
      crlcheckinterval=1h
      在指定周期后,从服务器证书中指定的 URL 重新获取 CRL。
    2. 添加在网格中成员间强制实施流量的部分:

      conn <connection_name>
          # General setup and authentication type
          auto=ondemand
          authby=rsasig
      
          # Local settings settings
          left=%defaultroute
          leftid=%fromcert
          leftcert="<server_certificate_nickname>"
          leftrsasigkey=%cert
          leftsendcert=always
          failureshunt=drop
          type=transport
      
          # Settings related to other peers in the mesh
          right=%opportunisticgroup
          rightid=%fromcert
      Copy to Clipboard Toggle word wrap

      示例中指定的设置包括:

      left=%defaultroute
      ipsec 服务启动时,动态设置默认路由接口的 IP 地址。或者,您可以将 left 参数设置为 IP 地址或主机的 FQDN。
      leftid=%fromcertrightid=%fromcert
      将 Libreswan 配置为从证书的可分辨名称(DN)字段检索身份。
      leftcert="<server_certificate_nickname>"
      设置 NSS 数据库中使用的服务器证书的别名。
      leftrsasigkey=%cert
      将 Libreswan 配置为使用嵌入在证书中的 RSA 公钥。
      leftsendcert=always
      指示对等点始终发送证书,以便对等点可以针对 CA 证书进行验证。
      failureshunt=drop
      如果 IPsec 协商失败,强制实施加密并丢弃流量。对于安全网格来说,这至关重要。
      right=%opportunisticgroup
      指定连接应应用到策略文件中定义的动态远程对等点组。这可让 Libreswan 对该组中每个列出的 IP 或子网实例化 IPsec 隧道。

    有关示例中使用的所有参数的详情,请查看系统中的 ipsec.conf (5) 手册页。

  5. 创建 /etc/ipsec.d/policies/server-mesh 策略文件,该文件以无类别域间路由(CIDR)格式指定对等或子网:

    192.0.2.0/24
    198.51.100.0/24
    Copy to Clipboard Toggle word wrap

    使用这些设置,ipsec 服务会加密这些子网中主机之间的流量。如果主机没有配置为 IPsec 网格的成员,则此主机和网格成员之间的通信会失败。

  6. 重启 ipsec 服务:

    # systemctl restart ipsec
    Copy to Clipboard Toggle word wrap
  7. 对您在策略文件中指定的子网中的每个主机上重复这个过程。

验证

  1. 将流量发送到网格中的主机以建立隧道。例如,ping 主机:

    # ping -c3 <peer_in_mesh>
    Copy to Clipboard Toggle word wrap
  2. 显示 IPsec 状态:

    # ipsec status
    Copy to Clipboard Toggle word wrap

    如果成功建立连接,输出包含 peer 的以下行:

    • 互联网密钥交换版本 2 (IKEv2)协商的阶段 1 成功完成:

      #1: "<connection_name>#192.0.2.0/24"[1] ...192.0.2.2:500 ESTABLISHED_IKE_SA (established IKE SA); REKEY in 12822s; REPLACE in 13875s; newest; idle;
      Copy to Clipboard Toggle word wrap

      安全关联(SA)现在可以协商实际数据加密隧道,称为子 SA 或阶段 2 SA。

    • 已建立了子 SA:

      #2: "<connection_name>#192.0.2.0/24"[1] ...192.0.2.2:500 ESTABLISHED_CHILD_SA (established Child SA); REKEY in 13071s; REPLACE in 13875s; newest; eroute owner; IKE SA #1; idle;
      Copy to Clipboard Toggle word wrap

      这是您的数据流量通过的实际隧道。

  3. 检查服务是否载入 CRL 并将条目添加到 NSS 数据库中:

    # ipsec auto --listcrls
    000
    000 List of CRLs:
    000
    000 issuer: CN=Example-CA
    000 revoked certs: 1
    000 updates: this Tue Jul 15 10:22:36 2025
    000          next Sun Jan 11 10:22:36 2026
    000
    000 List of CRL fetch requests:
    000
    000 Jul 15 15:13:56 2025, trials: 1
    000        issuer:  'CN=Example-CA'
    000        distPts: 'https://ca.example.com/crl.pem'
    Copy to Clipboard Toggle word wrap

后续步骤

7.7. 使用密码保护 IPsec NSS 数据库

默认情况下,只有 root 用户可以访问 /var/lib/ipsec/nss/ 目录中的 IPsec 网络安全服务(NSS)数据库。您还可以使用密码保护数据库。如果您在联邦信息处理标准(FIPS)模式下运行 RHEL,则需要此项。

先决条件

  • /var/lib/ipsec/nss/ 目录包含 NSS 数据库。

流程

  1. 为 Libreswan NSS 数据库启用密码保护:

    # certutil -W -d /var/lib/ipsec/nss/
    Copy to Clipboard Toggle word wrap
  2. 输入当前密码:

    Enter Password or Pin for "NSS Certificate DB": <password>
    Copy to Clipboard Toggle word wrap

    如果数据库目前不受密码保护,请按 Enter 键。

  3. 输入新密码:

    Enter new password: <new_password>
    Re-enter password: <new_password>
    Copy to Clipboard Toggle word wrap
  4. 要解锁数据库,ipsec 服务需要 /etc/ipsec.d/nsspassword 文件。使用以下内容创建文件:

    • 如果主机没有以 FIPS 模式运行:

      NSS Certificate DB:<password>
      Copy to Clipboard Toggle word wrap
    • 如果主机以 FIPS 模式运行:

      NSS FIPS 140-2 Certificate DB:<password>
      Copy to Clipboard Toggle word wrap
  5. /etc/ipsec.d/nsspassword 文件中设置安全权限:

    # chmod 600 /etc/ipsec.d/nsspassword
    # chown root:root /etc/ipsec.d/nsspassword
    Copy to Clipboard Toggle word wrap
  6. 重启 ipsec 服务:

    # systemctl restart ipsec
    Copy to Clipboard Toggle word wrap

验证

  1. 验证 ipsec 服务是否正在运行:

    # systemctl is-active ipsec
    Copy to Clipboard Toggle word wrap

    如果命令返回 活动,则服务成功使用密码文件来解锁 NSS 数据库。

  2. 对需要密码的 NSS 数据库执行操作。例如,显示私钥:

    # certutil -K -d /var/lib/ipsec/nss/
    certutil: Checking token "NSS Certificate DB" in slot "NSS User Private Key and Certificate Services"
    Enter Password or Pin for "NSS Certificate DB":
    Copy to Clipboard Toggle word wrap

    验证命令是否提示输入密码。

7.8. 在启用了 FIPS 模式的系统中使用 IPsec

在联邦信息处理标准(FIPS)模式下的 RHEL 只使用经过验证的加密模块,自动禁用旧的协议和密码。启用 FIPS 模式通常是需要联邦合规性并增强系统安全性。

RHEL 提供的 Libreswan IPsec 实现完全兼容 FIPS。当系统处于 FIPS 模式时,Libreswan 在不需要额外配置的情况下自动使用经过认证的加密模块,无论 Libreswan 是否安装在新的启用了 FIPS 的系统上安装,或者在带有现有 Libreswan VPN 的系统上激活 FIPS 模式。

如果启用了 FIPS 模式,您可以确认 Libreswan 在 FIPS 模式下运行:

# ipsec whack --fipsstatus
000 FIPS mode enabled
Copy to Clipboard Toggle word wrap

要在 FIPS 模式中列出 Libreswan 中允许的算法和密码,请输入:

# ipsec pluto --selftest 2>&1
...
000 FIPS Encryption algorithms:
000   AES_CCM_16  {256,192,*128} IKEv1:  ESP  IKEv2:  ESP  FIPS   aes_ccm, aes_ccm_c
000   AES_CCM_12  {256,192,*128} IKEv1:  ESP  IKEv2:  ESP  FIPS   aes_ccm_b
000   AES_CCM_8   {256,192,*128} IKEv1:  ESP  IKEv2:  ESP  FIPS   aes_ccm_a
000 ...
Copy to Clipboard Toggle word wrap

7.9. 为 IPsec VPN 连接配置 TCP 回退

在阻止 UDP 和封装安全 Payload (ESP)协议的限制网络中,标准 IPsec VPN 可能会失败。为确保此类环境中的连接,Libreswan 可以在 TCP 连接内封装所有 VPN 流量。

重要

在 TCP 中封装 VPN 数据包可减少吞吐量并增加延迟。因此,只使用 TCP 封装作为回退选项,或者环境中统一阻止了基于 UDP 的连接。

先决条件

  • IPsec 连接已配置。

流程

  1. 编辑 /etc/ipsec.conf 文件,并在 config setup 部分中进行以下更改:

    1. 将 Libreswan 配置为侦听 TCP 端口:

      listen-tcp=yes
      Copy to Clipboard Toggle word wrap
    2. 默认情况下,Libreswan 侦听端口 4500。如果要使用不同的端口,请输入:

      tcp-remoteport=<port_number>
      Copy to Clipboard Toggle word wrap
    3. 如果 UDP 不可用或永久,则决定是否将 TCP 用作回退选项:

      • 作为回退选项,请输入:

        enable-tcp=fallback
        retransmit-timeout=5s
        Copy to Clipboard Toggle word wrap

        默认情况下,Libreswan 在尝试通过 TCP 重新连接前,会等待 60 秒。降低 retransmit-timeout 值会缩短延迟,从而使回退协议可以更快地启动。

      • 作为 UDP 的永久替换,请输入:

        enable-tcp=yes
        Copy to Clipboard Toggle word wrap
  2. 重启 ipsec 服务:

    # systemctl restart ipsec
    Copy to Clipboard Toggle word wrap
  3. 如果您配置了默认 4500 以外的 TCP 端口,请在防火墙中打开端口:

    # firewall-cmd --permanent --add-port=<tcp_port>/tcp
    # firewall-cmd --reload
    Copy to Clipboard Toggle word wrap
  4. 在使用此网关的对等点上重复这个过程。

7.10. 在 Libreswan 中启用旧的密码和算法

在 Libreswan 中启用旧的密码和算法,以向后兼容其他 IPsec 对等点。这会覆盖 RHEL 系统范围的加密策略,该策略默认为 IPsec 和互联网密钥交换(IKE)强制实施强大的加密密码和算法。

RHEL 系统范围的加密策略会创建一个名为 %default 的特殊连接。此连接设置 密钥exchangeespike 参数的默认值。

先决条件

  • Libreswan 已安装。

流程

  1. 要覆盖 RHEL 系统范围的加密策略设置的默认值,请在连接配置中添加 密钥exchangeespike 参数,并将它们设置为您需要的值。例如:

    conn <connection_name>
        ikev2=no
        ike=aes-sha2,aes-sha1;modp2048
        esp=aes-sha2,aes-sha1
        ...
    Copy to Clipboard Toggle word wrap
  2. 重启 ipsec 服务:

    # systemctl restart ipsec
    Copy to Clipboard Toggle word wrap

要防止 VPN 连接来自流量重定向攻击,请将其分配给专用路由表。这可防止恶意网络服务器绕过安全隧道并损害数据完整性。

DHCP 服务器和无状态地址自动配置(SLAAC)都可以将路由添加到客户端的路由表中。例如,恶意的 DHCP 服务器可以使用此功能强制带有 VPN 连接的主机通过物理接口而不是 VPN 隧道重定向流量。此漏洞也称为 TunnelVision,并在 CVE-2024-3661 漏洞文章中进行了描述。

要缓解此漏洞,您可以将 VPN 连接分配给一个专用的路由表。这可防止 DHCP 配置或 SLAAC 来处理用于 VPN 隧道的网络数据包的路由决策。

如果至少有一个条件适用您的环境,请按照以下步骤操作:

  • 至少有一个网络接口使用 DHCP 或 SLAAC。
  • 您的网络不使用阻止恶意 DHCP 服务器的机制,如 DHCP 侦听。
重要

通过 VPN 路由整个流量可防止主机访问本地网络资源。

先决条件

  • 您可以使用 NetworkManager 1.48.10-5 或更高版本。

流程

  1. 决定您要使用哪个路由表。以下步骤使用表 75。默认情况下,RHEL 不使用表 1-254,您可以使用其中任何一个。
  2. 配置 VPN 连接配置文件,来将 VPN 路由放在专用的路由表中:

    # nmcli connection modify <vpn_connection_profile> ipv4.route-table 75 ipv6.route-table 75
    Copy to Clipboard Toggle word wrap
  3. 为您在之前的命令中使用的表设置一个低优先级值:

    # nmcli connection modify <vpn_connection_profile> ipv4.routing-rules "priority 32345 from all table 75" ipv6.routing-rules "priority 32345 from all table 75"
    Copy to Clipboard Toggle word wrap

    优先级值可以是 1 到 32766 之间的任何值。值越低,优先级越高。

  4. 重新连接 VPN 连接:

    # nmcli connection down <vpn_connection_profile>
    # nmcli connection up <vpn_connection_profile>
    Copy to Clipboard Toggle word wrap

验证

  1. 显示表 75 中的 IPv4 路由:

    # ip route show table 75
    ...
    192.0.2.0/24 via 192.0.2.254 dev vpn_device proto static metric 50
    default dev vpn_device proto static scope link metric 50
    Copy to Clipboard Toggle word wrap

    输出确认到远程网络和默认网关的路由被分配到路由表 75,因此所有流量都是通过隧道路由的。如果您在 VPN 连接配置文件中设置了 ipv4.never-default true,则不会创建默认路由,因此在此输出中不可见。

  2. 显示表 75 中的 IPv6 路由:

    # ip -6 route show table 75
    ...
    2001:db8:1::/64 dev vpn_device proto kernel metric 50 pref medium
    default dev vpn_device proto static metric 50 pref medium
    Copy to Clipboard Toggle word wrap

    输出确认到远程网络和默认网关的路由被分配到路由表 75,因此所有流量都是通过隧道路由的。如果您在 VPN 连接配置文件中设置了 ipv6.never-default true,则不会创建默认路由,因此在此输出中不可见。

7.12. 使用 RHEL 系统角色配置 IPsec VPN 连接

配置 IPsec VPN 连接,以便在不受信任的网络上建立加密的隧道,并确保传输过程中数据的完整性。通过使用 RHEL 系统角色,您可以自动进行用例的设置,如将分支机构连接到 headquarters。

注意

vpn RHEL 系统角色只能创建使用预共享密钥(PSK)或证书的 VPN 配置来相互验证对等点。

主机到主机的 VPN 在两个设备之间建立一个加密连接,允许应用程序通过不安全的网络安全通信。通过使用 vpn RHEL 系统角色,您可以自动创建 IPsec 主机到主机连接的过程。

为了进行身份验证,预共享密钥(PSK)是使用只给两个对等点已知的单一共享 secret 的直接方法。这种方法易于配置,非常适合易于部署是优先级的基本设置。但是,您必须严格保密密钥。可以访问该密钥的攻击者可能会破坏连接。

先决条件

流程

  1. 创建一个包含以下内容的 playbook 文件,如 ~/playbook.yml

    ---
    - name: Configuring VPN
      hosts: managed-node-01.example.com, managed-node-02.example.com
      tasks:
        - name: IPsec VPN with PSK authentication
          ansible.builtin.include_role:
            name: redhat.rhel_system_roles.vpn
          vars:
            vpn_connections:
              - hosts:
                  managed-node-01.example.com:
                  managed-node-02.example.com:
                auth_method: psk
                auto: start
            vpn_manage_firewall: true
            vpn_manage_selinux: true
    Copy to Clipboard Toggle word wrap

    示例 playbook 中指定的设置包括如下:

    hosts: &lt ;list>

    使用您要配置 VPN 的对等点定义 YAML 字典。如果条目不是一个 Ansible 管理的节点,则您必须在 hostname 参数中指定其完全限定域名(FQDN)或 IP 地址,例如:

              ...
              - hosts:
                  ...
                  external-host.example.com:
                    hostname: 192.0.2.1
    Copy to Clipboard Toggle word wrap

    角色在每个受管节点上配置 VPN 连接。连接名为 < peer_A&gt;-to-<peer_B >,例如 managed-node-01.example.com-to-managed-node-02.example.com。请注意,该角色无法在外部(未管理)节点上配置 Libreswan。您必须在这些对等点上手动创建配置。

    auth_method: psk
    启用对等点之间的 PSK 身份验证。角色在控制节点上使用 openssl 来创建 PSK。
    auto: <startup_method>
    指定连接的启动方法。有效值是 addondemandstartignore。详情请查看安装了 Libreswan 的系统上的 ipsec.conf (5) 手册页。此变量的默认值为 null,这意味着没有自动启动操作。
    vpn_manage_firewall: true
    定义角色在受管节点上的 firewalld 服务中打开所需的端口。
    vpn_manage_selinux: true
    定义角色在 IPsec 端口上设置所需的 SELinux 端口类型。

    有关 playbook 中使用的所有变量的详情,请查看控制节点上的 /usr/share/ansible/roles/rhel-system-roles.vpn/README.md 文件。

  2. 验证 playbook 语法:

    $ ansible-playbook --syntax-check ~/playbook.yml
    Copy to Clipboard Toggle word wrap

    请注意,这个命令只验证语法,不能防止错误的、但有效的配置。

  3. 运行 playbook:

    $ ansible-playbook ~/playbook.yml
    Copy to Clipboard Toggle word wrap

验证

  • 确认连接已成功启动,例如:

    # ansible managed-node-01.example.com -m shell -a 'ipsec trafficstatus | grep "managed-node-01.example.com-to-managed-node-02.example.com"'
    ...
    006 #3: "managed-node-01.example.com-to-managed-node-02.example.com", type=ESP, add_time=1741857153, inBytes=38622, outBytes=324626, maxBytes=2^63B, id='@managed-node-02.example.com'
    Copy to Clipboard Toggle word wrap

    请注意,只有在 VPN 连接活跃时,这个命令才会成功。如果将 playbook 中的 auto 变量设置为 start 以外的值,您可能需要首先手动激活受管节点上的连接。

使用 vpn RHEL 系统角色自动创建 IPsec 主机到主机的 VPN 过程。要通过最大程度减少被截获或破坏的控制消息的风险来提高安全性,请为数据流量和控制流量配置单独的连接。

主机到主机 VPN 在两个设备之间建立直接、安全和加密的连接,允许应用程序通过不安全的网络(如互联网)安全地进行通信。

为了进行身份验证,预共享密钥(PSK)是使用只给两个对等点已知的单一共享 secret 的直接方法。这种方法易于配置,非常适合易于部署是优先级的基本设置。但是,您必须严格保密密钥。可以访问该密钥的攻击者可能会破坏连接。

先决条件

流程

  1. 创建一个包含以下内容的 playbook 文件,如 ~/playbook.yml

    ---
    - name: Configuring VPN
      hosts: managed-node-01.example.com, managed-node-02.example.com
      tasks:
        - name: IPsec VPN with PSK authentication
          ansible.builtin.include_role:
            name: redhat.rhel_system_roles.vpn
          vars:
            vpn_connections:
              - name: control_plane_vpn
                hosts:
                  managed-node-01.example.com:
                    hostname: 203.0.113.1  # IP address for the control plane
                  managed-node-02.example.com:
                    hostname: 198.51.100.2 # IP address for the control plane
                auth_method: psk
                auto: start
              - name: data_plane_vpn
                hosts:
                  managed-node-01.example.com:
                    hostname: 10.0.0.1   # IP address for the data plane
                  managed-node-02.example.com:
                    hostname: 172.16.0.2 # IP address for the data plane
                auth_method: psk
                auto: start
            vpn_manage_firewall: true
            vpn_manage_selinux: true
    Copy to Clipboard Toggle word wrap

    示例 playbook 中指定的设置包括如下:

    hosts: &lt ;list>

    定义一个 YAML 字典,其中包含您想要在它们之间配置 VPN 的主机。连接被命名为 <name>-<IP_address_A>-to-<IP_address_B>,例如 control_plane_vpn-203.0.113.1-to-198.51.100.2

    角色在每个受管节点上配置 VPN 连接。请注意,该角色无法在外部(未管理)节点上配置 Libreswan。您必须在这些主机上手动创建配置。

    auth_method: psk
    在主机之间启用 PSK 身份验证。角色在控制节点上使用 openssl 来创建预共享密钥。
    auto: <startup_method>
    指定连接的启动方法。有效值是 addondemandstartignore。详情请查看安装了 Libreswan 的系统上的 ipsec.conf (5) 手册页。此变量的默认值为 null,这意味着没有自动启动操作。
    vpn_manage_firewall: true
    定义角色在受管节点上的 firewalld 服务中打开所需的端口。
    vpn_manage_selinux: true
    定义角色在 IPsec 端口上设置所需的 SELinux 端口类型。

    有关 playbook 中使用的所有变量的详情,请查看控制节点上的 /usr/share/ansible/roles/rhel-system-roles.vpn/README.md 文件。

  2. 验证 playbook 语法:

    $ ansible-playbook --syntax-check ~/playbook.yml
    Copy to Clipboard Toggle word wrap

    请注意,这个命令只验证语法,不能防止错误的、但有效的配置。

  3. 运行 playbook:

    $ ansible-playbook ~/playbook.yml
    Copy to Clipboard Toggle word wrap

验证

  • 确认连接已成功启动,例如:

    # ansible managed-node-01.example.com -m shell -a 'ipsec trafficstatus | grep "control_plane_vpn-203.0.113.1-to-198.51.100.2"'
    ...
    006 #3: "control_plane_vpn-203.0.113.1-to-198.51.100.2", type=ESP, add_time=1741860073, inBytes=0, outBytes=0, maxBytes=2^63B, id='198.51.100.2'
    Copy to Clipboard Toggle word wrap

    请注意,只有在 VPN 连接活跃时,这个命令才会成功。如果将 playbook 中的 auto 变量设置为 start 以外的值,您可能需要首先手动激活受管节点上的连接。

站点到站点的 VPN 在两个不同的网络之间建立了一个加密的隧道,在不安全的公共网络中无缝链接它们。通过使用 vpn RHEL 系统角色,您可以自动创建 IPsec 站点到站点 VPN 连接的过程。

站点到站点 VPN 允许分支机构中的设备访问公司总部的资源,就如同它们都是同一本地网络的一部分一样。

为了进行身份验证,预共享密钥(PSK)是使用只给两个对等点已知的单一共享 secret 的直接方法。这种方法易于配置,非常适合易于部署是优先级的基本设置。但是,您必须严格保密密钥。可以访问该密钥的攻击者可能会破坏连接。

先决条件

流程

  1. 创建一个包含以下内容的 playbook 文件,如 ~/playbook.yml

    ---
    - name: Configuring VPN
      hosts: managed-node-01.example.com, managed-node-02.example.com
      tasks:
        - name: IPsec VPN with PSK authentication
          ansible.builtin.include_role:
            name: redhat.rhel_system_roles.vpn
          vars:
            vpn_connections:
              - hosts:
                  managed-node-01.example.com:
                    subnets:
                      - 192.0.2.0/24
                  managed-node-02.example.com:
                    subnets:
                      - 198.51.100.0/24
                      - 203.0.113.0/24
                auth_method: psk
                auto: start
            vpn_manage_firewall: true
            vpn_manage_selinux: true
    Copy to Clipboard Toggle word wrap

    示例 playbook 中指定的设置包括如下:

    hosts: &lt ;list>

    使用您要配置 VPN 的网关定义 YAML 字典。如果条目不是 Ansible 管理的节点,您必须在 hostname 参数中指定其完全限定域名(FQDN)或 IP 地址,例如:

              ...
              - hosts:
                  ...
                  external-host.example.com:
                    hostname: 192.0.2.1
    Copy to Clipboard Toggle word wrap

    角色在每个受管节点上配置 VPN 连接。连接名为 -to-,例如 managed-node-01.example.com-to-managed-node-02.example.com。请注意,该角色无法在外部(未管理)节点上配置 Libreswan。您必须在这些对等点上手动创建配置。

    subnets: <yaml_list_of_subnets>
    定义通过隧道连接的无类别域间路由(CIDR)格式的子网。
    auth_method: psk
    启用对等点之间的 PSK 身份验证。角色在控制节点上使用 openssl 来创建 PSK。
    auto: <startup_method>
    指定连接的启动方法。有效值是 addondemandstartignore。详情请查看安装了 Libreswan 的系统上的 ipsec.conf (5) 手册页。此变量的默认值为 null,这意味着没有自动启动操作。
    vpn_manage_firewall: true
    定义角色在受管节点上的 firewalld 服务中打开所需的端口。
    vpn_manage_selinux: true
    定义角色在 IPsec 端口上设置所需的 SELinux 端口类型。

    有关 playbook 中使用的所有变量的详情,请查看控制节点上的 /usr/share/ansible/roles/rhel-system-roles.vpn/README.md 文件。

  2. 验证 playbook 语法:

    $ ansible-playbook --syntax-check ~/playbook.yml
    Copy to Clipboard Toggle word wrap

    请注意,这个命令只验证语法,不能防止错误的、但有效的配置。

  3. 运行 playbook:

    $ ansible-playbook ~/playbook.yml
    Copy to Clipboard Toggle word wrap

验证

  • 确认连接已成功启动,例如:

    # ansible managed-node-01.example.com -m shell -a 'ipsec trafficstatus | grep "managed-node-01.example.com-to-managed-node-02.example.com"'
    ...
    006 #3: "managed-node-01.example.com-to-managed-node-02.example.com", type=ESP, add_time=1741857153, inBytes=38622, outBytes=324626, maxBytes=2^63B, id='@managed-node-02.example.com'
    Copy to Clipboard Toggle word wrap

    请注意,只有在 VPN 连接活跃时,这个命令才会成功。如果将 playbook 中的 auto 变量设置为 start 以外的值,您可能需要首先手动激活受管节点上的连接。

IPsec 网格会创建一个完全互连的网络,每个服务器都可以与所有其他服务器安全通信。通过使用 vpn RHEL 系统角色,您可以在受管节点之间自动化配置带有基于证书的身份验证的 VPN 网格。

IPsec 网格适用于跨多个数据中心或云供应商的分布式数据库集群或高可用性环境。在每对服务器之间建立直接的加密隧道可确保安全通信,而无需中央瓶颈。

为进行身份验证,使用由证书颁发机构(CA)管理的数字证书,可提供高度安全、可扩展的解决方案。网格中的每个主机都提供由可信 CA 签名的证书。这个方法提供强大的、可靠的身份验证,并简化了用户管理。可以在 CA 中集中授予或撤销访问权限,Libreswan 通过针对证书撤销列表(CRL)检查每个证书来强制实施这个访问权限,如果证书出现在列表中,则拒绝访问。

先决条件

  • 您已准备好控制节点和受管节点
  • 您以可在受管主机上运行 playbook 的用户身份登录到控制节点。
  • 您用于连接到受管节点的帐户对它们具有 sudo 权限。
  • 您可以为每个受管节点准备一个 PKCS #12 文件:

    • 每个文件包含:

      • 服务器的私钥
      • 服务器证书
      • CA 证书
      • 如果需要,则中间证书
    • 文件被命名为 <managed_node_name_as_in_the_inventory>.p12
    • 文件存储在与 playbook 相同的目录中。
    • 服务器证书包含以下字段:

      • 扩展的密钥使用(EKU)设置为 TLS Web 服务器身份验证
      • 通用名称(CN)或主题备用名称(SAN)被设置为主机的完全限定域名(FQDN)。
      • X509v3 CRL 发行版点包含证书撤销列表(CRL)的 URL。

流程

  1. 编辑 ~/inventory 文件,并附加 cert_name 变量:

    managed-node-01.example.com cert_name=managed-node-01.example.com
    managed-node-02.example.com cert_name=managed-node-02.example.com
    managed-node-03.example.com cert_name=managed-node-03.example.com
    Copy to Clipboard Toggle word wrap

    cert_name 变量设置为每个主机的证书中使用的通用名称(CN)字段的值。通常,CN 字段被设置为完全限定域名(FQDN)。

  2. 将敏感变量存储在加密的文件中:

    1. 创建 vault :

      $ ansible-vault create ~/vault.yml
      New Vault password: <vault_password>
      Confirm New Vault password: <vault_password>
      Copy to Clipboard Toggle word wrap
    2. ansible-vault create 命令打开编辑器后,以 <key>: <value> 格式输入敏感数据:

      pkcs12_pwd: <password>
      Copy to Clipboard Toggle word wrap
    3. 保存更改,并关闭编辑器。Ansible 加密 vault 中的数据。
  3. 创建一个包含以下内容的 playbook 文件,如 ~/playbook.yml

    - name: Configuring VPN
      hosts: managed-node-01.example.com, managed-node-02.example.com, managed-node-03.example.com
      vars_files:
        - ~/vault.yml
      tasks:
        - name: Install LibreSwan
          ansible.builtin.package:
            name: libreswan
            state: present
    
        - name: Identify the path to IPsec NSS database
          ansible.builtin.set_fact:
            nss_db_dir: "{{ '/etc/ipsec.d/' if
              ansible_distribution in ['CentOS', 'RedHat']
              and ansible_distribution_major_version is version('8', '=')
              else '/var/lib/ipsec/nss/' }}"
    
        - name: Locate IPsec NSS database files
          ansible.builtin.find:
            paths: "{{ nss_db_dir }}"
            patterns: "*.db"
          register: db_files
    
        - name: Initialize IPsec NSS database if not initialized
          ansible.builtin.command:
            cmd: ipsec initnss
          when: db_files.matched == 0
    
        - name: Copy PKCS #12 file to the managed node
          ansible.builtin.copy:
            src: "~/{{ inventory_hostname }}.p12"
            dest: "/etc/ipsec.d/{{ inventory_hostname }}.p12"
            mode: 0600
    
        - name: Import PKCS #12 file in IPsec NSS database
          ansible.builtin.shell:
            cmd: 'pk12util -d {{ nss_db_dir }} -i /etc/ipsec.d/{{ inventory_hostname }}.p12 -W "{{ pkcs12_pwd }}"'
    
        - name: Remove PKCS #12 file
          ansible.builtin.file:
            path: "/etc/ipsec.d/{{ inventory_hostname }}.p12"
            state: absent
    
        - name: Opportunistic mesh IPsec VPN with certificate-based authentication
          ansible.builtin.include_role:
            name: redhat.rhel_system_roles.vpn
          vars:
            vpn_connections:
              - opportunistic: true
                auth_method: cert
                policies:
                  - policy: private
                    cidr: default
                  - policy: private
                    cidr: 192.0.2.0/24
                  - policy: clear
                    cidr: 192.0.2.1/32
            vpn_manage_firewall: true
            vpn_manage_selinux: true
    Copy to Clipboard Toggle word wrap

    示例 playbook 中指定的设置包括如下:

    opportunistic: true
    在多个主机之间启用机会网格。policies 变量定义必须或可以加密哪些子网和主机流量,并且哪些应该继续使用纯文本连接。
    auth_method: cert
    启用基于证书的身份验证。这要求您在清单中指定每个受管节点证书的 nickname。
    policies: <list_of_policies>

    以 YAML 列表格式定义 Libreswan 策略。

    默认策略是 private-or-clear。要将它改为 private,上面的 playbook 包含默认 cidr 条目的一个相应策略。

    如果 Ansible 控制节点与受管节点在同一个 IP 子网中,要防止执行 playbook 期间丢失 SSH 连接,请为控制节点的 IP 地址添加一个 clear 策略。例如,如果应该为 192.0.2.0/24 子网配置网格,并且控制节点使用 IP 地址 192.0.2.1,则您需要一个用于192.0.2.1/32clear 策略,如 playbook 中所示。

    有关策略的详情,请查看安装了 Libreswan 的系统上的 ipsec.conf (5) 手册页。

    vpn_manage_firewall: true
    定义角色在受管节点上的 firewalld 服务中打开所需的端口。
    vpn_manage_selinux: true
    定义角色在 IPsec 端口上设置所需的 SELinux 端口类型。

    有关 playbook 中使用的所有变量的详情,请查看控制节点上的 /usr/share/ansible/roles/rhel-system-roles.vpn/README.md 文件。

  4. 验证 playbook 语法:

    $ ansible-playbook --ask-vault-pass --syntax-check ~/playbook.yml
    Copy to Clipboard Toggle word wrap

    请注意,这个命令只验证语法,不能防止错误的、但有效的配置。

  5. 运行 playbook:

    $ ansible-playbook --ask-vault-pass ~/playbook.yml
    Copy to Clipboard Toggle word wrap

验证

  1. 在网格的一个节点上,ping 另一个节点来激活连接:

    [root@managed-node-01]# ping managed-node-02.example.com
    Copy to Clipboard Toggle word wrap
  2. 确认连接处于活跃状态:

    [root@managed-node-01]# ipsec trafficstatus
    006 #2: "private#192.0.2.0/24"[1] ...192.0.2.2, type=ESP, add_time=1741938929, inBytes=372408, outBytes=545728, maxBytes=2^63B, id='CN=managed-node-02.example.com'
    Copy to Clipboard Toggle word wrap

7.13. 使用 nmstatectl 配置基于 IPsec 的 VPN 连接

配置 IPsec VPN 连接,以便在不受信任的网络上建立加密的隧道,并确保传输过程中数据的完整性。通过使用 Nmstate,您可以使用声明性 API 创建 IPsec VPN 连接。

您可以使用 nmstatectl 工具通过 Nmstate API 配置 Libreswan IPsec VPN 连接。nmstatectl 工具是一个命令行工具,用于通过声明性 Nmstate API 管理主机网络。您不必运行多个必需命令来配置接口,而是在 YAML 文件中定义预期状态。然后,nmstate 会采用此定义并将其应用到系统。这种方法的关键优点是原子结果。nmstate 可确保生成的配置精确与您的 YAML 定义匹配。如果配置的任何部分无法应用,它会自动回滚所有更改,并防止系统进入不正确或损坏的网络状态。

注意

由于 NetworkManager-libreswan 插件的设计,您只能在一个对等点中使用 nmstatectl,必须在另一个对等点上手动配置 Libreswan。

您可以使用声明 Nmstate API 在两个设备之间配置主机到主机的 VPN,以通过不安全的网络安全地进行通信。nmstate 可确保结果与配置文件匹配或回滚更改。

为进行身份验证,RSA 密钥比预共享密钥(PSK)更安全,因为其非对称加密消除了共享 secret 的风险。使用 RSA 密钥还通过避免对证书颁发机构(CA)的需求来简化部署,同时仍然提供强大的对等身份验证。

注意

通常,选择将主机命名为 left右边 是任意的。但是,NetworkManager 始终使用 左侧 为本地主机的术语,并为远程主机使用 右边

先决条件

  • 远程 peer 运行 Libreswan IPsec,并为 主机到主机 连接准备。

    由于 NetworkManager-libreswan 插件的设计,Nmstate 无法与其他使用此插件进行同一连接的对等点通信。

流程

  1. 如果 Libreswan 尚未安装,请执行以下步骤:

    1. 安装所需的软件包:

      # dnf install nmstate libreswan NetworkManager-libreswan
      Copy to Clipboard Toggle word wrap
    2. 重启 NetworkManager 服务:

      # systemctl restart NetworkManager
      Copy to Clipboard Toggle word wrap
    3. 初始化网络安全服务(NSS)数据库:

      # ipsec initnss
      Copy to Clipboard Toggle word wrap

      该命令在 /var/lib/ipsec/nss/ 目录中创建数据库。

    4. 在防火墙中打开 IPsec 端口和协议:

      # firewall-cmd --permanent --add-service="ipsec"
      # firewall-cmd --reload
      Copy to Clipboard Toggle word wrap
  2. 创建 RSA 密钥对:

    # ipsec newhostkey
    Copy to Clipboard Toggle word wrap

    ipsec 实用程序将密钥对存储在 NSS 数据库中。

  3. 在左侧和右侧对等点上显示证书密钥属性 ID (CKAID):

    # ipsec showhostkey --list
    < 1> RSA keyid: <key_id> ckaid: <ckaid>
    Copy to Clipboard Toggle word wrap

    下一步需要两个对等点的 CKAID。

  4. 显示公钥:

    1. 在左侧 peer 中,输入:

      # ipsec showhostkey --left --ckaid <ckaid_of_left_peer>
              # rsakey AwEAAdKCx
              leftrsasigkey=0sAwEAAdKCxpc9db48cehzQiQD...
      Copy to Clipboard Toggle word wrap
    2. 在右 peer 中,输入:

      # ipsec showhostkey --right --ckaid <ckaid_of_right_peer>
              # rsakey AwEAAcNWC
              rightrsasigkey=0sAwEAAcNWCzZO+PR1j8WbO8X...
      Copy to Clipboard Toggle word wrap

    命令会显示公钥,以及必须在配置文件中使用的对应参数。

  5. 创建包含以下内容的 YAML 文件,如 ~/ipsec-host-to-host-rsa-auth.yml

    ---
    interfaces:
    - name: '<connection_name>'
      type: ipsec
      libreswan:
        ikev2: insist
    
        left: <ip_address_or_fqdn_of_left_peer>
        leftid: peer_b
        leftrsasigkey: <public_key_of_left_peer>
        leftmodecfgclient: false
    
        right: <ip_address_or_fqdn_of_right_peer>
        rightid: peer_a
        rightrsasigkey: <public_key_of_right_peer>
        rightsubnet: <ip_address_of_right_peer>/32
    Copy to Clipboard Toggle word wrap

    示例中指定的设置包括:

    ikev2: insist
    将现代 IKEv2 协议定义为唯一允许的协议,而不回退到 IKEv1。在带有 Nmstate 的主机配置中,此设置是必须的。
    left= &lt;ip_address_or_fqdn_of_left_peer>right= &lt;ip_address_or_fqdn_of_right_peer>
    定义对等点的 IP 地址或 DNS 名称。
    leftid= &lt;id>rightid= &lt;id>
    定义如何在互联网密钥交换(IKE)协商过程中识别每个对等点。这可以是 IP 地址或字面字符串。请注意,NetworkManager 将 IP 地址以外的所有值解释为字面字符串,并在内部添加前导 @ 符号。这要求 Libreswan peer 还使用字面字符串作为 ID 或身份验证失败。
    leftrsasigkey=<public_key> and rightrsasigkey=<public_key>
    指定对等点的公钥。使用上一步中 ipsec showhostkey 命令显示的值。
    leftmodecfgclient: false
    禁用此主机上的动态配置。在带有 Nmstate 的主机配置中,此设置是必须的。
    rightsubnet: <ip_address_of_right_peer>/32
    定义主机只能访问这个对等点。在带有 Nmstate 的主机配置中,此设置是必须的。
  6. 将设置应用到系统:

    # nmstatectl apply ~/ipsec-host-to-host-rsa-auth.yml
    Copy to Clipboard Toggle word wrap

验证

  • 显示 IPsec 状态:

    # ipsec status
    Copy to Clipboard Toggle word wrap

    如果成功建立连接,输出包含如下行:

    • 互联网密钥交换版本 2 (IKEv2)协商的阶段 1 成功完成:

      000 #1: "<connection_name>":500 STATE_V2_ESTABLISHED_IKE_SA (established IKE SA); REKEY in 27935s; REPLACE in 28610s; newest; idle;
      Copy to Clipboard Toggle word wrap

      安全关联(SA)现在可以协商实际数据加密隧道,称为子 SA 或阶段 2 SA。

    • 已建立了子 SA:

      000 #2: "<connection_name>":500 STATE_V2_ESTABLISHED_CHILD_SA (established Child SA); REKEY in 27671s; REPLACE in 28610s; IKE SA #1; idle;
      Copy to Clipboard Toggle word wrap

      这是您的数据流量通过的实际隧道。

故障排除

  • 要显示 NetworkManager 传递给 Libreswan 的实际配置,请输入:

    # nmcli connection export <connection_name>
    Copy to Clipboard Toggle word wrap

    当您将设置与远程主机上的 Libreswan 配置进行比较时,输出可帮助识别设置(如 ID 和密钥)。

后续步骤

您可以使用声明 Nmstate API 在两个不同的网络之间配置站点到站点 VPN,在不安全的网络中无缝链接它们。nmstate 可确保结果与配置文件匹配或回滚更改。

为对网关设备进行身份验证,RSA 密钥比预共享密钥(PSK)更安全,因为其非对称加密消除了共享 secret 的风险。使用 RSA 密钥还通过避免对证书颁发机构(CA)的需求来简化部署,同时仍然提供强大的对等身份验证。

注意

通常,选择将哪些主机命名为 left右边 是任意的。但是,NetworkManager 始终使用 左侧 为本地主机的术语,并为远程主机使用 右边

先决条件

  • 远程网关运行 Libreswan IPsec,并为 站点到站点 连接准备。

    由于 NetworkManager-libreswan 插件的设计,Nmstate 无法与其他使用此插件进行同一连接的对等点通信。

流程

  1. 如果 Libreswan 尚未安装,请执行以下步骤:

    1. 安装所需的软件包:

      # dnf install nmstate libreswan NetworkManager-libreswan
      Copy to Clipboard Toggle word wrap
    2. 重启 NetworkManager 服务:

      # systemctl restart NetworkManager
      Copy to Clipboard Toggle word wrap
    3. 初始化网络安全服务(NSS)数据库:

      # ipsec initnss
      Copy to Clipboard Toggle word wrap

      该命令在 /var/lib/ipsec/nss/ 目录中创建数据库。

    4. 在防火墙中打开 IPsec 端口和协议:

      # firewall-cmd --permanent --add-service="ipsec"
      # firewall-cmd --reload
      Copy to Clipboard Toggle word wrap
  2. 创建 RSA 密钥对:

    # ipsec newhostkey
    Copy to Clipboard Toggle word wrap

    ipsec 实用程序将密钥对存储在 NSS 数据库中。

  3. 在左侧和右侧显示证书密钥属性 ID (CKAID):

    # ipsec showhostkey --list
    < 1> RSA keyid: <key_id> ckaid: <ckaid>
    Copy to Clipboard Toggle word wrap

    在以下步骤中,您需要两个对等点的 CKAID。

  4. 显示公钥:

    1. 在左侧 peer 中,输入:

      # ipsec showhostkey --left --ckaid <ckaid_of_left_peer>
              # rsakey AwEAAdKCx
              leftrsasigkey=0sAwEAAdKCxpc9db48cehzQiQD...
      Copy to Clipboard Toggle word wrap
    2. 在右 peer 中,输入:

      # ipsec showhostkey --right --ckaid <ckaid_of_right_peer>
              # rsakey AwEAAcNWC
              rightrsasigkey=0sAwEAAcNWCzZO+PR1j8WbO8X...
      Copy to Clipboard Toggle word wrap

    命令会显示公钥,以及必须在配置文件中使用的对应参数。

  5. 创建包含以下内容的 YAML 文件,如 ~/ipsec-site-to-site-rsa-auth.yml

    ---
    interfaces:
    - name: '<connection_name>'
      type: ipsec
      libreswan:
        ikev2: insist
    
        left: <ip_address_or_fqdn_of_left_peer>
        leftid: peer_b
        leftrsasigkey: <public_key_of_left_peer>
        leftmodecfgclient: false
        leftsubnet: 198.51.100.0/24
    
        right: <ip_address_or_fqdn_of_right_peer>
        rightid: peer_a
        rightrsasigkey: <public_key_of_right_peer>
        rightsubnet: 192.0.2.0/24
    Copy to Clipboard Toggle word wrap

    示例中指定的设置包括:

    ikev2: insist
    将现代 IKEv2 协议定义为唯一允许的协议,而不回退到 IKEv1。在带有 Nmstate 的站点到站点配置中,此设置是必须的。
    left= &lt;ip_address_or_fqdn_of_left_peer>right= &lt;ip_address_or_fqdn_of_right_peer>
    定义对等点的 IP 地址或 DNS 名称。
    leftid= &lt;id>rightid= &lt;id>
    定义如何在互联网密钥交换(IKE)协商过程中识别每个对等点。这可以是 IP 地址或字面字符串。请注意,NetworkManager 将 IP 地址以外的所有值解释为字面字符串,并在内部添加前导 @ 符号。这要求 Libreswan peer 还使用字面字符串作为 ID 或身份验证失败。
    leftrsasigkey=<public_key> and rightrsasigkey=<public_key>
    指定对等点的公钥。使用上一步中 ipsec showhostkey 命令显示的值。
    leftmodecfgclient: false
    禁用此主机上的动态配置。在带有 Nmstate 的站点到站点配置中,此设置是必须的。
    leftsubnet= &lt;subnet>rightsubnet= &lt;subnet>
    定义通过隧道连接的无类别域间路由(CIDR)格式的子网。
  6. 启用数据包转发:

    # echo "net.ipv4.ip_forward=1" > /etc/sysctl.d/95-IPv4-forwarding.conf
    # sysctl -p /etc/sysctl.d/95-IPv4-forwarding.conf
    Copy to Clipboard Toggle word wrap
  7. 将设置应用到系统:

    # nmstatectl apply ~/ipsec-site-to-site-rsa-auth.yml
    Copy to Clipboard Toggle word wrap

验证

  1. 显示 IPsec 状态:

    # ipsec status
    Copy to Clipboard Toggle word wrap

    如果成功建立连接,输出包含如下行:

    • 互联网密钥交换版本 2 (IKEv2)协商的阶段 1 成功完成:

      000 #1: "<connection_name>":500 STATE_V2_ESTABLISHED_IKE_SA (established IKE SA); REKEY in 27935s; REPLACE in 28610s; newest; idle;
      Copy to Clipboard Toggle word wrap

      安全关联(SA)现在可以协商实际数据加密隧道,称为子 SA 或阶段 2 SA。

    • 已建立了子 SA:

      000 #2: "<connection_name>":500 STATE_V2_ESTABLISHED_CHILD_SA (established Child SA); REKEY in 27671s; REPLACE in 28610s; IKE SA #1; idle;
      Copy to Clipboard Toggle word wrap

      这是您的数据流量通过的实际隧道。

  2. 从本地子网中的客户端 ping 远程子网中的客户端。

故障排除

  • 要显示 NetworkManager 传递给 Libreswan 的实际配置,请输入:

    # nmcli connection export <connection_name>
    Copy to Clipboard Toggle word wrap

    当您将设置与远程主机上的 Libreswan 配置进行比较时,输出可帮助识别设置(如 ID 和密钥)。

后续步骤

要访问远程私有网络上的资源,用户必须首先配置 IPsec VPN 连接。通过使用 Nmstate,您可以使用声明性 API 与现有 Libreswan IPsec 网关创建连接。

注意

通常,选择将主机命名为 left右边 是任意的。但是,NetworkManager 始终使用 左侧 为本地主机的术语,并为远程主机使用 右边

先决条件

  • 远程网关运行 Libreswan IPsec,并为带有 基于证书的身份验证的主机到站点 连接做好准备。

    由于 NetworkManager-libreswan 插件的设计,Nmstate 无法与其他使用此插件进行同一连接的对等点通信。

  • PKCSburst 文件 ~/file.p12 存在于客户端上,其中包含以下内容:

    • 用户的私钥
    • 用户证书
    • CA 证书
    • 如果需要,则中间证书

    有关创建私钥和证书签名请求(CSR),以及从 CA 请求证书的详情,请查看您的 CA 文档。

  • 证书中的扩展密钥用法(EKU)被设置为 TLS Web 客户端身份验证

流程

  1. 如果 Libreswan 尚未安装:

    1. 安装所需的软件包:

      # dnf install nmstate libreswan NetworkManager-libreswan
      Copy to Clipboard Toggle word wrap
    2. 重启 NetworkManager 服务:

      # systemctl restart NetworkManager
      Copy to Clipboard Toggle word wrap
    3. 初始化网络安全服务(NSS)数据库:

      # ipsec initnss
      Copy to Clipboard Toggle word wrap

      该命令在 /var/lib/ipsec/nss/ 目录中创建数据库。

    4. 在防火墙中打开 IPsec 端口和协议:

      # firewall-cmd --permanent --add-service="ipsec"
      # firewall-cmd --reload
      Copy to Clipboard Toggle word wrap
  2. 将 PKCSautomationhub 文件导入到 NSS 数据库中:

    # ipsec import ~/file.p12
    Enter password for PKCS12 file: <password>
    pk12util: PKCS12 IMPORT SUCCESSFUL
    correcting trust bits for Example-CA
    Copy to Clipboard Toggle word wrap
  3. 显示用户和 CA 证书的别名:

    # certutil -L -d /var/lib/ipsec/nss/
    Certificate Nickname     Trust Attributes
                             SSL,S/MIME,JAR/XPI
    
    user                     u,u,u
    Example-CA               CT,,
    ...
    Copy to Clipboard Toggle word wrap

    在 Nmstate YAML 文件中需要此信息。

  4. 创建包含以下内容的 YAML 文件,如 ~/ipsec-host-to-site-cert-auth.yml

    ---
    interfaces:
    - name: '<connection_name>'
      type: ipsec
      libreswan:
        ikev2: insist
    
        left: <ip_address_or_fqdn_of_left_peer>
        leftid: '%fromcert'
        leftcert: <user_certificate_nickname>
    
        right: <ip_address_or_fqdn_of_right_peer>
        rightid: '%fromcert'
        rightsubnet: 192.0.2.0/24
    Copy to Clipboard Toggle word wrap

    示例中指定的设置包括:

    ikev2: insist
    将现代 IKEv2 协议定义为唯一允许的协议,而不回退到 IKEv1。在带有 Nmstate 的主机到站点配置中,此设置是必须的。
    left= &lt;ip_address_or_fqdn_of_left_peer>right= &lt;ip_address_or_fqdn_of_right_peer>
    定义对等点的 IP 地址或 DNS 名称。
    leftid=%fromcertrightid=%fromcert
    将 Libreswan 配置为从证书的可分辨名称(DN)字段检索身份。
    leftcert="<server_certificate_nickname>"
    设置 NSS 数据库中使用的服务器证书的别名。
    rightsubnet: &lt ;subnet>
    以无类别域间路由(CIDR)格式定义连接到网关的子网。
  5. 将设置应用到系统:

    # nmstatectl apply ~/ipsec-host-to-site-cert-auth.yml
    Copy to Clipboard Toggle word wrap

验证

  • 建立与远程网络中主机的连接或 ping 它。

故障排除

  • 要显示 NetworkManager 传递给 Libreswan 的实际配置,请输入:

    # nmcli connection export <connection_name>
    Copy to Clipboard Toggle word wrap

    当您将设置与远程主机上的 Libreswan 配置进行比较时,输出可帮助识别设置(如 ID 和密钥)。

后续步骤

7.14. IPsec 配置故障排除

诊断 IPsec 配置失败可能具有挑战性,因为问题可能是由不匹配的设置、防火墙规则和内核级错误造成的。以下信息提供了解决 IPsec VPN 连接常见问题的系统方法。

7.14.1. 基本连接问题

VPN 连接的问题通常是因为端点之间不匹配的配置而发生。

要确认已建立 IPsec 连接,请输入:

# ipsec trafficstatus
006 #8: "vpn.example.com"[1] 192.0.2.1, type=ESP, add_time=1595296930, inBytes=5999, outBytes=3231, id='@vpn.example.com', lease=198.51.100.1/32
Copy to Clipboard Toggle word wrap

对于成功连接,命令会显示带有连接名称和详情的条目。如果输出为空,则不会建立隧道。

7.14.3. 不匹配的配置

如果端点没有配置匹配的互联网密钥交换(IKE)版本、算法、IP 地址范围或预共享密钥(PSK),则 VPN 连接会失败。如果识别不匹配,您必须匹配两个端点上的设置来解决这个问题。

远程 Peer Not Running IKE/IPsec

如果连接被拒绝,则会显示 ICMP 错误:

# ipsec auto --up vpn.example.com
...
000 "vpn.example.com"[1] 192.0.2.2 #16: ERROR: asynchronous network error report on wlp2s0 (192.0.2.2:500), complainant 198.51.100.1: Connection refused [errno 111, origin ICMP type 3 code 3 (not authenticated)]
Copy to Clipboard Toggle word wrap
不匹配的 IKE 算法

在初始设置过程中,连接会失败并显示 NO_PROPOSAL_CHOSEN 通知:

# ipsec auto --up vpn.example.com
...
003 "vpn.example.com"[1] 193.110.157.148 #3: dropping unexpected IKE_SA_INIT message containing NO_PROPOSAL_CHOSEN notification; message payloads: N; missing payloads: SA,KE,Ni
Copy to Clipboard Toggle word wrap
Mismatched IPsec Algorithms

在初始交换后,连接会失败并显示 NO_PROPOSAL_CHOSEN 错误:

# ipsec auto --up vpn.example.com
...
182 "vpn.example.com"[1] 193.110.157.148 #5: STATE_PARENT_I2: sent v2I2, expected v2R2 {auth=IKEv2 cipher=AES_GCM_16_256 integ=n/a prf=HMAC_SHA2_256 group=MODP2048}
002 "vpn.example.com"[1] 193.110.157.148 #6: IKE_AUTH response contained the error notification NO_PROPOSAL_CHOSEN
Copy to Clipboard Toggle word wrap
Mismatched IP Address Ranges (IKEv2)

远程对等点响应 TS_UNACCEPTABLE 错误:

# ipsec auto --up vpn.example.com
...
1v2 "vpn.example.com" #1: STATE_PARENT_I2: sent v2I2, expected v2R2 {auth=IKEv2 cipher=AES_GCM_16_256 integ=n/a prf=HMAC_SHA2_512 group=MODP2048}
002 "vpn.example.com" #2: IKE_AUTH response contained the error notification TS_UNACCEPTABLE
Copy to Clipboard Toggle word wrap
Mismatched IP Address Ranges (IKEv1)

在快速模式下连接超时,并显示代表 peer 不接受提议的消息:

# ipsec auto --up vpn.example.com
...
031 "vpn.example.com" #2: STATE_QUICK_I1: 60 second timeout exceeded after 0 retransmits.  No acceptable response to our first Quick Mode message: perhaps peer likes no proposal
Copy to Clipboard Toggle word wrap
Mismatched PSK (IKEv2)

peer 拒绝与 AUTHENTICATION_FAILED 错误的连接:

# ipsec auto --up vpn.example.com
...
003 "vpn.example.com" #1: received Hash Payload does not match computed value
223 "vpn.example.com" #1: sending notification INVALID_HASH_INFORMATION to 192.0.2.23:500
Copy to Clipboard Toggle word wrap
Mismatched PSK (IKEv1)

哈希有效负载不匹配,使 IKE 消息不可读取,并导致 INVALID_HASH_INFORMATION 错误:

# ipsec auto --up vpn.example.com
...
002 "vpn.example.com" #1: IKE SA authentication request rejected by peer: AUTHENTICATION_FAILED
Copy to Clipboard Toggle word wrap

7.14.4. MTU 问题

诊断由最大传输单元(MTU)问题导致的间歇性 IPsec 连接失败。加密会增加数据包大小,从而导致数据包超过网络的 MTU 时碎片和丢失数据,通常会看到更大的数据传输。

一个常见的症状是,小数据包(例如 ping)可以正常工作,但大型数据包(如 SSH 会话)在登录后冻结。要解决这个问题,请通过将 mtu=1400 选项添加到配置文件来降低隧道的 MTU。

7.14.5. NAT 冲突

解决 IPsec 主机也充当 NAT 路由器时出现的 NAT 冲突。不正确的 NAT 应用程序可以在加密前转换源 IP 地址,从而导致数据包通过网络进行未加密的发送。

例如,如果在应用 IPsec 加密前,如果数据包的源 IP 地址被伪装规则转换,则数据包的源不再与 IPsec 策略匹配,并且 Libreswan 通过网络发送未加密的。

要解决这个问题,请添加一条防火墙规则,该规则不包括 NAT 中 IPsec 子网之间的流量。应在 POSTROUTING 链的开头插入此规则,以确保它在常规 NAT 规则之前进行处理。

例 7.1. 使用 nftables 框架的解决方案

以下示例使用 nftables 设置一个基本 NAT 环境,该环境将 192.0.2.0/24 和 198.51.100.0/24 子网之间的流量从地址转换中排除:

# nft add table ip nat
# nft add chain ip nat postrouting { type nat hook postrouting priority 100 \; }
# nft add rule ip nat postrouting ip saddr 192.0.2.0/24 ip daddr 198.51.100.0/24 return
Copy to Clipboard Toggle word wrap

7.14.6. 内核级 IPsec 问题

当 VPN 隧道建立但没有流量流时,对内核级别的 IPsec 问题进行故障排除。在这种情况下,检查内核的 IPsec 状态,以检查隧道策略和加密密钥是否已正确安装。

这个过程涉及检查两个组件:

  • 安全策略数据库(SPD):指示内核要加密的流量的规则。
  • 安全关联数据库(SAD):指示内核如何加密该流量的密钥。

首先,检查 SPD 中是否存在正确的策略:

# ip xfrm policy
src 192.0.2.1/32 dst 10.0.0.0/8
	dir out priority 666 ptype main
	tmpl src 198.51.100.13 dst 203.0.113.22
		proto esp reqid 16417 mode tunnel
Copy to Clipboard Toggle word wrap

输出应包含与您的 leftsubnetrightsubnet 参数匹配的策略,以及 in 和 out 方向。如果没有为流量看到策略,Libreswan 无法创建内核规则,并且不会加密流量。

如果策略存在,检查它是否在 SAD 中有对应的键集合:

# ip xfrm state
src 203.0.113.22 dst 198.51.100.13
	proto esp spi 0xa78b3fdb reqid 16417 mode tunnel
	auth-trunc hmac(sha1) 0x3763cd3b... 96
	enc cbc(aes) 0xd9dba399...
Copy to Clipboard Toggle word wrap
警告

这个命令显示私钥。不要共享此输出,因为攻击者可以使用它来解密您的 VPN 流量。

如果策略存在,但没有具有相同 reqid 的对应状态,这通常意味着互联网密钥交换(IKE)协商失败。这两个 VPN 端点无法同意一组密钥。

如需更详细的诊断,请将 -s 选项与其中一个命令一起使用。这个选项添加流量计数器,这有助于识别内核是否按特定规则处理数据包。

7.14.7. 内核 IPsec 子系统错误

内核 IPsec 子系统中的一个缺陷可能会导致它丢失与 IKE 守护进程的同步。这可能会导致协商安全关联和实际 IPsec 策略强制之间的差异,从而破坏安全的网络通信。

要检查内核级别的错误,显示转换(XFRM)统计信息:

# cat /proc/net/xfrm_stat
Copy to Clipboard Toggle word wrap

如果输出中的任何计数器(如 XfrmInError )显示非零值,这表示内核子系统存在问题。在这种情况下,创建一个支持问题单,并将命令的输出与对应的 IKE 日志附加。

7.14.8. 显示 Libreswan 日志

显示 Libreswan 日志来诊断和排除 IPsec 服务事件和问题。访问 ipsec 服务的日志,以深入了解连接状态和潜在问题。

要显示日志,请输入:

# journalctl -xeu ipsec
Copy to Clipboard Toggle word wrap

如果默认日志记录级别没有提供足够详情,请通过在 /etc/ipsec.conf 文件中的 config setup 部分中添加以下设置来启用全面的调试日志:

plutodebug=all
logfile=/var/log/pluto.log
Copy to Clipboard Toggle word wrap

由于调试日志记录可以生成许多条目,因此将消息重定向到专用日志文件可防止 journaldsystemd 服务对消息进行速率限制。

第 8 章 设置 WireGuard VPN

WireGuard 是一个在 Linux 内核中运行的高性能 VPN。它使用现代加密,比其他 VPN 解决方案更容易配置。其小代码库提高了安全性,对于身份验证和加密,它使用类似于 SSH 的密钥。

重要

WireGuard 只作为技术预览提供。红帽产品服务级别协议(SLA)不支持技术预览功能,且其功能可能并不完善,因此红帽不建议在生产环境中使用它们。这些预览可让用户早期访问将来的产品功能,让用户在开发过程中测试并提供反馈意见。

如需有关 技术预览功能支持范围 的信息,请参阅红帽客户门户网站中的技术预览功能支持范围。

请注意,参与 WireGuard VPN 的所有主机都是同级的。本文档使用术语 客户端 来描述建立连接的主机,使用 服务器 来描述固定主机名或客户端连接的 IP 地址的主机,并可选通过这个服务器路由所有流量。

要设置 WireGuard VPN,您必须完成以下步骤:

  1. 配置服务器。
  2. 在本地防火墙中打开 WireGuard 端口。
  3. 配置客户端。

WireGuard 在网络层(层 3)上运行。因此,您无法使用 DHCP,且必须为服务器和客户端上的隧道设备分配静态 IP 地址或 IPv6 全局地址。

重要

只有在禁用 RHEL 中的 Federal Information Processing Standard(FIPS)模式时,才能使用 WireGuard。

8.1. WireGuard 使用的协议和原语

了解 WireGuard 使用的协议和原语对于评估其安全性和可信度非常重要。了解这些组件可让用户验证系统是否使用现代安全加密标准。

WireGuard 使用以下协议和原语:

  • ChaCha20 用于通过 Poly1305 进行身份验证,使用带有关联数据(AEAD)的 Authenticated Encryption,如 RFC7539 所述
  • 用于 Elliptic-curve Diffie-Hellman (ECDH)密钥交换的Curve25519
  • 用于哈希和密钥哈希的 BLAKE2s,如 RFC7693所述
  • 用于哈希表键的 SipHash24
  • 用于密钥派生的 HKDF,如 RFC5869所述

WireGuard 的设计使用加密身份严格连接网络路由,创建 Cryptokey Routing Table。此系统使协议能够充当传出流量的路由机制,以及用于传入数据包的访问控制列表,确保仅处理经过验证和授权的流量。

当 WireGuard 将网络数据包发送到对等点时:

  1. WireGuard 从数据包读取目标 IP,并将其与本地配置中允许的 IP 地址列表进行比较。如果未找到 peer,WireGuard 会丢弃数据包。
  2. 如果 peer 有效,WireGuard 使用对等的公钥对数据包进行加密。
  3. 发送主机查找主机的最新互联网 IP 地址,并将加密数据包发送到此地址。

当 WireGuard 接收数据包时:

  1. WireGuard 使用远程主机的私钥解密数据包。
  2. WireGuard 从数据包读取内部源地址,并在本地主机上对等点的设置中查询 IP 地址是否配置。如果源 IP 位于允许列表中,WireGuard 会接受数据包。如果 IP 地址不在列表中,WireGuard 会丢弃数据包。

8.3. 使用 NAT 和防火墙后面的 WireGuard 客户端

WireGuard 使用 UDP 协议,只有在对等点发送数据包时才会传输数据。路由器上的有状态防火墙和网络地址转换(NAT)可跟踪连接,以启用 NAT 或防火墙接收数据包的对等点。

为了保持连接处于活动状态,WireGuard 支持 持久性 keepalives。这意味着您可以设置一个间隔,其中 WireGuard 发送 keepalive 数据包。默认情况下,禁用持久的 keep-alive 功能来减少网络流量。如果您在带有 NAT 的网络中使用客户端,或者防火墙在一定时间不活动状态后关闭连接,在客户端上启用此功能。

注意

请注意,您无法使用 RHEL web 控制台在 WireGuard 连接中配置 keepalive 数据包。要配置此功能,请使用 nmcli 工具编辑连接配置文件。

8.4. 创建在 WireGuard 连接中使用的私钥和公钥

WireGuard 使用 base64 编码的私钥和公钥来互相验证主机。因此,您必须在参与 WireGuard VPN 的每个主机上创建密钥。

重要

对于安全连接,请为每个主机创建不同的密钥,并确保只使用远程 WireGuard 主机共享公钥。不要使用本文档中使用的示例键。

如果您计划使用 RHEL web 控制台创建 WireGuard VPN 连接,您可以在 web 控制台中生成公钥和私钥对。

流程

  1. 安装 wireguard-tools 软件包:

    # dnf install wireguard-tools
    Copy to Clipboard Toggle word wrap
  2. 为主机创建私钥和对应的公钥:

    # wg genkey | tee /etc/wireguard/$HOSTNAME.private.key | wg pubkey > /etc/wireguard/$HOSTNAME.public.key
    Copy to Clipboard Toggle word wrap

    您需要密钥文件的内容,而不是文件本身。但是,红帽建议在将来需要记住密钥时保留文件。

  3. 在密钥文件中设置安全权限:

    # chmod 600 /etc/wireguard/$HOSTNAME.private.key /etc/wireguard/$HOSTNAME.public.key
    Copy to Clipboard Toggle word wrap
  4. 显示私钥:

    # cat /etc/wireguard/$HOSTNAME.private.key
    YFAnE0psgIdiAF7XR4abxiwVRnlMfeltxu10s/c4JXg=
    Copy to Clipboard Toggle word wrap

    您需要私钥在本地主机上配置 WireGuard 连接。不要共享私钥。

  5. 显示公钥:

    # cat /etc/wireguard/$HOSTNAME.public.key
    UtjqCJ57DeAscYKRfp7cFGiQqdONRn69u249Fa4O6BE=
    Copy to Clipboard Toggle word wrap

    您需要公钥在远程主机上配置 WireGuard 连接。

8.5. 使用 nmcli 配置 WireGuard 服务器

您可以通过在 NetworkManager 中创建连接配置集来配置 WireGuard 服务器。使用此方法让 NetworkManager 管理 WireGuard 连接。

此流程假设以下设置:

  • server:

    • 私钥: 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 地址和子网掩码

流程

  1. 添加 NetworkManager WireGuard 连接配置集:

    # nmcli connection add type wireguard con-name server-wg0 ifname wg0 autoconnect no
    Copy to Clipboard Toggle word wrap

    此命令创建一个名为 server-wg0 的配置文件,并将虚拟接口 wg0 分配给它。要防止连接在添加后而没有最终配置的情况下自动启动,请禁用 autoconnect 参数。

  2. 设置服务器的隧道 IPv4 地址和子网掩码:

    # nmcli connection modify server-wg0 ipv4.method manual ipv4.addresses 192.0.2.1/24
    Copy to Clipboard Toggle word wrap
  3. 设置服务器的隧道 IPv6 地址和子网掩码:

    # nmcli connection modify server-wg0 ipv6.method manual ipv6.addresses 2001:db8:1::1/32
    Copy to Clipboard Toggle word wrap
  4. 将服务器的私钥添加到连接配置集中:

    # nmcli connection modify server-wg0 wireguard.private-key "YFAnE0psgIdiAF7XR4abxiwVRnlMfeltxu10s/c4JXg="
    Copy to Clipboard Toggle word wrap
  5. 为传入的 WireGuard 连接设定端口:

    # nmcli connection modify server-wg0 wireguard.listen-port 51820
    Copy to Clipboard Toggle word wrap

    在主机上始终设置固定端口号,接收传入的 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;
      Copy to Clipboard Toggle word wrap
      • [wireguard-peer.<public_key_of_the_client>] 条目定义客户端对等的部分,以及包含客户端公钥的部分的名称。
      • allowed-ips 参数设置允许向这个服务器发送数据的客户端的隧道 IP 地址。

        为每个客户端添加一个部分。

    2. 重新载入 server-wg0 连接配置文件:

      # nmcli connection load /etc/NetworkManager/system-connections/server-wg0.nmconnection
      Copy to Clipboard Toggle word wrap
  7. 可选:将连接配置为自动启动,请输入:

    # nmcli connection modify server-wg0 autoconnect yes
    Copy to Clipboard Toggle word wrap
  8. 重新激活 server-wg0 连接:

    # nmcli connection up server-wg0
    Copy to Clipboard Toggle word wrap
  9. 如果您在具有 DHCP 或无状态地址自动配置(SLAAC)的网络中使用此主机,则连接可能容易被重定向。有关详情和缓解步骤,请参阅将 VPN 连接分配给专用路由表,以防止连接绕过隧道

验证

  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
    Copy to Clipboard Toggle word wrap

    要在输出中显示私钥,请使用 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
    Copy to Clipboard Toggle word wrap

8.6. 使用 nmtui 配置 WireGuard 服务器

您可以通过在 NetworkManager 中创建连接配置集来配置 WireGuard 服务器。使用此方法让 NetworkManager 管理 WireGuard 连接。

此流程假设以下设置:

  • server:

    • 私钥: 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
    Copy to Clipboard Toggle word wrap
  2. 选择 Edit a connection,然后按 Enter
  3. 选择 添加,然后按 Enter 键。
  4. 选择列表中的 WireGuard 连接类型,然后按 Enter 键。
  5. Edit connection 窗口中:

    1. 输入连接名称和虚拟接口,如 wg0,以便 NetworkManager 应分配给连接。
    2. 输入服务器的私钥。
    3. 为传入的 WireGuard 连接设置侦听端口号,如 51820

      在主机上始终设置固定端口号,接收传入的 WireGuard 连接。如果您没有设置端口,WireGuard 会在每次激活接口时都使用一个随机的空闲端口。

    4. Peers 窗格旁的 Add

      1. 输入客户端的公钥。
      2. Allowed IP 字段设置为允许向这个服务器发送数据的客户端的隧道 IP 地址。
      3. 选择 OK,然后按 Enter 键。

    5. 选择 *IPv4 Configuration 旁边的 Show,然后按 Enter 键。

      1. 选择 IPv4 配置方法 Manual
      2. 输入隧道 IPv4 地址和子网掩码。将 Gateway 字段留空。
    6. 选择 IPv6 Configuration 旁边的 Show,然后按 Enter 键。

      1. 选择 IPv6 配置方法 Manual
      2. 输入隧道 IPv6 地址和子网掩码。将 Gateway 字段留空。
    7. 选择 确定,然后按 Enter

  6. 在带有连接列表的窗口中,选择 Back,然后按 Enter 键。
  7. NetworkManager TUI 主窗口中,选择 Quit,然后按 Enter 键。
  8. 如果您在具有 DHCP 或无状态地址自动配置(SLAAC)的网络中使用此主机,则连接可能容易被重定向。有关详情和缓解步骤,请参阅将 VPN 连接分配给专用路由表,以防止连接绕过隧道

验证

  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
    Copy to Clipboard Toggle word wrap

    要在输出中显示私钥,请使用 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
    Copy to Clipboard Toggle word wrap

8.7. 使用 RHEL web 控制台配置 WireGuard 服务器

您可以使用基于浏览器的 RHEL web 控制台配置 WireGuard 服务器。使用此方法让 NetworkManager 管理 WireGuard 连接。

先决条件

  • 已登陆到 RHEL web 控制台。
  • 您知道以下信息:

    • 服务器和客户端的静态隧道 IP 地址和子网掩码
    • 客户端的公钥

流程

  1. 在屏幕左侧的导航中选择 Networking 选项卡。
  2. Interfaces 部分中点 Add VPN
  3. 如果没有安装 wireguard-toolssystemd-resolved 软件包,Web 控制台会显示一条相应的通知。点 Install 安装这些软件包。
  4. 输入您要创建的 WireGuard 设备的名称。
  5. 配置此主机的密钥对:

    • 如果要使用 web 控制台已创建的密钥:

      1. Private key 区域中保留预先选择的 Generated 选项。
      2. 注意 Public key 值。配置客户端时需要此信息。
    • 如果要使用现有的私钥:

      1. Private key 区域中选择 Paste existing key
      2. 将私钥粘贴到文本字段中。Web 控制台自动计算相应的公钥。
  6. 为传入的 WireGuard 连接设置一个侦听端口号,如 51820

    在主机上始终设置固定端口号,接收传入的 WireGuard 连接。如果您没有设置端口,WireGuard 会在每次激活接口时都使用一个随机的空闲端口。

  7. 设置服务器的隧道 IPv4 地址和子网掩码。

    如果还要设置 IPv6 地址,您必须在创建连接后编辑它。

  8. 为您要允许与此服务器进行通信的每个客户端添加对等配置:

    1. 单击 Add peer
    2. 输入客户端的公钥。
    3. Endpoint 字段留空。
    4. Allowed IP 字段设置为允许向这个服务器发送数据的客户端的隧道 IP 地址。
  9. Add 创建 WireGuard 连接。
  10. 如果您还想设置隧道 IPv6 地址:

    1. Interfaces 部分中点 WireGuard 连接的名称。
    2. IPv6 旁边的 edit
    3. Addresses 字段设置为 Manual,并输入服务器的隧道 IPv6 地址和前缀。
    4. 点击 Save
  11. 如果您在具有 DHCP 或无状态地址自动配置(SLAAC)的网络中使用此主机,则连接可能容易被重定向。有关详情和缓解步骤,请参阅将 VPN 连接分配给专用路由表,以防止连接绕过隧道

验证

  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
    Copy to Clipboard Toggle word wrap

    要在输出中显示私钥,请使用 WG_HIDE_KEYS=never wg show wg0 命令。

  2. 显示 wg0 设备的 IP 配置:

    # ip address show wg0
    20: wg0: <POINTOPOINT,NOARP,UP,LOWERUP> 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
    Copy to Clipboard Toggle word wrap

8.8. 使用 nm-connection-editor 配置 WireGuard 服务器

您可以通过在 NetworkManager 中创建连接配置集来配置 WireGuard 服务器。使用此方法让 NetworkManager 管理 WireGuard 连接。

先决条件

  • 您已为服务器和客户端生成了公钥和私钥。
  • 您知道以下信息:

    • 服务器的私钥
    • 客户端的静态隧道 IP 地址和子网掩码
    • 客户端的公钥
    • 服务器的静态隧道 IP 地址和子网掩码

流程

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

    # nm-connection-editor
    Copy to Clipboard Toggle word wrap
  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 设置 标签页中:

    1. Method 列表中选择 Manual
    2. 单击 Add 来输入隧道 IPv4 地址和子网掩码。将 Gateway 字段留空。
  8. IPv6 设置 标签页中:

    1. Method 列表中选择 Manual
    2. 单击 Add 来输入隧道 IPv6 地址和子网掩码。将 Gateway 字段留空。
  9. Save 存储连接配置集。
  10. 如果您在具有 DHCP 或无状态地址自动配置(SLAAC)的网络中使用此主机,则连接可能容易被重定向。有关详情和缓解步骤,请参阅将 VPN 连接分配给专用路由表,以防止连接绕过隧道

验证

  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
    Copy to Clipboard Toggle word wrap

    要在输出中显示私钥,请使用 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
    Copy to Clipboard Toggle word wrap

8.9. 使用 wg-quick 服务配置 WireGuard 服务器

您可以通过在 /etc/wireguard/ 目录中创建配置文件来配置 WireGuard 服务器。使用此方法独立于 NetworkManager 配置服务。

此流程假设以下设置:

  • server:

    • 私钥: 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 地址和子网掩码

流程

  1. 安装 wireguard-tools 软件包:

    # dnf install wireguard-tools
    Copy to Clipboard Toggle word wrap
  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
    Copy to Clipboard Toggle word wrap
    • [Interface] 部分描述了服务器上接口的 WireGuard 设置:

      • Address :逗号分隔的服务器的隧道 IP 地址的列表。
      • PrivateKey :服务器的私钥。
      • ListenPort :WireGuard 在其上侦听传入的 UDP 连接的端口。

        在主机上始终设置固定端口号,接收传入的 WireGuard 连接。如果您没有设置端口,WireGuard 会在每次激活 wg0 接口时使用随机的空闲端口。

    • 每个 [Peer] 部分描述了一个客户端的设置:

      • PublicKey :客户端的公钥。
      • AllowedIPs :允许向这个服务器发送数据的客户端的隧道 IP 地址。
  3. 启用并启动 WireGuard 连接:

    # systemctl enable --now wg-quick@wg0
    Copy to Clipboard Toggle word wrap

    systemd 实例名称必须与 /etc/wireguard/ 目录中不带 .conf 后缀的配置文件的名称匹配。该服务还会将这个名称用于虚拟网络接口。

  4. 如果您在具有 DHCP 或无状态地址自动配置(SLAAC)的网络中使用此主机,则连接可能容易被重定向。有关详情和缓解步骤,请参阅将 VPN 连接分配给专用路由表,以防止连接绕过隧道

验证

  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
    Copy to Clipboard Toggle word wrap

    要在输出中显示私钥,请使用 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 scope global wg0
           valid_lft forever preferred_lft forever
        inet6 2001:db8:1::1/32 scope global
           valid_lft forever preferred_lft forever
    Copy to Clipboard Toggle word wrap

在 WireGuard 服务器上配置 firewalld 服务,允许来自客户端的传入连接。如果客户端需要使用服务器作为其默认网关并通过隧道路由所有流量,还要启用伪装。

流程

  1. firewalld 服务中的传入连接打开 WireGuard 端口:

    # firewall-cmd --permanent --add-port=51820/udp --zone=public
    Copy to Clipboard Toggle word wrap
  2. 如果客户端应该使用 WireGuard 服务器作为默认网关来通过隧道路由所有流量,请为 public 区域启用伪装:

    # firewall-cmd --permanent --zone=public --add-masquerade
    Copy to Clipboard Toggle word wrap
  3. 重新加载 firewalld 规则。

    # firewall-cmd --reload
    Copy to Clipboard Toggle word wrap

验证

  • 显示 public 区域的配置:

    # firewall-cmd --list-all
    public (active)
      ...
      ports: 51820/udp
      masquerade: yes
      ...
    Copy to Clipboard Toggle word wrap

在 WireGuard 服务器上配置 firewalld 服务,允许来自客户端的传入连接。如果客户端需要使用服务器作为其默认网关并通过隧道路由所有流量,还要启用伪装。

先决条件

  • 已登陆到 RHEL web 控制台。

流程

  1. 在屏幕左侧的导航中选择 Networking 选项卡。
  2. Firewall 部分中的 Edit rules and zones
  3. Add services
  4. Filter services 字段中输入 wireguard
  5. 从列表中选择 wireguard 条目。

  6. Add services
  7. 如果客户端应该使用 WireGuard 服务器作为默认网关来通过隧道路由所有流量,请为 public 区域启用伪装:

    # firewall-cmd --permanent --zone=public --add-masquerade
    # firewall-cmd --reload
    Copy to Clipboard Toggle word wrap

    请注意,您无法在 web 控制台的 firewalld 区域中启用伪装。

验证

  1. 在屏幕左侧的导航中选择 Networking 选项卡。
  2. Firewall 部分中的 Edit rules and zones
  3. 列表包含 wireguard 服务的一个条目,并显示您在 WireGuard 连接配置文件中配置的 UDP 端口。
  4. 要验证 firewalldpublic 区域中是否启用了伪装,请输入:

    # firewall-cmd --list-all --zone=public
    public (active)
      ...
      services: ... wireguard
      ports:
      forward: yes
      masquerade: yes
      ...
    Copy to Clipboard Toggle word wrap

在 WireGuard 服务器上配置 firewalld 服务,允许来自客户端的传入连接。如果客户端需要使用服务器作为其默认网关并通过隧道路由所有流量,还要启用伪装。

流程

  1. Super 键,输入 firewall,然后从结果中选择 Firewall 应用程序。
  2. Configuration 列表中选择 Permanent
  3. 选择 public 区域。
  4. 允许到 WireGuard 端口的传入连接:

    1. Ports 选项卡上,单击 Add
    2. 输入您为传入 WireGuard 连接设置的端口号:
    3. Protocol 列表中选择 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
      ...
    Copy to Clipboard Toggle word wrap

8.13. 使用 nmcli 配置 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 地址和子网掩码

流程

  1. 添加 NetworkManager WireGuard 连接配置集:

    # nmcli connection add type wireguard con-name client-wg0 ifname wg0
    Copy to Clipboard Toggle word wrap

    此命令创建一个名为 client-wg0 的配置文件,并将虚拟接口 wg0 分配给它。

  2. 可选:配置 NetworkManager,使其不会自动启动 client-wg 连接:

    # nmcli connection modify client-wg0 autoconnect no
    Copy to Clipboard Toggle word wrap
  3. 设置客户端的隧道 IPv4 地址和子网掩码:

    # nmcli connection modify client-wg0 ipv4.method manual ipv4.addresses 192.0.2.2/24
    Copy to Clipboard Toggle word wrap
  4. 设置客户端的隧道 IPv6 地址和子网掩码:

    # nmcli connection modify client-wg0 ipv6.method manual ipv6.addresses 2001:db8:1::2/32
    Copy to Clipboard Toggle word wrap
  5. 如果要通过隧道路由所有流量,请将服务器的隧道 IP 地址设置为默认网关:

    # nmcli connection modify client-wg0 ipv4.gateway 192.0.2.1 ipv6.gateway 2001:db8:1::1
    Copy to Clipboard Toggle word wrap

    通过隧道路由所有流量要求您在后续步骤中将此客户端上的 allowed-ips 设置为 0.0.0.0/0;::/0

    请注意,通过隧道路由所有流量可能会影响到其他主机的连接,具体取决于服务器路由和防火墙配置。

  6. 将客户端的私钥添加到连接配置文件中:

    # nmcli connection modify client-wg0 wireguard.private-key "aPUcp5vHz8yMLrzk8SsDyYnV33IhE/k20e52iKJFV0A="
    Copy to Clipboard Toggle word wrap
  7. 为您要允许与此客户端通信的每台服务器添加对等配置。您必须手动添加这些设置,因为 nmcli 工具不支持设置相应的连接属性。

    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
      Copy to Clipboard Toggle word wrap
      • [wireguard-peer.<public_key_of_the_server>] 条目定义了服务器的对等部分,部分名称有服务器的公钥。
      • 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
      Copy to Clipboard Toggle word wrap
  8. 重新激活 client-wg0 连接:

    # nmcli connection up client-wg0
    Copy to Clipboard Toggle word wrap
  9. 如果您在具有 DHCP 或无状态地址自动配置(SLAAC)的网络中使用此主机,则连接可能容易被重定向。有关详情和缓解步骤,请参阅将 VPN 连接分配给专用路由表,以防止连接绕过隧道

验证

  1. Ping 服务器的 IP 地址:

    # ping 192.0.2.1
    # ping6 2001:db8:1::1
    Copy to Clipboard Toggle word wrap
  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
    Copy to Clipboard Toggle word wrap

    要在输出中显示私钥,请使用 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
    Copy to Clipboard Toggle word wrap

8.14. 使用 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
    Copy to Clipboard Toggle word wrap
  2. 选择 Edit a connection,然后按 Enter
  3. 选择 添加,然后按 Enter 键。
  4. 选择列表中的 WireGuard 连接类型,然后按 Enter 键。
  5. Edit connection 窗口中:

    1. 输入连接名称和虚拟接口,如 wg0,以便 NetworkManager 应分配给连接。
    2. 输入客户端的私钥。

    3. Peers 窗格旁的 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. 选择 OK,然后按 Enter 键。

    4. 选择 IPv4 Configuration 旁边的 Show,然后按 Enter 键。

      1. 选择 IPv4 配置方法 Manual
      2. 输入隧道 IPv4 地址和子网掩码。将 Gateway 字段留空。
    5. 选择 IPv6 Configuration 旁边的 Show,然后按 Enter 键。

      1. 选择 IPv6 配置方法 Manual
      2. 输入隧道 IPv6 地址和子网掩码。将 Gateway 字段留空。
    6. 可选:选择 Automatically connect
    7. 选择 OK,然后按 Enter

  6. 在带有连接列表的窗口中,选择 Back,然后按 Enter 键。
  7. NetworkManager TUI 主窗口中,选择 Quit,然后按 Enter 键。
  8. 如果您在具有 DHCP 或无状态地址自动配置(SLAAC)的网络中使用此主机,则连接可能容易被重定向。有关详情和缓解步骤,请参阅将 VPN 连接分配给专用路由表,以防止连接绕过隧道

验证

  1. Ping 服务器的 IP 地址:

    # ping 192.0.2.1
    # ping6 2001:db8:1::1
    Copy to Clipboard Toggle word wrap
  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
    Copy to Clipboard Toggle word wrap

    要在输出中显示私钥,请使用 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
    Copy to Clipboard Toggle word wrap

8.15. 使用 RHEL web 控制台配置 WireGuard 客户端

您可以使用基于浏览器的 RHEL web 控制台配置 WireGuard 客户端。使用此方法让 NetworkManager 管理 WireGuard 连接。

先决条件

  • 已登陆到 RHEL web 控制台。
  • 您知道以下信息:

    • 服务器和客户端的静态隧道 IP 地址和子网掩码
    • 服务器的公钥

流程

  1. 在屏幕左侧的导航中选择 Networking 选项卡。
  2. Interfaces 部分中点 Add VPN
  3. 如果没有安装 wireguard-toolssystemd-resolved 软件包,Web 控制台会显示一条相应的通知。点 Install 安装这些软件包。
  4. 输入您要创建的 WireGuard 设备的名称。
  5. 配置此主机的密钥对:

    • 如果要使用 web 控制台已创建的密钥:

      1. Private key 区域中保留预先选择的 Generated 选项。
      2. 注意 Public key 值。配置客户端时需要此信息。
    • 如果要使用现有的私钥:

      1. Private key 区域中选择 Paste existing key
      2. 将私钥粘贴到文本字段中。Web 控制台自动计算相应的公钥。
  6. Listen port 字段中保留 0 值。
  7. 设置客户端的隧道 IPv4 地址和子网掩码。

    如果还要设置 IPv6 地址,您必须在创建连接后编辑它。

  8. 为您要允许与此客户端进行通信的服务器添加对等配置:

    1. 单击 Add peer
    2. 输入服务器的公钥。
    3. Endpoint 字段设置为主机名或 IP 地址及端口,如 server.example.com:51820。客户端使用此信息来建立连接。
    4. Allowed IP 字段设置为允许向这个服务器发送数据的客户端的隧道 IP 地址。例如,将字段设置为以下之一:

      • 服务器隧道 IP 地址,以仅允许服务器与此客户端通信。下面的屏幕截图中的值配置此场景。
      • 0.0.0.0/0 允许任何远程 IPv4 地址与此客户端进行通信。使用此设置通过隧道路由所有流量,并使用 WireGuard 服务器作为默认网关。
  9. Add 创建 WireGuard 连接。
  10. 如果您还想设置隧道 IPv6 地址:

    1. Interfaces 部分中点 WireGuard 连接的名称。
    2. 单击 IPv6 旁边的 Edit
    3. Addresses 字段设置为 Manual,并输入客户端的隧道 IPv6 地址和前缀。
    4. 点击 Save
  11. 如果您在具有 DHCP 或无状态地址自动配置(SLAAC)的网络中使用此主机,则连接可能容易被重定向。有关详情和缓解步骤,请参阅将 VPN 连接分配给专用路由表,以防止连接绕过隧道

验证

  1. Ping 服务器的 IP 地址:

    # ping 192.0.2.1
    Copy to Clipboard Toggle word wrap

    当您尝试通过隧道发送流量时,WireGuard 会建立连接。

  2. 显示 wg0 设备的接口配置:

    # wg show wg0
    interface: wg0
      public key: bnwfQcC8/g2i4vvEqcRUM2e6Hi3Nskk6G9t4r26nFVM=
      private key: (hidden)
      listening port: 45513
    
    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
    Copy to Clipboard Toggle word wrap

    要在输出中显示私钥,请使用 WG_HIDE_KEYS=never wg show wg0 命令。

    请注意,如果您已经通过 VPN 隧道发送流量,则输出只有 latest handshaketransfer 条目。

  3. 显示 wg0 设备的 IP 配置:

    # ip address show wg0
    10: wg0: <POINTOPOINT,NOARP,UP,LOWERUP> 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
    Copy to Clipboard Toggle word wrap

您可以通过在 NetworkManager 中创建连接配置集来配置 WireGuard 客户端。使用此方法让 NetworkManager 管理 WireGuard 连接。

先决条件

  • 您已为服务器和客户端生成了公钥和私钥。
  • 您知道以下信息:

    • 客户端的私钥
    • 客户端的静态隧道 IP 地址和子网掩码
    • 服务器的公钥
    • 服务器的静态隧道 IP 地址和子网掩码

流程

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

    # nm-connection-editor
    Copy to Clipboard Toggle word wrap
  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 地址。否则,将字段留空。

      通过隧道路由所有 IPv4 流量需要您在此客户端上的 Allowed IP 字段中包含 0.0.0.0/0

  8. IPv6 Settings 选项卡上:

    1. Method 列表中选择 Manual
    2. 单击 Add 来输入隧道 IPv6 地址和子网掩码。
    3. 如果要通过隧道路由所有流量,请在 Gateway 字段中设置服务器的隧道 IPv6 地址。否则,将字段留空。

      通过隧道路由所有 IPv4 流量需要您在此客户端上的 Allowed IP 字段中包含 ::/0

  9. Save 存储连接配置集。
  10. 如果您在具有 DHCP 或无状态地址自动配置(SLAAC)的网络中使用此主机,则连接可能容易被重定向。有关详情和缓解步骤,请参阅将 VPN 连接分配给专用路由表,以防止连接绕过隧道

验证

  1. Ping 服务器的 IP 地址:

    # ping 192.0.2.1
    # ping6 2001:db8:1::1
    Copy to Clipboard Toggle word wrap
  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
    Copy to Clipboard Toggle word wrap

    要在输出中显示私钥,请使用 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
    Copy to Clipboard Toggle word wrap

8.17. 使用 wg-quick 服务配置 WireGuard 客户端

您可以通过在 /etc/wireguard/ 目录中创建配置文件来配置 WireGuard 客户端。使用此方法独立于 NetworkManager 配置服务。

此流程假设以下设置:

  • 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 地址和子网掩码

流程

  1. 安装 wireguard-tools 软件包:

    # dnf install wireguard-tools
    Copy to Clipboard Toggle word wrap
  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
    Copy to Clipboard Toggle word wrap
    • [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
    Copy to Clipboard Toggle word wrap

    systemd 实例名称必须与 /etc/wireguard/ 目录中不带 .conf 后缀的配置文件的名称匹配。该服务还会将这个名称用于虚拟网络接口。

  4. 如果您在带有 DHCP 或无状态地址自动配置(SLAAC)的网络中使用此主机,则连接可能会受到重定向的影响。有关详情和缓解步骤,请参阅将 VPN 连接分配给专用路由表,以防止连接绕过隧道

验证

  1. Ping 服务器的 IP 地址:

    # ping 192.0.2.1
    # ping6 2001:db8:1::1
    Copy to Clipboard Toggle word wrap
  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
    Copy to Clipboard Toggle word wrap

    要在输出中显示私钥,请使用 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 scope global wg0
           valid_lft forever preferred_lft forever
        inet6 2001:db8:1::2/32 scope global
           valid_lft forever preferred_lft forever
    Copy to Clipboard Toggle word wrap

要防止 VPN 连接来自流量重定向攻击,请将其分配给专用路由表。这可防止恶意网络服务器绕过安全隧道并损害数据完整性。

DHCP 服务器和无状态地址自动配置(SLAAC)都可以将路由添加到客户端的路由表中。例如,恶意的 DHCP 服务器可以使用此功能强制带有 VPN 连接的主机通过物理接口而不是 VPN 隧道重定向流量。此漏洞也称为 TunnelVision,并参见 CVE-2024-3661 漏洞文章中所述。

要缓解此漏洞,您可以将 VPN 连接分配给专用路由表。这可防止 DHCP 配置或 SLAAC 来处理用于 VPN 隧道的网络数据包的路由决策。

如果至少有一个条件应用到您的环境,请按照以下步骤操作:

  • 至少一个网络接口使用 DHCP 或 SLAAC。
  • 您的网络不使用阻止恶意 DHCP 服务器的机制,如 DHCP 侦听。
重要

通过 VPN 路由整个流量可防止主机访问本地网络资源。

先决条件

  • 您可以使用 NetworkManager 1.48.10-5 或更高版本。

流程

  1. 决定您要使用的路由表。以下步骤使用表 75。默认情况下,RHEL 不使用表 1-254,您可以使用其中任何一个。
  2. 配置 VPN 连接配置文件,将 VPN 路由放在专用路由表中:

    # nmcli connection modify <vpn_connection_profile> ipv4.route-table 75 ipv6.route-table 75
    Copy to Clipboard Toggle word wrap
  3. 为您在上一命令中使用的表设置低优先级值:

    # nmcli connection modify <vpn_connection_profile> ipv4.routing-rules "priority 32345 from all table 75" ipv6.routing-rules "priority 32345 from all table 75"
    Copy to Clipboard Toggle word wrap

    优先级值可以是 1 到 32766 之间的任何值。值越低,优先级越高。

  4. 重新连接 VPN 连接:

    # nmcli connection down <vpn_connection_profile>
    # nmcli connection up <vpn_connection_profile>
    Copy to Clipboard Toggle word wrap

验证

  1. 在表 75 中显示 IPv4 路由:

    # ip route show table 75
    ...
    192.0.2.0/24 via 192.0.2.254 dev vpn_device proto static metric 50
    default dev vpn_device proto static scope link metric 50
    Copy to Clipboard Toggle word wrap

    输出确认到远程网络和默认网关路由到路由表 75,因此所有流量都通过隧道路由。如果您在 VPN 连接配置集中设置 ipv4.never-default true,则不会创建默认路由,因此无法在此输出中可见。

  2. 在表 75 中显示 IPv6 路由:

    # ip -6 route show table 75
    ...
    2001:db8:1::/64 dev vpn_device proto kernel metric 50 pref medium
    default dev vpn_device proto static metric 50 pref medium
    Copy to Clipboard Toggle word wrap

    输出确认到远程网络和默认网关路由到路由表 75,因此所有流量都通过隧道路由。如果您在 VPN 连接配置文件中设置了 ipv6.never-default true,则不会创建默认路由,因此在此输出中不可见。

第 9 章 配置 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 层动作。

IP over IP(IPIP)隧道在 OSI 层 3 上运行,并封装 IPv4 数据包中的 IPv4 流量,如 RFC 2003 所述

重要

通过 IPIP 隧道发送的数据没有加密。出于安全考虑,只在已经加密的数据中使用隧道,比如 HTTPS。

请注意,IPIP 隧道只支持单播数据包。如果您需要支持多播的 IPv4 隧道,请参阅 配置 GRE 隧道来封装 IPv4 数据包中的第 3 层流量

例如,您可以在两个 RHEL 路由器之间创建一个 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
      Copy to Clipboard Toggle word wrap

      remotelocal 参数设置远程和本地路由器的公共 IP 地址。

    2. 将 IPv4 地址设为 tun0 设备:

      # nmcli connection modify tun0 ipv4.addresses '10.0.1.1/30'
      Copy to Clipboard Toggle word wrap

      请注意,具有两个可用 IP 地址的 /30 子网足以满足隧道的需要。

    3. tun0 连接配置为使用手动 IPv4 配置:

      # nmcli connection modify tun0 ipv4.method manual
      Copy to Clipboard Toggle word wrap
    4. 添加一个静态路由,其将到 172.16.0.0/24 网络的流量路由到路由器 B 上的隧道 IP:

      # nmcli connection modify tun0 +ipv4.routes "172.16.0.0/24 10.0.1.2"
      Copy to Clipboard Toggle word wrap
    5. 启用 tun0 连接。

      # nmcli connection up tun0
      Copy to Clipboard Toggle word wrap
    6. 启用数据包转发:

      # echo "net.ipv4.ip_forward=1" > /etc/sysctl.d/95-IPv4-forwarding.conf
      # sysctl -p /etc/sysctl.d/95-IPv4-forwarding.conf
      Copy to Clipboard Toggle word wrap
  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
      Copy to Clipboard Toggle word wrap

      remotelocal 参数设置远程和本地路由器的公共 IP 地址。

    2. 将 IPv4 地址设为 tun0 设备:

      # nmcli connection modify tun0 ipv4.addresses '10.0.1.2/30'
      Copy to Clipboard Toggle word wrap
    3. tun0 连接配置为使用手动 IPv4 配置:

      # nmcli connection modify tun0 ipv4.method manual
      Copy to Clipboard Toggle word wrap
    4. 添加一个静态路由,其将路由到 192.0.2.0/24 网络的流量路由到路由器 A 上的隧道 IP:

      # nmcli connection modify tun0 +ipv4.routes "192.0.2.0/24 10.0.1.1"
      Copy to Clipboard Toggle word wrap
    5. 启用 tun0 连接。

      # nmcli connection up tun0
      Copy to Clipboard Toggle word wrap
    6. 启用数据包转发:

      # echo "net.ipv4.ip_forward=1" > /etc/sysctl.d/95-IPv4-forwarding.conf
      # sysctl -p /etc/sysctl.d/95-IPv4-forwarding.conf
      Copy to Clipboard Toggle word wrap

验证

  • 从每个 RHEL 路由器中,ping 路由器的内部接口的 IP 地址:

    1. 在路由器 A 上,ping 172.16.0.1

      # ping 172.16.0.1
      Copy to Clipboard Toggle word wrap
    2. 在路由器 B 上,ping 192.0.2.1

      # ping 192.0.2.1
      Copy to Clipboard Toggle word wrap

Generic Routing Encapsulation(GRE)隧道封装 IPv4 数据包中的第 3 层流量,如 RFC 2784 所述。GRE 隧道可以使用有效的以太网类型封装任何第 3 层协议。

重要

通过 GRE 隧道发送的数据没有加密。出于安全考虑,只在已经加密的数据中使用隧道,比如 HTTPS。

例如,您可以在两个 RHEL 路由器之间创建一个 GRE 隧道来通过互联网连接两个内部子网,如下图所示:

先决条件

  • 每个 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
      Copy to Clipboard Toggle word wrap

      remotelocal 参数设置远程和本地路由器的公共 IP 地址。

      重要

      保留 gre0 设备名称。对该设备使用 gre1 或者不同的名称。

    2. 将 IPv4 地址设为 gre1 设备:

      # nmcli connection modify gre1 ipv4.addresses '10.0.1.1/30'
      Copy to Clipboard Toggle word wrap

      请注意,具有两个可用 IP 地址的 /30 子网足以满足隧道的需要。

    3. gre1 连接配置为使用手动 IPv4 配置:

      # nmcli connection modify gre1 ipv4.method manual
      Copy to Clipboard Toggle word wrap
    4. 添加一个静态路由,其将到 172.16.0.0/24 网络的流量路由到路由器 B 上的隧道 IP:

      # nmcli connection modify gre1 +ipv4.routes "172.16.0.0/24 10.0.1.2"
      Copy to Clipboard Toggle word wrap
    5. 启用 gre1 连接。

      # nmcli connection up gre1
      Copy to Clipboard Toggle word wrap
    6. 启用数据包转发:

      # echo "net.ipv4.ip_forward=1" > /etc/sysctl.d/95-IPv4-forwarding.conf
      # sysctl -p /etc/sysctl.d/95-IPv4-forwarding.conf
      Copy to Clipboard Toggle word wrap
  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
      Copy to Clipboard Toggle word wrap

      remotelocal 参数设置远程和本地路由器的公共 IP 地址。

    2. 将 IPv4 地址设为 gre1 设备:

      # nmcli connection modify gre1 ipv4.addresses '10.0.1.2/30'
      Copy to Clipboard Toggle word wrap
    3. gre1 连接配置为使用手动 IPv4 配置:

      # nmcli connection modify gre1 ipv4.method manual
      Copy to Clipboard Toggle word wrap
    4. 添加一个静态路由,其将路由到 192.0.2.0/24 网络的流量路由到路由器 A 上的隧道 IP:

      # nmcli connection modify gre1 +ipv4.routes "192.0.2.0/24 10.0.1.1"
      Copy to Clipboard Toggle word wrap
    5. 启用 gre1 连接。

      # nmcli connection up gre1
      Copy to Clipboard Toggle word wrap
    6. 启用数据包转发:

      # echo "net.ipv4.ip_forward=1" > /etc/sysctl.d/95-IPv4-forwarding.conf
      # sysctl -p /etc/sysctl.d/95-IPv4-forwarding.conf
      Copy to Clipboard Toggle word wrap

验证

  1. 从每个 RHEL 路由器中,ping 路由器的内部接口的 IP 地址:

    1. 在路由器 A 上,ping 172.16.0.1

      # ping 172.16.0.1
      Copy to Clipboard Toggle word wrap
    2. 在路由器 B 上,ping 192.0.2.1

      # ping 192.0.2.1
      Copy to Clipboard Toggle word wrap

9.3. 配置 GRETAP 隧道来通过 IPv4 传输以太网帧

通用路由封装终端接入点(GRETAP)隧道在 OSI 级别 2 上运行,并封装 IPv4 数据包中的以太网流量,如 RFC 2784 所述。

重要

通过 GRETAP 隧道发送的数据没有加密。出于安全考虑,通过 VPN 或不同的加密连接建立隧道。

例如,您可以在两个 RHEL 路由器之间创建一个 GRETAP 隧道,以使用网桥连接两个网络,如下图所示:

先决条件

  • 每个 RHEL 路由器都有一个网络接口,它连接到其本地网络,接口没有分配 IP 配置。
  • 每个 RHEL 路由器都有一个网络接口,它连接到互联网。

流程

  1. 在网络 A 的 RHEL 路由器上:

    1. 创建名为 bridge0 的网桥接口:

      # nmcli connection add type bridge con-name bridge0 ifname bridge0
      Copy to Clipboard Toggle word wrap
    2. 配置网桥的 IP 设置:

      # nmcli connection modify bridge0 ipv4.addresses '192.0.2.1/24'
      # nmcli connection modify bridge0 ipv4.method manual
      Copy to Clipboard Toggle word wrap
    3. 为连接到本地网络的接口添加新连接配置集到网桥:

      # nmcli connection add type ethernet port-type bridge con-name bridge0-port1 ifname enp1s0 controller bridge0
      Copy to Clipboard Toggle word wrap
    4. 为网桥添加 GRETAP 隧道接口的新连接配置集:

      # nmcli connection add type ip-tunnel ip-tunnel.mode gretap port-type bridge con-name bridge0-port2 ifname gretap1 remote 198.51.100.5 local 203.0.113.10 controller bridge0
      Copy to Clipboard Toggle word wrap

      remotelocal 参数设置远程和本地路由器的公共 IP 地址。

      重要

      保留 gretap0 设备名称。对该设备使用 gretap1 或者不同的名称。

    5. 可选:如果您不需要,STP(Spanning Tree Protocol):

      # nmcli connection modify bridge0 bridge.stp no
      Copy to Clipboard Toggle word wrap

      默认情况下,STP 被启用并导致在使用连接前出现延迟。

    6. 配置激活 bridge0 连接会自动激活网桥端口:

      # nmcli connection modify bridge0 connection.autoconnect-ports 1
      Copy to Clipboard Toggle word wrap
    7. 激活 bridge0 连接:

      # nmcli connection up bridge0
      Copy to Clipboard Toggle word wrap
  2. 在网络 B 中的 RHEL 路由器中:

    1. 创建名为 bridge0 的网桥接口:

      # nmcli connection add type bridge con-name bridge0 ifname bridge0
      Copy to Clipboard Toggle word wrap
    2. 配置网桥的 IP 设置:

      # nmcli connection modify bridge0 ipv4.addresses '192.0.2.2/24'
      # nmcli connection modify bridge0 ipv4.method manual
      Copy to Clipboard Toggle word wrap
    3. 为连接到本地网络的接口添加新连接配置集到网桥:

      # nmcli connection add type ethernet port-type bridge con-name bridge0-port1 ifname enp1s0 controller bridge0
      Copy to Clipboard Toggle word wrap
    4. 为网桥添加 GRETAP 隧道接口的新连接配置集:

      # nmcli connection add type ip-tunnel ip-tunnel.mode gretap port-type bridge con-name bridge0-port2 ifname gretap1 remote 203.0.113.10 local 198.51.100.5 controller bridge0
      Copy to Clipboard Toggle word wrap

      remotelocal 参数设置远程和本地路由器的公共 IP 地址。

    5. 可选:如果您不需要,STP(Spanning Tree Protocol):

      # nmcli connection modify bridge0 bridge.stp no
      Copy to Clipboard Toggle word wrap
    6. 配置激活 bridge0 连接会自动激活网桥端口:

      # nmcli connection modify bridge0 connection.autoconnect-ports 1
      Copy to Clipboard Toggle word wrap
    7. 激活 bridge0 连接:

      # nmcli connection up bridge0
      Copy to Clipboard Toggle word wrap

验证

  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
    Copy to Clipboard Toggle word wrap
  2. 从每个 RHEL 路由器中,ping 路由器的内部接口的 IP 地址:

    1. 在路由器 A 上,ping 192.0.2.2

      # ping 192.0.2.2
      Copy to Clipboard Toggle word wrap
    2. 在路由器 B 上,ping 192.0.2.1

      # ping 192.0.2.1
      Copy to Clipboard Toggle word wrap

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

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

重要

就像正常的第 2 层流量一样,VXLAN 中的数据是不加密的。出于安全考虑,在 VPN 或其他类型的加密连接上使用 VXLAN 。

10.1. VXLAN 的优点

虚拟可扩展局域网(VXLAN)提供了以下主要优点:

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

详情请查看 kernel-doc 软件包提供的 /usr/share/doc/kernel-doc- <kernel_version> /Documentation/networking/vxlan.rst 文件。

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

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

在 RHEL 主机上运行此过程,并相应地调整 IP 地址配置。

先决条件

  • 主机连接到以太网。

流程

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

    # nmcli connection add con-name Example ifname enp1s0 type ethernet
    Copy to Clipboard Toggle word wrap
  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
    Copy to Clipboard Toggle word wrap

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

  3. 激活 Example 连接:

    # nmcli connection up Example
    Copy to Clipboard Toggle word wrap

验证

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

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

    # ping RHEL-host-B.example.com
    Copy to Clipboard Toggle word wrap

    请注意,在该主机上配置网络前,您无法 ping 其他虚拟机主机。

10.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
    Copy to Clipboard Toggle word wrap

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

  2. 创建 VXLAN 接口,并将其附加到 br0

    # nmcli connection add type vxlan port-type bridge con-name br0-vxlan10 ifname vxlan10 id 10 local 198.51.100.2 remote 203.0.113.1 controller br0
    Copy to Clipboard Toggle word wrap

    这个命令使用以下设置:

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

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

  3. 激活 br0 连接配置文件:

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

    # firewall-cmd --permanent --add-port=8472/udp
    # firewall-cmd --reload
    Copy to Clipboard Toggle word wrap

验证

  • 显示转发表:

    # 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
    ...
    Copy to Clipboard Toggle word wrap

要使虚拟机(VM)使用带有附加虚拟可扩展局域网(VXLAN) 的 br0 网桥,首先将虚拟网络添加到使用此网桥的 libvirtd 服务中。

先决条件

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

流程

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

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

    # virsh net-define ~/vxlan10-bridge.xml
    Copy to Clipboard Toggle word wrap
  3. 删除 ~/vxlan10-bridge.xml 文件:

    # rm ~/vxlan10-bridge.xml
    Copy to Clipboard Toggle word wrap
  4. 启动 vxlan10-bridge 虚拟网络:

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

    # virsh net-autostart vxlan10-bridge
    Copy to Clipboard Toggle word wrap

验证

  • 显示虚拟网络列表:

    # virsh net-list
     Name              State    Autostart   Persistent
    ----------------------------------------------------
     vxlan10-bridge    active   yes         yes
     ...
    Copy to Clipboard Toggle word wrap

10.5. 配置虚拟机以使用 VXLAN

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

在 RHEL 主机上执行此流程。

先决条件

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

流程

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

    # virt-install ... --network network:vxlan10-bridge
    Copy to Clipboard Toggle word wrap
  • 要更改现有虚拟机的网络设置:

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

      # virt-xml VM_name --edit --network network=vxlan10-bridge
      Copy to Clipboard Toggle word wrap
    2. 关闭虚拟机,并重新启动它:

      # virsh shutdown VM_name
      # virsh start VM_name
      Copy to Clipboard Toggle word wrap

验证

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

    # virsh domiflist VM_name
     Interface   Type     Source           Model    MAC
    -------------------------------------------------------------------
     vnet1       bridge   vxlan10-bridge   virtio   52:54:00:c5:98:1c
    Copy to Clipboard Toggle word wrap
  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
    Copy to Clipboard Toggle word wrap

    请注意,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))
      Copy to Clipboard Toggle word wrap

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

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

第 11 章 管理 wifi 连接

如果您的主机包含 wifi 适配器,您可以将其连接到 wifi 网络。

  • 使用 nmcli 工具,使用命令行配置连接。
  • 使用 nmtui 应用程序在基于文本的用户界面中配置连接。
  • 使用 GNOME 系统菜单快速连接到不需要任何配置的 wifi 网络。
  • 使用 GNOME Settings 应用程序,使用 GNOME 应用程序配置连接。
  • 使用 nm-connection-editor 应用程序在图形用户界面中配置连接。
  • 使用 network RHEL 系统角色自动化一个或多个主机上连接的配置。

11.1. 支持的 wifi 安全类型

根据 wifi 网络支持的安全类型,您可以或多或少安全地传输数据。

警告

不要连接到不使用加密的网络,或者只支持不安全的 WEP 或 WPA 标准。

RHEL 9 支持以下 wifi 安全类型:

  • None:加密被禁用,数据在网络中以纯文本形式传输。
  • Enhanced Open :使用投机无线加密(OWE),设备会协商唯一对主密钥 (PMK) 以在无线网络中加密连接,而无需身份验证。
  • LEAP :由 Cisco 开发的轻量级可扩展验证协议,是可扩展身份验证协议 (EAP) 的专有版本。
  • WPA & WPA2 Personal :在个人模式中,WPA)和 Wi-Fi Protected Access 2 (WPA2) 验证方法使用预共享密钥。
  • WPA & WPA2 Enterprise :在企业模式中,WPA 和 WPA2 使用 EAP 框架,并对用户进行身份验证以远程身份验证服务 (RADIUS) 服务器。
  • WPA3 Personal - Wi-Fi Protected Access 3(WPA3) Personal 使用 Simultaneous Authentication of Equals (SAE) 而不是预共享密钥 (PSK) 来防止字典攻击。WPA3 使用完美转发保密 (PFS)。

11.2. 使用 nmcli 连接到 wifi 网络

当您第一次使用 nmcli 工具连接到 wifi 网络时,它会自动创建 NetworkManager 连接配置集。然后,您可以修改此配置集以添加特定的设置,如静态 IP 地址。

先决条件

  • 在主机上安装了 wifi 设备。
  • wifi 设备已启用。要进行验证,请使用 nmcli radio 命令。

流程

  1. 如果网络管理器 (NetworkManager) 中禁用了 wifi radio,请启用此功能:

    # nmcli radio wifi on
    Copy to Clipboard Toggle word wrap
  2. 可选:显示可用的 wifi 网络:

    # nmcli device wifi list
    IN-USE  BSSID              SSID          MODE   CHAN  RATE        SIGNAL  BARS  SECURITY
            00:53:00:2F:3B:08  Office        Infra  44    270 Mbit/s  57      ▂▄▆_  WPA2 WPA3
            00:53:00:15:03:BF  --            Infra  1     130 Mbit/s  48      ▂▄__  WPA2 WPA3
    Copy to Clipboard Toggle word wrap

    服务设置标识符 (SSID) 列包含网络的名称。如果列显示 --,则此网络的接入点不会广播 SSID。

  3. 连接到 wifi 网络:

    # nmcli device wifi connect Office --ask
    Password: wifi-password
    Copy to Clipboard Toggle word wrap

    如果您希望在命令中设置密码而不是以交互方式输入密码,请在命令中使用 password <wifi_password> 选项,而不是--ask

    # nmcli device wifi connect Office password <wifi_password>
    Copy to Clipboard Toggle word wrap

    请注意,如果网络需要静态 IP 地址,NetworkManager 无法在此时激活连接。您可以在后续步骤中配置 IP 地址。

  4. 如果网络需要静态 IP 地址:

    1. 配置 IPv4 地址设置,例如:

      # nmcli connection modify Office ipv4.method manual ipv4.addresses 192.0.2.1/24 ipv4.gateway 192.0.2.254 ipv4.dns 192.0.2.200 ipv4.dns-search example.com
      Copy to Clipboard Toggle word wrap
    2. 配置 IPv6 地址设置,例如:

      # nmcli connection modify Office ipv6.method manual ipv6.addresses 2001:db8:1::1/64 ipv6.gateway 2001:db8:1::fffe ipv6.dns 2001:db8:1::ffbb ipv6.dns-search example.com
      Copy to Clipboard Toggle word wrap
  5. 重新激活连接:

    # nmcli connection up Office
    Copy to Clipboard Toggle word wrap

验证

  1. 显示活跃连接:

    # nmcli connection show --active
    NAME    ID                                    TYPE  DEVICE
    Office  2501eb7e-7b16-4dc6-97ef-7cc460139a58  wifi  wlp0s20f3
    Copy to Clipboard Toggle word wrap

    如果输出列出了您创建的 wifi 连接,则连接会活跃。

  2. Ping 主机名或 IP 地址:

    # ping -c 3 example.com
    Copy to Clipboard Toggle word wrap

11.3. 使用 GNOME 系统菜单连接到 wifi 网络

您可以使用 GNOME 系统菜单连接到 wifi 网络。当您第一次连接到网络时,GNOME 会为它创建一个 NetworkManager 连接配置集。如果您将连接配置集配置为不自动连接,也可以使用 GNOME 系统菜单使用现有 NetworkManager 连接配置集手动连接到 wifi 网络。

注意

第一次使用 GNOME 系统菜单建立与 wifi 网络的连接存在某种限制。例如,您无法配置 IP 地址设置。在这种情况下,首先配置连接:

先决条件

  • 在主机上安装了 wifi 设备。
  • wifi 设备已启用。要进行验证,请使用 nmcli radio 命令。

流程

  1. 打开顶栏右侧的系统菜单。
  2. 展开 Wi-Fi Not Connected 条目。
  3. Select Network:

  4. 选择您要连接到的 wifi 网络。
  5. 连接
  6. 如果这是您第一次连接到这个网络,请输入网络的密码,然后点 Connect

验证

  1. 打开顶栏右侧的系统菜单,验证 wifi 网络是否已连接:

    如果网络出现在列表中,它已被连接。

  2. Ping 主机名或 IP 地址:

    # ping -c 3 example.com
    Copy to Clipboard Toggle word wrap

11.4. 使用 GNOME 设置连接到 wifi 网络

您可以使用 GNOME Settings 应用程序(也称为 gnome-control-center )连接到 wifi 网络并配置连接。当您第一次连接到网络时,GNOME 会为它创建一个 NetworkManager 连接配置集。

在 GNOME 设置中,您可以为 RHEL 支持的所有 wifi 网络安全类型配置 wifi 连接。

先决条件

  • 在主机上安装了 wifi 设备。
  • wifi 设备已启用。要进行验证,请使用 nmcli radio 命令。

流程

  1. Super 键,键入 Wi-Fi,然后按 Enter 键。
  2. 点您要连接的 wifi 网络的名称。
  3. 输入网络的密码,点 Connect
  4. 如果网络需要额外的设置,如静态 IP 地址或 WPA2 个人以外的安全类型:

    1. 点网络名称旁边的齿轮图标。
    2. 可选:在 Details 标签页中配置网络配置集无法自动连接。

      如果取消激活这个功能,则必须总是手动连接到网络,例如使用 GNOME 设置或 GNOME 系统菜单。

    3. 在 IPv4 选项卡上配置 IPv4 设置,并在 IPv6 选项卡上配置 IPv6 设置。
    4. Security 选项卡中,选择网络验证,如 WPA3 Personal,然后输入密码。

      根据所选安全性,应用程序会显示其他字段。相应地填充它们。详情请参阅 wifi 网络管理员。

    5. Apply

验证

  1. 打开顶栏右侧的系统菜单,验证 wifi 网络是否已连接:

    如果网络出现在列表中,它已被连接。

  2. Ping 主机名或 IP 地址:

    # ping -c 3 example.com
    Copy to Clipboard Toggle word wrap

11.5. 使用 nmtui 配置 wifi 连接

nmtui 应用程序为 NetworkManager 提供了一个基于文本的用户界面。您可以使用 nmtui 连接到 wifi 网络。

注意

nmtui 中:

  • 使用光标键导航。
  • 选择一个按钮并按 Enter 键。
  • 使用 空格 选择和清除复选框。
  • 要返回上一个屏幕,请使用 ESC

流程

  1. 启动 nmtui

    # nmtui
    Copy to Clipboard Toggle word wrap
  2. 选择 Edit a connection,点 Enter
  3. Add 按钮。
  4. 从网络类型列表中选择 Wi-Fi,然后按 Enter
  5. 可选:为要创建的 NetworkManager 配置集输入一个名称。

    在有多个配置文件的主机上,有意义的名称可以更容易识别配置文件的用途。

  6. SSID 字段中输入 Wi-Fi 网络的名称,即服务集标识符(SSID)。
  7. Mode 字段设为默认值,Client
  8. 选择 Security 字段,按 Enter,然后从列表中设置网络的验证类型。

    根据您选择的验证类型,nmtui 会显示不同的字段。

  9. 填写与验证类型相关的字段。
  10. 如果 Wi-Fi 网络需要静态 IP 地址:

    1. 按协议旁边的 Automatic 按钮,然后从显示的列表中选择 Manual
    2. 按您要配置的协议旁边的 Show 按钮,来显示其他字段并填写它们。
  11. OK 按钮来创建并自动激活新连接。

  12. Back 按钮返回到主菜单。
  13. 选择 Quit,然后按 Enter 键关闭 nmtui 应用程序。

验证

  1. 显示活跃连接:

    # nmcli connection show --active
    NAME    ID                                    TYPE  DEVICE
    Office  2501eb7e-7b16-4dc6-97ef-7cc460139a58  wifi  wlp0s20f3
    Copy to Clipboard Toggle word wrap

    如果输出列出了您创建的 wifi 连接,则连接会活跃。

  2. Ping 主机名或 IP 地址:

    # ping -c 3 example.com
    Copy to Clipboard Toggle word wrap

11.6. 使用 nm-connection-editor 配置 wifi 连接

您可以使用 nm-connection-editor 应用程序为无线网络创建连接配置集。在此应用程序中,您可以配置 RHEL 支持的所有 wifi 网络验证类型。

默认情况下,NetworkManager 为连接配置集启用自动连接功能,并在有可用时自动连接到保存的网络。

前提条件

  • 在主机上安装了 wifi 设备。
  • wifi 设备已启用。要进行验证,请使用 nmcli radio 命令。

流程

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

    # nm-connection-editor
    Copy to Clipboard Toggle word wrap
  2. + 按钮添加新连接。
  3. 选择 Wi-Fi 连接类型,再点 Create
  4. 可选:为连接配置集设置名称。
  5. 可选:在 General 选项卡中配置网络配置集无法自动连接。

    如果取消激活这个功能,则必须总是手动连接到网络,例如使用 GNOME 设置或 GNOME 系统菜单。

  6. Wi-Fi 选项卡中,在 SSID 字段中输入服务设置标识符 (SSID)。
  7. Wi-Fi Security 选项卡中,为网络选择身份验证类型,如 WPA3 Personal,然后输入密码。

    根据所选安全性,应用程序会显示其他字段。相应地填充它们。详情请参阅 wifi 网络管理员。

  8. 在 IPv4 选项卡上配置 IPv4 设置,并在 IPv6 选项卡上配置 IPv6 设置。
  9. 点击 Save
  10. 关闭 Network Connections 窗口。

验证

  1. 打开顶栏右侧的系统菜单,验证 wifi 网络是否已连接:

    如果网络出现在列表中,它已被连接。

  2. Ping 主机名或 IP 地址:

    # ping -c 3 example.com
    Copy to Clipboard Toggle word wrap

您可以使用 nmcli 工具配置客户端来向网络验证其自身。

例如,您可以在现有 NetworkManager wifi 配置集中使用 Microsoft Challenge-Handshake Authentication Protocol 版本 2 (MSCHAPv2)配置 Protected Extensible Authentication Protocol (PEAP)身份验证。

前提条件

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

流程

  1. 将 Wi-Fi 安全模式设为 wpa-eap、将可扩展验证协议(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
    Copy to Clipboard Toggle word wrap

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

  2. 可选:将密码存储在配置中:

    # nmcli connection modify wlp1s0 802-1x.password password
    Copy to Clipboard Toggle word wrap
    重要

    默认情况下,NetworkManager 在 /etc/sysconfig/network-scripts/keys-connection_name 文件中以纯文本形式存储密码,该文件只对 root 用户可读。但是,配置文件中的纯文本密码可能会造成安全风险。

    要提高安全性,请将 802-1x.password-flags 参数设置为 agent-owned。使用这个设置,在具有 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
    Copy to Clipboard Toggle word wrap
    注意

    为安全起见,客户端应验证认证方的证书。

  4. 激活连接配置集:

    # nmcli connection up wlp1s0
    Copy to Clipboard Toggle word wrap

验证

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

通过使用 network RHEL 系统角色,您可以在远程主机上自动设置网络访问控制(NAC)。您可以在 playbook 中为客户端定义身份验证详情,以确保只有授权的客户端才能访问网络。

您可以使用 Ansible playbook 将私钥、证书和 CA 证书复制到客户端,然后使用 network RHEL 系统角色配置具有 802.1X 网络身份验证的连接配置文件。

先决条件

  • 您已准备好控制节点和受管节点
  • 您以可在受管主机上运行 playbook 的用户身份登录到控制节点。
  • 您用于连接到受管节点的帐户对它们具有 sudo 权限。
  • 网络支持 802.1X 网络身份验证。
  • 您已在受管节点上安装了 wpa_supplicant 软件包。
  • DHCP 位于受管节点的网络中。
  • control 节点上存在 TLS 身份验证所需的以下文件:

    • 客户端密钥存储在 /srv/data/client.key 文件中。
    • 客户端证书存储在 /srv/data/client.crt 文件中。
    • CA 证书存储在 /srv/data/ca.crt 文件中。

流程

  1. 将敏感变量存储在加密的文件中:

    1. 创建 vault :

      $ ansible-vault create ~/vault.yml
      New Vault password: <vault_password>
      Confirm New Vault password: <vault_password>
      Copy to Clipboard Toggle word wrap
    2. ansible-vault create 命令打开编辑器后,以 <key>: <value> 格式输入敏感数据:

      pwd: <password>
      Copy to Clipboard Toggle word wrap
    3. 保存更改,并关闭编辑器。Ansible 加密 vault 中的数据。
  2. 创建一个包含以下内容的 playbook 文件,如 ~/playbook.yml

    ---
    - name: Configure a wifi connection with 802.1X authentication
      hosts: managed-node-01.example.com
      tasks:
        - name: Copy client key for 802.1X authentication
          ansible.builtin.copy:
            src: "/srv/data/client.key"
            dest: "/etc/pki/tls/private/client.key"
            mode: 0400
    
        - name: Copy client certificate for 802.1X authentication
          ansible.builtin.copy:
            src: "/srv/data/client.crt"
            dest: "/etc/pki/tls/certs/client.crt"
    
        - name: Copy CA certificate for 802.1X authentication
          ansible.builtin.copy:
            src: "/srv/data/ca.crt"
            dest: "/etc/pki/ca-trust/source/anchors/ca.crt"
    
        - name: Wifi connection profile with dynamic IP address settings and 802.1X
          ansible.builtin.import_role:
            name: redhat.rhel_system_roles.network
          vars:
            network_connections:
              - name: Wifi connection profile with dynamic IP address settings and 802.1X
                interface_name: wlp1s0
                state: up
                type: wireless
                autoconnect: yes
                ip:
                  dhcp4: true
                  auto6: true
                wireless:
                  ssid: "Example-wifi"
                  key_mgmt: "wpa-eap"
                ieee802_1x:
                  identity: <user_name>
                  eap: tls
                  private_key: "/etc/pki/tls/client.key"
                  private_key_password: "{{ pwd }}"
                  private_key_password_flags: none
                  client_cert: "/etc/pki/tls/client.pem"
                  ca_cert: "/etc/pki/tls/cacert.pem"
                  domain_suffix_match: "example.com"
    Copy to Clipboard Toggle word wrap

    示例 playbook 中指定的设置包括如下:

    ieee802_1x
    此变量包含与 802.1X 相关的设置。
    eap: tls
    将配置文件配置为对可扩展身份验证协议(EAP)使用基于证书的 TLS 身份验证方法。

    有关 playbook 中使用的所有变量的详情,请查看控制节点上的 /usr/share/ansible/roles/rhel-system-roles.network/README.md 文件。

  3. 验证 playbook 语法:

    $ ansible-playbook --ask-vault-pass --syntax-check ~/playbook.yml
    Copy to Clipboard Toggle word wrap

    请注意,这个命令只验证语法,不能防止错误的、但有效的配置。

  4. 运行 playbook:

    $ ansible-playbook --ask-vault-pass ~/playbook.yml
    Copy to Clipboard Toggle word wrap

在具有 wifi 设备的主机上,您可以使用 NetworkManager 将这个主机配置为接入点。无线客户端可以使用预共享密钥(PSK)连接到访问点,并在 RHEL 主机和网络中使用服务。

当您配置接入点时,NetworkManager 会自动:

  • 配置 dnsmasq 服务来为客户端提供 DHCP 和 DNS 服务
  • 启用 IP 转发
  • 添加 nftables 防火墙规则来伪装来自 wifi 设备的流量并配置 IP 转发

前提条件

  • wifi 设备支持在接入点模式下运行。
  • wifi 设备没有使用。
  • 主机可以访问互联网。

流程

  1. 列出 wifi 设备来识别应提供访问点的 wifi 设备:

    # nmcli device status | grep wifi
    wlp0s20f3    wifi   disconnected    --
    Copy to Clipboard Toggle word wrap
  2. 验证该设备是否支持访问点模式:

    # nmcli -f WIFI-PROPERTIES.AP device show wlp0s20f3
    WIFI-PROPERTIES.AP:     yes
    Copy to Clipboard Toggle word wrap

    要使用 wifi 设备作为接入点,该设备必须支持此功能。

  3. 安装 dnsmasqNetworkManager-wifi 软件包:

    # dnf install dnsmasq NetworkManager-wifi
    Copy to Clipboard Toggle word wrap

    NetworkManager 使用 dnsmasq 服务为访问点的客户端提供 DHCP 和 DNS 服务。

  4. 创建初始访问点配置:

    # nmcli device wifi hotspot ifname wlp0s20f3 con-name Example-Hotspot ssid Example-Hotspot password "password"
    Copy to Clipboard Toggle word wrap

    此命令在 wlp0s20f3 设备(提供 WPA2 和 WPA3 个人访问令牌)上创建一个连接配置集。无线网络的名称,Service Set Identifier (SSID) 是 Example-Hotspot,并使用预共享密钥 密码

  5. 可选:将访问点配置为只支持 WPA3:

    # nmcli connection modify Example-Hotspot 802-11-wireless-security.key-mgmt sae
    Copy to Clipboard Toggle word wrap
  6. 默认情况下,NetworkManager 使用 IP 地址 10.42.0.1 作为 wifi 设备,并将剩余的 10.42.0.0/24 子网的 IP 地址分配给客户端。要配置不同的子网和 IP 地址,请输入:

    # nmcli connection modify Example-Hotspot ipv4.addresses 192.0.2.254/24
    Copy to Clipboard Toggle word wrap

    您设置的 IP 地址(本例中为 192.0.2.254 )是 NetworkManager 分配给 wifi 设备的 IP 地址。客户端将此 IP 地址用作默认网关和 DNS 服务器。

  7. 激活连接配置集:

    # nmcli connection up Example-Hotspot
    Copy to Clipboard Toggle word wrap

验证

  1. 在服务器中:

    1. 验证 NetworkManager 是否启动了 dnsmasq 服务,并且服务侦听端口 67 (DHCP) 和 53 (DNS):

      # ss -tulpn | grep -E ":53|:67"
      udp   UNCONN 0  0   10.42.0.1:53    0.0.0.0:*    users:(("dnsmasq",pid=55905,fd=6))
      udp   UNCONN 0  0     0.0.0.0:67    0.0.0.0:*    users:(("dnsmasq",pid=55905,fd=4))
      tcp   LISTEN 0  32  10.42.0.1:53    0.0.0.0:*    users:(("dnsmasq",pid=55905,fd=7))
      Copy to Clipboard Toggle word wrap
    2. 显示 nftables 规则集,以确保 NetworkManager 为来自 10.42.0.0/24 子网的流量启用转发和伪装:

      # nft list ruleset
      table ip nm-shared-wlp0s20f3 {
          chain nat_postrouting {
              type nat hook postrouting priority srcnat; policy accept;
              ip saddr 10.42.0.0/24 ip daddr != 10.42.0.0/24 masquerade
          }
      
          chain filter_forward {
              type filter hook forward priority filter; policy accept;
              ip daddr 10.42.0.0/24 oifname "wlp0s20f3" ct state { established, related } accept
              ip saddr 10.42.0.0/24 iifname "wlp0s20f3" accept
              iifname "wlp0s20f3" oifname "wlp0s20f3" accept
              iifname "wlp0s20f3" reject
              oifname "wlp0s20f3" reject
          }
      }
      Copy to Clipboard Toggle word wrap
  2. 在带有 wifi 适配器的客户端中:

    1. 显示可用网络列表:

      # nmcli device wifi
      IN-USE  BSSID              SSID             MODE   CHAN  RATE      SIGNAL  BARS  SECURITY
              00:53:00:88:29:04  Example-Hotspot  Infra  11    130 Mbit/s  62      ▂▄▆_  WPA3
      ...
      Copy to Clipboard Toggle word wrap
    2. 连接到 Example-Hotspot 无线网络。请参阅管理 Wi-Fi 连接
    3. 对远程网络或互联网中的主机发出 ping 以验证连接是否正常工作:

      # ping -c 3 www.redhat.com
      Copy to Clipboard Toggle word wrap

MACsec 保护设备间的点对点通信。例如,您可以在通过 Metro-Ethernet 连接连接分支和中央办公室的两个主机上配置 MACsec,以提高安全性。

13.1. MACsec 如何提高安全性

介质访问控制安全(MACsec)是一个第 2 层协议,用于加密和验证所有 LAN 流量。它使用预共享密钥来建立连接。要更改这个密钥,您必须更新所有使用 MACsec 的主机上的 NetworkManager 配置。

MACsec 保护以太网链路的不同流量类型,包括:

  • 动态主机配置协议(DHCP)
  • 地址解析协议(ARP)
  • IPv4 和 IPv6 流量
  • 任何通过 IP 的流量,如 TCP 或 UDP

MACsec 连接使用yige 以太网设备,如以太网网卡、VLAN 或隧道设备作为父设备。您只能在 MACsec 设备上设置 IP 配置,以便只使用加密连接与其他主机进行通信,或者在父设备上设置 IP 配置。在后者的情况下,您可以使用父设备使用未加密连接和 MACsec 设备加密连接与其他主机通信。

macsec 不需要任何特殊硬件。例如,您可以使用任何交换机,除非您只想在主机和交换机之间加密流量。在这种情况下,交换机还必须支持 MACsec。

换句话说,您可以为两种常见场景配置 MACsec:

  • host-to-host
  • host-to-switch 和 switch-to-other-hosts
重要

您只能在位于同一物理或虚拟 LAN 的主机之间使用 MACsec。

使用 MACsec 安全标准保护链路层的通信,也称为 Open Systems Interconnection (OSI)模型的第 2 层,提供以下显著优点:

  • 第 2 层的加密消除了在第 7 层加密单个服务的需要。这减少了管理与每个主机上每个端点的大量证书关联的开销。
  • 直接连接的网络设备(如路由器和交换机)之间的点对点安全性。
  • 不需要对应用程序和高层协议进行更改。

13.2. 使用 nmcli 配置 MACsec 连接

您可以使用 nmcli 工具将以太网接口配置为使用 MACsec。例如,您可以在通过以太网连接的两个主机之间创建一个 MACsec 连接。

流程

  1. 在配置 MACsec 的第一个主机上:

    • 为预共享密钥创建连接关联密钥(CAK)和连接关联密钥名称(CKN):

      1. 创建一个 16 字节的十六进制 CAK:

        # dd if=/dev/urandom count=16 bs=1 2> /dev/null | hexdump -e '1/2 "%04x"'
        50b71a8ef0bd5751ea76de6d6c98c03a
        Copy to Clipboard Toggle word wrap
      2. 创建一个 32 字节的十六进制 CKN:

        # dd if=/dev/urandom count=32 bs=1 2> /dev/null | hexdump -e '1/2 "%04x"'
        f2b4297d39da7330910a74abc0449feb45b5c0b9fc23df1430e1898fcf1c4550
        Copy to Clipboard Toggle word wrap
  2. 在您要通过 MACsec 连接连接的两个主机上:
  3. 创建 MACsec 连接:

    # nmcli connection add type macsec con-name macsec0 ifname macsec0 connection.autoconnect yes macsec.parent enp1s0 macsec.mode psk macsec.mka-cak 50b71a8ef0bd5751ea76de6d6c98c03a macsec.mka-ckn f2b4297d39da7330910a74abc0449feb45b5c0b9fc23df1430e1898fcf1c4550
    Copy to Clipboard Toggle word wrap

    macsec.mka-cakmacsec.mka-ckn 参数中使用上一步生成的 CAK 和 CKN。在 MACsec-protected 网络的每个主机上,这些值必须相同。

  4. 配置 MACsec 连接中的 IP 设置。

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

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

      # nmcli connection modify macsec0 ipv6.method manual ipv6.addresses '2001:db8:1::1/32' ipv6.gateway '2001:db8:1::fffe' ipv6.dns '2001:db8:1::fffd'
      Copy to Clipboard Toggle word wrap
  5. 激活连接:

    # nmcli connection up macsec0
    Copy to Clipboard Toggle word wrap

验证

  1. 验证流量是否加密:

    # tcpdump -nn -i enp1s0
    Copy to Clipboard Toggle word wrap
  2. 可选:显示未加密的流量:

    # tcpdump -nn -i macsec0
    Copy to Clipboard Toggle word wrap
  3. 显示 MACsec 统计信息:

    # ip macsec show
    Copy to Clipboard Toggle word wrap
  4. 显示每种保护类型的单独的计数器:仅完整性(关闭加密)和加密(打开加密)

    # ip -s macsec show
    Copy to Clipboard Toggle word wrap

13.3. 使用 nmstatectl 配置 MACsec 连接

您可以使用声明性 Nmstate API 将以太网接口配置为使用 MACsec。nmstate 可确保结果与配置文件匹配或回滚更改。

先决条件

  • 服务器配置中存在一个物理或虚拟以太网网络接口控制器(NIC)。
  • nmstate 软件包已安装。

流程

  1. 在您配置 MACsec 的第一个主机上,为预共享密钥创建连接关联密钥(CAK)和连接关联密钥名称(CKN):

    1. 创建一个 16 字节的十六进制 CAK:

      # dd if=/dev/urandom count=16 bs=1 2> /dev/null | hexdump -e '1/2 "%04x"'
      50b71a8ef0bd5751ea76de6d6c98c03a
      Copy to Clipboard Toggle word wrap
    2. 创建一个 32 字节的十六进制 CKN:

      # dd if=/dev/urandom count=32 bs=1 2> /dev/null | hexdump -e '1/2 "%04x"'
      f2b4297d39da7330910a74abc0449feb45b5c0b9fc23df1430e1898fcf1c4550
      Copy to Clipboard Toggle word wrap
  2. 在您要通过 MACsec 连接连接的两个主机上,完成以下步骤:

    1. 使用以下设置创建一个 YAML 文件,如 create-macsec-connection.yml

      ---
      routes:
        config:
        - destination: 0.0.0.0/0
          next-hop-interface: macsec0
          next-hop-address: 192.0.2.2
          table-id: 254
        - destination: 192.0.2.2/32
          next-hop-interface: macsec0
          next-hop-address: 0.0.0.0
          table-id: 254
      dns-resolver:
        config:
          search:
          - example.com
          server:
          - 192.0.2.200
          - 2001:db8:1::ffbb
      interfaces:
      - name: macsec0
        type: macsec
        state: up
        ipv4:
          enabled: true
          address:
          - ip: 192.0.2.1
            prefix-length: 32
        ipv6:
          enabled: true
          address:
          - ip: 2001:db8:1::1
            prefix-length: 64
        macsec:
          encrypt: true
          base-iface: enp0s1
          mka-cak: 50b71a8ef0bd5751ea76de6d6c98c03a
          mka-ckn: f2b4297d39da7330910a74abc0449feb45b5c0b9fc23df1430e1898fcf1c4550
          port: 0
          validation: strict
          send-sci: true
      Copy to Clipboard Toggle word wrap
    2. mka-cakmka-ckn 参数中使用上一步中生成的 CAK 和 CKN。在 MACsec-protected 网络的每个主机上,这些值必须相同。
    3. 可选:在同一 YAML 配置文件中,您还可以配置以下设置:

      • 静态 IPv4 地址 - 192.0.2.1,子网掩码为 /32
      • 静态 IPv6 地址 - 2001:db8:1::1,子网掩码为 /64
      • IPv4 默认网关 - 192.0.2.2
      • IPv4 DNS 服务器 - 192.0.2.200
      • IPv6 DNS 服务器 - 2001:db8:1::ffbb
      • DNS 搜索域 - example.com
  3. 将设置应用到系统:

    # nmstatectl apply create-macsec-connection.yml
    Copy to Clipboard Toggle word wrap

验证

  1. 以 YAML 格式显示当前状态:

    # nmstatectl show macsec0
    Copy to Clipboard Toggle word wrap
  2. 验证流量是否加密:

    # tcpdump -nn -i enp0s1
    Copy to Clipboard Toggle word wrap
  3. 可选:显示未加密的流量:

    # tcpdump -nn -i macsec0
    Copy to Clipboard Toggle word wrap
  4. 显示 MACsec 统计信息:

    # ip macsec show
    Copy to Clipboard Toggle word wrap
  5. 显示每种保护类型的单独的计数器:仅完整性(关闭加密)和加密(打开加密)

    # ip -s macsec show
    Copy to Clipboard Toggle word wrap

第 14 章 开始使用 IPVLAN

IPVLAN 是虚拟网络设备的驱动程序,可在容器环境中用于访问主机网络。IPVLAN 会将一个 MAC 地址公开给外部网络,而不管主机网络中所创建的 IPVLAN 设备的数量。这意味着,用户可以在多个容器中有多个 IPVLAN 设备,相应的交换机会读取单个 MAC 地址。当本地交换机对它可管理的 MAC 地址的总数施加约束时,IPVLAN 驱动程序很有用。

14.1. IPVLAN 模式

IPVLAN 有以下模式可用:

  • L2 模式

    在 IPVLAN L2 模式 中,虚拟设备接收并响应地址解析协议(ARP)请求。netfilter 框架仅在拥有虚拟设备的容器中运行。容器化流量的默认命名空间中不会执行 netfilter 链。使用L2 模式会提供良好的性能,但对网络流量的控制要小。

  • L3 模式

    L3 模式 中,虚拟设备只处理 L3 以上的流量。虚拟设备不响应 ARP 请求,用户必须手动为相关点上的 IPVLAN IP 地址配置邻居条目。相关容器的出口流量位于默认命名空间中的 netfilter POSTROUTING 和 OUTPUT 链上,而入口流量以与 L2 模式 相同的方式被线程化。使用L3 模式会提供很好的控制,但可能会降低网络流量性能。

  • L3S 模式

    L3S 模式 中,虚拟设备处理方式与 L3 模式 中的处理方式相同,但相关容器的出口和入口流量都位于默认命名空间中的 netfilter 链上。L3S 模式 的行为方式和 L3 模式 相似,但提供了对网络的更大控制。

注意

对于 L3L3S 模式,IPVLAN 虚拟设备不接收广播和多播流量。

14.2. IPVLAN 和 MACVLAN 的比较

下表显示了 MACVLAN 和 IPVLAN 之间的主要区别:

Expand
MACVLANIPVLAN

为每个 MACVLAN 设备使用 MAC 地址。

请注意,如果交换机达到了其 MAC 表中可以存储的最大 MAC 地址数,则连接可能会丢失。

使用不限制 IPVLAN 设备数的单个 MAC 地址。

全局命名空间的 Netfilter 规则不会影响子命名空间中到 MACVLAN 设备或来自 MACVLAN 设备的流量。

可以在 L3 mode L3S mode 下控制到 IPVLAN 设备或来自 IPVLAN 设备的流量。

IPVLAN 和 MACVLAN 不需要任何级别的封装。

14.3. 使用 iproute2 创建和配置 IPVLAN 设备

此流程演示了如何使用 iproute2 设置 IPVLAN 设备。

流程

  1. 要创建 IPVLAN 设备,请输入以下命令:

    # ip link add link <real_nic_device> name <ipvlan_device> type ipvlan mode l2
    Copy to Clipboard Toggle word wrap

    请注意:网络接口控制器(NIC)是将计算机连接到网络的一个硬件组件。

  2. 要给接口分配 IPv4IPv6 地址,请输入以下命令:

    # ip addr add dev <ipvlan_device> <ip_address/subnet_mask_prefix>
    Copy to Clipboard Toggle word wrap
  3. 如果在 L3 模式L3S 模式中配置 IPVLAN 设备,请进行以下设置:

    1. 在远程主机上为远程 peer 配置邻居设置:

      # ip neigh add dev <peer_device> <ipvlan_device_IP_address> lladdr <mac_address>
      Copy to Clipboard Toggle word wrap

      其中 MAC_address 是 IPVLAN 设备所基于的实际网卡的 MAC 地址。

    2. 使用以下命令为 L3 模式 配置 IPVLAN 设备:

      # ip route add dev <real_nic_device> <peer_ip_address/32>
      Copy to Clipboard Toggle word wrap

      对于 L3S 模式

      # ip route add dev <real_nic_device> <peer_ip_address>/32
      Copy to Clipboard Toggle word wrap

      其中 IP-address 代表远程 peer 的地址。

  4. 要设置活跃的 IPVLAN 设备,请输入以下命令:

    # ip link set dev <ipvlan_device> up
    Copy to Clipboard Toggle word wrap
  5. 要检查 IPVLAN 设备是否活跃,请在远程主机中执行以下命令:

    # ping <IP_address>
    Copy to Clipboard Toggle word wrap

    其中 IP_address 使用 IPVLAN 设备的 IP 地址。

配置 connection.ip-ping-addressesconnection.ip-ping-timeout 设置,以验证到特定目标的连接。

NetworkManager 服务在系统引导后启动。某些服务(如网络文件系统(NFS))依赖于网络连接性。如果网关 IP 或目标 IP 地址未返回响应,则 NFS 无法挂载,因为它无法连接到其目的地,因为网络没有完全启动并运行。因此,您可以配置 connection.ip-ping-addressesconnection.ip-ping-timeout 设置,以验证到特定目标的连接性,以避免这样的问题。connection.ip-ping-addresses 设置支持配置 IPv4 和 IPv6 地址。

流程

  1. 如果不存在,请创建连接配置文件。例如,要为分配了动态 IP 地址的 enp1s0 接口创建配置文件,请输入:

    # nmcli connection add con-name enp1s0 ifname enp1s0 type ethernet
    Copy to Clipboard Toggle word wrap
    注意

    配置 connection.ip-ping-addresses 可能导致 systemdnetwork-online 目标服务的响应延迟,因为要等待 ping 操作完成或超时。

  2. 配置连接,以 ping 定义了超时的指定的 IP 地址:

    # nmcli connection modify enp1s0 connection.ip-ping-addresses "192.0.2.56, 192.0.2.60" connection.ip-ping-timeout 10 ipv4.may-fail no
    Copy to Clipboard Toggle word wrap

    ipv4.may-fail 属性设置为 no,确保 IPv4 配置必须成功完成。

  3. 重新激活连接:

    # nmcli connection up enp1s0
    Copy to Clipboard Toggle word wrap

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

默认情况下,NetworkManager 管理除 /usr/lib/udev/rules.d/85-nm-unmanaged.rules 文件中描述的之外的所有设备。要忽略某些其他设备,您可以在 NetworkManager 中将它们配置为 unmanaged

您可以根据以下条件 将设备配置为非受管,如接口名称或 MAC 地址。如果您使用配置中的 device 部分将设备设置为 unmanaged,则 NetworkManager 不会管理该设备,直到您开始在连接配置文件中使用它。

流程

  1. 可选:显示要识别设备的设备列表或您要设置为 unmanaged 的设备的 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 52:54:00:74:79:56 brd ff:ff:ff:ff:ff:ff
    ...
    Copy to Clipboard Toggle word wrap
  2. /etc/NetworkManager/conf.d/ 目录中创建一个 *.conf 文件,例如 /etc/NetworkManager/conf.d/99-unmanaged-devices.conf
  3. 对于您要配置为 unmanaged 的每个设备,请向文件中添加一个带有唯一名称的部分。

    重要

    该部分的名称必须以 device- 开头。

    • 要将特定接口配置为 unmanaged,请添加:

      [device-enp1s0-unmanaged]
      match-device=interface-name:enp1s0
      managed=0
      Copy to Clipboard Toggle word wrap
    • 要将具有特定 MAC 地址的设备配置为 unmanaged,请添加:

      [device-mac525400747956-unmanaged]
      match-device=mac:52:54:00:74:79:56
      managed=0
      Copy to Clipboard Toggle word wrap
    • 要将特定类型的所有设备配置为 unmanaged,请添加:

      [device-ethernet-unmanaged]
      match-device=type:ethernet
      managed=0
      Copy to Clipboard Toggle word wrap
    • 要将多个设备设置为非受管设备,请使用分号在 unmanaged-devices 参数中分隔条目,例如:

      [device-multiple-devices-unmanaged]
      match-device=interface-name:enp1s0;interface-name:enp7s0
      managed=0
      Copy to Clipboard Toggle word wrap

      另外,您可以为此文件中的每个设备添加单独的部分,或者在 /etc/NetworkManager/conf.d/ 目录中创建额外的 *.conf 文件。

  4. 重启主机系统:

    # reboot
    Copy to Clipboard Toggle word wrap

验证

  • 显示设备列表:

    # nmcli device status
    DEVICE  TYPE      STATE      CONNECTION
    enp1s0  ethernet  unmanaged  --
    ...
    Copy to Clipboard Toggle word wrap

    enp1s0 设备旁边的 unmanaged 状态表示 NetworkManager 没有管理该设备。

故障排除

  • 如果 nmcli device status 命令的输出没有将设备列为 unmanaged,则显示 NetworkManager 配置:

    # NetworkManager --print-config
    ...
    [device-enp1s0-unmanaged]
    match-device=interface-name:enp1s0
    managed=0
    ...
    Copy to Clipboard Toggle word wrap

    如果输出与您配置的设置不匹配,请确保没有优先级较高的配置文件覆盖了您的设置。有关 NetworkManager 如何合并多个配置文件的详情,请查看您系统上的 NetworkManager.conf (5) 手册页。

您可以临时将设备配置为 unmanaged ,例如,出于测试目的。这个更改会保留重新加载并重启 NetworkManager systemd 服务,而不是系统重启。

流程

  1. 可选:显示设备列表,以便识别您要将其设置为 unmanaged 的设备:

    # nmcli device status
    DEVICE  TYPE      STATE         CONNECTION
    enp1s0  ethernet  disconnected  --
    ...
    Copy to Clipboard Toggle word wrap
  2. enp1s0 设备设置为 unmanaged 状态:

    # nmcli device set enp1s0 managed no
    Copy to Clipboard Toggle word wrap

验证

  • 显示设备列表:

    # nmcli device status
    DEVICE  TYPE      STATE      CONNECTION
    enp1s0  ethernet  unmanaged  --
    ...
    Copy to Clipboard Toggle word wrap

    enp1s0 设备旁边的 unmanaged 状态表示 NetworkManager 没有管理该设备。

除了每个网络设备的状态外,NetworkManager 还跟踪设备为什么处于当前状态。您可以使用此功能来识别 NetworkManager 为什么没有管理某些设备。

流程

  • 显示所有网络设备的状态及其原因:

    # nmcli -f GENERAL.DEVICE,GENERAL.STATE,GENERAL.REASON device show
    Copy to Clipboard Toggle word wrap

    如果您将设备名称传给命令,则只能显示指定设备的输出。

    输出示例:

    GENERAL.DEVICE:    enp1s0
    GENERAL.STATE:     10 (unmanaged)
    GENERAL.REASON:    75 (The device is unmanaged by explicit user decision (e.g. 'nmcli device set $DEV managed no'))
    
    GENERAL.DEVICE:    enp7s0
    GENERAL.STATE:     10 (unmanaged)
    GENERAL.REASON:    74 (The device is unmanaged by user decision in NetworkManager.conf ('unmanaged' in a [device*] section)
    
    GENERAL.DEVICE:    veth3
    GENERAL.STATE:     10 (unmanaged)
    GENERAL.REASON:    77 (The device is unmanaged via udev rule)
    Copy to Clipboard Toggle word wrap
    注意

    请注意,命令返回所有设备的状态,无论它们是否是 managed 还是 unmanaged。

第 17 章 使用 nmcli 配置回环接口

默认情况下,NetworkManager 不管理回环(lo)接口。为 lo 接口创建连接配置文件后,您可以使用 NetworkManager 配置这个设备。

当用户想要配置回环接口时的一些示例如下:

  • lo 接口分配额外的 IP 地址
  • 定义 DNS 地址
  • 更改 lo 接口的最大传输单元(MTU)大小

流程

  1. 创建一个新的类型 loopback

    # nmcli connection add con-name example-loopback type loopback
    Copy to Clipboard Toggle word wrap
  2. 配置自定义连接设置,例如:

    1. 要为接口分配额外的 IP 地址,请输入:

      # nmcli connection modify example-loopback +ipv4.addresses 192.0.2.1/24
      Copy to Clipboard Toggle word wrap
      注意

      NetworkManager 通过始终分配重启后仍保留的 IP 地址 127.0.0.1::1 来管理 lo 接口。您不能覆盖 127.0.0.1::1。但是,您可以为接口分配额外的 IP 地址。

    2. 要设置自定义最大传输单元(MTU),请输入:

      # nmcli con mod example-loopback loopback.mtu 16384
      Copy to Clipboard Toggle word wrap
    3. 要为您的 DNS 服务器设置 IP 地址,请输入:

      # nmcli connection modify example-loopback ipv4.dns 192.0.2.0
      Copy to Clipboard Toggle word wrap

      如果您在 loopback 连接配置文件中设置了一个 DNS 服务器,则此条目总是在 /etc/resolv.conf 文件中。DNS 服务器条目保持独立,无论主机是否在不同网络之间漫游。

  3. 激活连接:

    # nmcli connection up example-loopback
    Copy to Clipboard Toggle word wrap

验证

  1. 显示 lo 接口的设置:

    # ip address show lo
    
    1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16384 qdisc noqueue state UNKNOWN group default qlen 1000
    
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet 192.0.2.1/24 brd 192.0.2.255 scope global lo valid_lft forever preferred_lft forever
    
    inet6 ::1/128 scope host
    valid_lft forever preferred_lft forever
    Copy to Clipboard Toggle word wrap
  2. 验证 DNS 地址:

    # cat /etc/resolv.conf
    ...
    nameserver 192.0.2.0
    ...
    Copy to Clipboard Toggle word wrap

第 18 章 创建一个虚拟接口

作为 Red Hat Enterprise Linux 用户,您可以创建并使用虚拟网络接口进行调试和测试。虚拟接口提供一个设备来路由数据包而无需实际传送数据包。它可让您创建使用网络管理器(NetworkManager)管理的其他回送设备,使不活跃 SLIP(Serial Line Internet Protocol)地址类似本地程序的实际地址。

您可以创建一个带有各种设置的虚拟接口,如 IPv4 和 IPv6 地址。创建接口后,NetworkManager 会自动将其分配给默认的 公共 firewalld 区域。

流程

  • 创建一个具有静态 IPv4 和 IPv6 地址,名为 dummy0 的伪接口:

    # 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
    Copy to Clipboard Toggle word wrap
    注意

    要配置没有 IPv4 和 IPv6 地址的伪接口,请将 ipv4.methodipv6.method 参数设置为 disabled。否则,IP 自动配置将失败,NetworkManager 会停用连接,并删除设备。

验证

  • 列出连接配置文件:

    # nmcli connection show
    NAME            UUID                                  TYPE     DEVICE
    dummy-dummy0    aaf6eb56-73e5-4746-9037-eed42caa8a65  dummy    dummy0
    Copy to Clipboard Toggle word wrap

在使用 NetworkManager 来管理网络接口的系统上,如果网络只使用 IPv4,您可以禁用 IPv6 协议。如果您禁用了 IPv6,NetworkManager 会自动在内核中设置相应的 sysctl 值。

注意

如果使用内核可调参数或内核引导参数禁用 IPv6,则必须额外考虑系统配置。如需更多信息,请参阅红帽知识库解决方案 如何在 RHEL 中禁用或启用 IPv6 协议

19.1. 使用 nmcli 禁用连接上的 IPv6

您可以使用 nmcli 工具在命令行上禁用 IPv6 协议。

前提条件

  • 系统使用 NetworkManager 来管理网络接口。

流程

  1. 可选:显示网络连接的列表:

    # nmcli connection show
    NAME    UUID                                  TYPE      DEVICE
    Example 7a7e0151-9c18-4e6f-89ee-65bb2d64d365  ethernet  enp1s0
    ...
    Copy to Clipboard Toggle word wrap
  2. 将连接的 ipv6.method 参数设为 disabled

    # nmcli connection modify Example ipv6.method "disabled"
    Copy to Clipboard Toggle word wrap
  3. 重启网络连接:

    # nmcli connection up Example
    Copy to Clipboard Toggle word wrap

验证

  1. 显示设备的 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
    Copy to Clipboard Toggle word wrap

    如果没有显示 inet6 条目,则 IPv6 在该设备上被禁用。

  2. 验证 /proc/sys/net/ipv6/conf/enp1s0/disable_ipv6 文件现在是否包含值 1

    # cat /proc/sys/net/ipv6/conf/enp1s0/disable_ipv6
    1
    Copy to Clipboard Toggle word wrap

    1 表示针对该设备禁用 IPv6

第 20 章 更改主机名

系统的主机名是系统本身的名称。您可在安装 RHEL 时设置名称,之后可以更改它。

20.1. 使用 nmcli 更改主机名

您可以使用 nmcli 工具更新系统主机名。请注意,其他工具可能会使用不同的术语,如静态或持久主机名。

流程

  1. 可选:显示当前主机名设置:

    # nmcli general hostname
    old-hostname.example.com
    Copy to Clipboard Toggle word wrap
  2. 设置新主机名:

    # nmcli general hostname new-hostname.example.com
    Copy to Clipboard Toggle word wrap
  3. NetworkManager 自动重启 systemd-hostnamed 来激活新主机名。要使更改生效,请重启主机:

    # reboot
    Copy to Clipboard Toggle word wrap

    或者,如果您知道哪个服务使用主机名:

    1. 重启在服务启动时仅读取主机名的所有服务:

      # systemctl restart <service_name>
      Copy to Clipboard Toggle word wrap
    2. 活跃的 shell 用户必须重新登录才能使更改生效。

验证

  • 显示主机名:

    # nmcli general hostname
    new-hostname.example.com
    Copy to Clipboard Toggle word wrap

20.2. 使用 hostnamectl更改主机名

您可以使用 hostnamectl 工具更新主机名。

默认情况下,hostname ctl 设置以下主机名类型:

  • 静态主机名:存储在 /etc/hostname 文件中。通常,服务使用此名称作为主机名。
  • 用户友善的主机名:一个描述性名称,如 数据中心 A 中的代理服务器
  • 临时主机名:通常从网络配置接收的回退值。

流程

  1. 可选:显示当前主机名设置:

    # hostnamectl status --static
    old-hostname.example.com
    Copy to Clipboard Toggle word wrap
  2. 设置新主机名:

    # hostnamectl set-hostname new-hostname.example.com
    Copy to Clipboard Toggle word wrap

    这个命令将静态和临时主机名设置为新值。要只设置一个特定类型,请将 --static--pretty--transient 选项传给命令。

  3. hostnamectl 工具自动重启 systemd-hostnamed 来激活新主机名。要使更改生效,请重启主机:

    # reboot
    Copy to Clipboard Toggle word wrap

    或者,如果您知道哪个服务使用主机名:

    1. 重启在服务启动时仅读取主机名的所有服务:

      # systemctl restart <service_name>
      Copy to Clipboard Toggle word wrap
    2. 活跃的 shell 用户必须重新登录才能使更改生效。

验证

  • 显示主机名:

    # hostnamectl status --static
    new-hostname.example.com
    Copy to Clipboard Toggle word wrap

第 21 章 配置 NetworkManager DHCP 设置

NetworkManager 提供与 DHCP 相关的不同的配置选项。例如,您可以将 NetworkManager 配置为使用内置的 DHCP 客户端(默认)或外部客户端,您可以影响单个配置文件的 DHCP 设置。

21.1. 更改 NetworkManager 的 DHCP 客户端

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

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

流程

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

    [main]
    dhcp=dhclient
    Copy to Clipboard Toggle word wrap

    您可以对 internal (默认)或 dhclient 设置 dhcp 参数。

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

    # dnf install dhcp-client
    Copy to Clipboard Toggle word wrap
  3. 重启 NetworkManager:

    # systemctl restart NetworkManager
    Copy to Clipboard Toggle word wrap

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

验证

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

    Apr 26 09:54:19 server NetworkManager[27748]: <info>  [1650959659.8483] dhcp-init: Using DHCP client 'dhclient'
    Copy to Clipboard Toggle word wrap

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

21.2. 配置 NetworkManager 连接的 DHCP 超时行为

在使用 DHCP 的连接配置文件中,NetworkManager 默认等待 45 秒,以便 DHCP 请求完成。您可以自定义与超时相关的设置,以便将连接配置集调整为您的环境。

先决条件

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

流程

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

    # nmcli connection modify <connection_name> ipv4.dhcp-timeout 30 ipv6.dhcp-timeout 30
    Copy to Clipboard Toggle word wrap

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

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

    # nmcli connection modify <connection_name> ipv4.may-fail <value>
    Copy to Clipboard Toggle word wrap

    如果将 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>
    Copy to Clipboard Toggle word wrap

您可以使用 NetworkManager 分配程序脚本来执行 dhclient exit hooks。

22.1. NetworkManager 分配程序脚本的概念

在发生网络事件时,NetworkManager-dispatcher 服务会按字母顺序执行用户提供的脚本。这些脚本通常是 shell 脚本,但可以是任何可执行的脚本或应用程序。例如,您可以使用分配程序脚本来调整您无法使用 NetworkManager 进行管理的与网络相关的设置。

您可以在以下目录中存储分配程序脚本:

  • /etc/NetworkManager/dispatcher.d/root 用户可以编辑的分配程序脚本的通用位置。
  • /usr/lib/NetworkManager/dispatcher.d/: 用于预先部署的不可变分配程序脚本。

为了安全起见,NetworkManager-dispatcher 服务只有在满足以下条件时才执行脚本:

  • 脚本归 root 用户所有。
  • 该脚本仅可由 root 读写。
  • 脚本上没有设置 setuid 位。

NetworkManager-dispatcher 服务使用两个参数运行每个脚本:

  1. 操作所在的设备的接口名称。
  2. 当接口被激活时,如 up 操作。

NetworkManager(8) 手册页中的 分配程序脚本 部分提供了在脚本中可以使用的操作和环境变量的概述。

NetworkManager-dispatcher 服务一次运行一个脚本,但与主 NetworkManager 进程异步运行。请注意,如果脚本已排队,服务将始终运行它,即使后续事件使其过时。但是,NetworkManager-dispatcher 服务运行脚本,它们是指向 /etc/NetworkManager/dispatcher.d/no-wait.d/ 中的文件的符号链接,而无需等待之前脚本的终止,且并行运行。

当 DHCP 服务器分配或更新 IPv4 地址时,NetworkManager 可以运行存储在 /etc/dhcp/dhclient-exit-hooks.d/ 目录中的分配程序脚本。然后,该分配程序脚本可以运行 dhclient 退出钩子。

先决条件

  • dhclient exit hooks 存储在 /etc/dhcp/dhclient-exit-hooks.d/ 目录下。

流程

  1. 使用以下内容创建 /etc/NetworkManager/dispatcher.d/12-dhclient-down 文件:

    #!/bin/bash
    # Run dhclient.exit-hooks.d scripts
    
    if [ -n "$DHCP4_DHCP_LEASE_TIME" ] ; then
      if [ "$2" = "dhcp4-change" ] || [ "$2" = "up" ] ; then
        if [ -d /etc/dhcp/dhclient-exit-hooks.d ] ; then
          for f in /etc/dhcp/dhclient-exit-hooks.d/*.sh ; do
            if [ -x "${f}" ]; then
              . "${f}"
            fi
          done
        fi
      fi
    fi
    Copy to Clipboard Toggle word wrap
  2. root 用户设为文件的所有者:

    # chown root:root /etc/NetworkManager/dispatcher.d/12-dhclient-down
    Copy to Clipboard Toggle word wrap
  3. 设置权限,以便只有 root 用户才能执行它:

    # chmod 0700 /etc/NetworkManager/dispatcher.d/12-dhclient-down
    Copy to Clipboard Toggle word wrap
  4. 恢复 SELinux 上下文:

    # restorecon /etc/NetworkManager/dispatcher.d/12-dhclient-down
    Copy to Clipboard Toggle word wrap

第 23 章 手动配置 /etc/resolv.conf 文件

默认情况下,NetworkManager 使用活跃的 NetworkManager 连接配置文件中的 DNS 设置动态更新 /etc/resolv.conf 文件。但是,您可以在 /etc/resolv.conf 中禁用此行为,并手动配置 DNS 设置。

注意

或者,如果您在 /etc/resolv.conf 中需要特定的 DNS 服务器顺序,请参阅 配置 DNS 服务器的顺序

23.1. 在 NetworkManager 配置中禁用 DNS 处理

默认情况下,NetworkManager 在 /etc/resolv.conf 文件中管理 DNS 设置,您可以配置 DNS 服务器的顺序。或者,如果您喜欢在 /etc/resolv.conf 中手动配置 DNS 设置,您可以在 NetworkManager 中禁用 DNS 处理。

流程

  1. 以 root 用户身份,使用文本编辑器创建包含以下内容的 /etc/NetworkManager/conf.d/90-dns-none.conf 文件:

    [main]
    dns=none
    Copy to Clipboard Toggle word wrap
  2. 重新载入 NetworkManager 服务:

    # systemctl reload NetworkManager
    Copy to Clipboard Toggle word wrap
    注意

    重新加载服务后,NetworkManager 不再更新 /etc/resolv.conf 文件。但是该文件的最后内容将被保留。

  3. 可选:从 /etc/resolv.conf 中删除 NetworkManager 生成的注释以避免混淆。

验证

  1. 编辑 /etc/resolv.conf 文件并手动更新配置。
  2. 重新载入 NetworkManager 服务:

    # systemctl reload NetworkManager
    Copy to Clipboard Toggle word wrap
  3. 显示 /etc/resolv.conf 文件:

    # cat /etc/resolv.conf
    Copy to Clipboard Toggle word wrap

    如果您成功禁用了 DNS 处理,NetworkManager 不会覆盖手动配置的设置。

故障排除

  • 显示 NetworkManager 配置,以确保没有具有高优先级的配置文件覆盖设置:

    # NetworkManager --print-config
    ...
    dns=none
    ...
    Copy to Clipboard Toggle word wrap

第 24 章 配置 DNS 服务器顺序

glibc 库的 getaddrinfo () 函数将所有 DNS 请求发送到 /etc/resolv.conf 文件中指定的第一个 DNS 服务器。如果这个服务器没有回复,RHEL 会尝试所有其他名称服务器。您可以将 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=dnsmasqdns=systemd-resolved

      当您使用这些设置中的一个时,NetworkManager 将 dnsmasq127.0.0.1127.0.0.53 设为 /etc/resolv.conf 文件中的 nameserver 条目。

      dnsmasqsystemd-resolved 服务将对 NetworkManager 连接中设置的搜索域的查询转发到该连接中指定的 DNS 服务器,并将对其他域的查询转发到具有默认路由的连接。当多个连接有相同的搜索域集时,dnsmasqsystemd-resolved 将这个域的查询转发到在具有最低优先级值的连接中设置的 DNS 服务器。

NetworkManager 对连接使用以下默认值:

  • 50 用于 VPN 连接
  • 100 用于其他连接

您可以将全局默认值和特定于连接的 ipv4.dns-priorityipv6.dns-priority 参数设为 -21474836472147483647 之间的值。

  • 低的值具有更高的优先级。
  • 负值具有一个特殊的效果,它会排除其他带有更大值的配置。例如,如果至少有一个连接具有负优先级值,NetworkManager 只使用在连接配置集中指定的具有最低优先级的 DNS 服务器。
  • 如果多个连接具有相同的 DNS 优先级,NetworkManager 会按照以下顺序排列 DNS 的优先顺序:

    1. VPN 连接
    2. 带有活跃的默认路由的连接。活跃的默认路由是具有最低指标的默认路由。

您可以覆盖 NetworkManager 的系统范围 DNS 服务器优先级默认值,以便为 IPv4 和 IPv6 DNS 服务器设置自定义默认值。

默认值如下:

  • 50 用于 VPN 连接
  • 100 用于其他连接

流程

  1. 编辑 /etc/NetworkManager/NetworkManager.conf 文件:

    1. 添加 [connection] 部分(如果其不存在):

      [connection]
      Copy to Clipboard Toggle word wrap
    2. 将自定义默认值添加到 [connection] 部分。例如,要将 IPv4 和 IPv6 的新默认值设为 200,请添加:

      ipv4.dns-priority=200
      ipv6.dns-priority=200
      Copy to Clipboard Toggle word wrap

      您可以将参数设为 -21474836472147483647 之间的值。请注意,将参数设置为 0 将启用内置的默认值(对于 VPN 连接为 50 ,对于其他连接为 100 )。

  2. 重新载入 NetworkManager 服务:

    # systemctl reload NetworkManager
    Copy to Clipboard Toggle word wrap

24.3. 设置网络管理器连接的 DNS 优先级

如果您需要 DNS 服务器的特定顺序,您可以在连接配置文件中设置优先级值。NetworkManager 使用这些值来在服务创建或更新 /etc/resolv.conf 文件时对服务器进行排序。

请注意,只有在您配置了多个与不同 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
    ...
    Copy to Clipboard Toggle word wrap
  2. 设置 ipv4.dns-priorityipv6.dns-priority 参数。例如,要将这两个参数都设置为 10,请输入:

    # nmcli connection modify <connection_name> ipv4.dns-priority 10 ipv6.dns-priority 10
    Copy to Clipboard Toggle word wrap
  3. 可选:对其他连接重复上一步。
  4. 重新激活您更新的连接:

    # nmcli connection up <connection_name>
    Copy to Clipboard Toggle word wrap

验证

  • 显示 /etc/resolv.conf 文件的内容以验证 DNS 服务器的顺序是否正确:

    # cat /etc/resolv.conf
    Copy to Clipboard Toggle word wrap

第 25 章 在不同域中使用不同的 DNS 服务器

默认情况下,Red Hat Enterprise Linux (RHEL)将所有 DNS 请求发送到 /etc/resolv.conf 文件中指定的第一个 DNS 服务器。如果这个服务器没有回复,则 RHEL 会尝试此文件中的下一个服务器,直到找到一个可以工作的为止。在一个 DNS 服务器无法解析所有域的环境中,管理员可将 RHEL 配置为将特定域的 DNS 请求发送到所选 DNS 服务器。

例如,您要将服务器连接到虚拟专用网络(VPN),VPN 中的主机将使用 example.com 域。在这种情况下,您可以以下方式配置 RHEL ,以处理 DNS 查询:

  • 仅将 example.com 的 DNS 请求发送到 VPN 网络中的 DNS 服务器。
  • 将所有其他请求发送到使用默认网关在连接配置文件中配置的 DNS 服务器。

在具有多个网络接口的主机上,如果一个 DNS 服务器无法解析所有域,您可以将 RHEL 配置为将特定域的 DNS 请求发送到所选 DNS 服务器。

您可以将 NetworkManager 配置为启动一个 dnsmasq 实例。然后,此 DNS 缓存服务器侦听 loopback 设备上的端口 53。因此,该服务只能从本地系统访问,而不可从网络访问。

使用这个配置,NetworkManager 将 nameserver 127.0.0.1 条目添加到 /etc/resolv.conf 文件中,dnsmasq 会动态将 DNS 请求路由到 NetworkManager 连接配置文件中指定的对应 DNS 服务器。

先决条件

  • 系统配置了多个网络管理器连接。
  • 为负责解析特定域的连接配置 DNS 服务器和搜索域。

    例如:要确保 VPN 连接中指定的 DNS 服务器解析对 example.com 域的查询,必须有以下设置:

    • 可以解析 example.com 的 DNS 服务器。DHCP 服务器可以动态提供此信息,或者在 VPN 连接配置文件中设置 ipv4.dnsipv6.dns 参数。
    • 搜索域设置为 example.com。DHCP 服务器可以动态提供此信息,或者在 VPN 连接配置文件中设置 ipv4.dns-searchipv6.dns-search 参数。
  • dnsmasq 服务没有运行,或配置为侦听与 localhost 不同的接口。

流程

  1. 安装 dnsmasq 软件包:

    # dnf install dnsmasq
    Copy to Clipboard Toggle word wrap
  2. 编辑 /etc/NetworkManager/NetworkManager.conf 文件,并在 [main] 部分中设置以下条目:

    dns=dnsmasq
    Copy to Clipboard Toggle word wrap
  3. 重新载入 NetworkManager 服务:

    # systemctl reload NetworkManager
    Copy to Clipboard Toggle word wrap

验证

  1. NetworkManager 单元的 systemd 日志中搜索服务使用不同的 DNS 服务器的域:

    # journalctl -xeu NetworkManager
    ...
    Jun 02 13:30:17 <client_hostname>_ dnsmasq[5298]: using nameserver 198.51.100.7#53 for domain example.com
    ...
    Copy to Clipboard Toggle word wrap
  2. 使用 tcpdump 数据包嗅探器验证 DNS 请求的正确路由:

    1. 安装 tcpdump 软件包:

      # dnf install tcpdump
      Copy to Clipboard Toggle word wrap
    2. 在一个终端上,启动 tcpdump 以捕获所有接口上的 DNS 流量:

      # tcpdump -i any port 53
      Copy to Clipboard Toggle word wrap
    3. 在另一个终端上,解析存在异常的域的主机名,以及另一个域,例如:

      # host -t A www.example.com
      # host -t A www.redhat.com
      Copy to Clipboard Toggle word wrap
    4. tcpdump 输出中验证 Red Hat Enterprise Linux 只向指定的 DNS 服务器并通过对应的接口发送对 example.com 域的 DNS 查询:

      ...
      13:52:42.234533 tun0   Out IP server.43534 > 198.51.100.7.domain: 50121+ A? www.example.com. (33)
      ...
      13:52:57.753235 enp1s0 Out IP server.40864 > 192.0.2.1.domain: 6906+ A? www.redhat.com. (33)
      ...
      Copy to Clipboard Toggle word wrap

      Red Hat Enterprise Linux 将 www.example.com 的 DNS 查询发送到 198.51.100.7 上的 DNS 服务器,并将 www.redhat.com 的查询发送到 192.0.2.1

故障排除

  1. 验证 /etc/resolv.conf 文件中的 nameserver 条目是否指向 127.0.0.1

    # cat /etc/resolv.conf
    nameserver 127.0.0.1
    Copy to Clipboard Toggle word wrap

    如果缺少该条目,请检查 /etc/NetworkManager/NetworkManager.conf 文件中的 dns 参数。

  2. 验证 dnsmasq 服务是否侦听 loopback 设备上的端口 53

    # ss -tulpn | grep "127.0.0.1:53"
    udp  UNCONN 0  0    127.0.0.1:53   0.0.0.0:*    users:(("dnsmasq",pid=7340,fd=18))
    tcp  LISTEN 0  32   127.0.0.1:53   0.0.0.0:*    users:(("dnsmasq",pid=7340,fd=19))
    Copy to Clipboard Toggle word wrap

    如果服务没有侦听 127.0.0.1:53,请检查 NetworkManager 单元的日志条目:

    # journalctl -u NetworkManager
    Copy to Clipboard Toggle word wrap

在具有多个网络接口的主机上,如果一个 DNS 服务器无法解析所有域,您可以将 RHEL 配置为将特定域的 DNS 请求发送到所选 DNS 服务器。

您可以将 NetworkManager 配置为启动 systemd-resolved 的一个实例。然后,这个 DNS stub 解析器监听 IP 地址 127.0.0.53 上的端口 53。因此,这个 stub 解析器只能从本地系统访问,而不可从网络访问。

使用这个配置,NetworkManager 将 nameserver 127.0.0.53 条目添加到 /etc/resolv.conf 文件中,systemd-resolved 将 DNS 请求动态路由到 NetworkManager 连接配置文件中指定的对应的 DNS 服务器。

重要

systemd-resolved 服务仅作为技术预览提供。红帽产品服务级别协议(SLA)不支持技术预览功能,且其功能可能并不完善,因此红帽不建议在生产环境中使用它们。这些预览可让用户早期访问将来的产品功能,让用户在开发过程中测试并提供反馈意见。

如需有关 技术预览功能支持范围 的信息,请参阅红帽客户门户网站中的技术预览功能支持范围。

有关支持的解决方案,请参阅 在 NetworkManager 中使用 dnsmasq 将特定域的 DNS 请求发送到所选 DNS 服务器

先决条件

  • 系统配置了多个网络管理器连接。
  • 为负责解析特定域的连接配置 DNS 服务器和搜索域。

    例如:要确保 VPN 连接中指定的 DNS 服务器解析对 example.com 域的查询,必须有以下设置:

    • 可以解析 example.com 的 DNS 服务器。DHCP 服务器可以动态提供此信息,或者在 VPN 连接配置文件中设置 ipv4.dnsipv6.dns 参数。
    • 搜索域设置为 example.com。DHCP 服务器可以动态提供此信息,或者在 VPN 连接配置文件中设置 ipv4.dns-searchipv6.dns-search 参数。

流程

  1. 安装 systemd-resolved 软件包:

    # dnf install systemd-resolved
    Copy to Clipboard Toggle word wrap
  2. 启用并启动 systemd-resolved 服务:

    # systemctl --now enable systemd-resolved
    Copy to Clipboard Toggle word wrap
  3. 编辑 /etc/NetworkManager/NetworkManager.conf 文件,并在 [main] 部分中设置以下条目:

    dns=systemd-resolved
    Copy to Clipboard Toggle word wrap
  4. 重新载入 NetworkManager 服务:

    # systemctl reload NetworkManager
    Copy to Clipboard Toggle word wrap

验证

  1. 显示 DNS 服务器 systemd-resolved 使用,以及服务为哪个域使用不同的 DNS 服务器:

    # resolvectl
    ...
    Link 2 (enp1s0)
        Current Scopes: DNS
             Protocols: +DefaultRoute ...
    Current DNS Server: 192.0.2.1
           DNS Servers: 192.0.2.1
    
    Link 3 (tun0)
        Current Scopes: DNS
             Protocols: -DefaultRoute ...
    Current DNS Server: 198.51.100.7
           DNS Servers: 198.51.100.7 203.0.113.19
            DNS Domain: example.com
    Copy to Clipboard Toggle word wrap

    输出确认 systemd-resolvedexample.com 域使用不同的 DNS 服务器。

  2. 使用 tcpdump 数据包嗅探器验证 DNS 请求的正确路由:

    1. 安装 tcpdump 软件包:

      # dnf install tcpdump
      Copy to Clipboard Toggle word wrap
    2. 在一个终端上,启动 tcpdump 以捕获所有接口上的 DNS 流量:

      # tcpdump -i any port 53
      Copy to Clipboard Toggle word wrap
    3. 在另一个终端上,解析存在异常的域的主机名,以及另一个域,例如:

      # host -t A www.example.com
      # host -t A www.redhat.com
      Copy to Clipboard Toggle word wrap
    4. tcpdump 输出中验证 Red Hat Enterprise Linux 只向指定的 DNS 服务器并通过对应的接口发送对 example.com 域的 DNS 查询:

      ...
      13:52:42.234533 tun0   Out IP server.43534 > 198.51.100.7.domain: 50121+ A? www.example.com. (33)
      ...
      13:52:57.753235 enp1s0 Out IP server.40864 > 192.0.2.1.domain: 6906+ A? www.redhat.com. (33)
      ...
      Copy to Clipboard Toggle word wrap

      Red Hat Enterprise Linux 将 www.example.com 的 DNS 查询发送到 198.51.100.7 上的 DNS 服务器,并将 www.redhat.com 的查询发送到 192.0.2.1

故障排除

  1. 验证 /etc/resolv.conf 文件中的 nameserver 条目是否指向 127.0.0.53

    # cat /etc/resolv.conf
    nameserver 127.0.0.53
    Copy to Clipboard Toggle word wrap

    如果缺少该条目,请检查 /etc/NetworkManager/NetworkManager.conf 文件中的 dns 参数。

  2. 验证 systemd-resolved 服务是否监听本地 IP 地址 127.0.0.53 上的端口 53

    # ss -tulpn | grep "127.0.0.53"
    udp  UNCONN 0  0      127.0.0.53%lo:53   0.0.0.0:*    users:(("systemd-resolve",pid=1050,fd=12))
    tcp  LISTEN 0  4096   127.0.0.53%lo:53   0.0.0.0:*    users:(("systemd-resolve",pid=1050,fd=13))
    Copy to Clipboard Toggle word wrap

    如果服务没有侦听 127.0.0.53:53,请检查 systemd-resolved 服务是否在运行。

25.3. 通过特定接口路由 DNS 流量

如果您的主机有多个网络接口,且每个 DNS 服务器只能通过特定的接口访问,请将 RHEL 配置为正确地路由 DNS 流量,以防止错误的查询和解析失败。

NetworkManager 可以配置 systemd-resolveddnsmasqdnsconf DNS 后端。为了避免多接口系统上 DNS 解析问题,NetworkManager 可以自动为绑定到特定网络接口的 DNS 服务器创建专用路由。

连接配置文件中提到的每个 DNS 服务器都与特定网络接口关联。DNS 后端服务 systemd-resolveddnsmasq 确保每个 DNS 名称服务器只能通过正确的网络接口访问。但是,其他后端服务不支持此功能。因此,NetworkManager 具有一个自动添加专用路由的功能,以便仅通过正确的接口访问每个名称服务器。您可以设置 ipv4.routed-dnsipv6.routed-dns 属性来使用此功能。

示例情况:

  • 连接配置文件 1: <example-connection-1>

    • 默认网关: 192.0.2.254
    • DNS 服务器: 10.0.0.1
    • 搜索域:example-domain.com
  • 连接配置文件 2: <example-connection-2>

    • 默认网关: 198.51.100.254 (此网关无法访问 10.0.0.0/24 网络)
    • DNS 服务器:203.0.113. 1

在本例中,您有两个连接配置集: <example-connection-1><example-connection-2> 通过 enp1s0enp7s0 网络接口进行连接。如果 <example-connection-2> 首先连接了第二个配置集,则此连接的默认网关 198.51.100.254 具有较低指标,并且优先于第一个配置集。因此,RHEL 在连接到第一个配置集的 DNS 服务器时使用第二个连接的默认网关。因此,DNS 解析会失败。要解决这个问题,请为两个连接配置文件启用 ipv4.routed-dns 设置,以便 NetworkManager 通过正确的接口为 10.0.0.1 DNS 服务器创建一个专用路由,本例中为 enp1s0

先决条件

  • 连接配置集已经存在。

流程

  1. 修改连接配置文件,以启用为名称服务器创建路由:

    1. 对于连接配置文件 1,请输入:

      # nmcli connection modify <example-connection-1> ipv4.routed-dns yes
      Copy to Clipboard Toggle word wrap
    2. 对于连接配置文件 2,请输入:

      # nmcli connection modify <example-connection-2> ipv4.routed-dns yes
      Copy to Clipboard Toggle word wrap
  2. 重新激活连接:

    # nmcli connection up <example-connection-1>
    
    # nmcli connection up <example-connection-2>
    Copy to Clipboard Toggle word wrap

验证

  • 显示要访问 IP 地址的路由:

    # ip route get 203.0.113.1
    203.0.113.1  dev  enp1s0  table  20053  src  10.0.0.1  uid  0
    Copy to Clipboard Toggle word wrap

    此命令验证名称服务器是否通过正确的接口访问,并使用策略路由方法将 DNS 服务器的所有路由放在特殊路由表 20053 中。

第 26 章 管理默认网关设置

默认网关是在没有其他路由与数据包的目的地匹配时转发网络数据包的路由器。在本地网络中,默认网关通常是与距离互联网有一跳的主机。

26.1. 使用 nmcli 对现有连接设置默认网关

在大多数情况下,管理员在创建连接时设置默认网关。但是,您也可以使用 nmcli 工具对之前创建的连接设置或更新默认网关设置。

先决条件

  • 至少需要在设置默认网关的连接上配置一个静态 IP 地址。
  • 如果用户在物理控制台中登录,用户权限就足够了。否则,该用户必须具有 root 权限。

流程

  1. 设置默认网关的 IP 地址:

    要设置 IPv4 默认网关,请输入:

    # nmcli connection modify <connection_name> ipv4.gateway "<IPv4_gateway_address>"
    Copy to Clipboard Toggle word wrap

    要设置 IPv6 默认网关,请输入:

    # nmcli connection modify <connection_name> ipv6.gateway "<IPv6_gateway_address>"
    Copy to Clipboard Toggle word wrap
  2. 重启网络连接以使更改生效:

    # nmcli connection up <connection_name>
    Copy to Clipboard Toggle word wrap
    警告

    所有目前使用这个网络连接的连接在重启过程中暂时中断。

验证

  • 验证路由是否处于活跃状态:

    1. 要显示 IPv4 默认网关,请输入:

      # ip -4 route
      default via 192.0.2.1 dev example proto static metric 100
      Copy to Clipboard Toggle word wrap
    2. 要显示 IPv6 默认网关,请输入:

      # ip -6 route
      default via 2001:db8:1::1 dev example proto static metric 100 pref medium
      Copy to Clipboard Toggle word wrap

在大多数情况下,管理员在创建连接时设置默认网关。但是,您也可以使用 nmcli 工具的交互模式对之前创建的连接设置或更新默认网关设置。

先决条件

  • 至少需要在设置默认网关的连接上配置一个静态 IP 地址。
  • 如果用户在物理控制台中登录,用户权限就足够了。否则,该用户必须具有 root 权限。

流程

  1. 为所需连接打开 nmcli 交互模式:

    # nmcli connection edit <connection_name>
    Copy to Clipboard Toggle word wrap
  2. 设置默认网关

    要设置 IPv4 默认网关,请输入:

    nmcli> set ipv4.gateway "<IPv4_gateway_address>"
    Copy to Clipboard Toggle word wrap

    要设置 IPv6 默认网关,请输入:

    nmcli> set ipv6.gateway "<IPv6_gateway_address>"
    Copy to Clipboard Toggle word wrap
  3. 可选:验证默认网关是否被正确设置:

    nmcli> print
    ...
    ipv4.gateway:            <IPv4_gateway_address>
    ...
    ipv6.gateway:            <IPv6_gateway_address>
    ...
    Copy to Clipboard Toggle word wrap
  4. 保存配置:

    nmcli> save persistent
    Copy to Clipboard Toggle word wrap
  5. 重启网络连接以使更改生效:

    nmcli> activate <connection_name>
    Copy to Clipboard Toggle word wrap
    警告

    所有目前使用这个网络连接的连接在重启过程中暂时中断。

  6. 保留 nmcli 交互模式:

    nmcli> quit
    Copy to Clipboard Toggle word wrap

验证

  • 验证路由是否处于活跃状态:

    1. 要显示 IPv4 默认网关,请输入:

      # ip -4 route
      default via 192.0.2.1 dev example proto static metric 100
      Copy to Clipboard Toggle word wrap
    2. 要显示 IPv6 默认网关,请输入:

      # ip -6 route
      default via 2001:db8:1::1 dev example proto static metric 100 pref medium
      Copy to Clipboard Toggle word wrap

在大多数情况下,管理员在创建连接时设置默认网关。但是,您也可以使用 nm-connection-editor 应用程序对之前创建的连接设置或更新默认网关设置。

先决条件

  • 至少需要在设置默认网关的连接上配置一个静态 IP 地址。

流程

  1. 打开一个终端,输入 nm-connection-editor

    # nm-connection-editor
    Copy to Clipboard Toggle word wrap
  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 连接:

    # nmcli connection up example
    Copy to Clipboard Toggle word wrap
    警告

    所有目前使用这个网络连接的连接在重启过程中暂时中断。

验证

  • 验证路由是否处于活跃状态。

    显示 IPv4 默认网关:

    # ip -4 route
    default via 192.0.2.1 dev example proto static metric 100
    Copy to Clipboard Toggle word wrap

    显示 IPv6 默认网关:

    # ip -6 route
    default via 2001:db8:1::1 dev example proto static metric 100 pref medium
    Copy to Clipboard Toggle word wrap

在大多数情况下,管理员在创建连接时设置默认网关。但是,您也可以使用 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. 返回到 Network 窗口,通过将连接的按钮切换为 Off ,然后返回到 On 来禁用并重新启用连接,以使更改生效。

    警告

    所有目前使用这个网络连接的连接在重启过程中暂时中断。

验证

  • 验证路由是否处于活跃状态。

    显示 IPv4 默认网关:

    $ ip -4 route
    default via 192.0.2.1 dev example proto static metric 100
    Copy to Clipboard Toggle word wrap

    显示 IPv6 默认网关:

    $ ip -6 route
    default via 2001:db8:1::1 dev example proto static metric 100 pref medium
    Copy to Clipboard Toggle word wrap

26.5. 使用 nmstatectl 对现有连接设置默认网关

您可以使用声明性 Nmstate API 在连接中设置或更新默认网关。nmstate 可确保结果与配置文件匹配或回滚更改。

先决条件

  • 至少需要在设置默认网关的连接上配置一个静态 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
    Copy to Clipboard Toggle word wrap

    这些设置将 192.0.2.1 定义为默认网关,可通过 enp1s0 接口到达默认网关。

  2. 将设置应用到系统:

    # nmstatectl apply ~/set-default-gateway.yml
    Copy to Clipboard Toggle word wrap

通过使用 network RHEL 系统角色,您可以在 NetworkManager 连接配置集中自动设置默认网关。使用此方法,您可以在 playbook 中定义的主机上远程配置默认网关。

在大多数情况下,管理员在创建连接时设置默认网关。但是,您也可以对之前创建的连接设置或更新默认网关设置。

警告

您不能使用 network RHEL 系统角色只更新现有连接配置文件中的特定值。该角色确保连接配置文件与 playbook 中的设置完全匹配。如果具有相同名称的连接配置文件存在,则角色将应用 playbook 中的设置,并将配置文件中的所有其他设置重置为其默认值。要防止重置值,请始终在 playbook 中指定网络连接配置文件的整个配置,包括您不想更改的设置。

前提条件

流程

  1. 创建一个包含以下内容的 playbook 文件,如 ~/playbook.yml

    ---
    - name: Configure the network
      hosts: managed-node-01.example.com
      tasks:
        - name: Ethernet connection profile with static IP address settings
          ansible.builtin.include_role:
            name: redhat.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
    Copy to Clipboard Toggle word wrap

    有关 playbook 中使用的所有变量的详情,请查看控制节点上的 /usr/share/ansible/roles/rhel-system-roles.network/README.md 文件。

  2. 验证 playbook 语法:

    $ ansible-playbook --syntax-check ~/playbook.yml
    Copy to Clipboard Toggle word wrap

    请注意,这个命令只验证语法,不能防止错误的、但有效的配置。

  3. 运行 playbook:

    $ ansible-playbook ~/playbook.yml
    Copy to Clipboard Toggle word wrap

验证

  • 查询受管节点的 Ansible 事实,并验证活跃的网络设置:

    # ansible managed-node-01.example.com -m ansible.builtin.setup
    ...
            "ansible_default_ipv4": {
    	    ...
                "gateway": "198.51.100.254",
                "interface": "enp1s0",
    	    ...
            },
            "ansible_default_ipv6": {
    	    ...
                "gateway": "2001:db8:1::fffe",
                "interface": "enp1s0",
    	    ...
    	}
    ...
    Copy to Clipboard Toggle word wrap

26.7. NetworkManager 如何管理多个默认网关

在某些情况下,您可能需要在主机上设置多个默认网关。但是,为了避免异步路由问题,同一协议的每个默认网关都需要单独的指标值。

请注意,RHEL 只使用到设置成最低指标的默认网关的连接。

您可以使用以下命令为连接的 IPv4 和 IPv6 网关设置指标:

# nmcli connection modify <connection_name> ipv4.route-metric <value> ipv6.route-metric <value>
Copy to Clipboard Toggle word wrap
重要

不要为多个连接配置集中的同一协议设置相同的指标值以避免路由问题。

如果您设置了没有指标值的默认网关,则 NetworkManager 会自动根据接口类型设置指标值。为此,NetworkManager 将这个网络类型的默认值分配给激活的第一个连接,并根据激活的顺序为同一类型的每一个其他连接设置递增值。例如,如果带有默认网关的两个以太网连接存在,则 NetworkManager 会将路由上的 100 指标设置为您首先激活的连接的默认网关。对于第二个连接,NetworkManager 会设为 101

以下是经常使用的网络类型及其默认指标的概述:

Expand
连接类型默认指标值

VPN

50

Ethernet

100

MACsec

125

InfiniBand

150

Bond

300

Team

350

VLAN

400

Bridge

425

TUN

450

Wi-Fi

600

IP tunnel

675

在没有连接到默认网关的连接配置文件中,您可以配置 NetworkManager 永远不会使用这个配置集来提供默认网关。

先决条件

  • 没有连接到默认网关的连接的 NetworkManager 连接配置文件存在。

流程

  1. 如果连接使用动态 IP 配置,请配置 NetworkManager 不会使用这个连接作为相应 IP 类型的默认连接,这意味着 NetworkManager 永远不会为其分配默认路由:

    # nmcli connection modify <connection_name> ipv4.never-default yes ipv6.never-default yes
    Copy to Clipboard Toggle word wrap

    请注意,将 ipv4.never-defaultipv6.never-default 设为 yes,会自动从连接配置文件中删除相应协议默认网关的 IP 地址。

  2. 激活连接:

    # nmcli connection up <connection_name>
    Copy to Clipboard Toggle word wrap

验证

  • 使用 ip -4 路由和 ip -6 route 命令,来验证 RHEL 是否未对 IPv4 和 IPv6 协议的默认路使用网络接口。

对于大多数主机,您只需要单个默认网关来防止意外的路由行为和异步路由问题。通常只在特定情况下需要多个默认网关,比如使用多路径 TCP 时。

注意

要将流量路由到不同的互联网提供商,请使用基于策略的路由,而不是多个默认网关。

先决条件

  • 主机使用 NetworkManager 管理网络连接,这是默认设置。
  • 主机有多个网络接口。
  • 主机配置了多个默认网关。

流程

  1. 显示路由表:

    • 对于 IPv4,请输入:

      # ip -4 route
      default via 192.0.2.1 dev enp1s0 proto dhcp metric 101
      default via 198.51.100.1 dev enp7s0 proto dhcp metric 102
      ...
      Copy to Clipboard Toggle word wrap
    • 对于 IPv6,请输入:

      # ip -6 route
      default via 2001:db8:1::1 dev enp1s0 proto static ra 101 pref medium
      default via 2001:db8:2::1 dev enp7s0 proto static ra 102 pref medium
      ...
      Copy to Clipboard Toggle word wrap

    default 开头的条目表示默认路由。注意 dev 旁边显示的这些条目的接口名称。

  2. 使用以下命令显示您使用在上一步中识别的接口的 NetworkManager 连接:

    # nmcli -f GENERAL.CONNECTION,IP4.GATEWAY,IP6.GATEWAY device show enp1s0
    GENERAL.CONNECTION:      Corporate-LAN
    IP4.GATEWAY:             192.0.2.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
    Copy to Clipboard Toggle word wrap

    在这些示例中,名为 Corporate-LANInternet-Provider 的配置文件设置了默认网关。因为在本地网络中,默认网关通常是距离互联网一跳的主机,所以此流程的剩下部分假设 Corporate-LAN 中的默认网关是不正确的。

  3. 配置 NetworkManager 不使用 Corporate-LAN 连接作为 IPv4 和 IPv6 连接的默认路由:

    # nmcli connection modify Corporate-LAN ipv4.never-default yes ipv6.never-default yes
    Copy to Clipboard Toggle word wrap

    请注意,将 ipv4.never-defaultipv6.never-default 设为 yes,会自动从连接配置文件中删除相应协议默认网关的 IP 地址。

  4. 激活 Corporate-LAN 连接:

    # nmcli connection up Corporate-LAN
    Copy to Clipboard Toggle word wrap

验证

  • 显示 IPv4 和 IPv6 路由表,并确认每个协议都只有一个默认网关:

    • 对于 IPv4,请输入:

      # ip -4 route
      default via 198.51.100.1 dev enp7s0 proto dhcp metric 102
      ...
      Copy to Clipboard Toggle word wrap
    • 对于 IPv6,请输入:

      # ip -6 route
      default via 2001:db8:2::1 dev enp7s0 proto ra metric 102 pref medium
      ...
      Copy to Clipboard Toggle word wrap

第 27 章 配置静态路由

路由会指示相互连接的网络之间的流量。在较大的环境中,管理员配置服务以便路由器动态地了解彼此。在较小的部分中,管理员通常会配置静态路由,以确保流量可以到达其目的地。

如果适用所有这些条件,您需要静态路由以在多个网络间获得正常运行的通信:

  • 流量必须通过多个网络。
  • 通过默认网关的独占流量流不足。

需要静态路由的网络示例 部分描述了场景,以及在没有配置静态路由时流量如何在不同的网络间流动。

27.1. 需要静态路由的网络示例

您需要在这个示例中的静态路由,因为并非所有 IP 网络都通过一个路由器直接连接。如果没有静态路由,一些网络无法相互通信。此外,某些网络流的流量仅有一个方向。

注意

本例中的网络拓扑是假设的,仅用于解释静态路由的概念。在生产环境中并不推荐使用这个拓扑。

对于本示例中所有网络中的一个正常运行的通信,请将静态路由配置为 Raleigh (198.51.100.0/24),下一个越点(hop)路由器 2 (203.0.113.10)。下一个跃点的 IP 地址是数据中心网络中的一个路由器 2 (203.0.113.0/24)。

您可以配置静态路由,如下所示:

  • 对于简化的配置,仅在路由器 1 上设置此静态路由。但是,这会增加路由器 1 上的流量,因为来自数据中心(203.0.113.0/24)的主机将流量发送到 Raleigh (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 将流量发送到自己的默认网关(互联网)。
  • 数据中心网络中的主机 (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) 将流量发送到其默认网关 (路由器 1)。路由器 1 在 Raleigh 网络(198.51.100.0/24)中没有接口,因此路由器 1 将此流量发送到自己的默认网关(互联网)。
  • 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 的实际行为取决于 sysctl 设置 rp_filter。默认情况下,在 RHEL 中,路由器 1 会丢弃传出流量,而不是将其发送到 Berlin 网络(192.0.2.0/24)。但是,无论配置的行为如何,都无法在没有静态路由的情况下进行通信。
注意

除了配置静态路由外,还必须在两个路由器上启用 IP 转发。

27.2. 如何使用 nmcli 工具配置静态路由

您可以使用 nmcli 工具在命令行上配置静态路由。

使用以下语法:

$ nmcli connection modify connection_name ipv4.routes "ip[/prefix] [next_hop] [metric] [attribute=value] [attribute=value] ..."
Copy to Clipboard Toggle word wrap

该命令支持以下路由属性:

  • cwnd=n :设置拥塞窗口(CWND)大小,以数据包数定义。
  • lock-cwnd=true|false :定义内核是否可以更新 CWND 值。
  • lock-mtu=true|false :定义内核是否可以将 MTU 更新为路径 MTU 发现。
  • lock-window=true|false :定义内核是否可更新 TCP 数据包的最大窗口大小。
  • mtu=<mtu_value> :设置沿目标路径使用的最大传输单元(MTU)。
  • onlink=true|false :定义下一个跃点是否直接附加到此链接,即使它与任何接口前缀都不匹配。
  • scope=<scope> : 对于 IPv4 路由,此属性设置路由前缀涵盖的目标的范围。将值设为整数(0-255)。
  • src=<source_address> :当将流量发送到路由前缀所涵盖的目标时,将源地址设置为首选。
  • table=<table_id> :设置应将路由添加到的表的 ID。如果省略此参数,NetworkManager 将使用 main 表。
  • tos=<type_of_service_key>:设置服务(TOS)密钥的类型。将值设为整数(0-255)。
  • type=<route_type> :设置路由类型。NetworkManager 支持 unicastlocalblackholeunreachableprohibitthrow 路由类型。默认为 unicast
  • window=<window_size> :设置 TCP 向这些目标通告的最大窗口大小,以字节为单位。
重要

如果您使用 ipv4.routes 选项,而前面没有 + 符号,则 nmcli 会覆盖这个参数的所有当前设置。

  • 要创建额外的路由,请输入:

    $ nmcli connection modify connection_name +ipv4.routes "<route>"
    Copy to Clipboard Toggle word wrap
  • 要删除特定的路由,请输入:

    $ nmcli connection modify connection_name -ipv4.routes "<route>"
    Copy to Clipboard Toggle word wrap

27.3. 使用 nmcli 配置静态路由

您可以使用 nmcli connection modify 命令将静态路由添加到现有 NetworkManager 连接配置集。

以下流程配置以下路由:

  • 到远程 198.51.100.0/24 网络的 IPv4 路由。IP 地址为 192.0.2.10 的相应网关可以通过 LAN 连接配置文件访问。
  • 到远程 2001:db8:2::/64 网络的 IPv6 路由。IP 地址为 2001:db8:1::10 的相应网关可以通过 LAN 连接配置文件访问。

先决条件

  • LAN 连接配置文件存在,且其将位于同一个 IP 子网中的此主机配置为网关。

流程

  1. 将静态 IPv4 路由添加到 LAN 连接配置文件中:

    # nmcli connection modify LAN +ipv4.routes "198.51.100.0/24 192.0.2.10"
    Copy to Clipboard Toggle word wrap

    要在一个步骤中设置多个路由,请将用逗号分开的单个路由传给命令:

    # nmcli connection modify <connection_profile> +ipv4.routes "<remote_network_1>/<subnet_mask_1> <gateway_1>, <remote_network_n>/<subnet_mask_n> <gateway_n>, ..."
    Copy to Clipboard Toggle word wrap
  2. 将静态 IPv6 路由添加到 LAN 连接配置文件中:

    # nmcli connection modify LAN +ipv6.routes "2001:db8:2::/64 2001:db8:1::10"
    Copy to Clipboard Toggle word wrap
  3. 重新激活连接:

    # nmcli connection up LAN
    Copy to Clipboard Toggle word wrap

验证

  1. 显示 IPv4 路由:

    # ip -4 route
    ...
    198.51.100.0/24 via 192.0.2.10 dev enp1s0
    Copy to Clipboard Toggle word wrap
  2. 显示 IPv6 路由:

    # ip -6 route
    ...
    2001:db8:2::/64 via 2001:db8:1::10 dev enp1s0 metric 1024 pref medium
    Copy to Clipboard Toggle word wrap

27.4. 使用 nmtui 配置静态路由

nmtui 应用程序为 NetworkManager 提供了一个基于文本的用户界面。您可以使用 nmtui 在没有图形界面的主机上配置静态路由。

例如,以下流程将路由添加到 192.0.2.0/24 网络,该网络使用运行在 198.51.100.1 上的网关,该网络可通过现有的连接配置文件访问。

注意

nmtui 中:

  • 使用光标键导航。
  • 选择一个按钮并按 Enter 键。
  • 使用 空格 选择和清除复选框。
  • 要返回上一个屏幕,请使用 ESC

先决条件

  • 网络已配置。
  • 静态路由的网关必须在接口上直接访问。
  • 如果用户在物理控制台中登录,用户权限就足够了。否则,命令需要 root 权限。

流程

  1. 启动 nmtui

    # nmtui
    Copy to Clipboard Toggle word wrap
  2. 选择 Edit a connection,然后按 Enter
  3. 选择您可通过其到达目的地网络的下一跳的连接配置文件,然后按 Enter
  4. 根据它是 IPv4 路由还是 IPv6 路由,按协议配置区域旁边的 Show 按钮。
  5. Routing 旁边的 Edit 按钮。这将打开一个新窗口,您可在其中配置静态路由:

    1. Add 按钮并填写:

      • 目的网络,包括无类别域间路由(CIDR)格式的前缀
      • 下一跳的 IP 地址
      • 指标值,如果您向同一网络添加多个路由,并且希望根据效率对路由进行优先排序
    2. 对您要添加的每个路由重复上一步,且通过此连接配置文件可达。
    3. OK 按钮返回到连接设置窗口。

      图 27.1. 没有指标的静态路由的示例

  6. 按 OK 按钮返回到 nmtui 主菜单。
  7. 选择 Activate a connection,然后按 Enter
  8. 选择您编辑的连接配置文件,然后按 Enter 两次来停用并再次激活它。

    重要

    如果您通过使用您要重新激活的连接配置文件的远程连接(如 SSH)来运行 nmtui ,请跳过这一步。在这种情况下,如果您在 nmtui 中停用了它,连接将被终止,因此您无法再次激活它。要避免这个问题,请使用 nmcli connection <connection_profile> up 命令,来在上述场景中重新激活连接。

  9. Back 按钮返回到主菜单。
  10. 选择 Quit,然后按 Enter 键关闭 nmtui 应用程序。

验证

  • 验证路由是否处于活跃状态:

    $ ip route
    ...
    192.0.2.0/24 via 198.51.100.1 dev example proto static metric 100
    Copy to Clipboard Toggle word wrap

27.5. 使用 control-center 配置静态路由

您可以在 GNOME 中使用 control-center,来将静态路由添加到网络连接配置中。

以下流程配置以下路由:

  • 到远程 198.51.100.0/24 网络的 IPv4 路由。对应的网关的 IP 地址 192.0.2.10
  • 到远程 2001:db8:2::/64 网络的 IPv6 路由。对应的网关具有 IP 地址 2001:db8:1::10

前提条件

流程

  1. IPv4 标签页中:

    1. 可选:点 IPv4 选项卡的 Routes 部分中的 On 按钮来禁用自动路由,使其只使用静态路由。如果启用了自动路由,Red Hat Enterprise Linux 将使用静态路由和从 DHCP 服务器接收的路由。
    2. 输入 IPv4 路由的地址、子网掩码、网关和可选的指标值:

      IPv4 static route in control center

  2. IPv6 标签页中:

    1. 可选:点 IPv4 选项卡的 Routes 部分中的 On 按钮来禁用自动路由,使其只使用静态路由。
    2. 输入 IPv6 路由的地址、子网掩码、网关和可选的指标值:

      IPv6 static route in control center

  3. 应用
  4. 返回到 Network 窗口,通过将连接的按钮切换为 Off ,然后返回到 On 来禁用并重新启用连接,以使更改生效。

    警告

    重启连接会破坏那个接口的连接。

验证

  1. 显示 IPv4 路由:

    # ip -4 route
    ...
    198.51.100.0/24 via 192.0.2.10 dev enp1s0
    Copy to Clipboard Toggle word wrap
  2. 显示 IPv6 路由:

    # ip -6 route
    ...
    2001:db8:2::/64 via 2001:db8:1::10 dev enp1s0 metric 1024 pref medium
    Copy to Clipboard Toggle word wrap

27.6. 使用 nm-connection-editor 配置静态路由

您可以使用 nm-connection-editor 应用程序将静态路由添加到网络连接配置中。

以下流程配置以下路由:

  • 到远程 198.51.100.0/24 网络的 IPv4 路由。IP 地址为 192.0.2.10 的对应网关可以通过 example 连接访问。
  • 到远程 2001:db8:2::/64 网络的 IPv6 路由。IP 地址为 2001:db8:1::10 的对应网关可以通过 example 连接访问。

前提条件

  • 网络已配置。
  • 此主机与网关位于同一个 IP 子网中。

流程

  1. 打开一个终端,输入 nm-connection-editor

    $ nm-connection-editor
    Copy to Clipboard Toggle word wrap
  2. 选择 example 连接配置集,并点齿轮图标编辑现有连接。
  3. IPv4 设置 标签页中:

    1. 点击 路由 按钮。
    2. 点击 添加 按钮并输入地址、子网掩码、网关以及可选的指标值。

      IPv4 static route in nm connection editor

    3. 确定
  4. IPv6 设置 标签页中:

    1. 点击 路由 按钮。
    2. 点击 添加 按钮并输入地址、子网掩码、网关以及可选的指标值。

      IPv6 static route in nm connection editor

    3. 确定
  5. 点击 Save
  6. 重启网络连接以使更改生效。例如,要使用命令行重启 example 连接:

    # nmcli connection up example
    Copy to Clipboard Toggle word wrap

验证

  1. 显示 IPv4 路由:

    # ip -4 route
    ...
    198.51.100.0/24 via 192.0.2.10 dev enp1s0
    Copy to Clipboard Toggle word wrap
  2. 显示 IPv6 路由:

    # ip -6 route
    ...
    2001:db8:2::/64 via 2001:db8:1::10 dev enp1s0 metric 1024 pref medium
    Copy to Clipboard Toggle word wrap

27.7. 使用 nmcli 交互模式配置静态路由

您可以使用 nmcli 工具的交互模式,将静态路由添加到网络连接配置中。

以下流程配置以下路由:

  • 到远程 198.51.100.0/24 网络的 IPv4 路由。IP 地址为 192.0.2.10 的对应网关可以通过 example 连接访问。
  • 到远程 2001:db8:2::/64 网络的 IPv6 路由。IP 地址为 2001:db8:1::10 的对应网关可以通过 example 连接访问。

前提条件

  • example 连接配置集存在,它将此主机配置为与网关在同一 IP 子网中。

流程

  1. example 连接打开 nmcli 交互模式:

    # nmcli connection edit example
    Copy to Clipboard Toggle word wrap
  2. 添加静态 IPv4 路由:

    nmcli> set ipv4.routes 198.51.100.0/24 192.0.2.10
    Copy to Clipboard Toggle word wrap
  3. 添加静态 IPv6 路由:

    nmcli> set ipv6.routes 2001:db8:2::/64 2001:db8:1::10
    Copy to Clipboard Toggle word wrap
  4. 可选:验证路由是否被正确添加到配置中:

    nmcli> print
    ...
    ipv4.routes:    { ip = 198.51.100.0/24, nh = 192.0.2.10 }
    ...
    ipv6.routes:    { ip = 2001:db8:2::/64, nh = 2001:db8:1::10 }
    ...
    Copy to Clipboard Toggle word wrap

    ip 属性显示要路由的网络,nh 属性显示网关(下一跳)。

  5. 保存配置:

    nmcli> save persistent
    Copy to Clipboard Toggle word wrap
  6. 重启网络连接:

    nmcli> activate example
    Copy to Clipboard Toggle word wrap
  7. 保留 nmcli 交互模式:

    nmcli> quit
    Copy to Clipboard Toggle word wrap

验证

  1. 显示 IPv4 路由:

    # ip -4 route
    ...
    198.51.100.0/24 via 192.0.2.10 dev enp1s0
    Copy to Clipboard Toggle word wrap
  2. 显示 IPv6 路由:

    # ip -6 route
    ...
    2001:db8:2::/64 via 2001:db8:1::10 dev enp1s0 metric 1024 pref medium
    Copy to Clipboard Toggle word wrap

27.8. 使用 nmstatectl 配置静态路由

您可以使用声明性 Nmstate API 来配置静态路由。nmstate 可确保结果与配置文件匹配或回滚更改。

前提条件

  • enp1s0 网络接口已配置,且与网关位于同一个 IP 子网。
  • nmstate 软件包已安装。

流程

  1. 创建一个包含以下内容的 YAML 文件,如 ~/add-static-route-to-enp1s0.yml

    ---
    routes:
      config:
      - destination: 198.51.100.0/24
        next-hop-address: 192.0.2.10
        next-hop-interface: enp1s0
      - destination: 2001:db8:2::/64
        next-hop-address: 2001:db8:1::10
        next-hop-interface: enp1s0
    Copy to Clipboard Toggle word wrap

    这些设置定义以下静态路由:

    • 到远程 198.51.100.0/24 网络的 IPv4 路由。IP 地址为 192.0.2.10 的对应网关可以通过 enp1s0 接口访问。
    • 到远程 2001:db8:2::/64 网络的 IPv6 路由。IP 地址为 2001:db8:1::10 的对应网关可以通过 enp1s0 接口访问。
  2. 将设置应用到系统:

    # nmstatectl apply ~/add-static-route-to-enp1s0.yml
    Copy to Clipboard Toggle word wrap

验证

  1. 显示 IPv4 路由:

    # ip -4 route
    ...
    198.51.100.0/24 via 192.0.2.10 dev enp1s0
    Copy to Clipboard Toggle word wrap
  2. 显示 IPv6 路由:

    # ip -6 route
    ...
    2001:db8:2::/64 via 2001:db8:1::10 dev enp1s0 metric 1024 pref medium
    Copy to Clipboard Toggle word wrap

27.9. 使用 network RHEL 系统角色配置静态路由

您可以使用 network RHEL 系统角色配置静态路由。

重要

当您运行一个使用 network RHEL 系统角色的 play 时,如果设置值与 play 中指定的值不匹配,则角色会使用相同的名称覆盖现有的连接配置文件。要防止将这些值重置为其默认值,请始终在 play 中指定网络连接配置文件的整个配置,即使配置(如 IP 配置)已存在。

先决条件

流程

  1. 创建一个包含以下内容的 playbook 文件,如 ~/playbook.yml

    ---
    - name: Configure the network
      hosts: managed-node-01.example.com
      tasks:
        - name: Ethernet connection profile with static IP address settings
          ansible.builtin.include_role:
            name: redhat.rhel_system_roles.network
          vars:
            network_connections:
              - 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
                  route:
                    - network: 198.51.100.0
                      prefix: 24
                      gateway: 192.0.2.10
                    - network: '2001:db8:2::'
                      prefix: 64
                      gateway: 2001:db8:1::10
                state: up
    Copy to Clipboard Toggle word wrap

    有关 playbook 中使用的所有变量的详情,请查看控制节点上的 /usr/share/ansible/roles/rhel-system-roles.network/README.md 文件。

  2. 验证 playbook 语法:

    $ ansible-playbook --syntax-check ~/playbook.yml
    Copy to Clipboard Toggle word wrap

    请注意,这个命令只验证语法,不能防止错误的、但有效的配置。

  3. 运行 playbook:

    $ ansible-playbook ~/playbook.yml
    Copy to Clipboard Toggle word wrap

验证

  1. 显示 IPv4 路由:

    # ansible managed-node-01.example.com -m command -a 'ip -4 route'
    managed-node-01.example.com | CHANGED | rc=0 >>
    ...
    198.51.100.0/24 via 192.0.2.10 dev enp7s0
    Copy to Clipboard Toggle word wrap
  2. 显示 IPv6 路由:

    # ansible managed-node-01.example.com -m command -a 'ip -6 route'
    managed-node-01.example.com | CHANGED | rc=0 >>
    ...
    2001:db8:2::/64 via 2001:db8:1::10 dev enp7s0 metric 1024 pref medium
    Copy to Clipboard Toggle word wrap

默认情况下,RHEL 内核使用路由表根据目标地址转发网络数据包。使用基于策略的路由,您可以配置复杂的场景,以根据各种条件(如源地址)路由数据包。

您可以使用基于策略的路由为来自特定子网的流量配置不同的默认网关。

例如,您可以将 RHEL 配置为默认路由,使用默认路由将所有流量路由到互联网提供商 A 。但是,从内部工作站子网接收的流量路由到供应商 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
    Copy to Clipboard Toggle word wrap

    nmcli connection add 命令创建 NetworkManager 连接配置文件。该命令使用以下选项:

    • type ethernet :定义连接类型为 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 会为分配给 external 区域的接口自动启用伪装。
  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
    Copy to Clipboard Toggle word wrap

    此命令使用 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
    Copy to Clipboard Toggle word wrap

    此命令使用 ipv4.routes 参数将静态路由添加到 ID 为 5000 的路由表中。10.0.0.0/24 子网的这个静态路由使用到供应商 B 的本地网络接口的 IP 地址(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
    Copy to Clipboard Toggle word wrap

验证

  1. 在内部工作站子网的 RHEL 主机上:

    1. 安装 traceroute 软件包:

      # dnf install traceroute
      Copy to Clipboard Toggle word wrap
    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.2 (192.0.2.2)   0.884 ms  1.066 ms  1.248 ms
       ...
      Copy to Clipboard Toggle word wrap

      命令的输出显示路由器通过 192.0.2.1 ,即提供商 B 的网络来发送数据包。

  2. 在服务器子网的 RHEL 主机上:

    1. 安装 traceroute 软件包:

      # dnf install traceroute
      Copy to Clipboard Toggle word wrap
    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
       ...
      Copy to Clipboard Toggle word wrap

      命令的输出显示路由器通过 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
    Copy to Clipboard Toggle word wrap

    默认情况下,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
    Copy to Clipboard Toggle word wrap
  3. 显示接口和防火墙区:

    # firewall-cmd --get-active-zones
    external
      interfaces: enp1s0 enp7s0
    trusted
      interfaces: enp8s0 enp9s0
    Copy to Clipboard Toggle word wrap
  4. 验证 external 区是否启用了伪装:

    # firewall-cmd --info-zone=external
    external (active)
      target: default
      icmp-block-inversion: no
      interfaces: enp1s0 enp7s0
      sources:
      services: ssh
      ports:
      protocols:
      masquerade: yes
      ...
    Copy to Clipboard Toggle word wrap

您可以使用基于策略的路由为来自特定子网的流量配置不同的默认网关。通过使用 network RHEL 系统角色,您可以自动创建连接配置文件,包括路由表和规则。

例如,您可以将 RHEL 配置为默认路由,使用默认路由将所有流量路由到互联网提供商 A 。但是,从内部工作站子网接收的流量被路由到供应商 B。通过使用 Ansible 和 network RHEL 系统角色,您可以自动化此过程,并对 playbook 中定义的主机并远程配置连接配置文件。

此流程假设以下网络拓扑:

policy based routing

前提条件

  • 您已准备好控制节点和受管节点
  • 您以可在受管主机上运行 playbook 的用户身份登录到控制节点。
  • 您用于连接到受管节点的帐户对它们具有 sudo 权限。
  • 受管节点使用 NetworkManager 和 firewalld 服务。
  • 您要配置的受管节点有 4 个网络接口:

    • 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 网络接口。

流程

  1. 创建一个包含以下内容的 playbook 文件,如 ~/playbook.yml

    ---
    - name: Configuring policy-based routing
      hosts: managed-node-01.example.com
      tasks:
        - name: Routing traffic from a specific subnet to a different default gateway
          ansible.builtin.include_role:
            name: redhat.rhel_system_roles.network
          vars:
            network_connections:
              - name: Provider-A
                interface_name: enp7s0
                type: ethernet
                autoconnect: True
                ip:
                  address:
                    - 198.51.100.1/30
                  gateway4: 198.51.100.2
                  dns:
                    - 198.51.100.200
                state: up
                zone: external
    
              - name: Provider-B
                interface_name: enp1s0
                type: ethernet
                autoconnect: True
                ip:
                  address:
                    - 192.0.2.1/30
                  route:
                    - network: 0.0.0.0
                      prefix: 0
                      gateway: 192.0.2.2
                      table: 5000
                state: up
                zone: external
    
              - name: Internal-Workstations
                interface_name: enp8s0
                type: ethernet
                autoconnect: True
                ip:
                  address:
                    - 10.0.0.1/24
                  route:
                    - network: 10.0.0.0
                      prefix: 24
                      table: 5000
                  routing_rule:
                    - priority: 5
                      from: 10.0.0.0/24
                      table: 5000
                state: up
                zone: trusted
    
              - name: Servers
                interface_name: enp9s0
                type: ethernet
                autoconnect: True
                ip:
                  address:
                    - 203.0.113.1/24
                state: up
                zone: trusted
    Copy to Clipboard Toggle word wrap

    示例 playbook 中指定的设置包括如下:

    table: <value>
    将来自相同列表条目中的路由作为 table 变量分配给指定的路由表。
    routing_rule: <list>
    定义指定路由规则的优先级,以及从连接配置文件到分配了规则的路由表的优先级。
    zone: <zone_name>
    将网络接口从一个连接配置文件分配给指定的 firewalld 区域。

    有关 playbook 中使用的所有变量的详情,请查看控制节点上的 /usr/share/ansible/roles/rhel-system-roles.network/README.md 文件。

  2. 验证 playbook 语法:

    $ ansible-playbook --syntax-check ~/playbook.yml
    Copy to Clipboard Toggle word wrap

    请注意,这个命令只验证语法,不能防止错误的、但有效的配置。

  3. 运行 playbook:

    $ ansible-playbook ~/playbook.yml
    Copy to Clipboard Toggle word wrap

验证

  1. 在内部工作站子网的 RHEL 主机上:

    1. 安装 traceroute 软件包:

      # dnf install traceroute
      Copy to Clipboard Toggle word wrap
    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.2 (192.0.2.2)   0.884 ms  1.066 ms  1.248 ms
       ...
      Copy to Clipboard Toggle word wrap

      命令的输出显示路由器通过 192.0.2.1 ,即提供商 B 的网络来发送数据包。

  2. 在服务器子网的 RHEL 主机上:

    1. 安装 traceroute 软件包:

      # dnf install traceroute
      Copy to Clipboard Toggle word wrap
    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
       ...
      Copy to Clipboard Toggle word wrap

      命令的输出显示路由器通过 198.51.100.2 ,即供应商 A 的网络来发送数据包。

  3. 在使用 RHEL 系统角色配置的 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
      Copy to Clipboard Toggle word wrap

      默认情况下,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
      Copy to Clipboard Toggle word wrap
    3. 显示接口和防火墙区:

      # firewall-cmd --get-active-zones
      external
        interfaces: enp1s0 enp7s0
      trusted
        interfaces: enp8s0 enp9s0
      Copy to Clipboard Toggle word wrap
    4. 验证 external 区是否启用了伪装:

      # firewall-cmd --info-zone=external
      external (active)
        target: default
        icmp-block-inversion: no
        interfaces: enp1s0 enp7s0
        sources:
        services: ssh
        ports:
        protocols:
        masquerade: yes
        ...
      Copy to Clipboard Toggle word wrap

使用虚拟路由和转发(VRF),管理员可以在同一主机上同时使用多个路由表。为此,VRF 将网络在第 3 层进行分区。这可让管理员使用每个 VRF 域的独立路由表隔离流量。这个技术与虚拟 LAN(虚拟 LAN)类似,后者在第二层为网络分区,其中操作系统使用不同的 VLAN 标签来隔离共享相同物理介质的流量。

VRF 优于在第二层上分区的好处是,路由会根据涉及的对等者数量进行更好地考虑。

Red Hat Enterprise Linux 为每个 VRF 域使用虚拟 vrt 设备,并通过向 VRF 设备添加现有网络设备来向 VRF 域添加路由。之前附加到原始设备的地址和路由将在 VRF 域中移动。

请注意,每个 VRF 域间都是相互隔离的。

您可以使用虚拟路由和转发(VRF)功能来对一个服务器的不同接口永久使用同样的 IP 地址。

重要

要在重新使用相同的 IP 地址时让远程对等两个 VRF 接口都联系,网络接口必须属于不同的广播域。网络中的广播域是一组节点,它们接收其中任何一个节点发送的广播流量。在大多数配置中,所有连接到同一交换机的节点都属于相同的域。

先决条件

  • root 用户身份登录。
  • 没有配置网络接口。

流程

  1. 创建并配置第一个 VRF 设备:

    1. 为 VRF 设备创建连接并将其分配到路由表中。例如,要创建一个分配给 1001 路由表、名为 vrf0 的 VRF 设备:

      # nmcli connection add type vrf ifname vrf0 con-name vrf0 table 1001 ipv4.method disabled ipv6.method disabled
      Copy to Clipboard Toggle word wrap
    2. 启用 vrf0 设备:

      # nmcli connection up vrf0
      Copy to Clipboard Toggle word wrap
    3. 为刚刚创建的 VRF 分配网络设备。例如,要向 vrf0 VRF 设备添加 enp1s0 以太网设备,并向 enp1s0 分配 IP 地址和子网掩码,请输入:

      # nmcli connection add type ethernet con-name vrf.enp1s0 ifname enp1s0 controller vrf0 ipv4.method manual ipv4.address 192.0.2.1/24
      Copy to Clipboard Toggle word wrap
    4. 激活 vrf.enp1s0 连接:

      # nmcli connection up vrf.enp1s0
      Copy to Clipboard Toggle word wrap
  2. 创建并配置下一个 VRF 设备:

    1. 创建 VRF 设备并将其分配到路由表中。例如,要创建一个分配给 1002 路由表、名为 vrf1 的 VRF 设备,请输入:

      # nmcli connection add type vrf ifname vrf1 con-name vrf1 table 1002 ipv4.method disabled ipv6.method disabled
      Copy to Clipboard Toggle word wrap
    2. 激活 vrf1 设备:

      # nmcli connection up vrf1
      Copy to Clipboard Toggle word wrap
    3. 为刚刚创建的 VRF 分配网络设备。例如,要向 vrf1 VRF 设备添加 enp7s0 以太网设备,并给 enp7s0 分配 IP 地址和子网掩码,请输入:

      # nmcli connection add type ethernet con-name vrf.enp7s0 ifname enp7s0 controller vrf1 ipv4.method manual ipv4.address 192.0.2.1/24
      Copy to Clipboard Toggle word wrap
    4. 激活 vrf.enp7s0 设备:

      # nmcli connection up vrf.enp7s0
      Copy to Clipboard Toggle word wrap

您可以使用虚拟路由和转发(VRF)功能来对一个服务器的不同接口临时使用同样的 IP 地址。这个过程仅用于测试目的,因为配置是临时的并在重启系统后会丢失。

重要

要在重新使用相同的 IP 地址时让远程对等两个 VRF 接口都联系,网络接口必须属于不同的广播域。广播域是一组节点,它们接收被其中任何一个发送的广播流量。在大多数配置中,所有连接到同一交换机的节点都属于相同的域。

先决条件

  • root 用户身份登录。
  • 没有配置网络接口。

流程

  1. 创建并配置第一个 VRF 设备:

    1. 创建 VRF 设备并将其分配到路由表中。例如,要创建一个分配给 1001 路由表、名为 blue 的 VRF 设备:

      # ip link add dev blue type vrf table 1001
      Copy to Clipboard Toggle word wrap
    2. 启用 blue 设备:

      # ip link set dev blue up
      Copy to Clipboard Toggle word wrap
    3. 为 VRF 设备分配网络设备。例如,要向 blue VRF 设备添加 enp1s0 以太网设备:

      # ip link set dev enp1s0 master blue
      Copy to Clipboard Toggle word wrap
    4. 启用 enp1s0 设备:

      # ip link set dev enp1s0 up
      Copy to Clipboard Toggle word wrap
    5. enp1s0 设备分配 IP 地址和子网掩码。例如,将其设为 192.0.2.1/24

      # ip addr add dev enp1s0 192.0.2.1/24
      Copy to Clipboard Toggle word wrap
  2. 创建并配置下一个 VRF 设备:

    1. 创建 VRF 设备并将其分配到路由表中。例如,要创建一个分配给 1002 路由表、名为 red 的 VRF 设备:

      # ip link add dev red type vrf table 1002
      Copy to Clipboard Toggle word wrap
    2. 启用 red 设备:

      # ip link set dev red up
      Copy to Clipboard Toggle word wrap
    3. 为 VRF 设备分配网络设备。例如,要向 red VRF 设备添加 enp7s0 以太网设备:

      # ip link set dev enp7s0 master red
      Copy to Clipboard Toggle word wrap
    4. 启用 enp7s0 设备:

      # ip link set dev enp7s0 up
      Copy to Clipboard Toggle word wrap
    5. enp7s0 设备分配与 blue VRF 域中 enp1s0 设备所使用的相同的 IP 地址和子网掩码:

      # ip addr add dev enp7s0 192.0.2.1/24
      Copy to Clipboard Toggle word wrap
  3. 可选:创建更多 VRF 设备,如上所述。

第 29 章 在隔离的 VRF 网络内启动服务

使用虚拟路由和转发(VRF),您可以使用与操作系统主路由表不同的路由表创建隔离网络。然后,您可以启动服务和应用程序,以便它们只能访问该路由表中定义的网络。

29.1. 配置 VRF 设备

要使用虚拟路由和转发(VRF),您可以创建一个 VRF 设备,并将物理或虚拟网络接口和路由信息附加给它。

警告

要防止您将自己远程锁定,请在本地控制台中或通过您不想分配给 VRF 设备的网络接口远程执行此流程。

先决条件

  • 您已在本地登录或使用与您要分配给 VRF 设备不同的网络接口。

流程

  1. 使用同命的虚拟设备创建 vrf0 连接,并将其附加到路由表 1000

    # nmcli connection add type vrf ifname vrf0 con-name vrf0 table 1000 ipv4.method disabled ipv6.method disabled
    Copy to Clipboard Toggle word wrap
  2. vrf0 连接添加 enp1s0 设备,并配置 IP 设置:

    # nmcli connection add type ethernet con-name enp1s0 ifname enp1s0 controller vrf0 ipv4.method manual ipv4.address 192.0.2.1/24 ipv4.gateway 192.0.2.254
    Copy to Clipboard Toggle word wrap

    此命令会创建 enp1s0 连接,来作为 vrf0 连接的端口。由于此配置,路由信息会自动分配给与 vrf0 设备关联的路由表 1000

  3. 如果您在隔离网络中需要静态路由:

    1. 添加静态路由:

      # nmcli connection modify enp1s0 +ipv4.routes "198.51.100.0/24 192.0.2.2"
      Copy to Clipboard Toggle word wrap

      这向 198.51.100.0/24 网络添加了一个路由,该网络使用 192.0.2.2 作为路由器。

    2. 激活连接:

      # nmcli connection up enp1s0
      Copy to Clipboard Toggle word wrap

验证

  1. 显示与 vrf0 关联的设备的 IP 设置:

    # ip -br addr show vrf vrf0
    enp1s0    UP    192.0.2.1/24
    Copy to Clipboard Toggle word wrap
  2. 显示 VRF 设备及其关联的路由表:

    # ip vrf show
    Name              Table
    -----------------------
    vrf0              1000
    Copy to Clipboard Toggle word wrap
  3. 显示主路由表:

    # ip route show
    default via 203.0.113.0/24 dev enp7s0 proto static metric 100
    Copy to Clipboard Toggle word wrap

    主路由表不会提到任何与 enp1s0 设备或 192.0.2.1/24 子网关联的路由。

  4. 显示路由表 1000

    # ip route show table 1000
    default via 192.0.2.254 dev enp1s0 proto static metric 101
    broadcast 192.0.2.0 dev enp1s0 proto kernel scope link src 192.0.2.1
    192.0.2.0/24 dev enp1s0 proto kernel scope link src 192.0.2.1 metric 101
    local 192.0.2.1 dev enp1s0 proto kernel scope host src 192.0.2.1
    broadcast 192.0.2.255 dev enp1s0 proto kernel scope link src 192.0.2.1
    198.51.100.0/24 via 192.0.2.2 dev enp1s0 proto static metric 101
    Copy to Clipboard Toggle word wrap

    default 条目表示使用此路由表的服务,将 192.0.2.254 用作其默认网关,而不是主路由表中的默认网关。

  5. 在与 vrf0 关联的网络中执行 traceroute 工具,以验证工具是否使用表 1000 的路由:

    # ip vrf exec vrf0 traceroute 203.0.113.1
    traceroute to 203.0.113.1 (203.0.113.1), 30 hops max, 60 byte packets
     1  192.0.2.254 (192.0.2.254)  0.516 ms  0.459 ms  0.430 ms
    ...
    Copy to Clipboard Toggle word wrap

    第一跳是分配给路由表 1000 的默认网关,而不是系统的主路由表中的默认网关。

29.2. 在隔离的 VRF 网络内启动服务

您可以将服务(如 Apache HTTP 服务器)配置为在隔离的虚拟路由和转发(VRF)网络中启动。

重要

服务只能绑定到同一 VRF 网络中的本地 IP 地址。

先决条件

  • 您已配置了 vrf0 设备。
  • 您已将 Apache HTTP 服务器配置为仅侦听分配给与 vrf0 设备关联的接口的 IP 地址。

流程

  1. 显示 httpd systemd 服务的内容:

    # systemctl cat httpd
    ...
    [Service]
    ExecStart=/usr/sbin/httpd $OPTIONS -DFOREGROUND
    ...
    Copy to Clipboard Toggle word wrap

    在后续步骤中需要 ExecStart 参数的内容,以在隔离的 VRF 网络中运行相同的命令。

  2. 创建 /etc/systemd/system/httpd.service.d/ 目录:

    # mkdir /etc/systemd/system/httpd.service.d/
    Copy to Clipboard Toggle word wrap
  3. 使用以下内容创建 /etc/systemd/system/httpd.service.d/override.conf 文件:

    [Service]
    ExecStart=
    ExecStart=/usr/sbin/ip vrf exec vrf0 /usr/sbin/httpd $OPTIONS -DFOREGROUND
    Copy to Clipboard Toggle word wrap

    要覆盖 ExecStart 参数,您首先需要对其取消设置,然后将其设为所示的新值。

  4. 重新加载 systemd 。

    # systemctl daemon-reload
    Copy to Clipboard Toggle word wrap
  5. 重新启动 httpd 服务。

    # systemctl restart httpd
    Copy to Clipboard Toggle word wrap

验证

  1. 显示 httpd 进程的进程 ID(PID):

    # pidof -c httpd
    1904 ...
    Copy to Clipboard Toggle word wrap
  2. 显示 PID 的 VRF 关联,例如:

    # ip vrf identify 1904
    vrf0
    Copy to Clipboard Toggle word wrap
  3. 显示与 vrf0 设备关联的所有 PID:

    # ip vrf pids vrf0
    1904  httpd
    ...
    Copy to Clipboard Toggle word wrap

NetworkManager 可以永久配置某些网络驱动程序和硬件设置。与使用 ethtool 工具管理这些设置相比,这有重启后不会丢失设置的好处。

您可以在 NetworkManager 连接配置文件中设置以下 ethtool 设置:

卸载功能
网络接口控制器可以使用 TCP 卸载引擎(TOE)将某些操作卸载到网络接口控制器。这提高了网络吞吐量。
中断合并设置
通过使用中断合并,系统收集网络数据包,并为多个数据包生成一个中断。这会增加使用一个硬件中断发送到内核的数据量,从而减少中断负载,并最大化吞吐量。
环缓冲区
这些缓冲区存储传入和传出的网络数据包。您可以增加环缓冲区的大小,以减少高数据包丢弃率。
渠道设置

网络接口管理其关联的频道数以及硬件设置和网络驱动程序。与网络接口关联的所有设备通过中断请求(IRQ)进行相互通信。每个设备队列保存待处理的 IRQ,并通过称为渠道的数据行进行相互通信。队列的类型与特定的渠道类型相关联。这些渠道类型包括:

  • 用于接收队列的 rx
  • 用于传输队列的 tx
  • 用于链路中断或单个根输入/输出虚拟化(SR-IOV)协调的 other
  • 用于基于硬件容量的多用途渠道的 combined

30.1. 使用 nmcli 配置 ethtool 卸载功能

您可以使用 NetworkManager 来在连接配置文件中启用和禁用 ethtool 卸载功能。

流程

  1. 例如:要启用 RX 卸载特性,并在 enp1s0 连接配置文件中禁用 TX 卸载,请输入:

    # nmcli con modify enp1s0 ethtool.feature-rx on ethtool.feature-tx off
    Copy to Clipboard Toggle word wrap

    这个命令明确启用 RX 卸载并禁用 TX 卸载功能。

  2. 要删除之前启用或禁用的卸载功能的设置,请将功能的参数设置为 null 值。例如,要删除 TX 卸载的配置,请输入:

    # nmcli con modify enp1s0 ethtool.feature-tx ""
    Copy to Clipboard Toggle word wrap
  3. 重新激活网络配置集:

    # nmcli connection up enp1s0
    Copy to Clipboard Toggle word wrap

验证

  • 使用 ethtool -k 命令显示网络设备的当前卸载特性:

    # ethtool -k network_device
    Copy to Clipboard Toggle word wrap

您可以使用 network RHEL 系统角色来自动配置 TCP 卸载引擎(TOE)将某些操作卸载到网络接口控制器。TOE 提高了网络吞吐量。

警告

您不能使用 network RHEL 系统角色只更新现有连接配置文件中的特定值。角色确保连接配置文件与 playbook 中的设置完全匹配。如果具有相同名称的连接配置文件存在,则角色将应用 playbook 中的设置,并将配置文件中的所有其他设置重置为其默认值。要防止重置值,请始终在 playbook 中指定网络连接配置文件的整个配置,包括您不想更改的设置。

先决条件

流程

  1. 创建一个包含以下内容的 playbook 文件,如 ~/playbook.yml

    ---
    - name: Configure the network
      hosts: managed-node-01.example.com
      tasks:
        - name: Ethernet connection profile with dynamic IP address settings and offload features
          ansible.builtin.include_role:
            name: redhat.rhel_system_roles.network
          vars:
            network_connections:
              - name: enp1s0
                type: ethernet
                autoconnect: yes
                ip:
                  dhcp4: yes
                  auto6: yes
                ethtool:
                  features:
                    gro: no
                    gso: yes
                    tx_sctp_segmentation: no
                state: up
    Copy to Clipboard Toggle word wrap

    示例 playbook 中指定的设置包括如下:

    gro: no
    禁用通用接收卸载(GRO)。
    gso: yes
    启用通用分段卸载(GSO)。
    tx_sctp_segmentation: no
    禁用 TX 流控制传输协议(SCTP)分段。

    有关 playbook 中使用的所有变量的详情,请查看控制节点上的 /usr/share/ansible/roles/rhel-system-roles.network/README.md 文件。

  2. 验证 playbook 语法:

    $ ansible-playbook --syntax-check ~/playbook.yml
    Copy to Clipboard Toggle word wrap

    请注意,这个命令只验证语法,不能防止错误的、但有效的配置。

  3. 运行 playbook:

    $ ansible-playbook ~/playbook.yml
    Copy to Clipboard Toggle word wrap

验证

  • 查询受管节点的 Ansible 事实,并验证卸载设置:

    # ansible managed-node-01.example.com -m ansible.builtin.setup
    ...
            "ansible_enp1s0": {
                "active": true,
                "device": "enp1s0",
    	    "features": {
    	        ...
    		"rx_gro_hw": "off,
    	        ...
    		"tx_gso_list": "on,
    	        ...
    		"tx_sctp_segmentation": "off",
    		...
                }
    ...
    Copy to Clipboard Toggle word wrap

30.3. 使用 nmcli 配置 ethtool coalesce 设置

您可以使用 NetworkManager 来在连接配置文件中设置 ethtool 合并设置。

流程

  1. 例如,要在 enp1s0 连接配置文件中将接收的数据包的最大数量设置为延迟到 128,请输入:

    # nmcli connection modify enp1s0 ethtool.coalesce-rx-frames 128
    Copy to Clipboard Toggle word wrap
  2. 要删除 coalesce 设置,请将其设置为 null 值。例如,要删除 ethtool.coalesce-rx-frames 设置,请输入:

    # nmcli connection modify enp1s0 ethtool.coalesce-rx-frames ""
    Copy to Clipboard Toggle word wrap
  3. 重新激活网络配置集:

    # nmcli connection up enp1s0
    Copy to Clipboard Toggle word wrap

验证

  • 使用 ethtool -c 命令显示网络设备的当前卸载特性:

    # ethtool -c network_device
    Copy to Clipboard Toggle word wrap

中断合并收集网络数据包,并为多个数据包生成一个中断。这可减少中断负载并最大化吞吐量。您可以使用 network RHEL 系统角色在 NetworkManager 连接配置集中自动配置这些设置。

警告

您不能使用 network RHEL 系统角色只更新现有连接配置文件中的特定值。角色确保连接配置文件与 playbook 中的设置完全匹配。如果具有相同名称的连接配置文件存在,则角色将应用 playbook 中的设置,并将配置文件中的所有其他设置重置为其默认值。要防止重置值,请始终在 playbook 中指定网络连接配置文件的整个配置,包括您不想更改的设置。

先决条件

流程

  1. 创建一个包含以下内容的 playbook 文件,如 ~/playbook.yml

    ---
    - name: Configure the network
      hosts: managed-node-01.example.com
      tasks:
        - name: Ethernet connection profile with dynamic IP address settings and coalesce settings
          ansible.builtin.include_role:
            name: redhat.rhel_system_roles.network
          vars:
            network_connections:
              - name: enp1s0
                type: ethernet
                autoconnect: yes
                ip:
                  dhcp4: yes
                  auto6: yes
                ethtool:
                  coalesce:
                    rx_frames: 128
                    tx_frames: 128
                state: up
    Copy to Clipboard Toggle word wrap

    示例 playbook 中指定的设置包括如下:

    rx_frames: <value>
    设置 RX 帧的数量。
    gso: <value>
    设置 TX 帧的数量。

    有关 playbook 中使用的所有变量的详情,请查看控制节点上的 /usr/share/ansible/roles/rhel-system-roles.network/README.md 文件。

  2. 验证 playbook 语法:

    $ ansible-playbook --syntax-check ~/playbook.yml
    Copy to Clipboard Toggle word wrap

    请注意,这个命令只验证语法,不能防止错误的、但有效的配置。

  3. 运行 playbook:

    $ ansible-playbook ~/playbook.yml
    Copy to Clipboard Toggle word wrap

验证

  • 显示网络设备的当前卸载功能:

    # ansible managed-node-01.example.com -m command -a 'ethtool -c enp1s0'
    managed-node-01.example.com | CHANGED | rc=0 >>
    ...
    rx-frames:	128
    ...
    tx-frames:	128
    ...
    Copy to Clipboard Toggle word wrap

如果数据包丢包率导致应用程序报告数据丢失、超时或其他问题,请增加以太网设备的环缓冲区的大小。

接收环缓冲在设备驱动程序和网络接口控制器(NIC)之间共享。该卡分配一个传输(TX)和接收(RX)环缓冲。名称意味着,环缓冲是循环缓冲区,溢出会覆盖现有数据。可以通过两种方法将数据从 NIC 移至内核,硬件中断和软件中断也称为 SoftIRQ。

内核使用 RX 环缓冲区来存储传入的数据包,直到设备驱动程序可以处理它们。设备驱动程序排空 RX 环,通常是使用 SoftIRQ,其将传入的数据包放在名为 sk_buffskb 的内核数据结构中,以通过内核开始其过程,直到拥有相关套接字的应用程序。

内核使用 TX 环缓冲区来存放应发送到网络的传出数据包。这些环缓冲区位于堆栈的底部,是可能发生数据包丢弃的关键点,这反过来会对网络性能造成负面影响。

流程

  1. 显示接口的数据包丢包统计信息:

    # ethtool -S enp1s0
        ...
        rx_queue_0_drops: 97326
        rx_queue_1_drops: 63783
        ...
    Copy to Clipboard Toggle word wrap

    请注意,命令的输出取决于网卡和驱动程序。

    discarddrop 计数器中的高值表示可用缓冲区的填满速度快于内核可以处理数据包的速度。增加环缓冲有助于避免此类丢失。

  2. 显示最大环缓冲大小:

    # ethtool -g enp1s0
     Ring parameters for enp1s0:
     Pre-set maximums:
     RX:             4096
     RX Mini:        0
     RX Jumbo:       16320
     TX:             4096
     Current hardware settings:
     RX:             255
     RX Mini:        0
     RX Jumbo:       0
     TX:             255
    Copy to Clipboard Toggle word wrap

    如果 Pre-set maximums 部分中的值大于 Current hardware settings 部分的值,您可以在下一步中更改设置。

  3. 确定使用接口的 NetworkManager 连接配置文件:

    # nmcli connection show
    NAME                UUID                                  TYPE      DEVICE
    Example-Connection  a5eb6490-cc20-3668-81f8-0314a27f3f75  ethernet  enp1s0
    Copy to Clipboard Toggle word wrap
  4. 更新连接配置文件,并增加环缓冲:

    • 要增加 RX 环缓冲区,请输入:

      # nmcli connection modify Example-Connection ethtool.ring-rx 4096
      Copy to Clipboard Toggle word wrap
    • 要增加 TX 环缓冲区,请输入:

      # nmcli connection modify Example-Connection ethtool.ring-tx 4096
      Copy to Clipboard Toggle word wrap
  5. 重新载入 NetworkManager 连接:

    # nmcli connection up Example-Connection
    Copy to Clipboard Toggle word wrap
    重要

    根据 NIC 使用的驱动程序,环缓冲中的更改可能会短暂中断网络连接。

如果数据包丢包率导致应用程序报告数据丢失、超时或其他问题,请增加以太网设备的环缓冲区的大小。

环缓冲区是循环缓冲区,溢出会覆盖现有数据。网卡分配一个传输(TX)和接收(RX)环缓冲区。接收环缓冲区在设备驱动程序和网络接口控制器(NIC)之间共享。数据可以通过硬件中断或软件中断(也称为 SoftIRQ)从 NIC 移到内核。

内核使用 RX 环缓冲区存储传入的数据包,直到设备驱动程序可以处理它们。设备驱动程序排空 RX 环,通常是使用 SoftIRQ,其将传入的数据包放在名为 sk_buffskb 的内核数据结构中,以通过内核开始其过程,直到拥有相关套接字的应用程序。

内核使用 TX 环缓冲区来存放应发送到网络的传出数据包。这些环缓冲区位于堆栈的底部,是可能发生数据包丢弃的关键点,这反过来会对网络性能造成负面影响。

您可以在 NetworkManager 连接配置文件中配置环缓冲设置。通过使用 Ansible 和 network RHEL 系统角色,您可以自动化此过程,并在 playbook 中定义的主机上远程配置连接配置文件。

警告

您不能使用 network RHEL 系统角色只更新现有连接配置文件中的特定值。角色确保连接配置文件与 playbook 中的设置完全匹配。如果具有相同名称的连接配置文件存在,则角色将应用 playbook 中的设置,并将配置文件中的所有其他设置重置为其默认值。要防止重置值,请始终在 playbook 中指定网络连接配置文件的整个配置,包括您不想更改的设置。

先决条件

  • 您已准备好控制节点和受管节点
  • 您以可在受管主机上运行 playbook 的用户身份登录到控制节点。
  • 您用于连接到受管节点的帐户对它们具有 sudo 权限。
  • 您知道设备支持的最大环缓冲区大小。

流程

  1. 创建一个包含以下内容的 playbook 文件,如 ~/playbook.yml

    ---
    - name: Configure the network
      hosts: managed-node-01.example.com
      tasks:
        - name: Ethernet connection profile with dynamic IP address setting and increased ring buffer sizes
          ansible.builtin.include_role:
            name: redhat.rhel_system_roles.network
          vars:
            network_connections:
              - name: enp1s0
                type: ethernet
                autoconnect: yes
                ip:
                  dhcp4: yes
                  auto6: yes
                ethtool:
                  ring:
                    rx: 4096
                    tx: 4096
                state: up
    Copy to Clipboard Toggle word wrap

    示例 playbook 中指定的设置包括如下:

    rx: <value>
    设置接收的环缓冲区条目的最大数。
    tx: <value>
    设置传输的环缓冲区条目的最大数。

    有关 playbook 中使用的所有变量的详情,请查看控制节点上的 /usr/share/ansible/roles/rhel-system-roles.network/README.md 文件。

  2. 验证 playbook 语法:

    $ ansible-playbook --syntax-check ~/playbook.yml
    Copy to Clipboard Toggle word wrap

    请注意,这个命令只验证语法,不能防止错误的、但有效的配置。

  3. 运行 playbook:

    $ ansible-playbook ~/playbook.yml
    Copy to Clipboard Toggle word wrap

验证

  • 显示最大环缓冲大小:

    # ansible managed-node-01.example.com -m command -a 'ethtool -g enp1s0'
    managed-node-01.example.com | CHANGED | rc=0 >>
    ...
    Current hardware settings:
    RX:             4096
    RX Mini:        0
    RX Jumbo:       0
    TX:             4096
    Copy to Clipboard Toggle word wrap

30.7. 使用 nmcli配置 ethtool 频道设置

ethtool 工具处理基于 IRQ 与相关设备的通信,以管理连接配置文件中的相关频道设置。使用 nmcli 工具在 NetworkManager 连接配置集中配置 ethtool 设置。

流程

  1. 显示与网络设备关联的渠道:

    # ethtool --show-channels enp1s0
    Channel parameters for enp1s0:
    Pre-set maximums:
    RX:		4
    TX:		3
    Other:	   10
    Combined:  63
    
    Current hardware settings:
    RX:   	 1
    TX:   	 1
    Other:   1
    Combined:  1
    Copy to Clipboard Toggle word wrap
  2. 更新网络接口的渠道设置:

    # nmcli connection modify enp1s0 ethtool.channels-rx 4 ethtool.channels-tx 3 ethtools.channels-other 9 ethtool.channels-combined 50
    Copy to Clipboard Toggle word wrap
  3. 重新激活网络配置文件:

    # nmcli connection up enp1s0
    Copy to Clipboard Toggle word wrap

验证

  • 检查与网络设备关联的更新的渠道设置:

    # ethtool --show-channels enp1s0
    Channel parameters for enp1s0:
    Pre-set maximums:
    RX:		4
    TX:		3
    Other:	  10
    Combined: 63
    
    Current hardware settings:
    RX:   	 4
    TX:   	 3
    Other:   9
    Combined:  50
    Copy to Clipboard Toggle word wrap

第 31 章 网络管理器调试介绍

对所有或某些域增加日志级别有助于记录 NetworkManager 所执行的操作的更多详情。您可以使用这些信息排查问题。

NetworkManager 提供不同的级别和域来生成日志信息。/etc/NetworkManager/NetworkManager.conf 文件是 NetworkManager 的主配置文件。日志存储在日志中。

31.1. NetworkManager reapply () 方法简介

NetworkManager 使用配置文件来管理设备连接设置,可以通过 D-Bus API 创建、修改或删除。当更改配置集时,D-Bus 会克隆设置。要应用这些更改,您必须重新激活连接的设置,或使用 reapply () 方法。

reapply() 方法具有以下功能:

  1. 在不停用或重启网络接口的情况下更新修改后的连接设置。
  2. 从修改后的连接设置中删除待处理的更改。因为 NetworkManager 不会恢复手动更改,因此您可以重新配置该设备并恢复外部或手动参数。
  3. 创建与现有连接设置不同的修改的连接设置。

另外,reapply() 方法支持以下属性:

  • bridge.ageing-time
  • bridge.forward-delay
  • bridge.group-address
  • bridge.group-forward-mask
  • bridge.hello-time
  • bridge.max-age
  • bridge.multicast-hash-max
  • bridge.multicast-last-member-count
  • bridge.multicast-last-member-interval
  • bridge.multicast-membership-interval
  • bridge.multicast-querier
  • bridge.multicast-querier-interval
  • bridge.multicast-query-interval
  • bridge.multicast-query-response-interval
  • bridge.multicast-query-use-ifaddr
  • bridge.multicast-router
  • bridge.multicast-snooping
  • bridge.multicast-startup-query-count
  • bridge.multicast-startup-query-interval
  • bridge.priority
  • bridge.stp
  • bridge.VLAN-filtering
  • bridge.VLAN-protocol
  • bridge.VLANs
  • 802-3-ethernet.accept-all-mac-addresses
  • 802-3-ethernet.cloned-mac-address
  • IPv4.addresses
  • IPv4.dhcp-client-id
  • IPv4.dhcp-iaid
  • IPv4.dhcp-timeout
  • IPv4.DNS
  • IPv4.DNS-priority
  • IPv4.DNS-search
  • IPv4.gateway
  • IPv4.ignore-auto-DNS
  • IPv4.ignore-auto-routes
  • IPv4.may-fail
  • IPv4.method
  • IPv4.never-default
  • IPv4.route-table
  • IPv4.routes
  • IPv4.routing-rules
  • IPv6.addr-gen-mode
  • IPv6.addresses
  • IPv6.dhcp-duid
  • IPv6.dhcp-iaid
  • IPv6.dhcp-timeout
  • IPv6.DNS
  • IPv6.DNS-priority
  • IPv6.DNS-search
  • IPv6.gateway
  • IPv6.ignore-auto-DNS
  • IPv6.may-fail
  • IPv6.method
  • IPv6.never-default
  • IPv6.ra-timeout
  • IPv6.route-metric
  • IPv6.route-table
  • IPv6.routes
  • IPv6.routing-rules

31.2. 设置 NetworkManager 日志级别

默认情况下,所有日志域都设为记录 INFO 日志级别。在收集调试日志前禁用速率限制。通过速率限制,如果短时间内有太多信息,systemd-journald 会丢弃它们。当日志级别为 TRACE 时,可能会发生这种情况。

此流程禁用速率限制,并为所有(ALL)域启用记录调试日志。

流程

  1. 要禁用速率限制,请编辑 /etc/systemd/journald.conf 文件,取消 [Journal] 部分中的 RateLimitBurst 参数的注释,并将其值设为 0

    RateLimitBurst=0
    Copy to Clipboard Toggle word wrap
  2. 重启 systemd-journald 服务。

    # systemctl restart systemd-journald
    Copy to Clipboard Toggle word wrap
  3. 使用以下内容创建 /etc/NetworkManager/conf.d/95-nm-debug.conf 文件:

    [logging]
    domains=ALL:TRACE
    Copy to Clipboard Toggle word wrap

    domains 参数可以包含多个用逗号分隔的 domain:level 对。

  4. 重启 NetworkManager 服务。

    # systemctl restart NetworkManager
    Copy to Clipboard Toggle word wrap

验证

  • 查询 systemd 日志以显示 NetworkManager 单元的日志条目:

    # journalctl -u NetworkManager
    ...
    Jun 30 15:24:32 server NetworkManager[164187]: <debug> [1656595472.4939] active-connection[0x5565143c80a0]: update activation type from assume to managed
    Jun 30 15:24:32 server NetworkManager[164187]: <trace> [1656595472.4939] device[55b33c3bdb72840c] (enp1s0): sys-iface-state: assume -> managed
    Jun 30 15:24:32 server NetworkManager[164187]: <trace> [1656595472.4939] l3cfg[4281fdf43e356454,ifindex=3]: commit type register (type "update", source "device", existing a369f23014b9ede3) -> a369f23014b9ede3
    Jun 30 15:24:32 server NetworkManager[164187]: <info>  [1656595472.4940] manager: NetworkManager state is now CONNECTED_SITE
    ...
    Copy to Clipboard Toggle word wrap

31.3. 使用 nmcli 临时设置运行时的日志级别

您可以使用 nmcli 更改运行时的日志级别。

流程

  1. 可选:显示当前的日志设置:

    # nmcli general logging
      LEVEL  DOMAINS
      INFO   PLATFORM,RFKILL,ETHER,WIFI,BT,MB,DHCP4,DHCP6,PPP,WIFI_SCAN,IP4,IP6,A
    UTOIP4,DNS,VPN,SHARING,SUPPLICANT,AGENTS,SETTINGS,SUSPEND,CORE,DEVICE,OLPC,
    WIMAX,INFINIBAND,FIREWALL,ADSL,BOND,VLAN,BRIDGE,DBUS_PROPS,TEAM,CONCHECK,DC
    B,DISPATCH
    Copy to Clipboard Toggle word wrap
  2. 要修改日志级别和域,请使用以下选项:

    • 要将所有域的日志级别都设为同样的 LEVEL,请输入:

      # nmcli general logging level LEVEL domains ALL
      Copy to Clipboard Toggle word wrap
    • 要更改特定域的级别,请输入:

      # nmcli general logging level LEVEL domains DOMAINS
      Copy to Clipboard Toggle word wrap

      请注意,使用这个命令更新日志级别会禁用所有其他域的日志功能。

    • 要更改特定域的级别并保持其它域的级别,请输入:

      # nmcli general logging level KEEP domains DOMAIN:LEVEL,DOMAIN:LEVEL
      Copy to Clipboard Toggle word wrap

31.4. 查看 NetworkManager 日志

您可以查看 NetworkManager 日志进行故障排除。

流程

  • 要查看日志,请输入:

    # journalctl -u NetworkManager -b
    Copy to Clipboard Toggle word wrap

31.5. 调试级别和域

您可以使用 levelsdomains 参数来管理 NetworkManager 的调试。levels 定义了详细程度,而 domains 定义了消息的类别,以记录给定的严重程度(级别)的日志。

Expand
日志级别描述

OFF

不记录任何有关 NetworkManager 的信息

ERR

仅记录严重错误

WARN

记录可以反映操作的警告信息

INFO

记录各种有助于跟踪状态和操作的信息

DEBUG

为调试启用详细日志记录

TRACE

启用比 DEBUG 级别更详细的日志

请注意,后续的级别记录来自以前级别的所有信息。例如,将日志级别设为 INFO 也会记录包含在 ERRWARN 日志级别中的消息。

第 32 章 使用 LLDP 来调试网络配置问题

您可以使用链路层发现协议(LLDP)来调试拓扑中的网络配置问题。这意味着 LLDP 可以报告与其他主机或路由器以及交换机的配置不一致。

32.1. 使用 LLDP 信息调试不正确的 VLAN 配置

如果您将交换机端口配置为使用特定的 VLAN ,而主机没有收到这些 VLAN 数据包,则您可以使用链路层发现协议(LLDP)来调试问题。

先决条件

  • nmstate 软件包已安装。
  • 交换机支持 LLDP。
  • LLDP 在邻居设备上已启用。

流程

  1. 使用以下内容创建 ~/enable-LLDP-enp1s0.yml 文件:

    interfaces:
      - name: enp1s0
        type: ethernet
        lldp:
          enabled: true
    Copy to Clipboard Toggle word wrap
  2. 使用 ~/enable-LLDP-enp1s0.yml 文件来在接口 enp1s0 上启用 LLDP:

    # nmstatectl apply ~/enable-LLDP-enp1s0.yml
    Copy to Clipboard Toggle word wrap
  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
    Copy to Clipboard Toggle word wrap
  4. 验证输出,以确保设置与您预期的配置匹配。例如,连接到交换机的接口的 LLDP 信息显示此主机连接的交换机端口使用 VLAN ID 448:

    - type: 127
            ieee-802-1-vlans:
            - name: v2-0488-03-0505
              vid: 488
    Copy to Clipboard Toggle word wrap

    如果 enp1s0 接口的网络配置使用不同的 VLAN ID,请相应地进行修改。

第 33 章 Linux 流量控制

Linux 流量控制(TC)帮助策略、分类、控制和调度网络流量。它使用排队规则(qdisc)和过滤器来管理和操作数据包传输,包括 mangling packet content。

调度机制在进入或退出不同的队列前确定或者重新安排数据包。最常见的调度程序是先入先出(FIFO)调度程序。您可以使用 tc 工具临时执行 qdiscs 操作,也可以使用 NetworkManager 永久执行操作。

在 Red Hat Enterprise Linux 中,您可以使用各种方法配置默认的排队规则来管理网络接口上的流量。

33.1. 排队规则概述

排队规则(qdiscs)帮助排队,之后通过网络接口调度流量传输。

qdisc 有两个操作:

  • 排队请求,以便在以后传输时对数据包进行排队
  • 出队请求,以便可以选择其中一个排队的数据包进行即时传输。

每个 qdisc 都有一个 16 位十六进制标识数字,称为 句柄,带有一个附加的冒号,如 1:abcd:这个数字被称为 qdisc 主号码。如果 qdisc 有类,则标识符是由两个数字组成的对,主号码在次要号码之前,即 <major>:<minor>,例如 abcd:1。次要号码的编号方案取决于 qdisc 类型。有时,编号是系统化的,其中第一类的 ID 为 < <major>:1,第二类的 ID 为 <major>:2 ,等等。一些 qdiscs 允许用户在创建类时随机设置类的次要号码。

qdiscs

存在不同类型的 qdiscs,帮助向和从网络接口传输数据包。您可以使用根、父或子类配置 qdiscs。子对象可以被附加的位置称为类。qdisc 中的类是灵活的,始终包含多个子类或一个子类 qdisc。不禁止包含类 qdisc 本身的类,这有助于实现复杂的流量控制场景。

qdiscs 本身不存储任何数据包。相反,它们根据特定于 qdisc 的标准,将排队和出队请求传到它们其中的一个子类。最后,这个递归数据包传递最终结束保存数据包的位置(在出现排队时从中提取)。

无类别 qdiscs
有些 qdiscs 不包含子类,它们称为无类别 qdiscs。与类 qdiscs 相比,无类别 qdiscs 需要较少的自定义。通常情况下,将它们附加到接口就足够了。

33.2. 连接跟踪简介

连接跟踪是逻辑网络的一个 Linux 内核网络功能,其跟踪这些连接中的连接,并识别数据包流。

在防火墙中,Netfilter 框架过滤来自外部网络的数据包。数据包到达后,Netfilter 分配一个连接跟踪条目。连接跟踪过滤器并分析每个数据包,设置连接跟踪表以存储连接状态,并根据识别的数据包更新连接状态。例如,如果是 FTP 连接,Netfilter 会分配一个连接跟踪条目,以确保 FTP 连接的所有数据包都以同样的方式工作。连接跟踪条目存储一个 Netfilter 标记,并在内存表中跟踪连接状态信息,其中新数据包元组与现有条目进行映射。如果数据包元组没有与现有条目进行映射,则数据包会添加一个新的连接跟踪条目,该条目将对同一连接的数据包进行分组。

您可以控制和分析网络接口上的流量。tc 流量控制器工具使用 qdisc 规程配置网络中的数据包调度程序。qdisc 内核配置的排队规程将数据包排队到接口。通过使用 qdisc,内核在网络接口传输流量前捕获所有流量。另外,要限制属于同一连接的数据包的带宽率,请使用 tc qdisc 命令。

要把连接跟踪标记中的数据检索到各个字段,请使用带有 ctinfo 模块的 tc 工具以及 connmark 功能。对于存储数据包标记信息,ctinfo 模块将 Netfilter 标记和连接状态信息复制到套接字缓冲区(skb)标记元数据字段中。

通过物理介质传输数据包会删除数据包的所有元数据。在数据包丢失其元数据之前,ctinfo 模块会将 Netfilter 标记值映射并复制到数据包 IP 字段中的 Diffserv 代码点(DSCP)的特定值。

33.3. 使用 tc 工具检查网络接口的 qdiscs

默认情况下,Red Hat Enterprise Linux 系统使用 fq_codel qdisc。您可以使用 tc 工具检查 qdisc 计数器。

流程

  1. 可选:查看您当前的 qdisc

    # tc qdisc show dev enp0s1
    Copy to Clipboard Toggle word wrap
  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
    Copy to Clipboard Toggle word wrap
    • dropped - 由于所有队列已满而丢弃数据包的次数
    • overlimits - 配置的链路容量已满的次数
    • sent - 出队的数量

33.4. 更新默认的 qdisc

如果使用当前的 qdisc 观察网络数据包丢失情况,您可以根据您的网络要求更改 qdisc

流程

  1. 查看当前的默认的 qdisc

    # sysctl -a | grep qdisc
    net.core.default_qdisc = fq_codel
    Copy to Clipboard Toggle word wrap
  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
    Copy to Clipboard Toggle word wrap
  3. 更新现有的 qdisc

    # sysctl -w net.core.default_qdisc=pfifo_fast
    Copy to Clipboard Toggle word wrap
  4. 要应用更改,请重新加载网络驱动程序:

    # modprobe -r NETWORKDRIVERNAME
    # modprobe NETWORKDRIVERNAME
    Copy to Clipboard Toggle word wrap
  5. 启动网络接口:

    # ip link set enp0s1 up
    Copy to Clipboard Toggle word wrap

验证

  • 查看以太网连接的 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
    ....
    Copy to Clipboard Toggle word wrap

更改当前的 qdisc 可优化内核如何通过网络接口来处理数据包的方式。对于测试和基准测试目的,您可以临时更改 qdisc

流程

  1. 可选:查看当前的 qdisc

    # tc -s qdisc show dev enp0s1
    Copy to Clipboard Toggle word wrap
  2. 更新当前的 qdisc

    # tc qdisc replace dev enp0s1 root htb
    Copy to Clipboard Toggle word wrap

验证

  • 查看更新后的当前 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
    Copy to Clipboard Toggle word wrap

更改当前的 qdisc 可优化内核如何通过网络接口来处理数据包的方式。如果您为场景确定了最佳 qdisc,请在 NetworkManager 连接配置文件中永久设置它。

流程

  1. 可选:查看当前的 qdisc

    # tc qdisc show dev enp0s1
      qdisc fq_codel 0: root refcnt 2
    Copy to Clipboard Toggle word wrap
  2. 更新当前的 qdisc

    # nmcli connection modify enp0s1 tc.qdiscs 'root pfifo_fast'
    Copy to Clipboard Toggle word wrap
  3. 可选:要在现有的 qdisc 上添加另一个 qdisc,请使用 +tc.qdisc 选项:

    # nmcli connection modify enp0s1 +tc.qdisc 'ingress handle ffff:'
    Copy to Clipboard Toggle word wrap
  4. 激活更改:

    # nmcli connection up enp0s1
    Copy to Clipboard Toggle word wrap

验证

  • 查看网络接口当前的 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 ----------------
    Copy to Clipboard Toggle word wrap

33.7. 使用 tc-ctinfo 工具配置数据包的速率限制

通过速率限制,您可以限制网络流量,防止网络中的资源耗尽,并通过限制特定时间段内重复数据包请求来减少服务器上的负载。

连接跟踪条目存储 Netfilter 标记和连接信息。当路由器转发来自防火墙的数据包时,路由器会删除或修改数据包的连接跟踪条目。连接跟踪信息(ctinfo)模块将数据从连接跟踪标记检索到各个字段。此内核模块通过将 Netfilter 标记复制到套接字缓冲区(skb)标记元数据字段来保留 Netfilter 标记。

先决条件

  • iperf3 工具安装在服务器和客户端上。

流程

  1. 在服务器上执行以下步骤:

    1. 在网络接口中添加一个虚拟链接:

      # ip link add name ifb4eth0 numtxqueues 48 numrxqueues 48 type ifb
      Copy to Clipboard Toggle word wrap

      这个命令有以下参数:

      name ifb4eth0
      设置新的虚拟设备接口。
      numtxqueues 48
      设置传输队列的数量。
      numrxqueues 48
      设置接收队列的数量。
      type ifb
      设置新设备的类型。
    2. 更改接口的状态:

      # ip link set dev ifb4eth0 up
      Copy to Clipboard Toggle word wrap
    3. 在物理网络接口上添加 qdisc 属性,并将其应用到传入流量:

      # tc qdisc add dev enp1s0 handle ffff: ingress
      Copy to Clipboard Toggle word wrap

      handle ffff: 选项中,handle 参数将主号 ffff: 作为默认值分配给 enp1s0 物理网络接口上的类 qdisc,其中 qdisc 是一个分析流量控制的排队规则参数。

    4. ip 协议的物理接口上添加一个过滤器,以对数据包进行分类:

      # tc filter add dev enp1s0 parent ffff: protocol ip u32 match u32 0 0 action ctinfo cpmark 100 action mirred egress redirect dev ifb4eth0
      Copy to Clipboard Toggle word wrap

      这个命令有以下属性:

      parent ffff:
      为父 qdisc 设置主号 ffff:
      u32 match u32 0 0
      设置 u32 过滤器,以 匹配 u32 模式的 IP 标头。第一个 0 表示 IP 标头的第二个字节,另一个 0 用于掩码匹配,告知过滤器要匹配哪个位。
      action ctinfo
      设置操作,以将连接跟踪标记的数据检索到各个字段。
      cpmark 100
      将连接跟踪标记(connmark) 100 复制到数据包 IP 标头字段中。
      action mirred egress redirect dev ifb4eth0
      action 设置为 mirred ,来将接收的数据包重定向到 ifb4eth0 目的地接口。
    5. 向接口中添加类 qdisc

      # tc qdisc add dev ifb4eth0 root handle 1: htb default 1000
      Copy to Clipboard Toggle word wrap

      此命令将主号 1 设置为 root qdisc,并将 htb 层次结构令牌存储桶与 minor-id 1000 的类 qdisc 一起使用。

    6. 将接口上的流量限制为 1 Mbit/s,上限为 2 Mbit/s:

      # tc class add dev ifb4eth0 parent 1:1 classid 1:100 htb ceil 2mbit rate 1mbit prio 100
      Copy to Clipboard Toggle word wrap

      这个命令有以下参数:

      parent 1:1
      parent 设为 classid1,将 root 设为 1
      classid 1:100
      classid 设置为 1:100,其中 1 是父 qdisc 的数量,100 是父 qdisc 的类的数量。
      htb ceil 2mbit
      htbqdisc 允许上限带宽 2 Mbit/s 作为 ceil 速率限制。
    7. 将无类别 qdisc 的 Stochastic Fairness Queuing (sfq)应用到 时间间隔为 60 秒的接口,以减少队列算法的影响:

      # tc qdisc add dev ifb4eth0 parent 1:100 sfq perturb 60
      Copy to Clipboard Toggle word wrap
    8. 在接口中添加防火墙标记(fw)过滤器:

      # tc filter add dev ifb4eth0 parent 1:0 protocol ip prio 100 handle 100 fw classid 1:100
      Copy to Clipboard Toggle word wrap
    9. 从连接标记(CONNMARK)恢复数据包元标记:

      # nft add rule ip mangle PREROUTING counter meta mark set ct mark
      Copy to Clipboard Toggle word wrap

      在这个命令中,nft 工具有一个带有 PREROUTING 链规则规范的 mangle 表,该表在路由之前更改传入的数据包,来将数据包标记替换为 CONNMARK

    10. 如果没有 nft 表和链存在,请创建一个表并添加一个链规则:

      # nft add table ip mangle
      # nft add chain ip mangle PREROUTING {type filter hook prerouting priority mangle \;}
      Copy to Clipboard Toggle word wrap
    11. 在指定目标地址 192.0.2.3 上接收的 tcp 数据包上设置 meta 标记:

      # nft add rule ip mangle PREROUTING ip daddr 192.0.2.3 counter meta mark set 0x64
      Copy to Clipboard Toggle word wrap
    12. 将数据包标记保存到连接标记中:

      # nft add rule ip mangle PREROUTING counter ct mark set mark
      Copy to Clipboard Toggle word wrap
    13. 使用 -s 参数在系统上运行 iperf3 工具来作为服务器,然后服务器等待客户端连接的响应:

      # iperf3 -s
      Copy to Clipboard Toggle word wrap
  2. 在客户端上,将 iperf3 作为客户端运行,并连接到在 IP 地址 192.0.2.3 上侦听定期的 HTTP 请求响应时间戳的服务器:

    # iperf3 -c 192.0.2.3 -t TCP_STREAM | tee rate
    Copy to Clipboard Toggle word wrap

    192.0.2.3 是服务器的 IP 地址,而 192.0.2.4 是客户端的 IP 地址。

  3. Ctrl+C 终止服务器上的 iperf3 工具:

    Accepted connection from 192.0.2.4, port 52128
    [5]  local 192.0.2.3 port 5201 connected to 192.0.2.4 port 52130
    [ID] Interval       	Transfer 	Bitrate
    [5]   0.00-1.00   sec   119 KBytes   973 Kbits/sec
    [5]   1.00-2.00   sec   116 KBytes   950 Kbits/sec
    ...
    [ID] Interval       	Transfer 	Bitrate
    [5]   0.00-14.81  sec  1.51 MBytes   853 Kbits/sec  receiver
    
    iperf3: interrupt - the server has terminated
    Copy to Clipboard Toggle word wrap
  4. Ctrl+C 终止客户端上的 iperf3 工具:

    Connecting to host 192.0.2.3, port 5201
    [5] local 192.0.2.4 port 52130 connected to 192.0.2.3 port 5201
    [ID] Interval       	Transfer 	Bitrate     	Retr  Cwnd
    [5]   0.00-1.00   sec   481 KBytes  3.94 Mbits/sec	0   76.4 KBytes
    [5]   1.00-2.00   sec   223 KBytes  1.83 Mbits/sec	0   82.0 KBytes
    ...
    [ID] Interval       	Transfer 	Bitrate     	Retr
    [5]   0.00-14.00  sec  3.92 MBytes  2.35 Mbits/sec   32     sender
    [5]   0.00-14.00  sec  0.00 Bytes  0.00 bits/sec            receiver
    
    iperf3: error - the server has terminated
    Copy to Clipboard Toggle word wrap

验证

  1. 显示接口上 htbsfq 类的数据包计数的统计信息:

    # tc -s qdisc show dev ifb4eth0
    
    qdisc htb 1: root
    ...
     Sent 26611455 bytes 3054 pkt (dropped 76, overlimits 4887 requeues 0)
    ...
    qdisc sfq 8001: parent
    ...
     Sent 26535030 bytes 2296 pkt (dropped 76, overlimits 0 requeues 0)
    ...
    Copy to Clipboard Toggle word wrap
  2. 显示 mirredctinfo 操作的数据包计数的统计信息:

    # tc -s filter show dev enp1s0 ingress
    filter parent ffff: protocol ip pref 49152 u32 chain 0
    filter parent ffff: protocol ip pref 49152 u32 chain 0 fh 800: ht divisor 1
    filter parent ffff: protocol ip pref 49152 u32 chain 0 fh 800::800 order 2048 key ht 800 bkt 0 terminal flowid not_in_hw (rule hit 8075 success 8075)
      match 00000000/00000000 at 0 (success 8075 )
        action order 1: ctinfo zone 0 pipe
          index 1 ref 1 bind 1 cpmark 0x00000064 installed 3105 sec firstused 3105 sec DSCP set 0 error 0
          CPMARK set 7712
        Action statistics:
        Sent 25891504 bytes 3137 pkt (dropped 0, overlimits 0 requeues 0)
        backlog 0b 0p requeues 0
    
        action order 2: mirred (Egress Redirect to device ifb4eth0) stolen
           index 1 ref 1 bind 1 installed 3105 sec firstused 3105 sec
        Action statistics:
        Sent 25891504 bytes 3137 pkt (dropped 0, overlimits 61 requeues 0)
        backlog 0b 0p requeues 0
    Copy to Clipboard Toggle word wrap
  3. 显示 htb 速率限制器及其配置的统计信息:

    # tc -s class show dev ifb4eth0
    class htb 1:100 root leaf 8001: prio 7 rate 1Mbit ceil 2Mbit burst 1600b cburst 1600b
     Sent 26541716 bytes 2373 pkt (dropped 61, overlimits 4887 requeues 0)
     backlog 0b 0p requeues 0
     lended: 7248 borrowed: 0 giants: 0
     tokens: 187250 ctokens: 93625
    Copy to Clipboard Toggle word wrap

33.8. RHEL 中可用的 qdiscs

每个 qdisc 解决唯一的与网络相关的问题。您可以根据您的网络要求使用其中任何一个来塑造网络流量。

RHEL 中提供了这些 qdiscs

Expand
表 33.1. RHEL 中的可用调度程序
qdisc 名称包含在卸载支持

Credit-Based Shaper

kernel-modules-extra

CHOose 和 Keep 用于有响应的流量,CHOose 和 Kill 用于没有响应的流量(CHOKE)

kernel-modules-extra

 

受控的延迟(CoDel)

kernel-core

 

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 的硬件和驱动程序的支持。

基于端口的网络访问控制(NAC),基于 IEEE 802.1X 标准,保护网络不受未授权的客户端。如果网络使用可扩展身份验证协议传输层安全(EAP-TLS),则需要一个证书来验证客户端。

您可以使用 nmcli 工具在命令行上配置带有 802.1X 网络身份验证的以太网连接。

先决条件

  • 网络支持 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/private/client.key
    Copy to Clipboard Toggle word wrap

    请注意,您必须在一个命令中设置 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
    Copy to Clipboard Toggle word wrap
  3. 设置证书中使用的用户的身份:

    # nmcli connection modify enp1s0 802-1x.identity user@example.com
    Copy to Clipboard Toggle word wrap
  4. 可选:将密码存储在配置中:

    # nmcli connection modify enp1s0 802-1x.private-key-password password
    Copy to Clipboard Toggle word wrap
    重要

    默认情况下,NetworkManager 将密码以明文形式存储在磁盘上的连接配置文件中,但该文件只对 root 用户可读。但是,在配置文件中清除文本密码会有安全隐患。

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

  5. 激活连接配置集:

    # nmcli connection up enp1s0
    Copy to Clipboard Toggle word wrap

验证

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

您可以使用声明性 Nmstate API 来配置带有 802.1X 网络身份验证的以太网连接。nmstate 可确保结果与配置文件匹配或回滚更改。

注意

nmstate 库只支持 TLS 可扩展身份验证协议(EAP)方法。

先决条件

  • 网络支持 802.1X 网络身份验证。
  • 受管节点使用 NetworkManager。
  • 客户端上存在 TLS 身份验证所需的以下文件:

    • 存储的客户端密钥位于 /etc/pki/tls/private/client.key 文件中,该文件归 root 用户所有,且只对 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
    Copy to Clipboard Toggle word wrap

    这些设置使用以下设置为 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 网络身份验证
  2. 将设置应用到系统:

    # nmstatectl apply ~/create-ethernet-profile.yml
    Copy to Clipboard Toggle word wrap

验证

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

通过使用 network RHEL 系统角色,您可以在远程主机上自动设置网络访问控制(NAC)。您可以在 playbook 中为客户端定义身份验证详情,以确保只有授权的客户端才能访问网络。

您可以使用 Ansible playbook 将私钥、证书和 CA 证书复制到客户端,然后使用 network RHEL 系统角色配置具有 802.1X 网络身份验证的连接配置文件。

先决条件

  • 您已准备好控制节点和受管节点
  • 您以可在受管主机上运行 playbook 的用户身份登录到控制节点。
  • 您用于连接到受管节点的帐户对它们具有 sudo 权限。
  • 网络支持 802.1X 网络身份验证。
  • 受管节点使用 NetworkManager。
  • 以下 TLS 身份验证所需的文件在控制节点上存在:

    • 客户端密钥存储在 /srv/data/client.key 文件中。
    • 客户端证书存储在 /srv/data/client.crt 文件中。
    • 证书颁发机构(CA)证书存储在 /srv/data/ca.crt 文件中。

流程

  1. 将敏感变量存储在加密的文件中:

    1. 创建 vault :

      $ ansible-vault create ~/vault.yml
      New Vault password: <vault_password>
      Confirm New Vault password: <vault_password>
      Copy to Clipboard Toggle word wrap
    2. ansible-vault create 命令打开编辑器后,以 <key>: <value> 格式输入敏感数据:

      pwd: <password>
      Copy to Clipboard Toggle word wrap
    3. 保存更改,并关闭编辑器。Ansible 加密 vault 中的数据。
  2. 创建一个包含以下内容的 playbook 文件,如 ~/playbook.yml

    ---
    - name: Configure an Ethernet connection with 802.1X authentication
      hosts: managed-node-01.example.com
      vars_files:
        - ~/vault.yml
      tasks:
        - name: Copy client key for 802.1X authentication
          ansible.builtin.copy:
            src: "/srv/data/client.key"
            dest: "/etc/pki/tls/private/client.key"
            mode: 0600
    
        - name: Copy client certificate for 802.1X authentication
          ansible.builtin.copy:
            src: "/srv/data/client.crt"
            dest: "/etc/pki/tls/certs/client.crt"
    
        - name: Copy CA certificate for 802.1X authentication
          ansible.builtin.copy:
            src: "/srv/data/ca.crt"
            dest: "/etc/pki/ca-trust/source/anchors/ca.crt"
    
        - name: Ethernet connection profile with static IP address settings and 802.1X
          ansible.builtin.include_role:
            name: redhat.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: "{{ pwd }}"
                  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
    Copy to Clipboard Toggle word wrap

    示例 playbook 中指定的设置包括如下:

    ieee802_1x
    此变量包含与 802.1X 相关的设置。
    eap: tls
    将配置文件配置为对可扩展身份验证协议(EAP)使用基于证书的 TLS 身份验证方法。

    有关 playbook 中使用的所有变量的详情,请查看控制节点上的 /usr/share/ansible/roles/rhel-system-roles.network/README.md 文件。

  3. 验证 playbook 语法:

    $ ansible-playbook --ask-vault-pass --syntax-check ~/playbook.yml
    Copy to Clipboard Toggle word wrap

    请注意,这个命令只验证语法,不能防止错误的、但有效的配置。

  4. 运行 playbook:

    $ ansible-playbook --ask-vault-pass ~/playbook.yml
    Copy to Clipboard Toggle word wrap

验证

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

通过使用 network RHEL 系统角色,您可以在远程主机上自动设置网络访问控制(NAC)。您可以在 playbook 中为客户端定义身份验证详情,以确保只有授权的客户端才能访问网络。

您可以使用 Ansible playbook 将私钥、证书和 CA 证书复制到客户端,然后使用 network RHEL 系统角色配置具有 802.1X 网络身份验证的连接配置文件。

先决条件

  • 您已准备好控制节点和受管节点
  • 您以可在受管主机上运行 playbook 的用户身份登录到控制节点。
  • 您用于连接到受管节点的帐户对它们具有 sudo 权限。
  • 网络支持 802.1X 网络身份验证。
  • 您已在受管节点上安装了 wpa_supplicant 软件包。
  • DHCP 位于受管节点的网络中。
  • control 节点上存在 TLS 身份验证所需的以下文件:

    • 客户端密钥存储在 /srv/data/client.key 文件中。
    • 客户端证书存储在 /srv/data/client.crt 文件中。
    • CA 证书存储在 /srv/data/ca.crt 文件中。

流程

  1. 将敏感变量存储在加密的文件中:

    1. 创建 vault :

      $ ansible-vault create ~/vault.yml
      New Vault password: <vault_password>
      Confirm New Vault password: <vault_password>
      Copy to Clipboard Toggle word wrap
    2. ansible-vault create 命令打开编辑器后,以 <key>: <value> 格式输入敏感数据:

      pwd: <password>
      Copy to Clipboard Toggle word wrap
    3. 保存更改,并关闭编辑器。Ansible 加密 vault 中的数据。
  2. 创建一个包含以下内容的 playbook 文件,如 ~/playbook.yml

    ---
    - name: Configure a wifi connection with 802.1X authentication
      hosts: managed-node-01.example.com
      tasks:
        - name: Copy client key for 802.1X authentication
          ansible.builtin.copy:
            src: "/srv/data/client.key"
            dest: "/etc/pki/tls/private/client.key"
            mode: 0400
    
        - name: Copy client certificate for 802.1X authentication
          ansible.builtin.copy:
            src: "/srv/data/client.crt"
            dest: "/etc/pki/tls/certs/client.crt"
    
        - name: Copy CA certificate for 802.1X authentication
          ansible.builtin.copy:
            src: "/srv/data/ca.crt"
            dest: "/etc/pki/ca-trust/source/anchors/ca.crt"
    
        - name: Wifi connection profile with dynamic IP address settings and 802.1X
          ansible.builtin.import_role:
            name: redhat.rhel_system_roles.network
          vars:
            network_connections:
              - name: Wifi connection profile with dynamic IP address settings and 802.1X
                interface_name: wlp1s0
                state: up
                type: wireless
                autoconnect: yes
                ip:
                  dhcp4: true
                  auto6: true
                wireless:
                  ssid: "Example-wifi"
                  key_mgmt: "wpa-eap"
                ieee802_1x:
                  identity: <user_name>
                  eap: tls
                  private_key: "/etc/pki/tls/client.key"
                  private_key_password: "{{ pwd }}"
                  private_key_password_flags: none
                  client_cert: "/etc/pki/tls/client.pem"
                  ca_cert: "/etc/pki/tls/cacert.pem"
                  domain_suffix_match: "example.com"
    Copy to Clipboard Toggle word wrap

    示例 playbook 中指定的设置包括如下:

    ieee802_1x
    此变量包含与 802.1X 相关的设置。
    eap: tls
    将配置文件配置为对可扩展身份验证协议(EAP)使用基于证书的 TLS 身份验证方法。

    有关 playbook 中使用的所有变量的详情,请查看控制节点上的 /usr/share/ansible/roles/rhel-system-roles.network/README.md 文件。

  3. 验证 playbook 语法:

    $ ansible-playbook --ask-vault-pass --syntax-check ~/playbook.yml
    Copy to Clipboard Toggle word wrap

    请注意,这个命令只验证语法,不能防止错误的、但有效的配置。

  4. 运行 playbook:

    $ ansible-playbook --ask-vault-pass ~/playbook.yml
    Copy to Clipboard Toggle word wrap

第 36 章 多路径 TCP 入门

多路径 TCP (MPTCP) 是原始 TCP 协议 (single-path) 的扩展。MPTCP 支持传输连接同时在多个路径中运行,并为用户端点设备带来网络连接冗余。

36.1. 了解 MPTCP

多路径 TCP (MPTCP)协议提供在连接端点间同时使用多个路径。协议设计提高了连接稳定性,与单一路径 TCP 相比也带来了其他好处。

注意

在 MPTCP 术语中,链接被视为路径。

以下是使用 MPTCP 的一些优点:

  • 它允许一个连接同时使用多个网络接口。
  • 如果连接绑定到链路速度,则使用多个链接可能会增加连接的吞吐量。请注意,如果连接绑定到 CPU,则使用多个链路会导致连接性能下降。
  • 它提高对链接故障的恢复能力。

36.2. 准备 RHEL 启用 MPTCP 支持

默认情况下,RHEL 中禁用 MPTCP 支持。启用 MPTCP,以便支持此特性的应用程序可以使用它。另外,如果应用程序默认有 TCP 套接字,则必须配置用户空间应用程序来强制使用 MPTCP 套接字。

先决条件

安装以下软件包:

  • iperf3
  • mptcpd
  • systemtap

流程

  1. 在内核中启用 MPTCP 套接字:

    # echo "net.mptcp.enabled=1" > /etc/sysctl.d/90-enable-MPTCP.conf
    # sysctl -p /etc/sysctl.d/90-enable-MPTCP.conf
    Copy to Clipboard Toggle word wrap
  2. 启动 iperf3 服务器,并强制它创建 MPTCP 套接字而不是 TCP 套接字:

    # mptcpize run iperf3 -s
    
    Server listening on 5201
    Copy to Clipboard Toggle word wrap
  3. 将客户端连接到服务器,并强制它创建 MPTCP 套接字而不是 TCP 套接字:

    # mptcpize iperf3 -c 127.0.0.1 -t 3
    Copy to Clipboard Toggle word wrap
  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
    Copy to Clipboard Toggle word wrap
  5. 验证 MPTCP 计数器:

    # nstat MPTcp*
    
    #kernel
    MPTcpExtMPCapableSYNRX          2                  0.0
    MPTcpExtMPCapableSYNTX          2                  0.0
    MPTcpExtMPCapableSYNACKRX       2                  0.0
    MPTcpExtMPCapableACKRX          2                  0.0
    Copy to Clipboard Toggle word wrap

每个 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 add_addr_accepted 1
    Copy to Clipboard Toggle word wrap
  2. 在服务器上将 IP 地址 198.51.100.1 添加为新的 MPTCP 端点:

    # ip mptcp endpoint add 198.51.100.1 dev enp1s0 signal
    Copy to Clipboard Toggle word wrap

    signal 选项可确保在三向手后发送 ADD_ADDR 数据包。

  3. 启动 iperf3 服务器,并强制它创建 MPTCP 套接字而不是 TCP 套接字:

    # mptcpize run iperf3 -s
    
    Server listening on 5201
    Copy to Clipboard Toggle word wrap
  4. 将客户端连接到服务器,并强制它创建 MPTCP 套接字而不是 TCP 套接字:

    # mptcpize iperf3 -c 192.0.2.1 -t 3
    Copy to Clipboard Toggle word wrap

验证

  1. 验证连接是否已建立:

    # ss -nti '( sport :5201 )'
    Copy to Clipboard Toggle word wrap
  2. 验证连接和 IP 地址限制:

    # ip mptcp limit show
    Copy to Clipboard Toggle word wrap
  3. 验证新添加的端点:

    # ip mptcp endpoint show
    Copy to Clipboard Toggle word wrap
  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
    Copy to Clipboard Toggle word wrap

36.4. 为 MPTCP 应用程序永久配置多路径

您可以使用 nmcli 命令配置配置 MultiPath TCP (MPTCP),来在源和目标系统之间永久建立多个子流。

子流可以使用不同的资源,不同的路由到目的地,甚至不同网络。例如以太网、单元格、wifi 等。因此,您可以实现组合连接,这提高了网络弹性和吞吐量。

服务器在我们的示例中使用以下网络接口:

  • enp4s0: 192.0.2.1/24
  • enp1s0: 198.51.100.1/24
  • enp7s0: 192.0.2.3/24

客户端在我们的示例中使用以下网络接口:

  • enp4s0f0: 192.0.2.2/24
  • enp4s0f1: 198.51.100.2/24
  • enp6s0: 192.0.2.5/24

先决条件

  • 您在相关接口上配置了默认网关。

流程

  1. 在内核中启用 MPTCP 套接字:

    # echo "net.mptcp.enabled=1" > /etc/sysctl.d/90-enable-MPTCP.conf
    # sysctl -p /etc/sysctl.d/90-enable-MPTCP.conf
    Copy to Clipboard Toggle word wrap
  2. 可选:用于子流限制的 RHEL 内核默认是 2。如果您需要更多:

    1. 使用以下内容创建 /etc/systemd/system/set_mptcp_limit.service 文件:

      [Unit]
      Description=Set MPTCP subflow limit to 3
      After=network.target
      
      [Service]
      ExecStart=ip mptcp limits set subflows 3
      Type=oneshot
      
      [Install]
      WantedBy=multi-user.target
      Copy to Clipboard Toggle word wrap

      在每个引导过程中,当网络 (network.target) 可以正常工作后,oneshot 单元会执行 ip mptcp limits set subflows 3 命令。

      ip mptcp limits set subflows 3 命令为每个连接设置附加子流的最大数量,即 4 个。可以最多添加 3 个额外的子流。

    2. 启用 set_mptcp_limit 服务:

      # systemctl enable --now set_mptcp_limit
      Copy to Clipboard Toggle word wrap
  3. 在要用于连接聚合的所有连接配置集上启用 MPTCP:

    # nmcli connection modify <profile_name> connection.mptcp-flags signal,subflow,also-without-default-route
    Copy to Clipboard Toggle word wrap

    connection.mptcp-flags 参数配置 MPTCP 端点和 IP 地址标志。如果在 NetworkManager 连接配置集中启用 MPTCP,则设置会将相关网络接口的 IP 地址配置为 MPTCP 端点。

    默认情况下,如果没有默认网关,NetworkManager 不会将 MPTCP 标记添加到 IP 地址。如果要绕过该检查,您需要使用 also-without-default-route 标志。

验证

  1. 验证您启用了 MPTCP 内核参数:

    # sysctl net.mptcp.enabled
    net.mptcp.enabled = 1
    Copy to Clipboard Toggle word wrap
  2. 验证您正确设置了子流限制,如果默认值是不够的:

    # ip mptcp limit show
    add_addr_accepted 2 subflows 3
    Copy to Clipboard Toggle word wrap
  3. 验证您正确配置了每个地址 MPTCP 设置:

    # ip mptcp endpoint show
    192.0.2.1 id 1 subflow dev enp4s0
    198.51.100.1 id 2 subflow dev enp1s0
    192.0.2.3 id 3 subflow dev enp7s0
    192.0.2.4 id 4 subflow dev enp3s0
    ...
    Copy to Clipboard Toggle word wrap

36.5. 监控 MPTCP 子流

监控 MPTCP (Multipath TCP)子流对于优化性能、确保可靠性和维护对多路径网络通信的控制至关重要。

多路径 TCP(MPTCP)套接字的生命周期可能比较复杂:创建主 MPTCP 套接字,验证 MPTCP 路径,创建一个或多个子流并最终删除。最后,终止MPTCP 套接字。

MPTCP 协议允许使用 iproute 软件包提供的 ip 工具监控与套接字和子流创建和删除相关的特定于 MPTCP 的事件。这个工具使用 netlink 接口来监控 MPTCP 事件。

此流程演示了如何监控 MPTCP 事件。因此,它会模拟 MPTCP 服务器应用程序,以及客户端连接到此服务。本例中涉及的客户端使用以下接口和 IP 地址:

  • 服务器:192.0.2.1
  • 客户端(以太网连接):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
    Copy to Clipboard Toggle word wrap
  2. 在服务器上,要模拟 MPTCP 服务器应用程序,请使用强制的 MPTCP 套接字而不是 TCP 套接字,以侦听模式启动 netcat (nc):

    # mptcpize run nc -l -k -p 12345
    Copy to Clipboard Toggle word wrap

    -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
      Copy to Clipboard Toggle word wrap

      enp1s0 接口具有比 wlp1s0 更低的指标。因此,RHEL 默认使用 enp1s0

    2. 在第一个终端上,启动监控:

      # ip mptcp monitor
      Copy to Clipboard Toggle word wrap
    3. 在第二个终端上,启动到服务器的 MPTCP 连接:

      # mptcpize run nc 192.0.2.1 12345
      Copy to Clipboard Toggle word wrap

      RHEL 使用 enp1s0 接口及其关联的 IP 地址作为此连接的源。

      在监控终端上,ip mptcp monitor 命令现在记录:

      [       CREATED] token=63c070d2 remid=0 locid=0 saddr4=192.0.2.2 daddr4=192.0.2.1 sport=36444 dport=12345
      Copy to Clipboard Toggle word wrap

      这个令牌将 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
      Copy to Clipboard Toggle word wrap
    5. 可选:显示到服务器上端口 12345 的连接:

      # ss -taunp | grep ":12345"
      tcp ESTAB  0  0         192.0.2.2:36444 192.0.2.1:12345
      Copy to Clipboard Toggle word wrap

      此时,只建立一个到服务器的连接。

    6. 在第三个终端上,创建另一个端点:

      # ip mptcp endpoint add dev wlp1s0 192.0.2.3 subflow
      Copy to Clipboard Toggle word wrap

      此命令设置客户端 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
      Copy to Clipboard Toggle word wrap

      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
      Copy to Clipboard Toggle word wrap

      该命令现在显示两个连接:

      • 源地址为 192.0.2.2 的、与之前建立的第一个 MPTCP 子流相对应的连接。
      • 来自 wlp1s0 接口及源地址 192.0.2.3 的子流的连接。
    8. 在第三个终端上,删除端点:

      # ip mptcp endpoint delete id 2
      Copy to Clipboard Toggle word wrap

      使用 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
      Copy to Clipboard Toggle word wrap
    9. 在第一个带有 nc 客户端的终端上,按 Ctrl+C 来终止会话。

      在监控终端上,ip mptcp monitor 现在记录日志:

      [        CLOSED] token=63c070d2
      Copy to Clipboard Toggle word wrap

36.6. 在内核中禁用多路径 TCP

如果您不需要 MPTCP,您可以在内核中明确禁用 MPTCP 选项。

流程

  • 禁用 mptcp.enabled 选项。

    # echo "net.mptcp.enabled=0" > /etc/sysctl.d/90-enable-MPTCP.conf
    # sysctl -p /etc/sysctl.d/90-enable-MPTCP.conf
    Copy to Clipboard Toggle word wrap

验证

  • 验证是否在内核中禁用了 mptcp.enabled

    # sysctl -a | grep mptcp.enabled
    net.mptcp.enabled = 0
    Copy to Clipboard Toggle word wrap

第 37 章 管理 mptcpd 服务

本节介绍 mptcpd 服务的基本管理。mptcpd 软件包提供 mptcpize 工具,该工具在 TCP 环境中的 mptcp 协议上切换。

37.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
    Copy to Clipboard Toggle word wrap
  2. 启动 mptcpd 服务:

    # systemctl start mptcp.service
    Copy to Clipboard Toggle word wrap
  3. 验证端点创建:

    # ip mptcp endpoint
    Copy to Clipboard Toggle word wrap
  4. 要停止 mptcpd 服务,请使用以下命令:

    # systemctl stop mptcp.service
    Copy to Clipboard Toggle word wrap
  5. 要手动配置 mptcpd 服务,修改 /etc/mptcpd/mptcpd.conf 配置文件。

    请注意,端点 mptcpd 服务创建,最后一个主机关闭。

37.2. 使用 mptcpize 工具管理应用程序

使用 mptcpize 工具管理应用程序和服务。

以下指令演示了如何使用 mptcpize 工具在 TCP 环境中管理应用程序。

假设需要使用启用的 MPTCP 套接字运行 iperf3 工具。您可以按照以下过程来实现此目标。

先决条件

  • 已安装 mptcpd 软件包
  • iperf3 软件包已安装

流程

  • 启动启用 MPTCP 套接字的 iperf3 工具:

    # mptcpize run iperf3 -s &
    Copy to Clipboard Toggle word wrap

37.3. 使用 mptcpize 工具为服务启用 MPTCP 套接字

以下一组命令演示了如何使用 mptcpize 工具管理服务。您可以为服务启用或禁用 mptcp 套接字。

假设需要管理 nginx 服务的 mptcp 套接字。您可以按照以下过程来实现此目标。

先决条件

  • 已安装 mptcpd 软件包
  • 安装了 nginx 软件包

流程

  1. 为服务启用 MPTCP 套接字:

    # mptcpize enable nginx
    Copy to Clipboard Toggle word wrap
  2. 为服务禁用 MPTCP 套接字:

    # mptcpize disable nginx
    Copy to Clipboard Toggle word wrap
  3. 重启该服务以使更改生效:

    # systemctl restart nginx
    Copy to Clipboard Toggle word wrap

默认情况下,Red Hat Enterprise Linux 9 及之后的版本中的 NetworkManager 以 keyfile 格式存储连接配置文件。与已弃用的 ifcfg 格式不同,keyfile 格式支持 NetworkManager 提供的所有连接设置。

38.1. NetworkManager 配置文件的密钥文件格式

keyfile 格式是与网络连接类似的 INI 配置。

例如,以下是keyfile 格式的以太网连接配置文件:

[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
Copy to Clipboard Toggle word wrap
警告

参数的拼写错误或不正确的放置可能会导致意外行为。因此,请不要手动编辑或创建 NetworkManager 配置文件。

使用 nmcli 工具、network RHEL 系统角色或 nmstate API 来管理 NetworkManager 连接。例如,您可以 在离线模式下使用nmcli 工具 创建连接配置文件。

每个部分都对应一个 NetworkManager 设置名称,如 nm-settings (5) 手册页中所述。该部分中的每一个键值对是手册页设置规范中列出的一个属性。

NetworkManager 密钥文件中的大部分变量都具有一对一映射。这意味着 NetworkManager 属性以相同的名称和格式的变量存储在密钥文件中。不过,也有例外情况,主要是为了使密钥文件语法更易于阅读。有关这些例外的列表,请查看您系统上的 nm-settings-keyfile (5) 手册页。

重要

为安全起见,因为连接配置文件可以包含敏感信息,如私钥和密码短语,所以 NetworkManager 仅使用 root 用户所拥有的配置文件,并且仅可由 root 读写。

将带有.nmconnection 后缀的连接配置文件保存在 /etc/NetworkManager/system-connections/ 目录中。此目录包含持久性配置文件。如果您使用 NetworkManager API 修改了持久配置文件,NetworkManager 会写并覆盖此目录中的文件。

NetworkManager 不会自动从磁盘重新加载配置文件。当您以密钥文件格式创建或更新连接配置文件时,请使用 nmcli connection reload 命令告知 NetworkManager 这些变化。

您可以在离线模式中使用 nmcli 工具来创建和管理 NetworkManager 连接配置集。在这个模式中,nmcli 在没有 NetworkManager 服务的情况下运行,以通过标准输出生成 keyfile 连接配置集。

此功能在以下场景下很有用:

  • 您需要创建需要预先部署的连接配置集。例如在容器镜像中,或者作为 RPM 软件包。
  • 您希望在 NetworkManager 服务不可用的环境中创建连接配置文件,例如当您要使用 chroot 工具时。或者,当您想通过 Kickstart %post 脚本创建或修改 RHEL 系统的网络配置时。

流程

  1. 以 keyfile 格式创建新连接配置集。例如,对于不使用 DHCP 的以太网设备的连接配置文件,请运行类似的 nmcli 命令:

    # nmcli --offline connection add type ethernet con-name Example-Connection ipv4.addresses 192.0.2.1/24 ipv4.dns 192.0.2.200 ipv4.method manual > /etc/NetworkManager/system-connections/example.nmconnection
    Copy to Clipboard Toggle word wrap
    注意

    使用 con-name 键指定的连接名称被保存到生成的配置集的 id 变量中。当您使用 nmcli 命令稍后管理这个连接时,请按如下所示指定连接:

    • 如果没有省略 id 变量,请使用连接名称,如 Example-Connection
    • 当没有使用 id 变量时,请使用没有 .nmconnection 后缀的文件名,如 output
  2. 对配置文件设置权限,以便只有 root 用户可以读和更新它:

    # chmod 600 /etc/NetworkManager/system-connections/example.nmconnection
    # chown root:root /etc/NetworkManager/system-connections/example.nmconnection
    Copy to Clipboard Toggle word wrap
  3. 启动 NetworkManager 服务:

    # systemctl start NetworkManager.service
    Copy to Clipboard Toggle word wrap
  4. 如果将配置文件中的 autoconnect 变量设置为 false,则激活连接:

    # nmcli connection up Example-Connection
    Copy to Clipboard Toggle word wrap

验证

  1. 验证 NetworkManager 服务是否正在运行:

    # systemctl status NetworkManager.service
    ● NetworkManager.service - Network Manager
       Loaded: loaded (/usr/lib/systemd/system/NetworkManager.service; enabled; vendor preset: enabled)
       Active: active (running) since Wed 2022-08-03 13:08:32 CEST; 1min 40s ago
    ...
    Copy to Clipboard Toggle word wrap
  2. 验证 NetworkManager 是否可以从配置文件中读取配置集:

    # nmcli -f TYPE,FILENAME,NAME connection
    TYPE      FILENAME                                                     NAME
    ethernet /etc/NetworkManager/system-connections/examaple.nmconnection Example-Connection
    ethernet  /etc/sysconfig/network-scripts/ifcfg-enp1s0                  enp1s0
    ...
    Copy to Clipboard Toggle word wrap

    如果输出没有显示新创建的连接,请验证密钥文件权限和您所用的语法是否正确。

  3. 显示连接配置文件:

    # nmcli connection show Example-Connection
    connection.id:                          Example-Connection
    connection.uuid:                        232290ce-5225-422a-9228-cb83b22056b4
    connection.stable-id:                   --
    connection.type:                        802-3-ethernet
    connection.interface-name:              --
    connection.autoconnect:                 yes
    ...
    Copy to Clipboard Toggle word wrap

您可以手动创建密钥文件格式的 NetworkManager 连接配置集。例如,如果外部应用生成配置集,则需要此项。

警告

手动创建或更新配置文件可能会导致意外或无法正常工作的网络配置。作为备用方案,您可以在离线模式下使用 nmcli。请参阅 使用 nmcli 在离线模式下创建 keyfile 连接配置文件

流程

  1. 创建连接配置文件。例如,对于使用 DHCP 的 enp1s0 以太网设备的连接配置文件,请创建具有以下内容的 /etc/NetworkManager/system-connections/example.nmconnection 文件:

    [connection]
    id=Example-Connection
    type=ethernet
    autoconnect=true
    interface-name=enp1s0
    
    [ipv4]
    method=auto
    
    [ipv6]
    method=auto
    Copy to Clipboard Toggle word wrap
    注意

    您可以使用任何以 .nmconnection 为后缀的文件名。但是,当您稍后使用 nmcli 命令来管理连接时,您必须在引用此连接时使用 id 变量中设置的连接名称。当省略 id 变量时,请使用不带 .nmconnection 的文件名来引用此连接。

  2. 对配置文件设置权限,以便只有 root 用户可以读和更新它:

    # chown root:root /etc/NetworkManager/system-connections/example.nmconnection
    # chmod 600 /etc/NetworkManager/system-connections/example.nmconnection
    Copy to Clipboard Toggle word wrap
  3. 重新加载连接配置文件:

    # nmcli connection reload
    Copy to Clipboard Toggle word wrap
  4. 验证 NetworkManager 是否从配置文件读取配置文件:

    # nmcli -f NAME,UUID,FILENAME connection
    NAME                UUID                                  FILENAME
    Example-Connection  86da2486-068d-4d05-9ac7-957ec118afba  /etc/NetworkManager/system-connections/example.nmconnection
    ...
    Copy to Clipboard Toggle word wrap

    如果命令未显示新添加的连接,请验证文件权限和您在文件中使用的语法是否正确。

  5. 如果将配置文件中的 autoconnect 变量设置为 false,则激活连接:

    # nmcli connection up example_connection
    Copy to Clipboard Toggle word wrap

验证

  • 显示连接配置文件:

    # nmcli connection show example_connection
    Copy to Clipboard Toggle word wrap

您可以定义自定义网络接口名称,如 lan,使接口名称更描述性。在这种情况下,udev 服务会重命名接口。重命名过程会因您使用 ifcfg 或 keyfile 格式的连接配置文件而有所不同。

使用 ifcfg 格式的配置文件时的接口重命名过程
  1. udev 规则文件 /usr/lib/udev/rules.d/60-net.rules 调用 /lib/udev/rename_device helper 工具。
  2. 助手工具在 /etc/sysconfig/network-scripts/ifcfg-* 文件中搜索 HWADDR 参数。
  3. 如果变量中设置的值与接口的 MAC 地址匹配,则帮助工具会将接口重命名为文件的 DEVICE 参数中设置的名称。
使用 keyfile 格式的配置文件时的接口重命名过程
  1. 创建一个 systemd 链接文件udev 规则 来重命名接口。
  2. 在 NetworkManager 连接配置文件的 interface-name 属性中使用自定义接口名称。

如果您仍然使用已弃用的 ifcfg 格式的连接配置文件,您可以将它们转换为 keyfile 格式。

注意

如果 ifcfg 文件包含 NM_CONTROLLED=no 设置,则 NetworkManager 不会控制这个配置文件,因此迁移过程会忽略它。

先决条件

  • 您有 ifcfg 格式的连接配置集,采用 /etc/sysconfig/network-scripts/ 目录中。
  • 如果连接配置文件包含一个被设置为自定义设备名称的 DEVICE 变量,如 providerlan,那么您为每个自定义设备名称创建了一个 systemd 链接文件udev 规则

流程

  • 迁移连接配置集:

    # nmcli connection migrate
    Connection 'enp1s0' (43ed18ab-f0c4-4934-af3d-2b3333948e45) successfully migrated.
    Connection 'enp2s0' (883333e8-1b87-4947-8ceb-1f8812a80a9b) successfully migrated.
    ...
    Copy to Clipboard Toggle word wrap

验证

  • 另外,您可以验证您是否成功迁移了所有连接配置集:

    # 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
    ...
    Copy to Clipboard Toggle word wrap

第 39 章 systemd 网络目标和服务

在应用网络设置时,RHEL 使用 networknetwork-online 目标以及 NetworkManager-wait-online 服务。如果这些服务无法动态响应网络状态的变化,请将 systemd 服务配置为在网络完全可用后启动。

network 目标表示网络管理堆栈已经启动,并且 network-online 目标是主动等待网络启动并且可用的网络连接可用。

systemd 维护 networknetwork-online 目标单元。特殊单元,如 NetworkManager-wait-online.service,具有 WantedBy=network-online.targetBefore=network-online.target 参数。如果启用了,这些单元将启动 network-online.target ,并延迟要达到的目标,直到建立了某种形式的网络连接。它们会延迟 network-online 目标,直到网络连接了。

network-online 目标启动一个服务,这会对进一步执行增加更长的延迟。systemd 会自动使用这个目标单元的 WantsAfter 参数来向所有 System V(SysV) init 脚本服务单元添加依赖项,这些服务单元具有一个指向 $network 工具的 Linux Standard Base(LSB)头。LSB 头是 init 脚本的元数据。您可以使用它指定依赖项。这与 systemd 目标类似。

network 目标不会显著延迟引导进程的执行。到达 network 目标意味着,负责设置网络的服务已启动。但并不意味着已经配置了一个网络设备。这个目标在关闭系统的过程中非常重要。例如,如果您在引导过程中有一个排在 network 目标之后的服务,则这个依赖关系在关闭过程中会反过来。在服务停止后,网络才会断开连接。远程网络文件系统的所有挂载单元都会自动启动 network-online 目标单元,并在其之后排序。

注意

network-online 目标单元仅在系统启动期间有用。系统完成引导后,这个目标不会跟踪网络的在线状态。因此,您无法使用 network-online 来监控网络连接。这个目标提供一个一次性系统启动概念。

39.2. NetworkManager-wait-online 概述

NetworkManager-wait-online 服务延迟到达 network-online 目标,直到 NetworkManager 报告启动已完成。

在启动过程中,NetworkManager 会通过将 connection.autoconnect 参数设置为 yes 来激活所有配置文件。但是,只要 NetworkManager 配置集处于激活状态,配置文件的激活就没有完成。如果激活失败,NetworkManager 会根据 connection.autoconnect-retries 的值来重试激活。

设备何时达到激活状态取决于其配置。例如,如果配置文件同时包含 IPv4 和 IPv6 配置,默认情况下,NetworkManager 会在只有一个地址系列就绪时将设备视为完全激活。连接配置文件中的 ipv4.may-failipv6.may-fail 参数控制此行为。

对于以太网设备,NetworkManager 会超时等待载体。因此,如果以太网电缆没有连接,则这可能会进一步延迟 NetworkManager-wait-online.service

当启动完成后,所有配置集都处于断开连接的状态,或被成功激活。您可以配置配置集来自动连接。以下是一些参数示例,这些参数设定超时或者在连接被视为活跃时定义:

  • connection.wait-device-timeout :设置驱动程序检测设备的超时时间。
  • ipv4.may-failipv6.may-fail :使用一个就绪的 IP 地址系列设置激活,或者一个特定的地址系列是否已完成配置。
  • ipv4.gateway-ping-timeout: 延迟网络激活,直到 NetworkManager 收到来自 IPv4 网关的 ping 响应。在继续操作前,系统最多等待指定的秒数。
  • ip-ping-timeoutip-ping-addresses: 延迟网络激活,直到 NetworkManager 收到来自 ip-ping-addresses 中定义的主机的 ping 响应。在继续操作前,系统最多等待指定的秒数。

详情请查看您系统上的 nm-settings (5)systemd.special (7 )、NetworkManager-wait-online.service (8) 手册页。

RHEL 在 /usr/lib/ systemd /system/ 目录中安装 systemd 服务文件。您可以在 /etc/systemd/system/ <service_name& gt; .service.d/ 中创建一个置入片断,以便在网络在线后启动服务。

此片段的设置覆盖原始服务文件中的任何冲突设置。

流程

  1. 在编辑器中打开服务文件:

    # systemctl edit <service_name>
    Copy to Clipboard Toggle word wrap
  2. 输入以下内容并保存更改:

    [Unit]
    After=network-online.target
    Copy to Clipboard Toggle word wrap
  3. 重新加载 systemd 服务。

    # systemctl daemon-reload
    Copy to Clipboard Toggle word wrap

第 40 章 Nmstate 简介

nmstate 是一个声明性网络管理器 API。使用 Nmstate 时,您可以使用 YAML 或 JSON 格式的指令描述预期的网络状态。

nmstate 有很多优点。例如,它:

  • 提供稳定且可扩展的接口来管理 RHEL 网络功能
  • 支持主机和集群级别的原子和事务操作
  • 支持对大多数属性进行部分编辑,并保留在说明中没有指定的现有设置

Nmstate 由以下软件包组成:

Expand
软件包内容

nmstate

nmstatectl 命令行工具

python3-libnmstate

libnmstate Python 库

nmstate-libs

Nmstate C 库

nmstate-devel

Nmstate C 库标头

40.1. 在 Python 应用程序中使用 libnmstate 库

libnmstate Python 库可让开发人员在自己的应用程序中使用 Nmstate。

要使用库,请在源代码中导入它:

import libnmstate
Copy to Clipboard Toggle word wrap

请注意,您必须安装 nmstatepython3-libnmstate 软件包才能使用这个库。

例 40.1. 使用 libnmstate 库查询网络状态

以下 Python 代码导入了 libnmstate 库,并显示可用的网络接口及其状态:

import libnmstate
from libnmstate.schema import Interface

net_state = libnmstate.show()
for iface_state in net_state[Interface.KEY]:
    print(iface_state[Interface.NAME] + ": "
          + iface_state[Interface.STATE])
Copy to Clipboard Toggle word wrap

40.2. 使用 nmstatectl 更新当前网络配置

您可以使用 nmstatectl 工具将一个或多个接口的当前网络配置存储在一个文件中。

然后您可以使用此文件:

  • 修改配置并将其应用到同一系统。
  • 将文件复制到其他主机上,并使用相同的或经过修改的设置配置主机。

例如,您可以将 enp1s0 接口的设置导出到一个文件中,修改配置,将设置应用到主机。

前提条件

  • nmstate 软件包已安装。

流程

  1. enp1s0 接口的设置导出到 ~/network-config.yml 文件:

    # nmstatectl show enp1s0 > ~/network-config.yml
    Copy to Clipboard Toggle word wrap

    此命令会以 YAML 格式存储 enp1s0 的配置。要以 JSON 格式存储输出,请将 --json 选项传给命令。

    如果没有指定接口名称,nmstatectl 将导出所有接口的配置。

  2. 使用文本编辑器修改 ~/network-config.yml 文件,以更新配置。
  3. 应用 ~/network-config.yml 文件中的设置:

    # nmstatectl apply ~/network-config.yml
    Copy to Clipboard Toggle word wrap

    如果您以 JSON 格式导出设置,请将 --json 选项传给命令。

40.3. nmstate systemd 服务

安装 nmstate 软件包后,您可以通过配置 nmstate systemd 服务来在系统引导时自动应用新的网络设置。

nmstate 服务是一个 oneshot systemd 服务。因此,systemd 仅在系统引导以及手动重启服务时执行它。

注意

默认情况下禁用 nmstate 服务。使用 systemctl enable nmstate 命令启用它。之后,systemd 在每次系统启动时都执行此服务。

要使用这个服务,请将带有 Nmstate 指令的 *.yml 文件存储在 /etc/nmstate/ 目录中。然后,nmstate 服务在下次重启时或手动重启服务时自动应用文件。默认情况下,在 Nmstate 成功应用文件后,它会将文件的 .yml 后缀重命名为 .applied,以防止服务再次处理同样的文件。

您可以在 /etc/nmstate/nmstate.conf 文件中配置 nmstate 服务。例如,要在应用原始 *.yml 文件后保留它,并只创建一个具有 .applied 后缀的副本,请将以下行添加到 /etc/nmstate/nmstate.conf 中:

[service]
keep_state_file_after_apply = false
Copy to Clipboard Toggle word wrap

有关详情和其他配置选项,请查看您系统上的 nmstate.service (8) 手册页。

40.4. network RHEL 系统角色的网络状态

network RHEL 系统角色支持 playbook 中的状态配置来配置设备。为此,请使用 network_state 变量,后面跟上状态配置。

在 playbook 中使用 network_state 变量的好处:

  • 通过与状态配置结合使用声明方法,您可以配置接口,NetworkManager 会在后台为这些接口创建一个配置集。
  • 使用 network_state 变量,您可以指定您需要更改的选项,所有其他选项将保持不变。但是,使用 network_connections 变量,您必须指定所有设置来更改网络连接配置集。
重要

您只能在 network_state 中设置 Nmstate YAML 指令。这些指令与您可以在 network_connections 中设置的变量有所不同。

例如,要使用动态 IP 地址设置创建以太网连接,请在 playbook 中使用以下 vars 块:

Expand

带有状态配置的 playbook

常规 playbook

vars:
  network_state:
    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
Copy to Clipboard Toggle word wrap
vars:
  network_connections:
    - name: enp7s0
      interface_name: enp7s0
      type: ethernet
      autoconnect: yes
      ip:
        dhcp4: yes
        auto6: yes
      state: up
Copy to Clipboard Toggle word wrap

例如,要仅更改您之前创建的动态 IP 地址设置的连接状态,请在 playbook 中使用以下 vars 块:

Expand

带有状态配置的 playbook

常规 playbook

vars:
  network_state:
    interfaces:
    - name: enp7s0
      type: ethernet
      state: down
Copy to Clipboard Toggle word wrap
vars:
  network_connections:
    - name: enp7s0
      interface_name: enp7s0
      type: ethernet
      autoconnect: yes
      ip:
        dhcp4: yes
        auto6: yes
      state: down
Copy to Clipboard Toggle word wrap

第 41 章 捕获网络数据包

要调试网络问题和通讯,您可以捕获网络数据包。以下部分提供有关捕获网络数据包的步骤和附加信息。

xdpdump 工具捕获网络数据包,包括 XDP 程序丢弃或修改的网络数据包。与 tcpdump 不同,xdpdump 使用 eBPF 程序,允许它捕获传统用户空间工具无法捕获的数据包。

您可以使用 xdpdump 来调试已附加到接口上的 XDP 程序。因此,实用程序可以在 XDP 程序启动和完成后捕获数据包。在后一种情况下,xdpdump 也捕获 XDP 操作。默认情况下,xdpdump 会在 XDP 程序的入口处捕获传入的数据包。

重要

在 AMD 和 Intel 64 位以外的其他构架上,xdpdump 工具仅作为技术预览提供。红帽产品服务级别协议(SLA)不支持技术预览功能,且其功能可能并不完善,因此红帽不建议在生产环境中使用它们。这些预览可让用户早期访问将来的产品功能,让用户在开发过程中测试并提供反馈意见。

如需有关 技术预览功能支持范围 的信息,请参阅红帽客户门户网站中的技术预览功能支持范围。

请注意,xdpdump 没有数据包过滤或解码功能。但是,您可以将它与 tcpdump 结合使用来解码数据包。

如果您是开发人员,并且您对 xdpdump 的源代码感兴趣,请从红帽客户门户网站下载并安装相应的源 RPM(SRPM)。

先决条件

  • 支持 XDP 程序的网络驱动程序。
  • XDP 程序被加载到 enp1s0 接口。如果没有程序载入,xdpdump 会以与 tcpdump 类似的方式捕获数据包,以便向后兼容。

流程

  1. 要捕获 enp1s0 接口上的数据包,并将它们写入到 /root/capture.pcap 文件,请输入:

    # xdpdump -i enp1s0 -w /root/capture.pcap
    Copy to Clipboard Toggle word wrap
  2. 要停止捕获数据包,请按 Ctrl+C

第 42 章 了解 RHEL 9 中的 eBPF 网络功能

扩展的 Berkeley Packet 过滤器(eBPF)是一个内核中的虚拟机,允许在内核空间中执行代码。此代码运行在一个受限的沙箱环境中,仅可访问有限功能集。

在网络中,您可以使用 eBPF 来补充或替换内核数据包处理。根据您使用的 hook,eBPF 程序有:

  • 对元数据的读和写的访问权限
  • 可以查找套接字和路由
  • 可以设置套接字选项
  • 可以重定向数据包

42.1. RHEL 9 中网络 eBPF 功能概述

扩展 Berkeley Packet Filter (eBPF)可让开发人员在 Linux 内核中运行沙盒程序。对于网络,eBPF 程序附加到 hook,以检查、修改和过滤流量。

您可以将扩展的 Berkeley 数据包过滤器(eBPF)网络程序附加到 RHEL 中的以下钩子:

  • Express Data Path(XDP):在内核网络堆栈处理它们之前,对接收的数据包提供早期的访问权限。
  • 带有直接操作标志的 tc eBPF 分类器:对入口和出口提供强大的数据包处理。程序可以作为带有直接操作标志的 eBPF 分类器附加在 qdisc 层次结构中,或使用基于链接的 tcx API。
  • 控制组版本 2(cgroup v2):在控制组中,对程序所执行的基于套接字的操作启用过滤和覆盖。
  • 套接字过滤:启用对从套接字接收的数据包进行过滤。这个功能也可用于经典 Berkeley Packet Filter(cBPF),但已扩展为支持 eBPF 程序。
  • 流解析器:启用将流分成单独的消息、过滤并将其重定向到套接字。
  • SO_REUSEPORT 套接字选择:对来自 reuseport 套接字组的接收套接字提供可编程选择。
  • 流程分析器:在某些情况下,启用覆盖内核解析数据包头的方式。
  • TCP 拥塞控制回调:启用实现一个自定义 TCP 拥塞控制算法。
  • 带有封装的路由: 允许创建自定义隧道封装。

    XDP

    您可以将 BPF_PROG_TYPE_XDP 类型的程序附加到网络接口。然后,在内核网络堆栈开始处理之前,内核会在接收的数据包上执行该程序。在某些情况下,这允许快速数据包转发,如快速数据包丢弃以防止分布式拒绝服务(DDoS)攻击,以及负载均衡场景的快速数据包重定向。

    您还可以使用 XDP 进行不同类型的数据包监控和抽样。内核允许 XDP 程序修改数据包,并将其传送到内核网络堆栈进行进一步处理。

    以下的 XDP 模式可用:

    • 原生(驱动程序)XDP:内核在数据包接收过程从最早可能的点执行程序。目前,内核无法解析数据包,因此无法使用内核提供的元数据。这个模式要求网络接口驱动程序支持 XDP,但并非所有驱动程序都支持这种原生模式。
    • 通用 XDP:内核网络栈在进程早期执行 XDP 程序。此时内核数据结构已被分配,数据包已被预先处理。如果数据包被丢弃或重定向,与原生模式相比,这需要大量开销。但是,通用模式不需要支持网络接口驱动,它可适用于所有网络接口。
    • Offloaded XDP:内核在网络接口而不是主机 CPU 上执行 XDP 程序。请注意,这需要特定的硬件,这个模式中只有某些 eBPF 功能可用。

    在 RHEL 上,使用 libxdp 库加载所有 XDP 程序。这个程序库启用系统控制的 XDP 使用。

    注意

    目前,XDP 程序有一些系统配置限制。例如:您必须禁用接收接口中某些硬件卸载功能。另外,并非所有功能都可用于支持原生模式的所有驱动程序。

    在 RHEL 9 中,红帽仅在使用 libxdp 库将程序加载到内核中时,才支持 XDP 功能。

    AF_XDP
    使用过滤并将数据包重定向到给定的 AF_XDP 套接字的 XDP 程序,您可以使用 AF_XDP 协议系列中的一个或多个套接字来快速将数据包从内核复制到用户空间。
    流量控制

    流量控制(tc)子系统提供以下 eBPF 程序类型:

    • BPF_PROG_TYPE_SCHED_CLS
    • BPF_PROG_TYPE_SCHED_ACT

    这些类型允许您在 eBPF 中编写自定义的 tc 分类器和 tc 操作。与 tc 生态系统的各个部分一起,这为强大的数据包处理提供了能力,是一些容器编排解决方案的核心部分。

    在大多数情况下,只有类符被使用,与 direct-action 标记一样,eBPF 分类器可以直接从同一 eBPF 程序执行操作。clsact 排队规程(qdisc)被设计为在入口端启用此功能。

    请注意,使用流解析器 eBPF 程序可能会影响其他 qdiscstc 分类器的操作,如 flower

    基于链接的 tcx API 与 qdisc API 一起提供。它可让您的应用程序通过 BPF 程序维护所有权,以防止意外删除 BPF 程序。另外,tcx API 具有多程序支持,允许多个应用程序并行在 tc 层中附加 BPF 程序。

    套接字过滤器

    一些实用程序会使用或在过去使用了 classic Berkeley Packet Filter(cBPF)过滤套接字上接收到的数据包。例如,tcpdump 工具允许用户指定表达式,tcpdump 然后将它们转换为 cBPF 码。

    作为 cBPF 的替代方案,内核允许 BPF_PROG_TYPE_SOCKET_FILTER 类型的 eBPF 程序实现相同的目的。

    控制组群

    在 RHEL 中,您可以使用多种 eBPF 程序,供您附加到 cgroup。当给定 cgroup 中的某个程序执行某个操作时,内核会执行这些程序。请注意,您只能使用 cgroups 版本 2。

    RHEL 中提供以下与网络相关的 cgroup eBPF 程序:

    • BPF_PROG_TYPE_SOCK_OPS :内核对各种 TCP 事件调用该程序。程序可以调整内核 TCP 堆栈的行为,包括自定义 TCP 头选项等。
    • BPF_PROG_TYPE_CGROUP_SOCK_ADDR :在 connectbindsendtorecvmsggetpeernamegetockname 操作过程中,内核调用该程序。该程序允许更改 IP 地址和端口。当您在 eBPF 中实现基于套接字的网络地址转换(NAT)时,这很有用。
    • BPF_PROG_TYPE_CGROUP_SOCKOPT :在 setockoptgetsockopt 过程中,内核调用该程序,并允许更改选项。
    • BPF_PROG_TYPE_CGROUP_SOCK :在套接字创建、套接字释放和绑定到地址的过程中,内核调用该程序。您可以使用这些程序来允许或拒绝操作,或者只检查套接字创建统计信息。
    • BPF_PROG_TYPE_CGROUP_SKB :该程序在入口和出口处过滤单个数据包,并可以接受或拒绝数据包。
    流解析器(Stream Parser)

    流解析器对添加到特殊 eBPF 映射中的一组套接字进行操作。然后 eBPF 程序处理内核在那些套接字上接收或发送的数据包。

    RHEL 中提供了以下流解析程序 eBPF 程序:

    • BPF_PROG_TYPE_SK_SKB :eBPF 程序将套接字上收到的数据包解析到单个消息中,并指示内核丢弃这些消息,接受它们,或者将它们发送到另一个套接字。
    • BPF_PROG_TYPE_SK_MSG :此程序过滤出口消息。eBPF 程序解析数据包,并批准或拒绝它们。
    SO_REUSEPORT 套接字选择
    使用这个套接字选项,您可以绑定多个套接字到相同的 IP 地址和端口。如果没有 eBPF,内核会根据连接散列选择接收套接字。有了 BPF_PROG_TYPE_SK_REUSEPORT 程序,接收套接字的选择是完全可编程的。
    dissector 流程
    当内核需要处理数据包头,而不需要查看全部协议解码时,会对它们进行 剖析。例如,这会在 tc 子系统、多路径路由、绑定或者计算数据包哈希时发生。在这种情况下,内核解析数据包的标头,并使用数据包标头中的信息填充内部结构。您可以使用 BPF_PROG_TYPE_FLOW_DISSECTOR 程序替换此内部解析。请注意,您只能在 RHEL 的 eBPF 的 IPv4 和 IPv6 上分离 TCP 和 UDP。
    TCP 阻塞控制
    您可以使用一组实现 struct tcp_congestion_oops 回调的 BPF_PROG_TYPE_STRUCT_OPS 程序来编写一个自定义的 TCP 阻塞控制算法。通过这种方法的算法可以和内置内核算法一起提供给系统。
    带有封装的路由

    您可以将以下 eBPF 程序类型之一附加到路由表中作为隧道封装属性的路由:

    • BPF_PROG_TYPE_LWT_IN
    • BPF_PROG_TYPE_LWT_OUT
    • BPF_PROG_TYPE_LWT_XMIT

    这样的 eBPF 程序的功能仅限于特定的隧道配置,它不允许创建通用封装或封装解决方案。

    套接字查找
    要绕过 bind 系统调用的限制,请使用 BPF_PROG_TYPE_SK_LOOKUP 类型的 eBPF 程序。此类程序可以为新传入的 TCP 连接选择侦听套接字,或为 UDP 数据包选择一个未连接的套接字。

42.2. 使用网卡 RHEL 9 中的 XDP 功能概述

RHEL 中可用的 XDP 功能取决于网卡及其驱动程序。

以下是启用了 XDP 的网卡和您可以使用的 XDP 特性的概述:

Expand
网卡驱动基本的重定向目标HW 卸载零复制大 MTU

Amazon Elastic Network Adapter

ena

[a]

aQuantia AQtion Ethernet card

atlantic

Broadcom NetXtreme-C/E 10/25/40/50 千兆以太网

bnxt_en

[a]

Cavium Thunder Virtual function

nicvf

Google Virtual NIC (gVNIC) support

gve

Intel® 10GbE PCI Express Virtual Function Ethernet

ixgbevf

Intel® 10GbE PCI Express adapters

ixgbe

[a]

[b]

Intel® Ethernet Connection E800 Series

Ice

[a]

Intel® Ethernet Controller I225-LM/I225-V family

igc

[b]

Intel® PCI Express Gigabit adapters

igb

[a]

[b]

Intel® Ethernet Controller XL710 Family

i40e

[a] [c]

Marvell OcteonTX2

rvu_nicpf

[a] [c]

Mellanox 5th generation network adapters (ConnectX series)

mlx5_core

[c]

Mellanox Technologies 1/10/40Gbit Ethernet

mlx4_en

Microsoft Azure Network Adapter

mana

Microsoft Hyper-V virtual network

hv_netvsc

Netronome® NFP4000/NFP6000 NIC [d]

nfp

QEMU Virtio 网络

virtio_net

[a]

QLogic QED 25/40/100Gb Ethernet NIC

qede

STMicroelectronics Multi-Gigabit Ethernet

stmmac

Solarflare SFC9000/SFC9100/EF100-family

sfc

[c]

Universal TUN/TAP device

tun

Virtual Ethernet pair device

veth

VMware VMXNET3 ethernet driver

vmxnet3

[a] [c]

Xen paravirtual network device

xen-netfront

[a] 只有在接口上加载 XDP 程序时。
[b] 仅传输侧。无法通过 XDP 接收大型数据包。
[c] 需要分配几个大于或等于最大 CPU 索引的 XDP TX 队列。
[d] 一些列出的功能不适用于 Netronome® NFP3800 NIC。

图例:

  • 基本的:支持基本的返回代码:DROPPASSABORTEDTX
  • 重定向:支持 XDP_REDIRECT 返回码。
  • 目标 :可以是 XDP_REDIRECT 返回码的目标。
  • HW 卸载:支持 XDP 硬件卸载。
  • 零-复制:支持 AF_XDP 协议系列的零复制模式。
  • 大 MTU:支持大于页大小的数据包。

第 43 章 使用 BPF 编译器集合进行网络追踪

BPF Compiler Collection(BCC)是一个库,可帮助创建扩展的 Berkeley Packet Filter(eBPF)程序。eBPF 程序的主要工具是分析操作系统性能和网络性能,而不会遇到开销或安全问题。

BCC 不再需要用户了解 eBPF 的技术详情,并提供了许多开箱即用的起点,如带有预先创建的 eBPF 程序的 bcc-tools 软件包。

注意

eBPF 程序在事件中触发,如磁盘 I/O、TCP 连接以及进程创建。程序不太可能导致内核崩溃、循环或者变得无响应,因为它们在内核的安全性虚拟机中运行。

43.1. 安装 bcc-tools 软件包

安装 bcc-tools 软件包,该软件包还会将 BPF Compiler Collection (BCC)库作为依赖项安装。

流程

  • 安装 bcc-tools

    # dnf install bcc-tools
    Copy to Clipboard Toggle word wrap

    BCC 工具安装在 /usr/share/bcc/tools/ 目录中。

验证

  • 检查安装的工具:

    # ls -l /usr/share/bcc/tools/
    ...
    -rwxr-xr-x. 1 root root  4198 Dec 14 17:53 dcsnoop
    -rwxr-xr-x. 1 root root  3931 Dec 14 17:53 dcstat
    -rwxr-xr-x. 1 root root 20040 Dec 14 17:53 deadlock_detector
    -rw-r--r--. 1 root root  7105 Dec 14 17:53 deadlock_detector.c
    drwxr-xr-x. 3 root root  8192 Mar 11 10:28 doc
    -rwxr-xr-x. 1 root root  7588 Dec 14 17:53 execsnoop
    -rwxr-xr-x. 1 root root  6373 Dec 14 17:53 ext4dist
    -rwxr-xr-x. 1 root root 10401 Dec 14 17:53 ext4slower
    ...
    Copy to Clipboard Toggle word wrap

    列表中的 doc 目录提供每个工具的文档。

43.2. 显示添加到内核的接受队列中的 TCP 连接

通过使用 tcpaccept 工具,您可以通过追踪内核的 accept () 函数来监控新接受的连接。

内核在 TCP 3 向握手中接收 ACK 数据包后,内核会将来自 SYN 队列的连接移到 accept 队列,直到连接的状态变为 ESTABLISHED。因此,只有成功的 TCP 连接才能在此队列中看到。

tcpaccept 工具使用 eBPF 特性显示内核添加到 accept 队列的所有连接。该工具是轻量级的,因为它跟踪内核的 accept() 函数,而不是捕获和过滤数据包。例如,使用 tcpaccept 进行常规故障排除,来显示服务器已接受的新连接。

流程

  1. 输入以下命令来启动对内核 accept 队列的追踪:

    # /usr/share/bcc/tools/tcpaccept
    PID   COMM      IP RADDR         RPORT  LADDR    LPORT
    843   sshd      4  192.0.2.17    50598  192.0.2.1  22
    1107  ns-slapd  4  198.51.100.6  38772  192.0.2.1  389
    1107  ns-slapd  4  203.0.113.85  38774  192.0.2.1  389
    ...
    Copy to Clipboard Toggle word wrap

    每次内核接受一个连接时,tcpaccept 都会显示连接的详情。

  2. Ctrl+C 停止追踪过程。

43.3. 追踪出去的 TCP 连接尝试

tcpconnect 工具使用 eBPF 特性来跟踪出去的 TCP 连接尝试。该工具的输出还包括失败的连接。

tcpconnect 工具是轻量级的,例如,因为它跟踪内核的 connect() 函数,而不是捕获和过滤数据包。

流程

  1. 输入以下命令启动显示所有传出连接的追踪过程:

    # /usr/share/bcc/tools/tcpconnect
    PID    COMM         IP SADDR      DADDR          DPORT
    31346  curl         4  192.0.2.1  198.51.100.16  80
    31348  telnet       4  192.0.2.1  203.0.113.231  23
    31361  isc-worker00 4  192.0.2.1  192.0.2.254    53
    ...
    Copy to Clipboard Toggle word wrap

    每次内核处理一个出去的连接时,tcpconnect 都会显示连接的详情。

  2. Ctrl+C 停止追踪过程。

43.4. 测量出站 TCP 连接的延迟

tcpconnlat 工具使用 eBPF 特性来测量发送 SYN 数据包和接收响应数据包之间的时间。

TCP 连接延迟是建立连接所需的时间。这通常涉及内核 TCP/IP 处理和网络往返时间,而不是应用程序运行时。

流程

  1. 开始测量出站连接的延迟:

    # /usr/share/bcc/tools/tcpconnlat
    PID    COMM         IP SADDR      DADDR          DPORT LAT(ms)
    32151  isc-worker00 4  192.0.2.1  192.0.2.254    53    0.60
    32155  ssh          4  192.0.2.1  203.0.113.190  22    26.34
    32319  curl         4  192.0.2.1  198.51.100.59  443   188.96
    ...
    Copy to Clipboard Toggle word wrap

    每次内核处理一个出去的连接时,tcpconnlat 都会在内核接收响应数据包后显示连接的详细信息。

  2. Ctrl+C 停止追踪过程。

43.5. 显示被内核丢弃的 TCP 数据包和片段详情

tcpdrop 工具使管理员能够显示内核所丢弃的 TCP 数据包和段的详情。使用这个实用程序调试丢弃数据包的高速率,以便远程系统发送基于计时器的重新传输。

释放数据包和片段的高速率可能会影响服务器的性能。tcpdrop 工具使用 eBPF 特性,而不是捕获和过滤资源密集型的数据包,来直接从内核检索信息。

流程

  1. 输入以下命令来显示丢弃 TCP 数据包和片段详情:

    # /usr/share/bcc/tools/tcpdrop
    TIME     PID    IP SADDR:SPORT       > DADDR:DPORT   STATE (FLAGS)
    13:28:39 32253  4  192.0.2.85:51616  > 192.0.2.1:22  CLOSE_WAIT (FIN|ACK)
    	b'tcp_drop+0x1'
    	b'tcp_data_queue+0x2b9'
    	...
    
    13:28:39 1      4  192.0.2.85:51616  > 192.0.2.1:22   CLOSE (ACK)
    	b'tcp_drop+0x1'
    	b'tcp_rcv_state_process+0xe2'
    	...
    Copy to Clipboard Toggle word wrap

    每次内核丢弃 TCP 数据包和段时,tcpdrop 都会显示连接的详情,包括导致软件包丢弃的内核堆栈追踪。

  2. Ctrl+C 停止追踪过程。

43.6. 追踪 TCP 会话

tcplife 工具使用 eBPF 跟踪打开和关闭的 TCP 会话,并打印一行输出来总结每一个会话。管理员可以使用 tcplife 来识别连接和传输的流量数。

例如,您可以显示到端口 22 (SSH)的连接来检索以下信息:

  • 本地进程 ID(PID)
  • 本地进程名称
  • 本地 IP 地址和端口号
  • 远程 IP 地址和端口号
  • 接收和传输的流量的数量(以 KB 为单位)。
  • 连接处于活跃状态的时间(毫秒)

流程

  1. 输入以下命令来开始追踪到本地端口 22 的连接:

    # /usr/share/bcc/tools/tcplife -L 22
    PID   COMM    LADDR      LPORT RADDR       RPORT TX_KB  RX_KB      MS
    19392 sshd    192.0.2.1  22    192.0.2.17  43892    53     52 6681.95
    19431 sshd    192.0.2.1  22    192.0.2.245 43902    81 249381 7585.09
    19487 sshd    192.0.2.1  22    192.0.2.121 43970  6998     7 16740.35
    ...
    Copy to Clipboard Toggle word wrap

    每次关闭连接时,tcplife 都会显示连接的详情。

  2. Ctrl+C 停止追踪过程。

43.7. 追踪 TCP 重新传输

tcpretrans 工具显示有关 TCP 重新传输的详细信息,如本地和远程的 IP 地址和端口号,以及重新传输时 TCP 的状态。

该工具使用 eBPF 功能,因此开销非常低。

流程

  1. 使用以下命令来显示 TCP 重新传输详情:

    # /usr/share/bcc/tools/tcpretrans
    TIME     PID  IP LADDR:LPORT   T> RADDR:RPORT         STATE
    00:23:02 0    4  192.0.2.1:22  R> 198.51.100.0:26788  ESTABLISHED
    00:23:02 0    4  192.0.2.1:22  R> 198.51.100.0:26788  ESTABLISHED
    00:45:43 0    4  192.0.2.1:22  R> 198.51.100.0:17634  ESTABLISHED
    ...
    Copy to Clipboard Toggle word wrap

    每次内核调用 TCP 重新传输函数时,tcpretrans 都会显示连接的详情。

  2. Ctrl+C 停止追踪过程。

43.8. 显示 TCP 状态更改信息

在 TCP 会话中,TCP 状态会改变。tcpstates 工具使用 eBPF 功能跟踪这些状态变化,并打印包括每个状态持续时间的详细信息。例如,使用 tcpstates 来确定连接是否在初始化状态中花费了太多时间。

流程

  1. 使用以下命令开始追踪 TCP 状态变化:

    # /usr/share/bcc/tools/tcpstates
    SKADDR           C-PID C-COMM     LADDR     LPORT RADDR       RPORT OLDSTATE    -> NEWSTATE    MS
    ffff9cd377b3af80 0     swapper/1  0.0.0.0   22    0.0.0.0     0     LISTEN      -> SYN_RECV    0.000
    ffff9cd377b3af80 0     swapper/1  192.0.2.1 22    192.0.2.45  53152 SYN_RECV    -> ESTABLISHED 0.067
    ffff9cd377b3af80 818   sssd_nss   192.0.2.1 22    192.0.2.45  53152 ESTABLISHED -> CLOSE_WAIT  65636.773
    ffff9cd377b3af80 1432  sshd       192.0.2.1 22    192.0.2.45  53152 CLOSE_WAIT  -> LAST_ACK    24.409
    ffff9cd377b3af80 1267  pulseaudio 192.0.2.1 22    192.0.2.45  53152 LAST_ACK    -> CLOSE       0.376
    ...
    Copy to Clipboard Toggle word wrap

    每次连接改变其状态时,tcpstates 都会显示一个新行,其中包含更新的连接详情。

    如果多个连接同时改变了其状态,请使用第一列中的套接字地址(SKADDR)来确定哪些条目属于同一个连接。

  2. Ctrl+C 停止追踪过程。

43.9. 聚合发送到特定子网的 TCP 流量

tcpsubnet 工具汇总并合计了本地主机发往子网的 IPv4 TCP 流量,并按固定间隔显示输出。该工具使用 eBPF 功能来收集并总结数据,以减少开销。

默认情况下,tcpsubnet 为以下子网汇总流量:

  • 127.0.0.1/32
  • 10.0.0.0/8
  • 172.16.0.0/12
  • 192.0.2.0/24/16
  • 0.0.0.0/0

请注意,最后一个子网(0.0.0.0/0)是一个全包括选项。tcpsubnet 工具计算与这个全包括条目中前四个不同的子网的所有流量。

按照以下流程计算 192.0.2.0/24198.51.100.0/24 子网的流量。到其他子网的流量将在 0.0.0.0/0 全包括子网条目中跟踪。

流程

  1. 开始监控发送到 192.0.2.0/24198.51.100.0/24 以及其他子网的流量数:

    # /usr/share/bcc/tools/tcpsubnet 192.0.2.0/24,198.51.100.0/24,0.0.0.0/0
    Tracing... Output every 1 secs. Hit Ctrl-C to end
    [02/21/20 10:04:50]
    192.0.2.0/24           856
    198.51.100.0/24       7467
    [02/21/20 10:04:51]
    192.0.2.0/24          1200
    198.51.100.0/24       8763
    0.0.0.0/0              673
    ...
    Copy to Clipboard Toggle word wrap

    这个命令以字节为单位显示指定子网每秒一次的流量。

  2. Ctrl+C 停止追踪过程。

43.10. 通过 IP 地址和端口显示网络吞吐量

tcptop 工具以 KB 为单位显示主机发送并接收的 TCP 流量。这个报告会自动刷新并只包含活跃的 TCP 连接。该工具使用 eBPF 功能,因此开销非常低。

流程

  1. 要监控发送和接收的流量,请输入:

    # /usr/share/bcc/tools/tcptop
    13:46:29 loadavg: 0.10 0.03 0.01 1/215 3875
    
    PID    COMM         LADDR           RADDR              RX_KB   TX_KB
    3853   3853         192.0.2.1:22    192.0.2.165:41838  32     102626
    1285   sshd         192.0.2.1:22    192.0.2.45:39240   0           0
    ...
    Copy to Clipboard Toggle word wrap

    命令的输出只包括活跃的 TCP 连接。如果本地或者远程系统关闭了连接,则该连接在输出中不再可见。

  2. Ctrl+C 停止追踪过程。

43.11. 追踪已建立的 TCP 连接

tcptracer 工具跟踪连接、接受和关闭 TCP 连接的内核函数。该工具使用 eBPF 功能,因此开销非常低。

流程

  1. 使用以下命令启动追踪过程:

    # /usr/share/bcc/tools/tcptracer
    Tracing TCP established connections. Ctrl-C to end.
    T  PID    COMM        IP SADDR        DADDR       SPORT  DPORT
    A  1088   ns-slapd    4  192.0.2.153  192.0.2.1   0      65535
    A  845    sshd        4  192.0.2.1    192.0.2.67  22     42302
    X  4502   sshd        4  192.0.2.1    192.0.2.67  22     42302
    ...
    Copy to Clipboard Toggle word wrap

    每当内核连接、接受或关闭连接时,tcptracer 都会显示连接的详情。

  2. Ctrl+C 停止追踪过程。

43.12. 追踪 IPv4 和 IPv6 侦听尝试

solisten 工具追踪所有 IPv4 和 IPv6 侦听尝试。它跟踪尝试,包括最终失败的或者不接受连接的侦听程序。当程序希望侦听 TCP 连接时,工具会跟踪内核调用的函数。

流程

  1. 输入以下命令启动显示所有监听 TCP 尝试的追踪过程:

    # /usr/share/bcc/tools/solisten
    PID    COMM           PROTO         BACKLOG     PORT     ADDR
    3643   nc             TCPv4         1           4242     0.0.0.0
    3659   nc             TCPv6         1           4242     2001:db8:1::1
    4221   redis-server   TCPv6         128         6379     ::
    4221   redis-server   TCPv4         128         6379     0.0.0.0
    ....
    Copy to Clipboard Toggle word wrap
  2. Ctrl+C 停止追踪过程。

43.13. 软中断的服务时间概述

softirqs 工具总结了服务软中断(soft IRQ)所花费的时间,并将这个时间显示为总计或直方图分布。这个工具使用 irq:softirq_enterirq:softirq_exit 内核追踪点,是一个稳定的追踪机制。

流程

  1. 输入以下命令启动追踪 soft irq 事件时间:

    # /usr/share/bcc/tools/softirqs
    Tracing soft irq event time... Hit Ctrl-C to end.
    ^C
    SOFTIRQ          TOTAL_usecs
    tasklet                  166
    block                   9152
    net_rx                 12829
    rcu                    53140
    sched                 182360
    timer                 306256
    Copy to Clipboard Toggle word wrap
  2. Ctrl+C 停止追踪过程。

43.14. 总结网络接口上的数据包大小和数量

netqtop 工具显示有关特定网络接口的每个网络队列上收到的(RX)和传输的(TX)数据包属性的统计信息。

统计包括:

  • 每秒字节数(BPS)
  • 每秒数据包数(PPS)
  • 平均数据包大小
  • 总数据包数

要生成这些统计数据,netqtop 会跟踪执行传输的数据包 net_dev_start_xmit 以及接收的数据包 netif_receive_skb 的事件的内核功能。

流程

  1. 显示 2 秒时间间隔的字节大小范围内的数据包数:

    # /usr/share/bcc/tools/netqtop -n enp1s0 -i 2
    
    Fri Jan 31 18:08:55 2023
    TX
     QueueID	avg_size   [0, 64)	[64, 512)  [512, 2K)  [2K, 16K)  [16K, 64K)
     0      	0      	0      	0      	0      	0      	0
     Total  	0      	0      	0      	0      	0      	0
    
    RX
     QueueID	avg_size   [0, 64)	[64, 512)  [512, 2K)  [2K, 16K)  [16K, 64K)
     0      	38.0   	1      	0      	0      	0      	0
     Total  	38.0   	1      	0      	0      	0      	0
    -----------------------------------------------------------------------------
    Fri Jan 31 18:08:57 2023
    TX
     QueueID	avg_size   [0, 64)	[64, 512)  [512, 2K)  [2K, 16K)  [16K, 64K)
     0      	0      	0      	0      	0      	0      	0
     Total  	0      	0      	0      	0      	0      	0
    
    RX
     QueueID	avg_size   [0, 64)	[64, 512)  [512, 2K)  [2K, 16K)  [16K, 64K)
     0      	38.0   	1      	0      	0      	0      	0
     Total  	38.0   	1      	0      	0      	0      	0
    -----------------------------------------------------------------------------
    Copy to Clipboard Toggle word wrap
  2. Ctrl+C 来停止 netqtop

网络设备通常会拦截和读取编程的控制器接收的数据包。您可以在虚拟交换机或端口组层面上,将网络设备配置为接受来自所有 MAC 地址的流量。

您可以使用这个网络模式来:

  • 诊断网络连接问题
  • 出于安全原因监控网络活动
  • 拦截传输中的私有数据或网络中的入侵

您可以为任何类型的网络设备启用此模式,除了 InfiniBand

44.1. 临时配置设备以接受所有流量

您可以使用 ip 工具临时配置网络设备以接受所有流量,而不考虑 MAC 地址。

流程

  1. 可选:显示网络接口以标识您要接收所有流量的接口:

    # ip address show
    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
    ...
    Copy to Clipboard Toggle word wrap
  2. 修改设备以启用或禁用此属性:

    • enp1s0 启用 accept-all-mac-addresses 模式:

      # ip link set enp1s0 promisc on
      Copy to Clipboard Toggle word wrap
    • enp1s0 禁用 accept-all-mac-addresses 模式:

      # ip link set enp1s0 promisc off
      Copy to Clipboard Toggle word wrap

验证

  • 验证 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
    Copy to Clipboard Toggle word wrap

    设备描述中的 PROMISC 标志表示启用了该模式。

您可以使用 nmcli 工具永久配置网络设备以接受所有流量,而不考虑 MAC 地址。

流程

  1. 可选:显示网络接口以标识您要接收所有流量的接口:

    # ip address show
    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
    ...
    Copy to Clipboard Toggle word wrap

    如果没有任何连接,您可以创建一个新的连接。

  2. 修改网络设备以启用或禁用此属性。

    • enp1s0 启用 ethernet.accept-all-mac-addresses 模式:

      # nmcli connection modify enp1s0 ethernet.accept-all-mac-addresses yes
      Copy to Clipboard Toggle word wrap
    • enp1s0 禁用 accept-all-mac-addresses 模式:

      # nmcli connection modify enp1s0 ethernet.accept-all-mac-addresses no
      Copy to Clipboard Toggle word wrap
  3. 应用更改,重新激活连接:

    # nmcli connection up enp1s0
    Copy to Clipboard Toggle word wrap

验证

  • 验证是否启用了 ethernet.accept-all-mac-addresses 模式:

    # nmcli connection show enp1s0
    ...
    802-3-ethernet.accept-all-mac-addresses:1     (true)
    Copy to Clipboard Toggle word wrap

    802-3-ethernet.accept-all-mac-addresses: true 表示该模式已启用。

使用 nmstatectl 工具配置设备,以接受所有流量,而不考虑通过 Nmstate API 的 MAC 地址。Nmstate API 确保设置配置后结果与配置文件匹配。如果有任何失败,nmstatectl 会自动回滚更改以避免系统处于不正确的状态。

先决条件

  • nmstate 软件包已安装。
  • 用于配置设备的 enp1s0.yml 文件可用。

流程

  1. 编辑 enp1s0 连接的现有 enp1s0.yml 文件,并将以下内容添加到其中:

    ---
    interfaces:
      - name: enp1s0
        type: ethernet
        state: up
        accept -all-mac-address: true
    Copy to Clipboard Toggle word wrap

    这些设置将 enp1s0 设备配置为接受所有流量。

  2. 应用网络设置:

    # nmstatectl apply ~/enp1s0.yml
    Copy to Clipboard Toggle word wrap

验证

  • 验证是否启用了 802-3-ethernet.accept-all-mac-addresses 模式:

    # nmstatectl show enp1s0
    interfaces:
      - name: enp1s0
        type: ethernet
        state: up
        accept-all-mac-addresses:     true
    ...
    Copy to Clipboard Toggle word wrap

    802-3-ethernet.accept-all-mac-addresses: true 表示该模式已启用。

第 45 章 使用 nmcli 镜像网络接口

网络管理员可以使用端口镜像复制从一个网络设备传输到另一个网络设备的入站和出站网络流量。在以下情况下,镜像接口的流量很有帮助:

  • 要调试网络问题并调优网络流
  • 要检查和分析网络流量
  • 要检测入侵

先决条件

  • 一个镜像网络流量的网络接口。

流程

  1. 添加您要镜像网络流量的网络连接配置集:

    # nmcli connection add type ethernet ifname enp1s0 con-name enp1s0 autoconnect no
    Copy to Clipboard Toggle word wrap
  2. 将类型为 prioqdisc 附加到带有 10: handle 的出口(传出)流量的 enp1s0

    # nmcli connection modify enp1s0 +tc.qdisc "root prio handle 10:"
    Copy to Clipboard Toggle word wrap

    qdisc 设置为 prio attached without children 允许附加过滤器。

  3. 为入口流量添加 qdisc,使用 ffff: handle:

    # nmcli connection modify enp1s0 +tc.qdisc "ingress handle ffff:"
    Copy to Clipboard Toggle word wrap
  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"
    Copy to Clipboard Toggle word wrap

    matchall 过滤器与所有数据包匹配,mirred 操作会将数据包重定向到目的地。

  5. 激活连接:

    # nmcli connection up enp1s0
    Copy to Clipboard Toggle word wrap

验证

  1. 安装 tcpdump 工具:

    # dnf install tcpdump
    Copy to Clipboard Toggle word wrap
  2. 显示目标设备上镜像的流量 (enp7s0):

    # tcpdump -i enp7s0
    Copy to Clipboard Toggle word wrap

网络设备可以使用链路层发现协议(LLDP),来在 LAN 中公告其身份、功能和邻居。nmstate-autoconf 工具可使用此信息来自动配置本地网络接口。

重要

nmstate-autoconf 工具仅作为技术预览提供。红帽产品服务级别协议(SLA)不支持技术预览功能,且其功能可能并不完善,因此红帽不建议在生产环境中使用它们。这些预览可让用户早期访问将来的产品功能,让用户在开发过程中测试并提供反馈意见。

如需有关 技术预览功能支持范围 的信息,请参阅红帽客户门户网站中的技术预览功能支持范围。

46.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 - enp1s0enp2s0 作为端口的绑定接口。
  • prod-net - 在 VLAN ID 为 100bond100 上面的 VLAN 接口。
  • mgmt-net - 在 VLAN ID 为200enp3s0 上面的 VLAN 接口

如果您将多个网络接口连接到 LLDP 用来广播同一 VLAN ID 的不同交换机的端口,则 nmstate-autoconf 会用这些接口来创建一个绑定,并在其上配置通用 VLAN ID。

先决条件

  • nmstate 软件包已安装。
  • 网络交换机上启用了 LLDP。
  • 以太网接口已启用。

流程

  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
      Copy to Clipboard Toggle word wrap
    2. 将设置应用到系统:

      # nmstatectl apply ~/enable-lldp.yml
      Copy to Clipboard Toggle word wrap
  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
      Copy to Clipboard Toggle word wrap
    2. 使用 nmstate-autoconf 根据从 LLDP 接收的信息来生成配置,并将设置应用到系统:

      # nmstate-autoconf enp1s0,enp2s0,enp3s0
      Copy to Clipboard Toggle word wrap

后续步骤

验证

  • 显示单个接口的设置:

    # nmstatectl show <interface_name>
    Copy to Clipboard Toggle word wrap

第 48 章 DPDK 入门

数据平面开发套件(DPDK)提供库和网络驱动程序,以加快用户空间中的数据包处理。

管理员使用 DPDK,例如,在虚拟机中使用单一根 I/O 虚拟化(SR-IOV)来减少延迟并增加 I/O 吞吐量。

注意

红帽不支持实验性的 DPDK API。

48.1. 安装 dpdk 软件包

要使用 DPDK,请安装 dpdk 软件包。

流程

  • 使用 dnf 工具安装 dpdk 软件包:

    # dnf install dpdk
    Copy to Clipboard Toggle word wrap

第 49 章 TIPC 入门

透明进程间通信(TIPC)(也称为 集群域套接字)是用于 集群范围操作的进程间通信(IPC)服务。

在高可用性和动态集群环境中运行的应用程序有特殊需要。集群中的节点数量可能会有所不同,路由器可能会失败,且出于负载均衡的考虑,功能也可以移到集群中的不同节点。TIPC 可最大程度降低应用程序开发人员处理此类问题的工作,并尽可能以正确和最佳的方式处理它们。另外,TIPC 比一般协议(如 TCP)提供效率更高且容错的通讯。

红帽建议使用其他 bearer 级别协议来根据传输介质加密节点之间的通信。例如:

+ * MACsec: 请参阅 使用 MACsec 来加密第 2 层流量 * IPsec:请参阅 使用 IPsec 配置 VPN

49.1. TIPC 的构架

TIPC 是使用 TIPC 和数据包传输服务(bearer)的应用程序之间的一个层,横跨传输层、网络层和信令链路层。然而,TIPC 可以使用不同的传输协议作为 bearer,这样 TCP 连接就可以充当 TIPC 信号连接的 bearer。

TIPC 支持以下 bearer:

  • Ethernet
  • InfiniBand
  • UDP 协议

TIPC 提供了在 TIPC 端口间可靠传送信息,这是所有 TIPC 通讯的端点。

以下是 TIPC 构架图:

49.2. 系统引导时载入 tipc 模块

在使用 TIPC 协议前,您必须载入 tipc 内核模块。您可以将 Red Hat Enterprise Linux 配置为在系统引导时自动载入这个内核模块。

流程

  1. 使用以下内容创建 /etc/modules-load.d/tipc.conf 文件:

    tipc
    Copy to Clipboard Toggle word wrap
  2. 重启 systemd-modules-load 服务,以在不重启系统的情况下加载模块:

    # systemctl start systemd-modules-load
    Copy to Clipboard Toggle word wrap

验证

  • 使用以下命令验证 RHEL 是否已载入 tipc 模块:

    # lsmod | grep tipc
    tipc    311296  0
    Copy to Clipboard Toggle word wrap

    如果命令没有显示 tipc 模块的条目,则 RHEL 没有加载它。

49.3. 创建 TIPC 网络

要创建 TIPC 网络,请在应该加入 TIPC 网络的每个主机上执行这个流程。

重要

这些命令只临时配置 TIPC 网络。要在节点上永久配置 TIPC,在脚本中使用此流程的命令,并将 RHEL 配置为在系统引导时执行该脚本。

先决条件

流程

  1. 可选:设置一个唯一的节点身份,如 UUID 或节点的主机名:

    # tipc node set identity host_name
    Copy to Clipboard Toggle word wrap

    身份可以是任何由最多 16 个字母和数字组成的唯一字符串。

    您不能在此步骤后设置或改变身份。

  2. 添加一个 bearer。例如,要将 Ethernet 用作介质,并将 enp0s1 设备用作物理 bearer 设备,请输入:

    # tipc bearer enable media eth device enp1s0
    Copy to Clipboard Toggle word wrap
  3. 可选: 要获得冗余和更好的性能,请使用上一步中的命令附加更多 bearer。您可以配置最多三个 bearer,但在同一介质上不能超过两个。
  4. 在应该加入 TIPC 网络的每个节点中重复前面的所有步骤。

验证

  1. 显示集群成员的链接状态:

    # tipc link list
    broadcast-link: up
    5254006b74be:enp1s0-525400df55d1:enp1s0: up
    Copy to Clipboard Toggle word wrap

    此输出表示,节点 5254006b74be 上的 bearer enp1s0 和节点 525400df55d1 上的 bearer enp1s0 之间的链接为 up

  2. 显示 TIPC 发布表:

    # tipc nametable show
    Type       Lower      Upper      Scope    Port       Node
    0          1795222054 1795222054 cluster  0          5254006b74be
    0          3741353223 3741353223 cluster  0          525400df55d1
    1          1          1          node     2399405586 5254006b74be
    2          3741353223 3741353223 node     0          5254006b74be
    Copy to Clipboard Toggle word wrap
    • 服务类型为 0 的两个条目表示两个节点是这个集群的成员。
    • 服务类型为 1 的条目代表内置的拓扑服务跟踪服务。
    • 服务类型为 2 的条目显示从发布节点看到的链接。范围限制 3741353223 表示十进制格式的对等端点的地址(基于节点身份的唯一 32 位哈希值)。

通常,虚拟机(VM)只有一个可被 DHCP 配置的接口。但是,DHCP 无法使用多个网络实体,如接口、IP 子网和 IP 地址来配置虚拟机。另外,您无法在虚拟机实例运行时应用设置。要解决这个运行时配置问题,nm-cloud-setup 工具会自动从云服务提供商的元数据服务器检索配置信息,并更新主机的网络配置。工具自动获取一个接口上的多个网络接口、多个 IP 地址或 IP 子网,并帮助重新配置正在运行的虚拟机实例的网络。

50.1. 配置和预部署 nm-cloud-setup

要在公有云中启用和配置网络接口,请运行 nm-cloud-setup 作为计时器和服务。

注意

在 Red Hat Enterprise Linux On Demand 和 AWS 黄金镜像上,nn-cloud-setup 已启用,无需任何操作。

先决条件

  • 存在网络连接。
  • 连接使用 DHCP。

    默认情况下,NetworkManager 会创建一个使用 DHCP 的连接配置文件。如果因为您在 /etc/NetworkManager/NetworkManager.conf 中设置了 no-auto-default 参数而没有创建配置文件,请手动创建此初始连接。

流程

  1. 安装 nm-cloud-setup 软件包:

    # dnf install NetworkManager-cloud-setup
    Copy to Clipboard Toggle word wrap
  2. nm-cloud-setup 服务创建并运行 管理单元文件:

    1. 使用以下命令开始编辑管理单元文件:

      # systemctl edit nm-cloud-setup.service
      Copy to Clipboard Toggle word wrap

      显式启动服务或重启系统,以使配置设置生效是非常重要的。

    2. 使用 systemd 管理单元文件来在 nm-cloud-setup 中配置云提供商。例如,要使用 Amazon EC2,请输入:

      [Service]
      Environment=NM_CLOUD_SETUP_EC2=yes
      Copy to Clipboard Toggle word wrap

      您可以设置以下环境变量来启用您所使用的云提供商:

      • 用于 Alibaba Cloud (Aliyun) 的 NM_CLOUD_SETUP_ALIYUN
      • 用于 Microsoft Azure 的 NM_CLOUD_SETUP_AZURE
      • 用于 Amazon EC2(AWS)的 NM_CLOUD_SETUP_EC2
      • Google Cloud 的 NM_CLOUD_SETUP_GCP
      • NM_CLOUD_SETUP_OCI for Oracle Cloud Infrastructure (OCI)
    3. 保存文件并退出编辑器。
  3. 重新载入 systemd 配置:

    # systemctl daemon-reload
    Copy to Clipboard Toggle word wrap
  4. 启用并启动 nm-cloud-setup 服务:

    # systemctl enable --now nm-cloud-setup.service
    Copy to Clipboard Toggle word wrap
  5. 启用并启动 nm-cloud-setup 计时器:

    # systemctl enable --now nm-cloud-setup.timer
    Copy to Clipboard Toggle word wrap

Amazon EC2 中的实例元数据服务(IMDS)允许您管理访问正在运行的 Red Hat Enterprise Linux (RHEL) EC2 实例的实例元数据的权限。RHEL EC2 实例使用 IMDS 版本 2 (IMDSv2),一个面向会话的方法。通过使用 nm-cloud-setup 工具,管理员可以重新配置网络,并自动更新正在运行的 RHEL EC2 实例的配置。nm-cloud-setup 工具使用 IMDSv2 令牌处理 IMDSv2 API 调用,而无需用户干预。

  • IMDS 运行在本地链路地址 169.254.169.254 上,提供对 RHEL EC2 实例上原生应用程序的访问。
  • 为应用程序和用户的每个 RHEL EC2 实例指定并配置了 IMDSv2 后,您无法再访问 IMDSv1。
  • 通过使用 IMDSv2,RHEL EC2 实例可在不使用 IAM 角色的情况下维护元数据,同时通过 IAM 角色保持可访问。
  • 当 RHEL EC2 实例引导时,nmn-cloud-setup 工具自动运行,以获取使用 RHEL EC2 实例 API 的 EC2 实例 API 访问令牌。
注意

使用 IMDSv2 令牌作为 HTTP 标头,来检查 EC2 环境的详情。

法律通告

Copyright © 2025 Red Hat, Inc.
The text of and illustrations in this document are licensed by Red Hat under a Creative Commons Attribution–Share Alike 3.0 Unported license ("CC-BY-SA"). An explanation of CC-BY-SA is available at http://creativecommons.org/licenses/by-sa/3.0/. In accordance with CC-BY-SA, if you distribute this document or an adaptation of it, you must provide the URL for the original version.
Red Hat, as the licensor of this document, waives the right to enforce, and agrees not to assert, Section 4d of CC-BY-SA to the fullest extent permitted by applicable law.
Red Hat, Red Hat Enterprise Linux, the Shadowman logo, the Red Hat logo, JBoss, OpenShift, Fedora, the Infinity logo, and RHCE are trademarks of Red Hat, Inc., registered in the United States and other countries.
Linux® is the registered trademark of Linus Torvalds in the United States and other countries.
Java® is a registered trademark of Oracle and/or its affiliates.
XFS® is a trademark of Silicon Graphics International Corp. or its subsidiaries in the United States and/or other countries.
MySQL® is a registered trademark of MySQL AB in the United States, the European Union and other countries.
Node.js® is an official trademark of Joyent. Red Hat is not formally related to or endorsed by the official Joyent Node.js open source or commercial project.
The OpenStack® Word Mark and OpenStack logo are either registered trademarks/service marks or trademarks/service marks of the OpenStack Foundation, in the United States and other countries and are used with the OpenStack Foundation's permission. We are not affiliated with, endorsed or sponsored by the OpenStack Foundation, or the OpenStack community.
All other trademarks are the property of their respective owners.
返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

Theme

© 2025 Red Hat