搜索

配置和管理网络

download PDF
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 内置,并且 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

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

policy描述名称示例

keep

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

 

kernel

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

lo

database

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

idrac

onboard

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

eno1

slot

设备名称包含固件或 BIOS 提供的 PCI Express (PCIe)热插拔 slot-index 号。

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. 切换到不同的网络接口命名方案

默认情况下,Red Hat Enterprise Linux (RHEL) 9 使用 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
    ...

    记录接口的 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

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

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

    # grubby --update-kernel=ALL --args=net.naming-scheme=rhel-9.4
  4. 重启系统。

    # reboot
  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
    ...

    切换方案后,在这个示例中,udev 将 MAC 地址为 00:00:5e:00:53:1a 的设备命名为 eno1np0 ,而之前其被命名为 eno1

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

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

    # nmcli connection modify example_profile connection.interface-name "eno1np0"
  8. 重新激活连接配置文件:

    # nmcli connection up example_profile

验证

  • 通过显示网络接口的 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

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

如果您不想将默认的设备命名策略用于以太网接口,您可以在 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
    ...

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

您可以使用 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
    ...

    记录接口的 MAC 地址。

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

    # cat /sys/class/net/enp1s0/type
    1
  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>"
    重要

    如果您在引导过程中需要一致的设备名称,则只使用 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"
  4. 可选:重新生成 initrd RAM 磁盘镜像:

    # dracut -f

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

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

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

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

    # nmcli connection modify example_profile match.interface-name "provider0 enp1s0"
  8. 重启系统:

    # reboot
  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
    ...
  10. 配置连接配置文件,以仅匹配新接口名称:

    # nmcli connection modify example_profile match.interface-name "provider0"

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

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

    # nmcli connection up example_profile

其他资源

  • 您系统上的 udev (7) 手册页

第 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

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

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

    # nmcli connection add con-name <connection-name> ifname <device-name> type ethernet

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

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

    # nmcli connection modify "Wired connection 1" connection.id "Internal-LAN"

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

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

    # nmcli connection show Internal-LAN
    ...
    connection.interface-name:     enp1s0
    connection.autoconnect:        yes
    ipv4.method:                   auto
    ipv6.method:                   auto
    ...
  5. 配置 IPv4 设置:

    • 要使用 DHCP,请输入:

      # nmcli connection modify Internal-LAN ipv4.method auto

      如果 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
  6. 配置 IPv6 设置:

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

      # nmcli connection modify Internal-LAN ipv6.method auto

      如果 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
  7. 要在配置文件中自定义其他设置,请使用以下命令:

    # nmcli connection modify <connection-name> <setting> <value>

    将值用空格或分号括在引号中。

  8. 激活配置文件:

    # nmcli connection up Internal-LAN

验证

  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
  2. 显示 IPv4 默认网关:

    # ip route show default
    default via 192.0.2.254 dev enp1s0 proto static metric 102
  3. 显示 IPv6 默认网关:

    # ip -6 route show default
    default via 2001:db8:1::ffee dev enp1s0 proto static metric 102 pref medium
  4. 显示 DNS 设置:

    # cat /etc/resolv.conf
    search example.com
    nameserver 192.0.2.200
    nameserver 2001:db8:1::ffbb

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

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

    # ping <host-name-or-IP-address>

故障排除

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

其他资源

  • 您系统上的 nm-settings (5) 手册页

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

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

先决条件

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

步骤

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

    # nmcli connection show
    NAME                UUID                                  TYPE      DEVICE
    Wired connection 1  a5eb6490-cc20-3668-81f8-0314a27f3f75  ethernet  enp1s0

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

  2. 以交互模式启动 nmcli

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

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

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

    nmcli> set connection.id Internal-LAN

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

    不要使用引号来设置包含空格的 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
    ...
  5. 如果创建新连接配置文件,请设置网络接口:

    nmcli> set connection.interface-name enp1s0
  6. 配置 IPv4 设置:

    • 要使用 DHCP,请输入:

      nmcli> set ipv4.method auto

      如果 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
  7. 配置 IPv6 设置:

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

      nmcli> set ipv6.method auto

      如果 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
  8. 保存并激活连接:

    nmcli> save persistent
  9. 保留为互动模式:

    nmcli> quit

验证

  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
  2. 显示 IPv4 默认网关:

    # ip route show default
    default via 192.0.2.254 dev enp1s0 proto static metric 102
  3. 显示 IPv6 默认网关:

    # ip -6 route show default
    default via 2001:db8:1::ffee dev enp1s0 proto static metric 102 pref medium
  4. 显示 DNS 设置:

    # cat /etc/resolv.conf
    search example.com
    nameserver 192.0.2.200
    nameserver 2001:db8:1::ffbb

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

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

    # ping <host-name-or-IP-address>

故障排除

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

其他资源

  • 您系统上的 nm-settings (5)nmcli (1) 手册页

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

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

注意

nmtui 中:

  • 使用光标键导航。
  • 选择一个按钮并按 Enter 键。
  • 使用 Space 选择并清除复选框。

先决条件

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

流程

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

    # nmcli device status
    DEVICE     TYPE      STATE                   CONNECTION
    enp1s0     ethernet  unavailable             --
    ...
  2. 启动 nmtui

    # nmtui
  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 地址设置的以太网连接示例

    nmtui ethernet static 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
  2. 显示 IPv4 默认网关:

    # ip route show default
    default via 192.0.2.254 dev enp1s0 proto static metric 102
  3. 显示 IPv6 默认网关:

    # ip -6 route show default
    default via 2001:db8:1::ffee dev enp1s0 proto static metric 102 pref medium
  4. 显示 DNS 设置:

    # cat /etc/resolv.conf
    search example.com
    nameserver 192.0.2.200
    nameserver 2001:db8:1::ffbb

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

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

    # ping <host-name-or-IP-address>

故障排除

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

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

如果您通过以太网将主机连接到网络,您可以使用 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 作为方法,并在标签页中填写字段:

      IP 设置 gnome 设置
  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
  2. 显示 IPv4 默认网关:

    # ip route show default
    default via 192.0.2.254 dev enp1s0 proto static metric 102
  3. 显示 IPv6 默认网关:

    # ip -6 route show default
    default via 2001:db8:1::ffee dev enp1s0 proto static metric 102 pref medium
  4. 显示 DNS 设置:

    # cat /etc/resolv.conf
    search example.com
    nameserver 192.0.2.200
    nameserver 2001:db8:1::ffbb

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

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

    # ping <host-name-or-IP-address>

故障排除步骤

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

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

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

先决条件

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

流程

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

    $ nm-connection-editor
  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 作为方法,并在标签页中填写字段:

      IP 设置 nm 连接编辑器
  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
  2. 显示 IPv4 默认网关:

    # ip route show default
    default via 192.0.2.254 dev enp1s0 proto static metric 102
  3. 显示 IPv6 默认网关:

    # ip -6 route show default
    default via 2001:db8:1::ffee dev enp1s0 proto static metric 102 pref medium
  4. 显示 DNS 设置:

    # cat /etc/resolv.conf
    search example.com
    nameserver 192.0.2.200
    nameserver 2001:db8:1::ffbb

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

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

    # ping <host-name-or-IP-address>

故障排除步骤

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

2.6. 使用 nmstatectl 配置带有静态 IP 地址的以太网连接

使用 nmstatectl 工具通过 Nmstate API 配置以太网连接。Nmstate API 确保设置配置后,结果与配置文件匹配。如果有任何失败,nmstatectl 会自动回滚更改以避免系统处于不正确的状态。

先决条件

  • 服务器配置中存在物理或虚拟以太网网络接口控制器(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

    这些设置使用以下设置为 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>
      ...
  3. 将设置应用到系统:

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

验证

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

    # nmstatectl show enp1s0
  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
  3. 显示 IPv4 默认网关:

    # ip route show default
    default via 192.0.2.254 dev enp1s0 proto static metric 102
  4. 显示 IPv6 默认网关:

    # ip -6 route show default
    default via 2001:db8:1::ffee dev enp1s0 proto static metric 102 pref medium
  5. 显示 DNS 设置:

    # cat /etc/resolv.conf
    search example.com
    nameserver 192.0.2.200
    nameserver 2001:db8:1::ffbb

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

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

    # ping <host-name-or-IP-address>

其他资源

  • 您系统上的 nmstatectl (8) 手册页
  • /usr/share/doc/nmstate/examples/ 目录

2.7. 使用 network RHEL 系统角色和接口名称,配置具有静态 IP 地址的以太网连接

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

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

前提条件

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

流程

  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: rhel-system-roles.network
          vars:
            network_connections:
              - name: enp1s0
                interface_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
                state: up

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

  2. 验证 playbook 语法:

    $ ansible-playbook --syntax-check ~/playbook.yml

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

  3. 运行 playbook:

    $ ansible-playbook ~/playbook.yml

验证

  • 查询受管节点的 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"
                ]
            },
    ...

其他资源

  • /usr/share/ansible/roles/rhel-system-roles.network/README.md 文件
  • /usr/share/doc/rhel-system-roles/network/ directory

2.8. 使用 network RHEL 系统角色和设备路径,配置具有静态 IP 地址的以太网连接

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

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

前提条件

  • 您已准备好控制节点和受管节点
  • 以可在受管主机上运行 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: 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

    示例 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

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

  3. 运行 playbook:

    $ ansible-playbook ~/playbook.yml

验证

  • 查询受管节点的 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"
                ]
            },
    ...

其他资源

  • /usr/share/ansible/roles/rhel-system-roles.network/README.md 文件
  • /usr/share/doc/rhel-system-roles/network/ directory

2.9. 使用 nmstatectl 配置具有动态 IP 地址的以太网连接

使用 nmstatectl 工具通过 Nmstate API 配置以太网连接。Nmstate API 确保设置配置后,结果与配置文件匹配。如果有任何失败,nmstatectl 会自动回滚更改以避免系统处于不正确的状态。

先决条件

  • 服务器配置中存在物理或虚拟以太网网络接口控制器(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

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

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

    ---
    interfaces:
    - name: <profile_name>
      type: ethernet
      identifier: mac-address
      mac-address: <mac_address>
      ...
  3. 将设置应用到系统:

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

验证

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

    # nmstatectl show enp1s0
  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
  3. 显示 IPv4 默认网关:

    # ip route show default
    default via 192.0.2.254 dev enp1s0 proto static metric 102
  4. 显示 IPv6 默认网关:

    # ip -6 route show default
    default via 2001:db8:1::ffee dev enp1s0 proto static metric 102 pref medium
  5. 显示 DNS 设置:

    # cat /etc/resolv.conf
    search example.com
    nameserver 192.0.2.200
    nameserver 2001:db8:1::ffbb

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

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

    # ping <host-name-or-IP-address>

其他资源

  • 您系统上的 nmstatectl (8) 手册页
  • /usr/share/doc/nmstate/examples/ 目录

2.10. 使用 network RHEL 系统角色和接口名称,配置具有动态 IP 地址的以太网连接

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

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

前提条件

  • 您已准备好控制节点和受管节点
  • 以可在受管主机上运行 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: rhel-system-roles.network
          vars:
            network_connections:
              - name: enp1s0
                interface_name: enp1s0
                type: ethernet
                autoconnect: yes
                ip:
                  dhcp4: yes
                  auto6: yes
                state: up

    示例 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

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

  3. 运行 playbook:

    $ ansible-playbook ~/playbook.yml

验证

  • 查询受管节点的 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"
                ]
            },
    ...

其他资源

  • /usr/share/ansible/roles/rhel-system-roles.network/README.md 文件
  • /usr/share/doc/rhel-system-roles/network/ directory

2.11. 使用 network RHEL 系统角色和设备路径,配置具有动态 IP 地址的以太网连接

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

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

前提条件

  • 您已准备好控制节点和受管节点
  • 以可在受管主机上运行 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: 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

    示例 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

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

  3. 运行 playbook:

    $ ansible-playbook ~/playbook.yml

验证

  • 查询受管节点的 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"
                ]
            },
    ...

其他资源

  • /usr/share/ansible/roles/rhel-system-roles.network/README.md 文件
  • /usr/share/doc/rhel-system-roles/network/ directory

2.12. 按接口名称使用单个连接配置文件配置多个以太网接口

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

前提条件

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

流程

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

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

验证

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

    # nmcli connection show "Wired connection 1"
    connection.id:                      Wired connection 1
    ...
    connection.multi-connect:           3 (multiple)
    match.interface-name:               enp*
    ...

    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

其他资源

  • 您系统上的 nmcli (1) 手册页
  • nm-settings(5) 手册页

2.13. 使用 PCI ID 为多个以太网接口配置一个连接配置文件

PCI ID 是连接到系统的设备的唯一标识符。连接配置文件根据 PCI ID 列表按匹配的接口来添加多个设备。您可以使用这个流程将多个设备 PCI ID 连接到一个连接配置文件。

先决条件

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

步骤

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

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

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

验证

  1. 显示连接的状态:

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

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

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

其他资源

  • 您系统上的 nmcli (1) 手册页
  • nm-settings(5) 手册页

第 3 章 配置网络绑定

网络绑定是一种组合或聚合物理和虚拟网络接口的方法,以提供高吞吐量或冗余的逻辑接口。在绑定中,内核只处理所有操作。您可以在不同类型的设备中创建绑定,如以太网设备或 VLAN。

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

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

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

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

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

3.2. 依赖绑定模式的上游交换机配置

根据您要使用的绑定模式,您必须在交换机上配置端口:

绑定模式交换机上的配置

0 - balance-rr

需要启用静态 EtherChannel,而不是链路聚合控制协议(LACP)协商。

1 - active-backup

交换机上不需要任何配置。

2 - balance-xor

需要启用静态 EtherChannel,而不是 LACP 协商。

3 - broadcast

需要启用静态 EtherChannel,而不是 LACP 协商。

4 - 802.3ad

需要启用 LACP 协商的 EtherChannel。

5 - balance-tlb

交换机上不需要任何配置。

6 - balance-alb

交换机上不需要任何配置。

有关如何配置交换机的详情,请查看交换机文档。

重要

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

3.3. 使用 nmcli 配置网络绑定

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

先决条件

步骤

  1. 创建绑定接口:

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

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

    要额外设置介质独立接口(MII)监控间隔,请在 bond.options 属性中添加 miimon=interval 选项,例如:

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

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

    在本例中:

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

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

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

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

    2. 要将现有的连接配置文件分配给绑定:

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

        # nmcli connection modify bridge0 controller bond0
        # nmcli connection modify bridge1 controller bond0

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

      2. 重新激活连接:

        # nmcli connection up bridge0
        # nmcli connection up bridge1
  4. 配置 IPv4 设置:

    • 要将这个绑定设备用作其它设备的端口,请输入:

      # nmcli connection modify bond0 ipv4.method disabled
    • 要使用 DHCP,不需要进行任何操作。
    • 要为 bond0 连接设置静态 IPv4 地址、网络掩码、默认网关和 DNS 服务器设置,请输入:

      # nmcli connection modify bond0 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
  5. 配置 IPv6 设置:

    • 要将这个绑定设备用作其它设备的端口,请输入:

      # nmcli connection modify bond0 ipv6.method disabled
    • 要使用无状态地址自动配置(SLAAC),则不需要任何操作。
    • 要为 bond0 连接设置静态 IPv6 地址、网络掩码、默认网关和 DNS 服务器设置,请输入:

      # nmcli connection modify bond0 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
  6. 可选:如果要对绑定端口设置任何参数,请使用以下命令:

    # nmcli connection modify bond0-port1 bond-port.<parameter> <value>
  7. 激活连接:

    # nmcli connection up bond0
  8. 验证端口是否已连接,并且 CONNECTION 列是否显示端口的连接名称:

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

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

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

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

      # nmcli connection up bond0

验证

  1. 从其中一个网络设备临时移除网线,并检查绑定中的其他设备是否在处理流量。

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

  2. 显示绑定状态:

    # cat /proc/net/bonding/bond0

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

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

先决条件

步骤

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

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

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

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

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

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

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

      绑定团队网桥 vlan.ipv4
    7. 应用

验证

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

    bond 验证
  2. 从其中一个网络设备临时移除网线,并检查绑定中的其他设备是否在处理流量。

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

  3. 显示绑定状态:

    # cat /proc/net/bonding/bond0

3.5. 使用 nmtui 配置网络绑定

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

注意

nmtui 中:

  • 使用光标键导航。
  • 选择一个按钮并按 Enter 键。
  • 使用 Space 选择并清除复选框。

先决条件

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

步骤

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

    # nmcli device status
    DEVICE     TYPE      STATE                   CONNECTION
    enp7s0     ethernet  unavailable             --
    enp8s0     ethernet  unavailable             --
    ...
  2. 启动 nmtui

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

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

  7. Device 字段中输入要创建的绑定设备的名称。
  8. 为要创建的绑定添加端口:

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

      图 3.1. 将以太网设备作为端口添加到绑定

      nmtui bond add port
    6. 重复这些步骤,来向绑定添加更多的端口。
  9. 设置绑定模式。根据您设置的值,nmtui 会显示与所选模式相关的设置的额外字段。
  10. 根据您的环境,在 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 搜索域。

    图 3.2. 具有静态 IP 地址设置的绑定连接的示例

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

验证

  1. 从其中一个网络设备临时移除网线,并检查绑定中的其他设备是否在处理流量。

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

  2. 显示绑定状态:

    # cat /proc/net/bonding/bond0

3.6. 使用 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
  2. 点击 + 按钮来添加一个新的连接。
  3. 选择 Bond 连接类型,然后单击 Create
  4. Bond 选项卡中:

    1. 可选:在 Interface name 字段中设置绑定接口的名称。
    2. Add 按钮将网络接口作为端口添加到绑定。

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

      add nic to bond in nm connection editor

    4. 可选:设置其他选项,如介质独立接口(MII)监控间隔。
  5. IPv4 SettingsIPv6 Settings 标签页中配置 IP 地址设置:

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

      bond IP settings nm connection editor

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

验证

  1. 从其中一个网络设备临时移除网线,并检查绑定中的其他设备是否在处理流量。

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

  2. 显示绑定状态:

    # cat /proc/net/bonding/bond0

3.7. 使用 nmstatectl 配置网络绑定

使用 nmstatectl 工具通过 Nmstate API 配置网络绑定。Nmstate API 确保设置配置后,结果与配置文件匹配。如果有任何失败,nmstatectl 会自动回滚更改以避免系统处于不正确的状态。

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

先决条件

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

步骤

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

    ---
    interfaces:
    - name: bond0
      type: bond
      state: up
      ipv4:
        enabled: true
        address:
        - ip: 192.0.2.1
          prefix-length: 24
        dhcp: false
      ipv6:
        enabled: true
        address:
        - ip: 2001:db8:1::1
          prefix-length: 64
        autoconf: false
        dhcp: false
      link-aggregation:
        mode: active-backup
        port:
        - enp1s0
        - enp7s0
    - name: enp1s0
      type: ethernet
      state: up
    - name: enp7s0
      type: ethernet
      state: up
    
    routes:
      config:
      - destination: 0.0.0.0/0
        next-hop-address: 192.0.2.254
        next-hop-interface: bond0
      - destination: ::/0
        next-hop-address: 2001:db8:1::fffe
        next-hop-interface: bond0
    
    dns-resolver:
      config:
        search:
        - example.com
        server:
        - 192.0.2.200
        - 2001:db8:1::ffbb

    这些设置使用以下设置定义网络绑定:

    • 绑定中的网络接口:enp1s0enp7s0
    • 模式: active-backup
    • 静态 IPv4 地址:192.0.2.1,子网掩码为 /24
    • 静态 IPv6 地址:2001:db8:1::1子网掩码为 /64
    • IPv4 默认网关:192.0.2.254
    • IPv6 默认网关:2001:db8:1::fffe
    • IPv4 DNS 服务器:192.0.2.200
    • IPv6 DNS 服务器:2001:db8:1::ffbb
    • DNS 搜索域:example.com
  2. 将设置应用到系统:

    # nmstatectl apply ~/create-bond.yml

验证

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

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

    # nmcli connection show bond0
    connection.id:              bond0
    connection.uuid:            79cbc3bd-302e-4b1f-ad89-f12533b818ee
    connection.stable-id:       --
    connection.type:            bond
    connection.interface-name:  bond0
    ...
  3. 以 YAML 格式显示连接设置:

    # nmstatectl show bond0

其他资源

  • 您系统上的 nmstatectl (8) 手册页
  • /usr/share/doc/nmstate/examples/ 目录

3.8. 使用 network RHEL 系统角色配置网络绑定

您可以将网络接口组合到绑定中,来提供具有高吞吐量或冗余的逻辑接口。要配置绑定,请创建一个 NetworkManager 连接配置文件。通过使用 Ansible 和 network RHEL 系统角色,您可以在 playbook 中定义的主机上自动化此过程,并远程配置连接配置文件。

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

前提条件

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

流程

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

    ---
    - name: Configure the network
      hosts: managed-node-01.example.com
      tasks:
        - name: Bond connection profile with two Ethernet ports
          ansible.builtin.include_role:
            name: rhel-system-roles.network
          vars:
            network_connections:
              # Bond profile
              - name: bond0
                type: bond
                interface_name: bond0
                ip:
                  dhcp4: yes
                  auto6: yes
                bond:
                  mode: active-backup
                state: up
    
              # Port profile for the 1st Ethernet device
              - name: bond0-port1
                interface_name: enp7s0
                type: ethernet
                controller: bond0
                state: up
    
              # Port profile for the 2nd Ethernet device
              - name: bond0-port2
                interface_name: enp8s0
                type: ethernet
                controller: bond0
                state: up

    示例 playbook 中指定的设置包括以下内容:

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

    设置绑定模式。可能的值有:

    • balance-rr(默认)
    • active-backup
    • balance-xor
    • broadcast
    • 802.3ad
    • balance-tlb
    • balance-alb

    根据您设置的模式,您需要在 playbook 中设置额外的变量。

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

  2. 验证 playbook 语法:

    $ ansible-playbook --syntax-check ~/playbook.yml

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

  3. 运行 playbook:

    $ ansible-playbook ~/playbook.yml

验证

  • 从其中一个网络设备临时移除网线,并检查绑定中的其他设备是否在处理流量。

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

其他资源

  • /usr/share/ansible/roles/rhel-system-roles.network/README.md 文件
  • /usr/share/doc/rhel-system-roles/network/ directory

3.9. 创建网络绑定以便在不中断 VPN 的情况下在以太网和无线连接间进行切换

将工作站连接到公司网络的 RHEL 用户通常会使用 VPN 访问远程资源。然而,如果工作站在以太网和 Wi-Fi 连接间切换,例如:如果您是从带以太网连接的 docking 站中释放的笔记本电脑,VPN 连接就中断。要避免这个问题,您可以在 active-backup 模式中创建使用以太网和 Wi-Fi 连接的网络绑定。

先决条件

  • 主机包含以太网和 Wi-Fi 设备。
  • 已创建以太网和 Wi-Fi 网络管理器连接配置集,且两个连接都可以独立工作。

    此流程使用以下连接配置文件来创建名为 bond0 的网络绑定:

    • enp11s0u1 以太网设备关联的 Docking_station
    • Wi-Fiwlp1s0 Wi-Fi 设备关联

流程

  1. active-backup 模式中创建一个绑定接口:

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

    这个命令将接口和连接配置文件命名为 bond0

  2. 配置绑定的 IPv4 设置:

    • 如果您的网络中的 DHCP 服务器为主机分配 IPv4 地址,则不需要任何操作。
    • 如果您的本地网络需要静态 IPv4 地址,请将地址、网络掩码、默认网关、DNS 服务器和 DNS 搜索域设为 bond0 连接:

      # nmcli connection modify bond0 ipv4.addresses '192.0.2.1/24'
      # nmcli connection modify bond0 ipv4.gateway '192.0.2.254'
      # nmcli connection modify bond0 ipv4.dns '192.0.2.253'
      # nmcli connection modify bond0 ipv4.dns-search 'example.com'
      # nmcli connection modify bond0 ipv4.method manual
  3. 配置绑定的 IPv6 设置:

    • 如果您的网络中的路由器或者 DHCP 服务器为主机分配 IPv6 地址,则不需要任何操作。
    • 如果您的本地网络需要静态 IPv6 地址,请将地址、网络掩码、默认网关、DNS 服务器和 DNS 搜索域设为 bond0 连接:

      # nmcli connection modify bond0 ipv6.addresses '2001:db8:1::1/64'
      # nmcli connection modify bond0 ipv6.gateway '2001:db8:1::fffe'
      # nmcli connection modify bond0 ipv6.dns '2001:db8:1::fffd'
      # nmcli connection modify bond0 ipv6.dns-search 'example.com'
      # nmcli connection modify bond0 ipv6.method manual
  4. 显示连接配置集:

    # nmcli connection show
    NAME             UUID                                  TYPE      DEVICE
    Docking_station  256dd073-fecc-339d-91ae-9834a00407f9  ethernet  enp11s0u1
    Wi-Fi            1f1531c7-8737-4c60-91af-2d21164417e8  wifi      wlp1s0
    ...

    下一步需要连接配置集的名称和以太网设备名称。

  5. 为绑定分配以太网连接的配置:

    # nmcli connection modify Docking_station controller bond0
  6. 为绑定分配 Wi-Fi 连接的连接配置集:

    # nmcli connection modify Wi-Fi controller bond0
  7. 如果您的 Wi-Fi 网络使用 MAC 过滤来只允许列表中的 MAC 地址访问网络,请配置 NetworkManager 将活跃端口的 MAC 地址动态分配给绑定:

    # nmcli connection modify bond0 +bond.options fail_over_mac=1

    使用这个设置时,您必须将 Wi-Fi 设备的 MAC 地址设置为 allow 列表,而不是以太网和 Wi-Fi 设备的 MAC 地址。

  8. 将与以太连接关联的设备设置为绑定的主设备:

    # nmcli con modify bond0 +bond.options "primary=enp11s0u1"

    使用这个设置时,如果可用,绑定总是使用以太网连接。

  9. 配置当 bond0 设备激活时,NetworkManager 会自动激活端口:

    # nmcli connection modify bond0 connection.autoconnect-ports 1
  10. 激活 bond0 连接:

    # nmcli connection up bond0

验证

  • 显示当前激活的设备,绑定及其端口的状态:

    # cat /proc/net/bonding/bond0
    Ethernet Channel Bonding Driver: v3.7.1 (April 27, 2011)
    
    Bonding Mode: fault-tolerance (active-backup) (fail_over_mac active)
    Primary Slave: enp11s0u1 (primary_reselect always)
    Currently Active Slave: enp11s0u1
    MII Status: up
    MII Polling Interval (ms): 1
    Up Delay (ms): 0
    Down Delay (ms): 0
    Peer Notification Delay (ms): 0
    
    Slave Interface: enp11s0u1
    MII Status: up
    Speed: 1000 Mbps
    Duplex: full
    Link Failure Count: 0
    Permanent HW addr: 00:53:00:59:da:b7
    Slave queue ID: 0
    
    Slave Interface: wlp1s0
    MII Status: up
    Speed: Unknown
    Duplex: Unknown
    Link Failure Count: 2
    Permanent HW addr: 00:53:00:b3:22:ba
    Slave queue ID: 0

3.10. 不同的网络绑定模式

Linux 绑定驱动程序提供链路聚合。绑定是并行封装多个网络接口的过程,以提供单个逻辑绑定接口。绑定接口的操作取决于也称为模式的绑定策略。不同的模式提供负载均衡或热待机服务。

存在以下模式:

Balance-rr (Mode 0)

balance-rr 使用循环算法,它按顺序将数据包从第一个可用端口传输到最后一个端口。这个模式提供负载平衡和容错。

这个模式需要切换端口聚合组(也称为 EtherChannel 或类似的端口分组)。EtherChannel 是一个端口链路聚合技术,用于将多个物理以太网链接分组到一个逻辑以太网链接中。

这个模式的缺陷在于它不适用于大量工作负载,以及 TCP 吞吐量或排序数据包交付非常重要。

Active-backup (Mode 1)

Active-backup 使用策略来确定在绑定中只有一个端口活跃。这个模式提供容错功能,不需要任何交换机配置。

如果活动端口失败,则备用端口将变为活动状态。绑定会向网络发送大量地址解析协议 (ARP) 响应。gratuitous ARP 强制执行 ARP 帧的接收器,以更新它们的转发表。Active-backup 模式传输一个 gratuitous ARP,宣布为主机维护连接的新路径。

primary 选项定义绑定接口的首选端口。

Balance-xor (Mode 2)

balance-xor 使用所选传输哈希策略来发送数据包。这个模式提供负载平衡、容错和需要切换配置来设置 Etherchannel 或类似的端口分组。

要改变数据包传输和平衡传输,此模式使用 xmit_hash_policy 选项。根据接口上流量的源或目的地,接口需要额外的负载均衡配置。请参阅 xmit_hash_policy bonding 参数

Broadcast (Mode 3)

广播使用在所有接口上传输每个数据包的策略。这个模式提供容错,需要交换机配置来设置 EtherChannel 或类似的端口分组。

这个模式的缺陷在于它不适用于大量工作负载,以及 TCP 吞吐量或排序数据包交付非常重要。

802.3ad (Mode 4)

802.3ad 使用同名的 IEEE 标准动态链路聚合策略。此模式提供容错功能。这个模式需要切换配置来设置链路聚合控制协议 (LACP) 端口分组。

这个模式会创建聚合组,它们共享相同的速度和双工设置,并使用活跃聚合器中的所有端口。根据接口上流量的源或目的地,此模式需要额外的负载平衡配置。

默认情况下,传出流量的端口选择取决于传输哈希策略。使用传输哈希策略的 xmit_hash_policy 选项更改端口选择和平衡传输。

802.3adBalance-xor 之间的差别是合规性。802.3ad 策略在端口聚合组之间协商 LACP。请参阅 xmit_hash_policy bonding 参数

Balance-tlb (Mode 5)

balance-tlb 使用传输负载均衡策略。这个模式提供容错、负载均衡和建立不需要任何交换机支持的频道绑定。

活动端口接收传入流量。如果活动端口失败,另一个则是接管故障端口的 MAC 地址。要确定哪个接口处理传出流量,请使用以下模式之一:

  • 0 :使用哈希分发策略在不进行负载均衡的情况下分发流量
  • 1: 利用负载均衡将流量分配到每个端口

    使用 bonding 选项 tlb_dynamic_lb=0,此绑定模式使用 xmit_hash_policy bonding 选项来均衡传输。primary 选项定义绑定接口的首选端口。

请参阅 xmit_hash_policy bonding 参数

Balance-alb (Mode 6)

balance-alb 使用自适应负载平衡策略。这个模式提供容错、负载平衡,且不需要任何特殊交换机支持。

这个模式包括 balance-trans-mit 负载均衡(balance-tlb)和 IPv4 和 IPv6 流量的接收负载均衡。绑定会截获本地系统发送的 ARP 回复,并覆盖绑定中某个端口的源硬件地址。ARP 协商管理接收负载平衡。因此,不同的端口为服务器使用不同的硬件地址。

primary 选项定义绑定接口的首选端口。使用 bonding 选项 tlb_dynamic_lb=0,此绑定模式使用 xmit_hash_policy bonding 选项来均衡传输。请参阅 xmit_hash_policy bonding 参数

其他资源

3.11. xmit_hash_policy bonding 参数

xmit_hash_policy 负载均衡参数在 balance-xor802.3adbalance-albbalance-tlb 模式中选择节点选择的传输散列策略。如果 tlb_dynamic_lb 参数为 0,则只适用于模式 5 和 6。此参数可能的值是 layer2, layer2+3, layer3+4, encap2+3, encap3+4, 和 vlan+srcmac

详情请查看表:

策略或网络层

Layer2

Layer2+3

Layer3+4

encap2+3

encap3+4

VLAN+srcmac

使用

源和目的地 MAC 地址和以太网协议类型的 XOR

源和目标 MAC 地址和 IP 地址的 XOR

源和目标端口和 IP 地址的 XOR

支持的隧道内的目的地 MAC 地址和 IP 地址的 XOR,如虚拟可扩展局域网 (VXLAN)。此模式依赖于 skb_flow_dissect() 函数来获取标头字段

受支持的隧道内的目标端口和 IP 地址的 XOR,如 VXLAN。此模式依赖于 skb_flow_dissect() 函数来获取标头字段

VLAN ID 和源 MAC 厂商和源 MAC 设备的 XOR

流量放置

在同一个底层网络接口上到特定网络对等的所有流量

同一底层网络接口上特定 IP 地址的所有流量

同一底层网络接口上特定 IP 地址和端口的所有流量

   

主要选择

如果网络流量在同一广播域中的这个系统和多个其他系统之间

如果此系统和多个其他系统间的网络流量会通过默认网关

如果此系统和其他系统之间的网络流量使用相同的 IP 地址,但会经历多个端口

封装的流量在源系统和多个其它系统中使用多个 IP 地址

封装的流量是源系统和其它使用多个端口号的系统间

如果绑定承载来自多个容器或虚拟机 (VM) 的网络流量,它会将其 MAC 地址直接公开给外部网络,如桥接网络,您无法配置模式 2 或模式 4 的交换机。

辅助选择

如果网络流量主要是此系统和默认网关后面的多个其他系统之间

如果网络流量主要是此系统和另一个系统间的

    

Compliant

802.3ad

802.3ad

Not 802.3ad

   

默认策略

如果没有提供配置,则这是默认策略

对于非 IP 流量,公式与 L2 传输策略相同

对于非 IP 流量,公式与 L2 传输策略相同

   

第 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 | egrep "^ip"
    ...
    ipv4.method:                            manual
    ipv4.dns:                               192.0.2.253
    ipv4.dns-search:                        example.com
    ipv4.addresses:                         192.0.2.1/24
    ipv4.gateway:                           192.0.2.254
    ...
    ipv6.method:                            manual
    ipv6.dns:                               2001:db8:1::fffd
    ipv6.dns-search:                        example.com
    ipv6.addresses:                         2001:db8:1::1/64
    ipv6.gateway:                           2001:db8:1::fffe
    ...
  2. team0 设备的配置导出到 JSON 文件中:

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

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

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

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

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

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

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

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

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

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

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

    # nmcli connection up bond-bond0

验证

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

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

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

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

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

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

      # cat /proc/net/bonding/bond0

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

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

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

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

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

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

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

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

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

    在本例中:

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

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

      # nmcli connection add type ethernet 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

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

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

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

        # nmcli connection modify bond0 controller team0
        # nmcli connection modify bond1 controller team0

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

      2. 重新激活连接:

        # nmcli connection up bond0
        # nmcli connection up bond1
  5. 配置 IPv4 设置:

    • 要将这个团队设备用作其它设备的端口,请输入:

      # nmcli connection modify team0 ipv4.method disabled
    • 要使用 DHCP,不需要进行任何操作。
    • 要为 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
  6. 配置 IPv6 设置:

    • 要将这个团队设备用作其它设备的端口,请输入:

      # nmcli connection modify team0 ipv6.method disabled
    • 要使用无状态地址自动配置(SLAAC),则不需要任何操作。
    • 要为 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
  7. 激活连接:

    # nmcli connection up team0

验证

  • 显示团队状态:

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

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

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

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

重要

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

先决条件

步骤

  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 部分配置它们。

      绑定团队网桥 vlan.ipv4
    7. 应用

验证

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

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

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

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

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
  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. 确定
  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

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

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

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

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

    # nmcli connection modify vlan10 ethernet.mtu 2000
  4. 配置 IPv4 设置:

    • 要将这个 VLAN 设备用作其它设备的端口,请输入:

      # nmcli connection modify vlan10 ipv4.method disabled
    • 要使用 DHCP,不需要进行任何操作。
    • 要为 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
  5. 配置 IPv6 设置:

    • 要将这个 VLAN 设备用作其它设备的端口,请输入:

      # nmcli connection modify vlan10 ipv6.method disabled
    • 要使用无状态地址自动配置(SLAAC),则不需要任何操作。
    • 要为 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
  6. 激活连接:

    # nmcli connection up vlan10

验证

  • 验证设置:

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

其他资源

  • 您系统上的 nm-settings (5) 手册页

5.2. 使用 nmcli 配置嵌套 VLAN

802.1ad 是用于虚拟局域网(VLAN)标记的协议。它也被称为 Q-in-Q 标记。您可以使用此技术在单个以太网框架中创建多个 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
    ...
  2. 创建基础 VLAN 接口。例如,要创建一个名为 vlan10 的基本 VLAN 接口,它使用 enp1s0 作为其父接口,以及 VLAN ID 为 10 的标记数据包,请输入:

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

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

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

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

    # nmcli connection add type vlan con-name vlan10.20 dev enp1s0.10 id 20 vlan.protocol 802.1ad

    此命令会在父 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
  6. 配置嵌套 VLAN 接口的 IPv6 设置:

    • 要使用无状态地址自动配置(SLAAC),则不需要任何操作。
    • 要为 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
  7. 激活配置文件:

    # nmcli connection up vlan10.20

验证

  1. 验证嵌套 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

其他资源

  • 您系统上的 nm-settings (5) 手册页

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 标签。详情请查看您的交换机文档。

步骤

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

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

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

    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 部分配置它们。

      绑定团队网桥 vlan.ipv4
    7. 应用

验证

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

    VLAN 验证

5.4. 使用 nmtui 配置 VLAN 标记

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

注意

nmtui 中:

  • 使用光标键导航。
  • 选择一个按钮并按 Enter 键。
  • 使用 Space 选择并清除复选框。

前提条件

  • 您计划用作虚拟 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             --
    ...
  2. 启动 nmtui

    # nmtui
  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 连接示例

    nmtui vlan 静态 IP
  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

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

5.6. 使用 nmstatectl 配置 VLAN 标记

使用 nmstatectl 工具通过 Nmstate API 配置虚拟局域网 VLAN。Nmstate API 确保设置配置后,结果与配置文件匹配。如果有任何失败,nmstatectl 会自动回滚更改以避免系统处于不正确的状态。

根据您的环境,相应地调整 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

    这些设置定义一个 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

验证

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

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

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

    # nmstatectl show vlan0

其他资源

  • 您系统上的 nmstatectl (8) 手册页
  • /usr/share/doc/nmstate/examples/ 目录

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

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

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

注意

如果 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: 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

    示例 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

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

  3. 运行 playbook:

    $ ansible-playbook ~/playbook.yml

验证

  • 验证 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: <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
        ...

其他资源

  • /usr/share/ansible/roles/rhel-system-roles.network/README.md 文件
  • /usr/share/doc/rhel-system-roles/network/ directory

第 6 章 配置网络桥接

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

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

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

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

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

6.1. 使用 nmcli 配置网桥

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

先决条件

步骤

  1. 创建网桥接口:

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

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

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

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

    在本例中:

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

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

      # nmcli connection add type ethernet 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

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

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

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

        # nmcli connection modify bond0 controller bridge0
        # nmcli connection modify bond1 controller bridge0

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

      2. 重新激活连接:

        # nmcli connection up bond0
        # nmcli connection up bond1
  4. 配置 IPv4 设置:

    • 要将这个网桥设备用作其它设备的端口,请输入:

      # nmcli connection modify bridge0 ipv4.method disabled
    • 要使用 DHCP,不需要进行任何操作。
    • 要为 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
  5. 配置 IPv6 设置:

    • 要将这个网桥设备用作其它设备的端口,请输入:

      # nmcli connection modify bridge0 ipv6.method disabled
    • 要使用无状态地址自动配置(SLAAC),则不需要任何操作。
    • 要为 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
  6. 可选:配置网桥的其他属性。例如,要将 bridge0 的生成树协议(STP)优先级设为 16384,请输入:

    # nmcli connection modify bridge0 bridge.priority '16384'

    默认情况下启用 STP。

  7. 激活连接:

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

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

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

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

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

      # nmcli connection up bridge0

验证

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

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

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

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

其他资源

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

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

前提条件

步骤

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

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

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

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

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

      绑定团队网桥 vlan.ipv4
    7. 应用

验证

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

    网桥验证

6.3. 使用 nmtui 配置网桥

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

注意

nmtui 中:

  • 使用光标键导航。
  • 选择一个按钮并按 Enter 键。
  • 使用 Space 选择并清除复选框。

前提条件

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

步骤

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

    # nmcli device status
    DEVICE     TYPE      STATE                   CONNECTION
    enp7s0     ethernet  unavailable             --
    enp8s0     ethernet  unavailable             --
    ...
  2. 启动 nmtui

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

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

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

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

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

      nmtui 网桥添加端口
    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 domain 旁边的 Add,并输入 DNS 搜索域。

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

    nmtui bridge no 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
  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
    ...

    要显示特定以太网设备的状态,请使用 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
  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
  • 使用 bridge 工具来显示作为任意网桥设备中端口的以太网设备状态:

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

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

6.5. 使用 nmstatectl 配置网桥

使用 nmstatectl 工具通过 Nmstate API 配置网桥。Nmstate API 确保设置配置后,结果与配置文件匹配。如果有任何失败,nmstatectl 会自动回滚更改以避免系统处于不正确的状态。

根据您的环境,相应地调整 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

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

    • 网桥中的网络接口: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

验证

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

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

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

    # nmstatectl show bridge0

其他资源

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

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

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

注意

如果要为网桥分配 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: 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

    示例 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

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

  3. 运行 playbook:

    $ ansible-playbook ~/playbook.yml

验证

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

其他资源

  • /usr/share/ansible/roles/rhel-system-roles.network/README.md 文件
  • /usr/share/doc/rhel-system-roles/network/ directory

第 7 章 设置 IPsec VPN

虚拟专用网络(VPN)是一种通过互联网连接到本地网络的方法。Libreswan 提供的 IPsec 是创建 VPN 的首选方法。libreswan 是 VPN 的用户空间 IPsec 实现。VPN 通过在中间网络(如互联网)设置一个隧道来启用 LAN 和另一个远程 LAN 之间的通信。为了安全起见,VPN 隧道总是使用认证和加密。对于加密操作,Libreswan 使用 NSS 库。

7.1. libreswan 作为 IPsec VPN 的实现

在 RHEL 中,您可以使用 Libreswan 应用程序支持的 IPsec 协议配置虚拟专用网络(VPN)。Libreswan 是 Openswan 应用程序的延续,Openswan 文档中的许多示例可以通过 Libreswan 交换。

VPN 的 IPsec 协议使用互联网密钥交换(IKE)协议进行配置。术语 IPsec 和 IKE 可互换使用。IPsec VPN 也称为 IKE VPN、IKEv2 VPN、XAUTH VPN、Cisco VPN 或 IKE/IPsec VPN。IPsec VPN 变体,它使用 Level 2 Tunneling Protocol(L2TP),被称为 L2TP/IPsec VPN,它需要 optional 软件仓库提供的 xl2tpd 软件包。

libreswan 是一个开源用户空间 IKE 实现。IKE v1 和 v2 作为用户级别的守护进程实现。IKE 协议也加密。IPsec 协议由 Linux 内核实现,Libreswan 配置内核以添加和删除 VPN 隧道配置。

IKE 协议使用 UDP 端口 500 和 4500。IPsec 协议由两个协议组成:

  • 封装安全性 Payload(ESP),其协议号为 50。
  • 经过身份验证的标头(AH),其协议号为 51。

不建议使用 AH 协议。建议将 AH 用户迁移到使用 null 加密的 ESP。

IPsec 协议提供两种操作模式:

  • 隧道模式(默认)
  • 传输模式。

您可以用没有 IKE 的 IPsec 来配置内核。这称为 手动键控。您还可以使用 ip xfrm 命令来配置手动密钥,但为了安全起见,强烈建议您不要这样做。Libreswan 使用 Netlink 接口与 Linux 内核进行通信。内核执行数据包加密和解密。

Libreswan 使用网络安全服务 (NSS) 加密库。NSS 认证用于 联邦信息处理标准( FIPS)出版物 140-2。

重要

IKE/IPsec VPN(由 Libreswan 和 Linux 内核实现)是 RHEL 中推荐的唯一 VPN 技术。在不了解这样做风险的情况下不要使用任何其他 VPN 技术。

在 RHEL 中,Libreswan 默认遵循系统范围的加密策略。这样可确保 Libreswan 将当前威胁模型包括(IKEv2)的安全设置用作默认协议。如需更多信息,请参阅 使用系统范围的加密策略

Libreswan 没有使用术语"源(source)"和"目的地(destination)"或"服务器(server)"和"客户端(client)",因为 IKE/IPsec 使用对等(peer to peer)协议。相反,它使用术语"左"和"右"来指端点(主机)。这也允许您在大多数情况下在两个端点使用相同的配置。但是,管理员通常选择始终对本地主机使用"左",对远程主机使用"右"。

leftidrightid 选项充当身份验证过程中相应主机的标识。详情请查看 ipsec.conf(5) 手册页。

7.2. Libreswan 中的身份验证方法

Libreswan 支持多种身份验证方法,每种方法适合不同的场景。

预共享密钥(PSK)

预共享密钥 (PSK)是最简单的身份验证方法。出于安全考虑,请勿使用小于 64 个随机字符的 PSK。在 FIPS 模式中,PSK 必须符合最低强度要求,具体取决于所使用的完整性算法。您可以使用 authby=secret 连接来设置 PSK。

原始 RSA 密钥

原始 RSA 密钥 通常用于静态主机到主机或子网到子网 IPsec 配置。每个主机都使用所有其他主机的公共 RSA 密钥手动配置,Libreswan 在每对主机之间建立 IPsec 隧道。对于大量主机,这个方法不能很好地扩展。

您可以使用 ipsec newhostkey 命令在主机上生成原始 RSA 密钥。您可以使用 ipsec showhostkey 命令列出生成的密钥。使用 CKA ID 密钥的连接配置需要 leftrsasigkey= 行。原始 RSA 密钥使用 authby=rsasig 连接选项。

X.509 证书

X.509 证书 通常用于大规模部署连接到通用 IPsec 网关的主机。中心 证书颁发机构 (CA)为主机或用户签署 RSA 证书。此中央 CA 负责中继信任,包括单个主机或用户的撤销。

例如,您可以使用 openssl 命令和 NSS certutil 命令来生成 X.509 证书。因为 Libreswan 使用 leftcert= 配置选项中证书的昵称从 NSS 数据库读取用户证书,所以在创建证书时请提供昵称。

如果使用自定义 CA 证书,则必须将其导入到网络安全服务(NSS)数据库中。您可以使用 ipsec import 命令将 PKCS #12 格式的任何证书导入到 Libreswan NSS 数据库。

警告

Libreswan 需要互联网密钥交换(IKE)对等 ID 作为每个对等证书的主题替代名称(SAN),如 RFC 4945 的 3.1 章节 所述。通过更改 require-id-on-certificated= 选项禁用此检查可能会导致系统容易受到中间人攻击。

使用 authby=rsasig 连接选项,根据使用带 SHA-2 的 RSA 的 X.509 证书进行身份验证。您可以进一步对它进行限制,对于 ECDSA 数字签名使用 SHA-2(将 authby= 设置为 ecdsa),以及基于 RSA Probabilistic Signature Scheme (RSASSA-PSS) 数据签名的验证使用 SHA-2(authby=rsa-sha2)。默认值为 authby=rsasig,ecdsa

证书和 authby= 签名方法应匹配。这提高了互操作性,并在一个数字签名系统中保留身份验证。

NULL 身份验证

NULL 身份验证 用来在没有身份验证的情况下获得网状加密。它可防止被动攻击,但不能防止主动攻击。但是,因为 IKEv2 允许非对称身份验证方法,因此 NULL 身份验证也可用于互联网规模的机会主义 IPsec。在此模型中,客户端对服务器进行身份验证,但服务器不对客户端进行身份验证。此模型类似于使用 TLS 的安全网站。使用 authby=null 进行 NULL 身份验证。

保护量子计算机

除了上述身份验证方法外,您还可以使用 Post-quantum Pre-shared Key (PPK)方法来防止量子计算机可能的攻击。单个客户端或客户端组可以通过指定与带外配置的预共享密钥对应的 PPK ID 来使用它们自己的 PPK。

使用带有预共享密钥的 IKEv1 防止量子攻击者。重新设计 IKEv2 不会原生提供这种保护。Libreswan 提供使用 Post-quantum Pre-shared Key (PPK)来保护 IKEv2 连接免受量子攻击。

要启用可选的 PPK 支持,请在连接定义中添加 ppk=yes。如需要 PPK,请添加 ppk=insist。然后,可以给每个客户端一个带有 secret 值的 PPK ID ,该 secret 值在带外进行通信(最好是量子安全的)。PPK 应该具有很强的随机性,而不是基于字典中的单词。PPK ID 和 PPK 数据保存在 ipsec.secrets 文件中,例如:

@west @east : PPKS "user1" "thestringismeanttobearandomstr"

PPKS 选项指的是静态 PPK。这个实验性功能使用基于一次性平板的动态 PPK。在每个连接中,一次性平板的一个新部件用作 PPK。当使用时,文件中动态 PPK 的那部分被零覆盖,以防止重复使用。如果没有剩下一次性资源,连接会失败。详情请查看 ipsec.secrets(5) 手册页。

警告

动态 PPK 的实现是作为不受支持的技术预览提供的。请谨慎使用。

7.3. 安装 Libreswan

在通过 Libreswan IPsec/IKE 实现设置 VPN 之前,您必须安装相应的软件包,启动 ipsec 服务,并在防火墙中允许服务。

先决条件

  • AppStream存储库已启用。

流程

  1. 安装 libreswan 软件包:

    # dnf install libreswan
  2. 如果要重新安装 Libreswan,请删除其旧的数据库文件,并创建一个新的数据库:

    # systemctl stop ipsec
    # rm /var/lib/ipsec/nss/*db
    # ipsec initnss
  3. 启动 ipsec 服务,并启用该服务,以便其在引导时自动启动:

    # systemctl enable ipsec --now
  4. 通过添加 ipsec 服务,将防火墙配置为允许 IKE、ESP 和 AH 协议的 500 和 4500/UDP 端口:

    # firewall-cmd --add-service="ipsec"
    # firewall-cmd --runtime-to-permanent

7.4. 创建主机到主机的 VPN

您可以使用原始 RSA 密钥身份验证将 Libreswan 配置为在两个称为 leftright 的主机之间创建主机到主机的 IPsec VPN。

前提条件

  • Libreswan 已安装 ,并在每个节点上启动了 ipsec 服务。

流程

  1. 在每台主机上生成原始 RSA 密钥对:

    # ipsec newhostkey
  2. 上一步返回生成的密钥的 ckaid。在 主机上使用 ckaid 和以下命令,例如:

    # ipsec showhostkey --left --ckaid 2d3ea57b61c9419dfd6cf43a1eb6cb306c0e857d

    上一命令的输出生成了配置所需的 leftrsasigkey= 行。在第二台主机()上执行相同的操作:

    # ipsec showhostkey --right --ckaid a9e1f6ce9ecd3608c24e8f701318383f41798f03
  3. /etc/ipsec.d/ 目录中,创建一个新的 my_host-to-host.conf 文件。将上一步中 ipsec showhostkey 命令的输出中的 RSA 主机密钥写入新文件。例如:

    conn mytunnel
        leftid=@west
        left=192.1.2.23
        leftrsasigkey=0sAQOrlo+hOafUZDlCQmXFrje/oZm [...] W2n417C/4urYHQkCvuIQ==
        rightid=@east
        right=192.1.2.45
        rightrsasigkey=0sAQO3fwC6nSSGgt64DWiYZzuHbc4 [...] D/v8t5YTQ==
        authby=rsasig
  4. 导入密钥后,重启 ipsec 服务:

    # systemctl restart ipsec
  5. 加载连接:

    # ipsec auto --add mytunnel
  6. 建立隧道:

    # ipsec auto --up mytunnel
  7. 要在 ipsec 服务启动时自动启动隧道,请在连接定义中添加以下行:

    auto=start

7.5. 配置站点到站点的 VPN

要创建站点到站点的 IPsec VPN,通过加入两个网络,在两个主机之间创建一个 IPsec 隧道。主机因此充当端点,它们配置为允许来自一个或多个子网的流量通过。因此您可以将主机视为到网络远程部分的网关。

站点到站点 VPN 的配置只能与主机到主机 VPN 不同,同时必须在配置文件中指定一个或多个网络或子网。

前提条件

流程

  1. 将带有主机到主机 VPN 配置的文件复制到新文件中,例如:

    # cp /etc/ipsec.d/my_host-to-host.conf /etc/ipsec.d/my_site-to-site.conf
  2. 在上一步创建的文件中添加子网配置,例如:

    conn mysubnet
         also=mytunnel
         leftsubnet=192.0.1.0/24
         rightsubnet=192.0.2.0/24
         auto=start
    
    conn mysubnet6
         also=mytunnel
         leftsubnet=2001:db8:0:1::/64
         rightsubnet=2001:db8:0:2::/64
         auto=start
    
    # the following part of the configuration file is the same for both host-to-host and site-to-site connections:
    
    conn mytunnel
        leftid=@west
        left=192.1.2.23
        leftrsasigkey=0sAQOrlo+hOafUZDlCQmXFrje/oZm [...] W2n417C/4urYHQkCvuIQ==
        rightid=@east
        right=192.1.2.45
        rightrsasigkey=0sAQO3fwC6nSSGgt64DWiYZzuHbc4 [...] D/v8t5YTQ==
        authby=rsasig

7.6. 配置远程访问 VPN

公路勇士是指拥有移动客户端和动态分配的 IP 地址的旅行用户。移动客户端使用 X.509 证书进行身份验证。

以下示例显示了 IKEv2 的配置,并且避免使用 IKEv1 XAUTH 协议。

在服务器中:

conn roadwarriors
    ikev2=insist
    # support (roaming) MOBIKE clients (RFC 4555)
    mobike=yes
    fragmentation=yes
    left=1.2.3.4
    # if access to the LAN is given, enable this, otherwise use 0.0.0.0/0
    # leftsubnet=10.10.0.0/16
    leftsubnet=0.0.0.0/0
    leftcert=gw.example.com
    leftid=%fromcert
    leftxauthserver=yes
    leftmodecfgserver=yes
    right=%any
    # trust our own Certificate Agency
    rightca=%same
    # pick an IP address pool to assign to remote users
    # 100.64.0.0/16 prevents RFC1918 clashes when remote users are behind NAT
    rightaddresspool=100.64.13.100-100.64.13.254
    # if you want remote clients to use some local DNS zones and servers
    modecfgdns="1.2.3.4, 5.6.7.8"
    modecfgdomains="internal.company.com, corp"
    rightxauthclient=yes
    rightmodecfgclient=yes
    authby=rsasig
    # optionally, run the client X.509 ID through pam to allow or deny client
    # pam-authorize=yes
    # load connection, do not initiate
    auto=add
    # kill vanished roadwarriors
    dpddelay=1m
    dpdtimeout=5m
    dpdaction=clear

在移动客户端(即 road warrior 的设备)上,使用与之前配置稍有不同的配置:

conn to-vpn-server
    ikev2=insist
    # pick up our dynamic IP
    left=%defaultroute
    leftsubnet=0.0.0.0/0
    leftcert=myname.example.com
    leftid=%fromcert
    leftmodecfgclient=yes
    # right can also be a DNS hostname
    right=1.2.3.4
    # if access to the remote LAN is required, enable this, otherwise use 0.0.0.0/0
    # rightsubnet=10.10.0.0/16
    rightsubnet=0.0.0.0/0
    fragmentation=yes
    # trust our own Certificate Agency
    rightca=%same
    authby=rsasig
    # allow narrowing to the server’s suggested assigned IP and remote subnet
    narrowing=yes
    # support (roaming) MOBIKE clients (RFC 4555)
    mobike=yes
    # initiate connection
    auto=start

7.7. 配置网格 VPN

网格 VPN 网络(也称为 any-to-any VPN ) 是一个所有节点都使用 IPsec 进行通信的网络。该配置可以对于无法使用 IPsec 的节点进行例外处理。可使用两种方式配置网格 VPN 网络:

  • 需要 IPsec。
  • 首选 IPsec,但允许回退到使用明文通信。

节点之间的身份验证可以基于 X.509 证书或 DNS 安全扩展(DNSSEC)。

您对 opportunistic IPsec 使用任何常规的 IKEv2 验证方法,因为这些连接是常规的 Libreswan 配置,除了由 right=%opportunisticgroup 条目定义的 opportunistic IPsec 之外。常见的身份验证方法是主机使用常用共享认证机构(CA)根据 X.509 证书进行互相验证。作为标准流程的一部分,云部署通常为云中的每个节点发布证书。

重要

不要使用 PreSharedKey (PSK)身份验证,因为一个被泄露的主机也会导致组 PSK secret 被泄露。

您可以使用 NULL 身份验证在节点间部署加密,而无需认证,这只防止被动攻击者。

以下流程使用 X.509 证书。您可以使用任何类型的 CA 管理系统(如 Dogtag 证书系统)生成这些证书。Dogtag 假设每个节点的证书都以 PKCS #12 格式(.p12 文件)提供,其包含私钥、节点证书和用于验证其他节点的 X.509 证书的 Root CA 证书。

每个节点的配置与其 X.509 证书不同。这允许在不重新配置网络中的任何现有节点的情况下添加新节点。PKCS #12 文件需要一个"友好名称",为此,我们使用名称"节点",这样引用友好名称的配置文件对所有节点都是相同的。

先决条件

  • Libreswan 已安装 ,并在每个节点上启动了 ipsec 服务。
  • 一个新的 NSS 数据库已初始化。

    1. 如果您已经有一个旧的 NSS 数据库,请删除旧的数据库文件:

      # systemctl stop ipsec
      # rm /var/lib/ipsec/nss/*db
    2. 您可以使用以下命令初始化新数据库:

      # ipsec initnss

步骤

  1. 在每个节点中导入 PKCS #12 文件。此步骤需要用于生成 PKCS #12 文件的密码:

    # ipsec import nodeXXX.p12
  2. IPsec 需要的(专用)、IPsec 可选的 (private-or-clear)和 No IPsec (clear)配置文件创建以下三个连接定义:

    # cat /etc/ipsec.d/mesh.conf
    conn clear
    	auto=ondemand 1
    	type=passthrough
    	authby=never
    	left=%defaultroute
    	right=%group
    
    conn private
    	auto=ondemand
    	type=transport
    	authby=rsasig
    	failureshunt=drop
    	negotiationshunt=drop
    	ikev2=insist
    	left=%defaultroute
    	leftcert=nodeXXXX
    	leftid=%fromcert 2
    	rightid=%fromcert
    	right=%opportunisticgroup
    
    conn private-or-clear
    	auto=ondemand
    	type=transport
    	authby=rsasig
    	failureshunt=passthrough
    	negotiationshunt=passthrough
    	# left
    	left=%defaultroute
    	leftcert=nodeXXXX 3
    	leftid=%fromcert
    	leftrsasigkey=%cert
    	# right
    	rightrsasigkey=%cert
    	rightid=%fromcert
    	right=%opportunisticgroup
1
auto 变量有几个选项:

您可以使用带有 opportunistic IPsec 的 ondemand 连接选项来启动 IPsec 连接,或者用于显式配置不需要一直激活的连接。这个选项在内核中建立一个陷阱 XFRM 策略,使 IPsec 连接在收到与该策略匹配的第一个数据包时开始。

您可以使用以下选项有效地配置和管理 IPsec 连接,无论是使用 Opportunistic IPsec 还是明确配置的连接:

add 选项
加载连接配置,并为响应远程启动做好准备。但是,连接不会自动从本地端启动。您可以使用 ipsec auto --up 命令手动启动 IPsec 连接。
start 选项
加载连接配置,并为响应远程启动做好准备。此外,它会立即启动到远程对等点的连接。您可以将这个选项用于永久的和一直活跃的连接。
2
leftidrightid 变量标识 IPsec 隧道连接的右和左通道。如果您配置了证书,您可以使用这些变量来获取本地 IP 地址或本地证书的主题 DN 的值。
3
leftcert 变量定义您要使用的 NSS 数据库的昵称。
  1. 将网络的 IP 地址添加到对应的类中。例如,如果所有节点都位于 10.15.0.0/16 网络中,则所有节点都必须使用 IPsec 加密:

    # echo "10.15.0.0/16" >> /etc/ipsec.d/policies/private
  2. 要允许某些节点(如 10.15.34.0/24 )使用或不使用 IPsec,请将这些节点添加到 private-or-clear 组中:

    # echo "10.15.34.0/24" >> /etc/ipsec.d/policies/private-or-clear
  3. 要将一个不具有 IPsec 的主机(如 10.15.1.2 )定义到 clear 组,请使用:

    # echo "10.15.1.2/32" >> /etc/ipsec.d/policies/clear

    您可以通过模板为每个新节点在 /etc/ipsec.d/policies 目录中创建文件,或者使用 Puppet 或 Ansible 来提供它们。

    请注意,每个节点都有相同的异常列表或不同的流量预期。因此,两个节点可能无法通信,因为一个节点需要 IPsec,而另一个节点无法使用 IPsec。

  4. 重启节点将其添加到配置的网格中:

    # systemctl restart ipsec

验证

  1. 使用 ping 命令打开 IPsec 隧道:

    # ping <nodeYYY>
  2. 显示带有导入认证的 NSS 数据库:

    # certutil -L -d sql:/etc/ipsec.d
    
    Certificate Nickname    Trust Attributes
                            SSL,S/MIME,JAR/XPI
    
    west                    u,u,u
    ca                      CT,,
  3. 查看节点上打开了哪个隧道:

    # ipsec trafficstatus
    006 #2: "private#10.15.0.0/16"[1] ...<nodeYYY>, type=ESP, add_time=1691399301, inBytes=512, outBytes=512, maxBytes=2^63B, id='C=US, ST=NC, O=Example Organization, CN=east'

其他资源

7.8. 部署 FIPS 兼容 IPsec VPN

您可以使用 Libreswan 部署符合 FIPS 的 IPsec VPN 解决方案。为此,您可以识别哪些加密算法可用,且在 FIPS 模式下,哪些算法对 Libreswan 禁用了。

先决条件

  • AppStream存储库已启用。

流程

  1. 安装 libreswan 软件包:

    # dnf install libreswan
  2. 如果您要重新安装 Libreswan,请删除其旧的 NSS 数据库:

    # systemctl stop ipsec
    
    # rm /var/lib/ipsec/nss/*db
  3. 启动 ipsec 服务,并启用该服务,以便其在引导时自动启动:

    # systemctl enable ipsec --now
  4. 通过添加 ipsec 服务,将防火墙配置为允许 IKE、ESP 的 5004500 UDP 端口,以及 AH 协议:

    # firewall-cmd --add-service="ipsec"
    # firewall-cmd --runtime-to-permanent
  5. 将系统切换到 FIPS 模式:

    # fips-mode-setup --enable
  6. 重启您的系统以允许内核切换到 FIPS 模式:

    # reboot

验证

  1. 确认 Libreswan 在 FIPS 模式下运行:

    # ipsec whack --fipsstatus
    000 FIPS mode enabled
  2. 或者,检查 systemd 日志中的 ipsec 单元条目:

    $ journalctl -u ipsec
    ...
    Jan 22 11:26:50 localhost.localdomain pluto[3076]: FIPS Mode: YES
  3. 以 FIPS 模式查看可用算法:

    # ipsec pluto --selftest 2>&1 | head -6
    Initializing NSS using read-write database "sql:/var/lib/ipsec/nss"
    FIPS Mode: YES
    NSS crypto library initialized
    FIPS mode enabled for pluto daemon
    NSS library is running in FIPS mode
    FIPS HMAC integrity support [disabled]
  4. 使用 FIPS 模式查询禁用的算法:

    # ipsec pluto --selftest 2>&1 | grep disabled
    Encryption algorithm CAMELLIA_CTR disabled; not FIPS compliant
    Encryption algorithm CAMELLIA_CBC disabled; not FIPS compliant
    Encryption algorithm NULL disabled; not FIPS compliant
    Encryption algorithm CHACHA20_POLY1305 disabled; not FIPS compliant
    Hash algorithm MD5 disabled; not FIPS compliant
    PRF algorithm HMAC_MD5 disabled; not FIPS compliant
    PRF algorithm AES_XCBC disabled; not FIPS compliant
    Integrity algorithm HMAC_MD5_96 disabled; not FIPS compliant
    Integrity algorithm HMAC_SHA2_256_TRUNCBUG disabled; not FIPS compliant
    Integrity algorithm AES_XCBC_96 disabled; not FIPS compliant
    DH algorithm MODP1536 disabled; not FIPS compliant
    DH algorithm DH31 disabled; not FIPS compliant
  5. 在 FIPS 模式中列出所有允许的算法和密码:

    # ipsec pluto --selftest 2>&1 | grep ESP | grep FIPS | sed "s/^.*FIPS//"
    aes_ccm, aes_ccm_c
    aes_ccm_b
    aes_ccm_a
    NSS(CBC)  3des
    NSS(GCM)  aes_gcm, aes_gcm_c
    NSS(GCM)  aes_gcm_b
    NSS(GCM)  aes_gcm_a
    NSS(CTR)  aesctr
    NSS(CBC)  aes
    aes_gmac
    NSS       sha, sha1, sha1_96, hmac_sha1
    NSS       sha512, sha2_512, sha2_512_256, hmac_sha2_512
    NSS       sha384, sha2_384, sha2_384_192, hmac_sha2_384
    NSS       sha2, sha256, sha2_256, sha2_256_128, hmac_sha2_256
    aes_cmac
    null
    NSS(MODP) null, dh0
    NSS(MODP) dh14
    NSS(MODP) dh15
    NSS(MODP) dh16
    NSS(MODP) dh17
    NSS(MODP) dh18
    NSS(ECP)  ecp_256, ecp256
    NSS(ECP)  ecp_384, ecp384
    NSS(ECP)  ecp_521, ecp521

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

默认情况下,IPsec 服务在第一次启动时使用空密码创建其网络安全服务(NSS)数据库。要提高安全性,您可以添加密码保护。

先决条件

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

流程

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

    # certutil -N -d sql:/var/lib/ipsec/nss
    Enter Password or Pin for "NSS Certificate DB":
    Enter a password which will be used to encrypt your keys.
    The password should be at least 8 characters long,
    and should contain at least one non-alphabetic character.
    
    Enter new password:
  2. 创建 /etc/ipsec.d/nsspassword 文件,其包含您在之前步骤中设置的密码,例如:

    # cat /etc/ipsec.d/nsspassword
    NSS Certificate DB:_<password>_

    nsspassword 文件使用以下语法:

    <token_1>:<password1>
    <token_2>:<password2>

    默认的 NSS 软件令牌是 NSS 证书 数据库。如果您的系统以 FIPS 模式运行,则令牌的名称为 NSS FIPS 140-2 证书数据库

  3. 根据您的场景,在完成了 nsspassword 文件后,启动或重启 ipsec 服务:

    # systemctl restart ipsec

验证

  1. 在其 NSS 数据库中添加非空密码后,检查 ipsec 服务是否运行:

    # systemctl status ipsec
    ● ipsec.service - Internet Key Exchange (IKE) Protocol Daemon for IPsec
       Loaded: loaded (/usr/lib/systemd/system/ipsec.service; enabled; vendor preset: disable>
       Active: active (running)...

验证

  • 检查 Journal 日志是否包含确认成功初始化的条目:

    # journalctl -u ipsec
    ...
    pluto[6214]: Initializing NSS using read-write database "sql:/var/lib/ipsec/nss"
    pluto[6214]: NSS Password from file "/etc/ipsec.d/nsspassword" for token "NSS Certificate DB" with length 20 passed to NSS
    pluto[6214]: NSS crypto library initialized
    ...

其他资源

7.10. 配置 IPsec VPN 以使用 TCP

Libreswan 支持 IKE 和 IPsec 数据包的 TCP 封装,如 RFC 8229 所述。有了这个功能,您可以在网络上建立 IPsec VPN,以防止通过 UDP 和封装安全负载(ESP)传输的流量。您可以将 VPN 服务器和客户端配置为使用 TCP 作为回退,或者作为主 VPN 传输协议。由于 TCP 封装的性能成本较高,因此只有在您的场景中需要永久阻止 UDP 时,才使用 TCP 作为主 VPN 协议。

先决条件

流程

  1. /etc/ipsec.conf 文件的 config setup 部分中添加以下选项:

    listen-tcp=yes
  2. 要在第一次尝试 UDP 失败时使用 TCP 封装作为回退选项,请在客户端的连接定义中添加以下两个选项:

    enable-tcp=fallback
    tcp-remoteport=4500

    另外,如果您知道 UDP 会被永久阻止,请在客户端的连接配置中使用以下选项:

    enable-tcp=yes
    tcp-remoteport=4500

7.11. 配置自动检测和使用 ESP 硬件卸载来加速 IPsec 连接

卸载硬件的封装安全负载(ESP)来加速以太网上的 IPsec 连接。默认情况下,Libreswan 会检测硬件是否支持这个功能,并因此启用 ESP 硬件卸载。如果这个功能被禁用了或明确启用了,您可以切回到自动检测。

前提条件

  • 网卡支持 ESP 硬件卸载。
  • 网络驱动程序支持 ESP 硬件卸载。
  • IPsec 连接已配置且可以正常工作。

流程

  1. 编辑应使用 ESP 硬件卸载支持的自动检测连接的 /etc/ipsec.d/ 目录中的 Libreswan 配置文件。
  2. 确保 nic-offload 参数没有在连接的设置中设置。
  3. 如果您删除了 nic-offload,请重启 ipsec 服务:

    # systemctl restart ipsec

验证

  1. 显示 IPsec 连接使用的以太网设备的 tx_ipsecrx_ipsec 计数器:

    # ethtool -S enp1s0 | egrep "_ipsec"
         tx_ipsec: 10
         rx_ipsec: 10
  2. 通过 IPsec 隧道发送流量。例如,ping 远程 IP 地址:

    # ping -c 5 remote_ip_address
  3. 再次显示以太网设备的 tx_ipsecrx_ipsec 计数器:

    # ethtool -S enp1s0 | egrep "_ipsec"
         tx_ipsec: 15
         rx_ipsec: 15

    如果计数器值增加了,ESP 硬件卸载正常工作。

7.12. 在绑定中配置 ESP 硬件卸载以加快 IPsec 连接

将封装安全负载(ESP)卸载到硬件可加速 IPsec 连接。如果出于故障转移原因而使用网络绑定,配置 ESP 硬件卸载的要求和流程与使用常规以太网设备的要求和流程不同。例如,在这种情况下,您可以对绑定启用卸载支持,内核会将设置应用到绑定的端口。

先决条件

  • 绑定中的所有网卡都支持 ESP 硬件卸载。使用 ethtool -k & lt;interface_name > | grep "esp-hw-offload" 命令来验证每个绑定端口是否支持此功能。
  • 绑定已配置且可以正常工作。
  • 该绑定使用 active-backup 模式。绑定驱动程序不支持此功能的任何其他模式。
  • IPsec 连接已配置且可以正常工作。

步骤

  1. 对网络绑定启用 ESP 硬件卸载支持:

    # nmcli connection modify bond0 ethtool.feature-esp-hw-offload on

    这个命令在对 bond0 连接启用 ESP 硬件卸载支持。

  2. 重新激活 bond0 连接:

    # nmcli connection up bond0
  3. 编辑应使用 ESP 硬件卸载的连接的 /etc/ipsec.d/ 目录中的 Libreswan 配置文件,并将 nic-offload=yes 语句附加到连接条目:

    conn example
        ...
        nic-offload=yes
  4. 重启 ipsec 服务:

    # systemctl restart ipsec

验证

验证方法取决于各种方面,如内核版本和驱动程序。例如,某些驱动程序提供计数器,但它们的名称可能会有所不同。详情请查看您的网络驱动程序文档。

以下验证步骤适用于 Red Hat Enterprise Linux 9 中的 ixgbe 驱动程序:

  1. 显示绑定的活动端口:

    # grep "Currently Active Slave" /proc/net/bonding/bond0
    Currently Active Slave: enp1s0
  2. 显示活动端口的 tx_ipsecrx_ipsec 计数器:

    # ethtool -S enp1s0 | egrep "_ipsec"
         tx_ipsec: 10
         rx_ipsec: 10
  3. 通过 IPsec 隧道发送流量。例如,ping 远程 IP 地址:

    # ping -c 5 remote_ip_address
  4. 再次显示活动端口的 tx_ipsecrx_ipsec 计数器:

    # ethtool -S enp1s0 | egrep "_ipsec"
         tx_ipsec: 15
         rx_ipsec: 15

    如果计数器值增加了,ESP 硬件卸载正常工作。

7.13. 使用 RHEL 系统角色配置带有 IPsec 的 VPN 连接

使用 vpn 系统角色,您可以使用 Red Hat Ansible Automation Platform 在 RHEL 系统上配置 VPN 连接。您可以使用它来设置主机到主机、网络到网络、VPN 远程访问服务器和网格配置。

对于主机到主机连接,角色使用默认参数在 vpn_connections 列表中的每一对主机之间设置 VPN 通道,包括根据需要生成密钥。另外,您还可以将其配置为在列出的所有主机之间创建 机会主义网格配置。该角色假定 hosts 下的主机名称与 Ansible 清单中使用的主机的名称相同,并且您可以使用这些名称来配置通道。

注意

vpn RHEL 系统角色目前仅支持 Libreswan (其是一种 IPsec 实现)作为 VPN 提供者。

7.13.1. 使用 vpn RHEL 系统角色,创建具有 IPsec 的主机到主机的 VPN

您可以通过在控制节点上运行 Ansible playbook 来使用 vpn 系统角色配置主机到主机的连接,这将配置清单文件中列出的所有受管节点。

先决条件

流程

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

    - name: Host to host VPN
      hosts: managed-node-01.example.com, managed-node-02.example.com
      roles:
        - rhel-system-roles.vpn
      vars:
        vpn_connections:
          - hosts:
              managed-node-01.example.com:
              managed-node-02.example.com:
        vpn_manage_firewall: true
        vpn_manage_selinux: true

    此 playbook 通过使用系统角色自动生成的密钥和预共享的密钥身份验证来配置连接 managed-node-01.example.com-to-managed-node-02.example.com。因为 vpn_manage_firewallvpn_manage_selinux 都被设为 true,因此 vpn 角色使用 firewallselinux 角色来管理 vpn 角色使用的端口。

    要配置从受管主机到清单文件中未列出的外部主机的连接,请将以下部分添加到主机的 vpn_connections 列表中:

        vpn_connections:
          - hosts:
              managed-node-01.example.com:
              <external_node>:
                hostname: <IP_address_or_hostname>

    这将配置一个额外的连接:managed-node-01.example.com-to-<external_node>

    注意

    连接仅在受管节点上配置,而不在外部节点上配置。

  2. 可选:您可以使用 vpn_connections 中的其它部分为受管节点指定多个 VPN 连接,如 control plane 和 data plane :

    - name: Multiple VPN
      hosts: managed-node-01.example.com, managed-node-02.example.com
      roles:
        - rhel-system-roles.vpn
      vars:
        vpn_connections:
          - name: control_plane_vpn
            hosts:
              managed-node-01.example.com:
                hostname: 192.0.2.0 # IP for the control plane
              managed-node-02.example.com:
                hostname: 192.0.2.1
          - name: data_plane_vpn
            hosts:
              managed-node-01.example.com:
                hostname: 10.0.0.1 # IP for the data plane
              managed-node-02.example.com:
                hostname: 10.0.0.2
  3. 验证 playbook 语法:

    $ ansible-playbook --syntax-check ~/playbook.yml

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

  4. 运行 playbook:

    $ ansible-playbook ~/playbook.yml

验证

  1. 在受管节点上,确认连接已成功载入:

    # ipsec status | grep <connection_name>

    <connection_name> 替换为来自此节点的连接的名称,例如 managed_node1-to-managed_node2

    注意

    默认情况下,从每个系统的角度来看,角色为其创建的每个连接生成一个描述性名称。例如,当在 managed_node1managed_node2 之间创建连接时,此连接在 managed_node1 上的描述性名称为 managed_node1-to-managed_node2,但在 managed_node2 上,连接的描述性名称为 managed_node2-to-managed_node1

  2. 在受管节点上,确认连接是否成功启动:

    # ipsec trafficstatus | grep <connection_name>
  3. 可选:如果连接没有成功加载,请输入以下命令来手动添加连接。这提供了更具体的信息,表示连接为何未能建立:

    # ipsec auto --add <connection_name>
    注意

    在加载和启动连接过程中可能出现的任何错误都在 /var/log/pluto.log 文件中报告。由于这些日志很难解析,因此请手动添加连接,以便从标准输出中获取日志消息。

其他资源

  • /usr/share/ansible/roles/rhel-system-roles.vpn/README.md 文件
  • /usr/share/doc/rhel-system-roles/vpn/ 目录

7.13.2. 使用 vpn RHEL 系统角色创建带有 IPsec 的机会性网状 VPN 连接

您可以使用 vpn 系统角色来配置机会性网状 VPN 连接,该连接通过在控制节点上运行 Ansible playbook 来使用证书进行身份验证,这将配置清单文件中列出的所有受管节点。

先决条件

  • 您已准备好控制节点和受管节点
  • 以可在受管主机上运行 playbook 的用户登录到控制节点。
  • 用于连接到受管节点的帐户对其具有 sudo 权限。
  • /etc/ipsec.d/ 目录中的 IPsec 网络安全服务(NSS)加密库包含必要的证书。

流程

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

    - name: Mesh VPN
      hosts: managed-node-01.example.com, managed-node-02.example.com, managed-node-03.example.com
      roles:
        - rhel-system-roles.vpn
      vars:
        vpn_connections:
          - opportunistic: true
            auth_method: cert
            policies:
              - policy: private
                cidr: default
              - policy: private-or-clear
                cidr: 198.51.100.0/24
              - policy: private
                cidr: 192.0.2.0/24
              - policy: clear
                cidr: 192.0.2.7/32
        vpn_manage_firewall: true
        vpn_manage_selinux: true

    通过在 playbook 中定义 auth_method: cert 参数来配置用证书进行身份验证。默认情况下,节点名称用作证书的昵称。在本例中,这是 managed-node-01.example.com。您可以使用清单中的 cert_name 属性来定义不同的证书名称。

    在本例流程中,控制节点是您将运行 Ansible playbook 的系统,其与受管节点(192.0.2.0/24)和 IP 地址为 192.0.2.7 的节点共享同样的无类别域间路由(CIDR)号。因此,控制节点属于为 CIDR 192.0.2.0/24 自动创建的私有策略。

    为防止在操作期间出现 SSH 连接丢失,控制节点的清晰策略包含在策略列表中。请注意,在策略列表中还有一个项 CIDR 等于 default。这是因为此 playbook 覆盖了默认策略中的规则,以使其为私有,而非私有或清晰。

    因为 vpn_manage_firewallvpn_manage_selinux 都被设为 true,因此 vpn 角色使用 firewallselinux 角色来管理 vpn 角色使用的端口。

  2. 验证 playbook 语法:

    $ ansible-playbook --syntax-check ~/playbook.yml

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

  3. 运行 playbook:

    $ ansible-playbook ~/playbook.yml

其他资源

  • /usr/share/ansible/roles/rhel-system-roles.vpn/README.md 文件
  • /usr/share/doc/rhel-system-roles/vpn/ 目录

7.14. 配置选择不使用系统范围的加密策略的 IPsec 连接

为连接覆盖系统范围的加密策略

RHEL 系统范围的加密策略会创建一个名为 %default 的特殊连接。此连接包含 ikev2espike 选项的默认值。但是,您可以通过在连接配置文件中指定上述选项来覆盖默认值。

例如,以下配置允许使用带有 AES 和 SHA-1 或 SHA-2的 IKEv1 连接,以及带有 AES-GCM 或 AES-CBC 的 IPsec(ESP) 连接:

conn MyExample
  ...
  ikev2=never
  ike=aes-sha2,aes-sha1;modp2048
  esp=aes_gcm,aes-sha2,aes-sha1
  ...

请注意,AES-GCM 可用于 IPsec(ESP)和 IKEv2,但不适用于 IKEv1。

为所有连接禁用系统范围的加密策略

要禁用所有 IPsec 连接的系统范围的加密策略,请在 /etc/ipsec.conf 文件中注释掉以下行:

include /etc/crypto-policies/back-ends/libreswan.config

然后将 ikev2=never 选项添加到连接配置文件。

7.15. IPsec VPN 配置故障排除

与 IPsec VPN 配置相关的问题通常是由于几个主要原因造成的。如果您遇到此类问题,您可以检查问题的原因是否符合一下任何一种情况,并应用相应的解决方案。

基本连接故障排除

VPN 连接的大多数问题都发生在新部署中,管理员使用不匹配的配置选项配置了端点。此外,正常工作的配置可能会突然停止工作,通常是由于新引入的不兼容的值。这可能是管理员更改配置的结果。或者,管理员可能已安装了固件更新,或者使用某些选项的不同默认值(如加密算法)安装了软件包更新。

要确认已建立 IPsec VPN 连接:

# 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=100.64.13.5/32

如果输出为空或者没有显示具有连接名称的条目,则隧道将断开。

检查连接中的问题:

  1. 重新载入 vpn.example.com 连接:

    # ipsec auto --add vpn.example.com
    002 added connection description "vpn.example.com"
  2. 下一步,启动 VPN 连接:

    # ipsec auto --up vpn.example.com

与防火墙相关的问题

最常见的问题是,其中一个 IPsec 端点或端点之间路由器上的防火墙将所有互联网密钥交换(IKE)数据包丢弃。

  • 对于 IKEv2,类似以下示例的输出说明防火墙出现问题:

    # ipsec auto --up vpn.example.com
    181 "vpn.example.com"[1] 192.0.2.2 #15: initiating IKEv2 IKE SA
    181 "vpn.example.com"[1] 192.0.2.2 #15: STATE_PARENT_I1: sent v2I1, expected v2R1
    010 "vpn.example.com"[1] 192.0.2.2 #15: STATE_PARENT_I1: retransmission; will wait 0.5 seconds for response
    010 "vpn.example.com"[1] 192.0.2.2 #15: STATE_PARENT_I1: retransmission; will wait 1 seconds for response
    010 "vpn.example.com"[1] 192.0.2.2 #15: STATE_PARENT_I1: retransmission; will wait 2 seconds for
    ...
  • 对于 IKEv1,启动命令的输出如下:

    # ipsec auto --up vpn.example.com
    002 "vpn.example.com" #9: initiating Main Mode
    102 "vpn.example.com" #9: STATE_MAIN_I1: sent MI1, expecting MR1
    010 "vpn.example.com" #9: STATE_MAIN_I1: retransmission; will wait 0.5 seconds for response
    010 "vpn.example.com" #9: STATE_MAIN_I1: retransmission; will wait 1 seconds for response
    010 "vpn.example.com" #9: STATE_MAIN_I1: retransmission; will wait 2 seconds for response
    ...

由于用于设置 IPsec 的 IKE 协议已经加密,因此您只能使用 tcpdump 工具排除一小部分问题。如果防火墙丢弃了 IKE 或 IPsec 数据包,您可以尝试使用 tcpdump 工具来查找原因。但是,tcpdump 无法诊断 IPsec VPN 连接的其他问题。

  • 捕获eth0 接口上的 VPN 协商以及所有加密数据:

    # tcpdump -i eth0 -n -n esp or udp port 500 or udp port 4500 or tcp port 4500

不匹配的算法、协议和策略

VPN 连接要求端点具有匹配的 IKE 算法、IPsec 算法和 IP 地址范围。如果发生不匹配,连接会失败。如果您使用以下方法之一发现不匹配,请通过匹配算法、协议或策略来修复它。

  • 如果远程端点没有运行 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)]
    ...
  • 不匹配 IKE 算法示例:

    # 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
  • 不匹配 IPsec 算法示例:

    # 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

    不匹配的 IKE 版本还可导致远程端点在没有响应的情况下丢弃请求。这与丢弃所有 IKE 数据包的防火墙相同。

  • IKEv2 不匹配的 IP 地址范围示例(称为流量选择器 - TS):

    # 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
  • IKEv1 的不匹配 IP 地址范围示例:

    # 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
  • 当在 IKEv1 中使用预共享密钥(PSK)时,如果双方没有放入相同的 PSK ,则整个 IKE 信息将无法读取:

    # 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
  • 在 IKEv2 中,不匹配-PSK 错误会导致 AUTHENTICATION_FAILED 信息:

    # ipsec auto --up vpn.example.com
    ...
    002 "vpn.example.com" #1: IKE SA authentication request rejected by peer: AUTHENTICATION_FAILED

最大传输单元

除防火墙阻止 IKE 或 IPsec 数据包外,网络问题的最常见原因与加密数据包的数据包大小增加有关。网络硬件对于大于最大传输单元(MTU)的数据包进行分片处理,例如 1500 字节。通常,片会丢失,数据包无法重新组装。当使用小数据包的 ping 测试可以正常工作,但其他流量失败时,这会导致间歇性故障。在这种情况下,您可以建立一个 SSH 会话,但是一使用它,终端就会冻结,例如,在远程主机上输入 'ls -al /usr' 命令。

要临时解决这个问题,请通过将 mtu=1400 选项添加到隧道配置文件中来减小 MTU 大小。

另外,对于 TCP 连接,启用更改 MSS 值的 iptables 规则:

# iptables -I FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu

如果上一命令没有解决您场景中的问题,请在 set-mss 参数中直接指定较小的数值:

# iptables -I FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --set-mss 1380

网络地址转换(NAT)

当 IPsec 主机也充当 NAT 路由器时,可能会意外地重新映射数据包。以下示例配置演示了这个问题:

conn myvpn
    left=172.16.0.1
    leftsubnet=10.0.2.0/24
    right=172.16.0.2
    rightsubnet=192.168.0.0/16
…

地址为 172.16.0.1 的系统有一个 NAT 规则:

iptables -t nat -I POSTROUTING -o eth0 -j MASQUERADE

如果地址为 10.0.2.33 的系统将数据包发送到 192.168.0.1,那么路由器会在应用 IPsec 加密前将源 10.0.2.33 转换为 172.16.0.1。

然后,源地址为 10.0.2.33 的数据包不再与 conn myvpn 配置匹配, IPsec 不会加密此数据包。

要解决这个问题,请在路由器上插入目标 IPsec 子网范围不包含 NAT 的规则,例如:

iptables -t nat -I POSTROUTING -s 10.0.2.0/24 -d 192.168.0.0/16 -j RETURN

内核 IPsec 子系统错误

例如,当 bug 导致 IKE 用户空间和 IPsec 内核不同步时,内核 IPsec 子系统可能会失败。检查此问题:

$ cat /proc/net/xfrm_stat
XfrmInError                 0
XfrmInBufferError           0
...

上一命令输出中的任何非零值都表示有问题。如果您遇到这个问题,请开一个新的 支持问题单,并附上上一命令的输出与对应的 IKE 日志。

libreswan 日志

默认情况下,Libreswan 使用 syslog 协议的日志。您可以使用 journalctl 命令来查找与 IPsec 有关的日志条目。因为日志中相应的条目是由 pluto IKE 守护进程发送的,因此请搜索 "pluto" 关键字,例如:

$ journalctl -b | grep pluto

显示 ipsec 服务的实时日志:

$ journalctl -f -u ipsec

如果默认日志记录级别没有显示您的配置问题,请将 plutodebug=all 选项添加到 /etc/ipsec.conf 文件的 config setup 部分来启用调试日志。

请注意,调试日志记录会生成大量的条目,journaldsyslogd 服务的速率可能会抑制 syslog 消息。要确保您有完整的日志,请将日志记录重定向到文件中。编辑 /etc/ipsec.conf,并在 config setup 部分中添加 logfile=/var/log/pluto.log

其他资源

7.16. 使用 control-center 配置 VPN 连接

如果使用带有图形界面的 Red Hat Enterprise Linux ,您可以在 GNOME control-center 中配置 VPN 连接。

先决条件

  • 已安装 NetworkManager-libreswan-gnome 软件包。

步骤

  1. Super 键,输入 Settings,然后按 Enter 键打开 control-center 应用程序。
  2. 选择左侧的 Network 条目。
  3. + 图标。
  4. 选择 VPN
  5. 选择 Identity 菜单项来查看基本配置选项:

    General

    Gateway - 远程 VPN 网关的名称或 IP 地址。

    认证

    类型

    • IKEv2(Certificate)- 客户端通过证书进行身份验证。它更安全(默认)。
    • IKEv1(XAUTH) - 客户端通过用户名和密码或预共享密钥(PSK)进行身份验证。

      以下配置设置在 高级 部分中提供:

      图 7.1. VPN 连接的高级选项

      网络 vpn 高级选项
      警告

      当使用 gnome-control-center 应用程序配置基于 IPsec 的 VPN 连接时,高级 对话框会显示配置,但它不允许任何更改。因此,用户无法更改任何高级 IPsec 选项。使用 nm-connection-editornmcli 工具来配置高级属性。

      身份识别

    • - 如果需要,输入域名。

      安全性

    • Phase1 Algorithms - 对应于 ike Libreswan 参数 - 输入用来验证和设置加密频道的算法。
    • Phase2 Algorithms - 对应于 esp Libreswan 参数 - 输入用于 IPsec 协商的算法。

      选择 Disable PFS 字段来关闭 Perfect Forward Secrecy(PFS),以确保与不支持 PFS 的旧服务器兼容。

    • Phase1 Lifetime - 对应于 ikelifetime Libreswan 参数 - 用于加密流量的密钥的有效期。
    • Phase2 Lifetime - 对应于 salifetime Libreswan 参数 - 在过期前连接的特定实例应多久。

      注意:为了安全起见,加密密钥应该不时地更改。

    • Remote network - 对应于 rightsubnet Libreswan 参数 - 应该通过 VPN 访问的目标专用远程网络。

      检查 缩减 字段以启用缩小字段。请注意,它只在 IKEv2 协商中有效。

    • Enable fragmentation - 对应于 fragmentation Libreswan 参数 - 是否允许 IKE 分段。有效值为 yes (默认)或 no
    • Enable Mobike - 对应于 mobike Libreswan 参数 - 是否允许 Mobility and Multihoming Protocol(MOBIKE、RFC 4555)启用连接来迁移其端点,而无需从头开始重启连接。这可用于在有线、无线或者移动数据连接之间进行切换的移动设备。值为 no (默认)或 yes
  6. 选择 IPv4 菜单条目:

    IPv4 方法

    • Automatic (DHCP) - 如果您要连接的网络使用 DHCP 服务器来分配动态 IP 地址,请选择此选项。
    • Link-Local Only - 如果您要连接的网络没有 DHCP 服务器且您不想手动分配 IP 地址,请选择这个选项。随机地址将根据 RFC 3927 分配,带有前缀 169.254/16
    • 手动 - 如果您要手动分配 IP 地址,请选择这个选项。
    • Disable - 在这个连接中禁用 IPv4

      DNS

      DNS 部分,当 AutomaticON 时,将其切换到 OFF 以输入您要用逗号分开的 DNS 服务器的 IP 地址。

      Routes

      请注意,在 Routes 部分,当 AutomaticON 时,会使用 DHCP 的路由,但您也可以添加额外的静态路由。当 OFF 时,只使用静态路由。

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

      仅将此连接用于其网络上的资源

      选择这个复选框以防止连接成为默认路由。选择这个选项意味着只有特别用于路由的流量才会通过连接自动获得,或者手动输入到连接上。

  7. 要在 VPN 连接中配置 IPv6 设置,请选择 IPv6 菜单条目:

    IPv6 Method

    • Automatic - 选择这个选项使用 IPv6 Stateless Address AutoConfiguration(SLAAC)根据硬件地址和路由器公告(RA)创建自动的、无状态的配置。
    • Automatic, DHCP only - 选择这个选项以不使用 RA,但从 DHCPv6 请求信息以创建有状态的配置。
    • Link-Local Only - 如果您要连接的网络没有 DHCP 服务器且您不想手动分配 IP 地址,请选择这个选项。随机地址将根据 RFC 4862 分配,前缀为 FE80::0
    • 手动 - 如果您要手动分配 IP 地址,请选择这个选项。
    • Disable - 在这个连接中禁用 IPv6

      请注意,DNS, Routes, Use this connection only for resources on its network 项是 IPv4 的常规设置。

  8. 编辑完 VPN 连接后,点添加按钮自定义配置或应用按钮为现有配置保存它。
  9. 将配置集切换为 ON 以激活 VPN 连接。

其他资源

  • nm-settings-libreswan(5)

7.17. 使用 nm-connection-editor 配置 VPN 连接

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

先决条件

  • 已安装 NetworkManager-libreswan-gnome 软件包。
  • 如果您配置了互联网密钥交换版本 2(IKEv2)连接:

    • 证书导入到 IPsec 网络安全服务(NSS)数据库中。
    • NSS 数据库中的证书 nickname 是已知的。

流程

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

    $ nm-connection-editor
  2. 点击 + 按钮来添加一个新的连接。
  3. 选择 IPsec based VPN 连接类型,然后点击 Create
  4. VPN 选项卡中:

    1. Gateway 字段中输入 VPN 网关的主机名或 IP 地址,然后选择验证类型。根据验证类型,您必须输入不同的额外信息:

      • IKEv2(认证) 使用证书验证客户端,这会更安全。这个设置需要在 IPsec NSS 数据库中指定证书的 nickname
      • IKEv1(XAUTH) 使用用户名和密码(预共享密钥)验证用户身份。此设置要求您输入以下值:

        • 用户名
        • 密码
        • 组名称
        • Secret
    2. 如果远程服务器为 IKE 交换指定了本地标识符,在 Remote ID 字段中输入准确的字符串。在运行 Libreswan 的远程服务器中,这个值是在服务器的 leftid 参数中设置的。

      nm connection editor vpn tab

    3. 可选:点 Advanced 按钮来配置其它设置。您可以配置以下设置:

      • 身份识别

        • - 如果需要,请输入域名。
      • 安全性

        • Phase1 Algorithms 对应于 ike Libreswan 参数。输入用来验证和设置加密频道的算法。
        • Phase2 Algorithms 对应于 esp Libreswan 参数。输入用于 IPsec 协商的算法。

          选择 Disable PFS 字段来关闭 Perfect Forward Secrecy(PFS),以确保与不支持 PFS 的旧服务器兼容。

        • Phase1 Lifetimeikelifetime Libreswan 参数对应。此参数定义用于加密流量的密钥的有效期。
        • Phase2 Lifetimesalifetime Libreswan 参数对应。这个参数定义安全关联有效期。
      • 连接性

        • 远程网络rightsubnet Libreswan 参数对应,并定义应通过 VPN 访问的目标专用远程网络。

          检查 缩减 字段以启用缩小字段。请注意,它只在 IKEv2 协商中有效。

        • Enable fragmentationsegmentation Libreswan 参数对应,并定义是否允许 IKE 分段。有效值为 yes (默认)或 no
        • Enable Mobikemobike 参数对应。参数定义是否允许移动和多功能协议(MOBIKE)(RFC 4555)启用连接来迁移其端点而无需从头开始重启连接。这可用于在有线、无线或者移动数据连接之间进行切换的移动设备。值为 no (默认)或 yes
  5. IPv4 Settings 选项卡中,选择 IP 分配方法,并可选择设置额外的静态地址、DNS 服务器、搜索域和路由。

    IPsec IPv4 tab

  6. 保存连接。
  7. 关闭 nm-connection-editor
注意

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

其他资源

  • 您系统上的 nm-settings-libreswan (5) 手册页

7.18. 使用 nmstatectl 配置基于 IPsec 的 VPN 连接

IPsec(互联网协议安全)是一个安全协议套件,由 Libreswan 提供,用于 VPN 的实现。IPsec 包括在连接建立时启动身份验证的协议,并在数据传输过程中管理密钥。当应用程序在网络中部署,并使用 IP 协议进行通信时,IPsec 可以保护数据通信。

要管理基于 IPsec 的配置来验证 VPN 连接,您可以使用 nmstatectl 工具。此工具提供对用于主机网络管理的声明性 API 的命令行访问。以下是 host-to-subnethost-to-host 通信模式的身份验证类型:

  • Host-to-subnet PKI 身份验证
  • Host-to-subnet RSA 身份验证
  • Host-to-subnet PSK 身份验证
  • Host-to-host 隧道模式身份验证
  • Host-to-host 传输模式身份验证

7.18.1. 使用 nmstatectl ,配置带有 PKI 身份验证和隧道模式的主机到子网 IPSec VPN

如果要根据 IPsec 中的可信实体身份验证使用加密,公钥基础架构(PKI)通过在两个主机之间使用加密密钥来提供安全通信。两个通信主机都生成私钥和公钥,其中每个主机通过与可信实体证书颁发机构(CA)共享公钥来维护私钥。验证真实性后,CA 生成一个数字证书。在加密和解密的情况下,主机使用私钥进行加密,使用公钥进行解密。

通过使用 Nmstate (一个用于网络管理的声明性 API),您可以配置基于 PKI 身份验证的 IPsec 连接。设置配置后,Nmstate API 确保结果与配置文件匹配。如果有任何失败,nmstate 会自动回滚更改,以避免不正确的系统状态。

要在 主机到子网 配置中建立加密通信,远程 IPsec 端通过使用参数 dhcp: true 向主机提供另一个 IP。在 nmstate 中为 IPsec 定义系统的情况,左侧 命名的系统是本地主机,而 右侧 命名的系统是远程主机。以下流程需要在两台主机上运行。

先决条件

  • 通过使用密码,您已生成了一个存储证书和加密密钥的 PKCS #12 文件。

流程

  1. 安装所需的软件包:

    # dnf install nmstate libreswan NetworkManager-libreswan
  2. 重启 NetworkManager 服务:

    # systemctl restart NetworkManager
  3. 由于 Libreswan 已安装,请删除其旧的数据库文件,并重新创建它们:

    # systemctl stop ipsec
    # rm /etc/ipsec.d/*db
    # ipsec initnss
  4. 启用并启动 ipsec 服务:

    # systemctl enable --now ipsec
  5. 导入 PKCS#12 文件:

    # ipsec import node-example.p12

    导入 PKCS#12 文件时,请输入用来创建该文件的密码。

  6. 创建一个包含以下内容的 YAML 文件,如 ~/create-pki-authentication.yml

    ---
    interfaces:
    - name: 'example_ipsec_conn1'            1
      type: ipsec
      ipv4:
        enabled: true
        dhcp: true
      libreswan:
        ipsec-interface: 'yes'               2
        left: '192.0.2.250'                  3
        leftid: '%fromcert'                  4
        leftcert: 'local-host.example.com'   5
        right: '192.0.2.150'                 6
        rightid: '%fromcert'                 7
        ikev2: 'insist'                      8
        ikelifetime: '24h'                   9
        salifetime: '24h'                    10

    YAML 文件定义以下设置:

    1
    IPsec 连接名称
    2
    yes 表示 libreswan 创建一个 IPsec xfrm 虚拟接口 ipsec<number>,并自动查找下一个可用数字
    3
    用于本地主机的公共网络接口的静态 IPv4 地址
    4
    在本地主机上,%fromcert 的值将 ID 设置为从加载的证书中获取的可分辨名称(DN)
    5
    本地主机的公钥的可分辨名称(DN)
    6
    用于远程主机的公共网络接口的静态 IPv4 地址
    7
    在远程主机上,%fromcert 的值将 ID 设置为从加载的证书中获取的可分辨名称(DN)。
    8
    insist 值只接受并接收互联网密钥交换(IKEv2)协议
    9
    IKE 协议的持续时间
    10
    IPsec 安全联盟(SA)的持续时间
  7. 将设置应用到系统:

    # nmstatectl apply ~/create-pki-authentication.yml

验证

  1. 验证 IPsec 状态:

    # ip xfrm status
  2. 验证 IPsec 策略:

    # ip xfrm policy

其他资源

  • 您系统上的 IPsec.conf (5) 手册页

7.18.2. 使用 nmstatectl 配置带有 RSA 身份验证和隧道模式的主机到子网 IPSec VPN

如果要在 IPsec 中使用基于非对称加密的密钥身份验证,则 RSA 算法通过使用私钥和公钥在两个主机之间进行加密和解密来提供安全通信。此方法使用私钥进行加密,使用公钥进行解密。

通过使用 Nmstate (一个用于网络管理的声明性 API),您可以配置基于 RSA 的 IPsec 身份验证。设置配置后,Nmstate API 确保结果与配置文件匹配。如果有任何失败,nmstate 会自动回滚更改,以避免不正确的系统状态。

要在 主机到子网 配置中建立加密通信,远程 IPsec 端通过使用参数 dhcp: true 向主机提供另一个 IP。在 nmstate 中为 IPsec 定义系统的情况,左侧 命名的系统是本地主机,而 右侧 命名的系统是远程主机。以下流程需要在两台主机上运行。

流程

  1. 安装所需的软件包:

    # dnf install nmstate libreswan NetworkManager-libreswan
  2. 重启 NetworkManager 服务:

    # systemctl restart NetworkManager
  3. 如果 Libreswan 已安装,请删除其旧的数据库文件,并重新创建它们:

    # systemctl stop ipsec
    # rm /etc/ipsec.d/*db
    # ipsec initnss
  4. 在每个主机上生成一个 RSA 密钥对:

    # ipsec newhostkey --output
  5. 显示公钥:

    # ipsec showhostkey --list
  6. 上一步返回的生成的密钥 ckaid。对左侧使用以下命令和 ckaid,例如:

    # ipsec showhostkey --left --ckaid <0sAwEAAesFfVZqFzRA9F>
  7. 上一命令的输出生成了配置所需的 leftrsasigkey= 行。在第二个主机(右侧)上执行相同的操作:

    # ipsec showhostkey --right --ckaid <0sAwEAAesFfVZqFzRA9E>
  8. 启用 ipsec 服务,来在引导时自动启动:

    # systemctl enable --now ipsec
  9. 创建一个包含以下内容的 YAML 文件,如 ~/create-rsa-authentication.yml

    ---
    interfaces:
    - name: 'example_ipsec_conn1'               1
      type: ipsec                               2
      ipv4:
        enabled: true
        dhcp: true
      libreswan:
        ipsec-interface: '99'                   3
        leftrsasigkey: '0sAwEAAesFfVZqFzRA9F'   4
        left: '192.0.2.250'                     5
        leftid: 'local-host-rsa.example.com'    6
        right: '192.0.2.150'                    7
        rightrsasigkey: '0sAwEAAesFfVZqFzRA9E'  8
        rightid: 'remote-host-rsa.example.com'  9
        ikev2: 'insist'                         10

    YAML 文件定义以下设置:

    1
    IPsec 连接名称
    2
    接口名称
    3
    99 表示 libreswan 创建一个 IPsec xfrm 虚拟接口 ipsec<number>,并自动查找下一个可用数字
    4
    本地主机的 RSA 公钥
    5
    本地主机的公共网络接口的静态 IPv4 地址
    6
    本地主机的可分辨名称(DN)
    7
    远程主机的 RSA 公钥
    8
    远程主机的公共网络接口的静态 IPv4 地址
    9
    远程主机的可分辨名称(DN)
    10
    insist 值只接受并接收互联网密钥交换(IKEv2)协议
  10. 将设置应用到系统:

    # nmstatectl apply ~/create-rsa-authentication.yml

验证

  1. 显示网络接口的 IP 设置:

    # ip addr show example_ipsec_conn1
  2. 验证 IPsec 状态:

    # ip xfrm status
  3. 验证 IPsec 策略:

    # ip xfrm policy

其他资源

  • 您系统上的 IPsec.conf (5) 手册页

7.18.3. 使用 nmstatectl 配置带有 PSK 身份验证和隧道模式的主机到子网 IPSec VPN

如果要在 IPsec 中使用基于相互认证的加密,Pre-Shared Key (PSK)方法通过在两个主机之间使用机密密钥来提供安全通信。文件存储机密密钥,相同的密钥加密通过隧道的数据流。

通过使用 Nmstate (一个用于网络管理的声明性 API),您可以配置基于 PSK 的 IPsec 身份验证。设置配置后,Nmstate API 确保结果与配置文件匹配。如果有任何失败,nmstate 会自动回滚更改,以避免不正确的系统状态。

要在 主机到子网 配置中建立加密通信,远程 IPsec 端通过使用参数 dhcp: true 向主机提供另一个 IP。在 nmstate 中为 IPsec 定义系统的情况,左侧 命名的系统是本地主机,而 右侧 命名的系统是远程主机。以下流程需要在两台主机上运行。

注意

由于此方法使用静态字符串进行身份验证和加密,因此仅用于测试/开发目的。

流程

  1. 安装所需的软件包:

    # dnf install nmstate libreswan NetworkManager-libreswan
  2. 重启 NetworkManager 服务:

    # systemctl restart NetworkManager
  3. 如果 Libreswan 已安装,请删除其旧的数据库文件,并重新创建它们:

    # systemctl stop ipsec
    # rm /etc/ipsec.d/*db
    # ipsec initnss
  4. 启用 ipsec 服务,来在引导时自动启动:

    # systemctl enable --now ipsec
  5. 创建一个包含以下内容的 YAML 文件,如 ~/create-pks-authentication.yml

    ---
    interfaces:
    - name: 'example_ipsec_conn1'           1
      type: ipsec
      ipv4:
        enabled: true
        dhcp: true
      libreswan:
        ipsec-interface: 'no'               2
        right: '192.0.2.250'                3
        rightid: 'remote-host.example.org'  4
        left: '192.0.2.150'                 5
        leftid: 'local-host.example.org'    6
        psk: "example_password"
        ikev2: 'insist'                     7

    YAML 文件定义以下设置:

    1
    IPsec 连接名称
    2
    设置 no 值表示 libreswan 只创建 xfrm 策略,而不是虚拟 xfrm 接口
    3
    远程主机的公共网络接口的静态 IPv4 地址
    4
    远程主机的可分辨名称(DN)
    5
    本地主机的公共网络接口的静态 IPv4 地址
    6
    本地主机的可分辨名称(DN)
    7
    insist 值只接受并接收互联网密钥交换(IKEv2)协议
  6. 将设置应用到系统:

    # nmstatectl apply ~/create-pks-authentication.yml

验证

  1. 显示网络接口的 IP 设置:

    # ip addr show example_ipsec_conn1
  2. 验证 IPsec 状态:

    # ip xfrm status
  3. 验证 IPsec 策略:

    # ip xfrm policy

7.18.4. 使用 nmstatectl 配置具有 PKI 身份验证和隧道模式的主机到主机的 IPsec VPN

IPsec (互联网协议安全)是一个安全协议套件,用于验证和加密网络和设备中的 IP 通信。Libreswan 软件为 VPN 提供一个 IPsec 实现。

在隧道模式中,通信的源和目标 IP 地址在 IPsec 隧道中被加密。外部网络嗅探器只能获取左侧 IP 和右侧 IP。通常,对于隧道模式,它支持 host-to-hosthost-to-subnetsubnet-to-subnet。在此模式中,新的 IP 数据包封装现有的数据包及其有效负载和标头。此模式下的封装保护不安全网络上的 IP 数据、源和目标标头。此模式可用于在 subnet-to-subnet、远程访问连接和不受信任的网络(如开放的公共 Wi-Fi 网络)中传输数据。默认情况下,IPsec 在隧道模式下,在两个站点之间建立一个安全通道。使用以下配置,您可以将 VPN 连接建立成一个 host-to-host 架构。

通过使用 Nmstate (一个用于网络管理的声明性 API),您可以配置 IPsec VPN 连接。设置配置后,Nmstate API 确保结果与配置文件匹配。如果有任何失败,nmstate 会自动回滚更改,以避免不正确的系统状态。

host-to-host 配置中,您需要设置 leftmodecfgclient: no,以便它不能从服务器接收网络配置,因此该值为 no。在 nmstate 中为 IPsec 定义系统的情况,左侧 命名的系统是本地主机,而 右侧 命名的系统是远程主机。以下流程需要在两台主机上运行。

先决条件

  • 通过使用密码,您已生成了一个存储证书和加密密钥的 PKCS #12 文件。

流程

  1. 安装所需的软件包:

    # dnf install nmstate libreswan NetworkManager-libreswan
  2. 重启 NetworkManager 服务:

    # systemctl restart NetworkManager
  3. 由于 Libreswan 已安装,请删除其旧的数据库文件,并重新创建它们:

    # systemctl stop ipsec
    # rm /etc/ipsec.d/*db
    # ipsec initnss
  4. 导入 PKCS#12 文件:

    # ipsec import node-example.p12

    在导入 PKCS#12 文件时,输入用来生成该文件的密码。

  5. 启用并启动 ipsec 服务:

    # systemctl enable --now ipsec
  6. 一个创建包含以下内容的 YAML 文件,如 ~/create-p2p-vpn-authentication.yml

    ---
    interfaces:
    - name: 'example_ipsec_conn1'             1
      type: ipsec
      libreswan:
        left: '192.0.2.250'                   2
        leftid:  'local-host.example.com'     3
        leftcert: 'local-host.example.com'    4
        leftmodecfgclient: 'no'               5
        right: '192.0.2.150'                  6
        rightid: 'remote-host.example.com'    7
        rightsubnet: '192.0.2.150/32'         8
        ikev2: 'insist'                       9

    YAML 文件定义以下设置:

    1
    IPsec 连接名称
    2
    用于本地主机的公共网络接口的静态 IPv4 地址
    3
    本地主机的可分辨名称(DN)
    4
    本地主机上安装的证书的名称
    5
    用于不是从远程主机检索客户端配置的值
    6
    用于远程主机的公共网络接口的静态 IPv4 地址
    7
    远程主机的可分辨名称(DN)
    8
    远程主机的子网范围 - 192.0.2.150,有 32 个 IPv4 地址
    9
    只接受和接收互联网密钥交换(IKEv2)协议的值
  7. 将设置应用到系统:

    # nmstatectl apply ~/create-p2p-vpn-authentication.yml

验证

  1. 显示创建的 P2P 策略:

    # ip xfrm policy
  2. 验证 IPsec 状态:

    # ip xfrm status

其他资源

  • 您系统上的 IPsec.conf (5) 手册页

7.18.5. 使用 nmstatectl 配置具有 PSK 验证和传输模式的 host-to-host IPsec VPN

IPsec (互联网协议安全)是一个安全协议套件,用于验证和加密网络和设备中的 IP 通信。Libreswan 工具为 VPN 提供基于 IPsec 的实现。

在传输模式下,加密仅适用于 IP 数据包的有效负载。另外,通过保持原始 IP 标头,新的 IPsec 标头被附加到 IP 数据包中。传输模式不会加密通信的源和目标 IP,而是将它们复制到外部 IP 标头中。因此,加密只保护网络中的 IP 数据。此模式可用于在网络的 host-to-host 连接中传输数据。此模式通常与 GRE 隧道一起使用,以节省 20 字节(IP 标头)的开销。默认情况下,IPsec 工具使用隧道模式。要使用传输模式,请为 host-to-host 连接数据传输设置 type: transport

通过使用 Nmstate (一个用于网络管理的声明性 API),您可以配置 IPsec VPN 连接。设置配置后,Nmstate API 确保结果与配置文件匹配。如果有任何失败,nmstate 会自动回滚更改,以避免不正确的系统状态。要覆盖默认的 tunnel 模式,请指定 transport 模式。

在 nmstate 中为 IPsec 定义系统的情况,左侧 命名的系统是本地主机,而 右侧 命名的系统是远程主机。以下流程需要在两台主机上运行。

先决条件

  • 通过使用密码,您已生成了一个存储证书和加密密钥的 PKCS #12 文件。

流程

  1. 安装所需的软件包:

    # dnf install nmstate libreswan NetworkManager-libreswan
  2. 重启 NetworkManager 服务:

    # systemctl restart NetworkManager
  3. 由于 Libreswan 已安装,请删除其旧的数据库文件,并重新创建它们:

    # systemctl stop ipsec
    # rm /etc/ipsec.d/*db
    # ipsec initnss
  4. 导入 PKCS#12 文件:

    # ipsec import node-example.p12

    导入 PKCS#12 文件时,请输入用来创建该文件的密码。

  5. 启用并启动 ipsec 服务:

    # systemctl enable --now ipsec
  6. 创建一个包含以下内容的 YAML 文件,如 ~/create-p2p-transport-authentication.yml

    ---
    interfaces:
    - name: 'example_ipsec_conn1'           1
      type: ipsec
      libreswan:
        type: 'transport'                   2
        ipsec-interface: '99'               3
        left: '192.0.2.250'                 4
        leftid: '%fromcert'                 5
        leftcert: 'local-host.example.org'  6
        right: '192.0.2.150'                7
        prefix-length: '32'                 8
        rightid: '%fromcert'                9
        ikev2: 'insist'                     10
        ikelifetime: '24h'                  11
        salifetime: '24h'                   12

    YAML 文件定义以下设置:

    1
    IPsec 连接名称
    2
    IPsec 模式
    3
    99 表示 libreswan 创建一个 IPsec xfrm 虚拟接口 ipsec<number>,并自动查找下一个可用数字
    4
    用于本地主机的公共网络接口的静态 IPv4 地址
    5
    在本地主机上,%fromcert 的值将 ID 设置为从加载的证书获取的可分辨名称(DN)
    6
    本地主机的公钥的可分辨名称(DN)
    7
    用于远程主机的公共网络接口的静态 IPv4 地址
    8
    本地主机的静态 IPv4 地址的子网掩码
    9
    在远程主机上,%fromcert 的值将 ID 设置为从加载的证书中获取的可分辨名称(DN)
    10
    只接受和接收互联网密钥交换(IKEv2)协议的值
    11
    IKE 协议的持续时间
    12
    IPsec 安全联盟(SA)的持续时间
  7. 将设置应用到系统:

    # nmstatectl apply ~/create-p2p-transport-authentication.yml

验证

  1. 验证 IPsec 状态:

    # ip xfrm status
  2. 验证 IPsec 策略:

    # ip xfrm policy

其他资源

  • 您系统上的 IPsec.conf (5) 手册页

第 8 章 设置 WireGuard VPN

WireGuard 是一个在 Linux 内核中运行的高性能 VPN 解决方案。它使用现代加密机制,并且比许多其他 VPN 解决方案更容易配置。另外,WireGuard 的小代码库降低了安全攻击的攻击面,因此提高安全性。对于身份验证和加密,WireGuard 使用类似于 SSH 的键。

重要

WireGuard 只作为技术预览提供。红帽产品服务级别协议(SLA)不支持技术预览功能,且其功能可能并不完善,因此红帽不建议在生产环境中使用它们。这些预览可让用户早期访问将来的产品功能,让用户在开发过程中测试并提供反馈意见。

如需有关 技术预览功能支持范围 的信息,请参阅红帽客户门户网站中的技术预览功能支持范围。

请注意,参与 WireGuard VPN 的所有主机都是同级的。本文档使用术语 客户端 来描述建立连接的主机,使用 服务器 来描述固定主机名或客户端连接的 IP 地址的主机,并可选通过这个服务器路由所有流量。

要设置 WireGuard VPN,您必须完成以下步骤。您可以使用不同的选项执行大多数步骤:

  1. 为 VPN 中的每个主机创建公钥和私钥
  2. 使用 nmcli,nmtuiRHEL web 控制台nm-connection-editorwg-quick 服务配置 WireGuard 服务器。
  3. 使用 命令行RHEL web 控制台图形界面 在 WireGuard 服务器上配置 firewalld。
  4. 使用 nmcli,nmtuiRHEL web 控制台nm-connection-editorwg-quick 服务配置 WireGuard 客户端。

WireGuard 在网络层(层 3)上运行。因此,您无法使用 DHCP,且必须为服务器和客户端上的隧道设备分配静态 IP 地址或 IPv6 本地链接地址。

重要

只有在禁用 RHEL 中的 Federal Information Processing Standard(FIPS)模式时,才能使用 WireGuard。

8.1. WireGuard 使用的协议和原语

WireGuard 使用以下协议和原语:

  • ChaCha20 用于通过 Poly1305 进行身份验证,使用带有关联数据(AEAD)的 Authenticated Encryption,如 RFC7539 所述
  • Curve25519 用于 Elliptic-curve Diffie-Hellman(ECDH)密钥交换
  • 用于哈希和密钥哈希的 BLAKE2s,如 RFC7693所述
  • 用于哈希表键的 SipHash24
  • 用于密钥派生的 HKDF,如 RFC5869所述

8.2. WireGuard 如何使用隧道 IP 地址、公钥和远程端点

当 WireGuard 将网络数据包发送到对等点时:

  1. WireGuard 从数据包读取目标 IP,并将其与本地配置中允许的 IP 地址列表进行比较。如果未找到 peer,WireGuard 会丢弃数据包。
  2. 如果 peer 有效,WireGuard 使用对等的公钥对数据包进行加密。
  3. 发送主机查找主机的最新互联网 IP 地址,并将加密数据包发送到此地址。

当 WireGuard 接收数据包时:

  1. WireGuard 使用远程主机的私钥解密数据包。
  2. WireGuard 从数据包读取内部源地址,并在本地主机上对等点的设置中查询 IP 地址是否配置。如果源 IP 位于允许列表中,WireGuard 会接受数据包。如果 IP 地址不在列表中,WireGuard 会丢弃数据包。

公钥和允许的 IP 地址的关联称为 加密密钥路由表。这意味着,当发送数据包时,IP 地址列表的行为与路由表相似,在接收数据包时作为一种访问控制列表。

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
  2. 为主机创建私钥和对应的公钥:

    # wg genkey | tee /etc/wireguard/$HOSTNAME.private.key | wg pubkey > /etc/wireguard/$HOSTNAME.public.key

    您需要密钥文件的内容,而不是文件本身。但是,红帽建议在将来需要记住密钥时保留文件。

  3. 在密钥文件中设置安全权限:

    # chmod 600 /etc/wireguard/$HOSTNAME.private.key /etc/wireguard/$HOSTNAME.public.key
  4. 显示私钥:

    # cat /etc/wireguard/$HOSTNAME.private.key
    YFAnE0psgIdiAF7XR4abxiwVRnlMfeltxu10s/c4JXg=

    您需要私钥在本地主机上配置 WireGuard 连接。不要共享私钥。

  5. 显示公钥:

    # cat /etc/wireguard/$HOSTNAME.public.key
    UtjqCJ57DeAscYKRfp7cFGiQqdONRn69u249Fa4O6BE=

    您需要公钥在远程主机上配置 WireGuard 连接。

其他资源

  • 您系统上的 wg (8) 手册页

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

    此命令创建一个名为 server-wg0 的配置文件,并将虚拟接口 wg0 分配给它。要防止连接在添加后而没有最终配置的情况下自动启动,请禁用 autoconnect 参数。

  2. 设置服务器的隧道 IPv4 地址和子网掩码:

    # nmcli connection modify server-wg0 ipv4.method manual ipv4.addresses 192.0.2.1/24
  3. 设置服务器的隧道 IPv6 地址和子网掩码:

    # nmcli connection modify server-wg0 ipv6.method manual ipv6.addresses 2001:db8:1::1/32
  4. 将服务器的私钥添加到连接配置集中:

    # nmcli connection modify server-wg0 wireguard.private-key "YFAnE0psgIdiAF7XR4abxiwVRnlMfeltxu10s/c4JXg="
  5. 为传入的 WireGuard 连接设定端口:

    # nmcli connection modify server-wg0 wireguard.listen-port 51820

    在主机上始终设置固定端口号,接收传入的 WireGuard 连接。如果您没有设置端口,WireGuard 会在每次激活 wg0 接口时使用随机的空闲端口。

  6. 为您要允许与此服务器通信的每个客户端添加对等配置。您必须手动添加这些设置,因为 nmcli 工具不支持设置相应的连接属性。

    1. 编辑 /etc/NetworkManager/system-connections/server-wg0.nmconnection 文件,并附加:

      [wireguard-peer.bnwfQcC8/g2i4vvEqcRUM2e6Hi3Nskk6G9t4r26nFVM=]
      allowed-ips=192.0.2.2;2001:db8:1::2;
      • [wireguard-peer.<public_key_of_the_client>] 条目定义客户端对等的部分,以及包含客户端公钥的部分的名称。
      • allowed-ips 参数设置允许向这个服务器发送数据的客户端的隧道 IP 地址。

        为每个客户端添加一个部分。

    2. 重新载入 server-wg0 连接配置文件:

      # nmcli connection load /etc/NetworkManager/system-connections/server-wg0.nmconnection
  7. 可选:将连接配置为自动启动,请输入:

    # nmcli connection modify server-wg0 autoconnect yes
  8. 重新激活 server-wg0 连接:

    # nmcli connection up server-wg0

验证

  1. 显示 wg0 设备的接口配置:

    # wg show wg0
    interface: wg0
      public key: UtjqCJ57DeAscYKRfp7cFGiQqdONRn69u249Fa4O6BE=
      private key: (hidden)
      listening port: 51820
    
    peer: bnwfQcC8/g2i4vvEqcRUM2e6Hi3Nskk6G9t4r26nFVM=
      allowed ips: 192.0.2.2/32, 2001:db8:1::2/128

    要在输出中显示私钥,请使用 WG_HIDE_KEYS=never wg show wg0 命令。

  2. 显示 wg0 设备的 IP 配置:

    # ip address show wg0
    20: wg0: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1420 qdisc noqueue state UNKNOWN group default qlen 1000
        link/none
        inet 192.0.2.1/24 brd 192.0.2.255 scope global noprefixroute wg0
           valid_lft forever preferred_lft forever
        inet6 2001:db8:1::1/32 scope global noprefixroute
           valid_lft forever preferred_lft forever
        inet6 fe80::3ef:8863:1ce2:844/64 scope link noprefixroute
           valid_lft forever preferred_lft forever

其他资源

  • 您系统上的 wg (8) 手册页
  • 您系统上的 nm-settings (5) 手册页中的 WireGuard 设置 部分

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
  2. 选择 Edit a connection,然后按 Enter
  3. 选择 添加,然后按 Enter 键。
  4. 选择列表中的 WireGuard 连接类型,然后按 Enter 键。
  5. Edit connection 窗口中:

    1. 输入连接名称和虚拟接口,如 wg0,以便 NetworkManager 应分配给连接。
    2. 输入服务器的私钥。
    3. 为传入的 WireGuard 连接设置侦听端口号,如 51820

      在主机上始终设置固定端口号,接收传入的 WireGuard 连接。如果您没有设置端口,WireGuard 会在每次激活接口时都使用一个随机的空闲端口。

      nmtui WireGuard server general
    4. Peers 窗格旁的 Add

      1. 输入客户端的公钥。
      2. Allowed IP 字段设置为允许向这个服务器发送数据的客户端的隧道 IP 地址。
      3. 选择 OK,然后按 Enter 键。

        nmtui WireGuard 服务器 peer 配置
    5. 选择 *IPv4 Configuration 旁边的 Show,然后按 Enter 键。

      1. 选择 IPv4 配置方法 Manual
      2. 输入隧道 IPv4 地址和子网掩码。将 Gateway 字段留空。
    6. 选择 IPv6 Configuration 旁边的 Show,然后按 Enter 键。

      1. 选择 IPv6 配置方法 Manual
      2. 输入隧道 IPv6 地址和子网掩码。将 Gateway 字段留空。
    7. 选择 确定,然后按 Enter

      nmtui WireGuard server ip config
  6. 在带有连接列表的窗口中,选择 Back,然后按 Enter 键。
  7. NetworkManager TUI 主窗口中,选择 Quit,然后按 Enter 键。

验证

  1. 显示 wg0 设备的接口配置:

    # wg show wg0
    interface: wg0
      public key: UtjqCJ57DeAscYKRfp7cFGiQqdONRn69u249Fa4O6BE=
      private key: (hidden)
      listening port: 51820
    
    peer: bnwfQcC8/g2i4vvEqcRUM2e6Hi3Nskk6G9t4r26nFVM=
      allowed ips: 192.0.2.2/32, 2001:db8:1::2/128

    要在输出中显示私钥,请使用 WG_HIDE_KEYS=never wg show wg0 命令。

  2. 显示 wg0 设备的 IP 配置:

    # ip address show wg0
    20: wg0: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1420 qdisc noqueue state UNKNOWN group default qlen 1000
        link/none
        inet 192.0.2.1/24 brd 192.0.2.255 scope global noprefixroute wg0
           valid_lft forever preferred_lft forever
        inet6 _2001:db8:1::1/32 scope global noprefixroute
           valid_lft forever preferred_lft forever
        inet6 fe80::3ef:8863:1ce2:844/64 scope link noprefixroute
           valid_lft forever preferred_lft forever

其他资源

  • 您系统上的 wg (8) 手册页

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 地址。
    WireGuard 服务器设置
  9. Add 创建 WireGuard 连接。
  10. 如果您还想设置隧道 IPv6 地址:

    1. Interfaces 部分中点 WireGuard 连接的名称。
    2. IPv6 旁边的 edit
    3. Addresses 字段设置为 Manual,并输入服务器的隧道 IPv6 地址和前缀。
    4. 点击 Save

验证

  1. 显示 wg0 设备的接口配置:

    # wg show wg0
    interface: wg0
      public key: UtjqCJ57DeAscYKRfp7cFGiQqdONRn69u249Fa4O6BE=
      private key: (hidden)
      listening port: 51820
    
    peer: bnwfQcC8/g2i4vvEqcRUM2e6Hi3Nskk6G9t4r26nFVM=
      allowed ips: 192.0.2.2/32, 2001:db8:1::2/128

    要在输出中显示私钥,请使用 WG_HIDE_KEYS=never wg 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

8.8. 使用 nm-connection-editor 配置 WireGuard 服务器

您可以通过在 NetworkManager 中创建连接配置集来配置 WireGuard 服务器。使用此方法让 NetworkManager 管理 WireGuard 连接。

先决条件

  • 您已为服务器和客户端生成了公钥和私钥。
  • 您知道以下信息:

    • 服务器的私钥
    • 客户端的静态隧道 IP 地址和子网掩码
    • 客户端的公钥
    • 服务器的静态隧道 IP 地址和子网掩码

流程

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

    # nm-connection-editor
  2. + 按钮添加新连接。
  3. 选择 WireGuard 连接类型,然后点 Create
  4. 可选:更新连接名称。
  5. General 选项卡中,选择 Connect automatically with priority。另外,还可设置优先级值。
  6. WireGuard 选项卡中:

    1. 输入虚拟接口的名称,如 wg0,这是 NetworkManager 应分配给连接的名称。
    2. 输入服务器的私钥。
    3. 为传入的 WireGuard 连接设置侦听端口号,如 51820

      在主机上始终设置固定端口号,接收传入的 WireGuard 连接。如果您没有设置端口,WireGuard 会在每次激活接口时都使用一个随机的空闲端口。

    4. Add 添加对等点:

      1. 输入客户端的公钥。
      2. Allowed IP 字段设置为允许向这个服务器发送数据的客户端的隧道 IP 地址。
      3. 应用
  7. IPv4 设置 标签页中:

    1. Method 列表中选择 Manual
    2. 单击 Add 来输入隧道 IPv4 地址和子网掩码。将 Gateway 字段留空。
  8. IPv6 设置 标签页中:

    1. Method 列表中选择 Manual
    2. 单击 Add 来输入隧道 IPv6 地址和子网掩码。将 Gateway 字段留空。
  9. Save 存储连接配置集。

验证

  1. 显示 wg0 设备的接口配置:

    # wg show wg0
    interface: wg0
      public key: UtjqCJ57DeAscYKRfp7cFGiQqdONRn69u249Fa4O6BE=
      private key: (hidden)
      listening port: 51820
    
    peer: bnwfQcC8/g2i4vvEqcRUM2e6Hi3Nskk6G9t4r26nFVM=
      allowed ips: 192.0.2.2/32, 2001:db8:1::2/128

    要在输出中显示私钥,请使用 WG_HIDE_KEYS=never wg show wg0 命令。

  2. 显示 wg0 设备的 IP 配置:

    # ip address show wg0
    20: wg0: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1420 qdisc noqueue state UNKNOWN group default qlen 1000
        link/none
        inet 192.0.2.1/24 brd 192.0.2.255 scope global noprefixroute wg0
           valid_lft forever preferred_lft forever
        inet6 2001:db8:1::1/32 scope global noprefixroute
           valid_lft forever preferred_lft forever
        inet6 fe80::3ef:8863:1ce2:844/64 scope link noprefixroute
           valid_lft forever preferred_lft forever

其他资源

  • 您系统上的 wg (8) 手册页

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
  2. 使用以下内容创建 /etc/wireguard/wg0.conf 文件:

    [Interface]
    Address = 192.0.2.1/24, 2001:db8:1::1/32
    ListenPort = 51820
    PrivateKey = YFAnE0psgIdiAF7XR4abxiwVRnlMfeltxu10s/c4JXg=
    
    [Peer]
    PublicKey = bnwfQcC8/g2i4vvEqcRUM2e6Hi3Nskk6G9t4r26nFVM=
    AllowedIPs = 192.0.2.2, 2001:db8:1::2
    • [Interface] 部分描述了服务器上接口的 WireGuard 设置:

      • Address :逗号分隔的服务器的隧道 IP 地址的列表。
      • PrivateKey :服务器的私钥。
      • ListenPort :WireGuard 在其上侦听传入的 UDP 连接的端口。

        在主机上始终设置固定端口号,接收传入的 WireGuard 连接。如果您没有设置端口,WireGuard 会在每次激活 wg0 接口时使用随机的空闲端口。

    • 每个 [Peer] 部分描述了一个客户端的设置:

      • PublicKey :客户端的公钥。
      • AllowedIPs :允许向这个服务器发送数据的客户端的隧道 IP 地址。
  3. 启用并启动 WireGuard 连接:

    # systemctl enable --now wg-quick@wg0

    systemd 实例名称必须与 /etc/wireguard/ 目录中不带 .conf 后缀的配置文件的名称匹配。该服务还会将这个名称用于虚拟网络接口。

验证

  1. 显示 wg0 设备的接口配置:

    # wg show wg0
    interface: wg0
      public key: UtjqCJ57DeAscYKRfp7cFGiQqdONRn69u249Fa4O6BE=
      private key: (hidden)
      listening port: 51820
    
    peer: bnwfQcC8/g2i4vvEqcRUM2e6Hi3Nskk6G9t4r26nFVM=
      allowed ips: 192.0.2.2/32, 2001:db8:1::2/128

    要在输出中显示私钥,请使用 WG_HIDE_KEYS=never wg 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

其他资源

  • 您系统上的 wg (8)wg-quick (8) 手册页

8.10. 使用命令行在 WireGuard 服务器上配置 firewalld

您必须在 WireGuard 服务器上配置 firewalld 服务,以允许来自客户端的传入的连接。另外,如果客户端能够使用 WireGuard 服务器作为默认网关,并通过隧道路由所有流量,则必须启用伪装。

流程

  1. firewalld 服务中的传入连接打开 WireGuard 端口:

    # firewall-cmd --permanent --add-port=51820/udp --zone=public
  2. 如果客户端应该使用 WireGuard 服务器作为默认网关来通过隧道路由所有流量,请为 public 区域启用伪装:

    # firewall-cmd --permanent --zone=public --add-masquerade
  3. 重新加载 firewalld 规则。

    # firewall-cmd --reload

验证

  • 显示 public 区域的配置:

    # firewall-cmd --list-all
    public (active)
      ...
      ports: 51820/udp
      masquerade: yes
      ...

其他资源

  • 您系统上的 firewall-cmd (1) 手册页

8.11. 使用 RHEL web 控制台在 WireGuard 服务器上配置 firewalld

您必须在 WireGuard 服务器上配置 firewalld 服务,以允许来自客户端的进入连接。另外,如果客户端能够使用 WireGuard 服务器作为默认网关,并通过隧道路由所有流量,则必须启用伪装。

先决条件

  • 已登陆到 RHEL web 控制台。

流程

  1. 在屏幕左侧的导航中选择 Networking 选项卡。
  2. Firewall 部分中的 Edit rules and zones
  3. Filter services 字段中输入 wireguard
  4. 从列表中选择 wireguard 条目。

    WireGuard 服务器的 firewalld 设置
  5. Add services
  6. 如果客户端应该使用 WireGuard 服务器作为默认网关来通过隧道路由所有流量,请为 public 区域启用伪装:

    # firewall-cmd --permanent --zone=public --add-masquerade
    # firewall-cmd --reload

    请注意,您无法在 web 控制台的 firewalld 区域中启用伪装。

验证

  1. 在屏幕左侧的导航中选择 Networking 选项卡。
  2. Firewall 部分中的 Edit rules and zones
  3. 列表包含 wireguard 服务的一个条目,并显示您在 WireGuard 连接配置文件中配置的 UDP 端口。
  4. 要验证伪装是否在 firewalld public 区域中启用了,请输入:

    # firewall-cmd --list-all --zone=public
    public (active)
      ...
      ports: 51820/udp
      masquerade: yes
      ...

8.12. 使用图形界面在 WireGuard 服务器上配置 firewalld

您必须在 WireGuard 服务器上配置 firewalld 服务,以允许来自客户端的传入的连接。另外,如果客户端能够使用 WireGuard 服务器作为默认网关,并通过隧道路由所有流量,则必须启用伪装。

流程

  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
      ...

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 autoconnect no

    此命令创建一个名为 client-wg0 的配置文件,并将虚拟接口 wg0 分配给它。要防止连接在添加后而没有最终配置的情况下自动启动,请禁用 autoconnect 参数。

  2. 可选:配置 NetworkManager,使其不会自动启动 client-wg 连接:

    # nmcli connection modify client-wg0 autoconnect no
  3. 设置客户端的隧道 IPv4 地址和子网掩码:

    # nmcli connection modify client-wg0 ipv4.method manual ipv4.addresses 192.0.2.2/24
  4. 设置客户端的隧道 IPv6 地址和子网掩码:

    # nmcli connection modify client-wg0 ipv6.method manual ipv6.addresses 2001:db8:1::2/32
  5. 如果要通过隧道路由所有流量,请将服务器的隧道 IP 地址设置为默认网关:

    # nmcli connection modify client-wg0 ipv4.gateway 192.0.2.1 ipv6.gateway 2001:db8:1::1

    通过隧道路由所有流量要求您在后续步骤中将此客户端上的 allowed-ips 设置为 0.0.0.0/0;::/0

    请注意,通过隧道路由所有流量可能会影响到其他主机的连接,具体取决于服务器路由和防火墙配置。

  6. 将客户端的私钥添加到连接配置文件中:

    # nmcli connection modify client-wg0 wireguard.private-key "aPUcp5vHz8yMLrzk8SsDyYnV33IhE/k20e52iKJFV0A="
  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
      • [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 向服务器发送一个实时数据包的 间隔(以秒为单位)。如果您在网络中使用具有网络地址转换(NAT)的客户端,或者防火墙在一段时间不活跃后关闭 UDP 连接,则设置此参数。
    2. 重新载入 client-wg0 连接配置文件:

      # nmcli connection load /etc/NetworkManager/system-connections/client-wg0.nmconnection
  8. 重新激活 client-wg0 连接:

    # nmcli connection up client-wg0

验证

  1. Ping 服务器的 IP 地址:

    # ping 192.0.2.1
    # ping6 2001:db8:1::1
  2. 显示 wg0 设备的接口配置:

    # wg show wg0
    interface: wg0
      public key: bnwfQcC8/g2i4vvEqcRUM2e6Hi3Nskk6G9t4r26nFVM=
      private key: (hidden)
      listening port: 51820
    
    peer: UtjqCJ57DeAscYKRfp7cFGiQqdONRn69u249Fa4O6BE=
      endpoint: server.example.com:51820
      allowed ips: 192.0.2.1/32, 2001:db8:1::1/128
      latest handshake: 1 minute, 41 seconds ago
      transfer: 824 B received, 1.01 KiB sent
      persistent keepalive: every 20 seconds

    要在输出中显示私钥,请使用 WG_HIDE_KEYS=never wg show wg0 命令。

    请注意,如果您已经通过 VPN 隧道发送流量,则输出只有 latest handshaketransfer 条目。

  3. 显示 wg0 设备的 IP 配置:

    # ip address show wg0
    10: wg0: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1420 qdisc noqueue state UNKNOWN group default qlen 1000
        link/none
        inet 192.0.2.2/24 brd 192.0.2.255 scope global noprefixroute wg0
           valid_lft forever preferred_lft forever
        inet6 2001:db8:1::2/32 scope global noprefixroute
           valid_lft forever preferred_lft forever
        inet6 fe80::73d9:6f51:ea6f:863e/64 scope link noprefixroute
           valid_lft forever preferred_lft forever

其他资源

  • 您系统上的 wg (8) 手册页
  • 您系统上的 nm-settings (5) 手册页中的 WireGuard 设置 部分

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
  2. 选择 Edit a connection,然后按 Enter
  3. 选择 添加,然后按 Enter 键。
  4. 选择列表中的 WireGuard 连接类型,然后按 Enter 键。
  5. Edit connection 窗口中:

    1. 输入连接名称和虚拟接口,如 wg0,以便 NetworkManager 应分配给连接。
    2. 输入客户端的私钥。

      nmtui WireGuard client general
    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 键。

        nmtui WireGuard 客户端对等配置
    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

      nmtui WireGuard client ip config
  6. 在带有连接列表的窗口中,选择 Back,然后按 Enter 键。
  7. NetworkManager TUI 主窗口中,选择 Quit,然后按 Enter 键。

验证

  1. Ping 服务器的 IP 地址:

    # ping 192.0.2.1
    # ping6 2001:db8:1::1
  2. 显示 wg0 设备的接口配置:

    # wg show wg0
    interface: wg0
      public key: bnwfQcC8/g2i4vvEqcRUM2e6Hi3Nskk6G9t4r26nFVM=
      private key: (hidden)
      listening port: 51820
    
    peer: UtjqCJ57DeAscYKRfp7cFGiQqdONRn69u249Fa4O6BE=
      endpoint: server.example.com:51820_
      allowed ips: 192.0.2.1/32, 2001:db8:1::1/128
      latest handshake: 1 minute, 41 seconds ago
      transfer: 824 B received, 1.01 KiB sent
      persistent keepalive: every 20 seconds

    要在输出中显示私钥,请使用 WG_HIDE_KEYS=never wg show wg0 命令。

    请注意,如果已经通过 VPN 隧道发送流量,输出只会包含 latest handshaketransfer 条目。

  3. 显示 wg0 设备的 IP 配置:

    # ip address show wg0
    10: wg0: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1420 qdisc noqueue state UNKNOWN group default qlen 1000
        link/none
        inet 192.0.2.2/24 brd 192.0.2.255 scope global noprefixroute wg0
           valid_lft forever preferred_lft forever
        inet6 2001:db8:1::2/32 scope global noprefixroute
           valid_lft forever preferred_lft forever
        inet6 fe80::73d9:6f51:ea6f:863e/64 scope link noprefixroute
           valid_lft forever preferred_lft forever

其它资源

  • 您系统上的 wg (8) 手册页

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 服务器作为默认网关。
    WireGuard 客户端设置
  9. Add 创建 WireGuard 连接。
  10. 如果您还想设置隧道 IPv6 地址:

    1. Interfaces 部分中点 WireGuard 连接的名称。
    2. 单击 IPv6 旁边的 Edit
    3. Addresses 字段设置为 Manual,并输入客户端的隧道 IPv6 地址和前缀。
    4. 点击 Save

验证

  1. Ping 服务器的 IP 地址:

    # ping 192.0.2.1

    当您尝试通过隧道发送流量时,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

    要在输出中显示私钥,请使用 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

8.16. 使用 nm-connection-editor 配置 WireGuard 客户端

您可以通过在 NetworkManager 中创建连接配置集来配置 WireGuard 客户端。使用此方法让 NetworkManager 管理 WireGuard 连接。

先决条件

  • 您已为服务器和客户端生成了公钥和私钥。
  • 您知道以下信息:

    • 客户端的私钥
    • 客户端的静态隧道 IP 地址和子网掩码
    • 服务器的公钥
    • 服务器的静态隧道 IP 地址和子网掩码

流程

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

    # nm-connection-editor
  2. + 按钮添加新连接。
  3. 选择 WireGuard 连接类型,然后单击 Create
  4. 可选:更新连接名称。
  5. 可选:在 General 选项卡中,选择 Connect automatically with priority
  6. WireGuard 选项卡上:

    1. 输入虚拟接口的名称,如 wg0,这是 NetworkManager 应分配给连接的名称。
    2. 输入客户端的私钥。
    3. Add 添加对等点:

      1. 输入服务器的公钥。
      2. 设置 Allowed IPs 字段。例如,将其设置为:

        • 服务器隧道 IP 地址,以仅允许服务器与此客户端通信。
        • 0.0.0.0/0;::/0; 允许任何远程 IPv4 和 IPv6 地址与此客户端进行通信。使用此设置通过隧道路由所有流量,并使用 WireGuard 服务器作为默认网关。

          请注意,通过隧道路由所有流量可能会影响到其他主机的连接,具体取决于服务器路由和防火墙配置。

      3. Endpoint 字段中输入 WireGuard 服务器的主机名或 IP 地址及端口。使用以下格式:<hostname_or_IP<:<port_number>
      4. 可选: 如果您在带有网络地址转换(NAT)的网络中使用客户端,或者防火墙在一定时间不活动状态后关闭 UDP 连接,则设置持久的间隔(以秒为单位)。在这个间隔,客户端会向服务器发送一个实时数据包。
      5. 应用
  7. IPv4 Settings 选项卡上:

    1. Method 列表中选择 Manual
    2. 单击 Add 来输入隧道 IPv4 地址和子网掩码。
    3. 如果要通过隧道路由所有流量,请在 Gateway 字段中设置服务器的隧道 IPv4 地址。否则,将字段留空。

      通过隧道路由所有 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 存储连接配置集。

验证

  1. Ping 服务器的 IP 地址:

    # ping 192.0.2.1
    # ping6 2001:db8:1::1
  2. 显示 wg0 设备的接口配置:

    # wg show wg0
    interface: wg0
      public key: bnwfQcC8/g2i4vvEqcRUM2e6Hi3Nskk6G9t4r26nFVM=
      private key: (hidden)
      listening port: 51820
    
    peer: UtjqCJ57DeAscYKRfp7cFGiQqdONRn69u249Fa4O6BE=
      endpoint: server.example.com:51820
      allowed ips: 192.0.2.1/32, 2001:db8:1::1/128
      latest handshake: 1 minute, 41 seconds ago
      transfer: 824 B received, 1.01 KiB sent
      persistent keepalive: every 20 seconds

    要在输出中显示私钥,请使用 WG_HIDE_KEYS=never wg show wg0 命令。

    请注意,如果您已经通过 VPN 隧道发送流量,则输出只有 latest handshaketransfer 条目。

  3. 显示 wg0 设备的 IP 配置:

    # ip address show wg0
    10: wg0: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1420 qdisc noqueue state UNKNOWN group default qlen 1000
        link/none
        inet 192.0.2.2/24 brd 192.0.2.255 scope global noprefixroute wg0
           valid_lft forever preferred_lft forever
        inet6 2001:db8:1::2/32 scope global noprefixroute
           valid_lft forever preferred_lft forever
        inet6 fe80::73d9:6f51:ea6f:863e/64 scope link noprefixroute
           valid_lft forever preferred_lft forever

其他资源

  • 您系统上的 wg (8) 手册页

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
  2. 使用以下内容创建 /etc/wireguard/wg0.conf 文件:

    [Interface]
    Address = 192.0.2.2/24, 2001:db8:1::2/32
    PrivateKey = aPUcp5vHz8yMLrzk8SsDyYnV33IhE/k20e52iKJFV0A=
    
    [Peer]
    PublicKey = UtjqCJ57DeAscYKRfp7cFGiQqdONRn69u249Fa4O6BE=
    AllowedIPs = 192.0.2.1, 2001:db8:1::1
    Endpoint = server.example.com:51820
    PersistentKeepalive = 20
    • [Interface] 部分描述了客户端上接口的 WireGuard 设置:

      • Address :逗号分隔的客户端隧道 IP 地址的列表。
      • PrivateKey :客户端的私钥。
    • [Peer] 部分描述了服务器的设置:

      • PublicKey :服务器的公钥。
      • AllowedIPs :允许向此客户端发送数据的 IP 地址。例如,将参数设置为:

        • 服务器隧道 IP 地址,以仅允许服务器与此客户端通信。上例中的值可配置这种情况。
        • 0.0.0.0/0, ::/0 允许任何远程 IPv4 和 IPv6 地址与此客户端进行通信。使用此设置通过隧道路由所有流量,并使用 WireGuard 服务器作为默认网关。
      • Endpoint :设置服务器的主机名或 IP 地址以及端口。客户端使用此信息来建立连接。
      • 可选的 persistent-keepalive 参数定义 WireGuard 将 keepalive 数据包发送给服务器的间隔(以秒为单位)。如果您在网络中使用具有网络地址转换(NAT)的客户端,或者防火墙在一段时间不活跃后关闭 UDP 连接,则设置此参数。
  3. 启用并启动 WireGuard 连接:

    # systemctl enable --now wg-quick@wg0

    systemd 实例名称必须与 /etc/wireguard/ 目录中不带 .conf 后缀的配置文件的名称匹配。该服务还会将这个名称用于虚拟网络接口。

验证

  1. Ping 服务器的 IP 地址:

    # ping 192.0.2.1
    # ping6 2001:db8:1::1
  2. 显示 wg0 设备的接口配置:

    # wg show wg0
    interface: wg0
      public key: bnwfQcC8/g2i4vvEqcRUM2e6Hi3Nskk6G9t4r26nFVM=
      private key: (hidden)
      listening port: 51820
    
    peer: UtjqCJ57DeAscYKRfp7cFGiQqdONRn69u249Fa4O6BE=
      endpoint: server.example.com:51820
      allowed ips: 192.0.2.1/32, 2001:db8:1::1/128
      latest handshake: 1 minute, 41 seconds ago
      transfer: 824 B received, 1.01 KiB sent
      persistent keepalive: every 20 seconds

    要在输出中显示私钥,请使用 WG_HIDE_KEYS=never wg 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

其他资源

  • 您系统上的 wg (8)wg-quick (8) 手册页

第 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 层动作。

9.1. 配置 IPIP 隧道来在 IPv4 数据包中封装 IPv4 流量

IP over IP(IPIP)隧道在 OSI 层 3 上运行,并封装 IPv4 数据包中的 IPv4 流量,如 RFC 2003 所述

重要

通过 IPIP 隧道发送的数据没有加密。出于安全考虑,只在已经加密的数据中使用隧道,比如 HTTPS。

请注意,IPIP 隧道只支持单播数据包。如果您需要支持多播的 IPv4 隧道,请参阅 配置 GRE 隧道来封装 IPv4 数据包中的第 3 层流量

例如,您可以在两个 RHEL 路由器之间创建一个 IPIP 隧道来通过互联网连接两个内部子网,如下图所示:

IPIP 隧道

先决条件

  • 每个 RHEL 路由器都有一个网络接口,它连接到其本地子网。
  • 每个 RHEL 路由器都有一个连接到互联网的网络接口。
  • 您需要通过隧道发送的流量是 IPv4 单播。

流程

  1. 在网络 A 的 RHEL 路由器上:

    1. 创建名为 tun0 的 IPIP 隧道接口:

      # nmcli connection add type ip-tunnel ip-tunnel.mode ipip con-name tun0 ifname tun0 remote 198.51.100.5 local 203.0.113.10

      remotelocal 参数设置远程和本地路由器的公共 IP 地址。

    2. 将 IPv4 地址设为 tun0 设备:

      # nmcli connection modify tun0 ipv4.addresses '10.0.1.1/30'

      请注意,具有两个可用 IP 地址的 /30 子网足以满足隧道的需要。

    3. tun0 连接配置为使用手动 IPv4 配置:

      # nmcli connection modify tun0 ipv4.method manual
    4. 添加一个静态路由,其将到 172.16.0.0/24 网络的流量路由到路由器 B 上的隧道 IP:

      # nmcli connection modify tun0 +ipv4.routes "172.16.0.0/24 10.0.1.2"
    5. 启用 tun0 连接。

      # nmcli connection up tun0
    6. 启用数据包转发:

      # echo "net.ipv4.ip_forward=1" > /etc/sysctl.d/95-IPv4-forwarding.conf
      # sysctl -p /etc/sysctl.d/95-IPv4-forwarding.conf
  2. 在网络 B 中的 RHEL 路由器中:

    1. 创建名为 tun0 的 IPIP 隧道接口:

      # nmcli connection add type ip-tunnel ip-tunnel.mode ipip con-name tun0 ifname tun0 remote 203.0.113.10 local 198.51.100.5

      remotelocal 参数设置远程和本地路由器的公共 IP 地址。

    2. 将 IPv4 地址设为 tun0 设备:

      # nmcli connection modify tun0 ipv4.addresses '10.0.1.2/30'
    3. tun0 连接配置为使用手动 IPv4 配置:

      # nmcli connection modify tun0 ipv4.method manual
    4. 添加一个静态路由,其将路由到 192.0.2.0/24 网络的流量路由到路由器 A 上的隧道 IP:

      # nmcli connection modify tun0 +ipv4.routes "192.0.2.0/24 10.0.1.1"
    5. 启用 tun0 连接。

      # nmcli connection up tun0
    6. 启用数据包转发:

      # echo "net.ipv4.ip_forward=1" > /etc/sysctl.d/95-IPv4-forwarding.conf
      # sysctl -p /etc/sysctl.d/95-IPv4-forwarding.conf

验证

  • 从每个 RHEL 路由器中,ping 路由器的内部接口的 IP 地址:

    1. 在路由器 A 上,ping 172.16.0.1

      # ping 172.16.0.1
    2. 在路由器 B 上,ping 192.0.2.1

      # ping 192.0.2.1

9.2. 配置 GRE 隧道,来在 IPv4 数据包中封装第 3 层流量

Generic Routing Encapsulation(GRE)隧道封装 IPv4 数据包中的第 3 层流量,如 RFC 2784 所述。GRE 隧道可以使用有效的以太网类型封装任何第 3 层协议。

重要

通过 GRE 隧道发送的数据没有加密。出于安全考虑,只在已经加密的数据中使用隧道,比如 HTTPS。

例如,您可以在两个 RHEL 路由器之间创建一个 GRE 隧道来通过互联网连接两个内部子网,如下图所示:

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

      remotelocal 参数设置远程和本地路由器的公共 IP 地址。

      重要

      保留 gre0 设备名称。对该设备使用 gre1 或者不同的名称。

    2. 将 IPv4 地址设为 gre1 设备:

      # nmcli connection modify gre1 ipv4.addresses '10.0.1.1/30'

      请注意,具有两个可用 IP 地址的 /30 子网足以满足隧道的需要。

    3. gre1 连接配置为使用手动 IPv4 配置:

      # nmcli connection modify gre1 ipv4.method manual
    4. 添加一个静态路由,其将到 172.16.0.0/24 网络的流量路由到路由器 B 上的隧道 IP:

      # nmcli connection modify gre1 +ipv4.routes "172.16.0.0/24 10.0.1.2"
    5. 启用 gre1 连接。

      # nmcli connection up gre1
    6. 启用数据包转发:

      # echo "net.ipv4.ip_forward=1" > /etc/sysctl.d/95-IPv4-forwarding.conf
      # sysctl -p /etc/sysctl.d/95-IPv4-forwarding.conf
  2. 在网络 B 中的 RHEL 路由器中:

    1. 创建名为 gre1 的 GRE 隧道接口:

      # nmcli connection add type ip-tunnel ip-tunnel.mode gre con-name gre1 ifname gre1 remote 203.0.113.10 local 198.51.100.5

      remotelocal 参数设置远程和本地路由器的公共 IP 地址。

    2. 将 IPv4 地址设为 gre1 设备:

      # nmcli connection modify gre1 ipv4.addresses '10.0.1.2/30'
    3. gre1 连接配置为使用手动 IPv4 配置:

      # nmcli connection modify gre1 ipv4.method manual
    4. 添加一个静态路由,其将路由到 192.0.2.0/24 网络的流量路由到路由器 A 上的隧道 IP:

      # nmcli connection modify gre1 +ipv4.routes "192.0.2.0/24 10.0.1.1"
    5. 启用 gre1 连接。

      # nmcli connection up gre1
    6. 启用数据包转发:

      # echo "net.ipv4.ip_forward=1" > /etc/sysctl.d/95-IPv4-forwarding.conf
      # sysctl -p /etc/sysctl.d/95-IPv4-forwarding.conf

验证

  1. 从每个 RHEL 路由器中,ping 路由器的内部接口的 IP 地址:

    1. 在路由器 A 上,ping 172.16.0.1

      # ping 172.16.0.1
    2. 在路由器 B 上,ping 192.0.2.1

      # ping 192.0.2.1

9.3. 配置 GRETAP 隧道来通过 IPv4 传输以太网帧

通用路由封装终端接入点(GRETAP)隧道在 OSI 级别 2 上运行,并封装 IPv4 数据包中的以太网流量,如 RFC 2784 所述。

重要

通过 GRETAP 隧道发送的数据没有加密。出于安全考虑,通过 VPN 或不同的加密连接建立隧道。

例如,您可以在两个 RHEL 路由器之间创建一个 GRETAP 隧道,以使用网桥连接两个网络,如下图所示:

GRETAP 隧道

先决条件

  • 每个 RHEL 路由器都有一个网络接口,它连接到其本地网络,接口没有分配 IP 配置。
  • 每个 RHEL 路由器都有一个连接到互联网的网络接口。

流程

  1. 在网络 A 的 RHEL 路由器上:

    1. 创建名为 bridge0 的网桥接口:

      # nmcli connection add type bridge con-name bridge0 ifname bridge0
    2. 配置网桥的 IP 设置:

      # nmcli connection modify bridge0 ipv4.addresses '192.0.2.1/24'
      # nmcli connection modify bridge0 ipv4.method manual
    3. 为连接到本地网络的接口添加新连接配置集到网桥:

      # nmcli connection add type ethernet port-type bridge con-name bridge0-port1 ifname enp1s0 controller bridge0
    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

      remotelocal 参数设置远程和本地路由器的公共 IP 地址。

      重要

      保留 gretap0 设备名称。对该设备使用 gretap1 或者不同的名称。

    5. 可选:如果您不需要,STP(Spanning Tree Protocol):

      # nmcli connection modify bridge0 bridge.stp no

      默认情况下,STP 被启用并导致在使用连接前出现延迟。

    6. 配置激活 bridge0 连接会自动激活网桥端口:

      # nmcli connection modify bridge0 connection.autoconnect-ports 1
    7. 激活 bridge0 连接:

      # nmcli connection up bridge0
  2. 在网络 B 中的 RHEL 路由器中:

    1. 创建名为 bridge0 的网桥接口:

      # nmcli connection add type bridge con-name bridge0 ifname bridge0
    2. 配置网桥的 IP 设置:

      # nmcli connection modify bridge0 ipv4.addresses '192.0.2.2/24'
      # nmcli connection modify bridge0 ipv4.method manual
    3. 为连接到本地网络的接口添加新连接配置集到网桥:

      # nmcli connection add type ethernet port-type bridge con-name bridge0-port1 ifname enp1s0 controller bridge0
    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

      remotelocal 参数设置远程和本地路由器的公共 IP 地址。

    5. 可选:如果您不需要,STP(Spanning Tree Protocol):

      # nmcli connection modify bridge0 bridge.stp no
    6. 配置激活 bridge0 连接会自动激活网桥端口:

      # nmcli connection modify bridge0 connection.autoconnect-ports 1
    7. 激活 bridge0 连接:

      # nmcli connection up bridge0

验证

  1. 在两个路由器上,验证 enp1s0gretap1 连接是否已连接,并且 CONNECTION 列是否显示端口的连接名称:

    # nmcli device
    nmcli device
    DEVICE   TYPE      STATE      CONNECTION
    ...
    bridge0  bridge    connected  bridge0
    enp1s0   ethernet  connected  bridge0-port1
    gretap1  iptunnel  connected  bridge0-port2
  2. 从每个 RHEL 路由器中,ping 路由器的内部接口的 IP 地址:

    1. 在路由器 A 上,ping 192.0.2.2

      # ping 192.0.2.2
    2. 在路由器 B 上,ping 192.0.2.1

      # ping 192.0.2.1

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

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

vxlan 隧道

在本例中,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 隧道相关的卸载功能。

其他资源

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

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

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

在 RHEL 主机上运行此过程,并相应地调整 IP 地址配置。

先决条件

  • 主机连接到以太网。

流程

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

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

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

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

  3. 激活 Example 连接:

    # nmcli connection up Example

验证

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

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

    # ping RHEL-host-B.example.com

    请注意,在该主机上配置网络前,您无法 ping 其他虚拟机主机。

其他资源

  • 您系统上的 nm-settings (5) 手册页

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

    此命令在网桥设备上设置没有 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

    这个命令使用以下设置:

    • 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
  4. 在本地防火墙中为传入的 UDP 连接打开端口 8472

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

验证

  • 显示转发表:

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

其他资源

  • 您系统上的 nm-settings (5) 手册页

10.4. 在带有现有网桥的 libvirt 中创建一个虚拟网络

要使虚拟机(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>
  2. 使用 ~/vxlan10-bridge.xml 文件来在 libvirt 中创建一个新的虚拟网络:

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

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

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

    # virsh net-autostart vxlan10-bridge

验证

  • 显示虚拟网络列表:

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

其他资源

  • 您系统上的 virsh (1) 手册页

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
  • 要更改现有虚拟机的网络设置:

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

      # virt-xml VM_name --edit --network network=vxlan10-bridge
    2. 关闭虚拟机,并重新启动它:

      # virsh shutdown VM_name
      # virsh start VM_name

验证

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

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

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

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

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

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

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

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

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

其他资源

  • 您系统上的 virt-install (1)virt-xml (1) 手册页
  • 您系统上的 virsh (1)arping (8) 手册页

第 11 章 管理 wifi 连接

RHEL 提供多个实用程序和应用程序来配置和连接到 wifi 网络,例如:

  • 使用 nmcli 工具,使用命令行配置连接。
  • 使用 nmtui 应用程序在基于文本的用户界面中配置连接。
  • 使用 GNOME 系统菜单快速连接到不需要任何配置的 wifi 网络。
  • 使用 GNOME Settings 应用程序,使用 GNOME 应用程序配置连接。
  • 使用 nm-connection-editor 应用程序在图形用户界面中配置连接。
  • 使用 network RHEL 系统角色自动化一个或多个主机上连接的配置。

11.1. 支持的 wifi 安全类型

根据安全类型网络支持,您可以更安全地传输数据。

警告

不要连接到不使用加密的网络,或者只支持不安全的 WEP 或 WPA 标准。

Red Hat Enterprise Linux 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 设备。

流程

  1. 如果网络管理器 (NetworkManager) 中禁用了 wifi radio,请启用此功能:

    # nmcli radio wifi on
  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

    服务设置标识符 (SSID) 列包含网络的名称。如果列显示 --,则此网络的接入点不会广播 SSID。

  3. 连接到 wifi 网络:

    # nmcli device wifi connect Office --ask
    Password: wifi-password

    如果您希望在命令中设置密码而不是以交互方式输入密码,请在命令中使用 password <wifi_password> 选项,而不是 --ask

    # nmcli device wifi connect Office <wifi_password>

    请注意,如果网络需要静态 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
    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
  5. 重新激活连接:

    # nmcli connection up Office

验证

  1. 显示活跃连接:

    # nmcli connection show --active
    NAME    ID                                    TYPE  DEVICE
    Office  2501eb7e-7b16-4dc6-97ef-7cc460139a58  wifi  wlp0s20f3

    如果输出列出了您创建的 wifi 连接,则连接会活跃。

  2. Ping 主机名或 IP 地址:

    # *ping -c 3 example.com

其他资源

  • 您系统上的 nm-settings-nmcli (5) 手册页

11.3. 使用 GNOME 系统菜单连接到 wifi 网络

您可以使用 GNOME 系统菜单连接到 wifi 网络。当您第一次连接到网络时,GNOME 会为它创建一个 NetworkManager 连接配置集。如果您将连接配置集配置为不自动连接,也可以使用 GNOME 系统菜单使用现有 NetworkManager 连接配置集手动连接到 wifi 网络。

注意

第一次使用 GNOME 系统菜单建立与 wifi 网络的连接存在某种限制。例如,您无法配置 IP 地址设置。在这种情况下,首先配置连接:

前提条件

  • 在主机上安装了 wifi 设备。
  • 如果存在硬件交换机,启用 wifi 设备。

流程

  1. 打开顶栏右侧的系统菜单。
  2. 展开 Wi-Fi Not Connected 条目。
  3. Select Network:

    GNOME 选择 wifi
  4. 选择您要连接到的 wifi 网络。
  5. 连接
  6. 如果这是您第一次连接到这个网络,请输入网络的密码,然后点 Connect

验证

  1. 打开顶栏右侧的系统菜单,验证 wifi 网络是否已连接:

    GNOME wifi 连接

    如果网络出现在列表中,它已被连接。

  2. Ping 主机名或 IP 地址:

    # ping -c 3 example.com

11.4. 使用 GNOME 设置应用程序连接到 wifi 网络

您可以使用名为 gnome-control-centerGNOME 设置 应用程序连接到 wifi 网络并配置连接。当您第一次连接到网络时,GNOME 会为它创建一个 NetworkManager 连接配置集。

GNOME 设置中,您可以为 RHEL 支持的所有 wifi 网络安全类型配置 wifi 连接。

前提条件

  • 在主机上安装了 wifi 设备。
  • 如果存在硬件交换机,启用 wifi 设备。

流程

  1. Super 键,键入 Wi-Fi,然后按 Enter 键。
  2. 点您要连接的 wifi 网络的名称。
  3. 输入网络的密码,点 Connect
  4. 如果网络需要额外的设置,如静态 IP 地址或 WPA2 个人以外的安全类型:

    1. 点网络名称旁边的齿轮图标。
    2. 可选:在 Details 标签页中配置网络配置集无法自动连接。

      如果停用这个功能,则您必须总是手动连接到网络,例如使用 GNOME settings 或 GNOME 系统菜单。

    3. 在 IPv4 选项卡上配置 IPv4 设置,并在 IPv6 选项卡上配置 IPv6 设置。
    4. Security 选项卡中,选择网络验证,如 WPA3 Personal,然后输入密码。

      根据所选安全性,应用程序会显示其他字段。相应地填充它们。详情请参阅 wifi 网络管理员。

    5. Apply

验证

  1. 打开顶栏右侧的系统菜单,验证 wifi 网络是否已连接:

    GNOME wifi 连接

    如果网络出现在列表中,它已被连接。

  2. Ping 主机名或 IP 地址:

    # ping -c 3 example.com

11.5. 使用 nmtui 配置 wifi 连接

nmtui 应用程序为 NetworkManager 提供了一个基于文本的用户界面。您可以使用 nmtui 连接到 wifi 网络。

注意

nmtui 中:

  • 使用光标键导航。
  • 选择一个按钮并按 Enter 键。
  • 使用 Space 选择并清除复选框。

流程

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

    # nmcli device status
    DEVICE     TYPE      STATE                   CONNECTION
    wlp2s0     wifi      unavailable             --
    ...
  2. 启动 nmtui

    # nmtui
  3. 选择 Edit a connection,点 Enter
  4. Add 按钮。
  5. 从网络类型列表中选择 Wi-Fi,然后按 Enter
  6. 可选:为要创建的 NetworkManager 配置文件输入一个名称。

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

  7. Device 字段中输入网络设备名称。
  8. SSID 字段中输入 Wi-Fi 网络的名称,即服务集标识符(SSID)。
  9. Mode 字段设为默认值,Client
  10. 选择 Security 字段,按 Enter,然后从列表中设置网络的验证类型。

    根据您选择的验证类型,nmtui 会显示不同的字段。

  11. 填写与验证类型相关的字段。
  12. 如果 Wi-Fi 网络需要静态 IP 地址:

    1. 按协议旁边的 Automatic 按钮,然后从显示的列表中选择 Manual
    2. 按您要配置的协议旁边的 Show 按钮,来显示其他字段并填写它们。
  13. OK 按钮来创建并自动激活新连接。

    nmtui wi fi dynamic IP
  14. Back 按钮返回到主菜单。
  15. 选择 Quit,然后按 Enter 来关闭 nmtui 应用程序。

验证

  1. 显示活跃连接:

    # nmcli connection show --active
    NAME    ID                                    TYPE  DEVICE
    Office  2501eb7e-7b16-4dc6-97ef-7cc460139a58  wifi  wlp0s20f3

    如果输出列出了您创建的 wifi 连接,则连接会活跃。

  2. Ping 主机名或 IP 地址:

    # ping -c 3 example.com

11.6. 使用 nm-connection-editor 配置 wifi 连接

您可以使用 nm-connection-editor 应用程序为无线网络创建连接配置集。在此应用程序中,您可以配置 RHEL 支持的所有 wifi 网络验证类型。

默认情况下,NetworkManager 为连接配置集启用自动连接功能,并在有可用时自动连接到保存的网络。

先决条件

  • 在主机上安装了 wifi 设备。
  • 如果存在硬件交换机,启用 wifi 设备。

流程

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

    # nm-connection-editor
  2. 点击 + 按钮来添加一个新的连接。
  3. 选择 Wi-Fi 连接类型,再点 Create
  4. 可选:为连接配置集设置名称。
  5. 可选:在 General 选项卡中配置网络配置集无法自动连接。

    如果停用这个功能,则您必须总是手动连接到网络,例如使用 GNOME settings 或 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 网络是否已连接:

    GNOME wifi 连接

    如果网络出现在列表中,它已被连接。

  2. Ping 主机名或 IP 地址:

    # ping -c 3 example.com

11.7. 使用 network RHEL 系统角色配置带有 802.1X 网络身份验证的 wifi 连接

网络访问控制(NAC)保护网络不受未授权客户端的访问。您可以在 NetworkManager 连接配置文件中指定身份验证所需的详情,以使客户端能够访问网络。通过使用 Ansible 和 network RHEL 系统角色,您可以在 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>
    2. ansible-vault create 命令打开编辑器后,以 <key>: <value> 格式输入敏感数据:

      pwd: <password>
    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: 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"

    示例 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

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

  4. 运行 playbook:

    $ ansible-playbook --ask-vault-pass ~/playbook.yml

其他资源

  • /usr/share/ansible/roles/rhel-system-roles.network/README.md 文件
  • /usr/share/doc/rhel-system-roles/network/ directory

11.8. 使用 nmcli 在现有配置文件中配置带有 802.1X 网络身份验证的 wifi 连接

使用 nmcli 工具,您可以将客户端配置为向网络进行身份验证。例如,您可以在名为 wlp1s0 的 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

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

  2. 可选:将密码存储在配置中:

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

    默认情况下,NetworkManager 将密码以纯文本形式存储在 /etc/sysconfig/network-scripts/keys-connection_name 文件中,该文件只对 root 用户可读。但是,配置文件中的纯文本密码可能会造成安全风险。

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

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

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

    为安全起见,客户端应验证认证方的证书。

  4. 激活连接配置集:

    # nmcli connection up wlp1s0

验证

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

其他资源

11.9. 手动设置无线规范域

在 RHEL 上,udev 规则执行 setregdomain 工具来设置无线规范域。然后,实用程序为内核提供此信息。

默认情况下,setregdomain 会尝试自动决定国家代码。如果此操作失败,则无线规范域设置可能会出错。要临时解决这个问题,您可以手动设置国家代码。

重要

手动设置规范域将禁用自动检测。因此,如果您稍后在不同的国家/地区使用计算机,之前配置的设置可能不再正确。在这种情况下,删除 /etc/sysconfig/regdomain 文件以切回到自动检测,或使用此流程再次更新规范域设置。

流程

  1. 可选:显示当前规范域设置:

    # iw reg get
    global
    country US: DFS-FCC
    ...
  2. 使用以下内容创建 /etc/sysconfig/regdomain 文件:

    COUNTRY=<country_code>

    COUNTRY 变量设置为一个 ISO 3166-1 alpha2 国家代码,如 DE 代表德国,US 代表美国。

  3. 设置规范域:

    # setregdomain

验证

  • 显示规范域设置:

    # iw reg get
    global
    country DE: DFS-ETSI
    ...

其他资源

第 12 章 将 RHEL 配置为 WPA2 或 WPA3 个人访问令牌

在具有 wifi 设备的主机上,您可以使用 NetworkManager 将这个主机配置为接入点。Wi-Fi Protected Access 2 (WPA2)和 Wi-Fi Protected Access 3 (WPA3)提供安全验证方法,无线客户端可以使用预共享密钥(PSK)连接到访问点,并使用 RHEL 主机上和网络中的服务。

当您配置接入点时,NetworkManager 会自动:

  • 配置 dnsmasq 服务来为客户端提供 DHCP 和 DNS 服务
  • 启用 IP 转发
  • 添加 nftables 防火墙规则来伪装来自 wifi 设备的流量并配置 IP 转发

前提条件

  • wifi 设备支持在接入点模式下运行。
  • wifi 设备没有使用。
  • 主机可以访问互联网。

流程

  1. 列出 wifi 设备来识别应提供访问点的 wifi 设备:

    # nmcli device status | grep wifi
    wlp0s20f3    wifi   disconnected    --
  2. 验证该设备是否支持访问点模式:

    # nmcli -f WIFI-PROPERTIES.AP device show wlp0s20f3
    WIFI-PROPERTIES.AP:     yes

    要使用 wifi 设备作为接入点,该设备必须支持此功能。

  3. 安装 dnsmasqNetworkManager-wifi 软件包:

    # dnf install dnsmasq NetworkManager-wifi

    NetworkManager 使用 dnsmasq 服务为访问点的客户端提供 DHCP 和 DNS 服务。

  4. 创建初始访问点配置:

    # nmcli device wifi hotspot ifname wlp0s20f3 con-name Example-Hotspot ssid Example-Hotspot password "password"

    此命令在 wlp0s20f3 设备(提供 WPA2 和 WPA3 个人访问令牌)上创建一个连接配置集。无线网络的名称,Service Set Identifier (SSID) 是 Example-Hotspot,并使用预共享密钥 密码

  5. 可选:将访问点配置为只支持 WPA3:

    # nmcli connection modify Example-Hotspot 802-11-wireless-security.key-mgmt sae
  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

    您设置的 IP 地址(本例中为 192.0.2.254 )是 NetworkManager 分配给 wifi 设备的 IP 地址。客户端将此 IP 地址用作默认网关和 DNS 服务器。

  7. 激活连接配置集:

    # nmcli connection up Example-Hotspot

验证

  1. 在服务器中:

    1. 验证 NetworkManager 是否启动了 dnsmasq 服务,并且服务侦听端口 67 (DHCP) 和 53 (DNS):

      # ss -tulpn | egrep ":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))
    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
          }
      }
  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
      ...
    2. 连接到 Example-Hotspot 无线网络。请参阅管理 Wi-Fi 连接
    3. 对远程网络或互联网中的主机发出 ping 以验证连接是否正常工作:

      # ping -c 3 www.redhat.com

其他资源

  • 您系统上的 nm-settings (5) 手册页

第 13 章 使用 MACsec 加密同一物理网络中的第 2 层流量

您可以使用 MACsec 来保护两个设备(点到点)之间的通信。例如,您的分支办公室通过城际以太网与中心办公室连接,您可以在连接办公室的两个主机上配置 MACsec,以提高安全性。

13.1. MACsec 如何提高安全性

介质访问控制安全(MACsec)是一种第 2 层协议,它保护以太网链路上的不同流量类型,包括:

  • 动态主机配置协议(DHCP)
  • 地址解析协议(ARP)
  • IPv4 和 IPv6 流量
  • 任何通过 IP 的流量,如 TCP 或 UDP

MACsec 默认使用 GCM-AES-128 算法加密并验证 LAN 中的所有流量,并使用预共享密钥在参与的主机之间建立连接。要更改预共享密钥,您必须更新所有使用 MACsec 的网络主机上的 NM 配置。

MACsec 连接使用以太网设备,如以太网网卡、VLAN 或隧道设备作为父设备。您只能在 MACsec 设备上设置 IP 配置,以便只使用加密连接与其他主机进行通信,或者在父设备上设置 IP 配置。在后者的情况下,您可以使用父设备使用未加密连接和 MACsec 设备加密连接与其他主机通信。

macsec 不需要任何特殊硬件。例如,您可以使用任何交换机,除非您只想在主机和交换机之间加密流量。在这种情况下,交换机还必须支持 MACsec。

换句话说,您可以为两种常见情况配置 MACsec:

  • host-to-host
  • host-to-switch 和 switch-to-other-hosts
重要

您只能在位于同一物理或虚拟 LAN 的主机间使用 MACsec。

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
      2. 创建一个 32 字节的十六进制 CKN:

        # dd if=/dev/urandom count=32 bs=1 2> /dev/null | hexdump -e '1/2 "%04x"'
        f2b4297d39da7330910a74abc0449feb45b5c0b9fc23df1430e1898fcf1c4550
  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

    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'
    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'
  5. 激活连接:

    # nmcli connection up macsec0

验证

  1. 验证流量是否加密:

    # tcpdump -nn -i enp1s0
  2. 可选:显示未加密的流量:

    # tcpdump -nn -i macsec0
  3. 显示 MACsec 统计信息:

    # ip macsec show
  4. 显示每种保护类型的单独的计数器:仅完整性(关闭加密)和加密(打开加密)

    # ip -s macsec show

13.3. 使用 nmstatectl 配置 MACsec 连接

您可以通过 nmstatectl 工具,以声明的方式将以太网接口配置为使用 MACsec。例如,在 YAML 文件中,您可以描述网络所需的状态,假设其在通过以太网连接的两个主机之间有一个 MACsec 连接。nmstatectl 工具解释 YAML 文件,并在主机之间部署持久和一致的网络配置。

使用 MACsec 安全标准保护链路层的通信,也称为 Open Systems Interconnection (OSI)模型的第 2 层,提供以下显著优点:

  • 第 2 层的加密消除了在第 7 层加密单个服务的需要。这减少了管理与每个主机上每个端点的大量证书关联的开销。
  • 直接连接的网络设备(如路由器和交换机)之间的点对点安全性。
  • 不需要对应用程序和高层协议进行更改。

先决条件

  • 服务器配置中存在一个物理或虚拟以太网网络接口控制器(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
    2. 创建一个 32 字节的十六进制 CKN:

      # dd if=/dev/urandom count=32 bs=1 2> /dev/null | hexdump -e '1/2 "%04x"'
      f2b4297d39da7330910a74abc0449feb45b5c0b9fc23df1430e1898fcf1c4550
  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
    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

验证

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

    # nmstatectl show macsec0
  2. 验证流量是否加密:

    # tcpdump -nn -i enp0s1
  3. 可选:显示未加密的流量:

    # tcpdump -nn -i macsec0
  4. 显示 MACsec 统计信息:

    # ip macsec show
  5. 显示每种保护类型的单独的计数器:仅完整性(关闭加密)和加密(打开加密