跳转至

网络使用指南

第1章 网卡接口命名规范

为了便于查找和区分网络接口,确保网络接口的一致性和可见性,OpenCloudOS提供了网络接口的命名规范。

网络接口名称由固定前缀和内核初始化网络设备生成的序列号组成。例如,eth0 代表启动时系统检测到的第一个网络设备,但是这些名称与主机外壳上的标签名不一定相对应。在具有多个网络适配器的服务器上可能会遇到接口命名不明确的的情况,这会影响系统中嵌入的网络适配器和附加适配器。

在OpenCloudOS中,udev 设备管理器支持多种命名方案。在默认情况下,udev 根据固件、拓扑和位置信息为设备分配名称,这样做有以下几个优点:

  • 设备名称完全可预见。
  • 添加或删除硬件不会改变设备名称,因为序列号不会重新生成。
  • 便于有问题的硬件更换。

1.1 网络接口设备命名方案

以下是 udev 设备管理器默认设备命名方案:

方案 描述 示例
1 设备名称包含BIOS索引号或者固件,适用于主板上的设备。此方案不适用时,udev 将使用方案2。 eno1
2 设备名称包含固件或者BIOS提供的PCIe热插件插槽索引号。此方案不适用时,udev 将使用方案3。 ens1
3 设备名称包含硬件连接器的物理位置。此方案不适用时,udev 将使用方案5。 enp2s0
4 设备名称包含MAC地址。OpenCloudOS默认不适用此方案,但管理员可选择性使用它。 enx00ff2420b540
5 传统无法预见的内核命名方案。如果 udev 无法应用任何其他方案,则设备管理器使用这个方案。 eth0

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

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

1.2.网络设备重命名工作方式

默认情况下,OpenCloudOS启用相同的设备命名规则。udev 设备管理器会根据不同的方案来重命名设备。以下列表描述了 udev 处理这些方案的顺序,以及这些规则负责的操作:

  1. /usr/lib/udev/rules.d/60-net.rules 文件定义了 /lib/udev/rename_device 帮助工具搜索 /etc/sysconfig/network-scripts/ifcfg-* 文件中的 HWADDR 参数。当网卡MAC地址与变量设置的值匹配时,帮助工具会将网卡接口重命名为文件的 DEVICE 参数中的名称。

  2. /usr/lib/udev/rules.d/71-biosdevname.rules 文件定义了 biosdevname 工具如果设备在上一步中没有重命名,则根据其命名策略重命名接口。

  3. /usr/lib/udev/rules.d/75-net-description.rules 文件定义了 udev 检查网络接口设备,并在 udev-internal 变量中设置在下一步中将要处理的属性。请注意,其中一些属性可能没有定义。

  4. /usr/lib/udev/rules.d/80-net-setup-link.rules 文件调用内置的 net_setup_link udev ,然后应用重命名方案。以下是存储在 /usr/lib/systemd/network/99-default.link 文件中的默认策略:

    [Link]
    NamePolicy=kernel database onboard slot path
    MACAddressPolicy=persistent
    
    有了这个策略,如果内核使用持久名称,则 udev 不会重命名接口。如果内核不使用持久名称,则 udev 会将接口重命名为 udev 的硬件数据库提供的名称。如果这个数据库不可用,OpenCloudOS 会返回到上述机制中。

    另外,对于基于介质访问控制(MAC)地址的接口名称,将此文件中的 NamePolicy 参数设为 mac。

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

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

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

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

当启用了一致的网络设备名称特性时, udev 设备管理器会根据不同的标准创建设备名称。这部分解释了在 x86_64 平台上安装 OpenCloudOS 时的命名方案。

接口名称以两个字符前缀开始,该前缀基于接口类型: - en 用于以太网 - wl 用于无限LAN(WLAN) - ww 用于无线广域网(WWAN)

另外,以下之一会根据 udev 设备管理器应用的模式,附加到上述前缀中的一个: - o - s[f\][d]

请注意,所有多功能 PCI 设备在设备名称中都包含 [f\] 号, 包括功能 0 设备。 - x - [P\]p\s\[f\][d]

[P\] 部分定义了 PCI 的物理位置。如果域号不是 0 ,才会设置此部分。 - [P\]p\s\[f\][u][…​][c\][i\]

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

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

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

对于通道命令词(CCW)设备,总线 ID 是前缀为 0.n 的设备号 ,其中 n 是子通道集 ID。

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

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

1.5.在安装过程中禁用接口设备命名规范

此节介绍了如何在安装过程中禁用接口设备命名规范。

OpenCloudOS建议不要禁用此规范。禁用接口设备命名规范可能会导致不同类型的问题,例如添加一个网卡后,内核分配的设备名称不会固定下来,每次重启后内核可以用不同的方案来为该网卡命名。

流程: 1. 引导 OpenCloudOS 安装介质 2. 在引导管理器中,选择 Install OpenCloudOS ,然后按 [Tab] 键来编辑该条目。 3. 在内核命令行中追加 net.ifnames=0 参数:

```
vmlinu... net.ifnames=0
```
  1. 按 [Enter] 键开始安装。

1.6.在已安装的系统中禁用接口设备命名规范

此节介绍了如何在已安装的Open Cloud OS系统上禁用接口设备命名规范。

OpenCloudOS建议不要禁用此规范。禁用接口设备命名规范可能会导致不同类型的问题,例如添加一个网卡后,内核分配的设备名称不会固定下来,每次重启后内核可以用不同的方案来为该网卡命名。

前提条件 - 系统已默认使用接口设备命名规范

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

GRUB_CMDLINE_LINUX="... net.ifnames=0"
2. 重建 grub.cfg文件: - 在具有UEFI引导模式的系统上:
# grub2-mkconfig -o /boot/efi/EFI/redhat/grub.cfg
- 在使用旧引导模式的系统:
# grub2-mkconfig -o /boot/grub2/grub.cfg
3. 显示当前的配置文件名称和相关联的设备名称:
# nmcli -f NAME,DEVICE,FILENAME connection show
 NAME           DEVICE  FILENAME
 System enp1s0  enp1s0  /etc/sysconfig/network-scripts/ifcfg-enp1s0
 System enp7s0  enp7s0  /etc/NetworkManager/system-connections/enp7s0.nmconnection
请注意各个设备与哪一个配置文件和文件名称相关联。 4. 从所有连接配置文件中删除 HWADDR 参数:
# sed -i '/^HWADDR=/d' /etc/sysconfig/network-scripts/ifcfg-enp1s0 /etc/NetworkManager/system-connections/enp7s0.nmconnection
5. 显示与以太网设备相关连的 MAC 地址:
# ip link show
...
2: enp1s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP mode DEFAULT group default qlen 1000
     link/ether 00:53:00:c5:98:1c brd ff:ff:ff:ff:ff:ff
3: enp7s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP mode DEFAULT group default qlen 1000
     link/ether 00:53:00:b6:87:c6 brd ff:ff:ff:ff:ff:ff
6. 重启主机:
# reboot
7. 重启后,显示以太网设备,并根据 MAC 地址识别新的接口名称:
# ip link show
 ...
 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP mode DEFAULT group default qlen 1000
     link/ether 00:53:00:b6:87:c6 brd ff:ff:ff:ff:ff:ff
 3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP mode DEFAULT group default qlen 1000
     link/ether 00:53:00:c5:98:1c brd ff:ff:ff:ff:ff:ff
如果您将当前输出与上一个输出进行比较: - 接口 enp7s0 ( MAC 地址 00:53:00:b6:87:c6 ) 现在被命名为 eth0 。 - 接口 enp1s0 ( MAC 地址 00:53:00:c5:98:1c ) 现在被命名为 eth1 。 8. 重命名配置文件:
# mv /etc/NetworkManager/system-connections/enp7s0.nmconnection /etc/NetworkManager/system-connections/eth0.nmconnection
# mv /etc/sysconfig/network-scripts/ifcfg-enp1s0 /etc/sysconfig/network-scripts/ifcfg-eth1
9. 重新载入NetworkManager:
# nmcli connetction reload
10. 如果在配置文件中没有设置文件名称,NetworkManager将使用默认值。要在重命名并重新载入连接后确定当前的配置文件名称,请使用以下命令:
# nmcli -f NAME,DEVICE,FILENAME connection show
NAME           FILENAME
System enp7s0  /etc/NetworkManager/system-connections/eth0.nmconnection
System enp1s0  /etc/sysconfig/network-scripts/ifcfg-eth1
在下一步中配置文件名称。 11. 重命名NetworkManager连接配置文件,并更新每个配置文件中的接口名称:
# nmcli connection modify "System enp7s0" connection.id eth0 connection.interface-name eth0
# nmcli connection modify "System enp1s0" connection.id eth1 connection.interface-name eth1
12. 重新激活NetworkManager连接:
# nmcli connection up eth0
# nmcli connection up eth1

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

本节介绍了如何在Open Cloud OS安装过程中自定义以太网接口名称的前缀。

暂不支持在已安装的系统上使用 prefixdevname 工具自定义前缀。

在Open Cloud OS安装后,udev 服务会将以太网设备命名为 \.\的格式。例如,如果您希望使用 net 作为前缀,那么Open Cloud OS会将以太网接口命名为 net0 , net1 ,等等。

前提条件

  • 要设置的前缀格式要求如下:
  • 由ASCII字符组成
  • 仅有字母和数字组成
  • 小于16个字符
  • 不与任何已有的网络接口前缀冲突,如 eth 、 eno 、 ens 和 em 。

流程

  1. 引导Open Cloud OS安装介质。
  2. 在引导管理器中:
  3. 选择 Install Open CLoud OS\ 选项,然后按 [Tab] 键编辑选项。
  4. 将 net.ifnames.prefix=\ 追加到内核选项中。
  5. 按 [Enter] 键启动安装程序。
  6. 安装Open Cloud OS。

验证

  • 安装后,显示以太网接口:
    # ip link show
      ...
      2: net0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP mode DEFAULT group default qlen 1000
          link/ether 00:53:00:c5:98:1c brd ff:ff:ff:ff:ff:ff
      3: net1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP mode DEFAULT group default qlen 1000
          link/ether 00:53:00:c2:39:9e brd ff:ff:ff:ff:ff:ff
      ...
    

1.8.使用 udev 设备管理器分配自定义的网络接口名称

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

流程

  1. 显示所有网络接口及其 MAC 地址: ``` # ip link list

    enp6s0f0: mtu 1500 qdisc fq_codel state UP mode DEFAULT group default qlen 1000 link/ether b4:96:91:14:ae:58 brd ff:ff:ff:ff:ff:ff enp6s0f1: mtu 1500 qdisc fq_codel state UP mode DEFAULT group default qlen 1000 link/ether b4:96:91:14:ae:5a brd ff:ff:ff:ff:ff:ff enp4s0f0: mtu 1500 qdisc fq_codel state UP mode DEFAULT group default qlen 1000 link/ether 00:90:fa:6a:7d:90 brd ff:ff:ff:ff:ff:ff ``` 2. 创建具有以下内容的文件 /etc/udev/rules.d/70-custom-ifnames.rules :

    SUBSYSTEM=="net",ACTION=="add",ATTR{address}=="b4:96:91:14:ae:58",ATTR{type}=="1",NAME="provider0"
    SUBSYSTEM=="net",ACTION=="add",ATTR{address}=="b4:96:91:14:ae:5a",ATTR{type}=="1",NAME="provider1"
    SUBSYSTEM=="net",ACTION=="add",ATTR{address}=="00:90:fa:6a:7d:90",ATTR{type}=="1",NAME="provider2"
    
    这些规则与网络接口的 MAC 地址相匹配,并将它们重命名为 NAME 属性中指定的名称。在这些示例中, ATTR{type} 参数值设置为1定义了接口类型为 Ethernet 。

验证

  1. 重启系统:
    # reboot
    
  2. 验证每个 MAC 地址的接口名称是否与您在规则文件中的 NAME 参数中设置的值相匹配:
    # ip link show
    
    provider0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP mode DEFAULT group default qlen 1000
        link/ether b4:96:91:14:ae:58 brd ff:ff:ff:ff:ff:ff
    altname enp6s0f0
    provider1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP mode DEFAULT group default qlen 1000
        link/ether b4:96:91:14:ae:5a brd ff:ff:ff:ff:ff:ff
        altname enp6s0f1
    provider2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP mode DEFAULT group default qlen 1000
        link/ether 00:90:fa:6a:7d:90 brd ff:ff:ff:ff:ff:ff
        altname enp4s0f0
    

1.9.使用 systemd 链接文件分配用户定义的网络接口名称

通过将网络接口重命名为 provider0 来创建一个命名方案。

流程

  1. 显示所有接口名称及其 MAC 地址:
    # ip link show
    
    enp6s0f0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP mode DEFAULT group default qlen 1000
        link/ether b4:96:91:14:ae:58 brd ff:ff:ff:ff:ff:ff
    enp6s0f1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP mode DEFAULT group default qlen 1000
        link/ether b4:96:91:14:ae:5a brd ff:ff:ff:ff:ff:ff
    enp4s0f0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP mode DEFAULT group default qlen 1000
        link/ether 00:90:fa:6a:7d:90 brd ff:ff:ff:ff:ff:ff
    
  2. 将 MAC 地址为 b4:96:91:14:ae:58 的接口命名为 provider0 ,需要创建 /etc/systemd/network/70-custom-ifnames.link 文件并包含以下内容:
    [Match]
    MACAddress=b4:96:91:14:ae:58
    
    [Link]
    Name=provider0
    
    此链接文件与 MAC 地址相匹配,并将网络接口重命名为 Name 参数中设置的名称。

验证

  1. 重启系统:
    # reboot
    
  2. 验证 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 b4:96:91:14:ae:58 brd ff:ff:ff:ff:ff:ff
    

第2章 NetworkManager 入门

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

2.1.NetworkManager的优点

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

2.2.NetworkManager管理连接的工具与程序概述

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

2.3.将手动配置的 ifcfg 文件加载到NetworkManager中

在 Open Cloud OS 中,如果您编辑了 ifcfg 文件,NetworkManager 不会自动获取该更改。如果您使用其中一个工具更新 NetworkManager 配置集设置,NetworkManager 不会实现这些更改,除非您使用该配置集重新连接。例如,如果使用编辑器修改了配置文件,NetworkManager 必须再次读取配置文件。

NetworkManager 支持以 keyfile 格式存储的配置集。但是,当使用 NetworkManager API 创建或更新配置文件时,NetworkManager 默认使用 ifcfg 格式。

/etc/sysconfig/ 目录是配置文件和脚本的位置。除 VPN、移动宽带和 PPPoE 配置外,大多数网络配置信息都存储在 /etc/NetworkManager/ 子目录中。例如,特定于接口的信息存储在 /etc/sysconfig/network-scripts/ 目录下的 ifcfg 文件中。

VPN、移动宽带和 PPPoE 连接的信息存储在 /etc/NetworkManager/system-connections/ 中。

流程

  1. 要载入新的配置文件:
    # nmcli connection load /etc/sysconfig/network-scripts/ifcfg-connection_name
    
  2. 如果您更新了已载入到NetworkManager中的连接文件,请输入:
    # nmcli connection up connection_name
    

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

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

3.1.配置永久非受管设备

您可以根据几个标准,将设备配置为 unmanaged ,如接口名称、MAC 地址或设备类型。以下流程描述了如何在 NetworkManager 中将 enp1s0 接口永久设置为 unmanaged 。

流程

  1. 可选:显示设备列表,以便识别您要将其设置为 unmanaged 的设备:
    # nmcli device status
    DEVICE  TYPE      STATE         CONNECTION
    enp1s0  ethernet  disconnected  --
    ...
    
  2. 创建 /etc/NetworkManager/conf.d/99-unmanaged-devices.conf 文件:
    [keyfile]
    unmanaged-devices=interface-name:enp1s0
    
    要将多个设备设置为非受管,请使用分号分隔 unmanaged-devices 参数中的条目:
    [keyfile]
    unmanaged-devices=interface-name:interface_1;interface-name:interface_2;...
    
  3. 重新载入NetworkManager服务:
    # systemctl reload NetworkManager
    

验证

  • 显示设备列表:
    # nmcli device status
    DEVICE  TYPE      STATE      CONNECTION
    enp1s0  ethernet  unmanaged  --
    ...
    
    enp1s0 设备旁边的 unmanaged 状态表示 NetworkManager 没有管理该设备。

3.2.配置临时非受管设备

您可以根据几个标准,将设备配置为 unmanaged,如接口名称、MAC 地址或设备类型。这个流程描述了如何在 NetworkManager 中临时将 enp1s0 接口设置为 unmanaged 。

流程

  1. 可选:显示设备列表,以便识别您要将其设置为 unmanaged 的设备:
    # nmcli device status
    DEVICE  TYPE      STATE         CONNECTION
    enp1s0  ethernet  disconnected  --
    ...
    
  2. 将 enp1s0 设备设置为 unmanaged 状态:
    # nmcli device set enp1s0 managed no
    

验证

  • 显示设备列表:
    # nmcli device status
    DEVICE  TYPE      STATE      CONNECTION
    enp1s0  ethernet  unmanaged  --
    ...
    
    enp1s0 设备旁边的 unmanaged 状态表示 NetworkManager 没有管理该设备。

第4章 使用nmtui文本界面管理网络连接

4.1.启动nmtui工具

前提条件

  • 已安装 NetworkManager-tui 软件包

流程

  1. 启动 nmtui ,在命令行输入:
    # nmtui
    
    nmtui启动界面
  2. 进入 nmtui:
    • 在选项中,使用光标或按[Tab]键前进,按[Shift]+[Tab]后退。
    • 使用[Enter]选择一个选项。
    • 使用[Space]切换复选框状态。

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

前提条件

  • 已安装 NetworkManager-tui 软件包

流程

  1. 启动 nmtui ,在命令行输入:
    # nmtui
    
  2. 选择 Edit a connection 选项,按[Enter]进入编辑。
  3. 选择[Add]选项,按[Enter]进入。
  4. 选择 Ethernet ,按[Enter]边界 nmtui添加新连接
  5. 输入连接详情信息。 nmtui连接配置详情
  6. 选择[OK]保存更改。
  7. 选择 Back 返回主菜单。
  8. 选择 Activate a connection 并选择[Enter]。
  9. 选择新的连接,点[Enter]键激活连接。
  10. 选择[Back]返回主菜单。
  11. 选择 Quit 。

验证

  1. 显示设备和连接状态:
    # nmcli device status
    DEVICE      TYPE      STATE      CONNECTION
    ens3      ethernet  connected  ens3
    
  2. 显示连接配置集的所有设置:
    # nmcli connection show ens3
    connection.id:                          ens3
    connection.uuid:                        f46c8406-74f4-458f-a884-a1889377aebc
    connection.stable-id:                   --
    connection.type:                        802-3-ethernet
    connection.interface-name:              ens3
    connection.autoconnect:                 yes
    connection.autoconnect-priority:        0
    ...
    
    注意,如果磁盘中的配置与设备中的配置不匹配,则启动或重启 NetworkManager 会创建一个代表该设备的配置的内存连接。

4.3.使用nmtui应用更改连接

在 nmtui 中修改了连接后,您必须重新激活连接。请注意,在 nmtui 中重新激活连接会临时停用连接。

前提条件

  • 连接配置文件未启用 auto-connect 设置。

流程

  1. 主菜单选择 Activate a connection 选项: nmtui修改连接_1
  2. 选择修改的连接。
  3. 在右侧,选择 Deactivate 按钮,然后按[Enter]键: nmtui修改连接_2
  4. 再次选择连接。
  5. 在右侧,选择 Activate 按钮,然后按[Enter]键: nmtui修改连接_3

第5章 nmcli 入门

5.1.不同格式的nmcli输出

nmcli 工具支持通过不同的参数控制命令的输出。通过使用这些选项,您可以只显示所需的信息。这简化了处理脚本中输出的过程。

默认情况下,nmcli 以类似于表格的格式显示其输出:

# nmcli device
DEVICE      TYPE      STATE                   CONNECTION
ens3        ethernet  connected               ens3
virbr0      bridge    connected (externally)  virbr0
lo          loopback  unmanaged               --
virbr0-nic  tun       unmanaged               --

使用 -f 参数,您可以按自定义的顺序显示列,例如:

# nmcli -f DEVICE,STATE device
DEVICE      STATE
ens3        connected
virbr0      connected (externally)
lo          unmanaged
virbr0-nic  unmanaged

使用 -t 参数以冒号分隔的形式显示输出每个字段:

# nmcli -t device
ens3:ethernet:connected:ens3
virbr0:bridge:connected (externally):virbr0
lo:loopback:unmanaged:
virbr0-nic:tun:unmanaged:

当您使用脚本来处理输出时,将 -f 和 -t 组合,可以只显示冒号分隔形式的特定字段:

# nmcli -f DEVICE,STATE -t device
ens3:connected
virbr0:connected (externally)
lo:unmanaged
virbr0-nic:unmanaged

5.2.使用tab键自动补全nmcli命令

如果您的主机上安装了 bash-completion 软件包,则 nmcli 工具将支持选项卡补全功能。这可让您自动完成选项名称,并识别可能的选项和值。

例如,如果您输入 nmcli con ,并按 Tab 键,则 shell 会自动补全命令 nmcli connection。

您所输入的选项或值必须是唯一的。如果它不唯一,则 nmcli 会显示所有可能的选项。例如,如果您输入 nmcli connection d ,并按 Tab ,则命令将显示命令 delete 和 down 来作为可能的选项。

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

5.3.常用的nmcli命令

  • 显示连接配置集列表:

    # nmcli connection show
    NAME    UUID                                  TYPE      DEVICE
    ens3    f46c8406-74f4-458f-a884-a1889377aebc  ethernet  ens3
    

  • 显示指定连接的配置:

    # nmcli connection show CONNECTION-NAME
    connection.id:                          ens3
    connection.uuid:                        f46c8406-74f4-458f-a884-a1889377aebc
    connection.stable-id:                   --
    connection.type:                        802-3-ethernet
    connection.interface-name:              ens3
    connection.autoconnect:                 yes
    ...
    

  • 修改连接属性:

    nmcli connection modify CONNECTION-NAME PROPERTY VALUE
    
    支持使用了多个 PROPERTY VALUE 组合同时修改多个属性。

  • 显示网络设备、状态、类型和连接集列表:

    # nmcli device
    DEVICE      TYPE      STATE                   CONNECTION
    ens3        ethernet  connected               ens3
    ...
    

  • 激活连接:

    # nmcli connection up CONNECTION-NAME
    

  • 取消激活连接:

    # nmcli connection down CONNECTION-NAME
    

第6章 使用GNOME GUI配置网络入门

您可以在 GNOME 中使用以下方法管理和配置网络连接:

  • 桌面右上角的 GNOME Shell 网络连接图标
  • GNOME control-center 应用程序
  • GNOME nm-connection-editor 应用程序

6.1.通过桌面图标管理网络连接

前提条件

  • GNOME 软件包组已安装。
  • 您已登录到 GNOME。
  • 如果网络需要特定的配置,如静态 IP 地址或 802.1x 配置,则需要已创建了连接配置集。

流程

  1. 点击桌面右上角的网络连接图标。

    GNOME配置网络_1

  2. 根据连接类型,选择 Wired 或 Wi-Fi 。

    GNOME配置网络_2

  3. 对于有线连接,请选择 Connect 来连接到网络。

  4. 对于 Wi-Fi 连接,点击 Select network,选择您要连接的网络,然后输入密码

第7章 Nmstate简介

nmstate 是一个声明式的网络管理工具。 nmstate 软件提供 libnmstate Python库,以及用于管理NetworkManager的命令行工具 nmstatectl 。使用 Nmstate 时,您可以使用 YAML 或 JSON 格式的说明描述预期的网络状态。

使用Nmstate的优点: - 提供稳定且可扩展的接口来管理 OpenCLoudOS 网络功能 - 支持主机和集群级别的原子和事务操作 - 支持对大多数属性进行部分编辑,并保留未在说明中指定的现有设置 - 提供插件支持,使管理员能够使用自己的插件

7.1.在Python程序中使用libnmstate库

libnmstate Python 库可让开发人员在他们自己的应用程序中使用 Nmstate

要使用库,请在源代码中导入它: ```python import libnmstate

请注意,您必须先安装 nmstate 软件包才能使用这个库。

案例:使用 libnmstate 库查询网络状态

下面的代码导入了 libnmstate 库,并显示可用的网络接口及其状态:

```python
import json
import libnmstate
from libnmstate.schema import Interface

net_state = libnmstate.show()
for iface_state in net_state[Interface.KEY]:
    print(iface_state[Interface.NAME] + ": "
        + iface_state[Interface.STATE])

7.2.使用nmstatectl更新网络配置

您可以使用 nmstatectl 工具将一个或多个接口的当前网络配置存储在一个文件中。然后您可以使用此文件:

  • 修改配置并将其应用到同一系统。
  • 将文件复制到其他主机上,并使用相同的或经过修改的设置配置主机。

下面介绍了如何将 ens3 接口的设置导出到文件中,修改配置,并在主机上应用设置。

前提条件

  • nmstate 软件包已安装。

流程

  1. 将 ens3 接口的设置导出到 ~/network-config.yml 文件:

    # nmstatectl show ens3 > ~/network-config.yml
    
    此命令会以 YAML 格式存储 ens3 的配置。要以 JSON 格式存储输出,请将 --json 选项传给命令。

    如果没有指定接口名称,nmstatectl 将导出所有接口的配置。 2. 使用文本编辑器修改 ~/network-config.yml 文件,以更新配置。 3. 应用 ~/network-config.yml 文件中的设置:

    # nmstatectl apply ~/network-config.yml
    
    如果您以 JSON 格式导出设置,请将 --json 选项传给命令。

7.3.其他

/usr/share/doc/nmstate/README.md
/usr/share/doc/nmstate/examples/

第8章 配置以太网连接

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

流程

  1. 添加新的NetworkManager网络连接配置集:
    # nmcli connection add con-name test-con ifname ens4 type ethernet
    
    修改 test-con 为您需要的网络连接配置集。
  2. 设置IPv4地址:
    # nmcli connection modify test-con ipv4.addresses 192.128.1.1/24
    
  3. 设置IPv6地址:
    #  nmcli connection modify test-con ipv6.addresses AD80::ABAA:0000:00C2:0002/64
    
  4. 将 IPv4 和 IPv6 连接方法设置为 manual:
    #  nmcli connection modify test-con ipv6.method manual
    #  nmcli connection modify test-con ipv4.method manual
    
  5. 设置 IPv4 和 IPv6 默认网关:
    #  nmcli connection modify test-con ipv4.gateway 192.128.1.254
    #  nmcli connection modify test-con ipv6.gateway AD80::ABAA:0000:00C2:FFFE
    
  6. 设置 IPv4 和 IPv6 DNS 服务器地址:
    #  nmcli connection modify test-con ipv6.dns "AD80::ABAA:0000:00C2:0001"
    #  nmcli connection modify test-con ipv4.dns "114.114.114.114"
    
  7. 为 IPv4 和 IPv6 连接设置 DNS 搜索域:
    #  nmcli connection modify test-con ipv4.dns-search test.com
    #  nmcli connection modify test-con ipv6.dns-search test.com
    
  8. 激活连接配置集:
    # nmcli connection up test-con
    

验证

  1. 显示设备和连接的状态:
    # nmcli device status
    DEVICE      TYPE      STATE      CONNECTION
    ens4      ethernet  connected  test-con
    
  2. 显示网络连接配置集所有设置:
    # nmcli connection show test-con
    connection.id:              test-con
    connection.uuid:            b6cdfa1c-e4ad-46e5-af8b-a75f06b79f76
    connection.stable-id:       --
    connection.type:            802-3-ethernet
    connection.interface-name:  ens4
    ...
    
  3. 使用 ping 命令验证网络连通性:
  4. 同一子网: IPv4:

    # ping 192.128.1.3
    
    IPv6:
    # ping AD80::ABAA:0000:00C2:0005
    
    如果命令失败,请检查IP和子网设置。

  5. 远程子网: IPv4:

    # ping 192.168.1.3
    
    IPv6:
    # ping AD80::ABAA:0000:00C3:0005
    
    - 如果命令失败,先 ping 默认网关验证设置。 IPv4:
    # ping 192.128.1.254
    
    IPv6:
    # ping AD80::ABAA:0000:00C2:FFFE
    

  6. 使用 host 命令验证域名解析是否正常:
    # host client.test.com
    
    如果命令返回任何错误,如 connection timed out 或 no servers could be reached,请验证您的 DNS 设置。

故障排除步骤 如果连接失败,或者网络接口在上线和关闭状态间切换:

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

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

流程

  1. 以互动模式添加 NetworkManager 网络连接配置集:
    # nmcli connection edit type ethernet con-name test-con
    
  2. 设置网络接口:
    nmcli> set connection.interface-name ens4
    
  3. 设置IPv4地址:
    nmcli> set ipv4.addresses 192.128.1.1/24
    
  4. 设置IPv6地址:
    nmcli> set ipv6.addresses AD80::ABAA:0000:00C2:0002/64
    
  5. 将 IPv4 和 IPv6 连接方法设置为 manual:
    nmcli> set ipv4.method manual
    nmcli> set ipv6.method manual
    
  6. 设置 IPv4 和 IPv6 默认网关:
    nmcli> set ipv4.gateway 192.128.1.254
    nmcli> set ipv6.gateway AD80::ABAA:0000:00C2:FFFE
    
  7. 设置 IPv4 和 IPv6 DNS 服务器地址:
    nmcli> set ipv4.dns 114.114.114.114
    nmcli> set ipv6.dns AD80::ABAA:0000:00C2:0001
    
    要设置多个 DNS 服务器,以空格分隔并用引号括起来。
  8. 为 IPv4 和 IPv6 连接设置 DNS 搜索域:
    nmcli> set ipv4.dns-search example.com
    nmcli> set ipv6.dns-search example.com
    
  9. 保存并激活连接:

    nmcli> save persistent
    Saving the connection with 'autoconnect=yes'. That might result in an immediate activation of the connection.
    Do you still want to save? (yes/no) [yes] yes
    

  10. 退出互动模式:

    nmcli> quit
    

验证

  1. 显示设备和连接的状态:
    # nmcli device status
    DEVICE      TYPE      STATE      CONNECTION
    ens4      ethernet  connected  test-con
    
  2. 显示网络连接配置集所有设置:
    # nmcli connection show test-con
    connection.id:              test-con
    connection.uuid:            b6cdfa1c-e4ad-46e5-af8b-a75f06b79f76
    connection.stable-id:       --
    connection.type:            802-3-ethernet
    connection.interface-name:  ens4
    ...
    
  3. 使用 ping 命令验证网络连通性:
  4. 同一子网: IPv4:

    # ping 192.128.1.3
    
    IPv6:
    # ping AD80::ABAA:0000:00C2:0005
    
    如果命令失败,请检查IP和子网设置。

  5. 远程子网: IPv4:

    # ping 192.168.1.3
    
    IPv6:
    # ping AD80::ABAA:0000:00C3:0005
    
    - 如果命令失败,先 ping 默认网关验证设置。 IPv4:
    # ping 192.128.1.254
    
    IPv6:
    # ping AD80::ABAA:0000:00C2:FFFE
    

  6. 使用 host 命令验证域名解析是否正常:
    # host client.test.com
    
    如果命令返回任何错误,如 connection timed out 或 no servers could be reached,请验证您的 DNS 设置。

故障排除步骤 如果连接失败,或者网络接口在上线和关闭状态间切换:

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

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

前提条件

  • 已安装 nmstate 。

流程

  1. 创建一个 YAML 文件 ~/create-ethernet-profile.yml 包含以下内容:
    ---
    dns-resolver:
    config:
        search: []
        server:
        - 114.114.114.114
    route-rules:
    config: []
    routes:
    config:
    - destination: 0.0.0.0/0
        metric: 100
        next-hop-address: 192.168.128.1
        next-hop-interface: ens3
        table-id: 254
    interfaces:
    - name: ens3
    type: ethernet
    state: up
    accept-all-mac-addresses: false
    ipv4:
        enabled: true
        address:
      - ip: 192.168.133.95
        prefix-length: 20
      dhcp: false
    ipv6:
      enabled: true
      address:
      - ip: fe80::f816:3eff:fec6:ce86
        prefix-length: 64
      auto-dns: true
      auto-gateway: true
      auto-route-table-id: 0
      auto-routes: true
      autoconf: true
      dhcp: true
    
  2. 将配置应用到系统:
    # nmstatectl apply ~/create-ethernet-profile.yml
    

验证

  1. 显示设备和连接的状态:
    # nmcli device status
    DEVICE      TYPE      STATE      CONNECTION
    ens3      ethernet  connected  ens3
    
  2. 显示连接配置集的所有设置:
    # nmcli connection show ens3
    connection.id:              ens3
    connection.uuid:            b6cdfa1c-e4ad-46e5-af8b-a75f06b79f76
    connection.stable-id:       --
    connection.type:            802-3-ethernet
    connection.interface-name:  ens3
    ...
    
  3. 以 YAML 格式显示连接设置:
    # nmstatectl show ens3
    

8.4.使用rhel-ssystem-roles配置带有接口名称的静态以太网连接

前提条件

  • 已安装 rhel-system-roles 和 ansible 。
  • 如果您在运行 playbook 时使用了非 root 用户,则要求该用户拥有 sudo 权限。
  • 主机使用 NetworkManager 配置网络。

流程

  1. 将主机IP或名称添加到/etc/ansible/hosts Ansible 清单文件中:

    node.example.com
    

  2. 创建playbook ~/ethernet-static-IP.yml:

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

  3. 运行playbook:

    • 通过 root 用户身份连接到受管主机,请输入:
      # ansible-playbook -u root ~/ethernet-static-IP.yml
      
    • 通过用户身份连接到受管主机,请输入:
      # ansible-playbook -u user_name --ask-become-pass ~/ethernet-static-IP.yml
      
      --ask-become-pass 选项确保 ansible-playbook 命令提示输入 -u user_name 选项中定义的用户的 sudo 密码。

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

8.5.使用rhel-ssystem-roles配置带有设备路径的静态以太网连接

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

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

前提条件

  • 已安装 rhel-system-roles 和 ansible 。
  • 如果您在运行 playbook 时使用了非 root 用户,则要求该用户拥有 sudo 权限。
  • 主机使用 NetworkManager 配置网络。

流程

  1. 将主机IP或名称添加到/etc/ansible/hosts Ansible 清单文件中:

    node.example.com
    

  2. 创建playbook ~/ethernet-dynamic-IP.yml 包含以下内容:

    ---
      - name: Configure an Ethernet connection with dynamic IP
      hosts: node.example.com
      become: true
      tasks:
      - include_role:
         name: rhel-system-roles.network
    
       vars:
         network_connections:
           - name: example
             match:
               path:
                 - pci-0000:00:0[1-3].0
                 - &!pci-0000:00:02.0
             type: ethernet
             autoconnect: yes
             ip:
               address:
                 - 192.0.2.1/24
                 - 2001:db8:1::1/64
               gateway4: 192.0.2.254
               gateway6: 2001:db8:1::fffe
               dns:
                 - 192.0.2.200
                 - 2001:db8:1::ffbb
               dns_search:
                 - example.com
             state: up
    
    本例中的 match 参数定义了 Ansible 将脚本应用到与 PCI ID 0000:00:0[1-3].0 匹配的设备,但没有 0000:00:02.0 设备。有关可以使用的特殊修饰符和通配符的详情,请查看 /usr/share/ansible/roles/rhel-system-roles.network/README.md 文件中的 match 参数描述。

  3. 运行playbook:

    • 通过 root 用户身份连接到受管主机,请输入:
      # ansible-playbook -u root ~/ethernet-dynamic-IP.yml
      
    • 通过用户身份连接到受管主机,请输入:
      # ansible-playbook -u user_name --ask-become-pass ~/ethernet-dynamic-IP.yml
      
      --ask-become-pass 选项确保 ansible-playbook 命令提示输入 -u user_name 选项中定义的用户的 sudo 密码。

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

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

前提条件

  • 网络中有DHCP服务器

流程

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

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

  2. (可选)在使用 Example-Connection 配置文件时,更改 NetworkManager 发送给 DHCP 服务器的主机名:

    # nmcli connection modify Example-Connection ipv4.dhcp-hostname Example ipv6.dhcp-hostname Example
    

  3. (可选)在使用 Example-Connection 配置文件时,更改 NetworkManager 发送给 IPv4 DHCP 服务器的客户端 ID:

    # nmcli connection modify Example-Connection ipv4.dhcp-client-id client-ID
    
    请注意,对于 IPv6 ,没有 dhcp-client-id 参数。要为 IPv6 创建一个标识符,请配置 dhclient 服务。

验证

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

    # nmcli device status
    DEVICE      TYPE      STATE      CONNECTION
    enp7s0      ethernet  connected  Example-Connection
    

  2. 显示连接配置集的所有设置:

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

  3. 使用 ping 程序来验证网络连通性。

    • 查找同一子网中的 IP 地址。 IPv4:
      # ping 192.0.2.3
      
      IPv6:
      # ping 2001:db8:1::2
      
    • 在远程子网中查找 IP 地址。 IPv4:
      # ping 192.0.2.3
      
      IPv6:
      # ping 2001:db8:2::1
      
      • 如果命令失败,则使用 ping 默认网关来验证设置。 IPv4:
        # ping 192.0.2.254
        
        IPv6:
        # ping 2001:db8:1::fff3
        
  4. 使用 host 命令验证域名解析是否正常:

    # host client.test.com
    
    如果命令错误,如 connection timed out 或 no servers could be reached,请验证您的 DNS 设置。

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

前提条件

  • 网络中有 DHCP 服务器。

流程

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

    # nmcli connection edit type ethernet con-name Example-Connection
    

  2. 设置网络接口:

    nmcli> set connection.interface-name enp7s0
    

  3. (可选)在使用 Example-Connection 配置文件时,更改 NetworkManager 发送给 DHCP 服务器的主机名:

    nmcli> set ipv4.dhcp-hostname Example
    nmcli> set ipv6.dhcp-hostname Example
    

  4. (可选)在使用 Example-Connection 配置文件时,更改 NetworkManager 发送给 IPv4 DHCP 服务器的客户端 ID:

    nmcli> set ipv4.dhcp-client-id client-ID
    
    请注意,对于 IPv6 ,没有 dhcp-client-id 参数。要为 IPv6 创建一个标识符,请配置 dhclient 服务。

  5. 保存并激活连接:

    nmcli> save persistent
    Saving the connection with 'autoconnect=yes'. That might result in an immediate activation of the connection.
    Do you still want to save? (yes/no) [yes] yes
    

  6. 保存并退出互动模式:

    nmcli> quit
    

验证

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

    # nmcli device status
    DEVICE      TYPE      STATE      CONNECTION
    enp7s0      ethernet  connected  Example-Connection
    

  2. 显示连接配置集的所有设置:

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

  3. 使用 ping 程序来验证网络连通性。

    • 查找同一子网中的 IP 地址。 IPv4:
      # ping 192.0.2.3
      
      IPv6:
      # ping 2001:db8:1::2
      
    • 在远程子网中查找 IP 地址。 IPv4:
      # ping 192.0.2.3
      
      IPv6:
      # ping 2001:db8:2::1
      
      • 如果命令失败,则使用 ping 默认网关来验证设置。 IPv4:
        # ping 192.0.2.254
        
        IPv6:
        # ping 2001:db8:1::fff3
        
  4. 使用 host 命令验证域名解析是否正常:

    # host client.test.com
    
    如果命令错误,如 connection timed out 或 no servers could be reached,请验证您的 DNS 设置。

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

本节介绍了如何使用 nmstatectl 工具为 enp7s0 设备添加动态以太网连接。在这个过程中的设置中,NetworkManager 从 DHCP 服务器请求此连接的 IP 设置。

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

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

前提条件

  • 已安装 nmstate 软件。

流程

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

    ---
    interfaces:
    - name: enp7s0
    type: ethernet
    state: up
    ipv4:
        enabled: true
        auto-dns: true
        auto-gateway: true
        auto-routes: true
        dhcp: true
    ipv6:
        enabled: true
        auto-dns: true
        auto-gateway: true
        auto-routes: true
        autoconf: true
        dhcp: true
    

  2. 将配置应用到系统:

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

验证

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

    # nmcli device status
    DEVICE      TYPE      STATE      CONNECTION
    enp7s0      ethernet  connected  enp7s0
    

  2. 显示连接配置集的所有设置:

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

  3. 以 YAML 格式显示连接设置:

    # nmstatectl show enp7s0
    

8.9.使用带有接口名称的 rhel-system-roles 配置动态以太网连接

前提条件

  • 网络中有 DHCP 服务器。
  • ansible 和 rhel-system-roles 软件包已安装在控制节点上。
  • 如果您在运行 playbook 时使用了非 root 用户,则要求该用户拥有 sudo 权限。
  • 主机使用 NetworkManager 配置网络。

流程

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

    node.example.com
    

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

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

  3. 运行playbook:

    • 通过 root 用户身份连接到受管主机,请输入:
      # ansible-playbook -u root ~/ethernet-dynamic-IP.yml
      
    • 通过用户身份连接到受管主机,请输入:
      # ansible-playbook -u user_name --ask-become-pass ~/ethernet-dynamic-IP.yml
      
      --ask-become-pass 选项确保 ansible-playbook 命令提示输入 -u user_name 选项中定义的用户的 sudo 密码。

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

8.10.使用 rhel-system-roles 配置带有设备路径的动态以太网连接

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

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

前提条件

  • 网络中有 DHCP 服务器。
  • ansible 和 rhel-system-roles 软件包已安装在控制节点上。
  • 如果您在运行 playbook 时使用了非 root 用户,则要求该用户拥有 sudo 权限。
  • 主机使用 NetworkManager 配置网络。

流程

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

    node.example.com
    

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

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

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

  3. 运行playbook:

    • 通过 root 用户身份连接到受管主机,请输入:
      # ansible-playbook -u root ~/ethernet-dynamic-IP.yml
      
    • 通过用户身份连接到受管主机,请输入:
      # ansible-playbook -u user_name --ask-become-pass ~/ethernet-dynamic-IP.yml
      
      --ask-become-pass 选项确保 ansible-playbook 命令提示输入 -u user_name 选项中定义的用户的 sudo 密码。

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

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

本节介绍了如何在 GNOME control-center 中配置以太网连接。 请注意,control-center 不支持与 nm-connection-editor 应用程序或 nmcli 命令一样多的配置选项。

前提条件

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

流程

  1. 进入 Settings 。
  2. 在左侧导航中选择 Network。
  3. 点击 Wired 条目旁边的 + 按钮来创建新配置文件。
  4. 可选:在 Identity 选项卡中为连接设置名称。
  5. 在 IPv4 选项卡中,配置 IPv4 设置。例如,选择配置方式 Manual,设置静态 IPv4 地址、网络掩码、默认网关和 DNS 服务器: control-center配置网络_1
  6. 在 IPv6 选项卡中,配置 IPv6 设置。例如,选择方法 Manual,设置静态 IPv6 地址、网络掩码、默认网关和 DNS 服务器: control-center配置网络_2
  7. 点 Add 按钮保存连接。GNOME control-center 会自动激活连接。

验证

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

    # nmcli device status
    DEVICE      TYPE      STATE      CONNECTION
    enp7s0      ethernet  connected  Example-Connection
    

  2. 显示连接配置集的所有设置:

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

  3. 使用 ping 程序来验证网络连通性。

    • 查找同一子网中的 IP 地址。 IPv4:
      # ping 192.0.2.3
      
      IPv6:
      # ping 2001:db8:1::2
      
    • 在远程子网中查找 IP 地址。 IPv4:
      # ping 192.0.2.3
      
      IPv6:
      # ping 2001:db8:2::1
      
      • 如果命令失败,则使用 ping 默认网关来验证设置。 IPv4:
        # ping 192.0.2.254
        
        IPv6:
        # ping 2001:db8:1::fff3
        
  4. 使用 host 命令验证域名解析是否正常:

    # host client.test.com
    
    如果命令错误,如 connection timed out 或 no servers could be reached,请验证您的 DNS 设置。

故障排除步骤 如果连接失败,或者网络接口在上线和关闭状态间切换:

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

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

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

流程

  1. 在终端输入:
    $ nm-connection-editor
    
  2. 点 [+] 按钮添加新连接。
  3. 选择 Ethernet 类型,然后单击 [Create]。
  4. 在 General 选项卡中:
  5. 要在系统启动时或者重启 NetworkManager 服务时自动启用此连接:
    1. 选择 Connect automatically with priority 。
    2. 可选:更改 Connect automatically with priority 旁边的优先级值。

      如果同一设备有多个连接配置集,NetworkManager 只启用一个配置集。默认情况下,NetworkManager 激活启用了自动连接的最后使用的配置集。但是,如果您在配置集中设置了优先级值,NetworkManager 会以最高优先级激活配置集。 2. 如果配置文件应该只对创建连接配置文件的用户可用,请清除 All users may connect to this network 复选框。 nm-connection-editor配置连接_1 5. 在 Ethernet 选项卡中,选择一个设备,还可以选择与以太网相关的其他设置。 nm-connection-editor配置连接_2 6. 在 IPv4 Settings 选项卡中,配置 IPv4 设置。例如,设置静态 IPv4 地址、网络掩码、默认网关和 DNS 服务器: nm-connection-editor配置连接_3 7. 在 IPv6 设置 选项卡上,配置 IPv6 设置。例如,设置静态 IPv6 地址、网络掩码、默认网关和 DNS 服务器: nm-connection-editor配置连接_4 8. 保存连接。 9. 关闭 nm-connection-editor。

验证

  1. 使用 ping 程序来验证网络连通性。

    • 查找同一子网中的 IP 地址。 IPv4:
      # ping 192.0.2.3
      
      IPv6:
      # ping 2001:db8:1::2
      
    • 在远程子网中查找 IP 地址。 IPv4:

      # ping 198.162.3.1
      
      IPv6:
      # ping 2001:db8:2::1
      

      • 如果命令失败,则使用 ping 默认网关来验证设置。 IPv4:
        # ping 192.0.2.254
        
        IPv6:
        # ping 2001:db8:1::fff3
        
    • 使用 host 命令验证域名解析是否正常:

      # host client.test.com
      
      如果命令错误,如 connection timed out 或 no servers could be reached,请验证您的 DNS 设置。

8.13.更改 NetworkManager 的 DHCP 客户端

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

流程

  1. 创建 /etc/NetworkManager/conf.d/dhcp-client.conf 文件:

    [main]
    dhcp=dhclient
    
    您可以对 internal (默认)或 dhclient 设置 dhcp 参数。

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

    # yum install dhcp-client
    

  3. 重启 NetworkManager:

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

验证

  • 在 /var/log/messages 日志文件中搜索类似于如下的条目:
    Sep  5 06:41:52 server NetworkManager[27748]: <info>  [1650959659.8483] dhcp-init: Using DHCP client 'dhclient'
    
    此日志条目确认 NetworkManager 使用 dhclient 作为 DHCP 客户端。

8.14.配置 NetworkManager 连接的 DHCP 行为

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

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

前提条件

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

流程

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

    # nmcli connection modify connection_name ipv4.dhcp-timeout 30 ipv6.dhcp-timeout 30
    
    另外,将参数设置为 infinity 以配置网络管理器(NetworkManager)不会停止尝试请求和续订 IP 地址,直到成功为止。

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

    # nmcli connection modify connection_name ipv4.may-fail value
    
    如果将 ipv4.may-fail 选项设为:

    • yes ,连接的状态取决于 IPv6 配置:
    • 如果启用了 IPv6 配置并成功,NetworkManager 会激活 IPv6 连接,不再尝试激活 IPv4 连接。
    • 如果禁用或未配置 IPv6 配置,连接会失败。
    • no ,连接会被停止。在这种情况下:
    • 如果启用了连接的 autoconnect 属性,NetworkManager 会根据 autoconnect-retries 属性中设置的值尝试多次激活连接。默认值为 4。
    • 如果连接仍然无法获得 DHCP 地址,则自动激活会失败。请注意,5 分钟后,自动连接过程会再次启动,从 DHCP 服务器获取 IP 地址。
  3. 可选:配置如果网络管理器(NetworkManager)在超时前没有接收 IPv6 地址时的行为:

    # nmcli connection modify connection_name ipv6.may-fail value
    

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

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

前提条件

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

流程

  1. 添加可应用于以 enp 开头的所有接口名称的连接配置文件:
    #nmcli connection add con-name Example connection.multi-connect multiple match.interface-name enp* type ethernet
    

验证

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

    #nmcli connection show Example
    connection.id:                      Example
    ...
    connection.multi-connect:           3 (multiple)
    match.interface-name:               `enp*`
    ...
    
    3 表示同时在连接配置文件上处于活动状态的接口数量,而不是连接配置文件中的网络接口数量。连接配置文件使用与 match.interface-name 参数中的模式匹配的所有设备,因此连接配置文件具有相同的通用唯一识别符(UUID)。

  2. 显示连接的状态:

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

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

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

前提条件

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

流程

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

    #udevadm info /sys/class/net/enp* | grep ID_PATH=
    ...
    E: ID_PATH=pci-0000:07:00.0
    E: ID_PATH=pci-0000:08:00.0
    

  2. 添加可应用于匹配 0000:00:0[7-8].0 表达式的所有 PCI ID 的连接配置文件:

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

验证

  1. 显示连接的状态:

    #nmcli connection show
    
    NAME   UUID     TYPE        DEVICE
    ...
    Example      9cee0958-512f-4203-9d3d-b57af1d88466  ethernet  enp7s0
    Example      9cee0958-512f-4203-9d3d-b57af1d88466  ethernet  enp8s0
    ...
    

  2. 显示连接配置集的所有设置:

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

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

第9章 管理 Wi-Fi 连接

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

前提条件

  • 安装了 nmcli 工具。
  • 确保 WiFi 被启用:
    $ nmcli radio wifi on
    

流程

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

    $ nmcli con add con-name MyCafe ifname wlan0 type wifi ssid MyCafe ip4 192.0.2.101/24 gw4 192.0.2.1
    

  2. 设置一个 DNS 服务器。例如,将 192.0.2.1 设为 DNS 服务器:

    $ nmcli con modify con-name MyCafe ipv4.dns "192.0.2.1"
    

  3. 另外,还可设置 DNS 搜索域。例如,要将搜索域设为 example.com :

    $ nmcli con modify con-name MyCafe ipv4.dns-search "example.com"
    

  4. 检查特定属性,如 mtu :

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

  5. 更改设置的属性:

    $ nmcli connection modify id MyCafe wireless.mtu 1350
    

  6. 验证更改:

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

验证

  1. 使用 ping 命令验证 wifi 网络是否连通:

    • 同一子网:
      # ping 192.0.2.103
      
      如果命令失败,请验证 IP 和子网的设置。
    • 外网:
      # ping 198.51.16.3
      
      • 如果命令失败,则使用 ping 默认网关来验证设置。
        # ping 192.0.2.1
        
  2. 使用 host 命令验证域名解析是否正常。

    # host client.example.com
    
    如果命令返回任何错误,如 connection timed out 或 no servers could be reached,请验证您的 DNS 设置。

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

流程

  1. 进入设置 Settings 并在左侧菜单栏中选择 WI-FI 选项即可看到可用的 Wi-Fi 网络。
  2. 选择您要编辑的 Wi-Fi 连接名称右侧的 gear wheel 图标,并会出现编辑连接对话框。Details 菜单窗口显示您可以进行进一步配置的连接详情。

    选项

    1. 如果您选择" 自动连接 ",当NetworkManager 检测到可用时,NetworkManager 会自动连接到这个连接。如果您不希望 NetworkManager 自动连接,请清除复选框。请注意,当复选框清除时,您必须在网络连接图标的菜单中选择该连接使其连接。
    2. 要使连接可供其他用户使用,请选中 Make available to other users 复选框。
    3. 您还可以通过更改 Restrict background data usage 来控制后台数据的使用。
    4. 选择 Identity 菜单项来查看基本配置选项。 SSID - 接入点(AP) 的服务集合标识符 (SSID)。

BSSID - 基本服务集合标识符 (BSSID)是您在 基础架构 模式中连接的特定无线访问点的 MAC 地址(也称为 硬件地址 )。默认情况下,此字段为空白,您可以通过 SSID 连接到无线访问点,而无需指定 BSSID。如果指定了 BSSID,它将强制系统只关联到特定的接入点。对于临时网络,在创建 ad-hoc 网络时,BSSID 由 mac80211 子系统随机生成。网络管理器(NetworkManager)不显示它。

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

克隆地址 - 使用克隆的 MAC 地址代替实际硬件地址。保留空白,除非需要。 4. 要进行进一步的 IP 地址配置,请选择 IPv4 和 IPv6 菜单项。

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

  • IPv4
    • 自动(DHCP) - 如果您要连接的网络使用路由器公告(RA)或 DHCP 服务器来分配动态 IP 地址,请选择此选项。您可以在 Details 菜单条目中看到分配的 IP 地址。
    • 仅链接 - 如果您要连接的网络没有 DHCP 服务器且您不想手动分配 IP 地址,请选择这个选项。随机地址将根据 RFC 3927 分配前缀 169.254/16。
    • Manual - 如果要手动分配 IP 地址,请选择这个选项。
    • disable - 此连接禁用 IPv4。
  • DNS
    • 如果 Automatic 为 ON,并且没有可用的 DHCP 服务器为此连接分配 DNS 服务器,请将其切换到 OFF,以输入用逗号分隔 IP 的 DNS 服务器的 IP 地址。
  • Routes
    请注意,在 Routes 部分,当 Automatic 为 ON 时,会使用来自路由器公告(RA)或 DHCP 的路由,但您也可以添加额外的静态路由。OFF 时,仅使用静态路由。
    
    • 地址 - 输入远程网络、子网络或主机的 IP 地址。
    • 子网掩码 - 上面输入的 IP 地址的子网掩码或前缀长度。
    • 网关 - 上面输入的远程网络、子网络或主机的网关的 IP 地址。
    • 指标 - 网络成本,赋予此路由的首选值。数值越低,优先级越高。
    • 仅将此连接用于其网络上的资源
    • 选择这个复选框以防止连接成为默认路由。
    • IPv6
    • 自动 - 选择此选项以使用 IPv6 无状态地址自动配置(SLAAC),基于硬件地址和路由器公告(RA)创建自动无状态配置。
    • 自动,仅 DHCP - 选择此选项以不使用 RA,而是直接从 DHCPv6 请求信息以创建有状态配置。
    • 仅链接 - 如果您要连接的网络没有 DHCP 服务器且您不想手动分配 IP 地址,请选择这个选项。随机地址将根据 RFC 4862 进行分配,前缀为 FE80::0。
    • Manual - 如果要手动分配 IP 地址,请选择这个选项。
    • disable - 此连接禁用 IPv6。
    • 选择 Security 菜单条目配置安全设置。
    • 安全性
    • None - 禁用加密,数据在网络中以纯文本形式传输。
    • WEP 40/128 位密钥 - Wired Equivalent Privacy(WEP),来自于 IEEE 802.11 标准。使用单一预共享密钥(PSK)。
    • WEP 128 位密码 - 用于 生成 WEP 密钥的密码短语的 MD5 哈希。
    • 动态 WEP(802.1X) - WEP 密钥动态更改.
    • LEAP - Cisco 系统的轻量级可扩展身份验证协议.
    • WPA 和 WPA2 个人 - Wi-Fi Protected Access(WPA),来自 IEEE 802.11i 标准草案.来自 802.11i-2004 标准的 Wi-Fi Protected Access 2(WPA2)。个人模式,使用预共享密钥(WPA-PSK)。
    • WPA & WPA2 Enterprise — WPA 和 WPA 2 用于与 RADIUS 身份验证服务器一起使用,以提供 IEEE 802.1X 网络访问控制。
    • WPA3 Personal - Wi-Fi Protected Access 3(WPA3) Personal 使用 Simultaneous Authentication of Equals(SAE)而不是预共享密钥(PSK)来防止字典攻击。WPA3 使用完美转发保密。
    • 密码
    • 输入要在验证过程中使用的密码。
    • 完成配置后,点 应用 按钮保存配置。

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

前提条件

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

流程

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

    $ nmcli device wifi rescan
    

  2. 查看可用的 Wi-Fi 接入点:

    $ nmcli dev wifi list
    
    IN-USE  SSID      MODE   CHAN  RATE        SIGNAL  BARS  SECURITY
    ...
            MyCafe    Infra  3     405 Mbit/s  85      ▂▄▆█  WPA1 WPA2
    

  3. 使用 nmcli 连接到 Wi-Fi 连接:

    $ nmcli dev wifi connect SSID-Name password wireless-password
    
    例如:
    $ nmcli dev wifi connect MyCafe password wireless-password
    
    禁用 Wi-Fi :
    $ nmcli radio wifi off
    

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

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

前提条件

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

流程

  • 连接到隐藏的 SSID:
    $ nmcli dev wifi connect SSID_Name password wireless_password hidden yes
    

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

流程

  1. 在屏幕右上角打开 GNOME Shell 网络连接图标菜单。
  2. 选择 Wi-Fi Not Connected。
  3. 单击 Select Network 选项。
  4. 单击您要连接的网络名称,然后单击 Connect。 请注意,如果没有看到网络,则网络可能是隐藏的。
  5. 如果需要密码或加密密钥保护网络,请输入密码并单击" 连接 "。 请注意:如果您不知道密码,请联络 Wi-Fi 网络的管理员。
  6. 如果连接成功,则会在连接图标菜单中看到网络连接,WiFi图标位于屏幕右上角。

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

使用 nmcli 工具,您可以配置网络身份验证。此流程描述了如何在现有名为 wlp1s0 的 NetworkManager Wi-Fi 连接配置文件中使用 Microsoft Challenge-Handshake Authentication Protocol 版本 2(MSCHAPv2)配置受保护的扩展验证协议(PEAP)身份验证。

前提条件

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

流程

  1. 将 Wi-Fi 安全模式设为 wpa-eap、将可扩展验证协议(EAP)设为 peap,将内部验证协议设为 mschapv2,设置用户名:

    # nmcli connection modify wlp1s0 wireless-security.key-mgmt wpa-eap 802-1x.eap peap 802-1x.phase2-auth mschapv2 802-1x.identity user_name
    
    请注意,您必须在单个命令中设置 wireless-security.key-mgmt、802-1x.eap、802-1x.phase2-auth 和 802-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
    

第 10 章 配置 VLAN 标记

本章论述了如何配置虚拟本地区域网络(VLAN)。VLAN 是物理网络中的一个逻辑网络。当数据包通过 VLAN 接口时会带上接口标记和 VLAN ID ,数据包返回时则会删除标记。

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

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

前提条件

  • 您计划用作虚拟 VLAN 接口的父接口支持 VLAN 标记。
  • 如果您在绑定接口之上配置 VLAN:
  • 绑定的端口是在线的。
  • 这个绑定没有使用 fail_over_mac=follow 选项进行配置。VLAN 虚拟设备无法更改其 MAC 地址以匹配父设备的新 MAC 地址。在这种情况下,流量仍会使用不正确的源 MAC 地址发送。
  • 这个绑定通常不会预期从 DHCP 服务器或 IPv6 自动配置获取 IP 地址。在创建绑定时设置 ipv4.method=disable 和 ipv6.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 必须在范围 0 到 4094 之间。

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

    # nmcli connection modify vlan10 ethernet.mtu 2000
    

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

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

    # nmcli connection modify vlan10 ipv4.addresses '192.0.2.1/24'
    # nmcli connection modify vlan10 ipv4.gateway '192.0.2.254'
    # nmcli connection modify vlan10 ipv4.dns '192.0.2.253'
    # nmcli connection modify vlan10 ipv4.method manual
    

    1. 配置 IPv6 设置。例如,要对 vlan10 连接设置静态 IPv6 地址、网络掩码、默认网关和 DNS 服务器设置,请输入:
      # nmcli connection modify vlan10 ipv6.addresses '2001:db8:1::1/32'
      # nmcli connection modify vlan10 ipv6.gateway '2001:db8:1::fffe'
      # nmcli connection modify vlan10 ipv6.dns '2001:db8:1::fffd'
      # nmcli connection modify vlan10 ipv6.method manual
      
  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
    

10.2.使用 nm-connection-editor 配置 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 选项卡中:
  5. 选择上级接口。
  6. 选择 VLAN ID。请注意,VLAN 必须在范围 0 到 4094 之间。
  7. 默认情况下,VLAN 连接会继承上级接口的最大传输单元(MTU)。另外,还可设置不同的 MTU 值。
  8. 另外,还可设置 VLAN 接口的名称以及其它特定 VLAN 选项。 nm-connection-editor配置vlan_1
  9. 配置 VLAN 设备的 IP 设置。如果要使用这个 VLAN 设备作为其它设备的端口,请跳过这一步。
  10. 在 IPv4 Settings 选项卡中,配置 IPv4 设置。例如,设置静态 IPv4 地址、网络掩码、默认网关和 DNS 服务器: nm-connection-editor配置vlan_2
  11. 在 IPv6 设置 选项卡上,配置 IPv6 设置。例如,设置静态 IPv6 地址、网络掩码、默认网关和 DNS 服务器: nm-connection-editor配置vlan_3
  12. 点击 Save 保存 VLAN 连接。
  13. 关闭 nm-connection-editor。

验证

  1. 验证配置:
    # ip -d addr show vlan3
    4: vlan3@ens3: <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
    

10.3. 使用 nmstatectl 配置 VLAN 标记

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

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

前提条件

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

流程

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

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

  2. 将设置应用到系统:

    # nmstatectl apply ~/create-vlan.yml
    

验证

  1. 显示设备和连接的状态:
    # nmcli device status
    DEVICE      TYPE      STATE      CONNECTION
    vlan10      vlan      connected  vlan10
    
  2. 显示连接配置集的所有设置:
    # nmcli connection show vlan10
    connection.id:              vlan10
    connection.uuid:            1722970f-788e-4f81-bd7d-a86bf21c9df5
    connection.stable-id:       --
    connection.type:            vlan
    connection.interface-name:  vlan10
    ...
    
  3. 以 YAML 格式显示连接设置:
    # nmstatectl show vlan0
    

10.4.使用 rhel-system-roles 配置 VLAN 标记

本节描述了如何在这个以太网连接之上添加以太网连接 ID 为 10 的 VLAN 。作为子设备,VLAN 连接包含 IP、默认网关和 DNS 配置。

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

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

前提条件

  • ansible 和 rhel-system-roles 软件包已安装在控制节点上。
  • 如果您在运行 playbook 时使用了非 root 用户,则确保此用户在节点上具有 sudo 权限。

流程

  1. 如果您要在其上执行 playbook 中指令的主机还没有被列入清单,请将此主机的 IP 或名称添加到 /etc/ansible/hosts Ansible 清单文件中:
    node.example.com
    
  2. 使用以下内容创建 ~/vlan-ethernet.yml playbook: ``` ---
  3. name: Configure a VLAN that uses an Ethernet connection hosts: node.example.com become: true tasks:

    • include_role: name: rhel-system-roles.network

    vars: network_connections: # Add an Ethernet profile for the underlying device of the VLAN - name: enp1s0 type: ethernet interface_name: enp1s0 autoconnect: yes state: up ip: dhcp4: no auto6: no

       # Define the VLAN profile
       - name: enp1s0.10
         type: vlan
         ip:
           address:
             - "192.0.2.1/24"
             - "2001:db8:1::1/64"
           gateway4: 192.0.2.254
           gateway6: 2001:db8:1::fffe
           dns:
             - 192.0.2.200
             - 2001:db8:1::ffbb
           dns_search:
             - example.com
         vlan_id: 10
         parent: enp1s0
         state: up
    

    VLAN 配置文件中的 parent 属性将 VLAN 配置为在 enp1s0 设备之上运行。 3. 运行 playbook: - 要以 root 用户身份连接到受管主机,请输入: # ansible-playbook -u root ~/vlan-ethernet.yml - 以用户身份连接到受管主机,请输入: # ansible-playbook -u user_name --ask-become-pass ~/vlan-ethernet.yml ``` --ask-become-pass 选项确保 ansible-playbook 命令提示输入 -u user_name 选项中定义的用户的 sudo 密码。 如果没有指定 -u user_name 选项,ansible-playbook 以当前登录到控制节点的用户身份连接到受管主机。

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

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

本文档描述了如何在 OpenCLoudOS 主机上配置虚拟机不可见的 VXLAN : vxlan-tunnel

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

就像正常的第 2 层流量一样,VXLAN 中的数据是不加密的。出于安全考虑,在 VPN 或其他类型的加密连接上使用 VXLAN 。

11.1.VXLAN 的优点

虚拟可扩展局域网(VXLAN)提供了以下主要优点:

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

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

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

在 OpenCloudOS 主机上运行此过程,并相应地调整 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 OpenCloudOS-host-B.example.com
    
    请注意,在该主机上配置网络前,您无法 ping 其他虚拟机主机。

11.3.创建附加了 VXLAN 的网桥

要使虚拟可扩展局域网(VXLAN)对虚拟机(VM)不可见,请在主机上创建一个网桥,并将 VXLAN 附加给网桥。使用 NetworkManager 创建网桥和 VXLAN。您不能将虚拟机的任何流量访问点(TAP)设备(通常在主机上称为 vnet *)添加到网桥。在虚拟机启动时,libvirtd 服务会动态添加它们。

在 OpenCloudOS 主机上运行此过程,并相应地调整 IP 地址。

流程

  1. 创建网桥 br0 :
    # nmcli connection add type bridge con-name br0 ifname br0 ipv4.method disabled ipv6.method disabled
    
    此命令在网桥设备上设置没有 IPv4 和 IPv6 地址,因为此网桥在第 2 层工作。
  2. 创建 VXLAN 接口,并将其附加到 br0 :
    # nmcli connection add type vxlan slave-type bridge con-name br0-vxlan10 ifname vxlan10 id 10 local 198.51.100.2 remote 203.0.113.1 master br0
    
    这个命令使用以下设置: - ID 10 :设置 VXLAN 标识符。 - local 198.51.100.2 :设置传出数据包的源 IP 地址。 - remote 203.0.113.1 :当目的地链路层地址在 VXLAN 设备转发数据库中未知时,设置要在传出数据包中使用的单播或多播IP地址。 - remote 203.0.113.1 :当目的地链路层地址在 VXLAN 设备转发数据库中未知时,设置要在传出数据包中使用的单播或多播IP地址。 - ipv4.method disabled 和 ipv6.method disabled: 在网桥上禁用 IPv4 和 IPv6。
  3. 激活 br0 连接配置文件:
    # nmcli connection up br0
    
  4. 在本地防火墙中为进入 UDP 连接打开端口 8472 :
    # nmcli connection up br0
    

验证

  • 显示转发表:
    # 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
    ...
    

11.4.在带有现有网桥的 libvirt 中创建一个虚拟网络

要使虚拟机(VM)使用带有附加虚拟可扩展局域网(VXLAN) 的 br0 网桥,首先将虚拟网络添加到使用此网桥的 libvirtd 服务中。

前提条件

  • 您已安装了 libvirt 软件包。
  • 您已安装了 libvirt 软件包。
  • 您已在 OpenCloudOS 上配置了带有 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
    ...
    

11.5. 配置虚拟机以使用 VXLAN

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

前提条件

  • 您在 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 中:
  4. 启动同一 VXLAN 中的两个或多个虚拟机。
  5. 将 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 工具。

第 12 章 配置网络桥接

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

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

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

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

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

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

前提条件

  • 在服务器中安装两个或者两个以上物理或者虚拟网络设备。
  • 要将以太网设备用作网桥的端口,必须在服务器中安装物理或者虚拟以太网设备。
  • 要使用 team、bond 或 VLAN 设备作为网桥的端口,您可以在创建桥接时创建这些设备,或者预先创建它们。

流程

  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
    ...
    
    在本例中: - 没有配置 enp7s0 和 enp8s0 。要将这些设备用作端口,请在下一步中添加连接配置集。 - bond0 和 bond1 已有连接配置文件。要将这些设备用作端口,请在下一步中修改其配置集。
  3. 将接口分配给网桥。
  4. 如果没有配置您要分配给网桥的接口,为其创建新的连接配置集:
    # nmcli connection add type ethernet slave-type bridge con-name bridge0-port1 ifname enp7s0 master bridge0
    # nmcli connection add type ethernet slave-type bridge con-name bridge0-port2 ifname enp8s0 master bridge0
    
  5. 如果要为网桥分配现有的连接配置文件,请将这些连接的 master 参数设为 bridge0 :
    # nmcli connection modify bond0 master bridge0
    # nmcli connection modify bond1 master bridge0
    
    这些命令将名为 bond0 和 bond1 的现有连接配置文件分配给 bridge0 连接。
  6. 配置网桥的 IP 设置。如果要使用这个网桥作为其它设备的端口,请跳过这一步。
  7. 配置 IPv4 设置。例如:要设置 bridge0 连接的静态 IPv4 地址、网络掩码、默认网关、DNS 服务器和 DNS 搜索域,请输入:
    # nmcli connection modify bridge0 ipv4.addresses '192.0.2.1/24'
    # nmcli connection modify bridge0 ipv4.gateway '192.0.2.254'
    # nmcli connection modify bridge0 ipv4.dns '192.0.2.253'
    # nmcli connection modify bridge0 ipv4.dns-search 'example.com'
    # nmcli connection modify bridge0 ipv4.method manual
    
  8. 配置 IPv6 设置。例如:要设置 bridge0 连接的静态 IPv6 地址、网络掩码、默认网关、DNS 服务器和 DNS 搜索域,请输入:
    # nmcli connection modify bridge0 ipv6.addresses '2001:db8:1::1/64'
    # nmcli connection modify bridge0 ipv6.gateway '2001:db8:1::fffe'
    # nmcli connection modify bridge0 ipv6.dns '2001:db8:1::fffd'
    # nmcli connection modify bridge0 ipv6.dns-search 'example.com'
    # nmcli connection modify bridge0 ipv6.method manual
    
  9. 可选:配置网桥的其他属性。例如,要将 bridge0 的生成树协议(STP)优先级设为 16384,请输入:
    # nmcli connection modify bridge0 bridge.priority '16384'
    
    默认情况下启用 STP。
  10. 激活连接:
    # nmcli connection up bridge0
    
  11. 验证端口是否已连接,并且 CONNECTION 列是否显示端口的连接名称:
    # nmcli device
    DEVICE   TYPE      STATE      CONNECTION
    ...
    enp7s0   ethernet  connected  bridge0-port1
    enp8s0   ethernet  connected  bridge0-port2
    
    当您激活连接的任何端口时,NetworkManager 也会激活网桥,但不会激活它的其它端口。您可以在启用桥接时配置 Red Hat Enterprise Linux 自动启用所有端口:
    1. 启用网桥连接的 connection.autoconnect-slaves 参数:
      # nmcli connection modify bridge0 connection.autoconnect-slaves 1
      
    2. 重新激活桥接:
      # nmcli connection up bridge0
      

验证

  • 使用 ip 工具来显示作为特定网桥端口的以太网设备的链接状态:
    # ip link show master bridge0
    3: enp7s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel master bridge0 state UP mode DEFAULT group default qlen 1000
        link/ether 52:54:00:62:61:0e brd ff:ff:ff:ff:ff:ff
    4: enp8s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel master bridge0 state UP mode DEFAULT group default qlen 1000
        link/ether 52:54:00:9e:f1:ce brd ff:ff:ff:ff:ff:ff
    
  • 使用 bridge 工具来显示作为任意网桥设备端口的以太网设备状态:
    # bridge link show
    3: enp7s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 master bridge0 state forwarding priority 32 cost 100
    4: enp8s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 master bridge0 state listening priority 32 cost 100
    5: enp9s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 master bridge1 state forwarding priority 32 cost 100
    6: enp11s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 master bridge1 state blocking priority 32 cost 100
    ...
    
    要显示特定以太网设备的状态,请使用 bridge link show dev ethernet_device_name 命令。

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

本节介绍了如何使用 nm-connection-editor 应用程序配置网桥。请注意,nm-connection-editor 只能向网桥添加新端口。要将现有的连接配置文件用作端口,请使用 nmcli 工具创建网桥。

前提条件

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

流程

  1. 打开终端,输入 nm-connection-editor
  2. 点击 + 按钮来添加一个新的连接。
  3. 选择 Bridge 连接类型,然后点击 Create。
  4. 在 Bridge 选项卡中:
  5. 可选:在 Interface name 字段中设置网桥接口的名称。
  6. 点击 Add 按钮为网络接口创建新的连接配置集,并将配置集作为端口添加到网桥。
    1. 选择接口的连接类型。例如,为有线连接选择 Ethernet。
    2. 另外,还可为端口设备设置连接名称。
    3. 如果您为以太网设备创建连接配置文件,请打开 Ethernet 选项卡,在 Device 字段中选择您要作为端口添加给网桥的网络接口。如果您选择了不同的设备类型,请相应地进行配置。 nm-connection-editor配置网桥_1
    4. 点 Save。
  7. 对您要添加到桥接的每个接口重复前面的步骤。
  8. 可选:配置其他网桥设置,如生成树协议(STP)选项。
  9. 配置网桥的 IP 设置。如果要将此网桥用作其他设备的端口,请跳过这一步。
  10. 在 IPv4 Settings 选项卡中,配置 IPv4 设置。例如,设置静态 IPv4 地址、网络掩码、默认网关、DNS 服务器和 DNS 搜索域: nm-connection-editor配置网桥_2
  11. 在 IPv6 Settings 选项卡中,配置 IPv6 设置。例如,设置静态 IPv6 地址、网络掩码、默认网关、DNS 服务器和 DNS 搜索域: nm-connection-editor配置网桥_3
  12. 保存网桥连接。
  13. 关闭 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 命令。

12.3.使用 nmstatectl 配置网络桥接

前提条件

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

流程

  1. 创建包含以下内容的 YAML 文件, ~/create-bridge.yml :
    ---
    interfaces:
    - name: bridge0
    type: linux-bridge
    state: up
    ipv4:
        enabled: true
        address:
        - ip: 192.0.2.1
        prefix-length: 24
        dhcp: false
    ipv6:
        enabled: true
        address:
        - ip: 2001:db8:1::1
        prefix-length: 64
        autoconf: false
        dhcp: false
    bridge:
        options:
        stp:
            enabled: true
        port:
        - name: enp1s0
        - name: enp7s0
    - name: enp1s0
    type: ethernet
    state: up
    - name: enp7s0
    type: ethernet
    state: up
    
    routes:
    config:
    - destination: 0.0.0.0/0
        next-hop-address: 192.0.2.254
        next-hop-interface: bridge0
    - destination: ::/0
        next-hop-address: 2001:db8:1::fffe
        next-hop-interface: bridge0
    dns-resolver:
    config:
        search:
        - example.com
        server:
        - 192.0.2.200
        - 2001:db8:1::ffbb
    
  2. 将设置应用到系统:
    # nmstatectl apply ~/create-bridge.yml
    

验证

  1. 显示设备和连接的状态:
    # nmcli device status
    DEVICE      TYPE      STATE      CONNECTION
    bridge0     bridge    connected  bridge0
    
  2. 显示连接配置集的所有设置:
    # nmcli connection show bridge0
    connection.id:              bridge0
    connection.uuid:            e2cc9206-75a2-4622-89cf-1252926060a9
    connection.stable-id:       --
    connection.type:            bridge
    connection.interface-name:  bridge0
    ...
    
  3. 以 YAML 格式显示连接设置:
    # nmstatectl show bridge0
    

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

13.1.网络团队简介

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

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

13.2.了解控制器和端口接口的默认配置

在使用 NetworkManager 服务管理或排除团队或绑定端口接口故障时,请考虑以下默认配置: - 启动控制器接口不会自动启动端口接口。 - 启动端口接口总会启动控制器接口。 - 停止控制器接口也会停止端口接口。 - 没有端口的控制器可以启动静态 IP 连接。 - 没有端口的控制器在启动 DHCP 连接时会等待端口。 - 当您添加带有载波的端口时,具有 DHCP 连接的控制器会等待端口完成。 - 当您添加不具有载波的端口时,具有 DHCP 连接的控制器继续等待端口。

13.3.网络团队和绑定功能的比较

网络团队和绑定功能的比较:

功能 网络绑定 网络团队
广播 Tx 策略
轮询 Tx 策略
Active-backup Tx 策略
LACP(802.3ad)支持 是(仅活动)
基于 hash 的 Tx 策略
用户可以设置哈希功能
TX 负载均衡支持(TLB)
LACP 哈希端口选择
LACP 支持的负载均衡
ethtool 链接监控
ARP 链路监控
NS/NA(IPv6)链路监控
端口启动/关闭延时
端口优先级和粘性("主要" 选项增强)
独立的每个端口链路监控设置
多个链路监控设置 有限
Lockless Tx/Rx 路径 否(rwlock) 是(RCU)
VLAN 支持
用户空间运行时控制 有限
用户空间中的逻辑
可扩展性
模块化设计
性能开销 非常低
D-Bus 接口
多设备堆栈
使用 LLDP 时零配置 (计划中)
NetworkManager 支持

团队服务 teamd 团队驱动程序控制的一个实例。这个驱动的实例添加硬件设备驱动程序实例组成一个网络接口组。团队驱动程序向内核提供一个网络接口,如 team0。

teamd 服务对所有团队方法的实现提供通用的逻辑。这些功能对不同的负载共享和备份方法(如循环)是唯一的,并由称为 runners 的单独的代码单元来实现。管理员以 JavaScript 对象表示法(JSON)格式指定runners ,在创建实例时,JSON 代码被编译到 teamd 实例中。另外,在使用 NetworkManager 时,您可以在 team.runner 参数中设置 runner ,NetworkManager 会自动创建对应的 JSON 代码。

可用的 runner 如下:

  • broadcast :转换所有端口上的数据。
  • roundrobin :依次转换所有端口上的数据。
  • activebackup :转换一个端口上的数据,而其他端口上的数据则作为备份保留。
  • loadbalance:转换所有具有活跃的 Tx 负载均衡和基于 Berkeley 数据包过滤器(BPF)的 Tx 端口选择器的端口上的数据。
  • random :转换随机选择的端口上的数据。
  • lacp :实现 802.3ad 链路聚合控制协议(LACP)。

teamd 服务使用链路监视器来监控从属设备的状态。可用的 link-watchers 如下:

  • ethtool :libteam 库使用 ethtool 工具来监视链接状态的变化。这是默认的 link-watcher。
  • arp_ping: libteam 库使用 arp_ping 工具来监控使用地址解析协议(ARP)的远端硬件地址是否存在。
  • nsna_ping: 在 IPv6 连接上,libteam 库使用来自 IPv6 邻居发现协议的邻居广告和邻居请求功能来监控邻居接口的存在。

每个 runner 都可以使用任何链接监视器,但 lacp 除外。此 runner 只能使用 ethtool 链接监视器。

13.5.安装 teamd 服务

要在 NetworkManager 中配置网络团队,您需要 NetworkManager 的 teamd 服务和团队插件。默认情况下,它们都安装在 OpenCloudOS 上。

# yum install teamd NetworkManager-team

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

前提条件

  • 在服务器中安装两个或者两个以上物理或者虚拟网络设备。
  • 要将以太网设备用作团队的端口,必须在服务器中安装物理或者虚拟以太网设备并连接到交换机。
  • 要将 bond、bridge 或 VLAN 设备用作团队的端口,您可以在创建团队时创建这些设备,或者预先创建它们。

流程

  1. 创建团队接口:
    # nmcli connection add type team con-name team0 ifname team0 team.runner activebackup
    
    此命令创建一个使用 activebackup runner、名为 team0 的网络团队。
  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-host 和 target-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
    ...
    
    在本例中:
    • 没有配置 enp7s0 和 enp8s0 。要将这些设备用作端口,请在下一步中添加连接配置集。请注意,您只能在没有分配给任何连接的团队中使用以太网接口。
    • bond0 和 bond1 已有连接配置文件。要将这些设备用作端口,请在下一步中修改其配置集。
  4. 为团队分配端口接口:
  5. 如果没有配置您要分配给团队的接口,为其创建新的连接配置集:
    # nmcli connection add type ethernet slave-type team con-name team0-port1 ifname enp7s0 master team0
    # nmcli connection add type ethernet slave-type team con-name team0-port2 ifname enp8s0 master team0
    
    这些命令为 enp7s0 和 enp8s0 创建配置文件,并将它们添加到 team0 连接中。
  6. 要现有的连接配置文件分配给团队,请将这些连接的 master 参数设为 team0 :

    # nmcli connection modify bond0 master team0
    # nmcli connection modify bond1 master team0
    
    这些命令将名为 bond0 和 bond1 的现有连接配置文件分配给 team0 连接。

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

  8. 配置 IPv4 设置。例如:要设置 team0 连接的静态 IPv4 地址、网络掩码、默认网关、DNS 服务器和 DNS 搜索域,请输入:
    # nmcli connection modify team0 ipv4.addresses '192.0.2.1/24'
    # nmcli connection modify team0 ipv4.gateway '192.0.2.254'
    # nmcli connection modify team0 ipv4.dns '192.0.2.253'
    # nmcli connection modify team0 ipv4.dns-search 'example.com'
    # nmcli connection modify team0 ipv4.method manual
    
  9. 配置 IPv6 设置。例如:要设置 team0 连接的静态 IPv6 地址、网络掩码、默认网关、DNS 服务器和 DNS 搜索域,请输入:
    # nmcli connection modify team0 ipv6.addresses '2001:db8:1::1/64'
    # nmcli connection modify team0 ipv6.gateway '2001:db8:1::fffe'
    # nmcli connection modify team0 ipv6.dns '2001:db8:1::fffd'
    # nmcli connection modify team0 ipv6.dns-search 'example.com'
    # nmcli connection modify team0 ipv6.method manual
    
  10. 激活连接:
    # 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
    
    在这个示例中,两个端口都是上线的。

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

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

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

前提条件

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

流程

  1. 在终端输入 nm-connection-editor 。
  2. 点击 + 按钮来添加一个新的连接。
  3. 选择 Team 连接类型,然后单击 Create。
  4. 在 Team 选项卡中:
  5. 可选:在 Interface name 字段中设置团队接口的名称。
  6. 点击 Add 按钮为网络接口添加新连接配置集,并将配置集作为端口添加到团队。
    1. 选择接口的连接类型。例如,为有线连接选择 Ethernet。
    2. 可选:为端口设置连接名称。
    3. 如果您要为以太网设备创建一个连接配置文件,请打开 Ethernet 选项卡,然后在 Device 字段中选择您要作为端口添加到团队的网络接口。如果您选择了不同的设备类型,请相应地进行配置。请注意,您只能在没有分配给任何连接的团队中使用以太网接口。
    4. 点 Save。
  7. 对您要添加到团队的每个接口重复前面的步骤。 nm-connection-editor配置team_1
  8. 点 Advanced 按钮将高级选项设置为团队连接。
    1. 在 Runner 选项卡中,选择 runner。
    2. 在 Link Watcher 选项卡中,设置链接监视器及其可选设置。
    3. 点确定。
  9. 配置团队的 IP 设置。如果要使用这个团队作为其它设备的端口,请跳过这一步。
  10. 在 IPv4 Settings 选项卡中,配置 IPv4 设置。例如,设置静态 IPv4 地址、网络掩码、默认网关、DNS 服务器和 DNS 搜索域: nm-connection-editor配置team_2
  11. 在 IPv6 Settings 选项卡中,配置 IPv6 设置。例如,设置静态 IPv6 地址、网络掩码、默认网关、DNS 服务器和 DNS 搜索域: nm-connection-editor配置team_3
  12. 保存团队连接。
  13. 关闭 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
    

第14章 配置网络绑定

14.1.网络绑定简介

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

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

14.2.控制器和端口接口的默认配置

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

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

14.3.网络团队和绑定功能的比较

网络团队和绑定功能的比较:

功能 网络绑定 网络团队
广播 Tx 策略
轮询 Tx 策略
Active-backup Tx 策略
LACP(802.3ad)支持 是(仅活动)
基于 hash 的 Tx 策略
用户可以设置哈希功能
TX 负载均衡支持(TLB)
LACP 哈希端口选择
LACP 支持的负载均衡
ethtool 链接监控
ARP 链路监控
NS/NA(IPv6)链路监控
端口启动/关闭延时
端口优先级和粘性("主要" 选项增强)
独立的每个端口链路监控设置
多个链路监控设置 有限
Lockless Tx/Rx 路径 否(rwlock) 是(RCU)
VLAN 支持
用户空间运行时控制 有限
用户空间中的逻辑
可扩展性
模块化设计
性能开销 非常低
D-Bus 接口
多设备堆栈
使用 LLDP 时零配置 (计划中)
NetworkManager 支持

14.4.绑定模式对应上游交换机配置

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

绑定模式 交换机上的配置
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 需要可自主端口

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

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

前提条件

  • 在服务器中安装两个或者两个以上物理或者虚拟网络设备。
  • 要将以太网设备用作团队的端口,必须在服务器中安装物理或者虚拟以太网设备并连接到交换机。
  • 要将 bond、bridge 或 VLAN 设备用作团队的端口,您可以在创建团队时创建这些设备,或者预先创建它们。

流程

  1. 创建绑定接口

    # nmcli connection add type bond con-name bond0 ifname bond0 bond.options "mode=active-backup"
    
    这个命令会创建一个使用 active-backup 模式、名为 bond0 的绑定。

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

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

  2. 显示网络接口选择添加到绑定中的接口

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

    在本例中: - 没有配置 enp7s0 和 enp8s0 。要将这些设备用作端口,请在下一步中添加连接配置集。 - bridge0 和 bridge1 都有现有的连接配置文件。要将这些设备用作端口,请在下一步中修改其配置集。

  3. 为绑定分配接口

  4. 如果没有配置您要分配给绑定的接口,为其创建新的连接配置集:
    # nmcli connection add type ethernet slave-type bond con-name bond0-port1 ifname enp7s0 master bond0
    # nmcli connection add type ethernet slave-type bond con-name bond0-port2 ifname enp8s0 master bond0
    
    这些命令为 enp7s0 和 enp8s0 创建配置文件,并将它们添加到 bond0 连接中。
  5. 要将现有连接的配置文件分配给绑定,请将这些连接的 master 参数设为 bond0 :

    # nmcli connection modify bridge0 master bond0
    # nmcli connection modify bridge1 master bond0
    
    这些命令将名为 bridge0 和 bridge1 的现有连接配置文件分配给 bond0 连接。

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

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

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

  9. 激活连接:

    # nmcli connection up bond0
    

  10. 验证端口是否已连接,并且 CONNECTION 列是否显示端口的连接名称:

    # nmcli device
    DEVICE   TYPE      STATE      CONNECTION
    ...
    enp7s0   ethernet  connected  bond0-port1
    enp8s0   ethernet  connected  bond0-port2
    
    当您激活连接的任何端口时,NetworkManager 也激活绑定,但不会激活它的其它端口。您可以配置 OpenCloudOS ,在启用绑定时自动启用所有端口:

    1. 启用绑定连接的 connection.autoconnect-slaves 参数:
      # nmcli connection modify bond0 connection.autoconnect-slaves 1
      
    2. 重新激活桥接:
      # nmcli connection up bond0
      

验证

  1. 在主机中暂时拔掉网线。

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

  1. 显示绑定状态
    # cat /proc/net/bonding/bond0
    

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

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

请注意:nm-connection-editor 只能向绑定添加新端口。要使用现有连接配置文件作为端口,请使用 nmcli 工具创建绑定。

前提条件

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

流程

  1. 在终端中输入 nm-connection-editor 。
  2. 点击 + 按钮来添加一个新的连接。
  3. 选择 Bond 连接类型,再单击 Create。
  4. 在 Bond 选项卡中:
  5. 可选:在 Interface name 字段中设置绑定接口的名称。
  6. 单击 Add 按钮,将网络接口作为端口添加到绑定中。
    1. 选择接口的连接类型。例如,为有线连接选择 Ethernet。
    2. 可选:为端口设置连接名称。
    3. 如果您要为以太网设备创建连接配置文件,请打开 Ethernet 选项卡,在 Device 字段中选择您要作为端口添加到绑定的网络接口。如果您选择了不同的设备类型,请相应地进行配置。请注意,您只能在没有配置的绑定中使用以太网接口。
    4. 点 Save。
  7. 对您要添加到绑定的每个接口重复前面的步骤: nm-connection-editor配置bond_1
  8. 可选:设置其他选项,如介质独立接口(MII)监控间隔。
  9. 配置绑定的 IP 设置。如果要使用这个绑定作为其它设备的端口,请跳过这一步。
  10. 在 IPv4 Settings 选项卡中,配置 IPv4 设置。例如,设置静态 IPv4 地址、网络掩码、默认网关、DNS 服务器和 DNS 搜索域: nm-connection-editor配置bond_2
  11. 在 IPv6 Settings 选项卡中,配置 IPv6 设置。例如,设置静态 IPv6 地址、网络掩码、默认网关、DNS 服务器和 DNS 搜索域: nm-connection-editor配置bond_3
  12. 点 Save 保存绑定连接。
  13. 关闭 nm-connection-editor。

验证

  1. 在主机中暂时拔掉网线。

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

  1. 显示绑定状态
    # cat /proc/net/bonding/bond0
    

14.7.使用 nmstatectl 配置网络绑定

前提条件

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

流程

  1. 创建 ~/create-bond.yml YAML文件:

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

验证

  1. 显示设备和连接的状态:
    # nmcli device status
    DEVICE      TYPE      STATE      CONNECTION
    bond0       bond      connected  bond0
    
  2. 显示连接配置集的所有设置:
    # nmcli connection show bond0
    connection.id:              bond0
    connection.uuid:            79cbc3bd-302e-4b1f-ad89-f12533b818ee
    connection.stable-id:       --
    connection.type:            bond
    connection.interface-name:  bond0
    ...
    
  3. 以 YAML 格式显示连接设置:
    # nmstatectl show bond0
    

14.8.使用 rhel-system-roles 软件配置网络绑定

前提条件

  • ansible 和 rhel-system-roles 软件包已安装在控制节点上。
  • 如果您在运行 playbook 时使用了非 root 用户,则要求此用户在受管节点上具有对应的 sudo 权限。
  • 在服务器中安装两个或者两个以上物理或者虚拟网络设备。

流程

  1. 如果您用来执行 playbook 中指令的主机还没有被列入清单,则将主机 IP 或名称添加到 /etc/ansible/hosts Ansible 清单文件中:
    node.example.com
    
  2. 创建 ~/bond-ethernet.yml playbook:

    ---
    - name: Configure a network bond that uses two Ethernet ports
    hosts: node.example.com
    become: true
    tasks:
    - include_role:
        name: rhel-system-roles.network
    
        vars:
        network_connections:
            # Define the bond profile
            - name: bond0
            type: bond
            interface_name: bond0
            ip:
                address:
                - "192.0.2.1/24"
                - "2001:db8:1::1/64"
                gateway4: 192.0.2.254
                gateway6: 2001:db8:1::fffe
                dns:
                - 192.0.2.200
                - 2001:db8:1::ffbb
                dns_search:
                - example.com
            bond:
                mode: active-backup
            state: up
    
            # Add an Ethernet profile to the bond
            - name: bond0-port1
            interface_name: enp7s0
            type: ethernet
            controller: bond0
            state: up
    
            # Add a second Ethernet profile to the bond
            - name: bond0-port2
            interface_name: enp8s0
            type: ethernet
            controller: bond0
            state: up
    
    3. 运行 playbook: - 要以 root 用户身份连接到受管主机,请输入:
    # ansible-playbook -u root ~/bond-ethernet.yml
    
    - 以用户身份连接到受管主机,请输入:
    # ansible-playbook -u user_name --ask-become-pass ~/bond-ethernet.yml
    
    --ask-become-pass 选项确保 ansible-playbook 命令提示输入 -u user_name 选项中定义的用户的 sudo 密码。

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

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

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

前提条件

  • 主机包含以太网和 Wi-Fi 设备。
  • 已创建以太网和 Wi-Fi 网络管理器连接配置集,且两个连接都可以独立工作。
  • 此流程使用以下连接配置文件来创建名为 bond0 的网络绑定:
  • 与 enp11s0u1 以太网设备关联的 Docking_station
  • Wi-Fi 与 wlp1s0 Wi-Fi 设备关联

流程

  1. 在 active-backup 模式中创建一个绑定接口:
    # nmcli connection add type bond con-name bond0 ifname bond0 bond.options "mode=active-backup"
    
    这个命令将接口和连接配置文件命名为 bond0 。
  2. 配置绑定的 IPv4 设置:
    • 如果您的网络中的 DHCP 服务器为主机分配 IPv4 地址,则不需要任何操作。
    • 如果您的本地网络需要静态 IPv4 地址,请将地址、网络掩码、默认网关、DNS 服务器和 DNS 搜索域设为 bond0 连接:
      # nmcli connection modify bond0 ipv4.addresses '192.0.2.1/24'
      # nmcli connection modify bond0 ipv4.gateway '192.0.2.254'
      # nmcli connection modify bond0 ipv4.dns '192.0.2.253'
      # nmcli connection modify bond0 ipv4.dns-search 'example.com'
      # nmcli connection modify bond0 ipv4.method manual
      
  3. 配置绑定的 IPv6 设置:
    • 如果您的网络中的路由器或者 DHCP 服务器为主机分配 IPv6 地址,则不需要任何操作。
    • 如果您的本地网络需要静态 IPv6 地址,请将地址、网络掩码、默认网关、DNS 服务器和 DNS 搜索域设为 bond0 连接:
      # nmcli connection modify bond0 ipv6.addresses '2001:db8:1::1/64'
      # nmcli connection modify bond0 ipv6.gateway '2001:db8:1::fffe'
      # nmcli connection modify bond0 ipv6.dns '2001:db8:1::fffd'
      # nmcli connection modify bond0 ipv6.dns-search 'example.com'
      # nmcli connection modify bond0 ipv6.method manual
      
  4. 显示连接配置集:
    # nmcli connection show
    NAME             UUID                                  TYPE      DEVICE
    Docking_station  256dd073-fecc-339d-91ae-9834a00407f9  ethernet  enp11s0u1
    Wi-Fi            1f1531c7-8737-4c60-91af-2d21164417e8  wifi      wlp1s0
    ...
    
    下一步需要连接配置集的名称和以太网设备名称。
  5. 为绑定分配以太网连接的配置:
    # nmcli connection modify Docking_station master bond0
    
  6. 为绑定分配 Wi-Fi 连接的连接配置集:
    # nmcli connection modify Wi-Fi master bond0
    
  7. 如果您的 Wi-Fi 网络使用 MAC 过滤来只允许允许列表中的 MAC 地址访问网络,请配置网络管理器(NetworkManager)为绑定动态分配活跃端口的 MAC 地址:
    # nmcli connection modify bond0 +bond.options fail_over_mac=1
    
    使用这个设置时,您必须将 Wi-Fi 设备的 MAC 地址设置为 allow 列表,而不是以太网和 Wi-Fi 设备的 MAC 地址。
  8. 将与以太连接关联的设备设置为绑定的主设备:
    # nmcli con modify bond0 +bond.options "primary=enp11s0u1"
    
  9. 配置当 bond0 设备激活时,NetworkManager 会自动激活端口:
    # nmcli connection modify bond0 connection.autoconnect-slaves 1
    
  10. 激活 bond0 连接:
    # nmcli connection up bond0
    

验证

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

第15章 配置 VPN 连接

本章介绍了如何配置虚拟专用网络(VPN)连接。

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

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

前提条件

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

流程

  1. 进入 Settings 。
  2. 选择左侧 Network 条目。
  3. 点击 VPN 右侧的 + 图标。
  4. 选择 VPN 。
  5. 选择 Identity 菜单条目来查看基本配置选项:
    • General : 网关-远程 VPN 网关的名称或 IP 地址。
    • Authentication :类型
    • IKEv2(Certificate)- 客户端通过证书进行身份验证。更安全(默认)。
    • IKEv1(XAUTH) - 客户端通过用户名和密码或预共享密钥(PSK)进行身份验证。 control-center配置VPN_1 以下配置设置在 高级 部分中提供:
    • Identification
    • domain 如果需要,输入域名。
    • Security
    • phase1 Algorithms 对应 ike Libreswan 参数,输入用于身份验证和设置加密频道的算法。
    • phase2 Algorithms 对应 esp Libreswan 参数,输入用于 IPsec 协商的算法。 检查 Disable PFS 字段以关闭 Perfect Forward Secrecy(PFS),以确保与不支持 PFS 的旧服务器兼容。
    • Phase1 Lifetime 对应 ikelifetime Libreswan 参数,用于加密流量的密钥的有效期。
    • phase2 Lifetime 对应 salifetime Libreswan 参数,在过期前特定连接实例应持续多长时间。 注意:为了安全起见,加密密钥应该不时地更改。
    • Connectivity
    • Remote Network 对应 rightsubnet Libreswan 参数,应该通过 VPN 访问的目标专用远程网络。
    • Enable fragmentation 对应 fragmentation Libreswan 参数是否允许 IKE 碎片。有效值为 yes (默认)或 no。
    • Enable Mobike 对应 mobike Libreswan 参数,是否允许移动性和多功能协议(MOBIKE、RFC 4555)启用连接以迁移其端点,而无需从头开始重新启动连接。这可用于在有线、无线或者移动数据连接之间进行切换的移动设备。值为 no (默认)或 yes。 control-center配置VPN_2
  6. 选择 IPv4 菜单条目:

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

      当 Automatic 为 ON 时,将其切换到 OFF 以输入您要使用逗号分开的 DNS 服务器的 IP 地址。 - Routes

      请注意,在 Routes 部分,当 Automatic 为 ON 时,会使用来自 DHCP 的路由,但您也可以添加其他静态路由。OFF 时,仅使用静态路由。 - Address 输入远程网络或主机的 IP 地址。 - Netmask 上面输入的 IP 地址 的子网掩码或前缀长度。 - Gateway 上面输入的 IP 地址 的子网掩码或前缀长度。 - Metric 网络成本,赋予此路由的首选值。数值越低,优先级越高。 - 仅将此连接用于其网络上的资源

      选择这个复选框以防止连接成为默认路由。选择这个选项意味着只有特别用于路由的流量才会通过连接自动获得,或者手动输入到连接上。

  7. 要在 VPN 连接中配置 IPv6 设置,请选择 IPv6 菜单条目:

    • IPv6 Method
    • 自动 - 选择此选项以使用 IPv6 无状态地址自动配置(SLAAC),基于硬件地址和路由器公告(RA)创建自动无状态配置。
    • 自动,仅 DHCP - 选择此选项以不使用 RA,而是直接从 DHCPv6 请求信息以创建有状态配置。
    • 仅链接 - 如果您要连接的网络没有 DHCP 服务器且您不想手动分配 IP 地址,请选择这个选项。随机地址将根据 RFC 4862 进行分配,前缀为 FE80::0。
    • Manual - 如果要手动分配 IP 地址,请选择这个选项。
    • disable - 此连接禁用 IPv6。

    请注意,DNS、Route s、仅将此连接用于其网络上的资源 对 IPv4 设置很常见。

  8. 编辑完 VPN 连接后,点 Add 按钮自定义配置,或者使用 Apply 按钮为现有配置保存它。

  9. 将配置集切换为 ON 激活 VPN 连接。

15.2.使用 nm-connection-editor 配置 VPN 连接

前提条件

  • 已安装 NetworkManager-libreswan-gnome 软件包。
  • 如果您配置了互联网密钥交换(IKEv2)验证:
  • 将证书导入到IPsec网络安全服务(NSS)数据库中。
  • NSS 数据库中的证书名称是已知的。

流程

  1. 在终端输入:nm-connection-editor
  2. 点击 + 按钮来添加一个新的连接。
  3. 选择 IPsec based VPN 连接类型,然后点击 Create。
  4. 在 VPN 选项卡中:
  5. 在 Gateway 字段中输入 VPN 网关的主机名或 IP 地址,然后选择验证类型。根据验证类型,您必须输入不同的额外信息:
    • IKEv2(Certificate)- 客户端通过证书进行身份验证,更安全。此设置需要在IPsec NSS 数据库中指定证书的名称。
    • IKEv1(XAUTH) - 客户端通过用户名和密码或预共享密钥(PSK)进行身份验证。此设置要求您输入以下信息:
    • 用户名
    • 密码
    • 组名称
    • 密钥
  6. 如果远程服务器为 IKE 交换指定了本地标识符,在 Remote ID 字段中输入准确的字符串。在运行 Libreswan 的远程服务器中,这个值是在服务器的 leftid 参数中设置的。 nm-connection-editor配置VPN_1
  7. (可选)点击 Advanced 按钮配置附加设置。您可以配置以下设置:

    • Identification
      • domain 如果需要,输入域名。
    • Security
      • phase1 Algorithms 对应 ike Libreswan 参数,输入用于身份验证和设置加密频道的算法。
      • phase2 Algorithms 对应 esp Libreswan 参数,输入用于 IPsec 协商的算法。 检查 Disable PFS 字段以关闭 Perfect Forward Secrecy(PFS),以确保与不支持 PFS 的旧服务器兼容。
      • Phase1 Lifetime 对应 ikelifetime Libreswan 参数,用于加密流量的密钥的有效期。
      • phase2 Lifetime 对应 salifetime Libreswan 参数,在过期前特定连接实例应持续多长时间。 注意:为了安全起见,加密密钥应该不时地更改。
    • Connectivity
      • Remote Network 对应 rightsubnet Libreswan 参数,应该通过 VPN 访问的目标专用远程网络。
      • Enable fragmentation 对应 fragmentation Libreswan 参数是否允许 IKE 碎片。有效值为 yes (默认)或 no。
      • Enable Mobike 对应 mobike Libreswan 参数,是否允许移动性和多功能协议(MOBIKE、RFC 4555)启用连接以迁移其端点,而无需从头开始重新启动连接。这可用于在有线、无线或者移动数据连接之间进行切换的移动设备。值为 no (默认)或 yes。
  8. 在 IPv4 Settings 选项卡中,选择 IP 分配方法,并可选择设置静态地址、DNS 服务器、搜索域和路由。 nm-connection-editor配置VPN_2

  9. 保存设置。
  10. 关闭 nm-connection-editor。

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

卸载硬件的封装安全负载(ESP)来加速以太网上的 IPsec 连接。默认情况下,Libreswan 会检测硬件是否支持这个功能,并默认启用 ESP 硬件卸载。本节描述了如何在禁用或显式启用此功能时启用自动检测。

前提条件

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

流程

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

验证

如果网卡支持 ESP 硬件卸载支持,请按照以下步骤验证结果:

  1. 显示 IPsec 连接使用的以太网设备计数器 tx_ipsec 和 rx_ipsec :
    # ethtool -S enp1s0 | egrep "_ipsec"
        tx_ipsec: 10
        rx_ipsec: 10
    
  2. 通过 IPsec 隧道发送流量。例如,ping 远程 IP 地址:
    # ping -c 5 remote_ip_address
    
  3. 再次显示 tx_ipsec 和 rx_ipsec 以太网设备计数器:
    # ethtool -S enp1s0 | egrep "_ipsec"
        tx_ipsec: 15
        rx_ipsec: 15
    
    如果计数器值增加了,说明 ESP 硬件卸载正常工作。

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

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

前提条件

  • 绑定中的所有网卡都支持 ESP 硬件卸载。
  • 网络驱动程序支持对绑定设备的 ESP 硬件卸载。在 RHEL 中,只有 ixgbe 驱动程序支持此功能。
  • 绑定已配置且可以正常工作。
  • 该绑定使用 active-backup 模式。绑定驱动程序不支持此功能的任何其他模式。
  • IPsec 连接已配置且可以正常工作。

流程

  1. 对网络绑定启用 ESP 硬件卸载支持:
    # nmcli connection modify bond0 ethtool.feature-esp-hw-offload on
    
  2. 重新激活 bond0 连接:
    # nmcli connection up bond0
    
  3. 编辑应使用 ESP 硬件卸载的连接的 /etc/ipsec.d/ 目录中的 Libreswan 配置文件,并将 nic-offload=yes 语句附加到连接条目:
    conn example
    ...
    nic-offload=yes
    
  4. 重启 ipsec 服务:
    # systemctl restart ipsec
    

验证

  1. 显示绑定的活动端口:
    # grep "Currently Active Slave" /proc/net/bonding/bond0
    Currently Active Slave: enp1s0
    
  2. 显示 IPsec 连接使用的以太网设备计数器 tx_ipsec 和 rx_ipsec :
    # ethtool -S enp1s0 | egrep "_ipsec"
        tx_ipsec: 10
        rx_ipsec: 10
    
  3. 通过 IPsec 隧道发送流量。例如,ping 远程 IP 地址:
    # ping -c 5 remote_ip_address
    
  4. 再次显示 tx_ipsec 和 rx_ipsec 以太网设备计数器:
    # ethtool -S enp1s0 | egrep "_ipsec"
        tx_ipsec: 15
        rx_ipsec: 15
    
    如果计数器值增加了,说明 ESP 硬件卸载正常工作。

第16章 配置 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 层动作。

16.1.使用 nmcli 配置 IPIP 隧道

IP over IP(IPIP)隧道工作在 OSI 模型第 3 层,通过 IPIP 隧道发送的数据没有加密。出于安全考虑,应只在已经加密的数据中使用隧道,比如 HTTPS。

请注意,IPIP 隧道只支持单播数据包。如果您需要支持多播的 IPv4 隧道,请参阅 使用 nmcli 配置 GRE 隧道来封装 IPv4 数据包中的第 3 层流量。

下图描述了如何在两个路由器之间创建 IPIP 隧道以通过互联网连接两个内部子网,如下图所示: IPIP-tunnel

前提条件

  • 每个路由器都有一个网络接口,它连接到其本地子网。
  • 每个路由器都有一个网络接口,它连接到互联网。
  • 您需要通过隧道发送的流量是 IPv4 单播。

流程

  1. 在网络 A 的路由器上:
  2. 创建名为 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
    
    remote 和 local 参数设置远程和本地路由器的公共 IP 地址。
  3. 将 IPv4 地址设为 tun0 设备:
    # nmcli connection modify tun0 ipv4.addresses '10.0.1.1/30'
    
    请注意,具有两个可用 IP 地址的 /30 子网足以满足隧道的需要。
  4. 将 tun0 连接配置为使用手动 IPv4 配置:
    # nmcli connection modify tun0 ipv4.method manual
    
  5. 添加一个静态路由,其将到 172.16.0.0/24 网络的流量路由到路由器 B 上的隧道 IP:
    # nmcli connection modify tun0 +ipv4.routes "172.16.0.0/24 10.0.1.2"
    
  6. 启用 tun0 连接。
    # nmcli connection up tun0
    
  7. 启用数据包转发:
    # echo "net.ipv4.ip_forward=1" > /etc/sysctl.d/95-IPv4-forwarding.conf
    # sysctl -p /etc/sysctl.d/95-IPv4-forwarding.conf
    
  8. 在网络 B 的路由器中:
  9. 创建名为 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
    
    remote 和 local 参数设置远程和本地路由器的公共 IP 地址。
  10. 将 IPv4 地址设为 tun0 设备:
    # nmcli connection modify tun0 ipv4.addresses '10.0.1.2/30'
    
  11. 将 tun0 连接配置为使用手动 IPv4 配置:
    # nmcli connection modify tun0 ipv4.method manual
    
  12. 添加一个静态路由,其将到 192.0.2.0/24 网络的流量路由到路由器 A 上的隧道 IP:
    # nmcli connection modify tun0 +ipv4.routes "192.0.2.0/24 10.0.1.1"
    
  13. 启用 tun0 连接。
    # nmcli connection up tun0
    
  14. 启用数据包转发:
    # echo "net.ipv4.ip_forward=1" > /etc/sysctl.d/95-IPv4-forwarding.conf
    # sysctl -p /etc/sysctl.d/95-IPv4-forwarding.conf
    

验证

  • 从每个路由器中,ping 路由器的内部接口的 IP 地址:
  • 在路由器 A 上,ping 172.16.0.1 :
    # ping 172.16.0.1
    
  • 在路由器 A 上,ping 172.16.0.1 :
    # ping 192.0.2.1
    

16.2. 使用 nmcli 配置 GRE 隧道来封装 IPv4 数据包中的第 3 层流量

Generic Routing Encapsulation(GRE)隧道封装 IPv4 数据包中的第 3 层流量,如 RFC 2784 所述。GRE 隧道可以使用有效的以太网类型封装任何第 3 层协议。通过 GRE 隧道发送的数据没有加密。出于安全考虑,应只在已经加密的数据中使用隧道,比如 HTTPS。

下图描述了如何在两个路由器之间创建 GRE 隧道以及通过互联网连接两个内部子网: GRE-tunnel 注意, gre0 是保留词,请使用 gre1 为隧道命名。

前提条件

  • 每个路由器都有一个网络接口,它连接到其本地子网。
  • 每个路由器都有一个网络接口,它连接到互联网。

流程

  1. 在网络 A 的路由器上:
  2. 创建名为 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
    
    remote 和 local 参数设置远程和本地路由器的公共 IP 地址。
  3. 将 IPv4 地址设为 gre1 设备:
    # nmcli connection modify gre1 ipv4.addresses '10.0.1.1/30'
    
    请注意,具有两个可用 IP 地址的 /30 子网足以满足隧道的需要。
  4. 将 gre1 连接配置为使用手动 IPv4 配置:
    # nmcli connection modify gre1 ipv4.method manual
    
  5. 添加一个静态路由,其将到 172.16.0.0/24 网络的流量路由到路由器 B 上的隧道 IP:
    # nmcli connection modify gre1 +ipv4.routes "172.16.0.0/24 10.0.1.2"
    
  6. 启用 gre1 连接。
    # nmcli connection up gre1
    
  7. 启用数据包转发:
    # echo "net.ipv4.ip_forward=1" > /etc/sysctl.d/95-IPv4-forwarding.conf
    # sysctl -p /etc/sysctl.d/95-IPv4-forwarding.conf
    
  8. 在网络 B 的路由器中:
  9. 创建名为 gre1 的 IPIP 隧道接口:
    # nmcli connection add type ip-tunnel ip-tunnel.mode ipip con-name gre1 ifname gre1 remote 203.0.113.10 local 198.51.100.5
    
    remote 和 local 参数设置远程和本地路由器的公共 IP 地址。
  10. 将 IPv4 地址设为 gre1 设备:
    # nmcli connection modify gre1 ipv4.addresses '10.0.1.2/30'
    
  11. 将 gre1 连接配置为使用手动 IPv4 配置:
    # nmcli connection modify gre1 ipv4.method manual
    
  12. 添加一个静态路由,其将到 192.0.2.0/24 网络的流量路由到路由器 A 上的隧道 IP:
    # nmcli connection modify gre1 +ipv4.routes "192.0.2.0/24 10.0.1.1"
    
  13. 启用 gre1 连接。
    # nmcli connection up gre1
    
  14. 启用数据包转发:
    # echo "net.ipv4.ip_forward=1" > /etc/sysctl.d/95-IPv4-forwarding.conf
    # sysctl -p /etc/sysctl.d/95-IPv4-forwarding.conf
    

验证

  • 从每个路由器中,ping 路由器的内部接口的 IP 地址:
  • 在路由器 A 上,ping 172.16.0.1 :
    # ping 172.16.0.1
    
  • 在路由器 A 上,ping 172.16.0.1 :
    # ping 192.0.2.1
    

16.3.配置 GRETAP 隧道来通过 IPv4 传输以太网帧

通用路由封装终端接入点(GRETAP)隧道在 OSI 模型第 2 层上运行,并封装 IPv4 数据包中的以太网流量,如 RFC 2784 所述。通过 GRETAP 隧道发送的数据没有加密。出于安全考虑,请通过 VPN 或不同的加密连接建立隧道。

下图描述了如何在两个路由器之间创建 GRETAP 隧道以使用桥接连接两个网络: GRETAP-tunnel 请注意,gretap0 是保留次,此处使用 gretap1 作为连接名称

前提条件

  • 每个路由器都有一个网络接口,它连接到其本地网络,接口没有分配 IP 配置。
  • 每个路由器都有一个网络接口,它连接到互联网。

流程

  1. 在网络 A 的路由器上:
  2. 创建名为 bridge0 的网桥接口:
    # nmcli connection add type bridge con-name bridge0 ifname bridge0
    
  3. 配置网桥的 IP 设置:
    # nmcli connection modify bridge0 ipv4.addresses '192.0.2.1/24'
    # nmcli connection modify bridge0 ipv4.method manual
    
  4. 为连接到本地网络的接口添加新连接配置集到网桥:
    # nmcli connection add type ethernet slave-type bridge con-name bridge0-port1 ifname enp1s0 master bridge0
    
  5. 为网桥添加 GRETAP 隧道接口的新连接配置集:
    # nmcli connection add type ip-tunnel ip-tunnel.mode gretap slave-type bridge con-name bridge0-port2 ifname gretap1 remote 198.51.100.5 local 203.0.113.10 master bridge0
    
    remote 和 local 参数设置远程和本地路由器的公共 IP 地址。
  6. 关闭 STP(Spanning Tree Protocol)如果您不需要:
    # nmcli connection modify bridge0 bridge.stp no
    
  7. 配置激活 bridge0 连接会自动激活网桥端口:
    # nmcli connection modify bridge0 connection.autoconnect-slaves 1
    
  8. 激活 bridge0 连接:
    # nmcli connection up bridge0
    
  9. 在网络 B 的路由器上:
  10. 创建名为 bridge0 的网桥接口:
    # nmcli connection add type bridge con-name bridge0 ifname bridge0
    
  11. 配置网桥的 IP 设置:
    # nmcli connection modify bridge0 ipv4.addresses '192.0.2.2/24'
    # nmcli connection modify bridge0 ipv4.method manual
    
  12. 为连接到本地网络的接口添加新连接配置集到网桥:
    # nmcli connection add type ethernet slave-type bridge con-name bridge0-port1 ifname enp1s0 master bridge0
    
  13. 为网桥添加 GRETAP 隧道接口的新连接配置集:
    # nmcli connection add type ip-tunnel ip-tunnel.mode gretap slave-type bridge con-name bridge0-port2 ifname gretap1 remote 203.0.113.10 local 198.51.100.5 master bridge0
    
    remote 和 local 参数设置远程和本地路由器的公共 IP 地址。
  14. 关闭 STP(Spanning Tree Protocol)如果您不需要:
    # nmcli connection modify bridge0 bridge.stp no
    
  15. 配置激活 bridge0 连接会自动激活网桥端口:
    # nmcli connection modify bridge0 connection.autoconnect-slaves 1
    
  16. 激活 bridge0 连接:
    # nmcli connection up bridge0
    

验证

  1. 在两个路由器上,验证 enp1s0 和 gretap1 连接是否已连接,并且 CONNECTION 列是否显示端口的连接名称:
    # nmcli device
    nmcli device
    DEVICE   TYPE      STATE      CONNECTION
    ...
    bridge0  bridge    connected  bridge0
    enp1s0   ethernet  connected  bridge0-port1
    gretap1  iptunnel  connected  bridge0-port2
    
  2. 在每个路由器中,ping 路由器的内部接口的 IP 地址:
  3. 在路由器 A 上,ping 192.0.2.2 :
    # ping 192.0.2.2
    
  4. 在路由器 B 上,ping 192.0.2.1 :
    # ping 192.0.2.1
    

第17章 使用network-scripts

默认情况下,OpenCloudOS 使用 NetworkManager 配置和管理网络连接,/usr/sbin/ifup 和 /usr/sbin/ifdown 两个脚本使用 NetworkManager 来处理 /etc/sysconfig/network-scripts/ 目录中的 ifcfg 文件。

如果您需要使用 network-scripts 来配置和管理网络,您可以安装它。此时,/usr/sbin/ifup 和 /usr/sbin/ifdown 脚本会链接到管理网络配置的 shell 脚本。

  • 安装 network-scripts 软件包:
    # yum install network-scripts
    

第18章 端口镜像

网络管理员可以使用端口镜像复制从一个网络设备传输到另一个网络设备的入站和出站网络流量。使用端口镜像来监控、收集网络流量,可用于:

  • 调试网络问题并调整网络流
  • 检查并分析网络流量,来对网络问题进行故障排除
  • 检测入侵

18.1.使用 nmcli 配置网络端口镜像

您可以使用 NetworkManager 配置端口镜像。以下流程通过将流量控制(tc)规则和过滤器添加到 enp1s0,将网络流量从 enp1s0 复制到 enp7s0 网络接口。

前提条件

  • 有一个用作网络流量镜像的网络接口

流程

  1. 添加您要复制网络流量的网络连接配置集:
    # nmcli connection add type ethernet ifname enp1s0 con-name enp1s0 autoconnect no
    
  2. 将 prio qdisc 以 10:handle模式附加到流量出口 enp1s0 :
    # nmcli connection modify enp1s0 +tc.qdisc "root prio handle 10:"
    
    在没有子项的情况下,附加 prio qdisc 允许附加过滤器。
  3. 为入口流量添加 qdisc,使用 ffff: handle 添加 qdisc:
    # nmcli connection modify enp1s0 +tc.qdisc "ingress handle ffff:"
    
  4. 添加以下过滤器,以匹配入口和出口 qdiscs 上的数据包,并将其复制到 enp7s0 :
    # nmcli connection modify enp1s0 +tc.tfilter "parent ffff: matchall action mirred egress mirror dev enp7s0"
    
    # nmcli connection modify enp1s0 +tc.tfilter "parent 10: matchall action mirred egress mirror dev enp7s0"
    
    matchall 过滤器与所有数据包匹配,mirred 操作会将数据包重定向到目的地。
  5. 激活连接:
    # nmcli connection up enp1s0
    

验证

  1. 安装 tcpdump 工具:
    # yum install tcpdump
    
  2. 查看目标设备上镜像的流量(enp7s0):
    # tcpdump -i enp7s0
    

第19章 配置网络设备接受来自所有 MAC 地址的流量(混杂模式)

网络设备通常会拦截和读取程序所需要接收的数据包。您可以在虚拟交换机或端口组层面上,将网络设备配置为接受来自所有 MAC 地址的流量。

使用这项设置可以用来:

  • 诊断网络连接问题,
  • 监控网络活动提高安全性,
  • 拦截传输中的私有数据或网络中的入侵。

本章介绍了如何使用 iproute2、 nmcli 或 nmstatectl 工具来将网络设备配置为接受来自所有 MAC 地址的流量。您可以为除 InfiniBand 以外的任何类型的网络设备启用此模式。

19.1.使用 iproute2 临时配置网卡混杂模式

本节介绍了配置网络设备来接受所有流量,而不考虑 MAC 地址。使用 iproute2 工具所做的任何更改都是临时的,并在机器重启后丢失。

流程

  1. 可选:显示网络接口以确定您要接收所有流量的接口:
    # ip a
    1: enp1s0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc fq_codel state DOWN group default qlen 1000
        link/ether 98:fa:9b:a4:34:09 brd ff:ff:ff:ff:ff:ff
    2: bond0: <NO-CARRIER,BROADCAST,MULTICAST,MASTER,UP> mtu 1500 qdisc noqueue state DOWN group default qlen 1000
        link/ether 6a:fd:16:b0:83:5c brd ff:ff:ff:ff:ff:ff
    3: wlp1s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    ...
    
  2. 修改设备以启用或禁用 accept-all-mac-addresses 属性。
    • 为 enp1s0 启用 accept-all-mac-addresses 模式:
      # ip link set enp1s0 promisc on
      
    • 为 enp1s0 禁用 accept-all-mac-addresses 模式:
      # ip link set enp1s0 promisc off
      

验证

  • 验证 accept-all-mac-addresses 模式是否已启用:
    # ip link show enp1s0
    1: enp1s0: <NO-CARRIER,BROADCAST,MULTICAST,PROMISC,UP> mtu 1500 qdisc fq_codel state DOWN mode DEFAULT group default qlen 1000
        link/ether 98:fa:9b:a4:34:09 brd ff:ff:ff:ff:ff:ff
    
    设备描述中的 PROMISC 标志表示启用了该模式。

19.2.使用 nmcli 配置网卡混杂模式

流程

  1. 可选:显示网络接口以确定您要接收所有流量的接口:
    # ip a
    1: enp1s0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc fq_codel state DOWN group default qlen 1000
        link/ether 98:fa:9b:a4:34:09 brd ff:ff:ff:ff:ff:ff
    2: bond0: <NO-CARRIER,BROADCAST,MULTICAST,MASTER,UP> mtu 1500 qdisc noqueue state DOWN group default qlen 1000
        link/ether 6a:fd:16:b0:83:5c brd ff:ff:ff:ff:ff:ff
    3: wlp1s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    ...
    
  2. 修改设备以启用或禁用 accept-all-mac-addresses 属性。
    • 为 enp1s0 启用 accept-all-mac-addresses 模式:
      # nmcli connection modify enp1s0 ethernet.accept-all-mac-addresses yes
      
    • 为 enp1s0 禁用 accept-all-mac-addresses 模式:
      # nmcli connection modify enp1s0 ethernet.accept-all-mac-addresses no
      
  3. 重启网卡以应用更改:
    # nmcli connection up enp1s0
    

验证

  • 验证 ethernet.accept-all-mac-addresses 模式是否已启用:
    # nmcli connection show enp1s0
    ...
    802-3-ethernet.accept-all-mac-addresses:1     (true)
    
    802-3-ethernet.accept-all-mac-addresses: true 表示该模式已启用。

19.3.使用 nmstatectl 配置网卡混杂模式

前提条件

  • nmstate 软件包已安装
  • 用于配置设备的 .yml 文件可用

流程

  1. 编辑或新建 enp1s0.yml 文件,修改 accept -all-mac-address: true :
    ---
    interfaces:
    - name: enp1s0
        type: ethernet
        state: up
        accept -all-mac-address: true
    
  2. 应用设置:
    # nmstatectl apply /enp1s0.yml
    

验证

  • 验证 ethernet.accept-all-mac-addresses 模式是否已启用:
    # nmcli connection show enp1s0
    ...
    802-3-ethernet.accept-all-mac-addresses:1     (true)
    
    802-3-ethernet.accept-all-mac-addresses: true 表示该模式已启用。

第20章 设置 802.1x 网络身份验证服务

IEEE 802.1X 标准定义了安全身份验证和授权方法,以保护网络不接受未授权的客户端。使用 hostapd 服务和 FreeRADIUS,您可以在您的网络中提供网络访问控制(NAC)。

在本文档中,主机充当一个网桥,以使用现有的网络连接不同的客户端。但是,主机只授权认证的客户端可以访问网络。

authenticator-802-1x

20.1.安装 freeradius

# yum install freeradius

如果 freeradius 软件包已安装,请删除 /etc/raddb/ 目录,卸载,然后再次安装该软件包。不要使用 yum reinstall 命令重新安装软件包,因为 /etc/raddb/ 目录中的权限和符号链接会不同。

20.2.在验证主机上设置网桥

网桥是一个链路层设备,它根据 MAC 地址表在主机和网络之间转发流量。如果将主机设置为 802.1X 验证器,请将要在其上执行身份验证的接口和 LAN 接口添加到网桥。

前提条件

  • 主机有多个网卡接口

流程

  1. 创建网桥:
    # nmcli connection add type bridge con-name br0 ifname br0
    
  2. 将太网接口分配给网桥:
    # nmcli connection add type ethernet slave-type bridge con-name br0-port1 ifname enp1s0 master br0
    # nmcli connection add type ethernet slave-type bridge con-name br0-port2 ifname enp7s0 master br0
    # nmcli connection add type ethernet slave-type bridge con-name br0-port3 ifname enp8s0 master br0
    # nmcli connection add type ethernet slave-type bridge con-name br0-port4 ifname enp9s0 master br0
    
  3. 启用网桥以转发 LAN(EAPOL)数据包上的可扩展验证协议:
    # nmcli connection modify br0 group-forward-mask 8
    
  4. 配置连接以自动激活端口:
    # nmcli connection modify br0 connection.autoconnect-slaves 1
    
  5. 激活网卡连接:
    # nmcli connection up br0
    

验证

  1. 显示作为网桥端口的设备状态:
    # ip link show master br0
    3: enp1s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel master br0 state UP mode DEFAULT group default qlen 1000
    link/ether 52:54:00:62:61:0e brd ff:ff:ff:ff:ff:ff
    ...
    
  2. 查看 br0 上是否启用了 EAPOL 数据包的转发:
    # cat /sys/class/net/br0/bridge/group_fwd_mask
    0x8
    
    如果返回值为 0x8 ,则说明启用了转发。

20.3.FreeRADIUS 的证书要求

在使用 FreeRADIUS 安全服务时,您需要不同的 TLS 证书来满足不同的目的:

  • 用于加密连接到服务器的 TLS 服务器证书。使用信任的证书颁发机构(CA)来发布证书。 服务器证书要求将扩展密钥使用(EKU)字段设为 TLS Web Server Authentication。

  • 由同一 CA 为扩展身份验证协议传输层安全(EAP-TLS)发布的客户端证书。EAP-TLS 提供基于证书的身份验证,并默认启用。 客户端证书需要其 EKU 字段设为 TLS Web Client Authentication。

如果要保证连接的私密性,请使用您公司的 CA 或创建自己的 CA 来为 FreeRADIUS 发布证书。如果使用公共 CA,则您将允许其验证用户,并为 EAP-TLS 发布客户端证书。

20.4.在 FreeRADIUS 服务器上,创建一组测试证书

出于测试目的,freeradius 软件包会在 /etc/raddb/certs/ 目录中安装脚本和配置文件,以创建自己的证书颁发机构(CA)并发布证书。

如果您使用默认配置,这些脚本生成的证书会在 60 天后过期,密钥使用不安全的密码("whatever")。您也可以自定义 CA、服务器和客户端配置。

按流程创建以下所需的文件:

  • /etc/raddb/certs/ca.pem: CA 证书
  • /etc/raddb/certs/server.key: 服务器证书的私钥
  • /etc/raddb/certs/server.pem: 服务器证书
  • /etc/raddb/certs/client.key: 客户端证书的私钥
  • /etc/raddb/certs/client.pem: 客户端证书

前提条件

  • 已安装 freeradius 。

流程

  1. 进入 /etc/raddb/certs/ 目录:
    # cd /etc/raddb/certs/
    
  2. 可选:自定义 CA 配置 ca.conf:
    ...
    [ req ]
    default_bits            = 2048
    input_password          = ca_password
    output_password         = ca_password
    ...
    [certificate_authority]
    countryName             = US
    stateOrProvinceName     = North Carolina
    localityName            = Raleigh
    organizationName        = Example Inc.
    emailAddress            = admin@example.org
    commonName              = "Example Certificate Authority"
    ...
    
  3. 可选:自定义服务器配置 server.cnf:
    ...
    [ CA_default ]
    default_days            = 730
    ...
    [ req ]
    distinguished_name      = server
    default_bits            = 2048
    input_password          = key_password
    output_password         = key_password
    ...
    [server]
    countryName             = US
    stateOrProvinceName     = North Carolina
    localityName            = Raleigh
    organizationName        = Example Inc.
    emailAddress            = admin@example.org
    commonName              = "Example Server Certificate"
    ...
    
  4. 可选:自定义客户端配置 client.cnf:
    ...
    [ CA_default ]
    default_days            = 365
    ...
    [ req ]
    distinguished_name      = client
    default_bits            = 2048
    input_password          = password_on_private_key
    output_password         = password_on_private_key
    ...
    [client]
    countryName             = US
    stateOrProvinceName     = North Carolina
    localityName            = Raleigh
    organizationName        = Example Inc.
    emailAddress            = user@example.org
    commonName              = user@example.org
    ...
    
  5. 创建证书:
    # make all
    
  6. 将 /etc/raddb/certs/server.pem 文件中的组更改为 radiusd :
    # chgrp radiusd /etc/raddb/certs/server.pem*
    

20.5.配置 FreeRADIUS 以使用 EAP 安全地验证网络客户端

FreeRADIUS 支持不同的扩展验证协议(EAP)。但是出于网络安全的目的,本文档介绍了如何配置 FreeRADIUS 来支持以下安全 EAP 身份验证方法:

  • EAP-TLS(传输层安全协议)使用安全 TLS 连接来验证使用证书的客户端。要使用 EAP-TLS,需要每个网络客户端的 TLS 客户端证书,以及服务器的服务器证书。请注意,同样的证书颁发机构(CA)必须已发布了证书。始终使用您自己的 CA 来创建证书,因为您使用的 CA 发布的所有客户端证书都可以向 FreeRADIUS 服务器进行身份验证。
  • EAP-TTLS(隧道传输层安全协议)使用安全 TLS 连接,并使用密码认证协议(PAP)或挑战握手身份验证协议(CHAP)等机制来验证客户端。要使用 EAP-TTLS,您需要一个 TLS 服务器证书。
  • EAP-PEAP(受保护的身份验证协议)使用安全 TLS 连接作为外部身份验证协议来设置隧道。验证器验证 RADIUS 服务器的证书。之后,请求方通过使用 Microsoft 挑战握手身份验证协议版本 2(MS-CHAPv2)或其他方法加密的隧道来进行身份验证。 默认的 FreeRADIUS 配置文件充当了描述了所有参数和指令的文档。如果要禁用某些特性,请注释掉它们,而不是删除配置文件中的相应部分。这可让您保留配置文件和包含的文档的结构。

前提条件

  • 已安装 freeradius 。
  • /etc/raddb/ 目录中的配置文件保持不变,与 freeradius 软件提供的一样。
  • 服务器存在以下文件:
  • FreeRADIUS 主机的 TLS 私钥:/etc/raddb/certs/server.key
  • FreeRADIUS 主机的 TLS 服务器证书:/etc/raddb/certs/server.pem
  • TLS CA 证书:/etc/raddb/certs/ca.pem 如果您将文件存储在不同的位置或者它们有不同的名称,请在 /etc/raddb/mods-available/eap 文件中相应地设置 private_key_file、certificate_file 和 ca_file 参数。

流程

  1. 如果带有 Diffie-Hellman(DH)参数的 /etc/raddb/certs/dh 不存在,就创建一个。例如,要创建带有 2048 位素数的 DH 文件,请输入:
    #openssl dhparam -out /etc/raddb/certs/dh 2048
    
    为了安全起见,请不要使用小于 2048 位素数的 DH 文件。根据位数,文件的创建可能需要几分钟。
  2. 使用 DH 参数对 TLS 私钥、服务器证书、CA 证书和文件设置安全权限:
    # chmod 640 /etc/raddb/certs/server.key /etc/raddb/certs/server.pem /etc/raddb/certs/ca.pem /etc/raddb/certs/dh
    # chown root:radiusd /etc/raddb/certs/server.key /etc/raddb/certs/server.pem /etc/raddb/certs/ca.pem /etc/raddb/certs/dh
    
  3. 编辑 /etc/raddb/mods-available/eap 文件:
    1. 在 private_key_password 参数中设置私钥的密码:
      eap {
          ...
          tls-config tls-common {
              ...
              private_key_password = key_password
              ...
          }
      }
      
    2. 根据您的环境,将 eap 指令中的 default_eap_type 参数设为您使用的主要 EAP 类型:
      eap {
          ...
          default_eap_type = ttls
          ...
      }
      
      出于安全性考虑,请仅使用 ttls、tls 或 peap。
    3. 注释掉 md5 指令,以禁用不安全的 EAP-MD5 身份验证方法:
      eap {
          ...
          # md5 {
          # }
          ...
      }
      
  4. 编辑 /etc/raddb/sites-available/default 文件,然后注释掉 eap 以外的所有身份验证方法:
    authenticate {
        ...
        # Auth-Type PAP {
        #     pap
        # }
    
        # Auth-Type CHAP {
        #     chap
        # }
    
        # Auth-Type MS-CHAP {
        #     mschap
        # }
    
        # mschap
    
        # digest
        ...
    }
    
    这只会启用 EAP,并禁用纯文本身份验证方法。
  5. 编辑 /etc/raddb/clients.conf 文件:
    1. 在 localhost 和 localhost_ipv6 客户端指令中设置安全密码:
      client localhost {
          ipaddr = 127.0.0.1
          ...
          secret = client_password
          ...
      }
      
      client localhost_ipv6 {
          ipv6addr = ::1
          secret = client_password
      }
      
    2. 如果远程主机上的 RADIUS 客户端(如网络验证器)应能够访问 FreeRADIUS 服务,请为它们添加相应的客户端指令:
      client hostapd.example.org {
          ipaddr = 192.0.2.2/32
          secret = client_password
      }
      
      ipaddr 参数接受 IPv4 和 IPv6 地址,您可以使用可选的无类别域间路由(CIDR)表示法来指定范围。但是,在这个参数中您只能设置一个值。例如,若要授予对 IPv4 和 IPv6 地址的访问权限,请添加两个客户端指令。 为客户端指令使用一个描述性名称,如主机名或一个描述 IP 范围在哪里使用的词语。
  6. 如果要使用 EAP-TTLS 或 EAP-PEAP,请将用户添加到 /etc/raddb/users 文件中:
    example_user        Cleartext-Password := "user_password"
    
  7. 验证配置文件:
    # radiusd -XC
    ...
    Configuration appears to be OK
    
  8. 启用并启动 radiusd 服务:
    # systemctl enable --now radiusd
    

故障排除

  1. 停止 radiusd 服务:
    # systemctl stop radiusd
    
  2. 以debug 模式启动该服务:
    # radiusd -X
    ...
    Ready to process requests
    
  3. 在 FreeRADIUS 主机上执行验证测试,如 20.7 、20.8 小节中所述。

20.6.在有线网络中将 hostapd 配置为验证器

主机访问点守护进程(hostapd)服务可在有线网络中充当验证器,来提供 802.1X 身份验证。为此,hostapd 服务需要一个用来验证客户端的 RADIUS 服务器。

hostapd 服务提供集成的 RADIUS 服务器。但是,使用集成的 RADIUS 服务器只用于测试目的。对于生产环境,请使用 FreeRADIUS 服务器,它支持其他特性,如不同的身份验证方法和访问控制。

hostapd 服务不与流量平面交互。该服务仅充当身份验证器。例如,使用脚本或服务,该脚本或服务使用 hostapd 控制接口、根据身份验证事件的结果来允许或拒绝流量。

前提条件

  • 已安装 hostapd 软件包
  • FreeRADIUS 服务器已配置,可以对客户端进行身份验证。

流程

  1. 使用以下内容创建 /etc/hostapd/hostapd.conf 文件:
    # General settings of hostapd
    # ===========================
    
    # Control interface settings
    ctrl_interface=/var/run/hostapd
    ctrl_interface_group=wheel
    
    # Enable logging for all modules
    logger_syslog=-1
    logger_stdout=-1
    
    # Log level
    logger_syslog_level=2
    logger_stdout_level=2
    
    
    # Wired 802.1X authentication
    # ===========================
    
    # Driver interface type
    driver=wired
    
    # Enable IEEE 802.1X authorization
    ieee8021x=1
    
    # Use port access entry (PAE) group address
    # (01:80:c2:00:00:03) when sending EAPOL frames
    use_pae_group_addr=1
    
    
    # Network interface for authentication requests
    interface=br0
    
    
    # RADIUS client configuration
    # ===========================
    
    # Local IP address used as NAS-IP-Address
    own_ip_addr=192.0.2.2
    
    # Unique NAS-Identifier within scope of RADIUS server
    nas_identifier=hostapd.example.org
    
    # RADIUS authentication server
    auth_server_addr=192.0.2.1
    auth_server_port=1812
    auth_server_shared_secret=client_password
    
    # RADIUS accounting server
    acct_server_addr=192.0.2.1
    acct_server_port=1813
    acct_server_shared_secret=client_password
    
    有关此配置中使用的参数的详情,请查看 /usr/share/doc/hostapd/hostapd/hostapd.conf 示例配置文件中的描述。
  2. 启用 hostapd 服务:
    # systemctl enable --now hostapd
    

故障排除

  1. 停止 radiusd 服务:
    # systemctl stop radiusd
    
  2. 以debug 模式启动该服务:
    # radiusd -X
    ...
    Ready to process requests
    
  3. 在 FreeRADIUS 主机上执行验证测试,如 20.7 、20.8 小节中所述。

20.7. 针对 FreeRADIUS 服务器或验证器测试 EAP-TTLS 身份验证

要测试在隧道传输层安全协议(EAP-TTLS)上使用可扩展身份验证协议(EAP-TTLS)的身份验证是否按预期工作,请运行此流程:

  • 设置 FreeRADIUS 服务器。
  • 将 hostapd 服务设为 802.1X 网络身份验证验证器。

此流程中使用的测试工具的输出提供有关 EAP 通信的其他信息,可以帮助您调试问题。

前提条件

  • 当您要验证:
  • FreeRADIUS 服务器:
    • hostapd 软件包提供的 eapol_test 工具已安装。
    • 您在其上运行此流程的客户端已在 FreeRADIUS 服务器的客户端数据库中被授权。
  • 由同名软件包提供的验证器 wpa_supplicant 工具已安装。
  • 您在 /etc/pki/tls/certs/ca.pem 文件中存储了证书颁发机构(CA)证书。

流程

  1. 使用以下内容创建 /etc/wpa_supplicant/wpa_supplicant-TTLS.conf 文件:
        ap_scan=0
    
    network={
        eap=TTLS
        eapol_flags=0
        key_mgmt=IEEE8021X
    
        # Anonymous identity (sent in unencrypted phase 1)
        # Can be any string
        anonymous_identity="anonymous"
    
        # Inner authentication (sent in TLS-encrypted phase 2)
        phase2="auth=PAP"
        identity="example_user"
        password="user_password"
    
        # CA certificate to validate the RADIUS server's identity
        ca_cert="/etc/pki/tls/certs/ca.pem"
    }
    
  2. 要向以下进行身份验证:
    • FreeRADIUS 服务器,请输入:
      # eapol_test -c /etc/wpa_supplicant/wpa_supplicant-TTLS.conf -a 192.0.2.1 -s client_password
      ...
      EAP: Status notification: remote certificate verification (param=success)
      ...
      CTRL-EVENT-EAP-SUCCESS EAP authentication completed successfully
      ...
      SUCCESS
      
      -a 选项定义了 FreeRADIUS 服务器的 IP 地址,而 -s 选项指定您要在其上运行 FreeRADIUS 服务器的客户端配置中命令的主机的密码。
    • 验证器,请输入:
      # wpa_supplicant -c /etc/wpa_supplicant/wpa_supplicant-TTLS.conf -D wired -i enp0s31f6
      ...
      enp0s31f6: CTRL-EVENT-EAP-SUCCESS EAP authentication completed successfully
      ...
      
      -i 选项指定 wpa_supplicant 通过 LAN(EAPOL)数据包发送扩展验证协议的网络接口名称。 若要了解更多调试信息,请将 -d 选项传给命令。

20.8.针对 FreeRADIUS 服务器或验证器测试 EAP-TLS 身份验证

要测试使用可扩展身份验证协议(EAP)传输层安全(EAP-TLS)的身份验证是否按预期工作,请执行以下流程:

  • 设置 FreeRADIUS 服务器。
  • 将 hostapd 服务设为 802.1X 网络身份验证验证器。

此流程中使用的测试工具的输出提供有关 EAP 通信的其他信息,可以帮助您调试问题。

前提条件

  • 当您要验证:
  • FreeRADIUS 服务器:
    • hostapd 软件包提供的 eapol_test 工具已安装。
    • 您在其上运行此流程的客户端已在 FreeRADIUS 服务器的客户端数据库中被授权。
  • 由同名软件包提供的验证器 wpa_supplicant 工具已安装。
  • 您在 /etc/pki/tls/certs/ca.pem 文件中存储了证书颁发机构(CA)证书。
  • 发布客户端证书的 CA 与发布 FreeRADIUS 服务器的服务器证书的 CA 是同一个。
  • 您将客户端证书存储在 /etc/pki/tls/certs/client.pem 文件中。
  • 将客户端的私钥存储在 /etc/pki/tls/private/client.key中

流程

  1. 使用以下内容创建 /etc/wpa_supplicant/wpa_supplicant-TTLS.conf 文件:
    ap_scan=0
    
    network={
        eap=TLS
        eapol_flags=0
        key_mgmt=IEEE8021X
    
        identity="user@example.org"
        client_cert="/etc/pki/tls/certs/client.pem"
        private_key="/etc/pki/tls/private/client.key"
        private_key_passwd="password_on_private_key"
    
        # CA certificate to validate the RADIUS server's identity
        ca_cert="/etc/pki/tls/certs/ca.pem"
    }
    
  2. 要向以下进行身份验证:
    • FreeRADIUS 服务器,请输入:
      # eapol_test -c /etc/wpa_supplicant/wpa_supplicant-TLS.conf -a 192.0.2.1 -s client_password
      ...
      EAP: Status notification: remote certificate verification (param=success)
      ...
      CTRL-EVENT-EAP-SUCCESS EAP authentication completed successfully
      ...
      SUCCESS
      
      -a 选项定义了 FreeRADIUS 服务器的 IP 地址,而 -s 选项指定您要在其上运行 FreeRADIUS 服务器的客户端配置中命令的主机的密码。
    • 验证器,请输入:
      # wpa_supplicant -c /etc/wpa_supplicant/wpa_supplicant-TLS.conf -D wired -i enp0s31f6
      ...
      enp0s31f6: CTRL-EVENT-EAP-SUCCESS EAP authentication completed successfully
      ...
      
      -i 选项指定 wpa_supplicant 通过 LAN(EAPOL)数据包发送扩展验证协议的网络接口名称。 若要了解更多调试信息,请将 -d 选项传给命令。

20.9.根据 hostapd 验证事件阻止和允许流量

hostapd 服务不与流量平面交互。该服务仅充当身份验证器。但是,您可以编写一个脚本,根据身份验证事件的结果来允许或拒绝流量。

此流程不受支持,没有企业级的解决方案。它只演示如何通过评估由 hostapd_cli 检索的事件来阻止或允许流量。

当 802-1x-tr-mgmt systemd 服务启动时,OpenCloudOS 会阻止 hostapd 监听端口上的所有流量,但 LAN(EAPOL)数据包上可扩展验证协议除外,并使用 hostapd_cli 工具连接到 hostapd 控制接口。/usr/local/bin/802-1x-tr-mgmt 脚本随后评估事件。根据 hostapd_cli 收到的不同事件,该脚本允许或阻止 MAC 地址的流量。请注意,当 802-1x-tr-mgmt 服务停止时,所有流量会自动允许。

在 hostapd 服务器上执行此流程。

前提条件

  • hostapd 服务已配置,服务已准备好对客户端进行身份验证。

流程

  1. 使用以下内容创建 /usr/local/bin/802-1x-tr-mgmt 文件:

    #!/bin/sh
    
    if [ "x$1" == "xblock_all" ]
    then
    
        nft delete table bridge tr-mgmt-br0 2>/dev/null || true
        nft -f - << EOF
    table bridge tr-mgmt-br0 {
            set allowed_macs {
                    type ether_addr
            }
    
            chain accesscontrol {
                    ether saddr @allowed_macs accept
                    ether daddr @allowed_macs accept
                    drop
            }
    
            chain forward {
                    type filter hook forward priority 0; policy accept;
                    meta ibrname "br0" jump accesscontrol
            }
    }
    EOF
        echo "802-1x-tr-mgmt Blocking all traffic through br0. Traffic for given host will be allowed after 802.1x authentication"
    
    elif [ "x$1" == "xallow_all" ]
    then
    
        nft delete table bridge tr-mgmt-br0
        echo "802-1x-tr-mgmt Allowed all forwarding again"
    
    fi
    
    case ${2:-NOTANEVENT} in
    
        AP-STA-CONNECTED | CTRL-EVENT-EAP-SUCCESS | CTRL-EVENT-EAP-SUCCESS2)
            nft add element bridge tr-mgmt-br0 allowed_macs { $3 }
            echo "$1: Allowed traffic from $3"
            ;;
    
        AP-STA-DISCONNECTED | CTRL-EVENT-EAP-FAILURE)
            nft delete element bridge tr-mgmt-br0 allowed_macs { $3 }
            echo "802-1x-tr-mgmt $1: Denied traffic from $3"
            ;;
    
    esac
    

  2. 使用以下内容创建 /etc/systemd/system/802-1x-tr-mgmt@.service systemd 服务文件:

    [Unit]
    Description=Example 802.1x traffic management for hostapd
    After=hostapd.service
    After=sys-devices-virtual-net-%i.device
    
    [Service]
    Type=simple
    ExecStartPre=-/bin/sh -c '/usr/sbin/tc qdisc del dev %i ingress > /dev/null 2>&1'
    ExecStartPre=-/bin/sh -c '/usr/sbin/tc qdisc del dev %i clsact > /dev/null 2>&1'
    ExecStartPre=/usr/sbin/tc qdisc add dev %i clsact
    ExecStartPre=/usr/sbin/tc filter add dev %i ingress pref 10000 protocol 0x888e matchall action ok index 100
    ExecStartPre=/usr/sbin/tc filter add dev %i ingress pref 10001 protocol all matchall action drop index 101
    ExecStart=/usr/sbin/hostapd_cli -i %i -a /usr/local/bin/802-1x-tr-mgmt
    ExecStopPost=-/usr/sbin/tc qdisc del dev %i clsact
    
    [Install]
    WantedBy=multi-user.target
    

  3. 重新载入 systemd:

    # systemctl daemon-reload
    

  4. 启动接口 hostapd 正在侦听的 802-1x-tr-mgmt 服务:

    # systemctl enable --now 802-1x-tr-mgmt@br0.service
    

第21章 使用证书保存在文件系统上的 802.1X 标准来向网络验证客户端

管理员通常使用基于 IEEE 802.1X 标准的基于端口的网络访问控制(NAC)来保护网络不受未授权 LAN 和 Wi-Fi 客户端的影响。本章中的步骤描述了配置网络身份验证的不同选项。

21.1.使用 nmcli 在现有以太网连接中配置 802.1X 网络身份验证

使用 nmcli 工具,您可以将客户端配置为向网络进行身份验证。本节介绍了如何在名为 enp1s0 的现有以太网连接配置文件中配置 TLS 身份验证,以向网络进行身份验证。

前提条件

  • 网络支持 802.1X 网络身份验证。
  • 以太网连接配置集存在于 NetworkManager 中,且具有有效的 IP 配置。
  • 客户端上存在 TLS 身份验证所需的以下文件:

  • 客户端密钥存储在 /etc/pki/tls/private/client.key 文件中,该文件归 root 用户所有,且只对 root 可读。

  • 客户端证书存储在 /etc/pki/tls/certs/client.crt 文件中。
  • 证书颁发机构(CA)证书存储在 /etc/pki/tls/certs/ca.crt 文件中。
  • wpa_supplicant 软件包已安装。

流程

  1. 将扩展验证协议(EAP)设置为 tls,将路径设置为客户端证书和密钥文件:
    # nmcli connection modify enp1s0 802-1x.eap tls 802-1x.client-cert /etc/pki/tls/certs/client.crt 802-1x.private-key /etc/pki/tls/certs/certs/client.key
    
    请注意,您必须在同一个命令中设置 802-1x.eap、802-1x.client-cert 和 802-1x.private-key 参数。
  2. 设置 CA 证书的路径:
    # nmcli connection modify enp1s0 802-1x.ca-cert /etc/pki/tls/certs/ca.crt
    
  3. 设置证书中使用的用户的身份:
    # nmcli connection modify enp1s0 802-1x.identity user@example.com
    
  4. 另外,还可将该密码存储在配置中:

    # nmcli connection modify enp1s0 802-1x.private-key-password password
    

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

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

    # nmcli connection up enp1s0
    

21.2.使用 nmstatectl 配置带有 802.1X 网络身份验证的静态以太网连接

前提条件

  • 网络支持 802.1X 网络身份验证。
  • 以太网连接配置集存在于 NetworkManager 中,且具有有效的 IP 配置。
  • 客户端上存在 TLS 身份验证所需的以下文件:

  • 客户端密钥存储在 /etc/pki/tls/private/client.key 文件中,该文件归 root 用户所有,且只对 root 可读。

  • 客户端证书存储在 /etc/pki/tls/certs/client.crt 文件中。
  • 证书颁发机构(CA)证书存储在 /etc/pki/tls/certs/ca.crt 文件中。

流程

  1. 创建 YAML 文件 ~/create-ethernet-profile.yml :
    ---
    interfaces:
    - name: enp1s0
    type: ethernet
    state: up
    ipv4:
        enabled: true
        address:
        - ip: 192.0.2.1
        prefix-length: 24
        dhcp: false
    ipv6:
        enabled: true
        address:
        - ip: 2001:db8:1::1
        prefix-length: 64
        autoconf: false
        dhcp: false
    802.1x:
        ca-cert: /etc/pki/tls/certs/ca.crt
        client-cert: /etc/pki/tls/certs/client.crt
        eap-methods:
        - tls
        identity: client.example.org
        private-key: /etc/pki/tls/private/client.key
        private-key-password: password
    routes:
    config:
    - destination: 0.0.0.0/0
        next-hop-address: 192.0.2.254
        next-hop-interface: enp1s0
    - destination: ::/0
        next-hop-address: 2001:db8:1::fffe
        next-hop-interface: enp1s0
    dns-resolver:
    config:
        search:
        - example.com
        server:
        - 192.0.2.200
        - 2001:db8:1::ffbb
    
  2. 应用配置:
    # nmstatectl apply ~/create-ethernet-profile.yml
    

使用 rhel-system-roles 配置带有 802.1X 网络身份验证的静态以太网连接

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

前提条件

  • ansible 和 rhel-system-roles 软件包已安装在控制节点上。
  • 如果您使用非 root 用户运行 playbook ,请确保该用户在受管节点上具有合适的 sudo 权限。
  • 网络支持 802.1X 网络身份验证。
  • 以太网连接配置集存在于 NetworkManager 中,且具有有效的 IP 配置。
  • 客户端上存在 TLS 身份验证所需的以下文件:

  • 客户端密钥存储在 /etc/pki/tls/private/client.key 文件中,该文件归 root 用户所有,且只对 root 可读。

  • 客户端证书存储在 /etc/pki/tls/certs/client.crt 文件中。
  • 证书颁发机构(CA)证书存储在 /etc/pki/tls/certs/ca.crt 文件中。

流程

  1. 将执行 playbook 的主机 IP 添加到 /etc/ansible/hosts Ansible 清单中:
    node.example.com
    
  2. 创建 playbook ~/enable-802.1x.yml :
    ---
    - name: Configure an Ethernet connection with 802.1X authentication
    hosts: node.example.com
    become: true
    tasks:
        - name: Copy client key for 802.1X authentication
        copy:
            src: "/srv/data/client.key"
            dest: "/etc/pki/tls/private/client.key"
            mode: 0600
    
        - name: Copy client certificate for 802.1X authentication
        copy:
            src: "/srv/data/client.crt"
            dest: "/etc/pki/tls/certs/client.crt"
    
        - name: Copy CA certificate for 802.1X authentication
        copy:
            src: "/srv/data/ca.crt"
            dest: "/etc/pki/ca-trust/source/anchors/ca.crt"
    
        - include_role:
            name: rhel-system-roles.network
        vars:
            network_connections:
            - name: enp1s0
                type: ethernet
                autoconnect: yes
                ip:
                address:
                    - 192.0.2.1/24
                    - 2001:db8:1::1/64
                gateway4: 192.0.2.254
                gateway6: 2001:db8:1::fffe
                dns:
                    - 192.0.2.200
                    - 2001:db8:1::ffbb
                dns_search:
                    - example.com
                ieee802_1x:
                identity: user_name
                eap: tls
                private_key: "/etc/pki/tls/private/client.key"
                private_key_password: "password"
                client_cert: "/etc/pki/tls/certs/client.crt"
                ca_cert: "/etc/pki/ca-trust/source/anchors/ca.crt"
                domain_suffix_match: example.com
                state: up
    
  3. 运行 playbook:

    • 要以 root 用户身份连接到受管主机,请输入:
      # ansible-playbook -u root ~/enable-802.1x.yml
      
    • 以用户身份连接到受管主机,请输入:
      # ansible-playbook -u user_name --ask-become-pass ~/ethernet-static-IP.yml
      
      --ask-become-pass 选项确保 ansible-playbook 命令提示输入 -u user_name 选项中定义的用户的 sudo 密码。

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

第22章 管理默认网关设置

默认网关是在没有其他路由与数据包的目的地匹配时转发网络数据包的路由器。在本地网络中,默认网关通常是与距离互联网一跳的主机。

22.1.使用 nmcli 在现有网络连接上设置默认网关

在大多数情况下,管理员会在创建连接时设置默认网关,本节讲述了如何使用 nmcli 工具在之前创建的连接上设置或更新默认网关。

前提条件

  • 至少需要在设置默认网关的连接上配置一个静态 IP 地址。
  • 如果用户能够在物理控制台中登录,说明用户权限足够。否则,用户必须具有 root 权限。

流程

  1. 设置默认网关 IP 地址。 例如,要将 example 的默认网关的 IPv4 地址设为 192.0.2.1 :
    # nmcli connection modify example ipv4.gateway "192.0.2.1"
    
    将 example 的默认网关的 IPv6 地址设为 2001:db8:1::1 :
    # nmcli connection modify example ipv6.gateway "2001:db8:1::1"
    
  2. 重启网络连接以使更改生效。例如,要使用命令行重启 example 连接:
    # nmcli connection up example
    
  3. (可选)验证路由是否活跃。 IPv4:
    # ip -4 route
    default via 192.0.2.1 dev example proto static metric 100
    
    IPv6:
    # ip -6 route
    default via 2001:db8:1::1 dev example proto static metric 100 pref medium
    

22.2.使用 nmcli 互动模式在现有网络连接上设置默认网关

在大多数情况下,管理员会在创建连接时设置默认网关,如 使用 nmcli 交互式编辑器配置动态以太网连接 中所述。

本节介绍了如何使用 nmcli 工具的交互模式在之前创建的连接上设置或更新默认网关。

前提条件

  • 需要设置默认网关的网络连接至少拥有一个静态 IP 地址
  • 工作用户需要能在物理控制台登录,否则用户必须具有 root 权限

流程

  1. 打开 nmcli 交互模式配置网络连接,例如为连接 example 打开 nmcli 交互模式:
    # sudo nmcli connection edit example
    
  2. 设置默认网关。 例如,要将 example 连接上的默认网关的 IPv4 地址设为 192.0.2.1 :
    nmcli> set ipv4.gateway 192.0.2.1
    
    例如,要将 example 连接上的默认网关的 IPv6 地址设为 2001:db8:1::1 :
    nmcli> set ipv6.gateway 2001:db8:1::1
    
  3. 可选,验证默认网关是否正确设置:
    nmcli> print
    ...
    ipv4.gateway:                           192.0.2.1
    ...
    ipv6.gateway:                           2001:db8:1::1
    ...
    
  4. 保存配置:
    nmcli> save persistent
    
  5. 重启网络连接应用更改:
    nmcli> activate example
    
    重启过程中网络连接会暂时中断。
  6. 退出 nmcli 交互模式: ``` nmcli> quit
  7. (可选)验证路由是否活跃。 IPv4:
    # ip -4 route
    default via 192.0.2.1 dev example proto static metric 100
    
    IPv6:
    # ip -6 route
    default via 2001:db8:1::1 dev example proto static metric 100 pref medium
    

22.3.使用 nm-connection-editor 为已有网络连接设置默认网关

在大多数情况下,管理员在创建连接时设置默认网关。本节介绍了如何使用 nm-connection-editor 应用程序在之前创建的连接上设置或更新默认网关。

前提条件

  • 需要设置默认网关的网络连接至少拥有一个静态 IP 地址

流程

  1. 在终端输入 nm-connection-editor :
  2. 选择要修改的连接,并点击齿轮图标编辑现有连接。
  3. 设置 IPv4 默认网关。 nm-connection-editor配置网关_1
  4. 设置 IPv6 默认网关。 nm-connection-editor配置网关_2
  5. 点击 Save 。
  6. 重启网络连接使更改生效。例如,要使用命令行重启 example 连接:
    $ sudo nmcli connection up example
    
  7. (可选)验证路由是否活跃。 IPv4:
    # ip -4 route
    default via 192.168.138.1 dev example proto static metric 100
    
    IPv6:
    # ip -6 route
    default via 2001:db8:1::1 dev example proto static metric 100 pref medium
    

22.4.使用 control-center 为现有网络连接设置默认网关

在大多数情况下,管理员在创建连接时设置默认网关。本节描介绍了如何使用 control-center 应用程序在之前创建的连接上设置或更新默认网关。

前提条件

  • 需要设置默认网关的网络连接至少拥有一个静态 IP 地址
  • 网络连接配置可以在 control-center 应用程序中打开。

流程

  1. 进入设置 Settings ,选择 Network ,点击所要配置的网络连接右侧齿轮进行编辑。
  2. 设置 IPv4 默认网关。 control-center配置网关_1
  3. 设置 IPv6 默认网关。 control-center配置网关_2
  4. 点击 Apply 。
  5. 将配置的网络连接状态切换成 Off ,然后再切换成 On 来重启网络连接应用更改。
  6. (可选)验证路由是否活跃。 IPv4:
    # ip -4 route
    default via 192.168.138.1 dev example proto static metric 100
    
    IPv6:
    # ip -6 route
    default via 2001:db8:1::1 dev example proto static metric 100 pref medium
    

22.5.使用 nmstatectl 为现有网络连接设置默认网关

前提条件

  • 需要设置默认网关的网络连接至少拥有一个静态 IP 地址
  • 已安装 nmstate 。

流程

  1. 创建~/set-default-gateway.yml YAML 文件:
    ---
    routes:
    config:
    - destination: 0.0.0.0/0
        next-hop-address: 192.0.2.1
        next-hop-interface: enp1s0
    
  2. 应用设置:
    # nmstatectl apply ~/set-default-gateway.yml
    

22.6.使用 rhel-system-roles 为现有网络连接设置默认网关

当您运行使用 Networking RHEL system roles 的脚本时,如果设置的值与脚本中指定的名称不匹配,则系统角色会覆盖具有相同名称的现有的连接配置文件。因此,始终在脚本中指定网络连接配置文件的整个配置,即使 IP 配置已经存在。否则,role 会将这些值重置为默认值。

前提条件

  • 控制节点上 ansible 和 rhel-system-roles 软件包已安装。
  • 如果您在运行 playbook 时使用非 root 用户,请确保使用的用户拥有 sudo 权限。

流程

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

    node.example.com
    

  2. 使用以下内容创建 ~/ethernet-connection.yml playbook:

    ---
    - name: Configure an Ethernet connection with static IP and default gateway
    hosts: node.example.com
    become: true
    tasks:
    - include_role:
        name: rhel-system-roles.network
    
        vars:
        network_connections:
            - name: enp1s0
            type: ethernet
            autoconnect: yes
            ip:
                address:
                - 198.51.100.20/24
                - 2001:db8:1::1/64
                gateway4: 198.51.100.254
                gateway6: 2001:db8:1::fffe
                dns:
                - 198.51.100.200
                - 2001:db8:1::ffbb
                dns_search:
                - example.com
            state: up
    

  3. 运行 playbook:

    • 要以 root 用户身份连接到受管主机,请输入:
      # ansible-playbook -u root ~/ethernet-connection.yml
      
    • 以用户身份连接到受管主机,请输入:
      # ansible-playbook -u user_name --ask-become-pass ~/ethernet-connection.yml
      
      --ask-become-pass 选项确保 ansible-playbook 命令提示输入 -u user_name 选项中定义的用户的 sudo 密码。

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

22.7.使用 network scripts 为现有网络连接设置默认网关

前提条件

  • NetworkManager 软件包未安装,或者 NetworkManager 服务被禁用。
  • network-scripts 软件包已安装。

流程

  1. 将 /etc/sysconfig/network-scripts/ifcfg-enp1s0 文件中的 GATEWAY 参数设为 192.0.2.1 :
    GATEWAY=192.0.2.1
    
  2. 在 /etc/sysconfig/network-scripts/route-enp0s1 文件中添加 default 条目:
    default via 192.0.2.1
    
  3. 重启网络:
    # systemctl restart network
    

22.8.使用 NetworkManager 管理多个默认网关

在某些情况下,您可能需要在主机上设置多个默认网关。但是,为了避免异步路由问题,同一协议的每个默认网关都需要单独的指标值。请注意,OpenCloudOS 只使用到设置成最低路由权的默认网关的连接。

您可以使用以下命令为连接的 IPv4 和 IPv6 网关设置指标:

# nmcli connection modify connection-name ipv4.route-metric value ipv6.route-metric value

不要为多个连接配置集中的同一协议设置相同的路由权值以避免路由问题。

如果您设置了没有路由权的默认网关,则 NetworkManager 会自动根据接口类型设置路由权。NetworkManager 会将这个网络类型的默认值分配给激活的第一个连接,并根据激活的顺序为同一类型的每一个其他连接设置递增值。例如,如果带有默认网关的两个以太网连接存在,则 NetworkManager 会将您首先激活的连接的默认网关路由上的路由权设置为 100 。对于第二个连接,NetworkManager 会设为 101。

以下是经常使用的网络类型及其默认路由权的对应关系:

连接类型 默认路由权
VPN 50
Ethernet 100
MACsec 125
InfiniBand 150
Bond 300
Team 350
VLAN 400
Bridge 425
TUN 450
Wi-Fi 600
IP tunnel 675

22.9.配置 NetworkManager 避免特定配置文件提供默认网关

您可以配置 NetworkManager 来不使用特定的配置文件来提供默认网关。对于没有连接到默认网关的连接配置集,请按照以下步骤操作。

前提条件

  • 未配置默认网关的网络连接存在 NetworkManager 连接配置文件。

流程

  1. 如果网络连接使用动态 IP 配置,请配置 NetworkManager 不使用 IPv4 和 IPv6 默认路由:
    # nmcli connection modify connection_name ipv4.never-default yes ipv6.never-default yes
    
    请注意,将 ipv4.never-default 和 ipv6.never-default 设为 yes,会自动从连接配置文件中删除相应协议默认网关的 IP 地址。
  2. 激活链接:
    # nmcli connection up connection_name
    

验证

  • 使用 ip -4 route 或 ip -6 route 验证是否启用默认网关。

22.10.修复因为多个默认网关导致的意外路由行为

只有在很少情况下(比如使用多路径 TCP 时),在主机上需要多个默认网关。在大多数情况下,您只配置一个默认网关,来避免意外的路由行为或异步路由问题。

前提条件

  • 主机使用 NetworkManager 管理网络连接。
  • 主机有多个网络接口。
  • 主机配置了多个默认网关。

流程

  1. 显示路由表:
    • IPv4:
      # ip -4 route
      default via 192.0.2.1 dev enp1s0 proto static metric 101
      default via 198.51.100.1 dev enp7s0 proto static metric 102
      ...
      
    • IPv6:
      # ip -6 route
      default via 2001:db8:1::1 dev enp1s0 proto static metric 101 pref medium
      default via 2001:db8:2::1 dev enp7s0 proto static metric 102 pref medium
      ...
      
      以 default 开头的条目表示默认路由。注意 dev 旁边显示的这些条目的接口名称。
  2. 使用以下命令显示您在上一步中识别的 NetworkManager 连接:
    # nmcli -f GENERAL.CONNECTION,IP4.GATEWAY,IP6.GATEWAY device show enp1s0
    GENERAL.CONNECTION:      Corporate-LAN
    IP4.GATEWAY:             192.168.122.1
    IP6.GATEWAY:             2001:db8:1::1
    
    # nmcli -f GENERAL.CONNECTION,IP4.GATEWAY,IP6.GATEWAY device show enp7s0
    GENERAL.CONNECTION:      Internet-Provider
    IP4.GATEWAY:             198.51.100.1
    IP6.GATEWAY:             2001:db8:2::1
    
    在这些示例中,名为 Corporate-LAN 和 Internet-Provider 的配置文件设置了默认网关。因为在本地网络中,默认网关通常是距离互联网一跳的主机,所以此流程的剩下部分假设 Corporate-LAN 中的默认网关是不正确的。
  3. 配置 NetworkManager 不使用 Corporate-LAN 连接作为 IPv4 和 IPv6 连接的默认路由:
    # nmcli connection modify Corporate-LAN ipv4.never-default yes ipv6.never-default yes
    
  4. 激活 Corporate-LAN 连接:
    # nmcli connection up Corporate-LAN
    

验证

  • 使用 ip -4 route 或 ip -6 route 验证是否只有一个网关。

第23章 配置静态路由

路由可确保您可以在相互连接的网络间发送和接收流量。在较大环境中,管理员通常配置服务以便路由器可以动态地了解其他路由器。在较小的环境中,管理员通常会配置静态路由,以确保流量可以从一个网络到下一个网络访问。

如果适用以下这些条件,您可能需要静态路由以在多个网络间获得正常运行的通信: - 流量必须通过多个网络。 - 通过默认网关的独占流量流不足。

23.1.需要静态路由的网络示例

因为并非所有 IP 网络都通过一个路由器直接连接,如果没有静态路由,一些网络将无法相互通信。而某些网络流的流量仅有一个方向也可以配置静态路由。

您可以配置静态路由,如下所示:

  • 简单配置:仅在路由器 1 上设置此静态路由。但是,这会增加路由器 1 上的流量,因为数据中心(203.0.113.0/24的主机)发送到 Network B (198.51.100.0/24)的流量,始终通过路由器 1 到路由器 2。
  • 复杂配置:请在数据中心的所有主机上配置此静态路由(203.0.113.0/24)。然后,此子网中的所有主机直接向路由器 2(203.0.113.10)发送更接近 Network B 的主机(198.51.100.0/24)。 更多详情,请参见以下示意图中的说明。 routing-example

如果没有配置所需的静态路由,下面描述了各网络通信工作情况:

  • Network A 中的主机(192.0.2.0/24):
  • 可以与同一子网中的其他主机通信,因为它们是直接连接的。
  • 可以与互联网通信,因为路由器 1 位于 Network A 网络(192.0.2.0/24)中,并有一个与互联网相连的默认网关。
  • 可以与数据中心网络通信(203.0.113.0/24),因为路由器 1 在 Network A (192.0.2.0/24)和数据中心(203.0.113.0/24)网络中有接口。
  • 无法与 Network B (198.51.100.0/24)通信,因为路由器 1 在此网络中没有接口。因此,路由器 1 会将流量发送到自己的默认网关(Internet)。

  • 数据中心网络中的主机(203.0.113.0/24):

  • 可以与同一子网中的其他主机通信,因为它们是直接连接的。
  • 可以与互联网通信,因为它们的默认网关设置为路由器 1,路由器 1 在网络、数据中心(203.0.113.0/24)和互联网上均有接口。
  • 可以与 Network A (192.0.2.0/24)通信,因为它们的默认网关设置为路由器 1,并且路由器 1 在数据中心(203.0.113.0/24)和 Network A (192.0.2.0/24)网络中都存在接口。
  • 无法与 Network B 网络(198.51.100.0/24)通信,因为该网络中没有接口。因此,数据中心中的主机(203.0.113.0/24)将流量发送到其默认网关(Router 1)。路由器 1 在 Network B(198.51.100.0/24中)没有接口,因此 Router 1 会将这个流量发送到自己的默认网关(Internet)。

  • Network B 网络中的主机(198.51.100.0/24):

  • 可以与同一子网中的其他主机通信,因为它们是直接连接的。
  • 无法与互联网上的主机通信。路由器 2 将流量发送到路由器 1,因为默认网关设置。路由器 1 的实际行为取决于反向路径过滤器(rp_filter)系统控制(sysctl)设置。默认情况下,在 OpenCloudOS 中,路由器 1 会丢弃传出流量,而不是将其路由到互联网。但是,无论配置的行为如何,都无法在没有静态路由的情况下进行通信。
  • 无法与数据中心网络通信(203.0.113.0/24)。由于默认网关设置,传出流量通过路由器 2 到达目的地。但是,对数据包的回复不会到达发送者,因为数据中心网络中的主机(203.0.113.0/24)将回复发送到其默认网关(Router 1)。然后,路由器 1 将流量发送到互联网。
  • 无法与 Network A 通信(192.0.2.0/24)。路由器 2 将流量发送到路由器 1,因为默认网关设置。路由器 1 的实际行为取决于 rp_filter sysctl 设置。默认情况下,在 OpenCloudOS 中,路由器 1 会丢弃传出流量,而不是将其发送到 Network A (192.0.2.0/24)。但是,无论配置的行为如何,都无法在没有静态路由的情况下进行通信。

注意,除了配置静态路由外,还必须在两个路由器上启用 IP 转发。

23.2. nmcli 命令配置静态路由简介

可以使用以下命令配置静态路由:

$ nmcli connection modify connection_name ipv4.routes "ip[/prefix] [next_hop] [metric] [attribute=value] [attribute=value] ..."

此命令支持配置以下属性: - cwnd=n :设置拥塞窗口(CWND)大小,以数据包数量定义。 - lock-cwnd=true|false :定义内核是否可以更新 CWND 值。 - lock-mtu=true|false :定义内核是否可以将 MTU 更新为路径 MTU (PMTU)。 - lock-window=true|false :定义内核是否可更新 TCP 数据包的最大窗口大小。 - mtu=n :设置发往目的地址路径的最大传输单元(MTU)。 - onlink=true|false :定义下一跳是否直接附加到此链接,即使它与任何接口前缀都不匹配。 - scope=n: 对于 IPv4 路由,此属性设置路由前缀所涵盖的目的地的范围。将值设为整数(0-255)。 - src=address :当将流量发送到路由前缀所涵盖的目的地时,将源地址设为首选。 - table=table_id :设置应将路由添加到的表的 ID。如果省略此参数,NetworkManager 将使用 main 表。 - tos=n :设置服务类型(TOS)密钥。将值设为整数(0-255)。 - type=value :设置路由类型。NetworkManager 支持 unicast、local、blackhole、unreachable、prohibit 和 throw 路由类型。默认为 unicast。 - window=n :设置播发到这些目的地的 TCP 的最大窗口大小,以字节为单位。

如果使用 ipv4.routes 子命令,nmcli 会覆盖这个参数的所有当前设置。

添加一个路由:

$ nmcli connection modify connection_name +ipv4.routes "..."
删除一个路由:
$ nmcli connection modify connection_name -ipv4.routes "..."

23.3.使用 nmcli 命令配置静态路由

您可以使用 nmcli connection modify 命令将一个静态路由添加网络连接配置中。

本节中的流程描述了如何将一个路由添加到 192.0.2.0/24 网络,该网络使用运行在 198.51.100.1 上的网关,该网关可通过 example 连接访问。

前提条件

  • 网络已配置
  • 静态路由的网关必须能在接口上直接访问。
  • 用户需要能在物理控制台中登录。否则,命令需要 root 权限。

流程

  1. 将静态路由添加到 example 连接中:
    $ sudo nmcli connection modify example +ipv4.routes "192.0.2.0/24 198.51.100.1"
    
    要在一个步骤中设置多个路由,请使用逗号分隔每个静态路由传递给该命令。例如,要将路由添加到 192.0.2.0/24 和 203.0.113.0/24 网络中,这两个网络都通过 198.51.100.1 网关进行路由,请输入:
    $ sudo nmcli connection modify example +ipv4.routes "192.0.2.0/24 198.51.100.1, 203.0.113.0/24 198.51.100.1"
    
  2. (可选)验证路由是否已正确添加到配置中:
    $ nmcli connection show example
    ...
    ipv4.routes:        { ip = 192.0.2.1/24, nh = 198.51.100.1 }
    ...
    
  3. 重启网络连接:
    $ sudo nmcli connection up example
    
  4. (可选)验证路由是否活跃:

    $ ip route
    ...
    192.0.2.0/24 via 198.51.100.1 dev example proto static metric 100
    

23.4.使用 control-center 配置静态路由

您可以在 GNOME 中使用 control-center,来将静态路由添加到网络连接配置中。

本节中的流程描述了如何将路由添加到 192.0.2.0/24 网络,该网络使用运行在 198.51.100.1 上的网关。

前提条件

  • 网络已配置。
  • 静态路由的网关必须能在接口上直接访问。
  • 连接的网络配置能在 control-center 应用程序中打开。

流程

  1. 进入设置,选择Network,点击需要添加静态路由的网络条目中的齿轮进行编辑。
  2. (可选)通过单击 IPv4 选项卡的 Routes 部分中的 On 按钮来禁用自动路由,以便只使用静态路由。如果启用了自动路由,OpenCloudOS 将使用静态路由和从 DHCP 服务器接收的路由。
  3. 输入地址、子网掩码、网关和路由权(可选): control-center配置静态路由
  4. 点击 Apply 。
  5. 返回到 Network 窗口,通过将连接的按钮切换为 Off ,然后切换回 On 来重新启用连接应用更改。
  6. (可选)验证路由是否活跃:
    $ ip route
    ...
    192.0.2.0/24 via 198.51.100.1 dev example proto static metric 100
    

23.5.使用 nm-connection-editor 配置静态路由

您可以使用 nm-connection-editor 应用程序将静态路由添加到网络连接配置中。

本节中的流程描述了如何将路由添加到 192.0.2.0/24 网络,该网络使用运行在 198.51.100.1 上的网关,该网关可通过 example 连接访问。

前提条件

  • 网络已配置。
  • 静态路由的网关必须能在接口上直接访问。

流程

  1. 在终端输入:
  2. 选择 example 连接,并点击齿轮图标来编辑连接。
  3. 打开 IPv4 选项卡。
  4. 点击 Route 按钮。
  5. 点击 Add 按钮并输入地址、子网掩码、网关以及路由权(可选)。 nm-connection-editor配置静态路由
  6. 点击 OK 。
  7. 点击 Save 。
  8. 重启网络应用更改。
    $ sudo nmcli connection up example
    
  9. (可选)验证路由是否活跃: ``` $ ip route ... 192.0.2.0/24 via 198.51.100.1 dev example proto static metric 100 ````

23.6.使用 nmcli 互动模式配置静态路由

您可以使用 nmcli 工具的交互模式,将静态路由添加到网络连接配置中。

本节中的流程描述了如何将路由添加到 192.0.2.0/24 网络,该网络使用运行在 198.51.100.1 上的网关,该网关可通过 example 连接访问。

前提条件

  • 网络已配置
  • 静态路由的网关必须在接口上直接访问。
  • 用户需要能在物理控制台中登录。否则,命令需要 root 权限。

流程

  1. 使用 nmcli 交互模式编辑 example :
    $ sudo nmcli connection edit example
    
  2. 添加静态路由:
    nmcli> set ipv4.routes 192.0.2.0/24 198.51.100.1
    
  3. (可选)验证路由是否已正确添加到配置中:
    nmcli> print
    ...
    ipv4.routes:        { ip = 192.0.2.1/24, nh = 198.51.100.1 }
    ...
    
    ip 属性对应要路由的网络,nh 属性对应网关(下一跳)。
  4. 保存配置:
    nmcli> save persistent
    
  5. 重启网络连接:
    nmcli> activate example
    
  6. 退出nmcli 交互模式:
    nmcli> quit
    
  7. (可选)验证路由是否活跃:
    $ ip route
    ...
    192.0.2.0/24 via 198.51.100.1 dev example proto static metric 100
    

23.7.使用 nmstatectl 配置静态路由

您可以使用 nmstatectl 工具将静态路由添加到网络连接配置中。

本节中的流程描述了如何将路由添加到 192.0.2.0/24 网络,该网络使用运行在 198.51.100.1 上的网关,该网关可通过 example 网络接口访问。

前提条件

  • example 网络接口已配置。
  • 静态路由的网关必须能在网络接口上直接访问。
  • nmstate 软件包已安装。

流程

  1. 创建 YAML 文件 ~/add-static-route-to-enp1s0.yml,其内容如下:
    ---
    routes:
    config:
    - destination: 192.0.2.0/24
        next-hop-address: 198.51.100.1
        next-hop-interface: enp1s0
    
  2. 应用设置:
    # nmstatectl apply ~/add-static-route-to-enp1s0.yml
    

23.8.使用 rhel-system-roles 配置静态路由

当您运行使用 Networking RHEL system roles 的脚本时,如果设置的值与脚本中指定的名称不匹配,则系统角色会覆盖具有相同名称的现有的连接配置文件。因此,始终在脚本中指定网络连接配置文件的整个配置,即使 IP 配置已经存在。否则,role 会将这些值重置为默认值。

前提条件

  • 控制节点上 ansible 和 rhel-system-roles 软件包已安装。
  • 如果您在运行 playbook 时使用非 root 用户,请确保使用的用户拥有 sudo 权限。

流程

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

    node.example.com
    

  2. 使用以下内容创建 ~/ethernet-connection.yml playbook:

    ---
    - name: Configure an Ethernet connection with static IP and additional routes
    hosts: node.example.com
    become: true
    tasks:
    - include_role:
        name: rhel-system-roles.network
    
        vars:
        network_connections:
            - name: enp7s0
            type: ethernet
            autoconnect: yes
            ip:
                address:
                - 198.51.100.20/24
                - 2001:db8:1::1/64
                gateway4: 198.51.100.254
                gateway6: 2001:db8:1::fffe
                dns:
                - 198.51.100.200
                - 2001:db8:1::ffbb
                dns_search:
                - example.com
                route:
                - network: 192.0.2.0
                    prefix: 24
                    gateway: 198.51.100.1
                - network: 203.0.113.0
                    prefix: 24
                    gateway: 198.51.100.2
            state: up
    

  3. 运行 playbook:

    • 要以 root 用户身份连接到受管主机,请输入:
      # ansible-playbook -u root ~/add-static-routes.yml
      
    • 以用户身份连接到受管主机,请输入:
      # ansible-playbook -u user_name --ask-become-pass ~/add-static-routes.yml
      
      --ask-become-pass 选项确保 ansible-playbook 命令提示输入 -u user_name 选项中定义的用户的 sudo 密码。

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

验证

  • 显示路由表:
    # ip -4 route
    default via 198.51.100.254 dev enp7s0 proto static metric 100
    192.0.2.0/24 via 198.51.100.1 dev enp7s0 proto static metric 100
    203.0.113.0/24 via 198.51.100.2 dev enp7s0 proto static metric 100
    ...
    

23.9.使用 network scripts 以键值对格式创建静态路由配置文件

本节流程描述了当使用 network scripts 而不是 NetworkManager 时,如何手动为到 192.0.2.0/24 网络的 IPv4 路由创建一个路由配置文件。在本例中,IP 地址为 198.51.100.1 的相应的网关可以通过 enp1s0 接口访问。

此流程中的示例使用 key-value-format 中的配置条目。

注意,network scripts 只支持静态 IPv4 路由的键值格式。对于 IPv6 路由,请使用 ip-command-format。

前提条件

  • 静态路由的网关必须能在接口上直接访问。
  • NetworkManager 软件包未安装,或者 NetworkManager 服务被禁用。
  • network-scripts 软件包已安装。

流程

  1. 将静态 IPv4 路由添加到 /etc/sysconfig/network-scripts/route-enp0s1 文件中:

    ADDRESS0=192.0.2.0
    NETMASK0=255.255.255.0
    GATEWAY0=198.51.100.1
    

    • ADDRESS0 变量定义第一个路由条目的网络。
    • NETMASK0 变量定义第一个路由条目的子网掩码。
    • GATEWAY0 变量定义到远程网络的网关的 IP 地址或第一个路由条目的主机。

    如果您添加多个静态路由,请增加变量名称的数量。请注意,每个路由的变量都必须按顺序编号。例如,ADDRESS0 、ADDRESS1、ADDRESS3 ,等等。

  2. 重启网络:

    # systemctl restart network
    

23.10.使用 network scripts 以 ip-command-format 格式创建静态路由配置文件

本节流程描述了如何使用 network scripts 为以下静态路由手动创建路由配置文件:

  • 到 192.0.2.0/24 网络的 IPv4 路由。IP 地址为 198.51.100.1 的相应的网关可以通过 enp1s0 接口访问。
  • 到 2001:db8:1::/64 网络的 IPv6 路由。IP 地址为 2001:db8:2::1 的相应的网关可以通过 enp1s0 接口访问。

此流程中的示例使用 ip-command-format 中的配置条目。

前提条件

  • 静态路由的网关必须能在网络接口上直接访问。
  • NetworkManager 软件包未安装,或者 NetworkManager 服务被禁用。
  • network-scripts 软件包已安装。

流程

  1. 将静态 IPv4 路由添加到 /etc/sysconfig/network-scripts/route-enp0s1 文件中:
    192.0.2.0/24 via 198.51.100.1 dev enp0s1
    
  2. 将静态 IPv6 路由添加到 /etc/sysconfig/network-scripts/route6-enp0s1 文件中:
    2001:db8:1::/64 via 2001:db8:2::1 dev enp0s1
    
  3. 重启网络:
    # systemctl restart network
    

第24章 配置策略路由以定义其他路由

默认情况下,OpenCloudOS 中的内核会决定使用路由表根据目标地址转发网络数据包。策略路由允许您配置复杂的路由场景。例如,您可以根据各种条件来路由数据包,如源地址、数据包元数据或协议。

本节论述了如何使用 NetworkManager 配置策略路由。

注意,在使用 NetworkManager 的系统上,只有 nmcli 工具支持设置路由规则,并将路由分配给特定的表。

24.1. 使用 NetworkManager 将特定子网的流量路由到不同的默认网关

本节介绍了如何将 OpenCloudOS 配置默认路由为将所有流量路由到互联网供应商 A 的路由器。使用策略路由,OpenCloudOS 会将从内部工作站子网接收的流量路由到供应商 B。

流程网络拓扑如下图: policy-based-routing

前提条件

  • 系统使用 NetworkManager 配置网络。
  • 要在流程中配置的路由器有四个网络接口:
  • enp7s0 接口已连接到提供商 A 的网络。提供商网络中的网关 IP 为 198.51.100.2,网络使用 /30 网络掩码。
  • enp1s0 接口连接到提供商 B 的网络。提供商网络中的网关 IP 为 192.0.2.2,网络使用 /30 网络掩码。
  • enp8s0 接口已与连有内部工作站的 10.0.0.0/24 子网相连。
  • enp9s0 接口已与连有公司服务器的 203.0.113.0/24 子网相连。
  • 内部工作站子网中的主机使用 10.0.0.1 作为默认网关。在此流程中,您可以将这个 IP 地址分配给路由器的 enp8s0 网络接口。
  • 服务器子网中的主机使用 203.0.113.1 作为默认网关。在此流程中,您可以将这个 IP 地址分配给路由器的 enp9s0 网络接口。
  • firewalld 服务已启用,并处于活动状态。

流程

  1. 将网络接口配置为Provider A:

    # nmcli connection add type ethernet con-name Provider-A ifname enp7s0 ipv4.method manual ipv4.addresses 198.51.100.1/30 ipv4.gateway 198.51.100.2 ipv4.dns 198.51.100.200 connection.zone external
    
    nmcli connection add 命令创建 NetworkManager 连接配置文件。下面描述了该命令的选项参数:

    • type ethernet :定义连接类型为以太网。
    • con-name connection_name :设置配置文件的名称。使用有意义的名称以避免混淆。
    • ifname network_device :配置的网络接口。
    • ipv4.method manual: 允许配置静态 IP 地址。
    • ipv4.addresses IP_address/subnet_mask :设置 IPv4 地址和子网掩码。
    • ipv4.gateway IP_address :设置默认网关地址。
    • ipv4.dns IP_of_DNS_server :设置 DNS 服务器的 IPv4 地址。
    • connection.zone firewalld_zone :将网络接口分配给定义的 firewalld 区域。请注意,firewalld 会为分配给 external 区域的接口自动启用伪装。
  2. 将网络接口配置为Provider B:

    # nmcli connection add type ethernet con-name Internal-Workstations ifname enp8s0 ipv4.method manual ipv4.addresses 10.0.0.1/24 ipv4.routes "10.0.0.0/24 table=5000" ipv4.routing-rules "priority 5 from 10.0.0.0/24 table 5000" connection.zone trusted
    
    此命令使用 ipv4.routes 参数而不是 ipv4.gateway 来设置默认网关。这需要将这个连接的默认网关分配给不同于默认的路由表(5000)。当连接被激活时,NetworkManager 会自动创建这个新的路由表。

  3. 将网络接口配置为内部工作站子网:

    # nmcli connection add type ethernet con-name Internal-Workstations ifname enp8s0 ipv4.method manual ipv4.addresses 10.0.0.1/24 ipv4.routes "10.0.0.0/24 table=5000" ipv4.routing-rules "priority 5 from 10.0.0.0/24 table 5000" connection.zone trusted
    
    此命令使用 ipv4.routes 参数将静态路由添加到 ID 为 5000 的路由表中。10.0.0.0/24 子网的这个静态路由使用到供应商 B 的本地网络接口的 IP 地址(192.0.2.1)来作为下一跳。

    另外,命令使用 ipv4.routing-rules 参数来添加优先级为 5 的路由规则,该规则将来自 10.0.0.0/24 子网的流量路由到表 5000。低的值具有更高的优先级。

    请注意,ipv4.routing-rules 参数的语法与 ip rule add 命令中的语法相同,但 ipv4.routing-rules 总是需要指定优先级。

  4. 将网络接口配置为服务器子网:

    # nmcli connection add type ethernet con-name Servers ifname enp9s0 ipv4.method manual ipv4.addresses 203.0.113.1/24 connection.zone trusted
    

验证

  1. 在内部工作站子网的主机上:
  2. 安装 traceroute 软件包:
    # yum insall traceroute
    
  3. 使用 traceroute 工具显示到互联网上主机的路由:
    # traceroute host.com
    traceroute to host.com (209.132.183.105), 30 hops max, 60 byte packets
    1  10.0.0.1 (10.0.0.1)     0.337 ms  0.260 ms  0.223 ms
    2  192.0.2.1 (192.0.2.1)   0.884 ms  1.066 ms  1.248 ms
    ...
    
    命令的输出显示路由器通过 192.0.2.1 ,即提供商 B 的网络来发送数据包。
  4. 在服务器子网的主机上:
    1. 安装 traceroute 软件包:
      # yum insall traceroute
      
  5. 使用 traceroute 工具显示到互联网上主机的路由: # traceroute host.com traceroute to host.com (209.132.183.105), 30 hops max, 60 byte packets 1 203.0.113.1 (203.0.113.1) 2.179 ms 2.073 ms 1.944 ms 2 198.51.100.2 (198.51.100.2) 1.868 ms 1.798 ms 1.549 ms ... 命令的输出显示路由器通过 198.51.100.2 ,即供应商 A 的网络来发送数据包。

故障排除

在使用 OpenCloudOS 路由的主机中: 1. 显示 ip 规则列表:

# ip rule list
0:  from all lookup local
5:  from 10.0.0.0/24 lookup 5000
32766:  from all lookup main
32767:  from all lookup default
默认情况下包含 local 、 main 、 default 的规则。 2. 显示 id 为 5000 的表中的路由:
# ip route list table 5000
0.0.0.0/0 via 192.0.2.2 dev enp1s0 proto static metric 100
10.0.0.0/24 dev enp8s0 proto static scope link src 192.0.2.1 metric 102 
3. 显示接口和防火墙域:
# firewall-cmd --get-active-zones
external
interfaces: enp1s0 enp7s0
trusted
interfaces: enp8s0 enp9s0
4. 验证 external 域是否启用了伪装:
# firewall-cmd --info-zone=external
external (active)
target: default
icmp-block-inversion: no
interfaces: enp1s0 enp7s0
sources:
services: ssh
ports:
protocols:
masquerade: yes
...

24.2.使用 network scripts 配置策略路由概述

使用 network scripts 配置策略路由时会涉及以下配置文件:

  • /etc/sysconfig/network-scripts/route-interface :此文件定义 IPv4 路由。使用 table 选项来指定路由表。例如:
    192.0.2.0/24 via 198.51.100.1 table 1
    203.0.113.0/24 via 198.51.100.2 table 2
    
  • /etc/sysconfig/network-scripts/route6-interface :此文件定义 IPv6 路由。
  • /etc/sysconfig/network-scripts/rule-interface :此文件定义内核将流量路由到特定路由表的 IPv4 源网络的规则。例如:
    from 192.0.2.0/24 lookup 1
    from 203.0.113.0/24 lookup 2
    
  • /etc/sysconfig/network-scripts/rule6-interface :此文件定义内核将流量路由到特定路由表的 IPv6 源网络的规则。
  • /etc/iproute2/rt_tables :如果您想要使用名称而不是数字来引用特定的路由表,这个文件定义了映射。例如:
    1     Provider_A
    2     Provider_B
    

24.3.使用 network scripts 将指定子网的流量路由到不同的默认网关

您可以配置策略路由使指定子网的流量路由到非默认的网关。例如,将默认路由到 Provider A 的内部工作站子网流量路由到 Provider B 。

流程网络拓扑如下所示:

注意,network scripts 会按照字母顺序处理配置文件。因此,您必须为配置文件命名,确保当依赖接口需要时,用于其他接口的规则和路由的接口会被启动。要实现正确的顺序,流程使用 ifcfg-、route- 和 rules-* 文件中的数字。

前提条件

  • NetworkManager 软件包未安装,或者 NetworkManager 服务被禁用。
  • network-scripts 软件包已安装。
  • 要在流程中设置的 OpenCloudOS 路由器有四个网络接口:
  • enp7s0 接口已连接到提供商 A 的网络。提供商网络中的网关 IP 为 198.51.100.2,网络使用 /30 网络掩码。
  • enp1s0 接口连接到提供商 B 的网络。提供商网络中的网关 IP 为 192.0.2.2,网络使用 /30 网络掩码。
  • enp8s0 接口已与连有内部工作站的 10.0.0.0/24 子网相连。
  • enp9s0 接口已与连有公司服务器的 203.0.113.0/24 子网相连。
  • 内部工作站子网中的主机使用 10.0.0.1 作为默认网关。在此流程中,您可以将这个 IP 地址分配给路由器的 enp8s0 网络接口。
  • 服务器子网中的主机使用 203.0.113.1 作为默认网关。在此流程中,您可以将这个 IP 地址分配给路由器的 enp9s0 网络接口。
  • firewalld 服务已启用,并处于活动状态。

流程

  1. 创建 /etc/sysconfig/network-scripts/ifcfg-1_Provider-A 文件将网络接口的配置添加给提供商 A:

    TYPE=Ethernet
    IPADDR=198.51.100.1
    PREFIX=30
    GATEWAY=198.51.100.2
    DNS1=198.51.100.200
    DEFROUTE=yes
    NAME=1_Provider-A
    DEVICE=enp7s0
    ONBOOT=yes
    ZONE=external
    
    文件参数描述如下:

    • TYPE=Ethernet :定义连接类型为以太网。
    • IPADDR=IP_address :设置 IPv4 地址。
    • PREFIX=subnet_mask :设置子网掩码。
    • GATEWAY=IP_address :设置默认网关地址。
    • DNS1=IP_of_DNS_server :设置 DNS 服务器的 IPv4 地址。
    • DEFROUTE=yes|no :定义连接是否为默认路由。
    • NAME=connection_name :设置连接配置文件的名称。使用有意义的名称以避免混淆。
    • DEVICE=network_device :设置网络接口。
    • ONBOOT=yes :定义 RHEL 在系统引导时启动此连接。
    • ZONE=firewalld_zone :将网络接口分配给定义的 firewalld 区域。请注意,firewalld 会为分配给 external 区域的接口自动启用伪装。
  2. 为供应商 B 添加网络接口配置:

  3. 使用以下内容创建 /etc/sysconfig/network-scripts/ifcfg-2_Provider-B 文件:
    TYPE=Ethernet
    IPADDR=192.0.2.1
    PREFIX=30
    DEFROUTE=no
    NAME=2_Provider-B
    DEVICE=enp1s0
    ONBOOT=yes
    ZONE=external
    
    请注意,这个接口的配置文件不包含默认的网关设置。
  4. 将 2_Provider-B 连接的网关分配给单独的路由表。因此,使用以下内容创建 /etc/sysconfig/network-scripts/route-2_Provider-B 文件:

    0.0.0.0/0 via 192.0.2.2 table 5000
    
    此条目将通过这个网关路由的所有子网的网关和流量分配给表 5000 。

  5. 为内部工作站子网创建网络接口配置:

  6. 使用以下内容创建 /etc/sysconfig/network-scripts/ifcfg-3_Internal-Workstations 文件:
    TYPE=Ethernet
    IPADDR=10.0.0.1
    PREFIX=24
    DEFROUTE=no
    NAME=3_Internal-Workstations
    DEVICE=enp8s0
    ONBOOT=yes
    ZONE=internal
    
  7. 为内部工作站子网添加路由规则配置。因此,使用以下内容创建 /etc/sysconfig/network-scripts/rule-3_Internal-Workstations 文件:
    pri 5 from 10.0.0.0/24 table 5000
    
    此配置定义了优先级为 5 的路由规则,该规则将来自 10.0.0.0/24 子网的所有流量路由到表 5000。低的值具有更高的优先级。
  8. 使用以下内容创建 /etc/sysconfig/network-scripts/route-3_Internal-Workstations 文件,以将静态路由添加到 ID 为 5000 的路由表:

    10.0.0.0/24 via 192.0.2.1 table 5000
    
    此静态路由定义 RHEL 将从 10.0.0.0/24 子网到本地网络接口的 IP 的流量发送给提供商 B (192.0.2.1)。这个接口是到路由表 5000,并用作下一跳。

  9. 通过创建包含以下内容的 /etc/sysconfig/network-scripts/ifcfg-4_Servers 文件来将网络接口的配置添加到服务器子网中:

    TYPE=Ethernet
    IPADDR=203.0.113.1
    PREFIX=24
    DEFROUTE=no
    NAME=4_Servers
    DEVICE=enp9s0
    ONBOOT=yes
    ZONE=internal
    

  10. 重启网络:

    # systemctl restart network
    

验证

  1. 在内部工作站子网的主机上:
  2. 安装 traceroute 软件包:
    # yum insall traceroute
    
  3. 使用 traceroute 工具显示到互联网上主机的路由:
    # traceroute host.com
    traceroute to host.com (209.132.183.105), 30 hops max, 60 byte packets
    1  10.0.0.1 (10.0.0.1)     0.337 ms  0.260 ms  0.223 ms
    2  192.0.2.1 (192.0.2.1)   0.884 ms  1.066 ms  1.248 ms
    ...
    
    命令的输出显示路由器通过 192.0.2.1 ,即提供商 B 的网络来发送数据包。
  4. 在服务器子网的主机上:
    1. 安装 traceroute 软件包:
      # yum insall traceroute
      
  5. 使用 traceroute 工具显示到互联网上主机的路由: # traceroute host.com traceroute to host.com (209.132.183.105), 30 hops max, 60 byte packets 1 203.0.113.1 (203.0.113.1) 2.179 ms 2.073 ms 1.944 ms 2 198.51.100.2 (198.51.100.2) 1.868 ms 1.798 ms 1.549 ms ... 命令的输出显示路由器通过 198.51.100.2 ,即供应商 A 的网络来发送数据包。

故障排除

在使用 OpenCloudOS 路由的主机中: 1. 显示 ip 规则列表:

# ip rule list
0:  from all lookup local
5:  from 10.0.0.0/24 lookup 5000
32766:  from all lookup main
32767:  from all lookup default
默认情况下包含 local 、 main 、 default 的规则。 2. 显示 id 为 5000 的表中的路由:
# ip route list table 5000
0.0.0.0/0 via 192.0.2.2 dev enp1s0 proto static metric 100
10.0.0.0/24 dev enp8s0 proto static scope link src 192.0.2.1 metric 102 
3. 显示接口和防火墙域:
# firewall-cmd --get-active-zones
external
interfaces: enp1s0 enp7s0
trusted
interfaces: enp8s0 enp9s0
4. 验证 external 域是否启用了伪装:
# firewall-cmd --info-zone=external
external (active)
target: default
icmp-block-inversion: no
interfaces: enp1s0 enp7s0
sources:
services: ssh
ports:
protocols:
masquerade: yes
...

第25章 创建 dummy 接口

作为 OpenCloudOS 用户,您可以创建并使用 dummy 网络接口进行调试和测试。dummy 接口提供了一个设备来路由数据包而无需实际传送数据包。它可让您额外创建使用 NetworkManager 管理的回环设备,使不活跃的 SLIP(Serial Line Internet Protocol)地址像具体地址一样与进程通信。

25.1.使用 nmcli 使用 IPv4 和 IPv6 地址创建 dummy 接口

您可以创建带有各种设置的 dummy 接口。本节描述了如何使用 IPv4 和 IPv6 地址创建 dummy 接口。创建虚拟接口后,NetworkManager 会自动将其分配给默认的 public 防火墙域。

注意,要配置没有 IPv4 或 IPv6 地址的虚拟接口,请将 ipv4.method 和 ipv6.method 参数设为 disabled。否则,IP 自动配置会失败,NetworkManager 会取消激活连接并删除 dummy 设备。

流程

  1. 创建一个名为 dummy0 的、带有静态 IPv4 和 IPv6 地址的 dummy 接口:
    # nmcli connection add type dummy ifname dummy0 ipv4.method manual ipv4.addresses 192.0.2.1/24 ipv6.method manual ipv6.addresses 2001:db8:2::1/64
    
  2. 可选: 要查看 dummy 接口,请输入:
    # nmcli connection show
    NAME            UUID                                  TYPE      DEVICE
    enp1s0          db1060e9-c164-476f-b2b5-caec62dc1b05  ethernet    ens3
    dummy-dummy0    
    

第26章 使用 nmstate-autoconf 自动配置使用 LLDP 的网络状态

网络设备可以使用链路层发现协议(LLDP)在 LAN 中表明自己的身份、功能和邻居。nmstate-autoconf 工具可使用此信息来自动配置本地网络接口。

26.1.使用 nmstate-autoconf 来自动配置网络接口

nmstate-autoconf 工具使用 LLDP 来识别连接到交换机接口的 VLAN 设置来配置本地设备。

此流程假设以下场景,以及交换机使用 LLDP 广播 VLAN 设置:

  • 服务器的 enp1s0 和 enp2s0 接口连接到使用 VLAN ID 100 和 VLAN 名称 prod-net 配置的交换机端口。
  • 服务器的 enp3s0 接口连接到使用 VLAN ID 200 和 VLAN 名称 mgmt-net 配置的交换机端口。

然后,nmstate-autoconf 工具使用此信息来在服务器上创建以下接口:

  • bond100 - enp1s0 和 enp2s0 作为端口的绑定接口。
  • prod-net - 在 VLAN ID 为 100 的 bond100 上面的 VLAN 接口。
  • mgmt-net - 在 VLAN ID 为200 的 enp3s0 上面的 VLAN 接口

如果您将多个网络接口连接到 LLDP 用来广播同一 VLAN ID 的不同交换机的端口,则 nmstate-autoconf 会用这些接口来创建一个绑定,并在其上配置通用 VLAN ID。

前提条件

  • nmstate 软件包已安装。
  • 网络交换机上启用了 LLDP。
  • 以太网接口已启用。

流程

  1. 在以太网接口上启用 LLDP:
  2. 创建 ~/enable-lldp.yml YAML 文件,包含以下内容:
    interfaces:
    - name: enp1s0
        type: ethernet
        lldp:
        enabled: true
    - name: enp2s0
        type: ethernet
        lldp:
        enabled: true
    - name: enp3s0
        type: ethernet
        lldp:
        enabled: true
    
  3. 应用设置:

    # nmstatectl apply ~/enable-lldp.yml
    

  4. 使用 LLDP 配置网络接口:

  5. 可选,启动一个空运行来显示并验证 nmstate-autoconf 生成的 YAML 配置:
    # nmstate-autoconf -d enp1s0,enp2s0,enp3s0
    ---
    interfaces:
    - name: prod-net
    type: vlan
    state: up
    vlan:
        base-iface: bond100
        id: 100
    - name: mgmt-net
    type: vlan
    state: up
    vlan:
        base-iface: enp3s0
        id: 200
    - name: bond100
    type: bond
    state: up
    link-aggregation:
        mode: balance-rr
        port:
        - enp1s0
        - enp2s0
    
  6. 使用 nmstate-autoconf 根据从 LLDP 接收的信息来生成配置,并将设置应用到系统:
    # nmstate-autoconf enp1s0,enp2s0,enp3s0
    

验证

  • 显示单个接口的设置
    # nmstatectl show <interface_name>
    

第27章 使用 LLDP 来调试网络配置问题

您可以使用链路层发现协议(LLDP)来调试网络拓扑中的配置问题。这意味着 LLDP 可以报告与其他主机或路由器以及交换机的配置不一致问题。

27.1.使用 LLDP 信息调试不正确的 VLAN 配置

如果您将交换机端口配置为使用指定的 VLAN ,而主机没有收到这些 VLAN 数据包,那么您可以使用链路层发现协议(LLDP)来调试问题。请在没有收到数据包的主机上执行这个流程。

前提条件

  • nmstate 软件包已安装。
  • 交换机支持 LLDP。
  • LLDP 在邻居设备上已启用。

流程

  1. 使用以下内容创建 ~/enable-LLDP-enp1s0.yml 文件:
    interfaces:
    - name: enp1s0
        type: ethernet
        lldp:
        enabled: true
    
  2. 使用以下内容创建 ~/enable-LLDP-enp1s0.yml 文件:
    # nmstatectl apply ~/enable-LLDP-enp1s0.yml
    
  3. 显示 LLDP 信息:
    # nmstatectl show enp1s0
    - name: enp1s0
    type: ethernet
    state: up
    ipv4:
        enabled: false
        dhcp: false
    ipv6:
        enabled: false
        autoconf: false
        dhcp: false
    lldp:
        enabled: true
        neighbors:
        - - type: 5
            system-name: Summit300-48
        - type: 6
            system-description: Summit300-48 - Version 7.4e.1 (Build 5)
            05/27/05 04:53:11
        - type: 7
            system-capabilities:
            - MAC Bridge component
            - Router
        - type: 1
            _description: MAC address
            chassis-id: 00:01:30:F9:AD:A0
            chassis-id-type: 4
        - type: 2
            _description: Interface name
            port-id: 1/1
            port-id-type: 5
        - type: 127
            ieee-802-1-vlans:
            - name: v2-0488-03-0505
            vid: 488
            oui: 00:80:c2
            subtype: 3
        - type: 127
            ieee-802-3-mac-phy-conf:
            autoneg: true
            operational-mau-type: 16
            pmd-autoneg-cap: 27648
            oui: 00:12:0f
            subtype: 1
        - type: 127
            ieee-802-1-ppvids:
            - 0
            oui: 00:80:c2
            subtype: 2
        - type: 8
            management-addresses:
            - address: 00:01:30:F9:AD:A0
            address-subtype: MAC
            interface-number: 1001
            interface-number-subtype: 2
        - type: 127
            ieee-802-3-max-frame-size: 1522
            oui: 00:12:0f
            subtype: 4
    mac-address: 82:75:BE:6F:8C:7A
    mtu: 1500
    
  4. 验证输出,以确保设置与您预期的配置匹配。例如,连接到交换机的接口的 LLDP 信息显示此主机连接的交换机端口使用 VLAN ID 448:
    - type: 127
            ieee-802-1-vlans:
            - name: v2-0488-03-0505
            vid: 488
    
    如果 enp1s0 接口的网络配置使用不同的 VLAN ID,请相应地进行修改。

第28章 以 keyfile 格式手动创建 NetworkManager 配置集

NetworkManager 支持以 keyfile 格式存储的配置集。但是,默认情况下,如果您使用 NetworkManager 工具(如 nmcli、networking rhel-system-roles或 nmstate API)来管理配置文件,NetworkManager 仍然会使用 ifcfg 格式的配置文件。

28.1. keyfile 格式的 NetworkManager 配置集

当在磁盘上存储连接配置集时, NetworkManager 将使用 INI 样式的 keyfile 格式。

keyfile 格式的以太网连接配置集示例

[connection]
id=example_connection
uuid=82c6272d-1ff7-4d56-9c7c-0eb27c300029
type=ethernet
autoconnect=true

[ipv4]
method=auto

[ipv6]
method=auto

[ethernet]
mac-address=00:53:00:8f:fa:66

每个部分都对应一个 NetworkManager 设置名称,NetworkManager keyfile 文件中的大多数变量都有一个一对一的映射。这意味着 NetworkManager 的属性作为相同名称的变量和相同格式存储在 keyfile 中。然而,有一些例外情况,主要是为了使 keyfile 语法更易于阅读。

出于安全考虑,由于连接配置文件可以包含敏感信息,如私钥和密语,NetworkManager 仅使用由 root 拥有的配置文件,并且仅可由 root 读和写。

根据连接配置文件的目的,将其保存在以下目录中:

  • /etc/NetworkManager/system-connections/ :用户创建的持久配置文件的通用位置,也可以对其进行编辑。NetworkManager 将它们自动复制到 /etc/NetworkManager/system-connections/。
  • /run/NetworkManager/system-connections/ :用于在重启系统时自动删除的临时配置文件。
  • /usr/lib/NetworkManager/system-connections/ :用于预先部署的不可变的配置文件。当您使用 NetworkManager API 编辑此类配置文件时,NetworkManager 会将此配置文件复制到持久性存储或临时存储中。

NetworkManager 不会自动从磁盘重新加载配置文件。当您以 keyfile 格式创建或更新连接配置集时,请使用 nmcli connection reload 命令告知 NetworkManager 更改。

28.2.以 keyfile 格式创建 NetworkManager 配置集

本节介绍如何以 keyfile 格式手动创建 NetworkManager 连接配置集。

注意,手动创建或更新配置文件可能会导致意外或无法正常工作的网络配置。OpenCloudOS 建议您使用 NetworkManager 工具,如 nmcli、网络 RHEL 系统角色或 nmstate API 来管理 NetworkManager 连接。

流程

  1. 如果您为硬件接口(如以太网卡)创建了一个配置文件,请显示此接口的 MAC 地址:

    # ip address show enp1s0
    2: enp1s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
        link/ether 00:53:00:8f:fa:66 brd ff:ff:ff:ff:ff:ff
    

  2. 创建连接配置文件。例如,对于使用 DHCP 的以太网设备的连接配置文件,请使用以下内容创建 /etc/NetworkManager/system-connections/example.nmconnection 文件:

    [connection]
    id=example_connection
    type=ethernet
    autoconnect=true
    
    [ipv4]
    method=auto
    
    [ipv6]
    method=auto
    
    [ethernet]
    mac-address=00:53:00:8f:fa:66
    

您可以使用任何以 .nmconnection 为后缀的文件名。但是,当您稍后使用 nmcli 命令来管理连接时,您必须在引用此连接 id 变量中设置的连接名称。当省略 id 变量时,请使用不带 .nmconnection 的文件名来引用此连接。

  1. 对配置文件设置权限,以便只有 root 用户可以读和更新它:

    # chown root:root /etc/NetworkManager/system-connections/example.nmconnection
    # chmod 600 /etc/NetworkManager/system-connections/example.nmconnection
    

  2. 重新加载连接配置文件:

    # nmcli connection reload
    

  3. 验证 NetworkManager 是否从配置文件读取配置文件:

    # nmcli -f NAME,UUID,FILENAME connection
    NAME                UUID                                  FILENAME
    example-connection  86da2486-068d-4d05-9ac7-957ec118afba  /etc/NetworkManager/system-connections/example.nmconnection
    ...
    
    如果命令未显示新添加的连接,请验证文件权限和您在文件中使用的语法是否正确。

  4. 可选:如果您将配置文件中的 autoconnect 变量设为 false,请激活连接:

    # nmcli connection up example_connection
    

验证

  1. 显示连接配置文件:

    # nmcli connection show example_connection
    

  2. 显示接口的 IP 设置:

    # ip address show enp1s0
    

28.3.将 NetworkManager 配置集从 ifcfg 迁移到 keyfile 格式

您可以使用 nmcli connection migrate 命令将现有 ifcfg 连接配置集迁移到 keyfile 格式。这样,所有连接配置集都将位于一个位置和首选格式。

前提条件

  • 在 /etc/sysconfig/network-scripts/ 目录中有 ifcfg 格式的连接配置集。

流程

  • 迁移连接配置集
    # nmcli connection migrate
    Connection 'enp1s0' (43ed18ab-f0c4-4934-af3d-2b3333948e45) successfully migrated.
    Connection 'enp2s0' (883333e8-1b87-4947-8ceb-1f8812a80a9b) successfully migrated.
    ...
    

验证

  • 验证是否成功迁移了连接配置集
    # nmcli -f TYPE,FILENAME,NAME connection
    TYPE      FILENAME                                                           NAME
    ethernet  /etc/NetworkManager/system-connections/enp1s0.nmconnection         enp1s0
    ethernet  /etc/NetworkManager/system-connections/enp2s0.nmconnection         enp2s0
    ...
    

28.4.使用 nmcli 以离线模式创建密钥文件连接配置集

您可以使用 nmcli --offline connection add 命令,以离线模式 keyfile 格式创建各种连接配置集。

离线模式可确保 nmcli 在没有 NetworkManager 服务的情况下运行,以通过标准输出生成密钥文件连接配置集。此功能在以下情况下很有用:

  • 您想要创建需要预部署位置的连接配置集。例如,在容器镜像中,或 RPM 软件包。
  • 您需要在 NetworkManager 服务不可用的环境中创建连接配置集。例如,当您想要使用 chroot 工具时。或者,当您要通过 Kickstart %post 脚本创建或修改 OpenCloudOS 系统的网络配置时。

您可以创建以下连接配置集类型:

  • 静态以太网连接
  • 动态以太网连接
  • 网络绑定
  • 网桥
  • VLAN 或任何支持的连接类型

注意,手动创建或更新配置文件可能会导致意外或无法正常工作的网络配置。

前提条件

  • NetworkManager 服务已停止。

流程

  1. 以 keyfile 格式创建新连接配置集。例如,对于不使用 DHCP 的以太网设备的连接配置文件,请运行类似的 nmcli 命令:

    # nmcli --offline connection add type ethernet con-name Example-Connection ipv4.addresses 192.0.2.1/24 ipv4.dns 192.0.2.200 ipv4.method manual > /etc/NetworkManager/system-connections/output.nmconnection
    

    使用 con-name 键指定的连接名称保存在生成的配置集的 id 变量中。当您稍后使用 nmcli 命令管理这个连接时,请按如下所示指定连接: - 如果没有省略 id 变量,请使用连接名称,如 Example-Connection。 - 当省略 id 变量时,请使用不带 .nmconnection 后缀的文件名,如 输出。

  2. 对配置文件设置权限,以便只有 root 用户可以读和更新它:

    # chmod 600 /etc/NetworkManager/system-connections/output.nmconnection
    # chown root:root /etc/NetworkManager/system-connections/output.nmconnection
    

  3. 启动 NetworkManager 服务:

    # systemctl start NetworkManager.service
    

  4. 可选:如果您将配置文件中的 autoconnect 变量设为 false,请激活连接:

    # nmcli connection up Example-Connection
    

验证

  1. 验证 NetworkManager 服务是否正在运行:
    # systemctl status NetworkManager.service
    ● NetworkManager.service - Network Manager
    Loaded: loaded (/usr/lib/systemd/system/NetworkManager.service; enabled; vendor preset: enabled)
    Active: active (running) since Wed 2022-08-03 13:08:32 CEST; 1min 40s ago
        Docs: man:NetworkManager(8)
    Main PID: 7138 (NetworkManager)
        Tasks: 3 (limit: 22901)
    Memory: 4.4M
    CGroup: /system.slice/NetworkManager.service
            └─7138 /usr/sbin/NetworkManager --no-daemon
    
    Aug 03 13:08:33 example.com NetworkManager[7138]: <info>  [1659524913.3600] device (vlan20): state change: secondaries -> activated (reason 'none', sys-iface-state: 'assume')
    Aug 03 13:08:33 example.com NetworkManager[7138]: <info>  [1659524913.3607] device (vlan20): Activation: successful, device activated.
    ...
    
  2. 验证 NetworkManager 是否可以从配置文件中读取配置集:
    # nmcli -f TYPE,FILENAME,NAME connection
    TYPE      FILENAME                                                    NAME
    ethernet /etc/NetworkManager/system-connections/output.nmconnection Example-Connection
    ethernet  /etc/sysconfig/network-scripts/ifcfg-enp1s0                 enp1s0
    ...
    
    如果输出没有显示新创建的连接,请验证 keyfile 权限和您所用的语法是否正确。
  3. 显示连接配置文件:
    # nmcli connection show Example-Connection
    connection.id:                          Example-Connection
    connection.uuid:                        232290ce-5225-422a-9228-cb83b22056b4
    connection.stable-id:                   --
    connection.type:                        802-3-ethernet
    connection.interface-name:              --
    connection.autoconnect:                 yes
    ...
    

第29章 使用 netconsole 通过网络记录内核信息

使用 netconsole 内核模块和同名的服务,当磁盘失败或不可能使用串行控制台时,您可以在日志通过网络记录内核消息,方便调试。

29.1.配置 netconsole 服务为将内核信息记录到远程主机

使用 netconsole 内核模块,您可以将内核信息记录到远程系统日志服务。

前提条件

  • 远程主机上已安装系统日志服务,如 rsyslog 。
  • 远程系统日志服务被配置为接收来自此主机的日志条目。

流程

  1. 安装 netconsole-service 软件包:
    # yum install netconsole-service
    
  2. 编辑 /etc/sysconfig/netconsole 文件,并将 SYSLOGADDR 参数设为远程主机的 IP 地址:
    # SYSLOGADDR=192.0.2.1
    
  3. 启用并启动 netconsole 服务:
    # SYSLOGADDR=192.0.2.1
    

验证

  • 在远程系统日志服务器上显示 /var/log/messages 文件。

第30章 systemd 网络目标和服务

NetworkManager 在系统引导过程中配置网络。但是,当使用远程 root(/)引导时,例如,如果 root 目录存储在 iSCSI 设备上,网络设置会在 RHEL 启动之前在初始 RAM 磁盘(initrd)中应用。例如,如果网络配置是在内核命令行上使用 rd.neednet=1 指定的,或者配置被指定为挂载远程文件系统,则网络设置将在 initrd 上应用。

本章描述了应用网络设置时使用的不同目标,如 network 、network-online、和 NetworkManager-wait-online 服务,以及如何配置 systemd 服务以使其在 network-online 服务启动后启动。

30.1.network 和 network-online systemd target 的不同

systemd 维护 network 和 network-online 目标单元。特殊单元,如 NetworkManager-wait-online.service,具有 WantedBy=network-online.target 和 Before=network-online.target 参数。如果启用了,这些单元将启动 network-online.target ,它们会延迟 network-online 目标,直到网络连接了。

network-online 目标启动一个服务,这会对进一步执行增加更长的延迟。systemd 会自动使用这个目标单元的 Wants 和 After 参数来向所有 System V(SysV) init 脚本服务单元添加依赖项,这些服务单元具有一个指向 $network 工具的 Linux Standard Base(LSB)头。LSB 头是 init 脚本的元数据。您可以使用它指定依赖项。这与 systemd 目标类似。

network 目标不会显著延迟引导进程的执行。到达 network 目标意味着,负责设置网络的服务已启动。但并不意味着已经配置了一个网络设备。这个目标在关闭系统的过程中非常重要。例如,如果您在引导过程中有一个排在 network 目标之后的服务,则这个依赖关系在关闭过程中会反过来。在服务停止后,网络才会断开连接。远程网络文件系统的所有挂载单元都会自动启动 network-online 目标单元,并在其之后排序。

注意,network-online 目标单元只在系统启动过程中有用。系统完成引导后,这个目标不会跟踪网络的在线状态。因此,您无法使用 network-online 来监控网络连接。这个目标提供了一个一次性系统启动概念。

30.2. NetworkManager-wait-online 概述

同步传统网络脚本会遍历所有配置文件来设置设备。它们应用所有与网络相关的配置并确保网络在线。

NetworkManager-wait-online 服务会等待要配置的网络的超时时间。这个网络配置涉及插入以太网设备、扫描 Wi-Fi 设备等。NetworkManager 会自动激活配置为自动启动的适当配置集。因 DHCP 超时或类似事件导致自动激活失败,网络管理器(NetworkManager)可能会在一定时间内处于忙碌状态。根据配置,NetworkManager 会重新尝试激活同一配置集或不同的配置集。

当启动完成后,所有配置集都处于断开连接的状态,或被成功激活。您可以配置配置集来自动连接。以下是一些参数示例,这些参数设定超时或者在连接被视为活跃时定义:

  • connection.wait-device-timeout - 设置用来检测设备的驱动程序的超时时间
  • ipv4.may-fail 和 ipv6.may-fail - 使用一个 IP 地址系列设置激活,或者一个特定的地址系列是否必须已完成配置。
  • ipv4.gateway-ping-timeout - 延迟激活。

30.3.将 systemd 服务配置为在网络已启动后再启动

OpenCloudOS 在 /usr/lib/systemd/system/ 目录中安装 systemd 服务文件。此流程为 /etc/systemd/system/service_name.service.d/ 中的服务文件创建一个置入段,该文件与 /usr/lib/systemd/system/ 中的服务文件一起使用,以便在网络在线后启动特定的 服务。如果置入段中的设置与 /usr/lib/systemd/system/ 中服务文件中的设置重叠,则它具有更高的优先级。

流程

  1. 要在编辑器中打开服务文件,请输入:
    # systemctl edit service_name
    
  2. 输入以下内容并保存更改:
    [Unit]
    After=network-online.target
    
  3. 输入以下内容并保存更改:
    # systemctl daemon-reload
    

第31章 Linux 流量控制

Linux 提供管理和操作数据包传输的工具。Linux 流量控制(TC)子系统帮助进行策略、分类、控制以及调度网络流量。TC 还可以通过使用过滤器和动作在分类过程中利用数据包内容分栏。TC 子系统通过排队规则(qdisc),TC 架构的基本元素,来实现此目的。

调度机制在进入或退出不同的队列前确定或者重新安排数据包。最常见的调度程序是先入先出(FIFO)调度程序。您可以使用 tc 工具临时执行 qdiscs 操作,也可以使用 NetworkManager 永久执行操作。

本章解释了排队规则,并描述了如何在 OpenCloudOS 中更新默认的 qdiscs。

31.1.排队规则概述

排队规则(qdiscs)会帮助规划排队等候,之后通过网络接口调度流量传输。qdisc 有两个操作: - 排队请求,以便在以后传输时对数据包进行排队 - 出队请求,以便可以选择其中一个排队的数据包进行即时传输。

每个 qdisc 都有一个 16 位十六进制标识数字,称为 handle ,带有一个附加的冒号,如 1: 或 abcd:这个数字被称为 qdisc 主号码。如果 qdisc 有类型,则标识符是由两个数字组成的对,主号码在次要号码之前,即 \:\,例如 abcd:1。次要号码的编号方案取决于 qdisc 类型。有时,编号是系统化的,其中第一类的 ID 为 < \:1,第二类的 ID 为 \:2 ,等等。一些 qdiscs 允许用户在创建类时随机设置类的次要号码。

Classful qdiscs

存在不同类型的 qdiscs,帮助从网络接口接收和传输数据包。您可以使用根类、父类或子类配置 qdiscs。子对象可以被附加的位置称为类。qdisc 中的类是灵活的,始终包含多个子类或一个子类 qdisc。不禁止包含类 qdisc 本身的类,这有助于实现复杂的流量控制场景。

类 qdiscs 本身不存储任何数据包。相反,它们根据指定于 qdisc 的标准,将排队和出队请求传到它们其中的一个子类。最后,这个递归数据包传递到最终保存数据包的位置(或在出现排队时从中提取)。

Classless qdiscs

有些 qdiscs 不包含子类,它们称为无类别 qdiscs。与类 qdiscs 相比,无类别 qdiscs 需要较少的自定义。通常情况下,将它们附加到接口就足够了。

31.2. OpenCloudOS 中可用的 qdiscs

每个 qdisc 解决唯一对应的与相关网络问题。以下是 OpenCloudOS 中可用的 qdiscs 列表。您可以使用以下任何一个 qdisc 来根据您的网络要求来塑造网络流量。

qdisc 名称 所处模块 卸载支持
异步传输模式(ATM) kernel-modules-extra
基于类的队列 kernel-modules-extra
基于信用的塑造程序 kernel-modules-extra
CHOose 和 Keep 用于有响应的流量,CHOose 和 Kill 用于没有响应的流量(CHOKE) kernel-modules-extra
受控的延迟(CoDel) kernel-core
轮循(DRR) kernel-modules-extra
Differentiated Services marker (DSMARK) kernel-modules-extra
Enhanced Transmission Selection (ETS) kernel-modules-extra
Fair Queue (FQ) kernel-core
Fair Queuing Controlled Delay (FQ_CODel) kernel-core
Generalized Random Early Detection (GRED) kernel-modules-extra
Hierarchical Fair Service Curve (HSFC) kernel-core
Heavy-Hitter Filter (HHF) kernel-core
Hierarchy Token Bucket (HTB) kernel-core
INGRESS kernel-core
Multi Queue Priority (MQPRIO) kernel-modules-extra
Multiqueue (MULTIQ) kernel-modules-extra
Network Emulator (NETEM) kernel-modules-extra
Proportional Integral-controller Enhanced (PIE) kernel-core
PLUG kernel-core
Quick Fair Queueing (QFQ) kernel-modules-extra
Random Early Detection (RED) kernel-modules-extra
Stochastic Fair Blue (SFB) kernel-modules-extra
Stochastic Fairness Queueing (SFQ) kernel-core
Token Bucket Filter (TBF) kernel-core
Trivial Link Equalizer (TEQL) kernel-modules-extra

注意,qdisc 卸载需要对 NIC 的硬件和驱动程序的支持。

31.3.使用 tc 工具检查网络接口的 qdiscs

默认情况下,OpenCloudOS 系统使用 fq_codel 、 qdisc。本节流程描述了如何检查 qdisc 计数器。

流程

  1. 可选:查看您当前的 qdisc :
    # tc qdisc show dev enp0s1
    
  2. 检查当前的 qdisc 计数器:
    # tc -s qdisc show dev enp0s1
    qdisc fq_codel 0: root refcnt 2 limit 10240p flows 1024 quantum 1514 target 5.0ms interval 100.0ms memory_limit 32Mb ecn
    Sent 1008193 bytes 5559 pkt (dropped 233, overlimits 55 requeues 77)
    backlog 0b 0p requeues 0
    ....
    
    • dropped - 由于所有队列已满而丢弃数据包的次数
    • overlimits - 配置的链路容量已满的次数
    • sent - 出队的数量

31.4.更新默认的 qdisc

流程

  1. 查看当前的默认 qdisc :
    # sysctl -a | grep qdisc
    net.core.default_qdisc = fq_codel
    
  2. 查看当前以太网连接的 qdisc :
    # tc -s qdisc show dev enp0s1
    qdisc fq_codel 0: root refcnt 2 limit 10240p flows 1024 quantum 1514 target 5.0ms interval 100.0ms memory_limit 32Mb ecn
    Sent 0 bytes 0 pkt (dropped 0, overlimits 0 requeues 0)
    backlog 0b 0p requeues 0
    maxpacket 0 drop_overlimit 0 new_flow_count 0 ecn_mark 0
    new_flows_len 0 old_flows_len 0
    
  3. 更新现有的 qdisc :
    # sysctl -w net.core.default_qdisc=pfifo_fast
    
  4. 重新加载网络驱动程序应用更改:
    # rmmod NETWORKDRIVERNAME
    # modprobe NETWORKDRIVERNAME
    
  5. 启动网络接口:
    # IP link set enp0s1 up
    

验证

  • 查看以太网连接的 qdisc :
    # tc -s qdisc show dev enp0s1
    qdisc pfifo_fast 0: root refcnt 2 bands 3 priomap  1 2 2 2 1 2 0 0 1 1 1 1 1 1 1 1
    Sent 373186 bytes 5333 pkt (dropped 0, overlimits 0 requeues 0)
    backlog 0b 0p requeues 0
    ....
    

使用 tc 工具临时设置网络接口的 qdisk

您可以更新当前临时的 qdisc 而不更改默认的 qdisc 。

流程

  1. 可选:查看当前的 qdisc :
    # tc -s qdisc show dev enp0s1
    
  2. 更新当前的 qdisc :
    # tc qdisc replace dev enp0s1 root htb
    

验证

  • 查看更新后的当前 qdisc :
    # tc -s qdisc show dev enp0s1
    qdisc htb 8001: root refcnt 2 r2q 10 default 0 direct_packets_stat 0 direct_qlen 1000
    Sent 0 bytes 0 pkt (dropped 0, overlimits 0 requeues 0)
    backlog 0b 0p requeues 0
    

31.6.使用 NetworkManager 永久设置网络接口的当前 qdisk

流程

  1. 可选:查看当前的 qdisc :
    # tc qdisc show dev enp0s1
     qdisc fq_codel 0: root refcnt 2
    
  2. 更新当前的 qdisc :
    # nmcli connection modify enp0s1 tc.qdiscs ‘root pfifo_fast’
    
  3. 可选:要在现有的 qdisc 上添加另一个 qdisc,请使用 +tc.qdisc 选项:
    # nmcli connection modify enp0s1 +tc.qdisc ‘ingress handle ffff:’
    
  4. 激活更改:
    # nmcli connection up enp0s1
    

验证

  • 查看更新后的当前 qdisc :
    # tc qdisc show dev enp0s1
    qdisc pfifo_fast 8001: root refcnt 2 bands 3 priomap  1 2 2 2 1 2 0 0 1 1 1 1 1 1 1 1
    qdisc ingress ffff: parent ffff:fff1 ----------------
    

第32章 配置DNS服务器顺序

大多数应用程序使用 glibc 库的 getaddrinfo() 函数来解析 DNS 请求。默认情况下,glibc 将所有 DNS 请求发送到 /etc/resolv.conf 文件中指定的第一个 DNS 服务器。如果这个服务器没有回复,OpenCloudOS 会使用这个文件中的下一个服务器。

本章介绍了如何自定义 DNS 服务器顺序。

32.1.使用 NetworkManager 在 /etc/resolv.conf 中对 DNS 服务器进行排序

NetworkManager 根据以下规则对 /etc/resolv.conf 文件中的 DNS 服务器进行排序: - 如果只有一个连接配置集,NetworkManager 将使用那个连接中指定的 IPv4 和 IPv6 DNS 服务器顺序。 - 如果激活多个连接配置集,NetworkManager 会根据 DNS 优先级值对 DNS 服务器进行排序。如果您设置了 DNS 优先级,NetworkManager 的行为取决于 dns 参数中设置的值。您可以在 /etc/NetworkManager/NetworkManager.conf 文件的 [main] 部分中设置此参数:

  • dns=default 或者如果 dns 参数没有设置:

    NetworkManager 根据每个连接中的 ipv4.dns-priority 和 ipv6.dns-priority 参数对不同的连接的 DNS 服务器进行排序。

    如果没有设置值,或者您将 ipv4.dns-priority 和 ipv6.dns-priority 设为 0 ,则 NetworkManager 将使用全局默认值。请参阅 DNS 优先级参数的默认值。

  • dns=dnsmasq 或 dns=systemd-resolved :

    当您使用这些设置中的一个时,NetworkManager 将 dnsmasq 的 127.0.0.1 或 127.0.0.53 设为 /etc/resolv.conf 文件中的 nameserver 条目。

    dnsmasq 和 systemd-resolved 服务将对 NetworkManager 连接中设置的搜索域的查询转发到该连接中指定的 DNS 服务器,并将对其他域的查询转发到带有默认路由的连接。当多个连接有相同的搜索域集时,dnsmasq 和 systemd-resolved 将这个域的查询转发到在具有最低优先级值的连接中设置的 DNS 服务器。

DNS 优先级参数的默认值 NetworkManager 对连接使用以下默认值:

  • 50 用于 VPN 连接
  • 100 用于其他连接

有效的 DNS 优先级值: 您可以将全局默认值和特定于连接的 ipv4.dns-priority 和 ipv6.dns-priority 参数设为 -2147483647 和 2147483647 之间的值。

  • 低的值具有更高的优先级。
  • 负值具有一个特殊的效果,它会排除其他带有更大值的配置。例如,如果至少有一个连接具有负优先级值,NetworkManager 只使用在连接配置集中指定的具有最低优先级的 DNS 服务器。
  • 如果多个连接具有相同的 DNS 优先级,NetworkManager 会按照以下顺序排列 DNS 的优先顺序:

    1. VPN 连接
    2. 带有活跃的默认路由的连接。活跃的默认路由是具有最低指标的默认路由。

32.2.设置 NetworkManager DNS 默认服务器优先级值

NetworkManager 为连接使用以下 DNS 优先级默认值:

  • 50 用于 VPN 连接
  • 100 用于其他连接

这部分论述了如何使用 IPv4 和 IPv6 连接的自定义默认值覆盖这些系统范围的默认值。

流程

  1. 编辑 /etc/NetworkManager/NetworkManager.conf 文件:
  2. 添加 [connection] 部分(如果不存在):
    [connection]
    
  3. 将自定义默认值添加到 [connection] 部分。例如,要将 IPv4 和 IPv6 的新默认值设为 200,请添加:

    ipv4.dns-priority=200
    ipv6.dns-priority=200
    
    您可以将参数设为 -2147483647 和 2147483647 之间的值。请注意,将参数设置为 0 将启用内置的默认值(对于 VPN 连接为 50 ,对于其他连接为 100 )。

  4. 重新载入 NetworkManager 服务:

    # systemctl reload NetworkManager
    

32.3.设置 NetworkManager 连接的 DNS 优先级

本节介绍了如何在 NetworkManager 创建或更新 /etc/resolv.conf 文件时定义 DNS 服务器的顺序。

请注意,只有在您配置了多个不同 DNS 服务器的多个连接时,设置 DNS 优先级才有意义。如果您只有一个配置了多个 DNS 服务器的连接,请在连接配置集中按顺序手动设置 DNS 服务器。

前提条件

  • 系统配置了多个 NetworkManager 连接。
  • 系统在 /etc/NetworkManager/NetworkManager.conf 文件中未设置 dns 参数,或者该参数被设为了 default。

流程

  1. 可选,显示可用的连接:
    # nmcli connection show
    NAME           UUID                                  TYPE      DEVICE
    Example_con_1  d17ee488-4665-4de2-b28a-48befab0cd43  ethernet  enp1s0
    Example_con_2  916e4f67-7145-3ffa-9f7b-e7cada8f6bf7  ethernet  enp7s0
    ...
    
  2. 设置 ipv4.dns-priority 和 ipv6.dns-priority 参数。例如,对于 Example_con_1 连接,将两个参数都设为 10 :
    # nmcli connection modify Example_con_1 ipv4.dns-priority 10 ipv6.dns-priority 10
    
  3. 重新激活您更新的连接:
    # nmcli connection up Example_con_1
    

验证

  • 显示 /etc/resolv.conf 文件的内容以验证 DNS 服务器的顺序是否正确:
    # cat /etc/resolv.conf
    

第33章 使用 ifcfg 文件配置 ip 网络

本章介绍了如何通过编辑 ifcfg 文件来手动配置网络接口。

NetworkManager 支持以 keyfile 格式存储的配置集。但是,在使用 NetworkManager API 创建或更新配置文件时,NetworkManager 默认使用 ifcfg 格式。

接口配置(ifcfg)文件可控制各个网络设备的软件接口。当系统引导时,它使用这些文件来决定启动哪些界面以及如何进行配置。这些文件通常被命名为 ifcfg-name,其中后缀 name 指的是配置文件控制的设备的名称。按照惯例,ifcfg 文件的后缀与配置文件中 DEVICE 指令提供的字符串相同。

33.1.使用 ifcfg 文件配置带有静态网络设置的接口

本节介绍了如何使用 ifcfg 文件配置网络接口。

流程

  • 如果需要为名为 enp1s0 的接口配置具有静态网络设置的接口,请在 /etc/sysconfig/network-scripts/ 目录中创建一个名为 ifcfg-enp1s0 的文件,其包含以下内容:
  • 对于 IPv4 配置:
    DEVICE=enp1s0
    BOOTPROTO=none
    ONBOOT=yes
    PREFIX=24
    IPADDR=10.0.1.27
    GATEWAY=10.0.1.1
    
  • 对于 IPv6 配置:
    DEVICE=enp1s0
    BOOTPROTO=none
    ONBOOT=yes
    IPV6INIT=yes
    IPV6ADDR=2001:db8:1::2/64
    

33.2.使用 ifcfg 文件配置带有动态网络设置的接口

本节介绍了如何使用 ifcfg 文件配置具有动态网络设置的网络接口。

流程

  1. 如果需要为名为 em1 的接口配置具有动态网络设置的接口,请在 /etc/sysconfig/network-scripts/ 目录中创建一个名为 ifcfg-em1 的文件,其包含以下内容:

    DEVICE=em1
    BOOTPROTO=dhcp
    ONBOOT=yes
    

  2. 要配置发送的接口:

  3. 如果 DHCP 服务器使用不同的主机名,请在 ifcfg 文件中添加以下行:
    DHCP_HOSTNAME=hostname
    
  4. DHCP 服务器使用不同的完全限定域名(FQDN),请在 ifcfg 文件中添加以下行:
    DHCP_FQDN=fully.qualified.domain.name
    

注意,您只能使用这些设置中的一个。如果您同时指定了 DHCP_HOSTNAME 和 DHCP_FQDN,则只使用 DHCP_FQDN。

  1. 要将接口配置为使用特定的 DNS 服务器,请在 ifcfg 文件中添加以下行:
    PEERDNS=no
    DNS1=ip-address
    DNS2=ip-address
    
    其中 ip-address 是 DNS 服务器的地址。这会导致网络服务使用指定的 DNS 服务器更新 /etc/resolv.conf。只需要一个 DNS 服务器地址,另一个是可选的。

33.3.使用 ifcfg 文件管理系统范围和专用的连接配置集

本节描述了如何配置 ifcfg 文件来管理系统范围和私有的连接配置文件。

流程 访问权限对应 ifcfg 文件中的 USERS 指令。如果没有 USERS 指令,则网络配置文件对所有用户可用。

  • 例如,使用以下行修改 ifcfg 文件,这将使连接仅对列出的用户可用:
    USERS="joe bob alice"
    

第34章 使用 NetworkManager 为特定连接禁用 IPv6

这部分描述了如何在使用 NetworkManager 管理网络接口的系统上禁用 IPv6 协议。如果您禁用了 IPv6,则 NetworkManager 会在内核中自动设置相应的 sysctl 值。如果使用内核可调参数或内核引导参数禁用 IPv6,则必须额外考虑系统配置。

前提条件 - 系统使用 NetworkManager 来管理网络接口

34.1.使用 nmcli 在连接中禁用 IPv6

流程

  1. 可选,显示网络连接列表:
    # nmcli connection show
    NAME    UUID                                  TYPE      DEVICE
    Example 7a7e0151-9c18-4e6f-89ee-65bb2d64d365  ethernet  enp1s0
    ...
    
  2. 显示网络连接列表:
    # nmcli connection modify Example ipv6.method "disabled"
    
  3. 重启网络连接:
    # nmcli connection up Example
    

验证

  1. 输入 ip address show 命令来显示设备的 IP 设置:

    # ip address show enp1s0
    2: enp1s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
        link/ether 52:54:00:6b:74:be brd ff:ff:ff:ff:ff:ff
        inet 192.0.2.1/24 brd 192.10.2.255 scope global noprefixroute enp1s0
        valid_lft forever preferred_lft forever
    
    如果没有显示 inet6 条目,则 IPv6 在该设备上被禁用。

  2. 验证 /proc/sys/net/ipv6/conf/enp1s0/disable_ipv6 文件现在是否包含值 1 :

    # cat /proc/sys/net/ipv6/conf/enp1s0/disable_ipv6
    1
    
    值 1 表示针对该设备禁用 IPv6。

第35章 手动配置 /etc/resolv.conf 文件

默认情况下,OpenCloudOS 上的 NetworkManager 使用连接配置文件中的 DNS 设置动态更新 /etc/resolv.conf 文件。本章介绍了如何禁用此特性,来在 /etc/resolv.conf 中手动配置 DNS 设置。

35.1.在 NetworkManager 配置中禁用 DNS 处理

本节介绍了如何在 NetworkManager 配置中禁用 DNS 处理来手动配置 /etc/resolv.conf 文件。

流程

  1. 以 root 用户身份,使用文本编辑器创建包含以下内容的 /etc/NetworkManager/conf.d/90-dns-none.conf 文件:

    [main]
    dns=none
    

  2. 重新载入 NetworkManager 服务:

    # systemctl reload NetworkManager
    
    注意,重新加载服务后,NetworkManager 不再更新 /etc/resolv.conf 文件。但是该文件的最后内容将被保留。

  3. (可选)从 /etc/resolv.conf 中删除 NetworkManager 生成的 注释,方便阅读。

验证

  1. 编辑 /etc/resolv.conf 文件并手动更新配置。
  2. 重新载入 NetworkManager 服务:
    # systemctl reload NetworkManager
    
  3. 显示 /etc/resolv.conf 文件:
    # cat /etc/resolv.conf
    
    如果您成功禁用了 DNS 处理,NetworkManager 不会覆盖手动配置的设置。

35.2.使用符号链接替换 /etc/resolv.conf 来手动配置 DNS 设置

如果 /etc/resolv.conf 是符号链接,则 NetworkManager 不会自动更新 DNS 配置。本节描述了如何将带有符号链接的 /etc/resolv.conf 替换成带有 DNS 配置的文件。

前提条件

  • rc-manager 选项没有设为 file。要验证,请使用 NetworkManager --print-config 命令。

流程

  1. 创建一个文件,如 /etc/resolv.conf.manually-configured,并将您环境的 DNS 配置添加到其中。使用与原始 /etc/resolv.conf 中一样的参数和语法。
  2. 删除 /etc/resolv.conf 文件:
    # rm /etc/resolv.conf
    
  3. 创建名为 /etc/resolv.conf 的符号链接,该链接指向 /etc/resolv.conf.manually-configured :
    # ln -s /etc/resolv.conf.manually-configured /etc/resolv.conf
    

第36章 监控并调整网卡环缓冲

接收环形缓冲区是设备驱动程序和网络接口控制器 (NIC) 之间共享的共享缓冲区。该卡会分配一个发送 (TX) 和接收 (RX) 环形缓冲区。顾名思义,环形缓冲区是一个循环缓冲区,溢出数据会覆盖现有数据。将数据从 NIC 移动到内核有两种方法,硬件中断和软件中断,也称为 SoftIRQ。

内核使用 RX 环形缓冲区来存储传入的数据包,直到它们可以被设备驱动程序处理。设备驱动程序通常使用 SoftIRQ排空 RX 环,它将传入的数据包放入称为sk_buff或skb的内核数据结构中,数据包开始其通过内核的过程,直到到达拥有相关套接字的应用程序。

内核使用 TX 环形缓冲区来保存发往线路的传出数据包。

这些环形缓冲区位于堆栈的底部,是可能发生丢包的关键点,同时,这也会对网络性能产生不利影响。

36.1.显示丢弃的数据包数量

ethtool 工具可让管理员查询、配置或控制网络驱动程序设置。

RX 环缓冲的耗尽会导致计数器的递增,例如 ethtool -S interface_name 的输出中的 "discard" 或 "drop"。丢弃的数据包表示可用缓冲区的填满速度要快于内核可以处理数据包的速度。

本节描述了如何使用 ethtool 显示丢弃计数器。

流程

  • 要查看 enp1s0 接口的丢弃计数器,请输入:
    $ ethtool -S enp1s0
    

36.2.增加 RX 环缓冲以降低数据包丢弃的比率

ethtool 工具可以帮助提高 RX 缓冲大小,以减少数据包的高丢弃率。

流程

  1. 查看 RX 环缓冲的最大值:

    # ethtool -g enp1s0
    Ring parameters for enp1s0:
    Pre-set maximums:
    RX:             4080
    RX Mini:        0
    RX Jumbo:       16320
    TX:             255
    Current hardware settings:
    RX:             255
    RX Mini:        0
    RX Jumbo:       0
    TX:             255
    

  2. 如果 Pre-set maximums 部分中的值大于 Current hardware settings 部分,请增加 RX 环缓冲:

    • 要临时将 enp1s0 设备的 RX 环缓冲改为 4080,请输入:
      # ethtool -G enp1s0 rx 4080
      
    • 要永久更改 RX 环缓冲,请创建一个 NetworkManager 分配程序脚本。

注意,根据您的网卡使用的驱动,环缓冲的改变会很快中断网络连接。

第37章 配置 802.3 链路设置

37.1.了解自动协商

自动协商是 IEEE 802.3u 快速以太网协议的一个特性。它以设备端口为目标,为链路上的信息交换提供速度、双工模式和流控制的最佳性能。使用自动协商协议时,您具有在以太网上进行数据传输的最佳性能。

注意,要最大限度地利用自动协商的性能,请在链接两端使用同样的配置。

37.2.使用 nmcli 工具配置802.3 链路设置

要配置以太网连接的 802.3 链接设置,请修改以下配置参数:

  • 802-3-ethernet.auto-negotiate
  • 802-3-ethernet.speed
  • 802-3-ethernet.duplex

流程

  1. 显示连接的当前设置:

    # nmcli connection show Example-connection
    ...
    802-3-ethernet.speed:  0
    802-3-ethernet.duplex: --
    802-3-ethernet.auto-negotiate: no
    ...
    
    如果需要在有问题的时候重置参数,您可以使用这些值。

  2. 设置速度和双工链路设置:

    # nmcli connection modify Example-connection 802-3-ethernet.auto-negotiate no 802-3-ethernet.speed 10000 802-3-ethernet.duplex full
    
    这个命令会禁用自动协商,并将连接的速度设为 10000 Mbit 全双工。

  3. 重新激活连接:

    # nmcli connection up Example-connection
    
    验证

  4. 使用 ethtool 工具验证以太网接口 enp1s0 的值:

    # ethtool enp1s0
    
    Settings for enp1s0:
        ...
        Advertised auto-negotiation: No
        ...
        Speed: 10000Mb/s
        Duplex: Full
        Auto-negotiation: off
        ...
        Link detected: yes
    

第38章 配置 ethtool offload 功能

网络接口卡可使用 TCP 卸载引擎(TOE)将某些操作推卸给网络控制器以提高网络吞吐量。

38.1.NetworkManager 支持的卸载功能

  • ethtool.feature-esp-hw-offload
  • ethtool.feature-esp-tx-csum-hw-offload
  • ethtool.feature-fcoe-mtu
  • ethtool.feature-gro
  • ethtool.feature-gso
  • ethtool.feature-highdma
  • ethtool.feature-hw-tc-offload
  • ethtool.feature-l2-fwd-offload
  • ethtool.feature-loopback
  • ethtool.feature-lro
  • ethtool.feature-macsec-hw-offload
  • ethtool.feature-ntuple
  • ethtool.feature-rx
  • ethtool.feature-rx-all
  • ethtool.feature-rx-fcs
  • ethtool.feature-rx-gro-hw
  • ethtool.feature-rx-gro-list
  • ethtool.feature-rx-udp_tunnel-port-offload
  • ethtool.feature-rx-udp-gro-forwarding
  • ethtool.feature-rx-vlan-filter
  • ethtool.feature-rx-vlan-stag-filter
  • ethtool.feature-rx-vlan-stag-hw-parse
  • ethtool.feature-rxhash
  • ethtool.feature-rxvlan
  • ethtool.feature-sg
  • ethtool.feature-tls-hw-record
  • ethtool.feature-tls-hw-rx-offload
  • ethtool.feature-tls-hw-tx-offload
  • ethtool.feature-tso
  • ethtool.feature-tx
  • ethtool.feature-tx-checksum-fcoe-crc
  • ethtool.feature-tx-checksum-ip-generic
  • ethtool.feature-tx-checksum-ipv4
  • ethtool.feature-tx-checksum-ipv6
  • ethtool.feature-tx-checksum-sctp
  • ethtool.feature-tx-esp-segmentation
  • ethtool.feature-tx-fcoe-segmentation
  • ethtool.feature-tx-gre-csum-segmentation
  • ethtool.feature-tx-gre-segmentation
  • ethtool.feature-tx-gso-list
  • ethtool.feature-tx-gso-partial
  • ethtool.feature-tx-gso-robust
  • ethtool.feature-tx-ipxip4-segmentation
  • ethtool.feature-tx-ipxip6-segmentation
  • ethtool.feature-tx-nocache-copy
  • ethtool.feature-tx-scatter-gather
  • ethtool.feature-tx-scatter-gather-fraglist
  • ethtool.feature-tx-sctp-segmentation
  • ethtool.feature-tx-tcp-ecn-segmentation
  • ethtool.feature-tx-tcp-mangleid-segmentation
  • ethtool.feature-tx-tcp-segmentation
  • ethtool.feature-tx-tcp6-segmentation
  • ethtool.feature-tx-tunnel-remcsum-segmentation
  • ethtool.feature-tx-udp-segmentation
  • ethtool.feature-tx-udp_tnl-csum-segmentation
  • ethtool.feature-tx-udp_tnl-segmentation
  • ethtool.feature-tx-vlan-stag-hw-insert
  • ethtool.feature-txvlan

有关各个卸载特性的详情,请查看 ethtool 工具文档和内核文档。

38.2.使用 NetworkManager 配置 ethtool offload 功能

本节介绍了如何使用 NetworkManager 启用和禁用 ethtool 卸载特性,以及如何从 NetworkManager 连接配置文件中删除某一特性的设置。

流程

  1. 例如:要启用 RX 卸载特性,并在 enp1s0 连接配置文件中禁用 TX 卸载,请输入:

    # nmcli con modify enp1s0 ethtool.feature-rx on ethtool.feature-tx off
    
    这个命令明确启用 RX 卸载并禁用 TX 卸载功能。

  2. 要删除之前启用或禁用的卸载特性的设置,请将特性的参数设为 ignore。例如,要删除 TX 卸载的配置,请输入:

    # nmcli con modify enp1s0 ethtool.feature-tx ignore
    
    3. 重新激活网络配置集:

    # nmcli connection up enp1s0
    

验证步骤

  • 使用 ethtool -k 命令显示网络设备的当前卸载特性:

    # ethtool -k network_device
    

38.3.使用 rhel-system-roles 设置 ethtool 特性

您可以使用 rhel-system-roles 中的网络角色来配置 NetworkManager 连接的 ethtool 特性。

当您运行使用 Networking RHEL system roles 的脚本时,如果设置的值与脚本中指定的名称不匹配,则系统角色会覆盖具有相同名称的现有的连接配置文件。因此,始终在脚本中指定网络连接配置文件的整个配置,即使 IP 配置已经存在。否则,role 会将这些值重置为默认值。

前提条件

  • ansible 和 rhel-system-roles 软件包已安装在控制节点上。
  • 如果您使用非 root 用户运行 playbook ,请确保用户在受管节点上具有 sudo 权限。

流程

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

    node.example.com
    
    2. 使用以下内容创建 ~/configure-ethernet-device-with-ethtool-features.yml playbook:

    ---
    - name: Configure an Ethernet connection with ethtool features
    hosts: node.example.com
    become: true
    tasks:
    - include_role:
        name: rhel-system-roles.network
    
        vars:
        network_connections:
            - name: enp1s0
            type: ethernet
            autoconnect: yes
            ip:
                address:
                - 198.51.100.20/24
                - 2001:db8:1::1/64
                gateway4: 198.51.100.254
                gateway6: 2001:db8:1::fffe
                dns:
                - 198.51.100.200
                - 2001:db8:1::ffbb
                dns_search:
                - example.com
            ethtool:
                features:
                gro: "no"
                gso: "yes"
                tx_sctp_segmentation: "no"
            state: up
    
    3. 运行 playbook:

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

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

      # ansible-playbook -u user_name --ask-become-pass ~/configure-ethernet-device-with-ethtool-features.yml
      
      --ask-become-pass 选项确保 ansible-playbook 命令提示输入 -u user_name 选项中定义的用户的 sudo 密码。

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

第39章 配置 ethtool coalesce 设置

利用中断合并,系统收集网络数据包,并为多个数据包生成一个中断。这会增加一个硬件中断能够发送到内核的数据量,从而减少中断负载,并最大化吞吐量。

本节提供了用来设置 ethtool 合并设置的不同选项。

39.1. NetworkManager 支持的合并设置

您可以使用 NetworkManager 设置以下 ethtool 合并设置: - coalesce-adaptive-rx - coalesce-adaptive-tx - coalesce-pkt-rate-high - coalesce-pkt-rate-low - coalesce-rx-frames - coalesce-rx-frames-high - coalesce-rx-frames-irq - coalesce-rx-frames-low - coalesce-rx-usecs - coalesce-rx-usecs-high - coalesce-rx-usecs-irq - coalesce-rx-usecs-low - coalesce-sample-interval - coalesce-stats-block-usecs - coalesce-tx-frames - coalesce-tx-frames-high - coalesce-tx-frames-irq - coalesce-tx-frames-low - coalesce-tx-usecs - coalesce-tx-usecs-high - coalesce-tx-usecs-irq - coalesce-tx-usecs-low

39.2.使用 NetworkManager 配置 ethtool 合并设置

这部分描述了如何使用 NetworkManager 设置 ethtool 合并设置,以及如何从 NetworkManager 连接配置文件中删除设置。

流程

  1. 例如,要在 enp1s0 连接配置文件中将接收的数据包的最大数量设置为延迟到 128,请输入:

    # nmcli connection modify enp1s0 ethtool.coalesce-rx-frames 128
    
  2. 要删除合并设置,可将设置设为 ignore。例如,要删除 ethtool.coalesce-rx-frames 设置,请输入:

    # nmcli connection modify enp1s0 ethtool.coalesce-rx-frames ignore
    
  3. 重新激活网络配置集:

    # nmcli connection up enp1s0
    

验证步骤

  • 使用 ethtool -c 命令显示网络设备的当前卸载特性:

    # ethtool -c network_device
    

39.3.使用 rhel-system-roles 设置 ethtool 合并设置

您可以使用 rhel-system-roles 中的网络角色来配置 NetworkManager 连接的 ethtool 合并设置。

当您运行使用 Networking RHEL system roles 的脚本时,如果设置的值与脚本中指定的名称不匹配,则系统角色会覆盖具有相同名称的现有的连接配置文件。因此,始终在脚本中指定网络连接配置文件的整个配置,即使 IP 配置已经存在。否则,role 会将这些值重置为默认值。

前提条件

  • ansible 和 rhel-system-roles 软件包已安装在控制节点上。
  • 如果您使用非 root 用户运行 playbook ,请确保用户在受管节点上具有 sudo 权限。

流程

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

    node.example.com
    
    2. 使用以下内容创建 ~/configure-ethernet-device-with-ethtool-features.yml playbook:

    ---
    - name: Configure an Ethernet connection with ethtool coalesce settings
     hosts: node.example.com
     become: true
     tasks:
     - include_role:
         name: rhel-system-roles.network
    
       vars:
         network_connections:
           - name: enp1s0
             type: ethernet
             autoconnect: yes
             ip:
               address:
                 - 198.51.100.20/24
                 - 2001:db8:1::1/64
               gateway4: 198.51.100.254
               gateway6: 2001:db8:1::fffe
               dns:
                 - 198.51.100.200
                 - 2001:db8:1::ffbb
               dns_search:
                 - example.com
             ethtool:
               coalesce:
                 rx_frames: 128
                 tx_frames: 128
             state: up
    
    3. 运行 playbook:

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

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

      # ansible-playbook -u user_name --ask-become-pass ~/configure-ethernet-device-with-ethtoolcoalesce-settings.yml
      
      --ask-become-pass 选项确保 ansible-playbook 命令提示输入 -u user_name 选项中定义的用户的 sudo 密码。

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

第40章 使用 MACsec 加密同一物理网络中的第 2 层流量

介质访问控制安全(MACsec)是一种第 2 层的协议,用于保护以太网链路上的不同的流量类型,您可以使用 MACsec 来保护两个设备(点到点)之间的通信。MACsec 包括: - 动态主机配置协议(DHCP) - 地址解析协议(ARP) - 互联网协议版本 4 / 6(IPv4 / IPv6)以及 - 任何使用 IP的流量(如 TCP 或 UDP)

MACsec 默认使用 GCM-AES-128 算法加密并验证 LAN 中的所有流量,使用预共享密钥在参与的主机之间建立连接。如果要更改预共享密钥,您需要更新网络中使用 MACsec 的所有主机上的 NM 配置。

MACsec 连接将以太网设备(如以太网网卡、VLAN 或隧道设备)用作父设备。您可以只在 MACsec 设备上设置 IP 配置,以便只使用加密连接与其他主机进行通信,也可以在父设备上设置 IP 配置。在后者的情况下,您可以使用父设备使用未加密连接和 MACsec 设备加密连接与其他主机通信。

Macsec 不需要任何特殊硬件。例如,您可以使用任何交换机,如果您只想在主机和交换机之间加密流量。在这种情况下,交换机还必须支持 MACsec。

配置 MACsec 有两种常用的用法: - 主机到主机 - 主机到交换机,然后交换机到其他主机

注意,您只能在相同(物理或虚拟)LAN 的主机间使用 MACsec。

40.1.使用 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 连接连接的两个主机上,创建 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 f2b4297d39da7330910a7abc0449feb45b5c0b9fc23df1430e1898fcf1c4550
    
    在macsec.mka-cak 和 macsec.mka-ckn 参数中使用上一步生成的 CAK 和 CKN。在 MACsec-protected 网络的每个主机上,这些值必须相同。

  2. 配置 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'
      
      4. 激活连接:

    # nmcli connection up macsec0
    

验证步骤

  1. 验证流量是否加密:

    # tcpdump -nn -i enp1s0
    
    2. 可选:显示未加密的流量:

    # tcpdump -nn -i macsec0
    
    3. 显示 MACsec 统计信息:

    # ip macsec show
    
    4. 显示每种保护类型的单独的计数器:仅完整性(关闭加密)和加密(打开加密)

    # ip -s macsec show
    

第41章 在不同域中使用不同的 DNS 服务器

默认情况下,OpenCloudOS 将所有 DNS 请求发送到 /etc/resolv.conf 文件中指定的第一个 DNS 服务器。如果这个服务器没有回复,OpenCloudOS 会使用这个文件中的下一个服务器。

在一个 DNS 服务器无法解析所有域的环境中,管理员可将 OpenCloudOS 配置为将特定域的 DNS 请求发送到所选 DNS 服务器。例如,您可以配置一个 DNS 服务器来解析对 example.com 的查询,配置另一个 DNS 服务器来解析对 example.net 的查询。对于所有其他 DNS 请求,OpenCloudOS 使用与默认网关连接中配置的 DNS 服务器。

41.1.将特定域的 DNS 请求发送到所选 DNS 服务器

本节配置了 systemd-resolved 服务和 NetworkManager ,来将对特定域的 DNS 查询发送到所选的 DNS 服务器。

如果您完成了本节中的流程,OpenCloudOS 将使用 /etc/resolv.conf 文件中 systemd-resolved 提供的 DNS 服务。systemd-resolved 服务启动一个 DNS 服务,该服务侦听端口 53 ,IP 地址 127.0.0.53。该服务会动态将 DNS 请求路由到 NetworkManager 中指定的对应 DNS 服务器。请将 IP 替换为实际生产中需要的 IP 地址。

前提条件

  • 系统配置了多个 NetworkManager 连接。
  • 在负责解析特定域的 NetworkManager 连接中配置 DNS 服务器和搜索域

例如:如果 VPN 连接中指定的 DNS 服务器应该可以解析对 example.com 域的查询,则 VPN 连接配置文件必须有:

  1. 配置一个可以解析 example.com 的 DNS 服务器
  2. 在 ipv4.dns-search 和 ipv6.dns-search 参数中将搜索域配置为 example.com

流程

  1. 启动并启用 systemd-resolved 服务:

    # systemctl --now enable systemd-resolved
    
  2. 编辑 /etc/NetworkManager/NetworkManager.conf 文件,并在 [main] 部分中设置以下条目:

    dns=systemd-resolved
    
  3. 重新载入 NetworkManager 服务:

    # systemctl reload NetworkManager
    

验证

  1. 验证 /etc/resolv.conf 文件中的 nameserver 条目是否指向 127.0.0.53 :

    # cat /etc/resolv.conf
    nameserver 127.0.0.53
    
  2. 验证 systemd-resolved 服务是否监听本地 IP 地址 127.0.0.53 上的端口 53 :

    # ss -tulpn | grep "127.0.0.53"
    udp  UNCONN 0  0      127.0.0.53%lo:53   0.0.0.0:*    users:(("systemd-resolve",pid=1050,fd=12))
    tcp  LISTEN 0  4096   127.0.0.53%lo:53   0.0.0.0:*    users:(("systemd-resolve",pid=1050,fd=13))
    

第42章 使用 IPVLAN

本章介绍了 IPVLAN 驱动程序。

42.1.IPVLAN 概述

IPVLAN 是虚拟网络设备的驱动程序,可在容器环境中用于访问主机网络。IPVLAN 会将一个 MAC 地址公开给外部网络,而不管主机网络中所创建的 IPVLAN 设备的数量。这意味着,用户可以在多个容器中有多个 IPVLAN 设备,相应的交换机会读取单个 MAC 地址。当本地交换机对它可管理的 MAC 地址的总数施加约束时,IPVLAN 驱动程序很有用。

42.2.IPVLAN 模式

IPVLAN 有以下模式可用:

  • L2 模式

    在 IPVLAN L2 模式 中,虚拟设备接收并响应地址解析协议(ARP)请求。netfilter 框架仅在拥有虚拟设备的容器中运行。容器化流量的默认命名空间中不会执行 netfilter 链。使用L2 模式会提供良好的性能,但对网络流量的控制要小。

  • L3 模式

    在 L3 模式 中,虚拟设备只处理 L3 以上的流量。虚拟设备不响应 ARP 请求,用户必须手动为相关点上的 IPVLAN IP 地址配置邻居条目。相关容器的出口流量位于默认命名空间中的 netfilter POSTROUTING 和 OUTPUT 链上,而入口流量以与 L2 模式 相同的方式被线程化。使用L3 模式会提供很好的控制,但可能会降低网络流量性能。

  • L3S 模式

    在 L3S 模式 中,虚拟设备处理方式与 L3 模式 中的处理方式相同,但相关容器的出口和入口流量都位于默认命名空间中的 netfilter 链上。L3S 模式 的行为方式和 L3 模式 相似,但提供了对网络的更大控制。

对于 L3 和 L3S 模式,IPVLAN 虚拟设备不接收广播和多播流量。

42.3.MACVLAN 概述

MACVLAN 驱动程序允许在一个 NIC 上创建多个虚拟网络设备,每个网卡都由其自身唯一的 MAC 地址标识。物理 NIC 上的数据包通过目的地的 MAC 地址与相关的 MACVLAN 设备进行多路复用。MACVLAN 设备不添加任何级别的封装。

42.4.IPVLAN 和 MACVLAN 的比较

下表列出了 MACVLAN 和 IPVLAN 的主要区别。

MACVLAN IPVLAN
为每个 MACVLAN 设备使用 MAC 地址。交换中 MAC 表的 MAC 地址限制可能会导致连接丢失。 使用不限制 IPVLAN 设备数的单个 MAC 地址。
全局命名空间的 netfilter 规则不会影响子命名空间中到达或从 MACVLAN 设备经过的网络流量。 有可能在 L3 模式和 L3S 模式中控制到 IPVLAN 设备或者来自 IPVLAN 设备的网络流量。

请注意,IPVLAN 和 MACVLAN 不需要任何级别的封装。

42.5.使用 iproute2 创建和配置 IPVLAN 设备

本节介绍了如何使用 iproute2 设置 IPVLAN 设备。

流程

  1. 要创建 IPVLAN 设备,请输入以下命令:

    # ip link add link real_NIC_device name IPVLAN_device type ipvlan mode l2
    
    请注意:网络接口控制器(NIC)是将计算机连接到网络的一个硬件组件。

    例 43.1. 创建 IPVLAN 设备

    # ip link add link enp0s31f6 name my_ipvlan type ipvlan mode l2
    # ip link
    47: my_ipvlan@enp0s31f6: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000 link/ether e8:6a:6e:8a:a2:44 brd ff:ff:ff:ff:ff:ff
    
  2. 要给接口分配 IPv4 或 IPv6 地址,请输入以下命令:

    # ip addr add dev IPVLAN_device IP_address/subnet_mask_prefix
    
  3. 如果在 L3 模式或 L3S 模式中配置 IPVLAN 设备,请进行以下设置:

    1. 在远程主机上为远程 peer 配置邻居设置:

      # ip neigh add dev peer_device IPVLAN_device_IP_address lladdr MAC_address
      
      其中 MAC_address 是 IPVLAN 设备所基于的实际网卡的 MAC 地址。

    2. 使用以下命令为 L3 模式 配置 IPVLAN 设备:

      # ip route add dev <real_NIC_device> <peer_IP_address/32>
      
      对于 L3S 模式:

      # ip route add dev real_NIC_device peer_IP_address/32
      
      其中 IP-address 代表远程 peer 的地址。

  4. 要设置活跃的 IPVLAN 设备,请输入以下命令:

    # ip link set dev IPVLAN_device up
    
  5. 要检查 IPVLAN 设备是否活跃,请在远程主机中执行以下命令:

    # ping IP_address
    
    其中 IP_address 使用 IPVLAN 设备的 IP 地址。

第43章 在不同的接口上重复使用相同的 IP 地址

使用虚拟路由和转发(VRF),管理员可以在同一主机上同时使用多个路由表。为此,VRF 将网络在第 3 层进行分区。这可让管理员使用每个 VRF 域的独立路由表隔离流量。这个技术与虚拟 LAN(虚拟 LAN)类似,后者在第二层对网络进行分区,其中操作系统使用不同的 VLAN 标签来隔离共享相同物理介质的流量。

与第二层上的分区相比,VRF 的一个优点是,考虑到所涉及的对等路由的数量,路由可以更好地扩展。

OpenCloudOS 为每个 VRF 域使用虚拟 vrt 设备,并通过向 VRF 设备添加现有网络设备来向 VRF 域添加路由。之前附加到原始设备的地址和路由将在 VRF 域中移动。

请注意,每个 VRF 域间都是相互隔离的

43.1.在不同接口上永久重复使用相同的 IP 地址

本节介绍了如何使用 VRF 功能在同一服务器的不同接口中永久使用相同的 IP 地址。

要在重新使用相同的 IP 地址时让远程对等两个 VRF 接口都能联系,网络接口必须属于不同的广播域。网络中的广播域是一组节点,它们接收其中任何一个节点发送的广播流量。在大多数配置中,所有连接到同一交换机的节点都属于相同的域。

前提条件

  • 以 root 用户身份登录。
  • 没有配置网络接口。

流程

  1. 创建并配置第一个 VRF 设备:

    1. 为 VRF 设备创建连接并将其分配到路由表中。例如,要创建一个分配给 1001 路由表、名为 vrf0 的 VRF 设备:

      # nmcli connection add type vrf ifname vrf0 con-name vrf0 table 1001 ipv4.method disabled ipv6.method disabled
      
      2. 启用 vrf0 设备:

      # nmcli connection up vrf0
      
      3. 为刚刚创建的 VRF 分配网络设备。例如,要向 vrf0 VRF 设备添加 enp1s0 以太网设备,并向 enp1s0 分配 IP 地址和子网掩码,请输入:

      # nmcli connection add type ethernet con-name vrf.enp1s0 ifname enp1s0 master vrf0 ipv4.method manual ipv4.address 192.0.2.1/24
      
      4. 激活 vrf.enp1s0 连接:

      # nmcli connection up vrf.enp1s0
      
      2. 创建并配置下一个 VRF 设备:

    2. 创建 VRF 设备并将其分配到路由表中。例如,要创建一个分配给 1002 路由表、名为 vrf1 的 VRF 设备,请输入:

      # nmcli connection add type vrf ifname vrf1 con-name vrf1 table 1002 ipv4.method disabled ipv6.method disabled
      

    3. 激活 vrf1 设备:
      # nmcli connection up vrf1
      
    4. 为刚刚创建的 VRF 分配网络设备。例如,要向 vrf1 VRF 设备添加 enp7s0 以太网设备,并给 enp7s0 分配 IP 地址和子网掩码,请输入:

      # nmcli connection add type ethernet con-name vrf.enp7s0 ifname enp7s0 master vrf1 ipv4.method manual ipv4.address 192.0.2.1/24
      
      4. 激活 vrf.enp7s0 设备:

      # nmcli connection up vrf.enp7s0
      

43.2.在不同接口中临时重复使用相同的 IP 地址

本节介绍了如何使用虚拟路由和转发(VRF)功能在某个服务器的不同接口中临时使用相同的 IP 地址。这个过程仅用于测试目的,因为配置是临时的并在重启系统后会丢失。

要在重新使用相同的 IP 地址时让远程对等两个 VRF 接口都能联系,网络接口必须属于不同的广播域。广播域是一组节点,它们接收被其中任何一个发送的广播流量。在大多数配置中,所有连接到同一交换机的节点都属于相同的域。

前提条件

  • 以 root 用户身份登录。
  • 没有配置网络接口。

流程

  1. 创建并配置第一个 VRF 设备:

    1. 创建 VRF 设备并将其分配到路由表中。例如,要创建一个分配给 1001 路由表、名为 blue 的 VRF 设备:
    # ip link add dev blue type vrf table 1001
    
    1. 启用 blue 设备:
    # ip link set dev blue up
    
    1. 为 VRF 设备分配网络设备。例如,要向 blue VRF 设备添加 enp1s0 以太网设备:
    # ip link set dev enp1s0 master blue
    
    1. 启用 enp1s0 设备:
    # ip link set dev enp1s0 up
    
    1. 向 enp1s0 设备分配 IP 地址和子网掩码。例如,将其设为 192.0.2.1/24 :
    # ip addr add dev enp1s0 192.0.2.1/24
    
  2. 创建并配置下一个 VRF 设备:

    1. 创建 VRF 设备并将其分配到路由表中。例如,要创建一个分配给 1002 路由表、名为 red 的 VRF 设备:
    # ip link add dev red type vrf table 1002
    
    1. 启用 red 设备:
    # ip link set dev red up
    
    1. 为 VRF 设备分配网络设备。例如,要向 red VRF 设备添加 enp7s0 以太网设备:
    # ip link set dev enp7s0 master red
    
    1. 启用 enp7s0 设备:
    # ip link set dev enp7s0 up
    
    1. 为 enp7s0 设备分配与 blue VRF 域中 enp1s0 设备所使用的相同的 IP 地址和子网掩码:
    # ip addr add dev enp7s0 192.0.2.1/24
    
  3. 可选,还可按照上述步骤创建更多 VRF 设备。

第44章 在隔离的 VRF 网络内启动服务

使用虚拟路由和转发(VRF),您可以使用与操作系统主路由表不同的路由表创建隔离网络。然后,您可以启动服务和应用程序,以便它们只能访问该路由表中定义的网络。

44.1.配置 VRF 设备

要使用虚拟路由和转发(VRF),您可以创建一个 VRF 设备,并将物理或虚拟网络接口和路由信息附加给它。

要防止您将自己远程锁定,请在本地控制台中或通过您不想分配给 VRF 设备的网络接口远程执行此流程。

前提条件

  • 您已在本地登录或使用与您要分配给 VRF 设备不同的网络接口。

流程

  1. 使用同命的虚拟设备创建 vrf0 连接,并将其附加到路由表 1000 :

    # nmcli connection add type vrf ifname vrf0 con-name vrf0 table 1000 ipv4.method disabled ipv6.method disabled
    
  2. 向 vrf0 连接添加 enp1s0 设备,并配置 IP 设置:

    # nmcli connection add type ethernet con-name enp1s0 ifname enp1s0 master vrf0 ipv4.method manual ipv4.address 192.0.2.1/24 ipv4.gateway 192.0.2.254
    
    此命令会创建 enp1s0 连接,来作为 vrf0 连接的端口。由于此配置,路由信息会自动分配给与 vrf0 设备关联的路由表 1000。

  3. 如果您在隔离网络中需要静态路由:

    1. 添加静态路由:

      # nmcli connection modify enp1s0 +ipv4.routes "198.51.100.0/24 192.0.2.2"
      
      这向 198.51.100.0/24 网络添加了一个路由,该网络使用 192.0.2.2 作为路由器。

    2. 激活连接:

    # nmcli connection up enp1s0
    

验证

  1. 显示与 vrf0 关联的设备的 IP 设置:

    # ip -br addr show vrf vrf0
    enp1s0    UP    192.0.2.15/24
    
  2. 显示 VRF 设备及其关联的路由表:

    # ip vrf show
    Name              Table
    -----------------------
    vrf0              1000
    
  3. 显示主路由表:

    # ip route show
    default via 192.168.0.1 dev enp1s0 proto static metric 100
    
  4. 显示路由表 1000 :

    # ip route show table 1000
    default via 192.0.2.254 dev enp1s0 proto static metric 101
    broadcast 192.0.2.0 dev enp1s0 proto kernel scope link src 192.0.2.1
    192.0.2.0/24 dev enp1s0 proto kernel scope link src 192.0.2.1 metric 101
    local 192.0.2.1 dev enp1s0 proto kernel scope host src 192.0.2.1
    broadcast 192.0.2.255 dev enp1s0 proto kernel scope link src 192.0.2.1
    198.51.100.0/24 via 192.0.2.2 dev enp1s0 proto static metric 101
    
    default 条目表示使用此路由表的服务,将 192.0.2.254 用作其默认网关,而不是主路由表中的默认网关。

  5. 在与 vrf0 关联的网络中执行 traceroute 工具,以验证工具是否使用表 1000 的路由:

    # ip vrf exec vrf0 traceroute 203.0.113.1
    traceroute to 203.0.113.1 (203.0.113.1), 30 hops max, 60 byte packets
    1  192.0.2.254 (192.0.2.254)  0.516 ms  0.459 ms  0.430 ms
    ...
    
    第一跳是分配给路由表 1000 的默认网关,而不是系统的主路由表中的默认网关。

44.2.在隔离的 VRF 网络内启动服务

您可以将服务(如 Apache HTTP 服务器)配置为在隔离的虚拟路由和转发(VRF)网络中启动。

注意,服务只能绑定到同一 VRF 网络中的本地 IP 地址。

前提条件

  • 您已配置了 vrf0 设备。
  • 您已将 Apache HTTP 服务器配置为仅侦听分配给与 vrf0 设备关联的接口的 IP 地址。

流程

  1. 显示 httpd systemd 服务的内容:

    # systemctl cat httpd
    ...
    [Service]
    ExecStart=/usr/sbin/httpd $OPTIONS -DFOREGROUND
    ...
    
    在后续步骤中需要 ExecStart 参数的内容,以在隔离的 VRF 网络中运行相同的命令。

  2. 创建 /etc/systemd/system/httpd.service.d/ 目录:

    # mkdir /etc/systemd/system/httpd.service.d/
    
  3. 使用以下内容创建 /etc/systemd/system/httpd.service.d/override.conf 文件:

    [Service]
    ExecStart=
    ExecStart=/usr/sbin/ip vrf exec vrf0 /usr/sbin/httpd $OPTIONS -DFOREGROUND
    
    要覆盖 ExecStart 参数,您首先需要对其取消设置,然后将其设为所示的新值。

  4. 重新加载 systemd 。

    # systemctl daemon-reload
    
  5. 重新启动 httpd 服务。

    # systemctl restart httpd
    

验证

  1. 显示 httpd 进程的进程 ID(PID):

    # pidof -c httpd
    1904 ...
    
  2. 显示 PID 的 VRF 关联,例如:

    # ip vrf identify 1904
    vrf0
    
  3. 显示与 vrf0 设备关联的所有 PID:

    # ip vrf pids vrf0
    1904  httpd
    ...
    

第45章 为您的系统设置路由协议

这部分描述了如何使用 自由范围路由 (FRRouting 或 FRR)特性来为您的系统启用和设置所需的路由协议。

45.1.FRRouting 介绍

自由范围路由 (FRRouting 或 FRR)是一个路由协议堆栈,它由 AppStream 存储库中的 frr 软件包提供。

FRR 提供了基于 TCP/IP 的路由服务,并支持多个 IPv4 和 IPv6 路由协议。

支持的协议包括:

  • 边界网关协议(BGP)
  • 中间系统到中间系统(IS-IS)
  • 首先打开最短路径(OSPF)
  • 协议独立多播(PIM)
  • 路由信息协议(RIP)
  • 下一代路由信息协议(RIPng)
  • 增强的内部网关路由协议(EIGRP)
  • 下一跳解析协议(NHRP)
  • 双向转发检测(BFD)
  • 基于策略的路由(PBR)

FRR 是下列服务的集合:

  • zebra
  • bgpd
  • isisd
  • ospfd
  • ospf6d
  • pimd
  • ripd
  • ripngd
  • eigrpd
  • nhrpd
  • bfdd
  • pbrd
  • staticd
  • fabricd

如果安装了 frr,系统可以充当专用的路由器,其使用路由协议与内部或外部网络中的其他路由器交换路由信息。

45.2.设置 FRRouting

本节解释了如何设置自由范围路由(FRRouting 或 FRR)。

前提条件

  • 确保在您的系统中安装了 frr 软件包:
    # yum install frr
    

流程

  1. 编辑 /etc/frr/daemons 配置文件,并为您的系统启用所需的守护进程。

    例如,要启用 ripd 守护进程,请包含以下行:

    ripd=yes
    
    必须始终启用 zebra 守护进程,所以您必须设置 zebra=yes 才能使用 FRR。 默认情况下,/etc/frr/daemons 包含所有守护进程的 [daemon_name]=no 条目。所有守护进程都被禁用,因此,在新安装系统后启动 FRR 无效。

  2. 启动 frr 服务:

    # systemctl start frr
    
  3. 另外,您也可以将 FRR 设为在引导时自动启动:

    # systemctl enable frr
    

45.3. 修改 FRR 的配置

本节介绍了:

  • 设置 FRR后如何启用额外的守护进程
  • 设置 FRR后如何禁用守护进程

先决条件

  • FRR 已设置,如 设置 FRRouting 中所述。

流程

  1. 编辑 /etc/frr/daemons 配置文件,并将所需守护进程的行更改为 yes,而不是 no。

    例如,启用 ripd 守护进程:

    ripd=yes
    
  2. 重新加载 frr 服务:

    # systemctl reload frr
    

45.4.修改特定守护进程的配置

使用默认配置,FRR 中的每个路由守护进程都只能充当普通路由器。

要进行守护进程的额外配置,请使用以下步骤。

流程

  1. 在 /etc/frr/ 目录中,为所需守护进程创建一个配置文件,并将该文件命名为:

    [daemon_name].conf
    
    例如,要进一步配置 eigrpd 守护进程,请在上述目录中创建 eigrpd.conf 文件。

  2. 使用所需内容填充新文件。

    有关特定的 FRR 守护进程的配置示例,请查看 /usr/share/doc/frr/ 目录。

  3. 重新加载 frr 服务:

    # systemctl reload frr
    

第46章 测试基本网络设置

46.1.使用 ping 程序验证 IP 到其他主机的连接

ping 工具向远程主机发送 ICMP 数据包。您可以使用此功能来测试 IP 与不同主机的连接是否正常工作。

流程

  • 将主机的 IP 地址放在同一子网中,如您的默认网关:

    # ping 192.0.2.3
    
    如果命令失败,请验证默认网关设置。

  • 在远程子网中指定主机的 IP 地址:

    # ping 198.162.3.1
    
    如果命令失败,请验证默认网关设置,并确保网关在连接的网络间转发数据包。

46.2.使用 host 程序验证域名解析

流程

  • 使用 host 实用程序来验证名称解析是否正常工作。例如:要将 client.example.com 主机名解析为 IP 地址,请输入:

    # host client.example.com
    
    如果命令返回错误,如 connection timed out 或 no servers could be reached,请验证您的 DNS 设置。

第47章 使用 NetworkManager 程序调度脚本运行 dhclient exit hooks

47.1.NetworkManager 程序调度脚本的概念

在发生网络事件时,NetworkManager-dispatcher 服务会按字母顺序执行用户提供的脚本。这些脚本通常是 shell 脚本,但也可以是任何可执行的脚本或应用程序。例如,您可以使用程序调度脚本来调整您无法使用 NetworkManager 进行管理的与网络相关的设置。

您可以在以下目录中存储程序调度脚本: - /etc/NetworkManager/dispatcher.d/ :root 用户可以编辑的程序调度脚本的通用位置。 - /usr/lib/NetworkManager/dispatcher.d/: 用于预先部署的不可变程序调度脚本。

为了安全起见,NetworkManager-dispatcher 服务只有在满足以下条件时才执行脚本:

  • 脚本归 root 用户所有。
  • 该脚本仅可由 root 读写。
  • 脚本上没有设置 setuid 位。

NetworkManager-dispatcher 服务使用两个参数运行每个脚本:

  1. 操作所在的设备的接口名称。
  2. 接口行为,如当接口被激活时的 up 操作。

NetworkManager-dispatcher 服务一次运行一个脚本,但与主 NetworkManager 进程异步运行。请注意,如果脚本已排队,服务一定会运行它,即使后续事件使其过时。但是,NetworkManager-dispatcher 服务运行脚本,它们是指向 /etc/NetworkManager/dispatcher.d/no-wait.d/ 中的文件的符号链接,而无需等待之前脚本的终止,并行运行。

47.2.创建运行 dhclient exit hooks 的 NetworkManager 程序调度脚本

本节解释了当从 DHCP 服务器分配或更新 IPv4 地址时,如何编写 NetworkManager 程序调度脚本,该脚本会运行保存在 /etc/dhcp/dhclient-exit-hooks.d/ 目录下的 dhclient exit hooks 。

前提条件

  • dhclient exit hooks 存储在 /etc/dhcp/dhclient-exit-hooks.d/ 目录下。

流程

  1. 使用以下内容创建 /etc/NetworkManager/dispatcher.d/12-dhclient-down 文件:

    #!/bin/bash
    # Run dhclient.exit-hooks.d scripts
    
    if [ -n "$DHCP4_DHCP_LEASE_TIME" ] ; then
    if [ "$2" = "dhcp4-change" ] || [ "$2" = "up" ] ; then
        if [ -d /etc/dhcp/dhclient-exit-hooks.d ] ; then
        for f in /etc/dhcp/dhclient-exit-hooks.d/*.sh ; do
            if [ -x "${f}" ]; then
            . "${f}"
            fi
        done
        fi
    fi
    fi
    
  2. 将 root 用户设为文件的所有者:

    # chown root:root /etc/NetworkManager/dispatcher.d/12-dhclient-down
    
  3. 设置权限,以便只有 root 用户才能执行它:

    # chmod 0700 /etc/NetworkManager/dispatcher.d/12-dhclient-down
    
  4. 恢复 SELinux 上下文:

    # restorecon /etc/NetworkManager/dispatcher.d/12-dhclient-down
    

第48章 NetworkManager 调试介绍

提高所有或某些域的日志级别有助于记录 NetworkManager 所执行的操作的更多详情。管理员可以使用这些信息排除问题。NetworkManager 提供不同的级别和域来生成日志信息。/etc/NetworkManager/NetworkManager.conf 文件是 NetworkManager 的主配置文件。日志存储在日志中。

本章介绍有关为 NetworkManager 启用调试日志以及使用不同日志级别和域配置日志量的信息。

48.1. 调试级别和域

您可以使用 levels 和 domains 参数来管理 NetworkManager 的调试。levels 定义了详细程度,而 domains 定义了消息的类别,以记录给定的严重程度( level )的日志。

日志级别 描述
OFF 不记录任何有关 NetworkManager 的信息
ERR 仅记录严重错误
WARN 记录可以反映操作的警告信息
INFO 记录各种有助于跟踪状态和操作的信息
DEBUG 为调试启用详细日志记录
TRACE 启用比 DEBUG 级别更详细的日志

请注意,后续的级别记录包含以前级别的所有信息。例如,将日志级别设为 INFO 也会记录包含在 ERR 和 WARN 日志级别中的消息。

48.2.设置 NetworkManager 日志级别

默认情况下,所有日志域都设为记录 INFO 日志级别。在收集调试日志前禁用速率限制。通过速率限制,如果短时间内有太多信息,systemd-journald 会丢弃它们。当日志级别为 TRACE 时,可能会发生这种情况。

以下流程禁用速率限制,并为所有域启用记录调试日志。

流程

  1. 要禁用速率限制,请编辑 /etc/systemd/journald.conf 文件,取消 [Journal] 部分中的 RateLimitBurst 参数的注释,并将其值设为 0 :

    RateLimitBurst=0
    
  2. 重启 systemd-journald 服务。

    # systemctl restart systemd-journald
    
  3. 使用以下内容创建 /etc/NetworkManager/conf.d/95-nm-debug.conf 文件:

    [logging]
    domains=ALL:TRACE
    
    domains 参数可以包含多个用逗号分隔的 domain:level 对。

  4. 重启 NetworkManager 服务。

    # systemctl restart NetworkManager
    

验证

  • 查询 systemd 日志以显示 NetworkManager 单元的日志条目:

    # journalctl -u NetworkManager
    ...
    Jun 30 15:24:32 server NetworkManager[164187]: <debug> [1656595472.4939] active-connection[0x5565143c80a0]: update activation type from assume to managed
    Jun 30 15:24:32 server NetworkManager[164187]: <trace> [1656595472.4939] device[55b33c3bdb72840c] (enp1s0): sys-iface-state: assume -> managed
    Jun 30 15:24:32 server NetworkManager[164187]: <trace> [1656595472.4939] l3cfg[4281fdf43e356454,ifindex=3]: commit type register (type "update", source "device", existing a369f23014b9ede3) -> a369f23014b9ede3
    Jun 30 15:24:32 server NetworkManager[164187]: <info>  [1656595472.4940] manager: NetworkManager state is now CONNECTED_SITE
    ...
    

48.3.在程序运行时使用 nmcli 临时设置日志级别

您可以使用 nmcli 在程序运行时更改日志级别。但是,OpenCloudOS建议使用配置文件启用调试并重启 NetworkManager。使用 .conf 文件更新 levels和 domains 有助于调试启动问题,并捕获初始状态的所有日志。

流程

  1. 可选:显示当前的日志设置:

    # nmcli general logging
    LEVEL  DOMAINS
    INFO   PLATFORM,RFKILL,ETHER,WIFI,BT,MB,DHCP4,DHCP6,PPP,WIFI_SCAN,IP4,IP6,A
    UTOIP4,DNS,VPN,SHARING,SUPPLICANT,AGENTS,SETTINGS,SUSPEND,CORE,DEVICE,OLPC,
    WIMAX,INFINIBAND,FIREWALL,ADSL,BOND,VLAN,BRIDGE,DBUS_PROPS,TEAM,CONCHECK,DC
    B,DISPATCH
    
  2. 要修改日志级别和域,请使用以下选项:

    • 要将所有域的日志级别都设为同样的 LEVEL,请输入:

      # nmcli general logging level LEVEL domains ALL
      
    • 要更改特定域的级别,请输入:

      # nmcli general logging level LEVEL domains DOMAINS
      
      请注意,使用这个命令更新日志级别会禁用所有其他域的日志功能。

    • 要更改特定域的级别并保持其它域的级别,请输入:

      # nmcli general logging level KEEP domains DOMAIN:LEVEL,DOMAIN:LEVEL
      

48.4.查看 NetworkManager 日志

流程

  • 要查看日志,请输入:

    # journalctl -u NetworkManager -b
    

    第49章 捕获网络数据包

要调试网络和通讯问题,您可以捕获网络数据包分析。以下部分提供有关捕获网络数据包的步骤和附加信息。

49.1.使用 xdpdump 捕获包括 XDP 程序丢弃的数据包在内的网络数据包

xdpdump 工具可以帮助我们捕获网络数据包。与 tcpdump 工具不同,xdpdump 使用扩展的 Berkeley 数据包过滤(eBPF)程序。这也使 xdpdump 能够捕获快速数据路径(XDP)程序丢弃的数据包。用户空间工具(如 tcpdump )无法捕获被丢弃的数据包或是 XDP 程序修改的原始数据包。

您可以使用 xdpdump 来调试已附加到接口上的 XDP 程序。工作程序可以在 XDP 程序启动前或是程序结束后捕获数据包。在后一种情况下,xdpdump 也捕获 XDP 操作。默认情况下,xdpdump 会在 XDP 程序的入口处捕获传入的数据包。

请注意,xdpdump 没有数据包过滤或解码功能。但是,您可以将它与 tcpdump 结合使用来解码数据包。

以下流程描述了如何捕获 enp1s0 接口上的所有数据包,并将它们写入到 /root/capture.pcap 文件。

前提条件

  • 安装了支持 XDP 程序的网络驱动程序。
  • XDP 程序被加载到 enp1s0 接口。如果没有程序载入,xdpdump 会以与 tcpdump 类似的方式捕获数据包,以便向后兼容。

流程

  1. 要捕获 enp1s0 接口上的数据包,并将它们写入到 /root/capture.pcap 文件,请输入:

    # xdpdump -i enp1s0 -w /root/capture.pcap
    
  2. 要停止捕获数据包,请按 Ctrl+C。

第50章 使用和配置 firewalld

防火墙是保护机器不受来自外部的、不需要的网络数据的一种方式。它允许用户通过定义一组防火墙规则 来控制主机上的入站网络流量。这些规则用于对进入的流量进行排序,并可以阻断或允许流量。

firewalld 是一个防火墙服务守护进程,其提供一个带有 D-Bus 接口的、动态可定制的、基于主机的防火墙。因为是动态的,它不需要在每次修改规则后重启进程。

firewalld 使用域和服务的概念来简化流量管理。域 (zones) 是预定义的规则集。网络接口和源可以分配给域。流量是否允许进出取决于您计算机连接到的网络,和这个网络的安全级别。防火墙服务是预定义的规则,覆盖了允许进入特定服务的流量的所有必要设置,并在域中应用。

服务使用一个或多个端口或地址进行网络通信。防火墙会根据端口过滤通讯。要允许服务的网络流量通过,必须打开其端口。firewalld 会阻止未明确设置为开放的端口上的所有流量。一些域(如可信域)默认允许所有流量。

请注意,带有 nftables 后端的 firewalld 不支持使用 --direct 选项将自定义的 nftables 规则传递到 firewalld。

50.1.firewalld入门

50.1.1.使用 firewalld、nftables 或者 iptables

以下是您应该使用的工具简介:

  • firewalld :将 firewalld 工具用于简单的防火墙用例。此工具易于使用,并涵盖了这些场景的典型用例。
  • nftables :使用 nftables 工具来设置复杂和性能关键的防火墙,如整个网络。
  • iptables :iptables 工具使用 nf_tables 内核 API ,而不是 legacy 后端。nf_tables API 提供向后兼容性,因此使用 iptables 命令的脚本仍可在 OpenCloudOS 上工作。对于新的防火墙脚本,建议使用 nftables。

要避免不同的防火墙服务相互影响,请在主机中只使用一个服务,并禁用其他服务。

50.1.2. Zones

firewalld 可以根据用户在网络中的接口和流量上设置的信任级别将网络划分为不同的域。一个连接只能是一个域的一部分,但一个域可以被用来进行很多网络连接。

NetworkManager 通知接口域的 firewalld。您可以用以下工具为接口分配域:

  • NetworkManager
  • firewall-config 工具
  • firewall-cmd 命令行工具

后两个只能编辑适当的 NetworkManager 配置文件。如果您使用 firewall-cmd 或 firewall-config 修改了接口域,那么请求会被转发到 NetworkManager,并且不会由 ⁠firewalld 来处理。

预定义域存储在 /usr/lib/firewalld/zones/ 目录中,并可立即应用到任何可用的网络接口上。只有在修改后,这些文件才会复制到 /etc/firewalld/zones/ 目录中。预定义域的默认设置如下:

  • block 任何传入的网络连接都会被拒绝,对于 IPv4 会显示 icmp-host-prohibited 消息,对于 IPv6 会显示 icmp6-adm-prohibited 消息。只有从系统启动的网络连接才能进行。
  • dmz 对于您的非企业化域里的计算机来说,这些计算机可以被公开访问,且有限访问您的内部网络。只接受所选的入站连接。
  • drop 所有传入的网络数据包都会丢失,没有任何通知。只有外发网络连接是可行的。
  • external 适用于启用了伪装的外部网络,特别是路由器。您不信任网络中的其他计算机不会损害您的计算机。只接受所选的入站连接。
  • home 用于家用,因为您可以信任其他计算机。只接受所选的入站连接。
  • internal 当您信任网络中的其他计算机时,供内部网络使用。只接受所选的入站连接。
  • public 可用于您不信任网络中其他计算机的公共区域。只接受所选的入站连接。
  • trusted 所有网络连接都被接受。
  • work 可用于您主要信任网络中其他计算机的工作设置。只接受所选的入站连接。

这些域中的一个被设置为 default 域。当接口连接被添加到 NetworkManager 时,它们会被分配给默认域。安装时,firewalld 中的默认域被设置为 public 域。默认域可以被修改。

50.1.3.预定义的服务

服务可以是本地端口、协议、源端口和目的地列表,并在启用了服务时自动载入防火墙帮助程序模块列表。使用服务可节省用户时间,因为它们可以完成一些任务,如打开端口、定义协议、启用数据包转发等等,而不必在另外的步骤中设置所有任务。

服务通过单独的 XML 配置文件来指定,这些文件采用以下格式命名:service-name.xml 。协议名称优先于 firewalld 中的服务或应用程序名称。

可以使用图形化的 firewall-config 工具、firewall-cmd 和 firewall-offline-cmd 来添加和删除服务。

或者,您可以编辑 /etc/firewalld/services/ 目录中的 XML 文件。如果用户未添加或更改服务,则在 /etc/firewalld/services/ 中没有相应的 XML 文件。如果要添加或更改服务,/usr/lib/firewalld/services/ 目录中的文件可作用作模板。

50.1.4.启动 firewalld

流程

  1. 要启动 firewalld,请以 root 用户身份输入以下命令:

    # systemctl unmask firewalld
    # systemctl start firewalld
    
  2. 要确保 firewalld 在系统启动时自动启动,请以 root 用户身份输入以下命令:

    # systemctl enable firewalld
    

50.1.5.禁用 firewalld

流程

  1. 要禁用 firewalld,请以 root 用户身份输入以下命令:

    # systemctl stop firewalld
    
  2. 要防止 firewalld 在系统启动时自动启动:

    # systemctl disable firewalld
    
  3. 要确保访问 firewalld D-Bus接口时未启动firewalld,并且其他服务需要 firewalld 时也未启动 firewalld :

    # systemctl mask firewalld
    

50.1.6.验证永久 firewalld 配置

在某些情况下,例如在手动编辑 firewalld 配置文件后,管理员想验证更改是否正确。本节描述了如何验证 firewalld 服务的永久配置。

前提条件

  • firewalld 服务在运行。

流程

  1. 验证 firewalld 服务的永久配置:

    # firewall-cmd --check-config
    success
    
    如果永久配置有效,该命令将返回 成功。在其他情况下,命令返回一个带有更多详情的错误,如下所示:

    # firewall-cmd --check-config
    Error: INVALID_PROTOCOL: 'public.xml': 'tcpx' not from {'tcp'|'udp'|'sctp'|'dcc
    

50.2.查看 firewalld的当前状态和设置

50.2.1.查看 firewalld 的当前状态

默认情况下,防火墙服务 firewalld 会在系统上安装。使用 firewalld CLI 接口可检查该服务是否正在运行。

流程

  1. 查看服务的状态:

    # firewall-cmd --state
    
  2. 如需有关服务状态的更多信息,请使用 systemctl status 子命令:

    # systemctl status firewalld
    firewalld.service - firewalld - dynamic firewall daemon
    Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; vendor pr
    Active: active (running) since Mon 2017-12-18 16:05:15 CET; 50min ago
        Docs: man:firewalld(1)
    Main PID: 705 (firewalld)
        Tasks: 2 (limit: 4915)
    CGroup: /system.slice/firewalld.service
            └─705 /usr/bin/python3 -Es /usr/sbin/firewalld --nofork --nopid
    

50.2.2.使用 GUI 查看服务

要使用图形化的 firewall-config 工具来查看服务列表,请按 Super 键(也称 Win 键)进入"活动概览",输入 firewall,然后按 Enter 键。firewall-config 工具就会出现。您可以在 Services 选项卡下查看服务列表。

您也可以使用命令行启动图形防火墙配置工具。

前提条件

  • 已安装 firewall-config 软件包。

流程

  • 使用命令行启动图形防火墙配置工具:

    $ firewall-config
    
    firewall-config firewall-config 窗口打开。请注意,这个命令可以以普通用户身份运行,但偶尔会提示您输入管理员密码。

50.2.3.使用 CLI 查看 firewalld 设置

使用 CLI 客户端可能会看到和当前防火墙设置不同的视图。--list-all 选项显示 firewalld 设置的完整概述。

Firewalld 使用域来管理流量。如果没有用 --zone 选项来指定域,该命令将在分配给活跃网络接口和连接的默认域中有效。

流程

  1. 要列出默认域的所有相关信息:

    # firewall-cmd --list-all
    public
    target: default
    icmp-block-inversion: no
    interfaces:
    sources:
    services: ssh dhcpv6-client
    ports:
    protocols:
    masquerade: no
    forward-ports:
    source-ports:
    icmp-blocks:
    rich rules:
    
  2. 要指定显示设置的域,请在 firewall-cmd--list-all 命令中添加 --zone=zone-name 参数,例如:

    # firewall-cmd --list-all --zone=home
    home
    target: default
    icmp-block-inversion: no
    interfaces:
    sources:
    services: ssh mdns samba-client dhcpv6-client
    ... [trimmed for clarity]
    
  3. 要查看特定信息(如服务或端口)的设置,请使用特定选项。使用命令帮助来查看 firewalld 手册页或获取选项列表:

    # firewall-cmd --help
    
  4. 查看当前域中允许哪些服务:

    # firewall-cmd --list-services
    ssh dhcpv6-client
    

注意,使用 CLI 工具列出某个子部分的设置有时会比较困难。例如,您允许 SSH 服务,firewalld 为该服务开放必要的端口(22)。之后,如果您列出允许的服务,列表将显示 SSH 服务,但如果列出开放的端口,则不会显示任何内容。因此,建议您使用 --list-all 选项来确保您收到完整的信息。

50.3.使用 firewalld 控制网络流量

50.3.1.使用 CLI 禁用紧急事件的所有流量

在紧急情况下,如受到系统攻击,可以禁用所有网络流量来切断攻击者的流量。

流程

  1. 要立即禁用网络流量,请切换到 panic 模式:

    # firewall-cmd --panic-on
    
    注意,启用 panic 模式可停止所有网络流量。因此,只有当您具有对机器的物理访问权限或使用串行控制台登录时,才应该使用它。

  2. 关闭 panic 模式会使该设置自动设为防火墙的永久设置。要关闭 panic 模式,请输入:

    # firewall-cmd --panic-off
    

验证

  • 要查看是否打开或关闭 panic 模式,请使用:

    # firewall-cmd --query-panic
    

50.3.2.使用 CLI 控制预定义服务的流量

控制流量的最简单的方法是向 firewalld 添加预定义的服务。这会打开所有必需的端口并根据 服务定义文件 修改其他设置。

流程

  1. 检查该服务是否还未被允许:

    # firewall-cmd --list-services
    ssh dhcpv6-client
    
  2. 列出所有预定义的服务:

    # firewall-cmd --get-services
    RH-Satellite-6 amanda-client amanda-k5-client bacula bacula-client bitcoin bitcoin-rpc bitcoin-testnet bitcoin-testnet-rpc ceph ceph-mon cfengine condor-collector ctdb dhcp dhcpv6 dhcpv6-client dns docker-registry ...
    [trimmed for clarity]
    
  3. 添加允许的服务:

    # firewall-cmd --add-service=<service-name>
    
  4. 使新设置持久:

    # firewall-cmd --runtime-to-permanent
    

50.3.3.通过 GUI,使用预定义服务控制流量

前提条件

  • 已安装 firewall-config 软件包

流程

  1. 启用或禁用预定义或自定义服务:

  2. 启动 firewall-config 工具并选择要配置的服务的网络域。

  3. 选择 Zones 选项卡,然后选择下面的 Services 选项卡。
  4. 选择您要信任的每种服务类型的复选框,或者清除复选框以阻止所选区中的服务。

  5. 编辑服务:

  6. 启动 firewall-config 工具。

  7. 从标为 Configuration 的菜单中选择 Permanent 。其它图标和菜单按钮会出现在 Service 窗口底部。
  8. 选择您要配置的服务。

Ports 、Protocols 和 Source Port 选项卡可为所选的服务启用、更改和删除端口、协议和源端口。模块标签是用来配置 Netfilter helper 模块。Destination 选项卡允许将流量限制到特定的目标地址和Internet协议(IPv4 或 IPv6)。

注意,在Runtime 模式下无法更改服务设置。

50.3.4.添加新服务

您可以使用图形化的 firewall-config 工具、firewall-cmd 和 firewall-offline-cmd 来添加和删除服务。或者,您可以编辑 /etc/firewalld/services/ 中的 XML 文件。如果用户未添加或更改服务,则在 /etc/firewalld/services/ 中没有相应的 XML 文件。如果要添加或更改服务,则文件 /usr/lib/firewalld/services/ 可用作模板。

注意,服务名称必须是字母数字,此外只能包含 _ (下划线)和 - (短划线)字符。

流程

要在终端中添加新服务,请使用 firewall-cmd 或在 firewalld 未激活的情况下,使用firewall-offline-cmd 。

  1. 运行以下命令以添加新和空服务:

    $ firewall-cmd --new-service=service-name --permanent
    
  2. 要使用本地文件添加新服务,请使用以下命令:

    $ firewall-cmd --new-service-from-file=service-name.xml --permanent
    
    您可以使用 --name=service-name 选项来更改服务名称。

  3. 更改服务设置后,服务的更新副本放在 /etc/firewalld/services/ 中。

    作为 root 用户,您可以输入以下命令来手动复制服务:

    # cp /usr/lib/firewalld/services/service-name.xml /etc/firewalld/services/service-name.xml
    
    firewalld 首先从 /usr/lib/firewalld/services 加载文件。如果文件放在 /etc/firewalld/services 中,并且有效,则这些文件将覆盖 /usr/lib/firewalld/services 中的匹配文件。一旦删除了 /etc/firewalld/services 中的匹配文件,或者要求 firewalld 加载服务的默认值,就会使用 /usr/lib/firewalld/services 中的覆盖文件。这只适用于永久性环境。要在运行时环境中获取这些回退,则需要重新载入。

50.3.5.使用 GUI 打开端口

如果您要允许流量通过防火墙到达某个端口,可以在 GUI 中打开端口。

前提条件

  • 已安装 firewall-config 软件包

流程

  1. 启动 firewall-config 工具并选择要更改的网络区。
  2. 选择 Ports 选项卡,然后点击右侧的 Add 按钮。此时会打开 端口和协议 窗口。
  3. 输入要允许的端口号或者端口范围。
  4. 从列表中选择 tcp 或 udp。

50.3.6.使用 GUI 控制协议的流量

您可以使用 GUI 控制某种协议允许流量通过防火墙。

前提条件

  • 已安装 firewall-config 软件包

流程

  1. 启动 firewall-config 工具并选择要更改的网络区。
  2. 选择 Protocols 选项卡,然后点击右侧的 Add 按钮。此时会打开 协议 窗口。
  3. 从列表中选择协议,或者选择 Other Protocol 复选框,并在字段中输入协议。

50.3.7.使用 GUI 打开源端口

要允许来自某个端口的流量通过防火墙,您可以使用 GUI。

前提条件

  • 已安装 firewall-config 软件包

流程

  1. 启动 firewall-config 工具并选择要更改的网络区。
  2. 选择 Source Port 选项卡,然后点击右侧的 Add 按钮。源端口 窗口将打开。
  3. 输入要允许的端口号或者端口范围。从列表中选择 tcp 或 udp。

50.4.使用 CLI 控制端口

端口是可让操作系统接收和区分网络流量并将其转发到系统服务的逻辑设备。它们通常由侦听端口的守护进程来表示,它会等待到达这个端口的任何流量。

通常,系统服务会为它们保留标准的侦听端口。例如,httpd 守护进程监听 80 端口。但默认情况下,系统管理员会将守护进程配置为在不同端口上侦听以便增强安全性或其他原因。

50.4.1.打开端口

通过打开端口,系统可被从外部访问,这代表了安全风险。通常让端口保持关闭,且只在某些服务需要时才打开。

流程

要获得当前区的打开端口列表:

  1. 列出所有允许的端口:

    # firewall-cmd --list-ports
    
  2. 在允许的端口中添加一个端口,以便为入站流量打开这个端口:

    # firewall-cmd --add-port=port-number/port-type
    
    端口类型为 tcp、udp、sctp 或 dccp。这个类型必须与网络通信的类型匹配。

  3. 使新设置具有持久性:

    # firewall-cmd --runtime-to-permanent
    
    端口类型为 tcp、udp、sctp 或 dccp。这个类型必须与网络通信的类型匹配。

50.4.2.关闭端口

当打开的端口不再需要时,在 firewalld 中关闭此端口。强烈建议您尽快关闭所有不必要的端口,因为端口处于打开状态会存在安全隐患。

流程

要关闭某个端口,请将其从允许的端口列表中删除:

  1. 列出所有允许的端口:

    # firewall-cmd --list-ports
    
    注意,这个命令只为您提供已打开作为端口的端口列表。您将无法看到作为服务打开的任何打开端口。因此,您应该考虑使用 --list-all 选项查看详细信息,而不是 --list-ports。

  2. 从允许的端口中删除端口,以便对传入的流量关闭:

    # firewall-cmd --remove-port=port-number/port-type
    
  3. 使新设置具有持久性:

    # firewall-cmd --runtime-to-permanent
    

50.5.使用 system-roles 配置端口

您可以使用 firewalld 系统角色来在本地防火墙中为传入的流量打开或关闭端口,并使配置在重启后保持不变。以下示例描述了如何配置默认域以允许 HTTPS 服务的传入流量。

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

前提条件

  • 拥有对一个或多个受管节点的访问等权限,这些节点是您要使用 firewalld 系统角色配置的系统。
  • 拥有对控制节点的访问等权限,控制节点是 Ansible Engine 配置其他系统的主机。
  • ansible 和 rhel-system-roles 软件包已安装在控制节点上。
  • 如果您在运行 playbook 时使用了与 root 不同的远程用户,则此用户在受管节点上具有适当的 sudo 权限。
  • 主机使用 NetworkManager 配置网络。

流程

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

    
    
    node.example.com
    2. 使用以下内容创建 ~/adding-and-removing-ports.yml playbook:
    
    ---
    - name: Allow incoming HTTPS traffic to the local host
    hosts: node.example.com
    become: true
    
    tasks:
        - include_role:
            name: linux-system-roles.firewall
    
        vars:
            firewall:
            - port: 443/tcp
                service: http
                state: enabled
                runtime: true
                permanent: true
    
    permanent: true 选项可使新设置在重启后保持不变。

  2. 运行 playbook:

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

    # ansible-playbook -u user_name --ask-become-pass ~/adding-and-removing-ports.yml
    
    --ask-become-pass 选项可确保 ansible-playbook 命令提示输入 -u user_name 选项中定义的用户的 sudo 密码。

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

验证

  1. 连接到受管节点:

    $ ssh user_name@node.example.com
    
  2. 验证与 HTTPS 服务关联的 443/tcp 端口是否打开:

    $ sudo firewall-cmd --list-ports
    443/tcp
    

50.6.使用 firewalld 域

zones 代表一种更透明管理传入流量的概念。这些区域会连接到联网接口或者分配一系列源地址。您可以独立为每个域管理防火墙规则,这样就可以定义复杂的防火墙设置并将其应用到流量传输中。

50.6.1.列出防火墙域

流程

  1. 查看系统中有哪些可用区:

    # firewall-cmd --get-zones
    
    firewall-cmd --get-zones 命令显示系统上所有可用的域,但不显示特定域的任何详情。

  2. 查看所有域的详细信息:

    # firewall-cmd --list-all-zones
    
  3. 查看特定域的详细信息:

    # firewall-cmd --zone=zone-name --list-all
    

50.6.2.更改特定域的 firewalld 设置

流程

  • 要在不同的域中工作,请使用 --zone=zone-name 选项。例如,允许在域 public 中使用 SSH 服务:

    # firewall-cmd --add-service=ssh --zone=public
    

50.6.3.更改默认域

系统管理员在其配置文件中为网络接口分配区域。如果接口没有被分配给指定域,它将被分配给默认域。每次重启 firewalld 服务后,firewalld 加载默认域的设置,使其处于活动状态。

流程

设置默认域:

  1. 显示当前的默认域:

    # firewall-cmd --get-default-zone
    
  2. 设置新的默认区:

    # firewall-cmd --set-default-zone zone-name
    

注意,此流程设置是永久设置,即使没有 --permanent 选项。

50.6.4.将网络接口分配给域

您可以为不同域定义不同的规则集,然后通过更改所使用的接口的域来快速改变设置。使用多个接口,可以为每个具体域设置一个域来区分通过它们的网络流量。

流程

要将域分配给特定的接口:

  1. 列出活跃区以及分配给它们的接口:

    # firewall-cmd --get-active-zones
    
  2. 为不同的区分配接口:

    # firewall-cmd --zone=zone_name --change-interface=interface_name --permanent
    

50.6.5.使用 nmcli 为连接分配区域

以下流程描述了如何使用 nmcli 工具将 firewalld 区添加到 NetworkManager 连接中。

流程

  1. 将域分配到 NetworkManager 连接配置文件:

    # nmcli connection modify profile connection.zone zone_name
    
  2. 激活连接:

    # nmcli connection up profile
    

50.6.6.在 ifcfg 文件中手动将区分配给网络连接

当连接由 网络管理器(NetworkManager)管理时,必须了解它在哪个区域使用。为每个网络连接指定区域,则根据计算机有可移植设备的位置提供各种防火墙设置,体现了配置的灵活性。因此,可以为不同的场合指定防火墙域和设置。

流程

  • 要为连接设置域,请编辑 /etc/sysconfig/network-scripts/ifcfg-connection_name 文件,并添加一行,将区分配给这个连接:

    ZONE=zone_name
    

50.6.7.创建一个新域

要使用自定义域,可以创建一个新的域并像预定义域一样使用它。新域需要 --permanent 选项,否则 命令不起作用。

流程

  1. 创建一个新域:

    # firewall-cmd --permanent --new-zone=zone-name
    
  2. 检查是否在您的永久设置中添加了新的区:

    # firewall-cmd --get-zones
    
  3. 使新设置具有持久性:

    # firewall-cmd --runtime-to-permanent
    

50.6.8.域配置文件

域也可以通过域配置文件创建。如果您需要创建新域,但想从不同域重复使用设置,这种方法就很有用了。

firewalld 域配置文件包含域的信息。分别是域的描述、服务、端口、协议、icmp-blocks、masquerade、forward-ports 和丰富的语言规则,采用 XML 文件格式存储。文件名必须是 zone-name.xml,其中 zone-name 的长度目前限制为 17 个字符。域配置文件位于 /usr/lib/firewalld/zones/ 和 /etc/firewalld/zones/ 目录中。

以下示例显示了允许一个服务(SSH)和一个端口范围的配置,适用于 TCP 和 UDP 协议:

```
<?xml version="1.0" encoding="utf-8"?>
<zone>
<short>My Zone</short>
<description>Here you can describe the characteristic features of the zone.</description>
<service name="ssh"/>
<port protocol="udp" port="1025-65535"/>
<port protocol="tcp" port="1025-65535"/>
</zone>
```
要更改那个域的设置,请添加或者删除相关的部分来添加端口、转发端口、服务等等。

50.6.9.使用域目标设定传入流量的默认行为

对于每个域,您可以设置一种处理尚未进一步确定的传入流量的默认行为。此行为是通过设置域的目标来定义的。有四个选项:

  • ACCEPT :接受除特定规则不允许的所有传入的数据包。
  • REJECT :拒绝除特定规则允许的所有传入的数据包。当 firewalld 拒绝数据包时,会告知源机器有关拒绝的信息。
  • DROP :丢弃除特定规则允许的所有传入的数据包。当 firewalld 丢弃数据包时,不会告知源机器有关丢弃数据包的信息。
  • default :与 REJECT 的行为类似,但在某些情况下具有特殊含义。详情请查看 firewall-cmd(1) 手册页中的 适应和查询区和策略的选项 部分。

流程

为域设置目标:

  1. 列出特定区的信息以查看默认目标:

    # firewall-cmd --zone=zone-name --list-all
    
  2. 在区中设置一个新目标:

    # firewall-cmd --permanent --zone=zone-name --set-target=<default|ACCEPT|REJEC
    

50.7.根据源使用区管理传入流量

您可以使用域根据其源管理传入的流量。这可让您对进入的流量进行分类,并将其路由到不同的域,以允许或禁止该流量可访问的服务。

如果您给域添加一个源,域就会成为活跃的,来自该源的所有进入流量都会被定向到它。您可以为每个域指定不同的设置,这些设置相应地应用于来自给定源的网络流量。即使只有一个网络接口,您也可以使用多个域。

50.7.1.添加源

要将传入的流量路由到特定域,请将源添加到那个区。源可以是一个使用 CIDR 格式的 IP 地址或 IP 掩码。

注意,如果您添加多个带有重叠网络范围的域,则根据域名称排序,且只考虑第一个域。

  • 在当前区中设置源:

    # firewall-cmd --add-source=<source>
    
  • 要为特定区设置源 IP 地址:

    # firewall-cmd --zone=zone-name --add-source=<source>
    
    以下流程允许来自受信任域中 192.168.2.15 的所有传入的流量:

流程

  1. 列出所有可用域:

    # firewall-cmd --get-zones
    
  2. 将源 IP 添加到持久性模式的信任区中:

    # firewall-cmd --zone=trusted --add-source=192.168.2.15
    
  3. 使新设置具有持久性:

    # firewall-cmd --runtime-to-permanent
    

50.7.2.删除源

从域中删除源会关闭来自它的网路流量

流程

  1. 列出所需区的允许源:

    # firewall-cmd --zone=zone-name --list-sources
    
  2. 从区永久删除源:

    # firewall-cmd --zone=zone-name --remove-source=<source>
    
  3. 使新设置具有持久性:

    # firewall-cmd --runtime-to-permanent
    

50.7.3.添加源端口

要启用基于源端口的流量排序,请使用 --add-source-port 选项来指定源端口。您还可以将其与 --add-source 选项结合使用,将流量限制在某个 IP 地址或 IP 范围。

流程

  • 添加源端口:

    # firewall-cmd --zone=zone-name --add-source-port=<port-name>/<tcp|udp|sctp|dccp>
    

50.7.4.删除源端口

通过删除源端口,您可以根据原始端口禁用对流量排序。

流程

  • 要删除源端口:

    # firewall-cmd --zone=zone-name --remove-source-port=<port-name>/<tcp|udp|sctp|dccp>
    

50.7.5.使用 区(zones) 和源来配置一个服务只适用于一个特定的域(domain)

要允许特定网络的流量在机器上使用服务,请使用区和源。以下流程只允许来自 192.0.2.0/24 网络的 HTTP 流量,而任何其他流量都被阻止。

注意,配置此场景时,请使用具有默认目标的区。使用将目标设为 ACCEPT 的区存在安全风险,因为对于来自 192.0.2.0/24 的流量,所有网络连接都将被接受。

流程

  1. 列出所有可用区:

    # firewall-cmd --get-zones
    block dmz drop external home internal public trusted work
    
  2. 将 IP 范围添加到 internal 区,以将来自源的流量路由到区:

    # firewall-cmd --zone=internal --add-source=192.0.2.0/24
    
  3. 将http 服务添加到 internal 区中:

    # firewall-cmd --zone=internal --add-service=http
    
  4. 使新设置具有持久性:

    # firewall-cmd --runtime-to-permanent
    

验证

  • 检查 internal 区是否处于活跃状态,以及该区中是否允许服务:

    # firewall-cmd --zone=internal --list-all
    internal (active)
    target: default
    icmp-block-inversion: no
    interfaces:
    sources: 192.0.2.0/24
    services: cockpit dhcpv6-client mdns samba-client ssh http
    ...
    

50.8.在区域间过滤转发的流量

通过使用策略对象,用户可以对策略中需要类似权限的不同身份进行分组。您可以根据流量的方向使用策略。

策略对象功能在 firewalld 中提供转发和输出过滤。以下描述了使用 firewalld 来过滤不同区域之间的流量,以允许访问本地托管的虚拟机来连接主机。

50.8.1.策略对象和区域之间的关系

策略对象允许用户将 firewalld 的原语(如服务、端口和丰富的规则)附加到策略上。您可以将策略对象应用到以有状态和单向的方式在区域间传输的流量上。

```
# firewall-cmd --permanent --new-policy myOutputPolicy

# firewall-cmd --permanent --policy myOutputPolicy --add-ingress-zone HOST

# firewall-cmd --permanent --policy myOutputPolicy --add-egress-zone ANY
```
HOST 和 ANY 是 ingress 和 egress 区域列表中使用的符号区域。
  • HOST 符号区域对于来自运行 firewalld 的主机的流量,或具有到运行 firewalld 的主机的流量允许策略。
  • ANY 符号区对所有当前和将来的区域应用策略。ANY 符号区域充当所有区域的通配符。

50.8.2. 使用优先级对策略进行排序

多个策略可以应用到同一组流量,因此应使用优先级为可能应用的策略创建优先级顺序。

要设置优先级来对策略进行排序:

```
# firewall-cmd --permanent --policy mypolicy --set-priority -500
```

在上例中,-500 是较低的优先级值,但具有较高的优先级。因此,-500 将在 -100 之前执行。较高的优先级级值优先于较低的优先级级值。

以下规则适用于策略优先级:

  • 具有负优先级的策略在区域中的规则之前应用。
  • 具有正优先级的策略在区域中的规则之后应用。
  • 优先级 0 被保留,因此不能使用。

50.8.3. 使用策略对象来过滤本地托管容器与主机物理连接的网络之间的流量

策略对象功能允许用户过滤其容器和虚拟机流量。

流程

  1. 创建新策略。

    # firewall-cmd --permanent --new-policy podmanToHost
    
  2. 阻止所有流量。

    # firewall-cmd --permanent --policy podmanToHost --set-target REJECT
    
    # firewall-cmd --permanent --policy podmanToHost --add-service dhcp
    
    # firewall-cmd --permanent --policy podmanToHost --add-service dns
    
  3. 定义与策略一起使用的 ingress 区域。

    # firewall-cmd --permanent --policy podmanToHost --add-ingress-zone podman
    
  4. 定义与策略一起使用的 egress 区域。

    # firewall-cmd --permanent --policy podmanToHost --add-egress-zone ANY
    

验证

  • 验证关于策略的信息。

    # firewall-cmd --info-policy podmanToHost
    

50.8.4. 设置策略对象的默认目标

您可以为策略指定 --set-target 选项。可用的参数如下:

  • ACCEPT - 接受数据包
  • DROP - 丢弃不需要的数据包
  • REJECT - 拒绝不需要的数据包,并带有 ICMP 回复
  • CONTINUE (默认) - 数据包将遵循以下策略和区域中的规则。

    # firewall-cmd --permanent --policy mypolicy --set-target CONTINUE
    

验证

  • 验证有关策略的信息

    # firewall-cmd --info-policy mypolicy
    

50.9. 使用 firewalld 配置 NAT

使用 firewalld,您可以配置以下网络地址转换(NAT)类型:

  • 伪装
  • 源 NAT(SNAT)
  • 目标 NAT(DNAT)
  • 重定向

50.9.1. 不同的 NAT 类型: masquerading、source NAT、destination NAT 和 redirect

这些是不同的网络地址转换(NAT)类型:

  • 伪装和源 NAT(SNAT) 使用以上 NAT 类型之一更改数据包的源 IP 地址。例如,互联网服务提供商不会路由私有 IP 范围,如 10.0.0.0/8。如果您在网络中使用私有 IP 范围,并且用户应该能够访问 Internet 上的服务器,请将这些范围内的数据包的源 IP 地址映射到公共 IP 地址。

    伪装和 SNAT 都非常相似。不同之处是:

    • 伪装自动使用传出接口的 IP 地址。因此,如果传出接口使用了动态 IP 地址,则使用伪装。
    • SNAT 将数据包的源 IP 地址设置为指定的 IP 地址,且不会动态查找传出接口的 IP 地址。因此,SNAT 要比伪装更快。如果传出接口使用了固定 IP 地址,则使用 SNAT。
  • 目标 NAT(DNAT) 使用此 NAT 类型重写传入数据包的目标地址和端口。例如,如果您的 Web 服务器使用私有 IP 范围内的 IP 地址,那么无法直接从互联网访问它,您可以在路由器上设置 DNAT 规则,以便将传入的流量重定向到此服务器。

  • 重定向 这个类型是 IDT 的特殊示例,它根据链 hook 将数据包重定向到本地机器。例如,如果服务运行在与其标准端口不同的端口上,您可以将传入的流量从标准端口重定向到此特定端口。

50.9.2. 配置 IP 地址伪装

以下流程描述了如何在系统中启用 IP 伪装。IP 伪装会在访问互联网时隐藏网关后面的独立机器。

流程

  1. 要检查是否启用了 IP 伪装(例如,对于 external 区),以 root 用户身份输入以下命令:

    # firewall-cmd --zone=external --query-masquerade
    
    如果已启用,命令将会打印 yes,且退出状态为 0。否则,将打印 no ,且退出状态为 1。如果省略了 zone,则将使用默认区。

  2. 要启用 IP 伪装,请以 root 用户身份输入以下命令:

    # firewall-cmd --zone=external --add-masquerade
    
  3. 要使此设置持久,请将 --permanent 选项传给命令。

  4. 要禁用 IP 伪装,请以 root 身份输入以下命令:

    # firewall-cmd --zone=external --remove-masquerade
    
    要使此设置永久生效,请将 --permanent 选项传给命令。

50.10. 端口转发

使用此方法重定向端口只可用于基于 IPv4 的流量。对于 IPv6 重定向设置,您必须使用丰富的规则。

要重定向到外部系统,需要启用伪装。您无法通过主机上配置了本地转发的重定向端口访问服务。

50.10.1. 添加一个端口来重定向

使用 firewalld ,您可以设置端口重定向,以便任何到达您系统上特定端口的流量都会被传送到您选择的另一个内部端口或另一台机器上的外部端口。

前提条件

  • 在您将从一个端口的流量重新指向另一个端口或另一个地址前,您必须了解 3 个信息:数据包到达哪个端口,使用什么协议,以及您要重定向它们的位置。

流程

  1. 将端口重新指向另一个端口:

    # firewall-cmd --add-forward-port=port=port-number:proto=tcp|udp|sctp|dccp:toport=port-number
    
  2. 将端口重定向到不同 IP 地址的另一个端口:

    1. 添加要转发的端口:

      # firewall-cmd --add-forward-port=port=port-number:proto=tcp|udp:toport=port-number:toaddr=IP
      
    2. 启用伪装:

      # firewall-cmd --add-masquerade
      

50.10.2. 将 TCP 端口 80 重定向到同一台机器中的 88 端口

按照以下步骤将 TCP 端口 80 重定向到端口 88。

流程

  1. 将端口 80 重定向到 TCP 流量的端口 88:

    # firewall-cmd --add-forward-port=port=80:proto=tcp:toport=88
    
  2. 使新设置具有持久性:

    # firewall-cmd --runtime-to-permanent
    
  3. 检查是否重定向了端口:

    # firewall-cmd --list-all
    

50.10.3. 删除重定向的端口

这个步骤描述了如何删除重定向的端口。

流程

  1. 要删除重定向的端口:

    # firewall-cmd --remove-forward-port=port=port-number:proto=<tcp|udp>:toport=port-number:toaddr=<IP>
    
  2. 要删除重定向到不同地址的转发端口:

    1. 删除转发的端口:
    # firewall-cmd --remove-forward-port=port=port-number:proto=<tcp|udp>:toport=port-number:toaddr=<IP>
    
    1. 禁用伪装:
    # firewall-cmd --remove-masquerade
    

50.10.4. 在同一台机器上将 TCP 端口 80 转发到端口 88

这个步骤描述了如何删除端口重定向。

流程

  1. 列出重定向的端口:

    # firewall-cmd --list-forward-ports
    port=80:proto=tcp:toport=88:toaddr=
    
  2. 从防火墙中删除重定向的端口:

    # firewall-cmd  --remove-forward-port=port=80:proto=tcp:toport=88:toaddr=
    
  3. 使新设置具有持久性:

    # firewall-cmd --runtime-to-permanent
    

50.11. 管理 ICMP 请求

Internet 控制消息协议 (ICMP)是一种支持协议,供各种网络设备用来发送错误消息和表示连接问题的操作信息,例如,请求的服务不可用。ICMP 与 TCP 和 UDP 等传输协议不同,因为它不用于在系统之间交换数据。

不幸的是,可以使用 ICMP 消息(特别是 echo-request 和 echo-reply )来揭示关于您网络的信息,并将这些信息滥用于各种欺诈活动。因此,firewalld 允许阻止 ICMP 请求,来保护您的网络信息。

50.11.1. 列出和阻塞 ICMP 请求

列出 ICMP 请求

位于 /usr/lib/firewalld/icmptypes/ 目录中的单独的 XML 文件描述了 ICMP 请求。您可以阅读这些文件来查看请求的描述。firewall-cmd 命令控制 ICMP 请求操作。

  • 要列出所有可用的 ICMP 类型:

    # firewall-cmd --get-icmptypes
    
  • IPv4、IPv6 或这两种协议都可以使用 ICMP 请求。要查看 ICMP 请求使用了哪种协议:

    # firewall-cmd --info-icmptype=<icmptype>
    
  • 如果请求当前被阻止了,则 ICMP 请求的状态显示为 yes ,如果没有被阻止,则显示为 no。查看 ICMP 请求当前是否被阻断了:

    # firewall-cmd --query-icmp-block=<icmptype>
    

阻止或取消阻止 ICMP 请求

当您的服务器阻止了 ICMP 请求时,它不会提供任何通常会提供的信息。但这并不意味着根本不给出任何信息。客户端会收到特定的 ICMP 请求被阻止(拒绝)的信息。应仔细考虑阻止 ICMP 请求,因为它可能会导致通信问题,特别是与 IPv6 流量有关的通信问题。

  • 要查看 ICMP 请求当前是否被阻断了:

    # firewall-cmd --query-icmp-block=<icmptype>
    
  • 要阻止 ICMP 请求:

    # firewall-cmd --add-icmp-block=<icmptype>
    
  • 要删除 ICMP 请求的块:

    # firewall-cmd --remove-icmp-block=<icmptype>
    

在不提供任何信息的情况下阻塞 ICMP 请求

通常,如果您阻止了 ICMP 请求,客户端会知道您阻止了 ICMP 请求。这样潜在的攻击者仍然可以看到您的 IP 地址在线。要完全隐藏此信息,您必须丢弃所有 ICMP 请求。

  • 要阻止和丢弃所有 ICMP 请求:
  • 将区的目标设为 DROP :

    # firewall-cmd --permanent --set-target=DROP
    
    现在,除您明确允许的流量外,所有流量(包括 ICMP 请求)都将被丢弃。

阻止和丢弃某些 ICMP 请求,而允许其他的请求:

  1. 将区的目标设为 DROP :

    # firewall-cmd --permanent --set-target=DROP
    
  2. 添加 ICMP block inversion 以一次阻止所有 ICMP 请求:

    # firewall-cmd --add-icmp-block-inversion
    
  3. 为您要允许的 ICMP 请求添加 ICMP 块:

    # firewall-cmd --add-icmp-block=<icmptype>
    
  4. 使新设置具有持久性:

    # firewall-cmd --runtime-to-permanent
    

block inversion 会颠倒 ICMP 请求块的设置,因此所有之前没有被阻止的请求都会被阻止,因为区的目标变成了 DROP。被阻断的请求不会被阻断。这意味着,如果您想要取消阻塞请求,则必须使用 blocking 命令。

将块 inversion 恢复到完全 permissive 设置:

  1. 将区的目标设置为 default 或 ACCEPT:

    # firewall-cmd --permanent --set-target=default
    
  2. 删除 ICMP 请求的所有添加的块:

    # firewall-cmd --remove-icmp-block=<icmptype>
    
  3. 删除 ICMP block inversion:

    # firewall-cmd --remove-icmp-block-inversion
    
  4. 使新设置具有持久性:

    # firewall-cmd --runtime-to-permanent
    

50.11.2. 使用 GUI 配置 ICMP 过滤器

  • 要启用或禁用 ICMP 过滤器,请启动 firewall-config 工具,并选择其消息要被过滤的网络区。选择 ICMP Filter 选项卡,再选中您要过滤的每种 ICMP 消息的复选框。清除复选框以禁用过滤器。这个设置按方向设置,默认允许所有操作。
  • 若要启用反向 ICMP Filter,可点击右侧的 Invert Filter 复选框。现在只接受标记为 ICMP 的类型,所有其他的均被拒绝。在使用 DROP 目标的区域里它们会被丢弃。

50.12. 使用 firewalld 设置和控制 IP 集

要查看 firewalld 所支持的 IP 集设置类型列表,请以 root 用户身份输入以下命令。

```
# firewall-cmd --get-ipset-types
hash:ip hash:ip,mark hash:ip,port hash:ip,port,ip hash:ip,port,net hash:mac hash:net hash:net,iface hash:net,net hash:net,port hash:net,port,net
```

50.12.1. 使用 CLI 配置 IP 设置选项

IP 集可以在 firewalld 区中用作源,也可以用作富规则中的源。在 Red Hat Enterprise Linux 中,首选的方法是使用 firewalld 在直接规则中创建的 IP 集合。

  • 要列出 permanent 环境中 firewalld 已知的 IP 集,请以 root 用户身份运行以下命令:

    # firewall-cmd --permanent --get-ipsets
    
  • 要添加新的 IP 集,请以 root 用户身份使用 permanent 环境来运行以下命令:

    # firewall-cmd --permanent --new-ipset=test --type=hash:net
    success
    

上述命令为 IPv4 创建了一个名为 test , 类型为 hash:net 的新的 IP 集。要创建用于 IPv6 的 IP 集,请添加 --option=family=inet6 选项。要使新设置在运行时环境中有效,请重新加载 firewalld。

  • 使用以下命令,以 root 用户身份列出新的 IP 集:

    # firewall-cmd --permanent --get-ipsets
    test
    
  • 要获取有关 IP 集的更多信息,请以 root 用户身份运行以下命令:

    # firewall-cmd --permanent --info-ipset=test
    test
    type: hash:net
    options:
    entries:
    
    请注意,IP 集目前没有任何条目。

  • 要在 test IP 集中添加一个条目,请以 root 用户身份运行以下命令:

    # firewall-cmd --permanent --ipset=test --add-entry=192.168.0.1
    success
    
    前面的命令将 IP 地址 192.168.0.1 添加到 IP 集合中。

  • 要获取 IP 集中的当前条目列表,请以 root 用户身份运行以下命令:

    # firewall-cmd --permanent --ipset=test --get-entries
    192.168.0.1
    
  • 生成包含 IP 地址列表的文件,例如:

    # cat > iplist.txt <<EOL
    192.168.0.2
    192.168.0.3
    192.168.1.0/24
    192.168.2.254
    EOL
    
    包含 IP 集合 IP 地址列表的文件应该每行包含一个条目。以 hash、分号或空行开头的行将被忽略。

  • 要添加 iplist.txt 文件中的地址,请以 root 用户身份运行以下命令:

    # firewall-cmd --permanent --ipset=test --add-entries-from-file=iplist.txt
    success
    
  • 要查看 IP 集的扩展条目列表,请以 root 用户身份运行以下命令:

    # firewall-cmd --permanent --ipset=test --get-entries
    192.168.0.1
    192.168.0.2
    192.168.0.3
    192.168.1.0/24
    192.168.2.254
    
  • 要从 IP 集中删除地址,并检查更新的条目列表,请以 root 用户身份运行以下命令:

    # firewall-cmd --permanent --ipset=test --remove-entries-from-file=iplist.txt
    success
    # firewall-cmd --permanent --ipset=test --get-entries
    192.168.0.1
    
  • 您可以将 IP 集合作为一个源添加到区,以便处理所有来自 IP 集合中列出的任意地址的网络流量。例如,要将 test IP 集作为源添加到 drop 区域,以便丢弃来自 test IP 集中列出的所有条目的所有数据包,请以 root 用户身份运行以下命令 :

    # firewall-cmd --permanent --zone=drop --add-source=ipset:test
    success
    
    源中的 ipset: 前缀显示 firewalld 的源是一个 IP 集,而不是 IP 地址或地址范围。

IP 集的创建和删除只限于 permanent 环境,所有其他 IP 集选项也可以用在运行时环境中,而不需要 --permanent 选项。

不推荐使用不是通过 firewalld 管理的 IP 集。要使用这样的 IP 组,需要一个永久直接规则来引用集合,且必须添加自定义服务来创建这些 IP 组件。这个服务需要在 firewalld 启动前启动,否则 firewalld 无法使用这些集合来添加直接规则。您可以使用 /etc/firewalld/direct.xml 文件来添加永久的直接规则。

50.13. 丰富规则的优先级

默认情况下,富规则是根据其规则操作进行组织的。例如,deny 规则优先于 allow 规则。富规则中的 priority 参数可让管理员对富规则及其执行顺序进行精细的控制。

50.13.1. priority 参数如何将规则组织为不同的链

您可以将富规则中的 priority 参数设置为 -32768 和 32767 之间的任意数字,值越小优先级越高。

firewalld 服务会根据其优先级的值将规则组织到不同的链中:

  • 优先级低于 0:规则被重定向到带有 _pre 后缀的链中。
  • 优先级高于 0:规则被重定向到带有 _post 后缀的链中。
  • 优先级等于 0:根据操作,规则将重定向到带有 _log、_deny 或 _allow 的链中。

在这些子链中,firewalld 会根据其优先级的值对规则进行排序。

50.13.2. 设置丰富的规则的优先级

该流程描述了如何创建一个富规则的示例,该规则使用 priority 参数来记录其他规则不允许或拒绝的所有流量。您可以使用此规则标记意非预期的流量。

流程

  1. 添加一个带有非常低优先级的丰富规则来记录未由其他规则匹配的所有流量:

    # firewall-cmd --add-rich-rule='rule priority=32767 log prefix="UNEXPECTED: " limit value="5/m"'
    
    命令还将日志条目的数量限制为每分钟 5 个。

  2. 另外,还可显示上一步中命令创建的 nftables 规则:

    # nft list chain inet firewalld filter_IN_public_post
    table inet firewalld {
    chain filter_IN_public_post {
        log prefix "UNEXPECTED: " limit rate 5/minute
    }
    }
    

50.14. 配置防火墙锁定

如果本地应用或服务以 root 身份运行(如 libvirt),则可以更改防火墙配置。使用这个特性,管理员可以锁定防火墙配置,从而达到没有应用程序或只有添加到锁定白名单中的应用程序可以请求防火墙更改的目的。锁定设置默认会被禁用。如果启用,用户就可以确定,防火墙没有被本地的应用程序或服务进行了不必要的配置更改。

50.14.1. 使用 CLI 配置锁定

这个流程描述了如何使用命令行来启用或禁用锁定。

  • 要查询是否启用了锁定,请以 root 用户身份运行以下命令:

    # firewall-cmd --query-lockdown
    
    如果启用了锁定,该命令将打印 yes,且退出状态为 0。否则,将打印 no ,且退出状态为 1。

  • 要启用锁定,请以 root 用户身份输入以下命令:

    # firewall-cmd --lockdown-on
    
  • 要禁用锁定,请以 root 用户身份使用以下命令:

    # firewall-cmd --lockdown-off
    

50.14.2. 使用 CLI 配置锁定允许列表选项

锁定允许名单中可以包含命令、安全上下文、用户和用户 ID。如果允许列表中的命令条目以星号""结尾,则以该命令开头的所有命令行都将匹配。如果没有 "",那么包括参数的绝对命令必须匹配。

  • 上下文是正在运行的应用程序或服务的安全(SELinux)上下文。要获得正在运行的应用程序的上下文,请使用以下命令:

    $ ps -e --context
    
    该命令返回所有正在运行的应用程序。通过 grep 工具管道输出以便获取您感兴趣的应用程序。例如:

    $ ps -e --context | grep example_program
    
    - 要列出允许列表中的所有命令行,请以 root 用户身份输入以下命令:

    # firewall-cmd --list-lockdown-whitelist-commands
    
    - 要在允许列表中添加命令 command ,请以 root 用户身份输入以下命令:

    # firewall-cmd --add-lockdown-whitelist-command='/usr/bin/python3 -Es /usr/bin/command'
    
    - 要从允许列表中删除命令 command ,请以 root 用户身份输入以下命令:

    # firewall-cmd --remove-lockdown-whitelist-command='/usr/bin/python3 -Es /usr/bin/command'
    
    - 要查询命令 command 是否在允许列表中,请以 root 用户身份输入以下命令:

    # firewall-cmd --query-lockdown-whitelist-command='/usr/bin/python3 -Es /usr/bin/command'
    
    如果为真,该命令将打印 yes,且退出状态为 0。否则,将打印 no ,且退出状态为 1。

  • 要列出允许列表中的所有安全上下文,请以 root 用户身份输入以下命令:

    # firewall-cmd --list-lockdown-whitelist-contexts
    
    - 要在允许列表中添加上下文 context,请以 root 用户身份输入以下命令:

    # firewall-cmd --add-lockdown-whitelist-context=context
    
    - 要从允许列表中删除上下文 context,请以 root 用户身份输入以下命令:

    # firewall-cmd --remove-lockdown-whitelist-context=context
    
    - 要查询上下文 context 是否在允许列表中,请以 root 用户身份输入以下命令:

    # firewall-cmd --query-lockdown-whitelist-context=context
    
    如果为真,则打印 yes ,且退出状态为 0 ,否则,打印 no,且退出状态为 1。

  • 要列出允许列表中的所有用户 ID,请以 root 用户身份输入以下命令:

    # firewall-cmd --list-lockdown-whitelist-uids
    
    - 要在允许列表中添加用户 ID uid,请以 root 用户身份输入以下命令:

    # firewall-cmd --add-lockdown-whitelist-uid=uid
    
    - 要从允许列表中删除用户 ID uid,请以 root 用户身份输入以下命令:

    # firewall-cmd --remove-lockdown-whitelist-uid=uid
    
    - 要查询用户 ID uid 是否在 allowlist 中,请输入以下命令:

    $ firewall-cmd --query-lockdown-whitelist-uid=uid
    
    如果为真,则打印 yes ,且退出状态为 0 ,否则,打印 no,且退出状态为 1。

  • 要列出允许列表中的所有用户名,请以 root 用户身份输入以下命令:

    # firewall-cmd --list-lockdown-whitelist-users
    
    - 要在允许列表中添加用户名 user,请以 root 用户身份输入以下命令:

    # firewall-cmd --add-lockdown-whitelist-user=user
    
    - 要从允许列表中删除用户名 user,请以 root 用户身份输入以下命令:

    # firewall-cmd --remove-lockdown-whitelist-user=user
    
    - 要查询用户名 user 是否在 allowlist 中,请输入以下命令:

    $ firewall-cmd --query-lockdown-whitelist-user=user
    
    如果为真,则打印 yes ,且退出状态为 0 ,否则,打印 no,且退出状态为 1。

50.14.3. 使用配置文件配置锁定的 allowlist 选项

默认的允许列表配置文件包含 NetworkManager 上下文和 libvirt 的默认上下文。用户 ID 0 也位于列表中。

+ allowlist 配置文件存储在 /etc/firewalld/ 目录中。

<?xml version="1.0" encoding="utf-8"?>
    <whitelist>
      <selinux context="system_u:system_r:NetworkManager_t:s0"/>
      <selinux context="system_u:system_r:virtd_t:s0-s0:c0.c1023"/>
      <user id="0"/>
    </whitelist>
以下是一个允许列表配置文件示例,为 firewall-cmd 工具启用所有命令,对于名为 user 的用户,其用户 ID 为 815 :

<?xml version="1.0" encoding="utf-8"?>
    <whitelist>
      <command name="/usr/libexec/platform-python -s /bin/firewall-cmd*"/>
      <selinux context="system_u:system_r:NetworkManager_t:s0"/>
      <user id="815"/>
      <user name="user"/>
    </whitelist>
此示例显示了user id 和 user name,但只需要其中一个选项。Python 是程序解释器,它位于命令行的前面。您还可以使用特定的命令,例如:

/usr/bin/python3 /bin/firewall-cmd --lockdown-on
在该示例中,只允许 --lockdown-on 命令。

在 OpenCloudOS 中,所有工具都放在 /usr/bin/ 目录中,/bin/ 目录则符号链接到 /usr/bin/ 目录。换句话说,尽管以 root 身份输入的 firewall-cmd 的路径可能会被解析为 /bin/firewall-cmd,但现在 /usr/bin/firewall-cmd 可以使用。所有新脚本都应该使用新位置。但请注意,如果以 root 身份运行的脚本被写为使用 /bin/firewall-cmd 路径,那么除了通常只用于非root 用户的 /usr/bin/firewall-cmd 路径外,还必须在允许列表中添加该命令的路径。

命令的 name 属性末尾的 * 表示所有以这个字符串开头的命令都匹配。如果没有 *,则包括参数的绝对命令必须匹配。

50.15. 启用 firewalld 区域中不同接口或源之间的流量转发

区内转发是 firewalld 的一种功能,它允许 firewalld 区域内接口或源之间的流量转发。

50.15.1. 区域内部转发与默认目标设置为 ACCEPT 的区域之间的区别

启用区内部转发时,单个 firewalld 区域中的流量可以从一个接口或源流到另一个接口或源。区域指定接口和源的信任级别。如果信任级别相同,则接口或源之间的通信是可能的。

请注意,如果您在 firewalld 的默认区域中启用了区域内部转发,则它只适用于添加到当前默认区域的接口和源。

firewalld 的 trusted 区域使用设为 ACCEPT 的默认目标。这个区域接受所有转发的流量,但不支持区域内转发。

对于其他默认目标值,默认情况下会丢弃转发的流量,这适用于除可信区域之外的所有标准的区域。

50.15.2. 使用区域内部转发来在以太网和 Wi-Fi 网络间转发流量

您可以使用区域内部转发来转发同一 firewalld 区域内接口和源之间转发流量。例如,使用此功能来转发连接到 enp1s0 以太网和连接到 wlp0s20 Wi-Fi 网络之间的流量。

流程

  1. 在内核中启用数据包转发:

    # echo "net.ipv4.ip_forward=1" > /etc/sysctl.d/95-IPv4-forwarding.conf
    
    # sysctl -p /etc/sysctl.d/95-IPv4-forwarding.conf
    
    2. 确保要在其之间启用区域内部转发的接口没有被分配给与 internal 区域不同的区域:

    # firewall-cmd --get-active-zones
    
    3. 如果接口当前分配给了 internal 以外的区域,请对其重新分配:

    # firewall-cmd --zone=internal --change-interface=interface_name --permanent
    
    4. 将 enp1s0 和 wlp0s20 接口添加到 internal 区域:

    # firewall-cmd --zone=internal --add-interface=enp1s0 --add-interface=wlp0s20
    
    5. 启用区域内部转发:

    # firewall-cmd --zone=internal --add-forward
    

验证

以下验证步骤要求 nmap-ncat 软件包在两个主机上都已安装。

  1. 登录到与您启用了区域转发的主机的 enp1s0 接口位于同一网络的主机。
  2. 使用 ncat 启动 echo 服务来测试连接:

    # ncat -e /usr/bin/cat -l 12345
    
    3. 登录到与 wlp0s20 接口位于同一网络的主机。 4. 连接到运行在与 enp1s0 在同一网络的主机上的 echo 服务器:

    # ncat <other host> 12345
    
    5. 输入一些内容,并按 Enter,然后验证文本是否发送回来。

50.16. 使用 Ansible 的 RHEL 系统角色来配置 firewalld 设置

您可以使用 Ansible 的防火墙系统角色一次性在多个客户端上配置 firewalld 服务的设置。这个解决方案:

  • 提供具有有效输入设置的接口。
  • 将所有预期的 firewalld 参数保存在一个地方。 在控制节点上运行 防火墙 角色后,系统角色会立即向受管节点应用 firewalld 参数,并使其在重启后保持不变。

请注意,通过通道传递的 RHEL 系统角色可在默认的 AppStream 软件仓库中作为 RPM 软件包提供给客户。RHEL 系统角色也作为一个集合提供给通过 Ansible Automation Hub 订阅了 Ansible 的客户。

50.16.1. 防火墙 RHEL 系统角色简介

RHEL 系统角色是 Ansible 自动化工具的一组内容。此内容与 Ansible 自动化工具一起提供了一致的配置界面,来远程管理多个系统。

RHEL 系统角色中的 rhel-system-roles.firewall 角色是为 firewalld 服务的自动配置而引入的。rhel-system-roles 软件包包含这个系统角色以及参考文档。

要以自动化的方式在一个或多个系统上应用 firewalld 参数,请在 playbook 中使用 firewall 系统角色变量。playbook 是一个或多个以基于文本的 YAML 格式编写的 play 的列表。

您可以使用清单文件来定义您希望 Ansible 来配置的一组系统。

使用 firewall 角色,您可以配置许多不同的 firewalld 参数,例如:

  • 区。
  • 应允许哪些数据包的服务。
  • 授权、拒绝或丢弃访问端口的流量。
  • 区的端口或端口范围的转发。

50.16.2. 将传入的流量从一个本地端口转发到不同的本地端口

使用 rhel-system-roles.firewall 角色,您可以远程配置 firewalld 参数,并在多个受管主机上持久有效。

前提条件

  • 根据订阅授予的权利,您在控制节点上已安装了 ansible-core 和 rhel-system-roles 软件包。
  • 受管主机的清单存在于控制机器上,Ansible 能够连接到它们。
  • 您有权限再受管主机上运行 Ansible playbook。
  • 如果您运行 playbook 时使用了与 root 不同的远程用户,则此用户在受管主机上具有合适的 sudo 权限。
  • 清单文件列出 playbook 应该在其上执行操作的主机。此流程中的 playbook 在组 testinservers 中的主机上运行。

流程

  1. 创建 ~/port_forwarding.yml 文件,并添加以下内容:

    ---
    - name: Forward incoming traffic on port 8080 to 443
    hosts: testingservers
    
    tasks:
        - include_role:
            name: rhel-system-roles.firewall
    
    vars:
        firewall:
        - { forward_port: 8080/tcp;443;, state: enabled, runtime: true, permanent: true }
    
    此文件代表一个 playbook,通常包含了一组有特定顺序的任务(也称为 play )列表。这些任何会根据 inventory 文件中选择的特定管理主机进行。在这种情况下,playbook 将针对受管主机的 testingservers 组运行。

    Play 中的 hosts 键指定对其运行 play 的主机。您可以为这个键提供值来作为受管主机的名称,或作为 清单 文件中定义的主机组。

    tasks 部分包含 include_role 键,它指定了哪个系统角色将配置 vars 部分中提到的参数和值。

    vars 部分包含一个称为 firewall 的角色变量。此变量是一个字典值列表,指定将要应用于受管主机上的 firewalld 的参数。example 角色将去往端口 8080 的流量转发到端口 443。设置将立即生效,并将在重启后保持不变。

  2. (可选)验证 playbook 中的语法是否正确:

    # ansible-playbook --syntax-check ~/port_forwarding.yml
    
    playbook: port_forwarding.yml
    
    本例演示了对 playbook 的成功验证。

  3. 执行 playbook:

# ansible-playbook ~/port_forwarding.yml
验证

  • 在受管主机上:

  • 重启主机以验证 firewalld 设置在重启后是否仍然有效:

    # reboot
    
    - 显示 firewalld 设置:

    # firewall-cmd --list-forward-ports
    

50.16.3. 使用系统角色配置端口

您可以使用 firewalld 系统角色来在本地防火墙中为传入的流量打开或关闭端口,并使配置在重启后保持不变。这个示例描述了如何配置默认区以允许 HTTPS 服务的传入流量。

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

前提条件

  • 对一个或多个 受管节点 的访问和权限,这些节点是您要使用 firewalld 系统角色配置的系统。
  • 对 控制节点 的访问和权限,控制节点是 Red Hat Ansible Engine 配置其他系统的系统。
  • ansible 和 rhel-system-roles 软件包已安装在控制节点上。
  • 如果您在运行 playbook 时使用了与 root 不同的远程用户,则此用户在受管节点上具有适当的 sudo 权限。
  • 主机使用 NetworkManager 配置网络。

流程

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

    node.example.com
    
    2. 使用以下内容创建 ~/adding-and-removing-ports.yml playbook:

    ---
    - name: Allow incoming HTTPS traffic to the local host
    hosts: node.example.com
    become: true
    
    tasks:
        - include_role:
            name: linux-system-roles.firewall
    
        vars:
            firewall:
            - port: 443/tcp
                service: http
                state: enabled
                runtime: true
                permanent: true
    
    permanent: true 选项可使新设置在重启后保持不变。

  2. 运行 playbook:

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

    # ansible-playbook -u root ~/adding-and-removing-ports.yml
    
    - 以用户身份连接到受管主机,请输入:

    # ansible-playbook -u user_name --ask-become-pass ~/adding-and-removing-ports.yml
    
    --ask-become-pass 选项可确保 ansible-playbook 命令提示输入 -u user_name 选项中定义的用户的 sudo 密码。

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

验证

  1. 连接到受管节点:

    $ ssh user_name@node.example.com
    
    2. 验证与 HTTPS 服务关联的 443/tcp 端口是否打开:

    $ sudo firewall-cmd --list-ports
    443/tcp
    

50.16.4. 使用 firewalld RHEL 系统角色配置 DMZ firewalld 区

作为系统管理员,您可以使用 RHEL firewalld 系统角色来在 enp1s0 接口上配置 dmz 区,以允许 HTTPS 流量进入到区。这样,您可以让外部用户访问您的 web 服务器。

前提条件

  • 对一个或多个 受管节点 的访问和权限,受管节点是您要使用 VPN 系统角色配置的系统。
  • 对 控制节点 的访问和权限,控制节点是 Red Hat Ansible Engine 用来配置其他系统的系统。
  • 列出受管节点的清单文件。
  • ansible 和 rhel-system-roles 软件包已安装在控制节点上。
  • 如果您在运行 playbook 时使用了与 root 不同的远程用户,则此用户在受管节点上拥有合适的 sudo 权限。
  • 受管节点使用 NetworkManager 来配置网络。

流程

  1. 使用以下内容创建 ~/configuring-a-dmz-using-the-firewall-system-role.yml playbook:

    ---
    - name: Creating a DMZ with access to HTTPS port and masquerading for hosts in DMZ
    hosts: node.example.com
    become: true
    
    tasks:
        - include_role:
            name: linux-system-roles.firewall
    
        vars:
            firewall:
            - zone: dmz
                interface: enp1s0
                service: https
                state: enabled
                runtime: true
                permanent: true
    
    2. 运行 playbook:

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

    $ ansible-playbook -u root ~/configuring-a-dmz-using-the-firewall-system-role.yml
    
    - 以用户身份连接到受管主机,请输入:

    $ ansible-playbook -u user_name --ask-become-pass ~/configuring-a-dmz-using-the-firewall-system-role.yml
    
    --ask-become-pass 选项可确保 ansible-playbook 命令提示输入 -u user_name 选项中定义的用户的 sudo 密码。

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

验证

  • 在受管节点上,查看关于 dmz 区的详细信息:

    # firewall-cmd --zone=dmz --list-all
    dmz (active)
    target: default
    icmp-block-inversion: no
    interfaces: enp1s0
    sources:
    services: https ssh
    ports:
    protocols:
    forward: no
    masquerade: no
    forward-ports:
    source-ports:
    icmp-blocks:
    

第 51 章 nftables 入门

nftables 框架提供了数据包分类功能。最显著的功能是:

  • 内置查找表而不是线性处理
  • IPv4 和 IPv6 使用同一个协议框架
  • 规则会以一个整体被应用,而不是分为抓取、更新和存储完整的规则集的步骤
  • 支持在规则集(nftrace)和监控追踪事件(nft)中调试和追踪
  • 更加一致和压缩的语法,没有特定协议的扩展
  • 用于第三方应用程序的 Netlink API

nftables 框架使用表来存储链。链包含执行动作的独立规则。libnftnl 库可用于通过 libmnl 库与 nftables Netlink API 进行低级交互。

要显示规则集变化的影响,请使用 nft list ruleset 命令。由于这些工具将表、链、规则、集合和其他对象添加到 nftables 规则集中,请注意, nftables 规则集操作(如 nft flush ruleset 命令)可能会影响使用之前独立的旧命令安装的规则集。

51.1. 从 iptables 迁移到 nftables

如果您的防火墙配置仍然使用 iptables 规则,您可以将 iptables 规则迁移到 nftables。

51.1.1. 使用 firewalld、nftables 或者 iptables 时

以下是您应该使用以下工具之一的概述:

  • firewalld :将 firewalld 工具用于简单的防火墙用例。此工具易于使用,并涵盖了这些场景的典型用例。
  • nftables :使用 nftables 工具来设置复杂和性能关键的防火墙,如整个网络。
  • iptables :Red Hat Enterprise Linux 上的 iptables 工具使用 nf_tables 内核 API ,而不是 legacy 后端。nf_tables API 提供向后兼容性,因此使用 iptables 命令的脚本仍可在 Red Hat Enterprise Linux 上工作。对于新的防火墙脚本,红帽建议使用 nftables。

注意,要避免不同的防火墙服务相互影响,在主机中应只有一个防火墙服务,并禁用其他防火墙。

51.1.2. 将 iptables 和 ip6tables 规则集转换为 nftables

使用 iptables-restore-translate 和 ip6tables-restore-translate 实用程序将 iptables 和 ip6tables 规则集转换为 nftables。

前提条件

  • 已安装 nftables 和 iptables 软件包。
  • 系统配置了 iptables 和 ip6tables 规则。

流程

  1. 将 iptables 和 ip6tables 规则写入一个文件:

    # iptables-save >/root/iptables.dump
    # ip6tables-save >/root/ip6tables.dump
    
    2. 将转储文件转换为 nftables 指令:

    # iptables-restore-translate -f /root/iptables.dump > /etc/nftables/ruleset-migrated-from-iptables.nft
    # ip6tables-restore-translate -f /root/ip6tables.dump > /etc/nftables/ruleset-migrated-from-ip6tables.nft
    
    3. 检查,如果需要,手动更新生成的 nftables 规则。 4. 要启用 nftables 服务来加载生成的文件,请在 /etc/sysconfig/nftables.conf 文件中添加以下内容:

    include "/etc/nftables/ruleset-migrated-from-iptables.nft"
    include "/etc/nftables/ruleset-migrated-from-ip6tables.nft"
    
    5. 停止并禁用 iptables 服务:

    # systemctl disable --now iptables
    
    如果您使用自定义脚本加载 iptables 规则,请确保脚本不再自动启动并重新引导以刷新所有表。

  2. 启用并启动 nftables 服务:

    # systemctl enable --now nftables
    

验证

  • 显示 nftables 规则集:

    # nft list ruleset
    

51.1.3. 将单个 iptables 和 ip6tables 规则转换为 nftables

OpenCloudOS 提供了 iptables-translate 和 ip6tables-translate 工具,以将 iptables 或 ip6tables 规则转换为 nftables 的对等规则。

前提条件

  • 已安装 nftables 软件包。

流程

  • 使用 iptables-translate 或 ip6tables-translate 程序而不是 iptables 或 ip6tables 显示对应的 nftables 规则,例如:

    # iptables-translate -A INPUT -s 192.0.2.0/24 -j ACCEPT
    nft add rule ip filter INPUT ip saddr 192.0.2.0/24 counter accept
    
    请注意,一些扩展可能缺少响应的转换支持。在这些情况下,实用程序会输出以 # 符号为前缀的未转换规则,例如:

    # iptables-translate -A INPUT -j CHECKSUM --checksum-fill
    nft # -A INPUT -j CHECKSUM --checksum-fill
    

51.1.4. 常见的 iptables 和 nftables 命令的比较

以下是常见的 iptables 和 nftables 命令的比较:

  • 列出所有规则:

    iptables nftables
    iptables-save nft list ruleset
  • 列出某个表和链:

    iptables nftables
    iptables -L nft list table ip filter
    iptables -L INPUT nft list chain ip filter INPUT
    iptables -t nat -L PREROUTING nft list chain ip nat PREROUTING

    nft 命令不会预先创建表和链。只有当用户手动创建它们时它们才会存在。

    示例:列出 firewalld 生成的规则

    # nft list table inet firewalld
    # nft list table ip firewalld
    # nft list table ip6 firewalld
    

51.2. 编写和执行 nftables 脚本

nftables 框架提供了一个原生脚本环境,与使用shell脚本来维护防火墙规则相比,它带来了一个主要好处:执行脚本是原子的。这意味着,系统会应用整个脚本,或者在出现错误时防止执行。这样可保证防火墙始终处于一致状态。

另外,nftables 脚本环境使管理员能够:

  • 添加评论
  • 定义变量
  • 包含其他规则集文件

本节介绍了如何使用这些功能,以及如何创建和执行 nftables 脚本。

当安装 nftables 软件包时,Red Hat Enterprise Linux 会在 /etc/nftables/ 目录中自动创建 *.nft 脚本。这些脚本包含为不同目的创建表和空链的命令。

51.2.1. 支持的 nftables 脚本格式

nftables 脚本环境支持以下格式的脚本:

  • 您可以以与 nft list ruleset 命令相同的格式来编写脚本,显示规则集:

    #!/usr/sbin/nft -f
    
    # Flush the rule set
    flush ruleset
    
    table inet example_table {
    chain example_chain {
        # Chain for incoming packets that drops all packets that
        # are not explicitly allowed by any rule in this chain
        type filter hook input priority 0; policy drop;
    
        # Accept connections to port 22 (ssh)
        tcp dport ssh accept
    }
    }
    
    - 你可以对命令使用与 nft 命令相同的语法:

    #!/usr/sbin/nft -f
    
    # Flush the rule set
    flush ruleset
    
    # Create a table
    add table inet example_table
    
    # Create a chain for incoming packets that drops all packets
    # that are not explicitly allowed by any rule in this chain
    add chain inet example_table example_chain { type filter hook input priority 0 ; policy drop ; }
    
    # Add a rule that accepts connections to port 22 (ssh)
    add rule inet example_table example_chain tcp dport ssh accept
    

51.2.2. 运行 nftables 脚本

您可以通过将其传给 nft 工具或直接执行脚本来运行 nftables 脚本。

前提条件

  • 本节的流程假设您在 /etc/nftables/example_firewall.nft 文件中存储了 nftables 脚本。

流程

  • 要通过将其传给 nft 工具来运行 nftables 脚本,请输入:

    # nft -f /etc/nftables/example_firewall.nft
    
  • 要直接运行 nftables 脚本:

    1. 只需要执行一次的步骤:

      1. 确保脚本以以下 shebang 序列开头:

        #!/usr/sbin/nft -f
        

        如果省略了 -f 参数,nft 工具不会读取脚本,并显示: Error: syntax error, unexpected newline, expecting string。

      2. 可选:将脚本的所有者设为 root :

        # chown root /etc/nftables/example_firewall.nft
        
        3. 使脚本可以被其所有者执行:

        # chmod u+x /etc/nftables/example_firewall.nft
        
        2. 运行脚本:

    # /etc/nftables/example_firewall.nft
    
    如果没有输出结果,系统将成功执行该脚本。

    注意,即使 nft 成功执行了脚本,在脚本中错误放置的规则、缺少参数或其他问题都可能导致防火墙的行为不符合预期。

51.2.3. 使用 nftables 脚本中的注释

nftables 脚本环境将 # 字符右侧的所有内容都视为注释。

  • 例 51.1. nftables 脚本中的注释

    注释可在一行的开始,也可以在命令后:

    ...
    # Flush the rule set
    flush ruleset
    
    add table inet example_table  # Create a table
    ...
    

51.2.4. 使用 nftables 脚本中的变量

要在 nftables 脚本中定义变量,请使用 define 关键字。您可以在变量中存储单个值和匿名集合。对于更复杂的场景,请使用 set 或 verdict 映射。

  • 只有一个值的变量 以下示例定义了一个名为 INET_DEV 的变量,其值为 enp1s0 :

    define INET_DEV = enp1s0
    
    您可以在脚本中使用变量,方法是在 $ 符号后跟变量名:

    ...
    add rule inet example_table example_chain iifname $INET_DEV tcp dport ssh accept
    ...
    
    - 包含匿名集合的变量 以下示例定义了一个包含匿名集合的变量:

    define DNS_SERVERS = { 192.0.2.1, 192.0.2.2 }
    
    您可以在脚本中使用变量,方法是在 $ 符号后跟变量名:

    add rule inet example_table example_chain ip daddr $DNS_SERVERS accept
    

请注意,在规则中使用大括号时具有特殊的意义,因为它们表示变量代表一个集合。

51.2.5. 在 nftables 脚本中包含文件

nftables 脚本环境可让管理员通过使用 include 语句来包含其他脚本。

如果您只指定文件名,而没有绝对路径或相对路径,则 nftables 包括默认搜索路径中的文件,该路径被设为 Red Hat Enterprise Linux 上的 /etc。

  • 例 51.2. 包含默认搜索目录中的文件

    从默认搜索目录中包含一个文件:

    include "example.nft"
    
  • 例 51.3. 包含目录中的所有 *.nft 文件

    要包括所有存储在 /etc/nftables/rulesets/ 目录中、以 *.nft 结尾的文件:

    include "/etc/nftables/rulesets/*.nft"
    
    请注意,include 语句不匹配以点开头的文件。

51.2.6. 系统引导时自动载入 nftables 规则

nftables systemd 服务加载包含在 /etc/sysconfig/nftables.conf 文件中的防火墙脚本。这部分论述了如何在系统引导时载入防火墙规则。

前提条件

  • nftables 脚本存储在 /etc/nftables/ 目录中。

流程

  1. 编辑 /etc/sysconfig/nftables.conf 文件。

  2. 如果您在安装 nftables 软件包时增强了在 /etc/nftables/ 中创建的 *.nft 脚本,请取消对这些脚本的 include 语句的注释。

  3. 如果您从头开始编写脚本,请添加 include 语句来包含这些脚本。例如,要在 nftables 服务启动时载入 /etc/nftables/example.nft 脚本,请添加:

    include "/etc/nftables/example.nft"
    
  4. (可选)启动 nftables 服务来载入防火墙规则,而不用重启系统:

    # systemctl start nftables
    
  5. 启用 nftables 服务。

    # systemctl enable nftables
    

51.3. 创建和管理 nftables 表、链和规则

本节介绍了如何显示 nftables 规则集以及如何管理它们。

51.3.1. 标准链优先级值和文本名称

当创建链时,您可以将 priority 设为整数值或标准名称,来指定具有相同 hook 值链的顺序。

名称和值是根据 xtables 在注册其默认链时使用的优先级来定义的。

注意,nft list chain 命令默认显示文本优先级值。您可以通过将 -y 选项传给命令来查看数字值。

  • 例 51.4. 使用文本值设定优先级

    以下命令使用标准优先级值 50, 在 example_table 中创建一个名为 example_chain 的链:

    # nft add chain inet example_table example_chain { type filter hook input priority 50 \; policy accept \; }
    

    因为优先级是一个标准值,所以您可以使用文本值:

    # nft add chain inet example_table example_chain { type filter hook input priority security \; policy accept \; }
    
  • 表 51.1. 标准优先级名称、系列和 hook 兼容性列表

    名称 系列 Hook
    raw -300 ip ip6、inet all
    mangle -150 ip ip6、inet all
    dstnat -100 ip ip6、inet prerouting
    filter 0 ip、ip6、inet、arp、netdev all
    security 50 ip ip6、inet all
    srcnat 100 ip ip6、inet postrouting

所有系列都使用相同的值,但 bridge 系列使用以下值:

  • 表 51.2. 网桥系列的标准优先级名称和 hook 兼容性

    名称 Hook
    dstnat -300 prerouting
    filter -200 all
    out 100 output
    srcnat 300 postrouting

51.3.2. 显示 nftables 规则集

nftables 的规则集包含表、链和规则。本节介绍如何显示规则集。

流程

  • 要显示规则集,请输入:

    # nft list ruleset
    table inet example_table {
    chain example_chain {
        type filter hook input priority filter; policy accept;
        tcp dport http accept
        tcp dport ssh accept
    }
    }
    

注意,默认情况下,nftables 不预先创建表。因此,在没有表的情况下显示主机上设置的规则,nft list ruleset 命令不会显示任何结果。

51.3.3. 创建 nftables 表

nftables 中的表是包含链、规则、集合和其他对象的集合的名字空间。本节介绍如何创建表。

每个表都必须定义一个地址系列。表的地址系列定义了表进程的类型。在创建表时,您可以设置以下地址系列之一:

  • ip :只匹配 IPv4 数据包。如果没有指定地址系列,这是默认设置。
  • ip6 :只匹配 IPv6 数据包。
  • inet :匹配 IPv4 和 IPv6 数据包。
  • arp:匹配 IPv4 地址解析协议(ARP)数据包。
  • bridge :匹配通过网桥设备的数据包。
  • netdev :匹配来自 ingress 的数据包。

流程

  1. 使用 nft add table 命令来创建新表。例如,要创建一个名为 example_table 、用来处理 IPv4 和 IPv6 数据包的表:

    # nft add table inet example_table
    
  2. 另外,还可列出规则集中的所有表:

    # nft list tables
    table inet example_table
    

51.3.4. 创建 nftables 链

chains 是规则的容器。存在以下两种规则类型:

  • 基本链:您可以使用基础链作为来自网络堆栈的数据包的入口点。
  • 常规链:您可以使用常规链作为 跳板 目标,并更好地组织规则。

这个步骤描述了如何在现有表中添加基本链。

前提条件

  • 已存在您要添加新链的表。

流程

  1. 使用 nft add chain 命令来创建新链。例如,要在 example_table 中创建一个名为 example_chain 的链:

    # nft add chain inet example_table example_chain { type filter hook input priority 0 \; policy accept \; }
    

    注意,为避免 shell 将分号解析为命令的结尾,请在分号前加上 \ 转义字符。

    这个链过滤传入的数据包。priority 参数指定 nftables 进程处理相同 hook 值的链的顺序。较低优先级的值优先于优先级更高的值。policy 参数设置此链中规则的默认操作。请注意,如果您远程登录到服务器,并将默认策略设置为 drop,如果没有其他规则允许远程访问,则会立即断开连接。

  2. 另外,还可以显示所有链:

    # nft list chains
    table inet example_table {
    chain example_chain {
        type filter hook input priority filter; policy accept;
    }
    }
    

51.3.5. 将规则附加到 nftables 链的末尾

本节介绍了如何将规则附加到现有 nftables 链的末尾。

前提条件

  • 您要添加该规则的链已存在。

流程

  1. 要添加新的规则,请使用 nft add rule 命令。例如,要在 example_table 的 example_chain 中添加一条允许端口 22 上 TCP 流量的规则:

    # nft add rule inet example_table example_chain tcp dport 22 accept
    
    您可以选择指定服务名称而不是端口号。在该示例中,您可以使用 ssh 而不是端口号 22。请注意,会根据其在 /etc/services 文件中的条目将服务名称解析为端口号。

  2. 另外,还可在 example_table 中显示所有的链及其规则:

    # nft list table inet example_table
    table inet example_table {
    chain example_chain {
        type filter hook input priority filter; policy accept;
        ...
        tcp dport ssh accept
    }
    }
    

51.3.6. 在 nftables 链的开头插入一条规则

本节介绍了如何在现有 nftables 链的开头插入一条规则。

前提条件

  • 您要添加该规则的链已存在。

流程

  1. 要插入新规则,请使用 nft insert rule 命令。例如,要在 example_table 的 example_chain 中插入一条允许端口 22 上 TCP 流量的规则:

    # nft insert rule inet example_table example_chain tcp dport 22 accept
    
    您还可以指定服务名称而不是端口号。在该示例中,您可以使用 ssh 而不是端口号 22。请注意,会根据其在 /etc/services 文件中的条目将服务名称解析为端口号。

  2. 另外,还可在 example_table 中显示所有的链及其规则:

    # nft list table inet example_table
    table inet example_table {
    chain example_chain {
        type filter hook input priority filter; policy accept;
        tcp dport ssh accept
        ...
    }
    }
    

51.3.7. 在 nftables 链的特定位置插入一条规则

本节介绍了如何在 nftables 链中现有规则的前和后插入规则。这样,您可以将新规则放在正确的位置上。

前提条件

  • 您要添加规则的链存在。

流程

  1. 使用 nft -a list ruleset 命令显示 example_table 中的所有的链及其规则,包括它们的句柄:

    # nft -a list table inet example_table
    table inet example_table { # handle 1
    chain example_chain { # handle 1
        type filter hook input priority filter; policy accept;
        tcp dport 22 accept # handle 2
        tcp dport 443 accept # handle 3
        tcp dport 389 accept # handle 4
    }
    }
    
    使用 -a 显示句柄。您需要此信息才能在后续步骤中定位新规则。

  2. 在 example_table 的 example_chain 链中插入新规则 :

  3. 要在句柄 3 前插入一条允许端口 636 上TCP 流量的规则,请输入:

    # nft insert rule inet example_table example_chain position 3 tcp dport 636 accept
    
  4. 要在句柄 3 后添加一条允许端口 80 上 TCP 流量的规则,请输入:

    # nft add rule inet example_table example_chain position 3 tcp dport 80 accept
    
  5. 另外,还可在 example_table 中显示所有的链及其规则:

    # nft -a list table inet example_table
    table inet example_table { # handle 1
    chain example_chain { # handle 1
        type filter hook input priority filter; policy accept;
        tcp dport 22 accept # handle 2
        tcp dport 636 accept # handle 5
        tcp dport 443 accept # handle 3
        tcp dport 80 accept # handle 6
        tcp dport 389 accept # handle 4
    }
    }
    

51.4. 使用 nftables 配置 NAT

使用 nftables,您可以配置以下网络地址转换(NAT)类型:

  • 伪装
  • 源 NAT(SNAT)
  • 目标 NAT(DNAT)
  • 重定向

注意,您只能在 iifname 和 oifname 参数中使用实际的接口名称,不支持替代名称(altname)。

51.4.1. 不同的 NAT 类型: masquerading、source NAT、destination NAT 和 redirect

这些是不同的网络地址转换(NAT)类型:

  • 伪装和源 NAT(SNAT) 使用以上 NAT 类型之一更改数据包的源 IP 地址。例如,互联网服务提供商不会路由私有 IP 范围,如 10.0.0.0/8。如果您在网络中使用私有 IP 范围,并且用户应该能够访问 Internet 上的服务器,请将这些范围内的数据包的源 IP 地址映射到公共 IP 地址。

    伪装和 SNAT 都非常相似。不同之处是:

    • 伪装自动使用传出接口的 IP 地址。因此,如果传出接口使用了动态 IP 地址,则使用伪装。
    • SNAT 将数据包的源 IP 地址设置为指定的 IP 地址,且不会动态查找传出接口的 IP 地址。因此,SNAT 要比伪装更快。如果传出接口使用了固定 IP 地址,则使用 SNAT。
  • 目标 NAT(DNAT) 使用此 NAT 类型重写传入数据包的目标地址和端口。例如,如果您的 Web 服务器使用私有 IP 范围内的 IP 地址,那么无法直接从互联网访问它,您可以在路由器上设置 DNAT 规则,以便将传入的流量重定向到此服务器。

  • 重定向 这个类型是 IDT 的特殊示例,它根据链 hook 将数据包重定向到本地机器。例如,如果服务运行在与其标准端口不同的端口上,您可以将传入的流量从标准端口重定向到此特定端口。

51.4.2. 使用 nftables 配置伪装

伪装使路由器动态地更改通过接口到接口 IP 地址发送的数据包的源 IP。这意味着,如果接口被分配了新的 IP,nftables 会在替换源 IP 时自动使用新的 IP。

以下流程描述了如何将通过 ens3 接口的离开主机的数据包的源 IP 替换为 ens3 上设置的 IP。

流程

  1. 创建一个表:

    # nft add table nat
    
  2. 将 prerouting 和 postrouting 链添加到表中:

    # nft -- add chain nat prerouting { type nat hook prerouting priority -100 \; }
    # nft add chain nat postrouting { type nat hook postrouting priority 100 \; }
    

    注意,即使您没有向 prerouting 添加规则,nftables 框架也要求此链与传入的数据包回复匹配。

    请注意,您必须将 -- 选项传给 nft 命令,以避免 shell 将负优先级的值解析为 nft 命令的一个选项。

  3. 在 postrouting 链中添加一条与 ens3 接口上的传出数据包匹配的规则:

    # nft add rule nat postrouting oifname "ens3" masquerade
    

51.4.3. 使用 nftables 配置源 NAT

在路由器中,源 NAT(SNAT)可让您将通过接口发送的数据包 IP 改为专门的 IP 地址。

以下流程描述了如何将通过 ens3 接口的离开路由器的数据包的源 IP 替换为 192.0.2.1。

流程

  1. 创建一个表:

    # nft add table nat
    
  2. 将 prerouting 和 postrouting 链添加到表中:

    # nft -- add chain nat prerouting { type nat hook prerouting priority -100 \; }
    # nft add chain nat postrouting { type nat hook postrouting priority 100 \; }
    

    即使您没有向 postrouting 链添加规则,nftables 框架也要求此链与传出的数据包回复匹配。

    请注意,您必须将 -- 选项传给 nft 命令,以避免 shell 将负优先级的值解析为 nft 命令的一个选项。

  3. 在 postrouting 链中添加一条规则,其将通过 ens3 传出的数据包的源 IP 替换为 192.0.2.1 :

    # nft add rule nat postrouting oifname "ens3" snat to 192.0.2.1
    

51.4.4. 使用 nftables 配置目标 NAT

目标 NAT 可让您将路由器中的流量重新指向无法直接从互联网访问的主机。

以下流程描述了如何将发送到路由器端口 80 和 443 的传入流量重定向到 IP 地址为 192.0.2.1 的主机。

流程

  1. 创建一个表:

    # nft add table nat
    
  2. 将 prerouting 和 postrouting 链添加到表中:

    # nft -- add chain nat prerouting { type nat hook prerouting priority -100 \; }
    # nft add chain nat postrouting { type nat hook postrouting priority 100 \; }
    

    即使您没有向 postrouting 链添加规则,nftables 框架也要求此链与传出的数据包回复匹配。

    请注意,您必须将 -- 选项传给 nft 命令,以避免 shell 将负优先级的值解析为 nft 命令的一个选项。

  3. 在 prerouting 链中添加一条规则,将发送到端口 80 和 443 的 ens3 接口上的传入流量重定向到 IP 为 192.0.2.1 的主机:

    # nft add rule nat prerouting iifname ens3 tcp dport { 80, 443 } dnat to 192.0.2.1
    
  4. 根据您的环境,添加 SNAT 或伪装规则以更改源地址:

    1. 如果 ens3 接口使用动态 IP 地址,请添加一条伪装规则:

      # nft add rule nat postrouting oifname "ens3" masquerade
      
    2. 如果 ens3 接口使用静态 IP 地址,请添加一条 SNAT 规则。例如,如果 ens3 使用 198.51.100.1 IP 地址:

      # nft add rule nat postrouting oifname "ens3" snat to 198.51.100.1
      

51.4.5. 使用 nftables 配置重定向

重定向 功能是目标网络地址转换(DNAT)的一种特殊情况,它根据链 hook 将数据包重定向到本地计算机。

以下流程描述了如何将发送到本地主机端口 22 的传入和转发流量重定向到端口 2222。

流程

  1. 创建一个表:

    # nft add table nat
    
  2. 在表中添加 prerouting 链:

    # nft -- add chain nat prerouting { type nat hook prerouting priority -100 \; }
    
    请注意,您必须将 -- 选项传给 nft 命令,以避免 shell 将负优先级的值解析为 nft 命令的一个选项。

  3. 在 prerouting 链中添加一条规则,将端口 22 上的传入流量重定向到端口 2222 :

    # nft add rule nat prerouting tcp dport 22 redirect to 2222
    

51.5. 使用 nftables 命令中的设置

nftables 框架原生支持集合。您可以使用一个集合,例如,规则匹配多个 IP 地址、端口号、接口或其他匹配标准。

51.5.1. 在 nftables 中使用匿名集合

匿名集合包含以逗号分开的值,用花括号括起来,如 { 22、80、443 },你可以直接在规则中使用。您还可以将匿名集合用于 IP 地址或其他匹配标准。

匿名集合的缺陷是,如果要更改集合,则需要替换规则。对于动态解决方案,使用命名集合,如 在 nftables 中使用命名集合 中所述。

前提条件

  • inet 系列中的 example_chain 链和 example_table 表存在。

流程

  1. 例如,在 example_table 中的 example_chain 中添加一条规则,允许传入流量流到端口 22、80 和 443 :

    # nft add rule inet example_table example_chain tcp dport { 22, 80, 443 } accept
    
  2. 另外,还可在 example_table 中显示所有的链及其规则:

    # nft list table inet example_table
    table inet example_table {
    chain example_chain {
        type filter hook input priority filter; policy accept;
        tcp dport { ssh, http, https } accept
    }
    }
    

51.5.2. 在 nftables 中使用命名集

nftables 框架支持可变命名集。命名集是一个列表或一组元素,您可以在表中的多个规则中使用。匿名集合的另外一个好处在于,您可以更新命名的集合而不必替换使用集合的规则。

当您创建一个命名集时,必须指定集合包含的元素类型。您可以设置以下类型:

  • 包含 IPv4 地址或范围的集合的 ipv4_addr,如 192.0.2.1 或 192.0.2.0/24。
  • 包含 IPv6 地址或范围的集合的 ipv6_addr,如 2001:db8:1::1 或 2001:db8:1::1/64。
  • 包含介质访问控制(MAC)地址列表的集合的 ether_addr,如 51:54:00:6b:66:42。
  • 包含 Internet 协议类型列表的集合的 inet_proto ,如 tcp。
  • 包含互联网服务列表的集合的 inet_service,如 ssh。
  • 包含数据包标记列表的集合的 mark。数据包标记可以是任何 32 位正整数值(0 到 2147483647)。

前提条件

  • example_chain 链和 example_table 表存在。

流程

  1. 创建一个空集。以下示例为 IPv4 地址创建了一个集合:

  2. 要创建可存储多个独立 IPv4 地址的集合:

    # nft add set inet example_table example_set { type ipv4_addr \; }
    
  3. 要创建可存储 IPv4 地址范围的集合:

    # nft add set inet example_table example_set { type ipv4_addr \; flags interval \; }
    

    要避免 shell 认为分号作为命令结尾,您必须用反斜杠转义分号。

  4. 另外,还可创建使用该集合的规则。例如,以下命令向 example_table 中的 example_chain 添加一条规则,该规则将丢弃来自 example_set 中 IPv4 地址的所有数据包。

    # nft add rule inet example_table example_chain ip saddr @example_set drop
    
    因为 example_set 仍然为空,因此该规则目前无效。

  5. 在 example_set 中添加 IPv4 地址:

  6. 如果您创建存储单个 IPv4 地址的集合,请输入:

    # nft add element inet example_table example_set { 192.0.2.1, 192.0.2.2 }
    
  7. 如果您创建存储 IPv4 范围的集合,请输入:

    # nft add element inet example_table example_set { 192.0.2.0-192.0.2.255 }
    
    当指定 IP 地址范围时,你也可以使用无类别域间路由(CIDR)标记,如上例中的 192.0.2.0/24。

51.6. 在 nftables 命令中使用 verdict 映射

Verdict 映射(也称为字典)使 nft 能够通过将匹配标准映射到操作来根据数据包信息执行操作。

51.6.1. 在 nftables 中使用匿名映射

匿名映射是您直接在规则中使用的 { match_criteria : action } 语句。这个语句可以包含多个用逗号分开的映射。

匿名映射的缺点是,如果要修改映射,则必须替换规则。对于动态解决方案,请使用命名映射,如 在 nftables 中使用命名映射 中所述。

这个示例描述了如何使用匿名映射将 IPv4 和 IPv6 协议的 TCP 和 UDP 数据包路由到不同的链,以分别计算传入的 TCP 和 UDP 数据包。

流程

  1. 创建 example_table:

    # nft add table inet example_table
    
  2. 在 example_table 中创建 tcp_packets 链:

    # nft add chain inet example_table tcp_packets
    
  3. 在 tcp_packets 中添加一条计算此链中流量的规则:

    # nft add rule inet example_table tcp_packets counter
    
  4. 在 example_table 中创建 udp_packets 链

    # nft add chain inet example_table udp_packets
    
  5. 在udp_packets 中添加一条计算此链中流量的规则:

    # nft add rule inet example_table udp_packets counter
    
  6. 为传入的流量创建一个链。例如,在 example_table 中创建一个名为 incoming_traffic 的链,用于过滤传入的流量:

    # nft add chain inet example_table incoming_traffic { type filter hook input priority 0 \; }
    
  7. 在incoming_traffic 中添加一条带有匿名映射的规则:

    # nft add rule inet example_table incoming_traffic ip protocol vmap { tcp : jump tcp_packets, udp : jump udp_packets }
    
    匿名映射区分数据包,并根据它们的协议将它们发送到不同的计数链。

  8. 要列出流量计数器,请显示 example_table:

    # nft list table inet example_table
    table inet example_table {
    chain tcp_packets {
        counter packets 36379 bytes 2103816
    }
    
    chain udp_packets {
        counter packets 10 bytes 1559
    }
    
    chain incoming_traffic {
        type filter hook input priority filter; policy accept;
        ip protocol vmap { tcp : jump tcp_packets, udp : jump udp_packets }
    }
    }
    
    tcp_packets 和 udp_packets 链中的计数器会显示收到的数据包数和字节数。

51.6.2. 在 nftables 中使用命名映射

nftables 框架支持命名映射。您可以在表中的多个规则中使用这些映射。匿名映射的另一个好处在于,您可以更新命名映射而不比替换使用它的规则。

在创建命名映射时,您必须指定元素的类型:

  • 匹配部分包含 IPv4 地址的映射的 ipv4_addr ,如 192.0.2.1。
  • 匹配部分包含 IPv6 地址的映射的 ipv6_addr ,如 2001:db8:1::1。
  • 匹配部分包含介质访问控制(MAC)地址的映射的 ether_addr,如 51:54:00:6b:66:42。
  • 匹配部分包含 Internet 协议类型的映射的 inet_proto ,如 tcp 。
  • 匹配部分包含互联网服务名称端口号的映射的 inet_service ,如 ssh 或 22 。
  • 匹配部分包含数据包标记的映射的 mark 。数据包标记可以是任何 32 位的正整数值(0 到 2147483647)。
  • 匹配部分包含计数器值的映射的 counter。计数器值可以是任意正 64 位整数值。
  • 匹配部分包含配额值的映射的 quota 。配额值可以是任意正 64 位整数值。

这个示例论述了如何根据源 IP 地址允许或丢弃传入的数据包。使用命名映射时,您只需要一条规则来配置这种场景,而 IP 地址和操作被动态存储在映射中。此流程还描述了如何从映射中添加和删除条目。

流程

  1. 创建表。例如,要创建一个名为 example_table 的表来处理 IPv4 数据包:

    # nft add table ip example_table
    
  2. 创建链。例如,要在 example_table 中创建一个名为 example_chain 的链:

    # nft add chain ip example_table example_chain { type filter hook input priority 0 \; }
    
    要避免 shell 认为分号作为命令结尾,您必须用反斜杠转义分号。

  3. 创建一个空的映射。例如,要为 IPv4 地址创建映射:

    # nft add map ip example_table example_map { type ipv4_addr : verdict \; }
    
  4. 创建使用该映射的规则。例如,以下命令向 example_table 中的 example_chain 添加了一条规则,它把操作应用到 example_map 中定义的 IPv4 地址上:

    # nft add rule example_table example_chain ip saddr vmap @example_map
    
  5. 在 example_map 中添加 IPv4 地址和相应的操作:

    # nft add element ip example_table example_map { 192.0.2.1 : accept, 192.0.2.2 : drop }
    
    这个示例定义了 IPv4 地址到操作的映射。结合上面创建的规则,防火墙会接受来自 192.0.2.1 的数据包,而丢弃来自 192.0.2.2 的数据包。

  6. 另外,还可添加另一个 IP 地址和 action 语句来增强映射:

    # nft add element ip example_table example_map { 192.0.2.3 : accept }
    
  7. (可选)从映射中删除条目:

    # nft delete element ip example_table example_map { 192.0.2.1 }
    
  8. 另外,还可显示规则集:

    # nft list ruleset
    table ip example_table {
    map example_map {
        type ipv4_addr : verdict
        elements = { 192.0.2.2 : drop, 192.0.2.3 : accept }
    }
    
    chain example_chain {
        type filter hook input priority filter; policy accept;
        ip saddr vmap @example_map
    }
    }
    

51.7. 使用 nftables 配置端口转发

端口转发可让管理员将发送到特定目的端口的数据包转发到不同的本地或者远程端口。

例如,如果您的 Web 服务器没有公共 IP 地址,您可以在防火墙上设置端口转发规则,该规则将防火墙端口 80 和 443 上传入的数据包转发到 Web 服务器。使用这个防火墙规则,互联网中的用户可以使用防火墙的 IP 或主机名访问网页服务器。

51.7.1. 将传入的数据包转发到不同的本地端口

这部分描述了如何将端口 8022 上传入的 IPv4 数据包转发到本地系统端口 22 上的示例。

流程

  1. 使用 ip 地址系列创建一个名为 nat 的表:

    # nft add table ip nat
    
  2. 将 prerouting 和 postrouting 链添加到表中:

    # nft -- add chain ip nat prerouting { type nat hook prerouting priority -100 \; }
    
    注意,将 -- 选项传给 nft 命令,以避免 shell 将负优先级的值解析为 nft 命令的一个选项。

  3. 在 prerouting 链中添加一条规则,将端口 8022 上传入的数据包重定向到本地端口 22 :

    # nft add rule ip nat prerouting tcp dport 8022 redirect to :22
    

51.7.2. 将特定本地端口上传入的数据包转发到不同主机

您可以使用目标网络地址转换(DNAT)规则将本地端口上传入的数据包转发到远程主机。这可让互联网中的用户访问使用专用 IP 地址在主机上运行的服务。

这个步骤描述了如何将本地端口 443 上传入的 IPv4 数据包转发到 IP 地址为 192.0.2.1 的远程系统上的同一端口号。

前提条件

  • 您以 root 用户身份登录到应该可以转发数据包的系统。

流程

  1. 使用 ip 地址系列创建一个名为 nat 的表:

    # nft add table ip nat
    
  2. 将 prerouting 和 postrouting 链添加到表中:

    # nft -- add chain ip nat prerouting { type nat hook prerouting priority -100 \; }
    # nft add chain ip nat postrouting { type nat hook postrouting priority 100 \; }
    
    注意,将 -- 选项传给 nft 命令,以避免 shell 将负优先级的值解析为 nft 命令的一个选项。

  3. 在 prerouting 链中添加一条规则,将端口 443 上传入的数据包重定向到 192.0.2.1 上的同一端口:

    # nft add rule ip nat prerouting tcp dport 443 dnat to 192.0.2.1
    
  4. 在 postrouting 链中添加一条规则来伪装传出的流量:

    # nft add rule ip nat postrouting daddr 192.0.2.1 masquerade
    
  5. 启用数据包转发:

    # echo "net.ipv4.ip_forward=1" > /etc/sysctl.d/95-IPv4-forwarding.conf
    # sysctl -p /etc/sysctl.d/95-IPv4-forwarding.conf
    

51.8. 使用 nftables 来限制连接数量

您可以使用 nftables 来限制连接数量或阻止尝试建立给定数量连接的 IP 地址,以防止它们使用过多的系统资源。

51.8.1. 使用 nftables 限制连接数量

nft 工具的 ct count 参数可让管理员限制连接数量。这个步骤描述了如何限制进入的连接的基本示例。

前提条件

  • example_table 中的基 example_chain 存在。

流程

  1. 为 IPv4 地址创建动态集合:

    # nft add set inet example_table example_meter { type ipv4_addr\; flags dynamic \;}
    
  2. 添加一条规则,该规则只允许从 IPv4 地址同时连接到 SSH 端口(22),并从同一 IP 拒绝所有后续连接:

    # nft add rule ip example_table example_chain tcp dport ssh meter example_meter { ip saddr ct count over 2 } counter reject
    
  3. 另外,还可显示上一步中创建的集合:

    # nft list set inet example_table example_meter
    table inet example_table {
    meter example_meter {
        type ipv4_addr
        size 65535
        elements = { 192.0.2.1 ct count over 2 , 192.0.2.2 ct count over 2  }
    }
    }
    
    elements 条目显示目前与该规则匹配的地址。在本例中,elements 列出了与 SSH 端口有活动连接的 IP 地址。请注意,输出不会显示活跃连接的数量,或者连接是否被拒绝。

51.8.2. 在一分钟内尝试超过十个进入的 TCP 连接的 IP 地址

本节介绍了您如何临时阻止在一分钟内建立了十个 IPv4 TCP 连接的主机。

流程

  1. 使用 ip 地址系列创建 filter 表:

    # nft add table ip filter
    
  2. 在 filter 表中添加 input 链:

    # nft add chain ip filter input { type filter hook input priority 0 \; }
    
  3. 添加一条规则,其丢弃来自源地址的所有数据包,并尝试在一分钟内建立十个 TCP 连接:

    # nft add rule ip filter input ip protocol tcp ct state new, untracked meter ratemeter { ip saddr timeout 5m limit rate over 10/minute } drop
    
    timeout 5m 参数定义 nftables 在五分钟后自动删除条目,以防止 meter 被过时的条目填满。

验证

  • 要显示 meter 的内容,请输入:

    # nft list meter ip filter ratemeter
    table ip filter {
    meter ratemeter {
        type ipv4_addr
        size 65535
        flags dynamic,timeout
        elements = { 192.0.2.1 limit rate over 10/minute timeout 5m expires 4m58s224ms }
    }
    }
    

51.9. 调试 nftables 规则

nftables 框架为管理员提供了不同的选项来调试规则,以及数据包是否匹配规则。本节描述了这些选项。

51.9.1. 创建带有计数器的规则

在识别规则是否匹配时,可以使用计数器。本节描述了如何创建带有计数器的新规则。

  • 有关向现有规则添加计数器的流程的更多信息,请参阅 向现有规则添加计数器。

前提条件

  • 您要添加该规则的链已存在。

流程

  1. 在链中添加带有 counter 参数的新规则。以下示例添加一个带有计数器的规则,它允许端口 22 上的 TCP 流量,并计算与这个规则匹配的数据包和网络数据的数量:

    # nft add rule inet example_table example_chain tcp dport 22 counter accept
    
  2. 显示计数器值:

    # nft list ruleset
    table inet example_table {
    chain example_chain {
        type filter hook input priority filter; policy accept;
        tcp dport ssh counter packets 6872 bytes 105448565 accept
    }
    }
    

51.9.2. 在现有规则中添加计数器

在识别规则是否匹配时,可以使用计数器。本节论述了如何在现有规则中添加计数器。

  • 有关添加带有计数器的新规则的流程的更多信息,请参阅 创建带有计数器的规则 。

前提条件

  • 您要添加计数器的规则已存在。

流程

  1. 在链中显示规则及其句柄:

    # nft --handle list chain inet example_table example_chain
    table inet example_table {
    chain example_chain { # handle 1
        type filter hook input priority filter; policy accept;
        tcp dport ssh accept # handle 4
    }
    }
    
  2. 通过将规则替换为 counter 参数来添加计数器。以下示例替换了上一步中显示的规则并添加计数器:

    # nft replace rule inet example_table example_chain handle 4 tcp dport 22 counter accept
    
  3. 显示计数器值:

    # nft list ruleset
    table inet example_table {
    chain example_chain {
        type filter hook input priority filter; policy accept;
        tcp dport ssh counter packets 6872 bytes 105448565 accept
    }
    }
    

51.9.3. 监控与现有规则匹配的数据包

nftables 中的追踪功能与 nft monitor 命令相结合,可让管理员显示与规则匹配的数据包。该流程描述了如何为规则启用追踪以及与本规则匹配的监控数据包。

前提条件

  • 您要添加计数器的规则已存在。

流程

  1. 在链中显示规则及其句柄:

    # nft --handle list chain inet example_table example_chain
    table inet example_table {
    chain example_chain { # handle 1
        type filter hook input priority filter; policy accept;
        tcp dport ssh accept # handle 4
    }
    }
    
  2. 通过将规则替换为 meta nftrace set 1 参数来添加追踪功能。以下示例替换了上一步中显示的规则并启用追踪:

    # nft replace rule inet example_table example_chain handle 4 tcp dport 22 meta nftrace set 1 accept
    
  3. 使用 nft monitor 命令来显示追踪。以下示例过滤命令的输出,来显示只包含 inet example_table example_chain 的条目:

    # nft monitor | grep "inet example_table example_chain"
    trace id 3c5eb15e inet example_table example_chain packet: iif "enp1s0" ether saddr 51:54:00:17:ff:e4 ether daddr 51:54:00:72:2f:6e ip saddr 192.0.2.1 ip daddr 192.0.2.2 ip dscp cs0 ip ecn not-ect ip ttl 64 ip id 49710 ip protocol tcp ip length 60 tcp sport 56728 tcp dport ssh tcp flags == syn tcp window 64240
    trace id 3c5eb15e inet example_table example_chain rule tcp dport ssh nftrace set 1 accept (verdict accept)
    ...
    

    根据启用追踪的规则的数量以及匹配的流量数量,nft monitor 命令可能产生大量的输出。使用 grep 或其他工具来过滤输出。

51.10. 备份和恢复 nftables 规则集

本节描述了如何将 nftables 规则备份到文件,以及如何从文件中恢复规则。

管理员可以使用具有规则的文件将规则传送到不同的服务器。

51.10.1. 将 nftables 规则集备份到文件

本节描述了如何将 nftables 规则集备份到文件。

流程

  • 备份 nftables 规则:

  • 以 nft list ruleset 格式生成的格式:

    # nft list ruleset > file.nft
    
  • JSON 格式:

    # nft -j list ruleset > file.json
    

51.10.2. 从文件中恢复 nftables 规则集

本节描述了如何恢复 nftables 规则集。

流程

  • 恢复 nftables 规则:

  • 如果要恢复的文件为 nft list ruleset 生成的格式或直接包含 nft 命令:

    # nft -f file.nft
    
  • 如果要恢复的文件采用 JSON 格式:

    # nft -j -f file.json
    

第 52 章 使用 xdp-filter 进行高性能流量过滤以防止 DDoS 攻击

与 nftables 等数据包过滤器相比,Express Data Path(XDP)在网络接口处处理和丢弃网络数据包。因此,XDP 在到达防火墙或其他应用程序前决定了软件包的下一步。因此,XDP 过滤器需要较少的资源,处理网络数据包的速度要比传统数据包过滤器快得多,从而防止分布式拒绝服务(DDoS)攻击。例如,在测试过程中,红帽在单核上每秒丢弃了 2,600万个网络数据包,这比同一硬件上的 nftables 的丢弃率要高得多。

xdp-filter 工具使用 XDP 允许或丢弃传入的网络数据包。您可以创建规则来过滤与特定对象或特定命令的流量:

  • IP 地址
  • MAC 地址
  • 端口

请注意,即使 xdp-filter 具有非常高的数据包处理率,但它不具有与 nftables 相同的功能。将 xdp-filter 视为一个概念性工具,来演示使用 XDP 的数据包过滤。另外,您可以使用工具代码来更好地了解如何编写您自己的 XDP 应用程序。

52.1. 丢弃匹配 xdp-filter 规则的网络数据包

这部分描述了如何使用 xdp-filter 来丢弃网络数据包:

  • 到特定目的地端口
  • 从一个指定的 IP 地址
  • 从一个指定的 MAC 地址

xdp-filter 的allow 策略定义了允许的所有流量,以及过滤器只丢弃与特定规则匹配的网络数据包。例如,如果您知道要丢弃的数据包的源 IP 地址,请使用这个方法。

前提条件

  • xdp-tools 软件包已安装。
  • 支持 XDP 程序的网络驱动程序。

流程

  1. 加载 xdp-filter 以处理特定接口上传入的数据包,如 enp1s0 :

    # xdp-filter load enp1s0
    
    默认情况下,xdp-filter 使用 allow 策略,该工具只丢弃与任何规则相匹配的流量。

    (可选)使用 -f feature 选项仅启用特定的特性,如 tcp、ipv4 或 ethernet。仅加载所需的特性而不是全部特性,来提高软件包处理的速度。要启用多个功能,使用逗号分隔它们。

    如果该命令出错,则网络驱动程序不支持 XDP 程序。

  2. 添加规则来丢弃与它们匹配的数据包。例如:

  3. 要将传入的数据包丢弃到端口 22,请输入:

    # xdp-filter port 22
    
    这个命令添加一个匹配 TCP 和 UDP 流量的规则。要只匹配特定的协议,请使用 -p protocol 选项。

  4. 要丢弃来自 192.0.2.1 的数据包,请输入:

    # xdp-filter ip 192.0.2.1 -m src
    
    请注意,xdp-filter 不支持 IP 范围。

  5. 要丢弃来自 MAC 地址 00:53:00:AA:07:BE 的数据包,请输入:

    # xdp-filter ether 00:53:00:AA:07:BE -m src
    

验证

  • 使用以下命令显示丢弃和允许的数据包统计信息:

    # xdp-filter status
    

52.2. 丢弃所有与 xdp-filter 规则匹配的网络数据包

这部分描述了如何使用 xdp-filter 来仅允许网络数据包:

  • 来自和到一个特定目的地端口
  • 来自和到一个特定 IP 地址
  • 来自和到特定的 MAC 地址

为此,可使用 xdp-filter 的 deny 策略,该策略定义过滤器丢弃除与特定规则相匹配的网络数据包之外的所有网络数据包。例如,如果您不知道要丢弃的数据包的源 IP 地址,请使用这个方法。

如果您在一个接口上加载 xdp-filter 时将默认策略设为 deny,则内核会立即丢弃来自该接口的所有数据包,直到您创建允许某些流量的规则。要避免从系统中锁定,在本地输入命令或者通过不同的网络接口连接到主机。

前提条件

  • xdp-tools 软件包已安装。
  • 您登录到本地主机,或使用您不计划过滤流量的网络接口。
  • 支持 XDP 程序的网络驱动程序。

流程

  1. 加载 xdp-filter 来处理特定接口上的数据包,如 enp1s0 :

    # xdp-filter load enp1s0 -p deny
    
    (可选)使用 -f feature 选项仅启用特定的特性,如 tcp、ipv4 或 ethernet。仅加载所需的特性而不是全部特性,来提高软件包处理的速度。要启用多个功能,使用逗号分隔它们。

    如果该命令出错,则网络驱动程序不支持 XDP 程序。

  2. 添加规则以允许匹配它们的数据包。例如:

  3. 要允许数据包到端口 22,请输入:

    # xdp-filter port 22
    
    这个命令添加一个匹配 TCP 和 UDP 流量的规则。要仅匹配特定的协议,请将 -p protocol 选项传给命令。

  4. 要允许数据包到 192.0.2.1 ,请输入:

    # xdp-filter ip 192.0.2.1
    
    请注意,xdp-filter 不支持 IP 范围。

  5. 要允许数据包到 MAC 地址 00:53:00:AA:07:BE ,请输入:

    # xdp-filter ether 00:53:00:AA:07:BE
    

xdp-filter 工具不支持有状态数据包检查。这要求您不要使用 -m mode 选项设置模式,或者您添加显式规则以允许机器接收的传入流量响应传出流量。

验证

  • 使用以下命令显示丢弃和允许的数据包统计信息:

    # xdp-filter status
    

第 53 章 DPDK 入门

数据平面开发套件(DPDK)提供库和网络驱动程序来加快用户空间中的软件包处理。

管理员使用 DPDK,例如,在虚拟机中使用单一根 I/O 虚拟化(SR-IOV)来减少延迟并增加 I/O 吞吐量。

53.1. 安装 dpdk 软件包

这部分描述了如何安装 dpdk 软件包。

前提条件

  • 安装了 OpenCLoudOS 。

流程

  • 使用 yum 工具安装 dpdk 软件包:

    # yum install dpdk
    

第 54 章 了解 eBPF 网络功能

扩展的 Berkeley Packet 过滤器(eBPF)是一个内核中的虚拟机,允许在内核空间中执行代码。此代码运行在一个受限的沙箱环境中,仅可访问有限功能集。

在网络中,您可以使用 eBPF 来补充或替换内核数据包处理。根据您使用的 hook,eBPF 程序有:

  • 对元数据的读和写的访问权限
  • 可以查找套接字和路由
  • 可以设置套接字选项
  • 可以重定向数据包

54.1. 网络 eBPF 功能概述

您可以将扩展的 Berkeley 数据包过滤器(eBPF)网络程序附加到 OpenCloudOS 中的以下钩子:

  • Express Data Path(XDP):在内核网络堆栈处理它们之前,对接收的数据包提供早期的访问权限。
  • 带有直接动作标志的 tc eBPF 分类器:对入口和出口提供强大的数据包处理。
  • 控制组版本 2(cgroup v2):在控制组中,对程序所执行的基于套接字的操作启用过滤和覆盖。
  • 套接字过滤:启用对从套接字接收的数据包进行过滤。这个功能也可用于经典 Berkeley Packet Filter(cBPF),但已扩展为支持 eBPF 程序。
  • 流解析器:启用将流分成单独的消息、过滤并将其重定向到套接字。
  • SO_REUSEPORT 套接字选择:对来自 reuseport 套接字组的接收套接字提供可编程选择。
  • 流程分析器:在某些情况下,启用覆盖内核解析数据包头的方式。
  • TCP 拥塞控制回调:启用实现一个自定义 TCP 拥塞控制算法。
  • 带有封装的路由: 允许创建自定义隧道封装。

XDP

您可以将 BPF_PROG_TYPE_XDP 类型的程序附加到网络接口。然后,在内核网络堆栈开始处理之前,内核会在接收的数据包上执行该程序。在某些情况下,这允许快速数据包转发,如快速数据包丢弃以防止分布式拒绝服务(DDoS)攻击,以及负载均衡场景的快速数据包重定向。

您还可以使用 XDP 进行不同类型的数据包监控和抽样。内核允许 XDP 程序修改数据包,并将其传送到内核网络堆栈进行进一步处理。

以下的 XDP 模式可用:

  • 原生(驱动程序)XDP:内核在数据包接收过程从最早可能的点执行程序。目前,内核无法解析数据包,因此无法使用内核提供的元数据。这个模式要求网络接口驱动程序支持 XDP,但并非所有驱动程序都支持这种原生模式。
  • 通用 XDP:内核网络栈在进程早期执行 XDP 程序。此时内核数据结构已被分配,数据包已被预先处理。如果数据包被丢弃或重定向,与原生模式相比,这需要大量开销。但是,通用模式不需要支持网络接口驱动,它可适用于所有网络接口。
  • Offloaded XDP:内核在网络接口而不是主机 CPU 上执行 XDP 程序。请注意,这需要特定的硬件,这个模式中只有某些 eBPF 功能可用。

在 OpenCLoudOS 上,使用 libxdp 库加载所有 XDP 程序。这个程序库启用系统控制的 XDP 使用。

注意,目前,XDP 程序有一些系统配置限制。例如:您必须禁用接收接口中某些硬件卸载功能。另外,并非所有功能都可用于支持原生模式的所有驱动程序。

在 OpenCLoudOS 中,仅在满足以下所有条件时才支持 XDP 特性:

  • 您可以在 AMD 或者 Intel 64 位构架中载入 XDP 程序。
  • 您可以使用 libxdp 库将程序加载到内核中。
  • XDP 程序不使用 XDP 硬件卸载。

另外,OpenCLoudOS 还提供以下使用 XDP 功能作为不受支持的技术预览:

  • 在 AMD 和 Intel 64 位以外的构架中载入 XDP 程序。请注意,libxdp 库不适用于 AMD 和 Intel 64 位的构架。
  • XDP 硬件卸载。

AF_XDP

使用过滤并将数据包重定向到给定的 AF_XDP 套接字的 XDP 程序,您可以使用 AF_XDP 协议系列中的一个或多个套接字,来快速将数据包从内核复制到用户空间。

在 OpenCLoudOS 中提供此特性,来作为一个不受支持的技术预览。

  • 流量控制 流量控制(tc)子系统提供以下 eBPF 程序类型:

    • BPF_PROG_TYPE_SCHED_CLS
    • BPF_PROG_TYPE_SCHED_ACT

    这些类型允许您在 eBPF 中编写自定义的 tc 分类器和 tc 操作。与 tc 生态系统的各个部分一起,这为强大的数据包处理提供了能力,是一些容器编排解决方案的核心部分。

    在大多数情况下,只有类符被使用,与 direct-action 标记一样,eBPF 分类器可以直接从同一 eBPF 程序执行操作。clsact 排队规程(qdisc)被设计为在入口端启用此功能。

    请注意,使用流解析器 eBPF 程序可能会影响其他 qdiscs 和 tc 分类器的操作,如 flower。

  • 套接字过滤器

    一些实用程序会使用或在过去使用了 classic Berkeley Packet Filter(cBPF)过滤套接字上接收到的数据包。例如,tcpdump 工具允许用户指定表达式,tcpdump 然后将它们转换为 cBPF 码。

    作为 cBPF 的替代方案,内核允许 BPF_PROG_TYPE_SOCKET_FILTER 类型的 eBPF 程序实现相同的目的。

  • 控制组群

    在 OpenCLoudOS 中,您可以使用多种 eBPF 程序,供您附加到 cgroup。当给定 cgroup 中的某个程序执行某个操作时,内核会执行这些程序。请注意,您只能使用 cgroups 版本 2。

    OpenCLoudOS 中提供以下与网络相关的 cgroup eBPF 程序:

    • BPF_PROG_TYPE_SOCK_OPS :内核对各种 TCP 事件调用该程序。程序可以调整内核 TCP 堆栈的行为,包括自定义 TCP 头选项等。
    • BPF_PROG_TYPE_CGROUP_SOCK_ADDR :在 connect 、bind、sendto、recvmsg、getpeername 和 getockname 操作过程中,内核调用该程序。该程序允许更改 IP 地址和端口。当您在 eBPF 中实现基于套接字的网络地址转换(NAT)时,这很有用。
    • BPF_PROG_TYPE_CGROUP_SOCKOPT :在 setockopt 和 getsockopt 过程中,内核调用该程序,并允许更改选项。
    • BPF_PROG_TYPE_CGROUP_SOCK :在套接字创建、套接字释放和绑定到地址的过程中,内核调用该程序。您可以使用这些程序来允许或拒绝操作,或者只检查套接字创建统计信息。
    • BPF_PROG_TYPE_CGROUP_SKB :该程序在入口和出口处过滤单个数据包,并可以接受或拒绝数据包。
    • BPF_PROG_TYPE_CGROUP_SYSCTL :该程序允许访问系统控制的过滤(sysctl)。
    • BPF_CGROUP_INET4_GETPEERNAME、BPF_CGROUP_INET6_GETPEERNAME、BPF_CGROUP_INET4_GETSOCKNAME 和 BPF_CGROUP_INET6_GETSOCKNAME: 使用这些程序,您可以覆盖 getockname 和 getername 系统调用的结果。当您在 eBPF 中实现基于套接字的网络地址转换(NAT)时,这很有用。
  • 流解析器(Stream Parser)

    流解析器对添加到特殊 eBPF 映射中的一组套接字进行操作。然后 eBPF 程序处理内核在那些套接字上接收或发送的数据包。

    OpenCLoudOS 中提供了以下流解析程序 eBPF 程序:

    • BPF_PROG_TYPE_SK_SKB :eBPF 程序将来自套接字的数据包解析为单独的消息,并指示内核丢弃这些消息或将其发送给组中的另一个套接字。
    • BPF_PROG_TYPE_SK_MSG :此程序过滤出口消息。eBPF 程序将数据包解析到单个信息中,并批准或拒绝它们。
  • SO_REUSEPORT 套接字选择

    使用这个套接字选项,您可以绑定多个套接字到相同的 IP 地址和端口。如果没有 eBPF,内核会根据连接散列选择接收套接字。有了 BPF_PROG_TYPE_SK_REUSEPORT 程序,接收套接字的选择是完全可编程的。

  • dissector 流程

    当内核需要处理数据包头,而不需要查看全部协议解码时,会对它们进行 剖析。例如,这会在 tc 子系统、多路径路由、绑定或者计算数据包哈希时发生。在这种情况下,内核解析数据包的标头,并使用数据包标头中的信息填充内部结构。您可以使用 BPF_PROG_TYPE_FLOW_DISSECTOR 程序替换此内部解析。请注意,您只能在 RHEL 的 eBPF 的 IPv4 和 IPv6 上分离 TCP 和 UDP。

  • TCP 阻塞控制

    您可以使用一组实现 struct tcp_congestion_oops 回调的 BPF_PROG_TYPE_STRUCT_OPS 程序来编写一个自定义的 TCP 阻塞控制算法。以这种方式实现的算法和内置的内核算法一起可提供给系统使用。

  • 带有封装的路由

    您可以将以下 eBPF 程序类型之一附加到路由表中作为隧道封装属性的路由:

    • BPF_PROG_TYPE_LWT_IN
    • BPF_PROG_TYPE_LWT_OUT
    • BPF_PROG_TYPE_LWT_XMIT

    这样的 eBPF 程序的功能仅限于特定的隧道配置,它不允许创建通用封装或封装解决方案。

  • 套接字查找

    要绕过 bind 系统调用的限制,请使用 BPF_PROG_TYPE_SK_LOOKUP 类型的 eBPF 程序。此类程序可以为新传入的 TCP 连接选择侦听套接字,或为 UDP 数据包选择一个未连接的套接字。

55.2. 按网卡的 XDP 特性概述

以下是启用了 XDP 的网卡和您可以使用的 XDP 特性的概述:

网卡 驱动 基本的 重定向 目标 HW 卸载 零复制
Amazon 弹性网络适配卡 ena
Broadcom NetXtreme-C/E 10/25/40/50 千兆以太网 bnxt_en 是 [a] [b]
Cavium Thunder 虚拟功能 nicvf
Intel® 以太网控制器 XL710 系列 i40e 是 [a] [b]
Intel® 以太网连接 E800 系列 Ice 是 [a] [b]
Intel® PCI Express 千兆适配卡 igb 是 [a]
Intel® 10GbE PCI Express 适配卡 ixgbe 是 [a] [b]
Intel® 10GbE PCI Express 虚拟功能以太网 ixgbevf
Mellanox Technologies 1/10/40Gbit 以太网 mlx4_en
Mellanox 第 5 代网络适配卡(ConnectX 系列) mlx5_core 是 [b]
Netronome® NFP4000/NFP6000 NIC nfp
QLogic QED 25/40/100Gb 以太网 NIC qede
Solarflare SFC9000/SFC9100/EF100-系列 sfc 是 [b]
Microsoft Hyper-V 虚拟网络 hv_netvsc
通用 TUN/TAP 设备 tun
虚拟以太网对设备 veth
QEMU Virtio 网络 virtio_net 是 [a] [b]
***

[a] 只有在接口上加载 XDP 程序时。

[b] 需要分配一些大于或等于最大 CPU 索引的 XDP TX 队列。


联想:

  • 基本的:支持基本的返回代码:DROP、PASS、ABORTED 和 TX。
  • 重定向:支持 REDIRECT 返回码。
  • 目标:可以是 REDIRECT 返回码的目标。
  • HW 卸载:支持 XDP 硬件卸载。
  • 零复制:支持 AF_XDP 协议系列的零复制模式。

第55章 使用 BPF 编译器集合进行网络追踪

本章解释了 BPF 编译器集合(BCC)是什么,如何安装 BCC,以及如何使用 bcc-tools 软件包提供的预创建的脚本来执行不同的网络追踪操作。所有这些脚本都支持 --ebpf 参数,来显示工具上传到内核的 eBPF 代码。您可以使用这些代码了解更多有关编写 eBPF 脚本的信息。

55.1.BCC 介绍

BPF Compiler Collection(BCC)是一个库,可帮助创建扩展的 Berkeley Packet Filter(eBPF)程序。eBPF 程序的主要工具是在不需要额外的开销或存在安全问题的情况下,分析操作系统性能和网络性能。

BCC 不再需要用户了解 eBPF 的技术详情,并提供了许多开箱即用的工具,如带有预先创建的 eBPF 程序的 bcc-tools 软件包。

eBPF 程序会在事件中触发,如磁盘 I/O、TCP 连接以及进程创建。程序不太可能导致内核崩溃、循环或者变得无响应,因为它们在内核的安全性虚拟机中运行。

55.2.安装 bcc-tools 软件包

本节论述了如何安装 bcc-tools 软件包,该软件包还会将 BPF Compiler Collection (BCC) 库作为依赖项安装。

流程

  1. 安装 bcc-tools :

    # yum install bcc-tools
    
    BCC 工具安装在 /usr/share/bcc/tools/ 目录中。

  2. (可选)检查工具:

    # ll /usr/share/bcc/tools/
    ...
    -rwxr-xr-x. 1 root root  4198 Dec 14 17:53 dcsnoop
    -rwxr-xr-x. 1 root root  3931 Dec 14 17:53 dcstat
    -rwxr-xr-x. 1 root root 20040 Dec 14 17:53 deadlock_detector
    -rw-r--r--. 1 root root  7105 Dec 14 17:53 deadlock_detector.c
    drwxr-xr-x. 3 root root  8192 Mar 11 10:28 doc
    -rwxr-xr-x. 1 root root  7588 Dec 14 17:53 execsnoop
    -rwxr-xr-x. 1 root root  6373 Dec 14 17:53 ext4dist
    -rwxr-xr-x. 1 root root 10401 Dec 14 17:53 ext4slower
    ...
    
    上表中的 doc 目录包含每个工具的文档。

55.3.显示添加到内核的接受队列中的 TCP 连接

内核在 TCP 3 向握手中接收 ACK 数据包后,内核会将来自 SYN 队列的连接移到 accept 队列,直到连接的状态变为 ESTABLISHED。因此,只有成功的 TCP 连接才能在此队列中看到。

tcpaccept 工具使用 eBPF 特性显示内核添加到 accept 队列的所有连接。该工具是轻量级的,因为它跟踪内核的 accept() 函数,而不是捕获和过滤数据包。例如,使用 tcpaccept 进行常规故障排除,来显示服务器已接受的新连接。

流程

  1. 输入以下命令来启动对内核 accept 队列的追踪:

    # /usr/share/bcc/tools/tcpaccept
    PID   COMM      IP RADDR         RPORT  LADDR    LPORT
    843   sshd      4  192.0.2.17    50598  192.0.2.1  22
    1107  ns-slapd  4  198.51.100.6  38772  192.0.2.1  389
    1107  ns-slapd  4  203.0.113.85  38774  192.0.2.1  389
    ...
    
    每次内核接受一个连接时,tcpaccept 都会显示连接的详情。

  2. 按 Ctrl+C 停止追踪过程。

56.4.追踪出去的 TCP 连接尝试

tcpconnect 工具使用 eBPF 特性来跟踪出去的 TCP 连接尝试。该工具的输出还包括失败的连接。

tcpconnect 工具是轻量级的,因为它只跟踪内核的 connect() 函数,而不是捕获和过滤数据包。

流程

  1. 输入以下命令启动显示所有传出连接的追踪过程:

    # /usr/share/bcc/tools/tcpconnect
    PID    COMM         IP SADDR      DADDR          DPORT
    31346  curl         4  192.0.2.1  198.51.100.16  80
    31348  telnet       4  192.0.2.1  203.0.113.231  23
    31361  isc-worker00 4  192.0.2.1  192.0.2.254    53
    ...
    
    每次内核处理一个出去的连接时,tcpconnect 都会显示连接的详情。

  2. 按 Ctrl+C 停止追踪过程。

55.5.测量出站 TCP 连接的延迟

TCP 连接延迟是建立连接所需的时间。这通常涉及内核 TCP/IP 处理和网络往返时间,而不是应用程序运行时。

tcpconnlat 工具使用 eBPF 特性来测量发送 SYN 数据包和接收响应数据包之间的时间。

流程

  1. 开始测量出站连接的延迟:

    # /usr/share/bcc/tools/tcpconnlat
    PID    COMM         IP SADDR      DADDR          DPORT LAT(ms)
    32151  isc-worker00 4  192.0.2.1  192.0.2.254    53    0.60
    32155  ssh          4  192.0.2.1  203.0.113.190  22    26.34
    32319  curl         4  192.0.2.1  198.51.100.59  443   188.96
    ...
    
    每次内核处理一个出去的连接时,tcpconnlat 都会在内核接收响应数据包后显示连接的详细信息。

  2. 按 Ctrl+C 停止追踪过程。

55.6.显示被内核丢弃的 TCP 数据包和片段详情

tcpdrop 工具使管理员能够显示内核所丢弃的 TCP 数据包和段的详情。使用这个实用程序调试丢弃数据包的高速率,以便远程系统发送基于计时器的重新传输。释放数据包和片段的高速率可能会影响服务器的性能。

tcpdrop 工具使用 eBPF 特性,而不是捕获和过滤资源密集型的数据包,来直接从内核检索信息。

流程

  1. 输入以下命令来显示丢弃 TCP 数据包和片段详情:

    # /usr/share/bcc/tools/tcpdrop
    TIME     PID    IP SADDR:SPORT       > DADDR:DPORT   STATE (FLAGS)
    13:28:39 32253  4  192.0.2.85:51616  > 192.0.2.1:22  CLOSE_WAIT (FIN|ACK)
        b'tcp_drop+0x1'
        b'tcp_data_queue+0x2b9'
        ...
    
    13:28:39 1      4  192.0.2.85:51616  > 192.0.2.1:22   CLOSE (ACK)
        b'tcp_drop+0x1'
        b'tcp_rcv_state_process+0xe2'
        ...
    
    每次内核丢弃 TCP 数据包和段时,tcpdrop 都会显示连接的详情,包括导致软件包丢弃的内核堆栈追踪。

  2. 按 Ctrl+C 停止追踪过程。

55.7.追踪 TCP 会话

tcplife 工具使用 eBPF 跟踪打开和关闭的 TCP 会话,并打印一行输出来总结每一个会话。管理员可以使用 tcplife 来识别连接和传输的流量数。

本节中的示例描述了如何显示到端口 22 (SSH)的连接,以检索以下信息:

  • 本地进程 ID(PID)
  • 本地进程名称
  • 本地 IP 地址和端口号
  • 远程 IP 地址和端口号
  • 接收和传输的流量的数量(以 KB 为单位)。
  • 连接处于活跃状态的时间(毫秒)

流程

  1. 输入以下命令来开始追踪到本地端口 22 的连接:

    /usr/share/bcc/tools/tcplife -L 22
    PID   COMM    LADDR      LPORT RADDR       RPORT TX_KB  RX_KB      MS
    19392 sshd    192.0.2.1  22    192.0.2.17  43892    53     52 6681.95
    19431 sshd    192.0.2.1  22    192.0.2.245 43902    81 249381 7585.09
    19487 sshd    192.0.2.1  22    192.0.2.121 43970  6998     7 16740.35
    ...
    
    每次关闭连接时,tcplife 都会显示连接的详情。

  2. 按 Ctrl+C 停止追踪过程。

55.8.追踪 TCP 重新传输

tcpretrans 工具显示有关 TCP 重新传输的详细信息,如本地和远程的 IP 地址和端口号,以及重新传输时 TCP 的状态。

该工具使用 eBPF 功能,因此开销非常低。

流程

  1. 使用以下命令来显示 TCP 重新传输详情:

    # /usr/share/bcc/tools/tcpretrans
    TIME     PID  IP LADDR:LPORT   T> RADDR:RPORT         STATE
    00:23:02 0    4  192.0.2.1:22  R> 198.51.100.0:26788  ESTABLISHED
    00:23:02 0    4  192.0.2.1:22  R> 198.51.100.0:26788  ESTABLISHED
    00:45:43 0    4  192.0.2.1:22  R> 198.51.100.0:17634  ESTABLISHED
    ...
    
    每次内核调用 TCP 重新传输函数时,tcpretrans 都会显示连接的详情。

  2. 按 Ctrl+C 停止追踪过程。

55.9.显示 TCP 状态更改信息

在 TCP 会话中,TCP 状态会改变。tcpstates 工具使用 eBPF 功能跟踪这些状态变化,并打印包括每个状态持续时间的详细信息。例如,使用 tcpstates 来确定连接是否在初始化状态中花费了太多时间。

流程

  1. 使用以下命令开始追踪 TCP 状态更改:

    # /usr/share/bcc/tools/tcpstates
    SKADDR           C-PID C-COMM     LADDR     LPORT RADDR       RPORT OLDSTATE    -> NEWSTATE    MS
    ffff9cd377b3af80 0     swapper/1  0.0.0.0   22    0.0.0.0     0     LISTEN      -> SYN_RECV    0.000
    ffff9cd377b3af80 0     swapper/1  192.0.2.1 22    192.0.2.45  53152 SYN_RECV    -> ESTABLISHED 0.067
    ffff9cd377b3af80 818   sssd_nss   192.0.2.1 22    192.0.2.45  53152 ESTABLISHED -> CLOSE_WAIT  65636.773
    ffff9cd377b3af80 1432  sshd       192.0.2.1 22    192.0.2.45  53152 CLOSE_WAIT  -> LAST_ACK    24.409
    ffff9cd377b3af80 1267  pulseaudio 192.0.2.1 22    192.0.2.45  53152 LAST_ACK    -> CLOSE       0.376
    ...
    
    每次连接改变其状态时,tcpstates 都会显示一个新行,其中包含更新的连接详情。 如果多个连接同时改变了其状态,请使用第一列中的套接字地址(SKADDR)来确定哪些条目属于同一个连接。

  2. 按 Ctrl+C 停止追踪过程。

55.10. 聚合发送到特定子网的 TCP 流量

tcpsubnet 工具汇总并合计了本地主机发往子网的 IPv4 TCP 流量,并按固定间隔显示输出。该工具使用 eBPF 功能来收集并总结数据,以减少开销。

默认情况下,tcpsubnet 为以下子网汇总流量:

  • 127.0.0.1/32
  • 10.0.0.0/8
  • 172.16.0.0/12
  • 192.0.2.0/24/16
  • 0.0.0.0/0

请注意,最后一个子网(0.0.0.0/0)是一个全包括选项。tcpsubnet 工具计算与这个全包括条目中前四个不同的子网的所有流量。

按照以下流程计算 192.0.2.0/24 和 198.51.100.0/24 子网的流量。到其他子网的流量将在 0.0.0.0/0 全包括子网条目中跟踪。

流程

  1. 开始监控发送到 192.0.2.0/24、198.51.100.0/24 以及其他子网的流量数:

    # /usr/share/bcc/tools/tcpsubnet 192.0.2.0/24,198.51.100.0/24,0.0.0.0/0
    Tracing... Output every 1 secs. Hit Ctrl-C to end
    [02/21/20 10:04:50]
    192.0.2.0/24           856
    198.51.100.0/24       7467
    [02/21/20 10:04:51]
    192.0.2.0/24          1200
    198.51.100.0/24       8763
    0.0.0.0/0              673
    ...
    
    这个命令以字节为单位显示指定子网每秒一次的流量。

  2. 按 Ctrl+C 停止追踪过程。

55.11.通过 IP 地址和端口显示网络吞吐量

tcptop 工具以 KB 为单位显示主机发送并接收的 TCP 流量。这个报告会自动刷新并只包含活跃的 TCP 连接。该工具使用 eBPF 功能,因此开销非常低。

流程

  1. 要监控发送和接收的流量,请输入:

    # /usr/share/bcc/tools/tcptop
    13:46:29 loadavg: 0.10 0.03 0.01 1/215 3875
    
    PID    COMM         LADDR           RADDR              RX_KB   TX_KB
    3853   3853         192.0.2.1:22    192.0.2.165:41838  32     102626
    1285   sshd         192.0.2.1:22    192.0.2.45:39240   0           0
    ...
    
    命令的输出只包括活跃的 TCP 连接。如果本地或者远程系统关闭了连接,则该连接在输出中不再可见。

  2. 按 Ctrl+C 停止追踪过程。

55.12.追踪已建立的 TCP 连接

tcptracer 工具跟踪连接、接受和关闭 TCP 连接的内核函数。该工具使用 eBPF 功能,因此开销非常低。

流程

  1. 使用以下命令启动追踪过程:

    # /usr/share/bcc/tools/tcptracer
    Tracing TCP established connections. Ctrl-C to end.
    T  PID    COMM        IP SADDR        DADDR       SPORT  DPORT
    A  1088   ns-slapd    4  192.0.2.153  192.0.2.1   0      65535
    A  845    sshd        4  192.0.2.1    192.0.2.67  22     42302
    X  4502   sshd        4  192.0.2.1    192.0.2.67  22     42302
    ...
    
    每当内核连接、接受或关闭连接时,tcptracer 都会显示连接的详情。

  2. 按 Ctrl+C 停止追踪过程。

55.13.追踪 IPv4 和 IPv6 侦听请求

solisten 工具追踪所有 IPv4 和 IPv6 侦听请求。它跟踪监听请求,包括最终失败或者不接受连接的监听程序。当程序要侦听 TCP 连接时,程序会追踪内核调用的功能。

流程

  1. 输入以下命令启动显示所有监听 TCP 尝试的追踪过程:

    # /usr/share/bcc/tools/solisten
    PID    COMM           PROTO         BACKLOG     PORT     ADDR
    3643   nc             TCPv4         1           4242     0.0.0.0
    3659   nc             TCPv6         1           4242     2001:db8:1::1
    4221   redis-server   TCPv6         128         6379     ::
    4221   redis-server   TCPv4         128         6379     0.0.0.0
    ....
    
  2. 按 Ctrl+C 停止追踪过程。

55.14.软中断的服务时间概述

softirqs 工具总结了服务软中断(soft IRQ)所花费的时间,并将这个时间显示为总计或直方图分布。这个工具使用 irq:softirq_enter 和 irq:softirq_exit 内核追踪点,是一个稳定的追踪机制。

流程

  1. 输入以下命令启动追踪 soft irq 事件时间:

    # /usr/share/bcc/tools/softirqs
    Tracing soft irq event time... Hit Ctrl-C to end.
    ^C
    SOFTIRQ          TOTAL_usecs
    tasklet                  166
    block                   9152
    net_rx                 12829
    rcu                    53140
    sched                 182360
    timer                 306256
    
  2. 按 Ctrl+C 停止追踪过程。

第56章 TIPC入门

透明进程间通信(TIPC)(也称为 集群域套接字)是用于集群范围操作的进程间通信(IPC)服务。

在高可用性和动态集群环境中运行的应用程序有特殊需要。集群中的节点数量可能会有所不同,路由器可能会失败,且出于负载均衡的考虑,功能也可以移到集群中的不同节点。TIPC 可最大程度降低应用程序开发人员处理此类问题的工作,并尽可能以正确和最佳的方式处理它们。另外,TIPC 比一般协议(如 TCP)提供效率更高且容错的通讯。

56.1. TIPC 的构架

TIPC 是使用 TIPC 和数据包传输服务(bearer)的应用程序之间的一个层,横跨传输层、网络层和信令链路层。然而,TIPC 可以使用不同的传输协议作为 bearer,这样 TCP 连接就可以充当 TIPC 信号连接的 bearer。

TIPC 支持以下 bearer:

  • Ethernet
  • InfiniBand
  • UDP 协议

TIPC 提供了在 TIPC 端口间可靠传送信息,这是所有 TIPC 通讯的端点。

以下是 TIPC 构架图: TIPC

56.2.系统引导时载入 tipc 模块

在使用 TIPC 协议前,请加载 tipc 内核模块。本节介绍如何在系统引导时配置 OpenCloudOS 自动载入这个模块。

流程

  1. 使用以下内容创建 /etc/modules-load.d/tipc.conf 文件:

    tipc
    
  2. 重启 systemd-modules-load 服务,以在不重启系统的情况下加载模块:

    # systemctl start systemd-modules-load
    

验证

  • 使用以下命令验证 RHEL 是否已载入 tipc 模块:

    # lsmod | grep tipc
    tipc    311296  0
    

如果命令没有显示 tipc 模块的条目,则说明 OpenCloudOS 没有加载它。

56.3.创建 TIPC 网络

注意,以下命令只临时配置 TIPC 网络。要在节点上永久配置 TIPC,在脚本中使用此流程的命令,并将 OpenCloudOS 配置为在系统引导时执行该脚本。

前提条件

  • tipc 模块已加载。

流程

  1. 可选:设置一个唯一的节点身份,如 UUID 或节点的主机名:

    # tipc node set identity host_name
    
    身份可以是任何由最多 16 个字母和数字组成的唯一字符串。 您不能在此步骤后设置或改变身份。

  2. 添加一个 bearer。例如,要将 Ethernet 用作介质,并将 enp0s1 设备用作物理 bearer 设备,请输入:

    # tipc bearer enable media eth device enp1s0
    
  3. 可选: 要获得冗余和更好的性能,请使用上一步中的命令附加更多 bearer。您可以配置最多三个 bearer,但在同一介质上不能超过两个。

  4. 在应该加入 TIPC 网络的每个节点中重复前面的所有步骤。

验证

  1. 显示集群成员的链接状态:

    # tipc link list
    broadcast-link: up
    5254006b74be:enp1s0-525400df55d1:enp1s0: up
    
    此输出表示,节点 5254006b74be 上的 bearer enp1s0 和节点 525400df55d1 上的 bearer enp1s0 之间的链接为 up。

  2. 显示 TIPC 发布表:

    # tipc nametable show
    Type       Lower      Upper      Scope    Port       Node
    0          1795222054 1795222054 cluster  0          5254006b74be
    0          3741353223 3741353223 cluster  0          525400df55d1
    1          1          1          node     2399405586 5254006b74be
    2          3741353223 3741353223 node     0          5254006b74be
    
    服务类型为 0 的两个条目表示两个节点是这个集群的成员。 服务类型为 1 的条目代表内置的拓扑服务跟踪服务。 服务类型为 2 的条目显示从发布节点看到的链接。范围限制 3741353223 代表十进制格式表示的对等端点的地址(基于节点身份的唯一 32 位哈希值)。

第57章 使用 nm-cloud-setup 在公有云中自动配置网络接口

通常,虚拟机(VM)只有一个可由 DHCP 配置的接口。但是,一些虚拟机在一个无法由 DHCP 配置的接口中可能有多个网络接口、IP 地址和 IP 子网。另外,管理员可以在机器运行时重新配置网络。nm-cloud-setup 工具从云服务提供商的元数据服务器自动检索配置信息,并更新公有云中虚拟机的网络配置。

57.1.配置和预部署 nm-cloud-setup

要在公有云中启用和配置网络接口,请运行 nm-cloud-setup 作为计时器和服务。以下流程描述了如何对 Amazon EC2 使用 nm-cloud-setup 。

前提条件

  • 存在网络连接。
  • 连接使用 DHCP。 默认情况下,NetworkManager 会创建一个使用 DHCP 的连接配置文件。如果因为您在 /etc/NetworkManager/NetworkManager.conf 中设置了 no-auto-default 参数而没有创建配置文件,请手动创建此初始连接。

流程

  1. 安装 nm-cloud-setup 软件包:

    # yum install NetworkManager-cloud-setup
    
  2. 为 nm-cloud-setup 服务创建并运行 管理单元文件:

    1. 使用以下命令开始编辑管理单元文件:

      # systemctl edit nm-cloud-setup.service
      
      显式启动服务或重启系统,以使配置设置生效,这点非常重要的。

    2. 使用 systemd 管理单元文件来在 nm-cloud-setup 中配置云提供商。例如,要使用 Amazon EC2,请输入:

      [Service]
      Environment=NM_CLOUD_SETUP_EC2=yes
      
      您可以设置以下环境变量来启用您所使用的云提供商: - 用于 Microsoft Azure 的 NM_CLOUD_SETUP_AZURE - 用于 Amazon EC2(AWS)的 NM_CLOUD_SETUP_EC2 - 用于 Google Cloud Platform(GCP)的 NM_CLOUD_SETUP_GCP - 用于 Alibaba Cloud (Aliyun) 的 NM_CLOUD_SETUP_ALIYUN

    3. 保存文件并退出编辑器。

  3. 重新载入 systemd 配置:

    # systemctl daemon-reload
    
  4. 启用并启动 nm-cloud-setup 服务:

    # systemctl enable --now nm-cloud-setup.service
    
  5. 启用并启动 nm-cloud-setup 计时器:

    # systemctl enable --now nm-cloud-setup.timer