Red Hat Training

A Red Hat training course is available for RHEL 8

配置和管理网络

Red Hat Enterprise Linux 8

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

Red Hat Customer Content Services

摘要

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

使开源包含更多

红帽承诺替换我们的代码、文档和网页属性中存在问题的语言。我们从这四个术语开始: master、slave、blacklist 和 whitelist。这些更改将在即将发行的几个发行本中逐渐实施。如需了解更多详细信息,请参阅 CTO Chris Wright 信息

对红帽文档提供反馈

我们感谢您对文档提供反馈信息。请让我们了解如何改进文档。要做到这一点:

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

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

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

第 1 章 一般 RHEL 网络主题

本节详细介绍了一般网络主题。

1.1. IP 网络和非 IP 网络之间的区别

网络是可沟通共享信息和资源的设备系统,比如文件、打印机、应用程序以及互联网连接。每个设备都有唯一的 IP 地址,可使用一组叫协议的规则在两个或者多个设备间发送和接收信息。

网络通信的类型:

IP 网络
通过 IP 地址通信的网络。IP 网络是在互联网和大多数内部网络中实现的。以太网、无线网络和 VPN 连接是典型的示例。
非 IP 网络
用于通过较低层而不是传输层进行沟通的网络。请注意这些网络很少被使用。例如,Infiniband 是一个非 IP 网络。

1.2. 静态和动态 IP 地址之间的区别

静态 IP 地址

当您为某个设备分配静态 IP 地址时,该地址不会随时间变化,除非您手动更改该地址。如果您要使用静态 IP 地址:

  • 确保 DNS 等服务器的网络地址一致性以及验证服务器。
  • 使用独立于其他网络基础结构的带外管理设备。
动态 IP 地址

当您将设备配置为使用动态 IP 地址时,该地址会随时更改。因此,动态地址通常用于偶尔连接到网络的设备,因为重启主机后 IP 地址可能会不同。

动态 IP 地址更为灵活,更容易设置和管理。动态主机控制协议(DHCP)是动态为主机分配网络配置的传统方法。

注意

没有严格的规则来定义何时使用静态或动态 IP 地址。它取决于用户的需求、喜好和网络环境。

其它资源

有关设置 DHCP 服务器的详情,请参考 第 45 章 提供 DHCP 服务

1.3. DHCP 的阶段

DHCP 分为四个阶段: Discovery、Offer、Request、Afirmledgement(也称为 DORA 进程)。DHCP 使用这个过程为客户端提供 IP 地址。

Discovery(发现)

DHCP 客户端发送一条信息来发现网络中 DHCP 服务器。这个消息在网络和数据链路层广播。

Offer(提供)

DHCP 服务器从客户端接收信息,并为 DHCP 客户端提供 IP 地址。这个消息在数据链路层单播,但在网络层广播。

Request(请求)

DHCP 客户端为提供的 IP 地址请求 DHCP 服务器。这个消息在数据链路层单播,但在网络层广播。

Acknowledgment(承认)

DHCP 服务器向 DHCP 客户端发送承认信息。这个消息在数据链路层单播,但在网络层广播。它是 DHCP DORA 进程的最后一个信息。

1.4. InfiniBand 和 RDMA 网络

有关 InfiniBand 和 Remote Direct Memory Access(RDMA)网络的详情,请参考 配置 InfiniBand 和 RDMA 网络文档

1.5. RHEL 中的旧网络脚本支持

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

然而,如果您需要在不使用 NetworkManager 的情况下使用弃用的网络脚本处理网络配置,您可以安装它们:

# yum install network-scripts

安装旧的网络脚本后,/usr/sbin/ifup/usr/sbin/ifdown 脚本链接到管理网络配置的已弃用 shell 脚本。

重要

旧脚本在 RHEL 8 中已弃用,并将在以后的 RHEL 主要版本中被删除。如果您仍然使用旧的网络脚本,例如,因为您从较早的版本升级到 RHEL 8,红帽建议将您的配置迁移至 NetworkManager。

1.6. 选择网络配置方法

  • 要使用 NetworkManager 配置网络接口,请使用以下工具之一:

    • 文本用户界面 nmtui
    • 命令行工具 nmcli
    • 图形用户界面工具 GNOME GUI
  • 在不使用 NetworkManager 工具和应用程序的情况下配置网络接口:

    • 手动编辑 ifcfg 文件。请注意,即使您直接手动编辑文件,RHEL 仍默认使用 NetworkManager 来处理这些文件。只有在安装并启用了弃用的旧网络脚步后,这些脚本才会处理 ifcfg 文件。
  • 在 root 文件系统不在本地的情况下配置网络设置:

    • 使用内核命令行。

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

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

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

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

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

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

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

方案描述示例

1

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

eno1

2

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

ens1

3

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

enp2s0

4

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

enx525400d5e0fb

5

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

eth0

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

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

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

默认情况下在 Red Hat Enterprise Linux 8 中启用了一致的设备命名。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- 内部变量中设置属性,这些属性将在下一步中处理。请注意,其中一些属性可能没有定义。
  4. /usr/lib/udev/rules.d/80-net-setup-link.rules 文件调用 net_setup_link udev 内置,然后应用该策略。以下是存储在 /usr/lib/systemd/network/99-default.link 文件中的默认策略:

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

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

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

  5. /usr/lib/udev/rules.d/80-net-setup-link.rules 文件定义 udev 根据以下顺序基于 udev 内部参数重新命名接口:

    1. ID_NET_NAME_ONBOARD
    2. ID_NET_NAME_SLOT
    3. ID_NET_NAME_PATH

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

第 3 步和 4 实现了 第 2.1 节 “网络接口设备命名等级” 所述的命名方案 1 到 4。

其它资源

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

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

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

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

另外,下面的一项会附加到以上其中一个前缀中,该前缀根据 udev 设备管理器采用的 schema 附加:

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

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

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

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

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

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

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

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

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

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

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

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

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

警告

红帽建议不要禁用一致的设备命名。禁用一致的设备命名可能会导致不同类型的问题。例如:如果您在系统中添加了另一个网卡,则分配的内核设备名称(例如,eth0)不再是固定的。因此,重启后内核可以以不同的方式为该设备命名。

流程

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

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

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

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

警告

红帽建议不要禁用一致的设备命名。禁用一致的设备命名可能会导致不同类型的问题。例如:如果您在系统中添加了另一个网卡,则分配的内核设备名称(例如,eth0)不再是固定的。因此,重启后内核可以以不同的方式为该设备命名。

先决条件

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

流程

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

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

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

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

      # grub2-mkconfig -o /boot/grub2/grub.cfg
  3. 如果在配置文件或脚本中使用接口名称,则必须手动更新它们。
  4. 重启主机:

    # reboot

2.7. 使用 prefixdevname 命名以太网网络接口

本文档描述了在不需要使用这些接口的默认命名方案时,如何设置前缀以便以太网网络接口提供一直性的命名。但是,红帽建议使用默认命名方案。有关这个方案的详情请参考 第 2 章 一致的网络接口设备命名

2.7.1. prefixdevname 简介

prefixdevname 工具是 udev 帮助程序程序,可让您定义您自己用来命名以太网网络接口的前缀。

2.7.2. prefixdevname 的限制

以太网网络接口前缀有一些限制。

您选择的前缀必须满足以下要求:

  • 必须是 ASCII 字符串
  • 必须是字母数字字符串
  • 少于 16 个字符
警告

该前缀不能与用于 Linux 上网络接口命名的任何其他已知的前缀冲突。特别是,您不能使用这些前缀: ethenoensem

2.7.3. 设置 prefixdevname

使用 prefixdevname 的前缀设置是在系统安装过程中完成的。

要为您的以太网网络接口设置和激活所需前缀,请使用以下步骤。

流程

  • 在内核命令行中添加以下字符串:

    net.ifnames.prefix=<required prefix>
警告

红帽不支持在已部署的系统中使用 prefixdevname

设定了前缀后,操作系统重启后,前缀在每次出现新网络接口时都有效。为这个新设备分配一个名称,格式为 <PREFIX><INDEX>。例如,如果您选择的前缀是 net,系统中也有 net0net1 前缀的接口,新接口名为 net2。然后 prefixdevname 工具会在 /etc/systemd/network 目录中生成新的 .link 文件,该文件将名称应用到刚刚出现的 MAC 地址的接口。配置在重启后会保留。

第 3 章 NetworkManager 入门

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

3.1. 使用 NetworkManager 的好处

使用 NetworkManager 的主要优点是:

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

其它资源

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

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

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

3.3. 使用 NetworkManager 分配程序脚本

默认情况下, /etc/NetworkManager/dispatcher.d/ 目录存在,NetworkManager 会以字母顺序运行脚本。每个脚本都必须为 root 拥有的 可执行文件,且只有文件所有者才有 write permission 权限。

注意

网络管理器(NetworkManager)以字母顺序执行 /etc/NetworkManager/dispatcher.d/ 分配程序脚本。

其它资源

3.4. 将手动创建的 ifcfg 文件加载到 NetworkManager 中

在 Red Hat Enterprise Linux 8 中,如果您编辑了 ifcfg 文件,网络管理器(NetworkManager) 不会自动意识到这个变化,需要被告知才可以看到相关的更改。如果您使用其中一个工具更新 NetworkManager 配置集设置,NetworkManager 不会实现这些更改,除非您使用该配置集重新连接。例如,如果使用编辑器修改了配置文件,NetworkManager 必须再次读取配置文件。

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

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

注意

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

如果您需要旧的网络脚本来管理网络设置,您可以手动安装它们。详情请查看 第 1.5 节 “RHEL 中的旧网络脚本支持”。但请注意,旧版网络脚本已弃用,并将在以后的 RHEL 版本中删除。

流程

  1. 要载入新的配置文件:

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

    # nmcli connection up connection_name

其它资源

  • NetworkManager(8) man page - 描述网络管理守护进程。
  • NetworkManager.conf(5) man page - 描述 NetworkManager 配置文件。
  • /usr/share/doc/initscripts/sysconfig.txt - 描述 ifcfg 文件,它们的指令可以被旧网络服务理解。
  • ifcfg(8) man page - 简单地描述 ifcfg 命令。

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

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

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

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

要临时将网络设备配置为 unmanaged,请查看 第 4.2 节 “将设备临时配置为在 NetworkManager 中不被管理”

流程

  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)不管理该设备。

其它资源

  • 有关可用来将设备配置为非受管以及对应语法的标准列表,请查看 NetworkManager.conf(5) man page 中的 Device List Format 部分。

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

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

可以使用这个方法用于特定目的,如测试。要永久将网络设备配置为 unmanaged,请参阅 第 4.1 节 “永久将设备配置为网络管理器(NetworkManager)中非受管设备”

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

流程

  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)不管理该设备。

其它资源

  • 有关可用来将设备配置为非受管以及对应语法的标准列表,请查看 NetworkManager.conf(5) man page 中的 Device List Format 部分。

第 5 章 nmtui 入门

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

注意

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

5.1. 启动 nmtui 工具

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

先决条件

  • 已安装 NetworkManager-tui 软件包。

流程

  1. 要启动 nmtui,输入:

    # nmtui
    nmtui 选择一个选项
  2. 导航:

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

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

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

先决条件

  • 已安装 NetworkManager-tui 软件包。

流程

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

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

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

验证步骤

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

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

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

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

    其它资源

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

nmtui 中修改了连接后,您必须重新激活连接。请注意,在 nmtui 中重新激活连接会暂时取消激活连接。

流程

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

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

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

    nmtui 激活修改的连接

第 6 章 nmcli 入门

本节描述了有关 nmcli 工具的一般信息。

6.1. nmcli 输出格式的不同

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

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

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

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

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

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

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

如果使用脚步来处理输出时,可以使用 -f-t 的组合来只显示特定字段(以冒号分隔不同字段):

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

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

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

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

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

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

6.3. 频繁使用的 nmcli 命令

下面是一个经常使用的 nmcli 命令的概述。

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

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

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

    # nmcli connection modify connection_name property value

    如果您将多个 property value 组合传递给命令,则可以使用单个命令来修改多个属性。

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

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

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

    # nmcli connection down connection_name

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

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

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

7.1. 使用 GNOME Shell 网络连接图标进行网络连接

如果使用 GNOME GUI,可以使用 GNOME Shell 网络连接图标进行网络连接。

先决条件

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

流程

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

    网络连接图标
  2. 根据连接类型,选择 WiredWi-Fi 条目。

    扩展网络连接图标
    • 对于有线连接,选择 Connect 以连接网络。
    • 对于 Wi-Fi 连接,击 Select network,选择您要连接的网络,然后输入密码。

第 8 章 Nmstate 简介

nmstate 是一个声明性网络管理器 API。nmstate 软件包提供 libnmstate Python 库以及一个命令行实用程序 nmstatectl,用于在 RHEL 上管理 NetworkManager。使用 Nmstate 时,您可以使用 YAML 或 JSON 格式说明描述预期的网络状态。

使用 Nmstate 有很多好处。例如,它:

  • 提供了一个稳定的、可扩展的接口来管理 RHEL 网络功能
  • 支持主机和集群级别的原子和事务操作
  • 支持部分编辑大多数属性,并保留没有在指令中指定的现有设置
  • 提供插件支持,以便管理员能够使用自己的插件

8.1. 在 Python 应用程序中使用 libnmstate 库

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

要使用该程序库,请将其导入您的源代码中:

import libnmstate

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

例 8.1. 使用 libnmstate 库查询网络状态

以下 Python 代码导入 libnmstate 库并显示可用网络接口及其状态:

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

8.2. 使用 nmstatectl 更新当前的网络配置

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

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

此流程描述了如何将 enp1s0 接口的设置导出到文件、修改配置以及将设置应用到主机。

先决条件

  • 已安装 nmstate 软件包。

流程

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

    # nmstatectl show enp1s0 > ~/network-config.yml

    此命令以 YAML 格式保存 enp1s0 配置。要以 JSON 格式存储输出,将 --json 选项传递给命令。

    如果您没有指定接口名称, nmstatectl 会导出所有接口的配置。

  2. 使用文本编辑器修改 ~/network-config.yml 文件以更新配置。
  3. 应用 ~/network-config.yml 文件中的设置:

    # nmstatectl set ~/network-config.yml

    如果您以 JSON 格式导出设置,将 --json 选项传递给命令。

8.3. 其它资源

  • 有关库和到上游文档链接的详情,如 API 文档,请参阅 /usr/share/doc/nmstate/README.md 文件。
  • 有关 YAML 格式的不同配置示例,请参阅 /usr/share/doc/nmstate/examples/ 目录。

第 9 章 配置以太网连接

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

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

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

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

流程

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

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

    额外步骤修改您创建的 Example-Connection 连接配置集。

  2. 设置 IPv4 地址:

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

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

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

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

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

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

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

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

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

验证步骤

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

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

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

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

      对于 IPv4:

      # ping 192.0.2.3

      对于 IPv6:

      # ping 2001:db8:2::1

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

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

      对于 IPv4:

      # ping 198.162.3.1

      对于 IPv6:

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

        对于 IPv4:

        # ping 192.0.2.254

        对于 IPv6:

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

    # host client.example.com

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

故障排除步骤

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

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

其它资源

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

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

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

流程

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

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

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

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

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

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

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

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

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

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

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

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

    nmcli> quit

验证步骤

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

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

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

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

      对于 IPv4:

      # ping 192.0.2.3

      对于 IPv6:

      # ping 2001:db8:2::1

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

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

      对于 IPv4:

      # ping 198.162.3.1

      对于 IPv6:

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

        对于 IPv4:

        # ping 192.0.2.254

        对于 IPv6:

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

    # host client.example.com

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

故障排除步骤

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

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

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

其它资源

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

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

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

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

此流程定义 YAML 格式的接口配置。另外,您还可以以 JSON 格式指定配置。

先决条件

  • 已安装 nmstate 软件包。

流程

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

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

    # nmstatectl set ~/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
    ...

其它资源

  • 有关详情请参考 nmstatectl nmstatectl(8) man page。
  • 如需更多配置示例,请参阅 /usr/share/doc/nmstate/examples/ 目录。

9.4. 使用 RHEL 系统角色配置静态以太网连接

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

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

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

先决条件

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

流程

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

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

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

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

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

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

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

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

其它资源

  • /usr/share/ansible/roles/rhel-system-roles.network/README.md file
  • ansible-playbook 命令,请查看 ansible-playbook(1) man page

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

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

先决条件

  • 网络中有 DHCP 服务器。

流程

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

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

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

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

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

验证步骤

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

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

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

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

      对于 IPv4:

      # ping 192.0.2.3

      对于 IPv6:

      # ping 2001:db8:2::1

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

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

      对于 IPv4:

      # ping 198.162.3.1

      对于 IPv6:

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

        对于 IPv4:

        # ping 192.0.2.254

        对于 IPv6:

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

    # host client.example.com

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

其它资源

  • 有关为 IPv6 设置客户端标识符的详情,请查看 dhclient(8) man page。
  • 有关连接配置集属性及其设置的详情,请查看 nm-settings(5) 手册页。
  • 有关 nmcli 工具程序的详情,请查看 nmcli(1) man page。
  • 如果磁盘中的配置与设备中的配置不匹配,则启动或重启 NetworkManager 会创建一个代表该设备的配置的内存连接。有关详情以及如何避免此问题,请参阅 NetworkManager 服务重启后复制连接

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

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

先决条件

  • 网络中有 DHCP 服务器。

流程

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

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

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

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

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

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

  5. 保存并激活连接:

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

    nmcli> quit

验证步骤

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

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

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

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

      对于 IPv4:

      # ping 192.0.2.3

      对于 IPv6:

      # ping 2001:db8:2::1

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

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

      对于 IPv4:

      # ping 198.162.3.1

      对于 IPv6:

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

        对于 IPv4:

        # ping 192.0.2.254

        对于 IPv6:

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

    # host client.example.com

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

其它资源

  • 有关为 IPv6 设置客户端标识符的详情,请查看 dhclient(8) man page。
  • 有关连接配置集属性及其设置的详情,请查看 nm-settings(5) 手册页。
  • 有关 nmcli 工具程序的详情,请查看 nmcli(1) man page。
  • 如果磁盘中的配置与设备中的配置不匹配,则启动或重启 NetworkManager 会创建一个代表该设备的配置的内存连接。有关详情以及如何避免此问题,请参阅 NetworkManager 服务重启后复制连接

9.7. 使用 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
        address: []
        auto-dns: true
        auto-gateway: true
        auto-routes: true
        dhcp: true
      ipv6:
        enabled: true
        address: []
        auto-dns: true
        auto-gateway: true
        auto-routes: true
        autoconf: true
        dhcp: true
  2. 将设置应用到系统:

    # nmstatectl set ~/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
    ...

其它资源

  • 有关详情请参考 nmstatectl nmstatectl(8) man page。
  • 如需更多配置示例,请参阅 /usr/share/doc/nmstate/examples/ 目录。

9.8. 使用 RHEL 系统角色配置动态以太网连接

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

先决条件

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

流程

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

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

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

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

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

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

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

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

其它资源

  • /usr/share/ansible/roles/rhel-system-roles.network/README.md file
  • ansible-playbook(1) man page

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

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

请注意,control-center 不支持 nm-connection-editor 应用程序或 nmcli 实用程序。

先决条件

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

流程

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

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

    IPv6 设置控制中心
  7. 点击 添加 按钮保存连接。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:2::1

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

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

      对于 IPv4:

      # ping 198.162.3.1

      对于 IPv6:

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

        对于 IPv4:

        # ping 192.0.2.254

        对于 IPv6:

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

    # host client.example.com

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

故障排除步骤

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

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

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

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

先决条件

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

流程

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

    $ nm-connection-editor
  2. + 按钮添加新连接。
  3. 选择 Ethernet 连接类型,并点击 Create
  4. General 标签页中:

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

      1. 选择 Connect automatically with priority
      2. 可选:修改 Connect automatically with priority 旁边的优先级值。

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

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

    ethernet connection general tab

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

验证步骤

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

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

      对于 IPv4:

      # ping 192.0.2.3

      对于 IPv6:

      # ping 2001:db8:2::1

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

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

      对于 IPv4:

      # ping 198.162.3.1

      对于 IPv6:

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

        对于 IPv4:

        # ping 192.0.2.254

        对于 IPv6:

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

      # host client.example.com

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

9.11. 配置 NetworkManager 连接的 DHCP 行为

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

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

先决条件

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

流程

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

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

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

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

    # nmcli connection modify connection_name ipv4.may-fail value

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

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

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

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

    # nmcli connection modify connection_name ipv6.may-fail value

其它资源

  • 有关这部分所述属性的详情,请查看 nm-settings(5) man page。

第 10 章 管理 Wi-Fi 连接

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

10.1. 设置无线规范域

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

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

其它资源

有关规范域的更多信息,请参见以下手册页:

  • setregdomain(1) man page - 根据地区代码设置规范域。
  • crda(8) man page - 发送至内核的给定 ISO 或者 IEC 3166 alpha2 的无线管理域。
  • regulatory.bin(5) man page - 显示 Linux 无线法规数据库。
  • iw(8) man page - 显示或者操作无线设备及其配置。

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

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

先决条件

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

    ~]$ nmcli radio wifi on

流程

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

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

    ~]$ nmcli con modify con-name MyCafe ipv4.dns "192.160.100.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 802-11-wireless.mtu 1350
  6. 验证更改:

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

验证步骤

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

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

      # ping 192.168.100.103

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

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

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

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

    # host client.example.com

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

其它资源

  • 关于属性及其设置的更多信息,请参见 nm-settings(5) 手册页。
  • 如果磁盘中的配置与设备中的配置不匹配,则启动或重启 NetworkManager 会创建一个代表该设备的配置的内存连接。有关详情以及如何避免此问题,请参阅 NetworkManager 服务重启后复制连接

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

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

此流程描述了如何使用 control-center 手动配置 Wi-Fi 设置。

流程

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

    选项

    1. 如果选择了 Connect automaticallyNetworkManager 会在 NetworkManager 检测到连接可用时自动进行连接。如果您不希望 NetworkManager 自动连接,请清除复选框。请注意,当复选框被清除时,您必须在网络连接图标的菜单中手动选择该连接才能连接。
    2. 要使连接可供其他用户使用,请选择 Make available to other users 复选框。
    3. 您还可以控制后台数据使用情况。如果您未指定 Restrict background data usage (默认),则 NetworkManager 会尝试下载您要使用的数据。否则,选择复选框和 NetworkManager 将连接 设置为 metered,并对后台数据用法应用限制。

      注意

      要删除 Wi-Fi 连接,请点击 Forget Connection 红色复选框。

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

    SSID - 接入点(AP)的服务集合标识符 (SSID)。

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

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

    Cloned Address - 采用克隆的 MAC 地址替换真实硬件地址。保留空白,除非需要。

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

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

    • IPv4 Method

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

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

    • Routes

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

      • Address - 输入远程网络、子网络或主机的 IP 地址。
      • Netmask - 以上输入的 IP 地址的子网掩码或前缀长度。
      • Gateway - 上面输入的远程网络、子网络或者主机的网关的 IP 地址。
      • Metric - 网络成本,为这个路由赋予的首选值。数值越低,优先级越高。
    • Use this connection only for resources on its network

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

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

    • IPv6 Method

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

    • 安全性

      • None - 不加密 Wi-Fi 连接。
      • WEP 40/128-bit Key — Wired Equivalent Privacy(WEP),来自 IEEE 802.11 标准。使用单一预共享密钥(PSK)。
      • WEP 128-bit Passphrase - 生成 WEP 密钥的密码短语的 MD5 哈希。

        警告

        如果 Wi-Fi 没有使用加密机制(如WEP 或者 WPA),则不要使用网络,因为它不安全,且任何人都可以读取您通过这个网络发送的数据。

      • LEAP - 轻量级扩展认证协议,来自 Cisco 系统。
      • Dynamic WEP (802.1X) - 动态更改 WEP 密钥。
      • WPA & WPA2 Personal — Wi-Fi Protected Access(WPA),来自 IEEE 802.11i 标准草稿。一个 WEP 的替换。Wi-Fi Protected Access II(WPA2),来自于 802.11i-2004 标准。个人模式,使用预共享密钥(WPA-PSK)。
      • WPA & WPA2 Enterprise - 与 RADIUS 验证服务器一起使用的 WPA 提供 IEEE 802.1X 网络访问控制。
    • Password - 输入要在验证过程中使用的密码。
  6. 完成配置后,点 应用 按钮保存配置。
注意

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

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

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

先决条件

  • 安装了 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

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

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

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

先决条件

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

    ~]$ nmcli radio wifi on

流程

  • 连接到隐藏的 SSID:

    ~]$ nmcli dev wifi connect SSID_Name password wireless_password hidden yes

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

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

流程

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

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

  5. 如果网络需要密码或密钥保护,请输入密码并点击 Connect

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

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

第 11 章 配置 VLAN 标记

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

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

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

本节论述了如何使用 nmcli 程序配置 Virtual Local Area Network(VLAN)标记。

先决条件

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

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

流程

  1. 显示网络接口:

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

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

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

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

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

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

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

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

    # nmcli connection up vlan10

验证步骤

  1. 验证设置:

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

其它资源

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

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

先决条件

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

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

流程

  1. 打开终端窗口,输入 nm-connection-editor:

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

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

      vlan settings nm connection editor

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

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

验证步骤

  1. 验证设置:

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

其它资源

11.3. 使用 nmstatectl 配置 VLAN 标记

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

根据您的环境,相应地调整 YAML 文件。例如,要在 VLAN 中使用 team、bridge 或 bond 设备,修改 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 set ~/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
    ...

其它资源

  • 有关详情请参考 nmstatectl nmstatectl(8) man page。
  • 如需更多配置示例,请参阅 /usr/share/doc/nmstate/examples/ 目录。

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

您可以使用 networking RHEL 系统角色配置 VLAN 标记。这个步骤描述了如何添加以太网连接以及使用此以太网连接 10 的 ID 的 VLAN。作为父设备,VLAN 连接包含 IP、默认网关和 DNS 配置。

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

  • 要使用 VLAN 作为其它连接(如绑定)中的端口,请省略 ip 属性,并设置父配置中的 IP 配置。
  • 要在 VLAN 中使用 team、bridge 或 bond 设备,请修改 VLAN 中使用的端口的 interface_nametype 属性。

先决条件

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

流程

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

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

    ---
    - name: Configure a VLAN that uses an Ethernet connection
      hosts: node.example.com
      become: true
      tasks:
      - include_role:
          name: linux-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: vlan10
              type: vlan
              ip:
                address:
                  - "192.0.2.1/24"
                  - "2001:db8:1::1/64"
                gateway4: 192.0.2.254
                gateway6: 2001:db8:1::fffe
                dns:
                  - 192.0.2.200
                  - 2001:db8:1::ffbb
                dns_search:
                  - example.com
              vlan_id: 10
    	  parent: enp1s0
              state: up

    VLAN 配置集中的 parent 属性将 VLAN 配置为在 enp1s0 设备之上操作。

  3. 运行 playbook:

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

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

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

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

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

其它资源

  • /usr/share/ansible/roles/rhel-system-roles.network/README.md file
  • ansible-playbook(1) man page

第 12 章 配置网络桥接

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

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

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

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

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

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

本小节论述了如何使用 nmcli 程序配置网络桥接。

先决条件

流程

  1. 创建网桥接口:

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

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

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

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

    在本例中:

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

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

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

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

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

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

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

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

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

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

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

    # nmcli connection modify bridge0 bridge.priority '16384'

    默认情况下启用 STP。

  6. 激活连接:

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

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

    Red Hat Enterprise Linux 在系统引导时激活控制器和端口。激活任何端口连接时,还会激活控制器。然而,在这种情况下,只激活一个端口连接。默认情况下,激活控制器不会自动激活端口。但是,您可以对其进行设置:

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

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

      # nmcli connection up bridge0

验证步骤

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

    # 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 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 工具创建桥接,如使用 nmcli 命令配置网络桥接 所述。

先决条件

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

流程

  1. 打开终端窗口,输入 nm-connection-editor:

    $ nm-connection-editor
  2. + 按钮添加新连接。
  3. 选择 Bridge 连接类型,并点 Create
  4. Bridge 标签页中:

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

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

      add nic to bridge in nm connection editor

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

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

      bridge IPv4 settings nm connection editor

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

      bridge IPv6 settings nm connection editor

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

验证步骤

  • 显示作为特定网桥端口的以太网设备的链接状态。

    # ip 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 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 配置网络桥接

这部分论述了如何使用 nmstatectl 工具使用以下设置配置 Linux 网络桥接 bridge0:

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

先决条件

  • 在服务器中安装两个或者两个以上物理或者虚拟网络设备。
  • 要将以太网设备用作桥接中的端口,必须在服务器中安装物理或者虚拟以太网设备。
  • 要使用 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 set ~/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
    ...

其它资源

  • 有关详情请参考 nmstatectl nmstatectl(8) man page。
  • 如需更多配置示例,请参阅 /usr/share/doc/nmstate/examples/ 目录。

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

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

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

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

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

13.5. 安装 teamd 服务

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

先决条件

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

流程

  • 安装 teamdNetworkManager-team 软件包:

    # yum install teamd NetworkManager-team

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

本节论述了如何使用 nmcli 工具配置网络团队。

先决条件

流程

  1. 创建团队接口:

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

    这个命令会创建一个名为 team0 的网络团队,它使用 activebackup 运行程序。

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

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

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

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

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

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

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

    在本例中:

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

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

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

      .这些命令为 enp7s0enp8s0创建配置集,并将其添加到 team0 连接中。

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

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

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

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

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

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

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

    # nmcli connection up team0

验证步骤

  • 显示团队状态:

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

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

其它资源

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

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

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

先决条件

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

流程

  1. 打开终端窗口,输入 nm-connection-editor:

    $ nm-connection-editor
  2. + 按钮添加新连接。
  3. 选择 Team 连接类型,并点 Create
  4. Team 标签页中:

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

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

      add nic to team in nm connection editor

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

      1. Runner 选项卡中,选择运行程序。
      2. Link Watcher 标签中,设置链路监视器及其可选设置。
      3. 点击 确定
  5. 配置团队的 IP 设置。如果要使用这个团队作为其它设备的端口,请跳过这一步。

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

验证步骤

  • 显示团队状态:

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

其它资源

第 14 章 配置网络绑定

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

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

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

14.1. 了解网络绑定

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

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

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

重要

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

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 命令配置网络绑定

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

先决条件

流程

  1. 创建绑定接口:

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

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

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

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

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

    在本例中:

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

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

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

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

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

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

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

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

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

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

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

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

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

    Red Hat Enterprise Linux 在系统引导时激活控制器和端口设备。激活任何端口连接时,还会激活控制器。然而,在这种情况下,只激活一个端口连接。默认情况下,激活控制器不会自动激活端口。但是,您可以对其进行设置:

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

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

      # nmcli connection up bond0

验证步骤

  1. 显示绑定状态:

    # cat /proc/net/bonding/bond0
    Ethernet Channel Bonding Driver: v3.7.1 (April 27, 2011)
    
    Bonding Mode: fault-tolerance (active-backup)
    Primary Slave: None
    Currently Active Slave: enp7s0
    MII Status: up
    MII Polling Interval (ms): 100
    Up Delay (ms): 0
    Down Delay (ms): 0
    
    Slave Interface: enp7s0
    MII Status: up
    Speed: Unknown
    Duplex: Unknown
    Link Failure Count: 0
    Permanent HW addr: 52:54:00:d5:e0:fb
    Slave queue ID: 0
    
    Slave Interface: enp8s0
    MII Status: up
    Speed: Unknown
    Duplex: Unknown
    Link Failure Count: 0
    Permanent HW addr: 52:54:00:b2:e2:63
    Slave queue ID: 0

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

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

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

      # cat /proc/net/bonding/bond0

其它资源

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

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

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

先决条件

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

流程

  1. 打开终端窗口,输入 nm-connection-editor:

    $ nm-connection-editor
  2. + 按钮添加新连接。
  3. Bond 连接类型,并点 Create
  4. Bond 标签页中:

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

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

      add nic to bond in nm connection editor

    4. 可选:设置其他选项,如介质独立接口(MII)监控间隔。
  5. 配置绑定的 IP 设置。如果要使用这个绑定作为其它设备的端口,请跳过这一步。

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

      bond IPv4 settings nm connection editor

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

      bond IPv6 settings nm connection editor

  6. Save 保存绑定连接。
  7. 关闭 nm-connection-editor

验证步骤

  • 查看绑定的状态:

    $ cat /proc/net/bonding/bond0
    Ethernet Channel Bonding Driver: v3.7.1 (April 27, 2011)
    
    Bonding Mode: fault-tolerance (active-backup)
    Primary Slave: None
    Currently Active Slave: enp7s0
    MII Status: up
    MII Polling Interval (ms): 100
    Up Delay (ms): 0
    Down Delay (ms): 0
    
    Slave Interface: enp7s0
    MII Status: up
    Speed: Unknown
    Duplex: Unknown
    Link Failure Count: 0
    Permanent HW addr: 52:54:00:d5:e0:fb
    Slave queue ID: 0
    
    Slave Interface: enp8s0
    MII Status: up
    Speed: Unknown
    Duplex: Unknown
    Link Failure Count: 0
    Permanent HW addr: 52:54:00:b2:e2:63
    Slave queue ID: 0

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

14.7. 使用 nmstatectl 配置网络绑定

本节论述了如何使用 nmstatectl 工具配置带有以下设置的网络绑定 bond0:

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

先决条件

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

流程

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

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

    # nmstatectl set ~/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
    ...

其它资源

  • 有关详情请参考 nmstatectl nmstatectl(8) man page。
  • 如需更多配置示例,请参阅 /usr/share/doc/nmstate/examples/ 目录。

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

您可以使用 network RHEL 系统角色配置网络绑定。这个步骤描述了如何在使用两个以太网设备的主动备份模式中配置绑定,并设置 IPv4 和 IPv6 地址、默认网关和 DNS 配置。

注意

在网桥上设置 IP 配置,而不是在 Linux 网桥的端口上设置。

先决条件

  • 在控制节点上安装 ansiblerhel-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: linux-system-roles.network
    
        vars:
          network_connections:
            # Define the bond profile
            - name: bond0
              type: bond
              interface_name: bond0
              ip:
                address:
                  - "192.0.2.1/24"
                  - "2001:db8:1::1/64"
                gateway4: 192.0.2.254
                gateway6: 2001:db8:1::fffe
                dns:
                  - 192.0.2.200
                  - 2001:db8:1::ffbb
                dns_search:
                  - example.com
              bond:
                mode: active-backup
              state: up
    
            # Add an Ethernet profile to the bond
            - name: bond0-port1
              interface_name: enp7s0
              type: ethernet
              controller: bond0
              state: up
    
            # Add a second Ethernet profile to the bond
            - name: bond0-port2
              interface_name: enp8s0
              type: ethernet
              controller: bond0
              state: up
  3. 运行 playbook:

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

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

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

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

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

其它资源

  • /usr/share/ansible/roles/rhel-system-roles.network/README.md file
  • ansible-playbook(1) man page

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

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

先决条件

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

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

    • Docking_stationenp11s0u1 以太网设备相关联
    • Wi-Fiwlp61s0 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      wlp61s0
    ...

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

  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: wlp61s0
    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 是通过互联网连接到本地网络的一种方式。IPsecLibreswan 提供是创建 VPN 的首选方法。Libreswan 是 VPN 在用户空间 IPsec 的一个实现。VPN 通过在中间网络(比如互联网)设置隧道,启用 LAN 和另一个远程 LAN 之间的通信。为了安全起见,VPN 隧道总是使用认证和加密。对于加密操作,Libreswan 使用 NSS 库。

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

这个步骤描述了如何使用control-center配置 VPN 连接。

先决条件

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

流程

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

    General

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

    Authentication

    Type

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

      以下配置设置位于 Advanced 部分:

      图 15.1. VPN 连接的高级选项

      网络 vpn 高级选项
      警告

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

      身份识别

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

      安全性

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

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

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

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

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

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

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

    IPv4 方法

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

      DNS

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

      Routes

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

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

      仅将此连接用于其网络上的资源

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

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

    IPv6 Method

    • Automatic - 选择这个选项使用 IPv6 Stateless Address AutoConfiguration(SLAAC)根据硬件地址和路由器公告(RA)创建自动的、无状态的配置。
    • Automatic, DHCP only - 选择这个选项以不使用 RA,但从 DHCPv6 请求信息以创建有状态的配置。
    • Link-Local Only - 如果您要连接的网络没有 DHCP 服务器且您不想手动分配 IP 地址,请选择这个选项。随机地址将根据 RFC 4862 进行分配,前缀为 FE80::0
    • Manual - 如果要手动分配 IP 地址,请选择这个选项。
    • Disable - IPv6 在这个连接中被禁用。

      请注意,DNSRoutesUse this connection only for resources on its network 对于 IPv4 设置是通用的。

  8. 编辑完 VPN 连接后,点添加按钮自定义配置或应用按钮为现有配置保存它。
  9. 将配置集切换为 ON 来激活 VPN 连接。

其它资源

  • 有关支持的 Libreswan 参数的详情,请查看 nm-settings-libreswan(5) man page。

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

这个步骤描述了如何使用 nm-connection-editor 配置 VPN 连接。

先决条件

  • 已安装 NetworkManager-libreswan-gnome 软件包。
  • 如果您配置了互联网密钥交换版本 2(IKEv2)连接:

    • 证书导入到 IPsec 网络安全服务(NSS)数据库中。
    • NSS 数据库中的证书 nickname 是已知的。

流程

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

    $ nm-connection-editor
  2. + 按钮添加新连接。
  3. 选择 IPsec based VPN 连接类型,并点 Create
  4. VPN 标签页中:

    1. Gateway 字段中输入 VPN 网关的主机名或 IP 地址,并选择验证类型。根据验证类型,您必须输入不同的附加信息:

      • IKEv2 (Certifiate) 使用更安全的证书验证客户端。这个设置需要在 IPsec NSS 数据库中指定证书的 nickname
      • IKEv1 (XAUTH) 使用用户名和密码(预共享密钥)验证用户。此设置要求您输入以下值:

        • 用户名
        • 密码
        • 组名称
        • Secret
    2. 如果远程服务器为 IKE 交换指定本地标识符,在 Remote ID 字段输入具体字符串。在运行 Libreswan 的远程服务器中,这个值在服务器的 leftid 参数中设定。

      nm connection editor vpn tab

    3. (可选)点击高级按钮配置附加设置。您可以配置以下设置:

      • 身份识别

        • Domain - 如果需要,输入域名。
      • 安全性

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

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

        • Phase1 Lifetime 对应于 ikelifetime Libreswan 参数。此参数定义用于加密流量的密钥的有效期。
        • Phase2 Lifetime 对应于 salifetime Libreswan 参数。这个参数定义安全关联有效期。
      • 连接性

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

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

        • Enable fragmentation 对应于 fragmentation Libreswan 参数,并定义是否允许 IKE 分段。有效值为 yes (默认)或 no
        • Enable Mobike 对应于 mobike Libreswan 参数。参数定义是否允许移动和多功能协议(MOBIKE)(RFC 4555)启用连接来迁移其端点而无需从头开始重启连接。这可用于在有线、无线或者移动数据连接之间进行切换的移动设备。值为 no (默认)或 yes
  5. IPv4 Settings 标签中,选择 IP 分配方法,并(可选)设置额外的静态地址、DNS 服务器、搜索域和路由。

    IPsec IPv4 tab

  6. 保存连接。
  7. 关闭 nm-connection-editor
注意

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

其它资源

  • 有关支持的 IPsec 参数的详情,请查看 nm-settings-libreswan(5) man page。

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

将安全 Payload(ESP)卸载到硬件会加快 IPsec 连接。如果您出于故障切换的原因使用网络绑定,配置 ESP 硬件卸载的要求和步骤与使用常规以太网设备的要求和步骤会不同。例如,在这种情况下,您可以在绑定中启用卸载支持,内核会将设置应用到绑定的端口。

先决条件

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

流程

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

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

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

  2. 重新激活 bond0 连接:

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

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

    # systemctl restart ipsec

验证

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

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

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

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

    # ethtool 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 隧道来封装 IPv4 数据包中的 IPv4 流量

IP over IP(IPIP)隧道在 OSI 层 3 上运行,并封装 IPv4 数据包中的 IPv4 流量,如 RFC 2003 所述

重要

通过 IPIP 隧道发送的数据没有加密。出于安全考虑,只在已经加密的数据中使用隧道,比如 HTTPS。

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

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

IPIP 隧道

先决条件

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

流程

  1. 在网络 A 的 RHEL 路由器上:

    1. 创建名为 tun0 的 IPIP 隧道接口:

      # nmcli connection add type ip-tunnel ip-tunnel.mode ipip con-name tun0 ifname tun0 remote 198.51.100.5 local 203.0.113.10

      remotelocal 参数设置远程和本地路由器的公共 IP 地址。

    2. 将 IPv4 地址设置为 tun0 设备:

      # nmcli connection modify tun0 ipv4.addresses '10.0.1.1/30'

      请注意,有两个可用的 IP 地址的 /30 子网足以满足隧道的需要。

    3. tun0 连接配置为使用手动 IPv4 配置:

      # nmcli connection modify tun0 ipv4.method manual
    4. 添加将流量路由到 172.16.0.0/24 网络的静态路由到路由器 B 的隧道 IP:

      # nmcli connection modify tun0 +ipv4.routes "172.16.0.0/24 10.0.1.2"
    5. 启用 tun0 连接。

      # nmcli connection up tun0
    6. 启用数据包转发:

      # echo "net.ipv4.ip_forward=1" > /etc/sysctl.d/95-IPv4-forwarding.conf
      # sysctl -p /etc/sysctl.d/95-IPv4-forwarding.conf
  2. 在网络 B 中的 RHEL 路由器中:

    1. 创建名为 tun0 的 IPIP 隧道接口:

      # nmcli connection add type ip-tunnel ip-tunnel.mode ipip con-name tun0 ifname tun0 remote 203.0.113.10 local 198.51.100.5

      remotelocal 参数设置远程和本地路由器的公共 IP 地址。

    2. 将 IPv4 地址设置为 tun0 设备:

      # nmcli connection modify tun0 ipv4.addresses '10.0.1.2/30'
    3. tun0 连接配置为使用手动 IPv4 配置:

      # nmcli connection modify tun0 ipv4.method manual
    4. 添加将流量路由到 192.0.2.0/24 网络的静态路由到路由器 A 的隧道 IP:

      # nmcli connection modify tun0 +ipv4.routes "192.0.2.0/24 10.0.1.1"
    5. 启用 tun0 连接。

      # nmcli connection up tun0
    6. 启用数据包转发:

      # echo "net.ipv4.ip_forward=1" > /etc/sysctl.d/95-IPv4-forwarding.conf
      # sysctl -p /etc/sysctl.d/95-IPv4-forwarding.conf

验证步骤

  • 从每个 RHEL 路由器中,ping 路由器的内部接口的 IP 地址:

    1. 在路由器 A 中,ping 172.16.0.1:

      # ping 172.16.0.1
    2. 在路由器 B 中,ping 192.0.2.1:

      # ping 192.0.2.1

其它资源

  • 有关使用 nmcli 的详情,请查看 nmcli man page。
  • 有关您可以使用 nmcli 设定的隧道设置的详情,请查看 nm-settings(5) man page 中的 ip-tunnel settings 部分。

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

Generic Routing Encapsulation(GRE)隧道封装 IPv4 数据包中的第 3 层流量,如 RFC 2784 所述。GRE 隧道可以使用有效的以太网类型封装任何第 3 层协议。

重要

通过 GRE 隧道发送的数据没有加密。出于安全考虑,只在已经加密的数据中使用隧道,比如 HTTPS。

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

GRE 隧道
注意

gre0 设备名称被保留。为该设备使用 gre1 或者不同名称。

先决条件

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

流程

  1. 在网络 A 的 RHEL 路由器上:

    1. 创建名为 gre1 的 GRE 隧道接口:

      # nmcli connection add type ip-tunnel ip-tunnel.mode gre con-name gre1 ifname gre1 remote 198.51.100.5 local 203.0.113.10

      remotelocal 参数设置远程和本地路由器的公共 IP 地址。

    2. 将 IPv4 地址设置为 gre1 设备:

      # nmcli connection modify gre1 ipv4.addresses '10.0.1.1/30'

      请注意,有两个可用的 IP 地址的 /30 子网足以满足隧道的需要。

    3. gre1 连接配置为使用手动 IPv4 配置:

      # nmcli connection modify gre1 ipv4.method manual
    4. 添加将流量路由到 172.16.0.0/24 网络的静态路由到路由器 B 的隧道 IP:

      # nmcli connection modify tun0 +ipv4.routes "172.16.0.0/24 10.0.1.2"
    5. 启用 gre1 连接。

      # nmcli connection up gre1
    6. 启用数据包转发:

      # echo "net.ipv4.ip_forward=1" > /etc/sysctl.d/95-IPv4-forwarding.conf
      # sysctl -p /etc/sysctl.d/95-IPv4-forwarding.conf
  2. 在网络 B 中的 RHEL 路由器中:

    1. 创建名为 gre1 的 GRE 隧道接口:

      # nmcli connection add type ip-tunnel ip-tunnel.mode ipip con-name gre1 ifname gre1 remote 203.0.113.10 local 198.51.100.5

      remotelocal 参数设置远程和本地路由器的公共 IP 地址。

    2. 将 IPv4 地址设置为 gre1 设备:

      # nmcli connection modify gre1 ipv4.addresses '10.0.1.2/30'
    3. gre1 连接配置为使用手动 IPv4 配置:

      # nmcli connection modify gre1 ipv4.method manual
    4. 添加将流量路由到 192.0.2.0/24 网络的静态路由到路由器 A 的隧道 IP:

      # nmcli connection modify tun0 +ipv4.routes "192.0.2.0/24 10.0.1.1"
    5. 启用 gre1 连接。

      # nmcli connection up gre1
    6. 启用数据包转发:

      # echo "net.ipv4.ip_forward=1" > /etc/sysctl.d/95-IPv4-forwarding.conf
      # sysctl -p /etc/sysctl.d/95-IPv4-forwarding.conf

验证步骤

  1. 从每个 RHEL 路由器中,ping 路由器的内部接口的 IP 地址:

    1. 在路由器 A 中,ping 172.16.0.1:

      # ping 172.16.0.1
    2. 在路由器 B 中,ping 192.0.2.1:

      # ping 192.0.2.1

其它资源

  • 有关使用 nmcli 的详情,请查看 nmcli man page。
  • 有关您可以使用 nmcli 设定的隧道设置的详情,请查看 nm-settings(5) man page 中的 ip-tunnel settings 部分。

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

Generic Routing Encapsulation Terminal Access Point(GRETAP)隧道在 OSI 级别 2 上运行,并封装 IPv4 数据包中的以太网流量,如 RFC 2784 所述。

重要

通过 GRETAP 隧道发送的数据没有加密。出于安全考虑,通过 VPN 或不同的加密连接建立隧道。

此流程描述了如何在两个 RHEL 路由器之间创建 GRETAP 隧道以使用桥接连接两个网络,如下图所示:

GRETAP 隧道
注意

gretap0 设备名称被保留。为该设备使用 gretap1 或者不同名称。

先决条件

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

流程

  1. 在网络 A 的 RHEL 路由器上:

    1. 创建名为 bridge0的网桥接口:

      # nmcli connection add type bridge con-name bridge0 ifname bridge0
    2. 配置网桥的 IP 设置:

      # nmcli connection modify bridge0 ipv4.addresses '192.0.2.1/24'
      # nmcli connection modify bridge0 ipv4.method manual
    3. 为连接到本地网络的接口添加新连接配置集到网桥:

      # nmcli connection add type ethernet slave-type bridge con-name bridge0-port1 ifname enp1s0 master bridge0
    4. 为网桥添加 GRETAP 隧道接口的新连接配置集:

      # nmcli connection add type ip-tunnel ip-tunnel.mode gretap slave-type bridge con-name bridge0-port2 ifname gretap1 remote 198.51.100.5 local 203.0.113.10 master bridge0

      remotelocal 参数设置远程和本地路由器的公共 IP 地址。

    5. 可选:如果您不需要,STP(Spanning Tree Protocol):

      # nmcli connection modify bridge0 bridge.stp no

      默认情况下,STP 被启用并导致在使用连接前出现延迟。

    6. 配置激活 bridge0 连接会自动激活网桥端口:

      # nmcli connection modify bridge0 connection.autoconnect-slaves 1
    7. 激活 bridge0 连接:

      # nmcli connection up bridge0
  2. 在网络 B 中的 RHEL 路由器中:

    1. 创建名为 bridge0的网桥接口:

      # nmcli connection add type bridge con-name bridge0 ifname bridge0
    2. 配置网桥的 IP 设置:

      # nmcli connection modify bridge0 ipv4.addresses '192.0.2.2/24'
      # nmcli connection modify bridge0 ipv4.method manual
    3. 为连接到本地网络的接口添加新连接配置集到网桥:

      # nmcli connection add type ethernet slave-type bridge con-name bridge0-port1 ifname enp1s0 master bridge0
    4. 为网桥添加 GRETAP 隧道接口的新连接配置集:

      # nmcli connection add type ip-tunnel ip-tunnel.mode gretap slave-type bridge con-name bridge0-port2 ifname gretap1 remote 203.0.113.10 local 198.51.100.5 master bridge0

      remotelocal 参数设置远程和本地路由器的公共 IP 地址。

    5. 可选:如果您不需要,STP(Spanning Tree Protocol):

      # nmcli connection modify bridge0 bridge.stp no
    6. 配置激活 bridge0 连接会自动激活网桥端口:

      # nmcli connection modify bridge0 connection.autoconnect-slaves 1
    7. 激活 bridge0 连接:

      # nmcli connection up bridge0

验证步骤

  1. 在两个路由器中,验证 enp1s0gretap1 连接是否已连接,并且 CONNECTION 列显示了端口的连接名称:

    # nmcli device
    nmcli device
    DEVICE   TYPE      STATE      CONNECTION
    ...
    bridge0  bridge    connected  bridge0
    enp1s0   ethernet  connected  bridge0-port1
    gretap1  iptunnel  connected  bridge0-port2
  2. 从每个 RHEL 路由器中,ping 路由器的内部接口的 IP 地址:

    1. 在路由器 A 中,ping 192.0.2.2:

      # ping 192.0.2.2
    2. 在路由器 B 中,ping 192.0.2.1:

      # ping 192.0.2.1

其它资源

  • 有关使用 nmcli 的详情,请查看 nmcli man page。
  • 有关您可以使用 nmcli 设定的隧道设置的详情,请查看 nm-settings(5) man page 中的 ip-tunnel settings 部分。

16.4. 其它资源

  • 有关隧道接口列表以及使用 ip 程序临时配置隧道的详情,请查看 ip-link(8) man page。

第 17 章 使用以太网配置光纤

根据 IEEE T11 FC-BB-5 标准,使用以太网(FCoE)的光纤通道是通过以太网传输光纤通道帧的协议。通常数据中心有一个专用的 LAN 和 Storage Area Network(SAN),它和它们自己的配置是相互分开的。FCoE 将这些网络合并为一个整合的网络结构。例如 FCoE 的优点是降低硬件和能源成本。

17.1. 在 RHEL 中使用硬件 FCoE HBA

在 Red Hat Enterprise Linux 中,您可以使用以下驱动程序支持的硬件 FCoE 主机总线适配器(HBA):

  • qedf
  • bnx2fc
  • fnic

如果您使用这样的 HBA,在 HBA 设置中配置 FCoE 设置。详情请查看适配器文档。

您在设置中配置了 HBA 后,从 Storage Area Network(SAN)中导出的逻辑单元号(LUN)将自动可用于 RHEL 作为 /dev/sd* 设备。您可以使用类似本地存储设备的设备。

17.2. 设置软件 FCoE 设备

软件 FCoE 设备可让您使用部分支持 FCoE 的以太网适配器访问 FCoE 的逻辑单元号(LUN)。

重要

RHEL 不支持需要 fcoe.ko 内核模块的软件 FCoE 设备。详情请查看 Considerations in adopting RHEL 8 文档中的 删除 FCoE 软件

完成此步骤后,RHEL 会自动访问 Storage Area Network(SAN)中导出的 LUN 作为 /dev/sd* 设备。您可以使用类似本地存储设备的设备。

先决条件

  • 主机总线适配器(HBA)使用 qedfbnx2fcfnic 驱动程序,且不需要 fcoe.ko 内核模块。
  • SAN 使用 VLAN 来将存储流量与普通以太网流量分开。
  • 网络切换已被配置为支持 VLAN。
  • 服务器的 HBA 在它的 BIOS 中被配置。详情请查看您的 HBA 文档。
  • HBA 连接至网络,连接是在线的。

流程

  1. 安装 fcoe-utils 软件包:

    # yum install fcoe-utils
  2. /etc/fcoe/cfg-ethx 模板文件复制到 /etc/fcoe/cfg-interface_name。例如:如果要配置 enp1s0 接口使用 FCoE,输入:

    # cp /etc/fcoe/cfg-ethx /etc/fcoe/cfg-enp1s0
  3. 启用并启动 fcoe 服务:

    # systemctl enable --now fcoe
  4. 发现 FCoE VLAN ID,启动发起程序,并为发现的 VLAN 创建网络设备:

    # fipvlan -s -c enp1s0
    Created VLAN device enp1s0.200
    Starting FCoE on interface enp1s0.200
    Fibre Channel Forwarders Discovered
    interface       | VLAN | FCF MAC
    ------------------------------------------
    enp1s0          | 200  | 00:53:00:a7:e7:1b
  5. 可选: 要显示发现的目标、LUN 和与 LUN 关联的设备详情,请输入:

    # fcoeadm -t
    Interface:        enp1s0.200
    Roles:            FCP Target
    Node Name:        0x500a0980824acd15
    Port Name:        0x500a0982824acd15
    Target ID:        0
    MaxFrameSize:     2048 bytes
    OS Device Name:   rport-11:0-1
    FC-ID (Port ID):  0xba00a0
    State:            Online
    
    LUN ID  Device Name   Capacity   Block Size  Description
    ------  -----------  ----------  ----------  ---------------------
         0  sdb           28.38 GiB      512     NETAPP LUN (rev 820a)
         ...

    这个示例显示 SAN 中的 LUN 0 已作为 /dev/sdb 设备附加到主机中。

验证步骤

  • 使用 fcoeadm -i 命令显示所有活跃 FCoE 接口的信息:

    # fcoeadm -i
    Description:      BCM57840 NetXtreme II 10 Gigabit Ethernet
    Revision:         11
    Manufacturer:     Broadcom Inc. and subsidiaries
    Serial Number:    000AG703A9B7
    
    Driver:           bnx2x Unknown
    Number of Ports:  1
    
        Symbolic Name:     bnx2fc (QLogic BCM57840) v2.12.13 over enp1s0.200
        OS Device Name:    host11
        Node Name:         0x2000000af70ae935
        Port Name:         0x2001000af70ae935
        Fabric Name:       0x20c8002a6aa7e701
        Speed:             10 Gbit
        Supported Speed:   1 Gbit, 10 Gbit
        MaxFrameSize:      2048 bytes
        FC-ID (Port ID):   0xba02c0
        State:             Online

其它资源

  • 有关 fcoeadm 工具程序的详情,请查看 fcoeadm(8) man page。
  • 有关如何在系统引导时通过软件 FCoE 挂载存储的详情,请查看 /usr/share/doc/fcoe-utils/README 文件。

17.3. 其它资源

  • 有关使用光纤通道设备的详情,请参考 Managing storage devices 指南中的 使用光纤通道设备 部分。

第 18 章 端口镜像

网络管理员可以使用端口镜像来复制从一个网络设备传递给另一个网络设备的入站和出站网络流量。管理员使用端口镜像来监控网络流量并收集网络数据:

  • 调试网络问题并调整网络流
  • 检查并分析网络流量以排除网络问题
  • 检测入侵

18.1. 使用 nmcli 对网络接口进行镜像(mcli)

您可以使用 NetworkManager 配置端口镜像。以下流程通过将流量控制(tc)规则和过滤添加 enp1 s0 网络接口将 enp 1s0 的网络流量镜像到 enp7 s0 的网络流量。

先决条件

  • 用于将网络流量镜像到的网络接口。

流程

  1. 添加您要从中镜像网络流量的网络连接配置集:

    # nmcli connection add type ethernet ifname enp1s0 con-name enp1s0 autoconnect no
  2. 为带有 handle '10:' 的出口(outgoing)流量附加 prio qdisc 为 enp1s0。附加了 'prio' qdisc,没有子目录允许附加过滤器。

    # nmcli connection modify enp1s0 +tc.qdisc "root prio handle 10:"
  3. 为入口流量添加 qdisc,并带有 handle 'ffff:'。

    # nmcli connection modify enp1s0 +tc.qdisc "ingress handle ffff:"
  4. 要匹配入口和出口 qdiscs 上的数据包,并将其镜像(mirror)到另一个接口,请添加以下过滤器。

    # nmcli connection modify enp1s0 +tc.tfilter "parent ffff: matchall action mirred egress mirror dev mirror-of-enp1s0"
    
    # nmcli connection modify enp1s0 +tc.tfilter "parent 10: matchall action mirred egress mirror dev mirror-of-enp1s0"

    matchall 过滤器与所有数据包匹配, mirred 操作会将数据包重定向到目的地。

  5. 激活连接:

    # nmcli connection up enp1s0

验证步骤

  1. 安装 tcpdump 工具程序:

    # yum install tcpdump
  2. 查看目标设备中镜像的流量(mirror-of-enp1s0):

    # tcpdump -i enp7s0

其它资源

第 19 章 使用 802.1X 标准向网络验证 RHEL 客户端

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

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

使用 nmcli 工具,您可以配置客户端向网络验证其自身。这个过程描述了如何在现有名为 enp1s0 的 NetworkManager 以太网连接配置集中使用微软 Challenge-Handshake Authentication Protocol 版本 2(MSCHAPv2) 配置保护扩展验证协议(PEAP)验证。

先决条件

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

流程

  1. 将扩展验证协议(EAP)设置为 peap,内部验证协议为 mschapv2,用户名为:

    # nmcli connection modify enp1s0 802-1x.eap peap 802-1x.phase2-auth mschapv2 802-1x.identity user_name

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

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

    # nmcli connection modify enp1s0 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 enp1s0 802-1x.ca-cert /etc/pki/ca-trust/source/anchors/ca.crt
    注意

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

  4. 激活连接配置集:

    # nmcli connection up enp1s0

验证步骤

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

其它资源

  • 有关添加网络管理器以太网连接配置集的详情,请参考 第 9 章 配置以太网连接
  • 有关 802.1X 相关参数及其描述,请查看 nm-settings(5) man page 中的 802-1x settings 部分。
  • 有关 nmcli 工具程序的详情,请查看 nmcli(1) man page。

19.2. 使用 RHEL 系统角色通过 802.1X 网络身份验证配置静态以太网连接

使用 RHEL 系统角色,您可以自动创建使用 802.1X 标准验证客户端的以太网连接。此流程描述了如何通过运行 Ansible playbook 来远程为带有以下设置的 enp1s0 接口添加以太网连接:

  • 静态 IPv4 地址 - 192.0.2.1,子网掩码为 /24
  • 静态 IPv6 地址 - 2001:db8:1::1,子网掩码为 /64
  • IPv4 默认网关 - 192.0.2.254
  • IPv6 默认网关 - 2001:db8:1::fffe
  • IPv4 DNS 服务器 - 192.0.2.200
  • IPv6 DNS 服务器 - 2001:db8:1::ffbb
  • DNS 搜索域 - example.com
  • 802.1X 网络验证使用 TLS 可扩展验证协议(EAP)

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

先决条件

  • 在控制节点上安装 ansiblerhel-system-roles 软件包。
  • 如果您运行 playbook 时使用了与 root 不同的远程用户, 则此用户在受管节点上需要具有适当的 sudo 权限。
  • 网络支持 802.1X 网络身份验证。
  • 受管节点使用 NetworkManager。
  • control 节点上存在 TLS 身份验证所需的以下文件:

    • 保存在 /srv/data/client.key 文件中的客户端密钥。
    • 存储在 /srv/data/client.crt 文件中的客户端证书。
    • 存储在 /srv/data/ca.crt 文件中的证书颁发机构(CA)证书。

流程

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

    node.example.com
  2. 使用以下内容创建 ~/enable-802.1x.yml playbook:

    ---
    - name: Configure an Ethernet connection with 802.1X authentication
      hosts: node.example.com
      become: true
      tasks:
        - name: Copy client key for 802.1X authentication
          copy:
            src: "/srv/data/client.key"
            dest: "/etc/pki/tls/private/client.key"
            mode: 0600
    
        - name: Copy client certificate for 802.1X authentication
          copy:
            src: "/srv/data/client.crt"
            dest: "/etc/pki/tls/certs/client.crt"
    
        - name: Copy CA certificate for 802.1X authentication
          copy:
            src: "/srv/data/ca.crt"
            dest: "/etc/pki/ca-trust/source/anchors/ca.crt"
    
        - include_role:
            name: linux-system-roles.network
          vars:
            network_connections:
              - name: enp1s0
                type: ethernet
                autoconnect: yes
                ip:
                  address:
                    - 192.0.2.1/24
                    - 2001:db8:1::1/64
                  gateway4: 192.0.2.254
                  gateway6: 2001:db8:1::fffe
                  dns:
                    - 192.0.2.200
                    - 2001:db8:1::ffbb
                  dns_search:
                    - example.com
                ieee802_1x:
                  identity: user_name
                  eap: tls
                  private_key: "/etc/pki/tls/private/client.key"
                  private_key_password: "password"
                  client_cert: "/etc/pki/tls/certs/client.crt"
                  ca_cert: "/etc/pki/ca-trust/source/anchors/ca.crt"
                  domain_suffix_match: example.com
                state: up
  3. 运行 playbook:

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

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

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

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

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

其它资源

  • /usr/share/ansible/roles/rhel-system-roles.network/README.md file
  • /usr/share/ansible/roles/rhel-system-roles.network/README.md file
  • ansible-playbook(1) man page

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

使用 nmcli 工具,您可以配置客户端向网络验证其自身。这个过程描述了如何在现有名为 wlp1s0 的 NetworkManager Wi-Fi 连接配置集中使用微软 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 wpl1s0 802-11-wireless-security.key-mgmt wpa-eap 802-1x.eap peap 802-1x.phase2-auth mschapv2 802-1x.identity user_name

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

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

    # nmcli connection modify wpl1s0 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 wpl1s0 802-1x.ca-cert /etc/pki/ca-trust/source/anchors/ca.crt
    注意

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

  4. 激活连接配置集:

    # nmcli connection up wpl1s0

验证步骤

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

其它资源

  • 有关添加网络管理器以太网连接配置集的详情,请参考 第 10 章 管理 Wi-Fi 连接
  • 有关 802.1X 相关参数及其描述,请查看 nm-settings(5) man page 中的 802-1x settings 部分。
  • 有关 nmcli 工具程序的详情,请查看 nmcli(1) man page。

第 20 章 管理默认网关设置

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

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

在大多数情况下,管理员在创建连接时设置默认网关,如 使用 nmcli 配置静态以太网连接 所述。

本节论述了如何使用 nmcli 实用程序在之前创建的连接中设置或更新默认网关。

先决条件

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

流程

  1. 设置默认网关的 IP 地址。

    例如,要将 example 连接中默认网关的 IPv4 地址设置为 192.0.2.1:

    $ sudo nmcli connection modify example ipv4.gateway "192.0.2.1"

    例如,要将 example 连接中默认网关的 IPv6 地址设置为 2001:db8:1::1:

    $ sudo nmcli connection modify example ipv6.gateway "2001:db8:1::1"
  2. 重启网络连接以使更改生效。例如,要使用命令行重启 example 连接:

    $ sudo nmcli connection up example
    警告

    所有目前使用这个网络连接的连接在重启过程中暂时中断。

  3. (可选)验证路由是否活跃。

    显示 IPv4 默认网关:

    $ ip -4 route
    default via 192.0.2.1 dev example proto static metric 100

    显示 IPv6 默认网关:

    $ ip -6 route
    default via 2001:db8:1::1 dev example proto static metric 100 pref medium

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

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

本节论述了如何使用 nmcli 工具的互动模式在之前创建的连接中设置或更新默认网关。

先决条件

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

流程

  1. 为所需连接打开 nmcli 互动模式。例如,要为 example 连接打开 nmcli 互动模式:

    $ sudo nmcli connection edit example
  2. 设置默认网关。

    例如,要将 example 连接中默认网关的 IPv4 地址设置为 192.0.2.1:

    nmcli> set ipv4.gateway 192.0.2.1

    例如,要将 example 连接中默认网关的 IPv6 地址设置为 2001:db8:1::1:

    nmcli> set ipv6.gateway 2001:db8:1::1
  3. 另外,还可验证默认网关是否正确设置:

    nmcli> print
    ...
    ipv4.gateway:                           192.0.2.1
    ...
    ipv6.gateway:                           2001:db8:1::1
    ...
  4. 保存配置:

    nmcli> save persistent
  5. 重启网络连接以使更改生效:

    nmcli> activate example
    警告

    所有目前使用这个网络连接的连接在重启过程中暂时中断。

  6. 保留 nmcli 互动模式:

    nmcli> quit
  7. (可选)验证路由是否活跃。

    显示 IPv4 默认网关:

    $ ip -4 route
    default via 192.0.2.1 dev example proto static metric 100

    显示 IPv6 默认网关:

    $ ip -6 route
    default via 2001:db8:1::1 dev example proto static metric 100 pref medium

20.3. 使用 nm-connection-editor 在现有连接上设置默认网关

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

先决条件

  • 至少需要在设置默认网关的连接上配置一个静态 IP 地址。

流程

  1. 打开终端窗口,输入 nm-connection-editor:

    $ nm-connection-editor
  2. 选择要修改的连接,并点击 gear wheel 图标编辑现有连接。
  3. 设置 IPv4 默认网关。例如,要将连接中默认网关的 IPv4 地址设置为 192.0.2.1

    1. 打开 IPv4 Settings 标签。
    2. gateway 字段中输入网关地址在其中 IP 范围旁的地址:

      set default gw in nm connection editor ipv4

  4. 设置 IPv6 默认网关。例如,要将连接中默认网关的 IPv6 地址设置为 2001:db8:1::1

    1. 打开 IPv6 标签。
    2. gateway 字段中输入网关地址在其中 IP 范围旁的地址:

      set default gw in nm connection editor ipv6

  5. 点击 确定
  6. 点击 Save
  7. 重启网络连接以使更改生效。例如,要使用命令行重启 example 连接:

    $ sudo nmcli connection up example
    警告

    所有目前使用这个网络连接的连接在重启过程中暂时中断。

  8. (可选)验证路由是否活跃。

    显示 IPv4 默认网关:

    $ ip -4 route
    default via 192.0.2.1 dev example proto static metric 100

    显示 IPv6 默认网关:

    $ ip -6 route
    default via 2001:db8:1::1 dev example proto static metric 100 pref medium

20.4. 使用 control-center 在现有连接上设置默认网关

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

先决条件

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

流程

  1. 设置 IPv4 默认网关。例如,要将连接中默认网关的 IPv4 地址设置为 192.0.2.1

    1. 打开 IPv4 标签页。
    2. gateway 字段中输入网关地址在其中 IP 范围旁的地址:

      set default gw in control center ipv4

  2. 设置 IPv6 默认网关。例如,要将连接中默认网关的 IPv6 地址设置为 2001:db8:1::1

    1. 打开 IPv6 标签。
    2. gateway 字段中输入网关地址在其中 IP 范围旁的地址:

      set default gw in control center ipv6

  3. 点击 应用
  4. Network 窗口中,通过将连接到 Off 的按钮切换为 Off 并返回 On 来禁用并重新启用连接,以使 更改 生效。

    警告

    所有目前使用这个网络连接的连接在重启过程中暂时中断。

  5. (可选)验证路由是否活跃。

    显示 IPv4 默认网关:

    $ ip -4 route
    default via 192.0.2.1 dev example proto static metric 100

    显示 IPv6 默认网关:

    $ ip -6 route
    default via 2001:db8:1::1 dev example proto static metric 100 pref medium

20.5. 使用 nmstatectl 在现有连接上设置默认网关

您可以使用 nmstatectl 实用程序设置网络连接的默认网关。这个步骤描述了如何将现有 enp1s0 连接的默认网关设置为 192.0.2.1

先决条件

  • 至少需要在设置默认网关的连接上配置一个静态 IP 地址。
  • 配置了 enp1s0 接口,默认网关的 IP 地址位于该接口的 IP 配置子网中。
  • 已安装 nmstate 软件包。

流程

  1. 创建包含以下内容的 YAML 文件,如 ~/set-default-gateway.yml:

    ---
    routes:
      config:
      - destination: 0.0.0.0/0
        next-hop-address: 192.0.2.1
        next-hop-interface: enp1s0
  2. 将设置应用到系统:

    # nmstatectl set ~/set-default-gateway.yml

其它资源

  • 有关详情请参考 nmstatectl nmstatectl(8) man page。
  • 如需更多配置示例,请参阅 /usr/share/doc/nmstate/examples/ 目录。

20.6. 使用系统角色在现有连接上设置默认网关

您可以使用 networking RHEL 系统角色设置默认网关。

重要

当您运行使用 networking RHEL 系统角色的 play 时,如果设置与 play 中指定的设置不匹配,则系统角色会覆盖具有相同名称的现有连接配置集。因此,在 play 中总是指定网络连接配置集的完整配置,即使 IP 配置已经存在。否则,角色会将这些值重置为其默认值。

具体来说,该流程会使用以下设置创建或更新 enp1s0 连接配置集:

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

先决条件

  • 在控制节点上安装 ansiblerhel-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: linux-system-roles.network
    
        vars:
          network_connections:
            - name: enp1s0
              type: ethernet
              autoconnect: yes
              ip:
                address:
                  - 198.51.100.20/24
                  - 2001:db8:1::1/64
                gateway4: 198.51.100.254
                gateway6: 2001:db8:1::fffe
                dns:
                  - 198.51.100.200
                  - 2001:db8:1::ffbb
                dns_search:
                  - example.com
              state: up
  3. 运行 playbook:

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

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

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

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

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

其它资源

  • /usr/share/ansible/roles/rhel-system-roles.network/README.md file
  • ansible-playbook(1) man page

20.7. 使用旧的网络脚本在现有连接中设置默认网关

这个步骤描述了如何使用旧的网络脚本配置默认网关。示例将默认网关设置为 192.0.2.1,可通过 enp1s0 接口访问。

先决条件

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

流程

  1. /etc/sysconfig/network-scripts/ifcfg-enp1s0 文件中的 GATEWAY 参数设置为 192.0.2.1:

    GATEWAY=192.0.2.1
  2. default 文件中添加 /etc/sysconfig/network-scripts/route-enp0s1 条目:

    default via 192.0.2.1
  3. 重启网络:

    # systemctl restart network

20.8. NetworkManager 如何管理多个默认网关

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

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

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

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

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

以下是经常使用的网络类型及其默认指标的概述:

连接类型默认指标值

VPN

50

Ethernet

100

MACsec

125

InfiniBand

150

Bond

300

Team

350

VLAN

400

Bridge

425

TUN

450

Wi-Fi

600

IP tunnel

675

其它资源

20.9. 配置 NetworkManager 以避免使用特定配置集提供默认网关

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

先决条件

  • 连接没有连接到默认网关的 NetworkManager 连接配置集已存在。

流程

  1. 如果连接使用动态 IP 配置,请配置网络管理器(NetworkManager)不使用连接作为 IPv4 和 IPv6 连接的默认路由:

    # nmcli connection modify connection_name ipv4.never-default yes ipv6.never-default yes

    请注意,将 ipv4.never-defaultipv6.never-default 设置为 yes,会自动从连接配置集中删除对应协议的默认网关 IP 地址。

  2. 激活连接:

    # nmcli connection up connection_name

验证步骤

  • 使用 ip -4 routeip -6 route 命令验证 RHEL 是否在 IPv4 和 IPv6 协议的默认路由中使用网络接口。

20.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-LANInternet-Provider 的配置集设置了默认网关。因为在本地网络中,默认网关通常是最接近互联网的主机,所以其余部分假设 Corporate-LAN 中的默认网关不正确。

  3. 配置网络管理器(NetworkManager)不使用 Corporate-LAN 连接作为 IPv4 和 IPv6 连接的默认路由:

    # nmcli connection modify Corporate-LAN ipv4.never-default yes ipv6.never-default yes

    请注意,将 ipv4.never-defaultipv6.never-default 设置为 yes,会自动从连接配置集中删除对应协议的默认网关 IP 地址。

  4. 激活 Corporate-LAN 连接:

    # nmcli connection up Corporate-LAN

验证步骤

  • 显示 IPv4 和 IPv6 路由表,并确认每个协议都只有一个默认网关:

    • 对于 IPv4,请输入:

      # ip -4 route
      default via 192.0.2.1 dev enp1s0 proto static metric 101
      ...
    • 对于 IPv6,请输入:

      # ip -6 route
      default via 2001:db8:1::1 dev enp1s0 proto static metric 101 pref medium
      ...

其它资源

第 21 章 配置静态路由

默认情况下,如果配置了默认网关,Red Hat Enterprise Linux 会将没有直接连接到主机的网络流量转发到默认网关。使用静态路由,您可以配置 Red Hat Enterprise Linux 将特定主机或网络的流量转发到不同于默认网关的不同路由器。本节论述了配置静态路由的不同选项。

21.1. 如何使用 nmcli 命令配置静态路由

要配置静态路由,请使用以下语法的 nmcli 工具:

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

该命令支持以下路由属性:

  • table=n
  • src=address
  • tos=n
  • onlink=true|false
  • window=n
  • cwnd=n
  • mtu=n
  • lock-window=true|false
  • lock-cwdn=true|false
  • lock-mtu=true|false

如果您使用 ipv4.routes 子命令,nmcli 会覆盖这个参数的所有当前设置。要添加额外路由,请使用 nmcli connection modify connection_name +ipv4.routes "…" 命令。同样,您可以使用 nmcli connection modify connection_name -ipv4.routes "…" 删除特定路由。

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

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

本节中的步骤论述了如何将路由添加到使用 192.0.2.0/24 运行网关的 198.51.100.1 网络,这些网关可通过 example 连接访问。

先决条件

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

流程

  1. 将静态路由添加到 example 连接:

    $ sudo nmcli connection modify example +ipv4.routes "192.0.2.0/24 198.51.100.1"

    要在一个步骤中设置多个路由,使用逗号分隔单个路由传递给该命令。例如,要将路由添加到 192.0.2.0/24203.0.113.0/24 网络(都通过 198.51.100.1 网关路由),请输入:

    $ sudo nmcli connection modify example +ipv4.routes "192.0.2.0/24 198.51.100.1, 203.0.113.0/24 198.51.100.1"
  2. (可选)验证路由是否已正确添加到配置中:

    $ nmcli connection show example
    ...
    ipv4.routes:        { ip = 192.0.2.1/24, nh = 198.51.100.1 }
    ...
  3. 重启网络连接:

    $ sudo nmcli connection up example
    警告

    重启连接会破坏那个接口的连接。

  4. (可选)验证路由是否活跃:

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

其它资源

  • 有关 nmcli的详情,请查看 nmcli(1) man page。

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

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

本节中的步骤论述了如何将路由添加到使用 198.51.100.1 运行的网关的 192.0.2.0/24 网络。

先决条件

流程

  1. 打开 IPv4 标签页。
  2. (可选)通过点击 IPv4 标签中的 Routes 项中的 On 按钮来禁用自动路由,只使用静态路由。如果启用了自动路由,Red Hat Enterprise Linux 将使用静态路由和从 DHCP 服务器接收的路由。
  3. 输入地址、子网掩码、网关和可选的指标值:

    IPv4 static route in control center

  4. 点击 应用
  5. Network 窗口中,通过将连接到 Off 的按钮切换为 Off 并返回 On 来禁用并重新启用连接,以使 更改 生效。

    警告

    重启连接会破坏那个接口的连接。

  6. (可选)验证路由是否活跃:

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

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

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

本节中的步骤论述了如何将路由添加到使用 192.0.2.0/24 运行网关的 198.51.100.1 网络,这些网关可通过 example 连接访问。

先决条件

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

流程

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

    $ nm-connection-editor
  2. 选择 example 连接并点击 gear wheel 图标编辑现有连接。
  3. 打开 IPv4 标签页。
  4. 点击 路由 按钮。
  5. 点击 添加 按钮并输入地址、子网掩码、网关以及可选的指标值。

    IPv4 static route in nm connection editor

  6. 点击 确定
  7. 点击 Save
  8. 重启网络连接以使更改生效。例如,要使用命令行重启 example 连接:

    $ sudo nmcli connection up example
  9. (可选)验证路由是否活跃:

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

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

您可以使用 nmcli 程序的互动模式将静态路由添加到网络连接配置中。

本节中的步骤论述了如何将路由添加到使用 192.0.2.0/24 运行网关的 198.51.100.1 网络,这些网关可通过 example 连接访问。

先决条件

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

流程

  1. example 连接打开 nmcli 互动模式:

    $ sudo nmcli connection edit example
  2. 添加静态路由:

    nmcli> set ipv4.routes 192.0.2.0/24 198.51.100.1
  3. (可选)验证路由是否已正确添加到配置中:

    nmcli> print
    ...
    ipv4.routes:        { ip = 192.0.2.1/24, nh = 198.51.100.1 }
    ...

    ip 属性显示了要路由的网络,nh 属性显示了网关(下一跳)。

  4. 保存配置:

    nmcli> save persistent
  5. 重启网络连接:

    nmcli> activate example
    警告

    当您重启连接时,所有当前使用这个连接的连接将会被暂时中断。

  6. 保留 nmcli 互动模式:

    nmcli> quit
  7. (可选)验证路由是否活跃:

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

其它资源

  • 有关互动模式中可用命令列表,请在互动 shell 中输入 help

21.6. 使用 nmstatectl 配置静态路由

您可以使用 nmstatectl 实用程序在网络连接配置中添加静态路由。

本节中的步骤论述了如何将路由添加到使用 192.0.2.0/24 运行网关的 198.51.100.1 网络,这些网关可通过 enp1s0 接口访问。

先决条件

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

流程

  1. 创建包含以下内容的 YAML 文件,如 ~/add-static-route-to-enp1s0.yml:

    ---
    routes:
      config:
      - destination: 192.0.2.0/24
        next-hop-address: 198.51.100.1
        next-hop-interface: enp1s0
  2. 将设置应用到系统:

    # nmstatectl set ~/add-static-route-to-enp1s0.yml

其它资源

  • 有关详情请参考 nmstatectl nmstatectl(8) man page。
  • 如需更多配置示例,请参阅 /usr/share/doc/nmstate/examples/ 目录。

21.7. 使用 RHEL 系统角色配置静态路由

您可以使用 networking RHEL 系统角色配置静态路由。

重要

当您运行使用 networking RHEL 系统角色的 play 时,如果设置与 play 中指定的设置不匹配,则系统角色会覆盖具有相同名称的现有连接配置集。因此,在 play 中总是指定网络连接配置集的完整配置,即使 IP 配置已经存在。否则,角色会将这些值重置为其默认值。

具体来说,该流程会使用以下设置创建或更新 enp7s0 连接配置集:

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

    • 192.0.2.0/24 使用网关 198.51.100.1
    • 203.0.113.0/24 使用网关 198.51.100.2

先决条件

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

流程

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

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

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

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

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

      # ansible-playbook -u user_name --ask-become-pass ~/add-static-routes.yml

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

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

验证步骤

  • 显示路由表:

    # ip -4 route
    default via 198.51.100.254 dev enp7s0 proto static metric 100
    192.0.2.0/24 via 198.51.100.1 dev enp7s0 proto static metric 100
    203.0.113.0/24 via 198.51.100.2 dev enp7s0 proto static metric 100
    ...

其它资源

  • /usr/share/ansible/roles/rhel-system-roles.network/README.md file
  • ansible-playbook(1) man page

21.8. 使用旧的网络脚本以键-值格式创建静态路由配置文件

这个步骤描述了,在使用旧的网络脚本而不是 NetworkManager 时,如何手动为 192.0.2.0/24 网络的 IPv4 路由创建路由配置文件。在这个示例中,IP 地址为 198.51.100.1 的对应网关可以通过 enp1s0 接口访问。

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

注意

旧的网络脚本只支持静态 IPv4 路由的键值格式。对于 IPv6 路由,使用 ip-command-format。在使用 旧的网络脚本时,请参阅使用 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 地址,用于第一个路由条目。

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

  2. 重启网络:

    # systemctl restart network

其它资源

  • 有关配置旧的网络脚本的详情,请参考 /usr/share/doc/network-scripts/sysconfig.txt 文件。

21.9. 在使用旧的网络脚本时,使用 ip-command-format 创建静态路由配置文件

此流程描述了如何使用旧网络脚本为以下静态路由手动创建路由配置文件:

  • 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

其它资源

  • 有关配置旧的网络脚本的详情,请参考 /usr/share/doc/network-scripts/sysconfig.txt 文件。

第 22 章 配置基于策略的路由以定义其他路由

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

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

注意

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

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

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

该流程假设以下网络拓扑:

policy based routing

先决条件

  • 系统使用 NetworkManager 配置网络,这是 RHEL 8 中的默认设置。
  • 要在流程中设置的 RHEL 路由器有四个网络接口:

    • enp7s0 接口连接到供应商 A 的网络。提供商网络中的网关 IP 是 198.51.100.2,网络使用了 /30 网络掩码。
    • enp1s0 接口连接到供应商 B 的网络。提供商网络中的网关 IP 是 192.0.2.2,网络使用了 /30 网络掩码。
    • enp8s0 接口使用内部工作站连接到 10.0.0.0/24 子网。
    • enp9s0 界面连接到有公司服务器的 203.0.113.0/24 子网。
  • 内部工作站子网中的主机使用 10.0.0.1 作为默认网关。在此过程中,您可以将此 IP 地址分配给路由器的 enp8s0 网络接口。
  • 服务器子网中的主机使用 203.0.113.1 作为默认网关。在此过程中,您可以将此 IP 地址分配给路由器的 enp9s0 网络接口。
  • firewalld 服务已启用并激活。

流程

  1. 将网络接口配置为供应商 A:

    # nmcli connection add type ethernet con-name Provider-A ifname enp7s0 ipv4.method manual ipv4.addresses 198.51.100.1/30 ipv4.gateway 198.51.100.2 ipv4.dns 198.51.100.200 connection.zone external

    nmcli connection add 命令创建网络管理器连接配置集。以下列表描述了该命令的选项:

    • 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. 将网络接口配置为供应商 B:

    # nmcli connection add type ethernet con-name Provider-B ifname enp1s0 ipv4.method manual ipv4.addresses 192.0.2.1/30 ipv4.routes "0.0.0.0/0 192.0.2.2 table=5000" connection.zone external

    这个命令使用 ipv4.routes 参数而不是 ipv4.gateway 设置默认网关。这需要为这个连接分配默认网关到不同的路由表(5000)而不是默认路由表。当连接被激活时,NetworkManager 会自动创建这个新的路由表。

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

    # nmcli connection add type ethernet con-name Internal-Workstations ifname enp8s0 ipv4.method manual ipv4.addresses 10.0.0.1/24 ipv4.routes "10.0.0.0/24 src=192.0.2.1 table=5000" ipv4.routing-rules "priority 5 from 10.0.0.0/24 table 5000" connection.zone internal

    此命令使用 ipv4.routes 参数将静态路由添加到路由表, ID 为 500010.0.0.0/24 子网的这个静态路由使用本地网络接口的 IP 地址到供应商 B(192.0.2.1)作为下一跳。

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

    请注意,ipv4.routing-rules 参数中的语法与 ip route 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 internal

验证步骤

  1. 在内部工作站子网的 RHEL 主机上:

    1. 安装 traceroute 软件包:

      # yum install traceroute
    2. 使用 traceroute 工具显示到互联网主机的路由:

      # traceroute redhat.com
      traceroute to redhat.com (209.132.183.105), 30 hops max, 60 byte packets
       1  10.0.0.1 (10.0.0.1)     0.337 ms  0.260 ms  0.223 ms
       2  192.0.2.1 (192.0.2.1)   0.884 ms  1.066 ms  1.248 ms
       ...

      命令的输出显示路由器通过 192.0.2.1发送数据包,这是供应商 B 的网络。

  2. 在服务器子网的 RHEL 主机上:

    1. 安装 traceroute 软件包:

      # yum install traceroute
    2. 使用 traceroute 工具显示到互联网主机的路由:

      # traceroute redhat.com
      traceroute to redhat.com (209.132.183.105), 30 hops max, 60 byte packets
       1  203.0.113.1 (203.0.113.1)    2.179 ms  2.073 ms  1.944 ms
       2  198.51.100.2 (198.51.100.2)  1.868 ms  1.798 ms  1.549 ms
       ...

      命令的输出显示路由器通过 198.51.100.2发送数据包,这是供应商 A 的网络。

故障排除步骤

在 RHEL 路由器中:

  1. 显示规则列表:

    # ip rule list
    0:	from all lookup local
    5:	from 10.0.0.0/24 lookup 5000
    32766:	from all lookup main
    32767:	from all lookup default

    默认情况下,RHEL 包含表 localmaindefault 的规则。

  2. 显示表 5000 中的路由:

    # ip route list table 5000
    0.0.0.0/0 via 192.0.2.2 dev enp1s0 proto static metric 100
    10.0.0.0/24 dev enp8s0 proto static scope link src 192.0.2.1 metric 102
  3. 显示接口和防火墙区:

    # firewall-cmd --get-active-zones
    external
      interfaces: enp1s0 enp7s0
    internal
      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
      ...

其它资源

  • 有关您可以在 nmcli connection add 命令中设置的 ipv4.* 参数的详情,请查看 nm-settings(5) man page 中的 IPv4 settings 部分。
  • 有关您可以在 nmcli connection add 命令中设置的 connection.* 参数的详情,请查看 nm-settings(5) man page 中的 Connection settings 部分。
  • 有关使用 nmcli 管理网络管理器连接的详情,请参考 nmcli(1) man page 中的 Connection management commands 部分。

22.2. 使用旧网络脚本时,涉及基于策略的路由的配置文件概述

如果您使用旧的网络脚本而不是 NetworkManager 配置网络,您也可以配置基于策略的路由。

注意

使用 network-scripts 软件包(在 RHEL 8 中已弃用)提供的旧网络脚本配置网络。红帽建议您使用 NetworkManager 配置基于策略的路由。例如,请参阅 第 22.1 节 “使用 NetworkManager 将特定子网的流量路由到不同的默认网关”

使用旧的网络脚本时,以下配置文件会涉及基于策略的路由:

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

其它资源

  • 有关 IP 路由的详情,请查看 ip-route(8) man page。
  • 有关路由规则的详情,请查看 ip-rule(8) man page。

22.3. 使用旧网络脚本将特定子网的流量路由到不同的默认网关

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

重要

使用 network-scripts 软件包(在 RHEL 8 中已弃用)提供的旧网络脚本配置网络。只有在主机上使用旧网络脚本而不是 NetworkManager 时,才需要按照本节中的步骤进行操作。如果您使用 NetworkManager 管理网络设置,请参阅 使用 NetworkManager 将特定子网的流量路由到不同的默认网关

该流程假设以下网络拓扑:

policy based routing

注意

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

先决条件

  • 未安装 NetworkManager 软件包,或者 NetworkManager 服务被禁用。
  • 已安装 network-scripts 软件包。
  • 要在流程中设置的 RHEL 路由器有四个网络接口:

    • enp7s0 接口连接到供应商 A 的网络。提供商网络中的网关 IP 是 198.51.100.2,网络使用了 /30 网络掩码。
    • enp1s0 接口连接到供应商 B 的网络。提供商网络中的网关 IP 是 192.0.2.2,网络使用了 /30 网络掩码。
    • enp8s0 接口使用内部工作站连接到 10.0.0.0/24 子网。
    • enp9s0 界面连接到有公司服务器的 203.0.113.0/24 子网。
  • 内部工作站子网中的主机使用 10.0.0.1 作为默认网关。在此过程中,您可以将此 IP 地址分配给路由器的 enp8s0 网络接口。
  • 服务器子网中的主机使用 203.0.113.1 作为默认网关。在此过程中,您可以将此 IP 地址分配给路由器的 enp9s0 网络接口。
  • firewalld 服务已启用并激活。

流程

  1. 通过创建包含以下内容的 /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 添加网络接口配置:

    1. 使用以下内容创建 /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

      请注意,这个接口的配置文件不包含默认的网关设置。

    2. 2_Provider-B 连接的网关分配给单独的路由表。因此,使用以下内容创建 /etc/sysconfig/network-scripts/route-2_Provider-B 文件:

      0.0.0.0/0 via 192.0.2.2 table 5000

      这个条目将通过这个网关路由的所有子网的网关和流量分配到表 5000.

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

    1. 使用以下内容创建 /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
    2. 为内部工作站子网添加路由规则配置。因此,使用以下内容创建 /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。低的值具有更高的优先级。

    3. 使用以下内容创建 /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,并用作下一跳。

  4. 通过创建包含以下内容的 /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
  5. 重启网络:

    # systemctl restart network

验证步骤

  1. 在内部工作站子网的 RHEL 主机上:

    1. 安装 traceroute 软件包:

      # yum install traceroute
    2. 使用 traceroute 工具显示到互联网主机的路由:

      # traceroute redhat.com
      traceroute to redhat.com (209.132.183.105), 30 hops max, 60 byte packets
       1  10.0.0.1 (10.0.0.1)     0.337 ms  0.260 ms  0.223 ms
       2  192.0.2.1 (192.0.2.1)   0.884 ms  1.066 ms  1.248 ms
       ...

      命令的输出显示路由器通过 192.0.2.1发送数据包,这是供应商 B 的网络。

  2. 在服务器子网的 RHEL 主机上:

    1. 安装 traceroute 软件包:

      # yum install traceroute
    2. 使用 traceroute 工具显示到互联网主机的路由:

      # traceroute redhat.com
      traceroute to redhat.com (209.132.183.105), 30 hops max, 60 byte packets
       1  203.0.113.1 (203.0.113.1)    2.179 ms  2.073 ms  1.944 ms
       2  198.51.100.2 (198.51.100.2)  1.868 ms  1.798 ms  1.549 ms
       ...

      命令的输出显示路由器通过 198.51.100.2发送数据包,这是供应商 A 的网络。

故障排除步骤

在 RHEL 路由器中:

  1. 显示规则列表:

    # ip rule list
    0:      from all lookup local
    5:      from 10.0.0.0/24 lookup 5000
    32766:  from all lookup main
    32767:  from all lookup default

    默认情况下,RHEL 包含表 localmaindefault 的规则。

  2. 显示表 5000 中的路由:

    # ip route list table 5000
    default via 192.0.2.2 dev enp1s0
    10.0.0.0/24 via 192.0.2.1 dev enp1s0
  3. 显示接口和防火墙区:

    # firewall-cmd --get-active-zones
    external
      interfaces: enp1s0 enp7s0
    internal
      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
      ...

其它资源

第 23 章 创建 dummy 接口

作为 Red Hat Enterprise Linux 用户,您可以创建并使用 dummy 网络接口进行调试和测试。dummy 接口提供了一个设备来路由数据包而无需实际传送数据包。它可让您创建使用网络管理器(NetworkManager)管理的其他回送设备,使不活跃 SLIP(Serial Line Internet Protocol)地址类似本地程序的实际地址。

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

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

注意

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

流程

  1. 要创建一个名为 dummy0 的、带有静态 IPv4 和 IPv6 地址的 dummy 接口,请输入:

    # nmcli connection add type dummy ifname dummy0 ipv4.method manual ipv4.addresses 192.0.2.1/24 ipv6.method manual ipv6.addresses 2001:db8:2::1/64
  2. 可选: 要查看 dummy 接口,请输入:

    # nmcli connection show
    NAME            UUID                                  TYPE      DEVICE
    enp1s0          db1060e9-c164-476f-b2b5-caec62dc1b05  ethernet    ens3
    dummy-dummy0    aaf6eb56-73e5-4746-9037-eed42caa8a65  dummy    dummy0

其它资源

  • nm-settings(5) man page

第 24 章 使用 netconsole 通过网络记录内核信息

使用 netconsole 内核模块和同名的服务,您可以在登录到磁盘时或者无法使用串口控制台时,通过网络记录内核信息来调试内核。

24.1. 配置 netconsole 服务为将内核信息记录到远程主机

使用 netconsole 内核模块,您可以将内核信息记录到远程系统日志服务。

先决条件

  • 在远程主机上安装了系统日志服务,如 rsyslog
  • 远程系统日志服务被配置为接收来自此主机的日志条目。

流程

  1. 安装 netconsole-service 软件包:

    # yum install netconsole-service
  2. 编辑 /etc/sysconfig/netconsole 文件并将 SYSLOGADDR 参数设置为远程主机的 IP 地址:

    # SYSLOGADDR=192.0.2.1
  3. 启用并启动 netconsole 服务:

    # systemctl enable --now netconsole

验证步骤

  • 在远程系统日志服务器中显示 /var/log/messages 文件。

其它资源

  • 有关启用远程主机接收日志信息的详情,请参考 Configuring basic system settings 文档中的配置远程日志解决方案部分。

第 25 章 systemd 网络目标和服务

NetworkManager 在系统引导过程中配置网络。但是,当使用远程根(/)引导时,如 root 目录存储在 iSCSI 设备中时,网络设置会在 RHEL 启动前在初始 RAM 磁盘(initrd)中应用。例如:如果在内核命令行中使用 rd.neednet=1 指定网络配置,或者指定了用于挂载远程文件系统的配置,那么网络设置就会在 initrd 中应用。

本节描述了应用网络设置时使用的不同目标,如 networknetwork-onlineNetworkManager-wait-online 服务,以及如何配置 systemd 服务在 network-online 服务启动后启动。

25.1. network 和 network-online systemd target 的不同

Systemd 维护 networknetwork-online 目标单元。特殊单元,如 NetworkManager-wait-online.serviceWantedBy=network-online.targetBefore=network-online.target 参数。如果启用,这些单元以 network-online.target 开始,并延迟达到目标直到建立了某种类型的网络连接。它们会延迟 network-online 目标直到网络连接。

network-online 目标启动一个服务,这会增加更长的延迟来进一步执行。Systemd 会自动将这个目标单元的带有 WantsAfter 参数的依赖关系添加到所有 System V(SysV) init 脚本服务单元中,并引用 $network 工具。LSB 标头是 init 脚本的元数据。您可以使用它指定依赖项。这与 systemd 目标类似。

network 目标不会显著延迟引导过程的执行。达到 network 目标意味着,负责设置网络的服务已启动。但并不意味着已经配置了一个网络设备。这个目标在关闭系统的过程中非常重要。例如:如果您在引导过程中有一个在 network 目标之后排序的服务,则在关闭过程中会取消这个依赖关系。在服务停止后,网络才会断开连接。远程网络文件系统的所有挂载单元都自动启动 network-online 目标单元和顺序。

注意

network-online 目标单元只在系统启动时有用。系统完成引导后,这个目标不会跟踪网络的在线状态。因此,您无法使用 network-online 来监控网络连接。这个目标提供了一个一次性系统启动概念。

25.2. NetworkManager-wait-online 概述

同步传统网络脚本会遍历所有配置文件来设置设备。它们应用所有与网络相关的配置并确保网络在线。

NetworkManager-wait-online 服务会等待一个超时时间来配置网络。这个网络配置涉及插入以太网设备、扫描 Wi-Fi 设备等。NetworkManager 会自动激活配置为自动启动的适当配置集。因 DHCP 超时或类似事件导致自动激活失败,网络管理器(NetworkManager)可能会在一定时间内处于忙碌状态。根据配置,NetworkManager 会重新尝试激活同一配置集或不同的配置集。

当启动完成后,所有配置集都处于断开连接的状态,或被成功激活。您可以配置配置集来自动连接。以下是一些参数示例,这些参数设定超时或者在连接被视为活跃时定义:

  • connection.wait-device-timeout - 为驱动程序设定检测设备的超时时间
  • ipv4.may-failipv6.may-fail - 使用一个 IP 地址家族或者一个特定的地址系列是否已完成配置进行激活。
  • ipv4.gateway-ping-timeout - 延迟激活。

其它资源

  • nm-settings(5) man page

25.3. 将 systemd 服务配置为在网络已启动后再启动

Red Hat Enterprise Linux 在 /usr/lib/systemd/system/ 目录中安装 systemd 服务文件。此流程为 /etc/systemd/system/service_name.service.d/ 中的服务文件创建一个 drop-in 片断,该文件与 /usr/lib/systemd/system/ 中的服务文件一同使用,以便在网络 上线后启动特定服务。如果在 drop-in 片断中的设置与 /usr/lib/systemd/system/ 中的服务文件中的设置重叠,则其具有更高优先级。

流程

  1. 要在编辑器中打开服务文件,请输入:

    # systemctl edit service_name

  2. 输入以下内容并保存更改:

    [Unit]
    After=network-online.target
  3. 重新载入 systemd 服务。

    # systemctl daemon-reload

第 26 章 Linux 流量控制

Linux 提供管理和操作数据包传输的工具。Linux 流量控制(TC)子系统帮助进行策略、分类、控制以及调度网络流量。TC 还可以通过使用过滤器和动作在分类过程中利用数据包内容分栏。TC 子系统使用排队规则(qdisc)来达到此目的,这是 TC 构架的一个基本元素。

调度机制在进入或退出不同的队列前确定或者重新安排数据包。最常见的调度程序是先入先出(FIFO)调度程序。您可以使用 tc 实用程序或永久使用 NetworkManager 进行 qdiscs 操作。

本节介绍了排队规则,并描述了如何更新 RHEL 中的默认 qdiscs

26.1. 排队规则概述

排队规则(qdiscs)可帮助查询以及稍后使用网络接口调度流量传输。qdisc 有两个操作:

  • 启用队列请求,以便可以排队数据包以便稍后进行传输
  • 取消队列请求,以便可以选择队列数据包之一以进行即时传输。

每个 qdisc 都有一个名为 handle 的 16 位十六进制数字,带有一个附加的冒号,如 1:abcd:。这个数字被称为 qdisc 主数字。如果 qdisc 有类,则标识符为一个由两个数字组成的对,主数字在次数字之前,<major>:<minor>,例如 abcd:1。次数字的编号方案根据 qdisc 类型而定。有时,编号是系统性的,第一类有 ID <major>:1、第 2 类 <major>:2等。一些 qdiscs 允许用户在创建类时随机设置类次要数字。

Classful qdiscs

存在不同的 qdiscs 类型,有助于将数据包传送到网络接口或从网络接口传输。您可以使用 root、parent 和 child 类配置 qdiscs。子对象可以被附加的位置被称为 class。qdisc 中的类灵活,可以包括多个子类或一个子类 qdisc。对于包含类 qdisc 本身的类没有问题,这会导致复杂的流量控制场景。类 qdiscs 本身不存储任何数据包。反之,它们根据 qdisc的具体条件把子队列和出队请求降到他们的子对象中。最后,这个递归数据包传递最终结束保存数据包的位置(在出现排队时从中提取)。

无类别 qdiscs

一些 qdiscs 不包含子类,它们名为无类别 qdiscs。与类 qdiscs 相比,无类别 qdiscs 需要较少的定制。通常情况下,将它们附加到接口就足够了。

其它资源

  • 有关无类别和等级 qdiscs 的详细信息,请参考 tc(8) man page。
  • 有关动作的详情请参考 actionstc-actions.8 man page。

26.2. RHEL 中可用的 qdiscs

每个 qdisc 都处理唯一的与网络相关的问题。以下是 RHEL 中可用的 qdiscs 列表。您可以使用以下 qdisc 中的任何一种来根据您的网络要求控制网络流量。

表 26.1. RHEL 中的可用调度程序

qdisc 名称包含在卸载支持

异步传输模式(ATM)

kernel-modules-extra

 

基于类的队列

kernel-modules-extra

 

基于数据的 Shaper

kernel-modules-extra

CHOose 和 Keep 用于有响应的流量,CHOose 和 Kill 用于没有响应的流量(CHOKE)

kernel-modules-extra

 

受控的延迟(CoDel)

kernel-core

 

提供了 Robin(DRR)

kernel-modules-extra

 

Differentiated Services marker (DSMARK)

kernel-modules-extra

 

Enhanced Transmission Selection (ETS)

kernel-modules-extra

Fair Queue (FQ)

kernel-core

 

Fair Queuing Controlled Delay (FQ_CODel)

kernel-core

 

Generalized Random Early Detection (GRED)

kernel-modules-extra

 

Hierarchical Fair Service Curve (HSFC)

kernel-core

 

Heavy-Hitter Filter (HHF)

kernel-core

 

Hierarchy Token Bucket (HTB)

kernel-core

 

INGRESS

kernel-core

Multi Queue Priority (MQPRIO)

kernel-modules-extra

Multiqueue (MULTIQ)

kernel-modules-extra

Network Emulator (NETEM)

kernel-modules-extra

 

Proportional Integral-controller Enhanced (PIE)

kernel-core

 

PLUG

kernel-core

 

Quick Fair Queueing (QFQ)

kernel-modules-extra

 

Random Early Detection (RED)

kernel-modules-extra

Stochastic Fair Blue (SFB)

kernel-modules-extra

 

Stochastic Fairness Queueing (SFQ)

kernel-core

 

Token Bucket Filter (TBF)

kernel-core

Trivial Link Equalizer (TEQL)

kernel-modules-extra

 
重要

qdisc 卸载需要在 NIC 上支持硬件和驱动程序。

其它资源

  • 如需用于配置 qdiscs 的参数和过滤器的完整信息,请参阅 tc(8)cbqcbschoke, CoDeldrrfq htbmqprionetempiesfbpfifotc-redsfqtbfprio man page。

26.3. 使用 tc 工具检查网络接口的 qdiscs

默认情况下,Red Hat Enterprise Linux 系统使用 fq_codel qdisc。这个步骤描述了如何检查 qdisc 计数器。

流程

  1. 可选:查看您当前的 qdisc

    # tc qdisc show dev enp0s1

  2. 检查当前的 qdisc 计数器:

    # tc -s qdisc show dev enp0s1
    qdisc fq_codel 0: root refcnt 2 limit 10240p flows 1024 quantum 1514 target 5.0ms interval 100.0ms memory_limit 32Mb ecn
    Sent 1008193 bytes 5559 pkt (dropped 233, overlimits 55 requeues 77)
    backlog 0b 0p requeues 0
    ....
  • dropped - 由于所有队列已满而使数据包被丢弃的次数
  • overlimits - 配置的链路容量已满的次数
  • sent - 出队的数量

26.4. 更新默认的 qdisc

如果使用当前的 qdisc 观察网络数据包丢弃的事件,您可以根据您的网络需要更改 qdisc。您可以选择 qdisc来满足您的网络要求。这个步骤描述了如何更改 Red Hat Enterprise Linux 的默认 qdisc

流程

  1. 查看当前的默认 qdisc

    # sysctl -a | grep qdisc
    net.core.default_qdisc = fq_codel
  2. 查看当前以太网连接的 qdisc

    # tc -s qdisc show dev enp0s1
    qdisc fq_codel 0: root refcnt 2 limit 10240p flows 1024 quantum 1514 target 5.0ms interval 100.0ms memory_limit 32Mb ecn
    Sent 0 bytes 0 pkt (dropped 0, overlimits 0 requeues 0)
    backlog 0b 0p requeues 0
    maxpacket 0 drop_overlimit 0 new_flow_count 0 ecn_mark 0
    new_flows_len 0 old_flows_len 0
  3. 更新现有 qdisc:

    # sysctl -w net.core.default_qdisc=pfifo_fast

  4. 要应用这些更改,请重新载入网络驱动程序:

    # rmmod NETWORKDRIVERNAME

    # modprobe NETWORKDRIVERNAME

  5. 启动网络接口:

    # ip link set enp0s1 up

验证步骤

  • 查看以太网连接的 qdisc:

    # tc -s qdisc show dev enp0s1
    qdisc pfifo_fast 0: root refcnt 2 bands 3 priomap  1 2 2 2 1 2 0 0 1 1 1 1 1 1 1 1
     Sent 373186 bytes 5333 pkt (dropped 0, overlimits 0 requeues 0)
     backlog 0b 0p requeues 0
    ....

其它资源

26.5. 使用 tc 工具临时设置网络接口的当前 qdisk

您可以在不更改默认文件的情况下更新当前的 qdisc。这个步骤描述了如何更改 Red Hat Enterprise Linux 中当前的 qdisc

流程

  1. 可选:查看当前 qdisc:

    # tc -s qdisc show dev enp0s1

  2. 更新当前的 qdisc:

    # tc qdisc replace dev enp0s1 root htb

验证步骤

  • 查看更新的当前 qdisc

    # tc -s qdisc show dev enp0s1
    qdisc htb 8001: root refcnt 2 r2q 10 default 0 direct_packets_stat 0 direct_qlen 1000
    Sent 0 bytes 0 pkt (dropped 0, overlimits 0 requeues 0)
    backlog 0b 0p requeues 0

26.6. 使用 NetworkManager 永久设置网络接口的当前 qdisk

您可以更新网络管理器连接的当前 qdisc 值。

流程

  1. 可选:查看当前 qdisc:

    # tc qdisc show dev enp0s1
      qdisc fq_codel 0: root refcnt 2
  2. 更新当前的 qdisc:

    # nmcli connection modify enp0s1 tc.qdiscs ‘root pfifo_fast’

  3. 可选: 要比现有的 qdisc 添加另一个 qdisc,使用 +tc.qdisc 选项:

    # nmcli connection modify enp0s1 +tc.qdisc ‘ingress handle ffff:’

  4. 激活更改:

    # nmcli connection up enp0s1

验证步骤

  • 查看当前 qdisc 网络接口:

    # tc qdisc show dev enp0s1
    qdisc pfifo_fast 8001: root refcnt 2 bands 3 priomap  1 2 2 2 1 2 0 0 1 1 1 1 1 1 1 1
    qdisc ingress ffff: parent ffff:fff1 ----------------

其它资源

  • 如需更多信息,请参阅 nm-settings(5) man page。

第 27 章 多路径 TCP 入门

重要

多路径 TCP 仅作为技术预览提供。红帽产品服务级别协议(SLA)不支持技术预览功能,且其功能可能并不完善,因此红帽不建议在生产环境中使用它们。这些预览可让用户早期访问将来的产品功能,让用户在开发过程中测试并提供反馈意见。

如需有关 技术预览功能支持范围 的信息,请参阅红帽客户门户网站中的技术预览功能支持范围。

多路径 TCP(MPTCP)是传输控制协议(TCP)的扩展。通过使用互联网协议(IP),主机可以将数据包发送到目的地。TCP 可确保通过互联网可靠地提供数据,并自动调整其带宽以响应网络负载。

以下是 MPTCP 的优点:

  • 它为带有两个或者多个网络接口的设备启用 TCP。
  • 它允许用户同时使用不同的网络接口或从一个连接间无缝切换。
  • 它提高了网络中的资源使用量以及网络故障的恢复能力。

本节描述了如何:

  • 创建新的 MPTCP 连接,
  • 使用 iproute2 为 MPTCP 连接添加新的子流和 IP 地址,以及
  • 在内核中禁用 MPTCP 以避免使用 MPTCP 连接的应用程序。

27.1. 准备 RHEL 启用 MPTCP 支持

一些应用程序原生支持 MPTCP。大多数在套接字()调用中,连接和流的套接字请求 TCP 协议。您可以在 RHEL 中为原生 MPTCP 支持使用 sysctl 工具启用 MPTCP 支持。MPTCP 的实现也被设计为允许在请求 IPPROTO_TCP 调用内核的应用程序中使用 MPTCP 协议。

此流程描述了如何启用 MPTCP 支持并准备 RHEL,以便使用 SystemTap 脚本启用 MPTCP 系统范围。

先决条件

安装以下软件包:

  • kernel-debuginfo
  • kernel-debuginfo-common
  • systemtap
  • systemtap-devel
  • kernel-devel
  • nmap-ncat

流程

  1. 在内核中启用 MPTCP 套接字:

    # echo "net.mptcp.enabled=1" > /etc/sysctl.d/90-enable-MPTCP.conf
    # sysctl -p /etc/sysctl.d/90-enable-MPTCP.conf
  2. 使用以下内容创建 mptcp.stap 文件:

    #!/usr/bin/env stap
    
    %{
    #include <linux/in.h>
    #include <linux/ip.h>
    %}
    
    /* according to [1], RSI contains 'type' and RDX
     * contains 'protocol'.
     * [1] https://github.com/torvalds/linux/blob/master/arch/x86/entry/entry_64.S#L79
     */
    
    function mptcpify () %{
        if (CONTEXT->kregs->si == SOCK_STREAM &&
            (CONTEXT->kregs->dx == IPPROTO_TCP ||
             CONTEXT->kregs->dx == 0)) {
                    CONTEXT->kregs->dx = IPPROTO_MPTCP;
                    STAP_RETVALUE = 1;
        } else {
               STAP_RETVALUE = 0;
        }
    %}
    
    probe kernel.function("__sys_socket") {
            if (mptcpify() == 1) {
                    printf("command %16s mptcpified\n", execname());
            }
    }
  3. 将 TCP 套接字替换为 MPTCP:

    # stap -vg mptcp.stap

    注: 使用 Ctrl+C 将连接从 MPTCP 转换回 TCP。

  4. 启动侦听 TCP 端口 4321 的服务器:

    # ncat -4 -l 4321

  5. 连接到服务器并交换流量。例如,这里的客户端将 "Hello world" 写入服务器 5 次,然后它终止连接。

    # ncat -4 192.0.2.1 4321
    Hello world 1
    Hello world 2
    Hello world 3
    Hello world 4
    Hello world 5

    Ctrl+D 退出。

验证步骤

  1. 验证内核中是否启用了 MPTCP:

    # sysctl -a | grep mptcp.enabled
    net.mptcp.enabled = 1
  2. mptcp.stap 脚本安装内核探测后,会在内核 dmesg 输出中出现以下警告:

    # dmesg
    ...
    [ 1752.694072] Kprobes globally unoptimized
    [ 1752.730147] stap_1ade3b3356f3e68765322e26dec00c3d_1476: module_layout: kernel tainted.
    [ 1752.732162] Disabling lock debugging due to kernel taint
    [ 1752.733468] stap_1ade3b3356f3e68765322e26dec00c3d_1476: loading out-of-tree module taints kernel.
    [ 1752.737219] stap_1ade3b3356f3e68765322e26dec00c3d_1476: module verification failed: signature and/or required key missing - tainting kernel
  3. 建立连接后,验证 ss 输出以查看特定于子流的状态:

    # ss -nti '( dport :4321 )' dst 192.0.2.1
    State Recv-Q Send-Q Local Address:Port    Peer Address:Port Process
    
    ESTAB 0      0          192.0.2.2:60874      192.0.2.1:4321
    cubic wscale:7,7 rto:201 rtt:0.042/0.017 mss:1448 pmtu:1500 rcvmss:536 advmss:1448 cwnd:10 bytes_sent:64 bytes_$cked:65 segs_out:6 segs_in:5 data_segs_out:4 send 2758095238bps lastsnd:57 lastrcv:3054 lastack:57 pacing_rate 540361516$bps delivery_rate 413714280bps delivered:5 rcv_space:29200 rcv_ssthresh:29200 minrtt:0.009 tcp-ulp-mptcp flags:Mmec token:0000(id:0)/4bffe73d(id:0) seq:c11f40d6c5337463 sfseq:1 ssnoff:f7455705 maplen:0
  4. 使用 tcpdump 捕获流量并检查 MPTCP 子选项的使用:

    # tcpdump -tnni interface tcp port 4321
    client Out IP 192.0.2.2.60802 > 192.0.2.1.4321: Flags [S], seq 3420255622, win 29200, options [mss 1460,sackOK,TS val 411 4539945 ecr 0,nop,wscale 7,mptcp capable v1], length 0
    client In  IP 192.0.2.1.4321 > 192.0.2.2.60802: Flags [S.], seq 2619315374, ack 3420255623, win 28960, options [mss 1460 sackOK,TS val 3241564233 ecr 4114539945,nop,wscale 7,mptcp capable v1 {0xb6f8dc721aee7f64}], length 0
    client Out IP 192.0.2.2.60802 > 192.0.2.1.4321: Flags [.], ack 1, win 229, options [nop,nop,TS val 4114539945 ecr 3241564 233,mptcp capable v1 {0xcc58d5d632a32d13,0xb6f8dc721aee7f64}], length 0
    client Out IP 192.0.2.2.60802 > 192.0.2.1.4321: Flags [P.], seq 1:17, ack 1, win 229, options [nop,nop,TS val 4114539945 ecr 3241564233,mptcp capable v1 {0xcc58d5d632a32d13,0xb6f8dc721aee7f64},nop,nop], length 16
    client In  IP 192.0.2.1.4321 > 192.0.2.2.60802: Flags [.], ack 17, win 227, options [nop,nop,TS val 3241564233 ecr 411459945,mptcp dss ack 1105509586894558345], length 0
    client Out IP 192.0.2.2.60802 > 192.0.2.1.4321: Flags [P.], seq 17:33, ack 1, win 229, options [nop,nop,TS val 4114540939 ecr 3241564233,mptcp dss ack 13265586846326199424 seq 105509586894558345 subseq 17 len 16,nop,nop], length 16

    运行这个命令时需要 tcpdump 软件包。

其它资源

27.2. 使用 iproute2 通知应用程序有关多个可用路径

默认情况下,MPTCP 套接字以一个子流开始,但您可以在第一次创建它后向连接添加新的子流和 IP 地址。此流程描述了如何为子流和 IP 地址更新每个连接限制,并在 MPTCP 连接中添加新的 IP 地址(端点)。

请注意,MPTCP 尚不支持为同一套接字混合 IPv6 和 IPv4 端点。使用属于同一地址系列的端点。

流程

  1. 将每个连接和 IP 地址限值设置为服务器上的 1:

    # ip mptcp limits set subflow 1

  2. 为客户端将每个连接和 IP 地址限值设置为 1

    # ip mptcp limits set subflow 1 add_addr_accepted 1

  3. 在服务器中添加 IP 地址 198.51.100.1 作为新的 MPTCP 端点:

    # ip mptcp endpoint add 198.51.100.1 dev enp1s0 signal

    重要

    您可以为 subflowbackupsignal 设置以下值。将标签设置为:

    • signal,在三方握手完成后发送 ADD_ADDR 数据包
    • subflow,由客户端发送 MP_JOIN SYN
    • backup,将端点设置为备份地址
  4. 使用 -k 参数启动服务器绑定到 0.0.0.0,以防止 ncat 在接受第一个连接后关闭监听套接字,并使服务器拒绝客户端完成的 MP_JOIN SYN

    # ncat -4 0.0.0.0 -k -l 4321

  5. 启动客户端并连接到服务器以交换流量。例如,这里的客户端将 "Hello world" 写入服务器 5 次,然后它终止连接。

    # ncat -4 192.0.2.1 4321
    Hello world 1
    Hello world 2
    Hello world 3
    Hello world 4
    Hello world 5

    Ctrl+D 退出。

验证步骤

  1. 验证连接和 IP 地址限制:

    # ip mptcp limit show

  2. 验证新添加的端点:

    # ip mptcp endpoint show

  3. 使用 tcpdump 捕获流量并检查 MPTCP 子选项的使用:

    # tcpdump -tnni interface tcp port 4321
    client Out IP 192.0.2.2.56868 > 192.0.2.1.4321: Flags [S], seq 3107783947, win 29200, options [mss 1460,sackOK,TS val 2568752336 ecr 0,nop,wscale 7,mptcp capable v1], length 0
    client In  IP 192.0.2.1.4321 > 192.0.2.2.56868: Flags [S.], seq 4222339923, ack 3107783948, win 28960, options [mss 1460,sackOK,TS val 1713130246 ecr 2568752336,nop,wscale 7,mptcp capable v1 {0xf51c07a47cc2ba75}], length 0
    client Out IP 192.0.2.2.56868 > 192.0.2.1.4321: Flags [.], ack 1, win 229, options [nop,nop,TS val 2568752336 ecr 1713130246,mptcp capable v1 {0xb243376cc5af60bd,0xf51c07a47cc2ba75}], length 0
    client Out IP 192.0.2.2.56868 > 192.0.2.1.4321: Flags [P.], seq 1:17, ack 1, win 229, options [nop,nop,TS val 2568752336 ecr 1713130246,mptcp capable v1 {0xb243376cc5af60bd,0xf51c07a47cc2ba75},nop,nop], length 16
    client In  IP 192.0.2.1.4321 > 192.0.2.2.56868: Flags [.], ack 17, win 227, options [nop,nop,TS val 1713130246 ecr 2568752336,mptcp add-addr id 1 198.51.100.1 hmac 0xe445335073818837,mptcp dss ack 5562689076006296132], length 0
    client Out IP 198.51.100.2.42403 > 198.51.100.1.4321: Flags [S], seq 3356992178, win 29200, options [mss 1460,sackOK,TS val 4038525523 ecr 0,nop,wscale 7,mptcp join backup id 0 token 0xad58df1 nonce 0x74a8137f], length 0
    client In  IP 198.51.100.1.4321 > 198.51.100.2.42403: Flags [S.], seq 1680863152, ack 3356992179, win 28960, options [mss 1460,sackOK,TS val 4213669942 ecr 4038525523,nop,wscale 7,mptcp join backup id 0 hmac 0x9eff7a1bf4e65937 nonce 0x77303fd8], length 0
    client Out IP 198.51.100.2.42403 > 198.51.100.1.4321: Flags [.], ack 1, win 229, options [nop,nop,TS val 4038525523 ecr 4213669942,mptcp join hmac 0xdfdc0129424f627ea774c094461328ce49d195bc], length 0
    client In  IP 198.51.100.1.4321 > 198.51.100.2.42403: Flags [.], ack 1, win 227, options [nop,nop,TS val 4213669942 ecr 4038525523,mptcp dss ack 5562689076006296132], length 0

    运行这个命令时需要 tcpdump 软件包。

其它资源

  • 有关可用端点标记的更多信息,请参阅 ip-mptcp(8) man page。

27.3. 在内核中禁用多路径 TCP

这个步骤描述了如何在内核中禁用 MPTCP 选项。

流程

  • 禁用 mptcp.enabled 选项。

    # echo "net.mptcp.enabled=0" > /etc/sysctl.d/90-enable-MPTCP.conf
    # sysctl -p /etc/sysctl.d/90-enable-MPTCP.conf

验证步骤

  • 验证 mptcp.enabled 是否在内核中被禁用。

    # sysctl -a | grep mptcp.enabled
    net.mptcp.enabled = 0

第 28 章 配置 DNS 服务器顺序

大多数应用程序使用 getaddrinfo() 库的 glibc 功能来解决 DNS 请求。默认情况下,glibc 将所有 DNS 请求发送到 /etc/resolv.conf 文件中指定的第一个 DNS 服务器。如果这个服务器没有回复,Red Hat Enterprise Linux 会使用这个文件中的下一个服务器。

这部分论述了如何自定义 DNS 服务器顺序。

28.1. NetworkManager 如何在 /etc/resolv.conf 中对 DNS 服务器进行排序

NetworkManager 根据以下规则对 /etc/resolv.conf 文件中的 DNS 服务器排序:

  • 如果只有一个连接配置集,NetworkManager 将使用那个连接中指定的 IPv4 和 IPv6 DNS 服务器顺序。
  • 如果激活多个连接配置集,NetworkManager 会根据 DNS 优先级值对 DNS 服务器进行排序。如果您设置 DNS 优先级,NetworkManager 的行为取决于 dns 参数中设置的值。您可以在文件 /etc/NetworkManager/NetworkManager.conf 中的 [main] 部分设置此参数:

    • dns=default,或如果没有设置 dns 参数:

      NetworkManager 根据每个连接中的 ipv4.dns-priorityipv6.dns-priority 参数将 DNS 服务器从不同的连接中排序。

      如果未设置值,或者您将 ipv4.dns-priorityipv6.dns-priority 设置为 0,NetworkManager 将使用全局默认值。请参阅 DNS 优先级参数的默认值

    • dns=dnsmasqdns=systemd-resolved:

      当您使用这些设置之一时,NetworkManager 在 /etc/resolv.conf 文件中将 127.0.0.1 设置为 dnsmasq ,或将 127.0.0.53 设置为 nameserver 条目。

      dnsmasqsystemd-resolved 服务都转发网络管理器(NetworkManager)中与连接中指定的 DNS 服务器连接中设置的搜索域的查询,并将查询转发到其他域与默认路由的连接。当多个连接有相同的搜索域集时,dnsmasqsystemd-resolved 会将对这个域的查询转发到具有最低优先级值的连接中的 DNS 服务器。

DNS 优先级参数的默认值

NetworkManager 对连接使用以下默认值:

  • 50 对于 VPN 连接
  • 100 对于其他连接

有效的 DNS 优先级值:

您可以将全局默认和具体连接 ipv4.dns-priorityipv6.dns-priority 参数设置为 -21474836472147483647 之间的值。

  • 低的值具有更高的优先级。
  • 负值具有一个特殊的效果,它会排除其他带有更大值的配置。例如,如果至少有一个连接具有负优先级值,NetworkManager 只使用在连接配置集中指定的具有最低优先级的 DNS 服务器。
  • 如果多个连接具有相同的 DNS 优先级,NetworkManager 会按照以下顺序排列 DNS 的优先顺序:

    1. VPN 连接
    2. 带有活跃的默认路由的连接。活跃的默认路由是最低指标的默认路由。

其它资源

  • 有关 /etc/resolv.conf 文件中 NetworkManager 排序 DNS 服务器条目的详情,请查看 nm-settings(5) 手册页中的 ipv4ipv6 部分中的 dns-priority 参数描述。
  • 有关使用 systemd-resolved 为不同域使用不同 DNS 服务器的详情,请参考 第 36 章 在不同域中使用不同的 DNS 服务器

28.2. 设置 NetworkManager 范围默认 DNS 服务器优先级值

NetworkManager 为连接使用以下 DNS 优先级默认值:

  • 50 对于 VPN 连接
  • 100 对于其他连接

这部分论述了如何使用 IPv4 和 IPv6 连接的自定义默认值覆盖这些系统范围的默认值。

流程

  1. 编辑 /etc/NetworkManager/NetworkManager.conf 文件:

    1. 添加 [connection] 部分(如果不存在):

      [connection]
    2. [connection] 部分添加自定义默认值。例如:要将 IPv4 和 IPv6 的新默认值设置为 200,请添加:

      ipv4.dns-priority=200
      ipv6.dns-priority=200

      您可以将参数设置为 -21474836472147483647 间的值。请注意,将参数设置为 0 可启用内置的默认值(50 用于 VPN 连接,其它连接为 100 )。

  2. 重新载入 NetworkManager 服务:

    # systemctl reload NetworkManager

其它资源

  • 有关为所有网络管理器连接设置默认值的详情,请参考 NetworkManager.conf(5) man page 中的 Connection Section

28.3. 设置网络管理器连接的 DNS 优先级

这部分论述了如何在 NetworkManager 创建或更新 /etc/resolv.conf 文件时定义 DNS 服务器的顺序。

请注意,只有在您配置了多个与不同 DNS 服务器的连接时,设置 DNS 优先级才有意义。如果您只有一个与多个 DNS 服务器的连接,请在连接配置集中按首选顺序手动设置 DNS 服务器。

先决条件

  • 系统配置了多个网络管理器连接。
  • 系统在 /etc/NetworkManager/NetworkManager.conf 文件中没有设置 dns 参数,或者将参数设置为 default

流程

  1. 另外,还可显示可用的连接:

    # nmcli connection show
    NAME           UUID                                  TYPE      DEVICE
    Example_con_1  d17ee488-4665-4de2-b28a-48befab0cd43  ethernet  enp1s0
    Example_con_2  916e4f67-7145-3ffa-9f7b-e7cada8f6bf7  ethernet  enp7s0
    ...
  2. 设置 ipv4.dns-priorityipv6.dns-priority 参数。例如,为 Example_con_1 连接将两个参数设置为 10

    # nmcli connection modify Example_con_1 ipv4.dns-priority 10 ipv6.dns-priority 10
  3. 另外,还可为其他连接重复前面的步骤。
  4. 重新激活您更新的连接:

    # nmcli connection up Example_con_1

验证步骤

  • 显示 /etc/resolv.conf 文件的内容以验证 DNS 服务器顺序是否正确:

    # cat /etc/resolv.conf

第 29 章 使用 ifcfg 文件配置 ip 网络

这部分论述了如何通过编辑 ifcfg 文件手动配置网络接口。

接口配置(ifcfg)文件控制独立网络设备的软件接口。当系统引导时,它使用这些文件来决定启动哪些界面以及如何进行配置。这些文件通常命名为 ifcfg-name,后缀 名称 指的是配置文件控制的设备名称。通常 ifcfg 文件的后缀与配置文件中 DEVICE 指令给出的字符串相同。

29.1. 使用 ifcfg 文件配置带有静态网络设置的接口

这个步骤描述了如何使用 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

其它资源

29.2. 使用 ifcfg 文件配置带有动态网络设置的接口

这个步骤描述了如何使用 ifcfg 文件配置带有动态网络设置的网络接口。

流程

  1. 要使用 ifcfg 文件配置名为 em1 的接口,请在包含以下内容的 /etc/sysconfig/network-scripts/ 目录中创建一个名为 ifcfg-em1 的文件:

    DEVICE=em1
    BOOTPROTO=dhcp
    ONBOOT=yes
  2. 要将接口配置为向 DHCP 服务器发送不同的主机名,请在 ifcfg 文件中添加以下行:

    DHCP_HOSTNAME=hostname
  3. 要将接口配置为将不同的完全限定域名(FQDN)发送到 DHCP 服务器,请在 ifcfg 文件中添加以下行:

    DHCP_FQDN=fully.qualified.domain.name
    注意

    在给定的 ifcfg 文件中只能使用 DHCP_HOSTNAMEDHCP_FQDN 指令中的一个。如果同时指定了 DHCP_HOSTNAMEDHCP_FQDN,则只使用后者。

  4. 要将接口配置为使用特定的 DNS 服务器,请在 ifcfg 文件中添加以下行:

      PEERDNS=no
      DNS1=ip-address
      DNS2=ip-address

    其中 ip-addressDNS 服务器的地址。这会导致网络服务使用指定的 DNS 服务器更新 /etc/resolv.conf。只需要一个 DNS 服务器地址,另一个是可选的。

29.3. 使用 ifcfg 文件管理系统范围以及专用连接配置集

这个步骤描述了如何配置 ifcfg 文件来管理系统范围以及专用连接配置集。

流程

权限与 ifcfg 文件中的 USERS 指令对应。如果没有 USERS 指令,则所有用户都可使用网络配置集。

  • 例如,使用以下行修改 ifcfg 文件,这会使连接只对列出的用户可用:

    USERS="joe bob alice"

第 30 章 使用 NetworkManager 为特定连接禁用 IPv6

这部分论述了如何在使用 NetworkManager 管理网络接口的系统中禁用 IPv6 协议。如果您禁用 IPv6,NetworkManager 会自动在内核中设置对应的 sysctl 值。

注意

如果使用内核 tunables 或内核引导参数禁用 IPv6,则需要考虑系统配置。如需更多信息,请参阅 如何在 RHEL 中禁用或启用 IPv6 协议?

先决条件

  • 系统使用 NetworkManager 管理网络接口,这是 Red Hat Enterprise Linux 8 中的默认设置。
  • 系统运行 Red Hat Enterprise Linux 8.1 或更高版本。

30.1. 使用 nmcli 在连接上禁用 IPv6

这个步骤描述了如何使用 nmcli 工具禁用 IPv6 协议。

流程

  1. 另外,还可显示网络连接列表:

    # nmcli connection show
    NAME    UUID                                  TYPE      DEVICE
    Example 7a7e0151-9c18-4e6f-89ee-65bb2d64d365  ethernet  enp1s0
    ...
  2. 将连接的 ipv6.method 参数设置为 disabled:

    # nmcli connection modify Example ipv6.method "disabled"
  3. 重启网络连接:

    # nmcli connection up Example

验证步骤

  1. 输入 ip address show 命令显示设备的 IP 设置:

    # ip address show enp1s0
    2: enp1s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
        link/ether 52:54:00:6b:74:be brd ff:ff:ff:ff:ff:ff
        inet 192.0.2.1/24 brd 192.10.2.255 scope global noprefixroute enp1s0
           valid_lft forever preferred_lft forever

    如果没有 inet6 条目,则在该设备中禁用 IPv6

  2. 验证 /proc/sys/net/ipv6/conf/enp1s0/disable_ipv6 文件现在包含 1值:

    # cat /proc/sys/net/ipv6/conf/enp1s0/disable_ipv6
    1

    1 表示该设备禁用了 IPv6

第 31 章 手动配置 /etc/resolv.conf 文件

默认情况下,Red Hat Enterprise Linux(RHEL)8 上的网络管理器(NetworkManager)使用来自活跃网络管理器连接配置集的 DNS 设置动态地更新 /etc/resolv.conf 文件。这部分论述了如何在 /etc/resolv.conf 中禁用此功能的不同选项来手动配置 DNS 设置。

31.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. (可选)从 Generated by NetworkManager 中删除 /etc/resolv.conf 注释以避免混淆。

验证步骤

  1. 编辑 /etc/resolv.conf 文件并手动更新配置。
  2. 重新载入 NetworkManager 服务:

    # systemctl reload NetworkManager
  3. 显示 /etc/resolv.conf 文件:

    # cat /etc/resolv.conf

    如果您成功禁用了 DNS 处理,NetworkManager 不会覆盖手动配置的设置。

其它资源

  • 详情请查看 dns man page 中的 NetworkManager.conf(5) 参数描述。

第 33 章 配置 ethtool offload 功能

网络接口卡可使用 TCP 卸载引擎(TOE)将某些操作卸载到网络控制器以提高网络吞吐量。

这部分论述了如何设置卸载功能。

33.1. NetworkManager 支持的卸载功能

您可以使用 NetworkManager 设置以下 ethtool 卸载功能:

  • 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 实用程序文档和内核文档。

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

其它资源

33.3. 使用系统角色设置 ethtool 功能

您可以使用 networking RHEL 系统角色配置 NetworkManager 连接的 ethtool 功能。

重要

当您运行使用 networking RHEL 系统角色的 play 时,如果设置与 play 中指定的设置不匹配,则系统角色会覆盖具有相同名称的现有连接配置集。因此,在 play 中总是指定网络连接配置集的完整配置,即使已经存在(如 IP 配置)。否则,角色会将这些值重置为默认值。

具体来说,该流程会使用以下设置创建或更新 enp1s0 连接配置集:

  • 静态 IPv4 地址 - 198.51.100.20,带有 /24 子网掩码
  • 静态 IPv6 地址 - 2001:db8:1::1,带有 /64 子网掩码
  • IPv4 默认网关 - 198.51.100.254
  • IPv6 默认网关 - 2001:db8:1::fffe
  • IPv4 DNS 服务器 - 198.51.100.200
  • IPv6 DNS 服务器 - 2001:db8:1::ffbb
  • DNS 搜索域 - example.com
  • ethtool 特性:

    • 通用接收卸载(GRO):禁用
    • 通用片段卸载(GSO):启用
    • TX 流控制传输协议(SCTP)segmentation: disabled

先决条件

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

流程

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

    node.example.com
  2. 使用以下内容创建 ~/configure-ethernet-device-with-ethtool-features.yml playbook:

    ---
    - name. Configure an Ethernet connection with ethtool features
      hosts: node.example.com
      become: true
      tasks:
      - include_role:
          name: linux-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:
                feature:
                  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 连接到受管主机。

其它资源

  • /usr/share/ansible/roles/rhel-system-roles.network/README.md file
  • ansible-playbook(1) man page

第 34 章 配置 ethtool coalesce 设置

使用中断的并发,系统会收集网络数据包并为多个数据包生成一个中断。这会增加向内核发送的一个硬件中断的数据量,这可减少中断的负载,并最大程度提高吞吐量。

本节提供不同的选项来设置 ethtool coalesce 设置。

34.1. NetworkManager 支持的 coalesce 设置

您可以使用 NetworkManager 设置以下 ethtool coalesce 设置:

  • 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

34.2. 使用 NetworkManager 配置 ethtool coalesce 设置

本节论述了如何使用 NetworkManager 设置 ethtool 组合设置,以及如何从 NetworkManager 连接配置集中删除设置。

流程

  1. 例如:要设置最大接收的数据包数量来延迟到 enp1s0 连接配置集中的 128,请输入:

    # nmcli connection modify enp1s0 ethtool.coalesce-rx-frames 128
  2. 要删除 coalesce 设置,将设置设为 ignore。例如,要删除 ethtool.coalesce-rx-frames 设置,请输入:

    # nmcli connection modify enp1s0 ethtool.coalesce-rx-frames ignore
  3. 重新激活网络配置集:

    # nmcli connection up enp1s0

验证步骤

  1. 使用 ethtool -c 命令显示网络设备的当前卸载功能:

    # ethtool -c network_device

其它资源

34.3. 使用系统角色配置 ethtool coalesce 设置

您可以使用 networking RHEL 系统角色配置网络管理器连接的 ethtool 并发设置。

重要

当您运行使用 networking RHEL 系统角色的 play 时,如果设置与 play 中指定的设置不匹配,则系统角色会覆盖具有相同名称的现有连接配置集。因此,在 play 中总是指定网络连接配置集的完整配置,即使已经存在(如 IP 配置)。否则,角色会将这些值重置为默认值。

具体来说,该流程会使用以下设置创建或更新 enp1s0 连接配置集:

  • 静态 IPv4 地址 - 198.51.100.20,子网掩码为 /24
  • 静态 IPv6 地址 - 2001:db8:1::1,子网掩码为 /64
  • IPv4 默认网关 - 198.51.100.254
  • IPv6 默认网关 - 2001:db8:1::fffe
  • IPv4 DNS 服务器 - 198.51.100.200
  • IPv6 DNS 服务器 - 2001:db8:1::ffbb
  • DNS 搜索域 - example.com
  • ethtool coalesce 设置:

    • RX 帧: 128
    • TX 帧: 128

先决条件

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

流程

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

    node.example.com
  2. 使用以下内容创建 ~/configure-ethernet-device-with-ethtoolcoalesce-settings.yml playbook:

    ---
    - name: Configure an Ethernet connection with ethtool coalesce settings
      hosts: node.example.com
      become: true
      tasks:
      - include_role:
          name: linux-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 连接到受管主机。

其它资源

  • 如需 ethtool 功能的完整列表,以及 network_connections 中使用的参数详情,以及 network 系统角色的附加信息,请参阅 /usr/share/ansible/roles/rhel-system-roles.network/README.md 文件。
  • 有关 ansible-playbook 命令的详情,请参考 ansible-playbook(1) man page。

第 35 章 使用 MACsec 加密同一物理网络中的第 2 层流量

这部分论述了如何为以太网链路中的所有流量配置 MACsec 以安全通信。

介质访问控制安全(MACsec)是一个第 2 层协议,它通过以太网链接保护不同类型的流量,包括:

  • 动态主机配置协议(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。

以下示例演示了如何使用预共享密钥在 2 个主机间配置 MACsec。

35.1. 使用 nmcli 配置 MACsec 连接

您可以使用 nmcli 工具将以太网接口配置为使用 MACsec。这个步骤描述了如何创建使用以太网接口加密网络流量的 MACsec 连接。

在该 MACsec 保护网络中通信的所有主机上运行此步骤。

流程

在主机 A 中:

  • 在配置 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

在主机 A 和 B 中:

  1. 创建 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-cakmacsec.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'
  3. 激活连接:

    # nmcli connection up macsec0

验证步骤

  1. 要验证流量是否加密,请输入:

    tcpdump -nn -i enp1s0
  2. 要查看未加密的流量,请输入:

    tcpdump -nn -i macsec0
  3. 显示 MACsec 统计:

    # ip macsec show
  4. 要显示每种保护类型的独立计数器:只使用完整性(加密)和加密(加密)

    # ip -s macsec show

其它资源

第 36 章 在不同域中使用不同的 DNS 服务器

默认情况下,Red Hat Enterprise Linux(RHEL)会将所有 DNS 请求发送到 /etc/resolv.conf 文件中指定的第一个 DNS 服务器。如果这个服务器没有回复,RHEL 会使用这个文件中的下一个服务器。

在一个 DNS 服务器无法解析所有域的环境中,管理员可将 RHEL 配置为将特定域的 DNS 请求发送到所选 DNS 服务器。例如:您可以配置一个 DNS 服务器来解析 example.com 查询,另一个 DNS 服务器解析 example.net 查询。对于所有其他 DNS 请求,RHEL 使用与默认网关连接中配置的 DNS 服务器。

重要

systemd-resolved 服务仅作为技术预览提供。红帽产品服务级别协议(SLA)不支持技术预览功能,且其功能可能并不完善,因此红帽不建议在生产环境中使用它们。这些预览可让用户早期访问将来的产品功能,让用户在开发过程中测试并提供反馈意见。

如需有关 技术预览功能支持范围 的信息,请参阅红帽客户门户网站中的技术预览功能支持范围。

36.1. 将特定域的 DNS 请求发送到所选 DNS 服务器

本节配置 systemd-resolved 服务和 NetworkManager,将特定域的 DNS 查询发送到所选 DNS 服务器。

如果您完成本节中的步骤,RHEL 将使用 /etc/resolv.conf 文件中的 systemd-resolved 提供的 DNS 服务。systemd-resolved 服务启动一个 DNS 服务,它侦听端口 53,IP 地址 127.0.0.53。该服务会动态将 DNS 请求路由到 NetworkManager 中指定的对应 DNS 服务器。

注意

127.0.0.53 地址只能从本地系统访问,而无法从网络访问。

先决条件

  • 系统配置了多个网络管理器连接。
  • 在负责解析特定域的 NetworkManager 连接中配置 DNS 服务器和搜索域

    例如,如果 VPN 连接中指定的 DNS 服务器应该解析 example.com 域的查询,VPN 连接配置集必须具有:

    • 配置可解析 example.com 的 DNS 服务器
    • ipv4.dns-searchipv6.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. 验证 nameserver 文件中的 /etc/resolv.conf 条目是否指向 127.0.0.53:

    # cat /etc/resolv.conf
    nameserver 127.0.0.53
  2. 验证 systemd-resolved 服务是否监听本地 IP 地址 127.0.0.53 的端口 53 :

    # netstat -tulpn | grep "127.0.0.53:53"
    tcp   0   0 127.0.0.53:53   0.0.0.0:*   LISTEN   1050/systemd-resolv
    udp   0   0 127.0.0.53:53   0.0.0.0:*            1050/systemd-resolv

其它资源

  • 详情请查看 dns man page 中的 NetworkManager.conf(5) 参数描述。

第 37 章 开始使用 IPVLAN

本文档描述了 IPVLAN 驱动程序。

37.1. IPVLAN 概述

IPVLAN 是虚拟网络设备的驱动程序,可在容器环境中用于访问主机网络。无论主机网络中创建的 IPVLAN 设备数量,IPVLAN 会向外部网络公开一个 MAC 地址。这意味着,用户可以在多个容器中有多个 IPVLAN 设备,相应的交换机会读取单个 MAC 地址。当本地交换机对其可管理的 MAC 地址总数实施限制时,IPVLAN 驱动程序很有用。

37.2. IPVLAN 模式

IPVLAN 有以下模式可用:

  • L2 模式

    在 IPVLAN L2 模式 中,虚拟设备接收并响应地址解析协议(ARP)请求。netfilter 框架仅在拥有虚拟设备的容器中运行。容器化流量的默认命名空间中没有执行 netfilter 链。使用L2 模式会提供良好的性能,但对网络流量的控制要小。

  • L3 模式

    L3 模式 中,虚拟设备只处理 L3 以上的流量。虚拟设备不响应 ARP 请求,用户必须手动为相关点上的 IPVLAN IP 地址配置邻居条目。相关容器的出口流量会放在 default 命名空间的 netfilter POSTROUTING 和 OUTPUT 链上,而入口流量会线程处理,方式与 L2 模式 相同。使用L3 模式会提供很好的控制,但可能会降低网络流量性能。

  • L3S 模式

    L3S 模式 中,虚拟设备处理方式与 L3 模式 相同,唯一的不同是,相关容器的出口和入站流量都位于 default 命名空间的 netfilter chain 上。L3S 模式 的行为方式和 L3 模式 相似,但提供了对网络的更大控制。

注意

对于 L3L3S 模式,IPVLAN 虚拟设备不接收广播和多播流量。

37.3. MACVLAN 概述

MACVLAN 驱动程序允许在一个 NIC 上创建多个虚拟网络设备,每个网卡都由其自身唯一的 MAC 地址标识。物理 NIC 上的数据包通过目的地的 MAC 地址与相关的 MACVLAN 设备进行多路复用。MACVLAN 设备不添加任何级别的封装。

37.4. IPVLAN 和 MACVLAN 的比较

下表显示了 MACVLAN 和 IPVLAN 的主要区别。

MACVLANIPVLAN

为每个 MACVLAN 设备使用 MAC 地址。交换中 MAC 表的 MAC 地址限制可能会导致连接丢失。

使用不限制 IPVLAN 设备数的单个 MAC 地址。

全局命名空间的 netfilter 规则不会影响子命名空间中到达或从 MACVLAN 设备的网络流量。

有可能在 L3 模式L3S 模式中控制到 IPVLAN 设备或者来自 IPVLAN 设备的网络流量。

请注意,IPVLAN 和 MACVLAN 不需要任何级别的封装。

37.5. 使用 iproute2 创建和配置 IPVLAN 设备

这个步骤演示了如何使用 iproute2 设置 IPVLAN 设备。

流程

  1. 要创建 IPVLAN 设备,请输入以下命令:

    ~]# ip link add link real_NIC_device name IPVLAN_device type ipvlan mode l2

    请注意:网络接口控制器(NIC)是将计算机连接到网络的一个硬件组件。

    例 37.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. 要为接口分配 IPv4IPv6 地址,请输入以下命令:

    ~]# 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 neigh add dev real_NIC_device peer_IP_address lladdr peer_MAC_address

      对于 L3S 模式

      ~]# ip route dev add 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 地址。

第 38 章 配置虚拟路由和转发(VRF)

使用虚拟路由和转发(VRF),管理员可以在同一个主机上同时使用多个路由表。为此,VRF 将网络在第 3 层进行分区。这可让管理员使用每个 VRF 域的独立路由表隔离流量。这个技术与虚拟 LAN(虚拟 LAN)类似,后者在第二层为网络分区,其中操作系统使用不同的 VLAN 标签来隔离共享相同物理介质的流量。

VRF 优于在第二层上分区的好处是,路由会根据涉及的对等者数量进行更好地考虑。

Red Hat Enterprise Linux 为每个 VRF 域使用虚拟 vrt 设备,并通过将现有网络设备添加到 VRF 设备中添加到 VRF 域的路由。之前附加到原始设备的地址和路由将在 VRF 域中移动。

请注意,每个 VRF 域间都是相互隔离的。

38.1. 在不同接口上永久重复使用相同的 IP 地址

这个步骤描述了如何使用 VRF 功能在同一服务器的不同接口中永久使用相同的 IP 地址。

重要

要在重新使用相同的 IP 地址时让远程对等两个 VRF 接口都联系,网络接口必须属于不同的广播域。广播域是一组节点,它们接收被其中任何一个发送的广播流量。在大多数配置中,所有连接到同一交换机的节点都属于相同的域。

先决条件

  • 您以 root 用户身份登录。
  • 没有配置网络接口。

流程

  1. 创建并配置第一个 VRF 设备:

    1. 为 VRF 设备创建连接并将其分配到路由表中。例如,要创建一个名为 vrf0 的 VRF 设备,它将分配给 1001 路由表:

      # 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 分配网络设备。例如:要将 enp1s0 以太网设备添加到 vrf0 VRF 设备,并为 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 设备:

    1. 创建 VRF 设备并将其分配到路由表中。例如,要创建一个名为 vrf1 的 VRF 设备,它将分配给 1002 路由表,输入:

      # nmcli connection add type vrf ifname vrf1 con-name vrf1 table 1002 ipv4.method disabled ipv6.method disabled
    2. 激活 vrf1 设备:

      # nmcli connection up vrf1
    3. 为刚刚创建的 VRF 分配网络设备。例如:要将 enp7s0 以太网设备添加到 vrf1 VRF 设备,并为 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

38.2. 在不同接口中临时重复使用相同的 IP 地址

本节中的步骤论述了如何使用虚拟路由和转发(VRF)功能在某个服务器的不同接口中临时使用相同的 IP 地址。这个过程仅用于测试目的,因为配置是临时的并在重启系统后会丢失。

重要

要在重新使用相同的 IP 地址时让远程对等两个 VRF 接口都联系,网络接口必须属于不同的广播域。广播域是一组节点,它们接收被其中任何一个发送的广播流量。在大多数配置中,所有连接到同一交换机的节点都属于相同的域。

先决条件

  • 您以 root 用户身份登录。
  • 没有配置网络接口。

流程

  1. 创建并配置第一个 VRF 设备:

    1. 创建 VRF 设备并将其分配到路由表中。例如,要创建一个名为 blue 的 VRF 设备,它将分配给 1001 路由表:

      # ip link add dev blue type vrf table 1001
    2. 启用 blue 设备:

      # ip link set dev blue up
    3. 为 VRF 设备分配网络设备。例如:要将 enp1s0 以太网设备添加到 blue VRF 设备中:

      # ip link set dev enp1s0 master blue
    4. 启用 enp1s0 设备:

      # ip link set dev enp1s0 up
    5. enp1s0 设备分配 IP 地址和子网掩码。例如,将其设置为 192.0.2.1/24:

      # ip addr add dev enp1s0 192.0.2.1/24
  2. 创建并配置下一个 VRF 设备:

    1. 创建 VRF 设备并将其分配到路由表中。例如,要创建一个名为 red 的 VRF 设备,它将分配给 1002 路由表:

      # ip link add dev red type vrf table 1002
    2. 启用 red 设备:

      # ip link set dev red up
    3. 为 VRF 设备分配网络设备。例如:要将 enp7s0 以太网设备添加到 red VRF 设备中:

      # ip link set dev enp7s0 master red
    4. 启用 enp7s0 设备:

      # ip link set dev enp7s0 up
    5. enp7s0 设备分配与 blue VRF 域中的 enp1s0 使用相同的 IP 地址和子网:

      # ip addr add dev enp7s0 192.0.2.1/24
  3. 另外,还可按照上述步骤创建更多 VRF 设备。

38.3. 其它资源

第 39 章 为您的系统设置路由协议

本节论述了如何使用 Free Range RoutingFRRoutingFRR)功能为您的系统启用和设置所需的路由协议。

39.1. FRRouting 介绍

Free Range RoutingFRRoutingFRR)是一个路由协议堆栈,它由 AppStream 存储库中可用的 frr 软件包提供。

FRR 替换之前 RHEL 版本中使用的 Quagga。因此, FRR 提供基于 TCP/IP 的路由服务,并支持多个 IPv4 和 IPv6 路由协议。

支持的协议包括:

  • 边框网关协议(BGP)
  • 中间系统到中间系统(IS-IS)
  • 打开 Shortest Path First(OSPF)
  • Protocol-Independent Multicast(PIM)
  • 路由信息协议(RIP)
  • 路由信息协议下一代(RIPng)
  • 增强的网关路由协议(EIGRP)
  • 下一个 Hop 解析协议(NHRP)
  • 双向检测(BFD)
  • 基于策略的路由(PBR)

FRR 是下列服务的集合:

  • zebra
  • bgpd
  • isisd
  • ospfd
  • ospf6d
  • pimd
  • ripd
  • ripngd
  • eigrpd
  • nhrpd
  • bfdd
  • pbrd
  • staticd
  • fabricd

如果安装了 frr,系统可充当专用路由器,该路由器可使用路由协议与其它路由器在内部或外部网络中交换路由信息。

39.2. 设置 FRRouting

先决条件

  • 请确定在您的系统中安装了 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

39.3. 修改 FRR 的配置

本节描述:

  • 设置后如何启用附加守护进程 FRR
  • 设置后如何禁用守护进程 FRR

启用附加守护进程

先决条件

流程

启用一个或多个附加守护进程:

  1. 编辑 /etc/frr/daemons 配置文件,并将所需守护进程的行改为状态为 yes,而不是 no

    例如,要启用 ripd 守护进程:

    ripd=yes
  2. 重新载入 frr 服务:

    # systemctl reload frr

禁用守护进程

先决条件

流程

禁用一个或多个守护进程:

  1. 编辑 /etc/frr/daemons 配置文件,并将所需守护进程的行改为状态为 no,而不是 yes

    例如:要禁用 ripd 守护进程:

    ripd=no
  2. 重新载入 frr 服务:

    # systemctl reload frr

39.4. 修改特定守护进程的配置

使用默认配置, FRR 中的每个路由守护进程只能充当普通路由器。

要进行守护进程的额外配置,请使用以下步骤。

流程

  1. /etc/frr/ 目录中,为所需守护进程创建一个配置文件,如下:

    [daemon_name].conf

    例如:要进一步配置 eigrpd 守护进程,请在上述目录中创建 eigrpd.conf 文件。

  2. 使用所需内容填充新文件。

    有关特定 FRR 守护进程的配置示例,请查看 /usr/share/doc/frr/ 目录。

  3. 重新载入 frr 服务:

    # systemctl reload frr

第 40 章 监控并调整 RX 环缓冲

接收(RX)环缓冲是设备驱动程序和网络接口卡(NIC)之间的共享缓冲,并存储传入的数据包,直到设备驱动程序可以处理它们。

如果数据包丢失率导致应用程序报告,您可以增大以太网设备 RX 环缓冲的大小:

  • 数据丢失,
  • 集群隔离,
  • 性能较慢,
  • 超时,以及
  • 备份失败。

这部分论述了如何识别丢弃的数据包数量,增加 RX 环缓冲来降低高数据包的降低率。

40.1. 显示丢弃的数据包数量

ethtool 工具可让管理员查询、配置和控制网络驱动程序设置。

RX 环缓冲耗尽会导致计数器递增,比如 ethtool -S interface_name 输出中的 "discard" 或 "drop"。丢弃的数据包表示可用缓冲被占用的速度比内核可以处理数据包的速度要快。

这个步骤描述了如何使用 ethtool 显示丢弃计数器。

流程

  • 要查看 enp1s0 接口的丢弃计数器,请输入:

    $ ethtool -S enp1s0

40.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 环缓冲:

重要

根据您的网卡使用的驱动,环缓冲的改变会很快中断网络连接。

其它资源

第 41 章 测试基本网络设置

这部分论述了如何执行基本网络测试。

41.1. 使用 ping 程序验证 IP 到其他主机的连接

ping 实用程序将 ICMP 数据包发送到远程主机。您可以使用此功能来测试 IP 与不同主机的连接是否正常工作。

流程

  • 将主机的 IP 地址放在同一子网中,如您的默认网关:

    # ping 192.0.2.3

    如果命令失败,请验证默认网关设置。

  • 在远程子网中指定主机的 IP 地址:

    # ping 198.162.3.1

如果命令失败,请验证默认网关设置,并确保网关在连接的网络间转发数据包。

41.2. 使用 host 实用程序验证名称解析

这个步骤描述了如何在 Red Hat Enterprise Linux 8 中验证名称解析。

流程

  • 使用 host 实用程序验证名称解析是否正常工作。例如:要将 client.example.com 主机名解析为 IP 地址,请输入:

    # host client.example.com

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

第 42 章 网络管理器调试介绍

增加所有域或某些域的日志级别有助于记录操作 NetworkManager 执行的详情。管理员可以使用这些信息排除问题。NetworkManager 提供不同的级别和域来生成日志信息。/etc/NetworkManager/NetworkManager.conf 文件是 NetworkManager 的主要配置文件。日志存储在日志中。

本节提供有关为 NetworkManager 启用调试日志以及使用不同日志级别和域配置日志量的信息。

42.1. 调试级别和域

您可以使用 levelsdomains 参数来管理 NetworkManager 的调试。这个级别定义了详细程度,而域定义了记录给定的严重性日志的消息类别(level)。

日志级别描述

OFF

不记录任何有关 NetworkManager 的信息

ERR

仅记录严重错误

WARN

记录可以反映操作的警告信息

INFO

记录各种有助于跟踪状态和操作的信息

DEBUG

为调试启用详细日志记录

TRACE

启用比 DEBUG 级更详细的日志

请注意,后续的级别记录来自以前级别的所有信息。例如,将日志级别设置为 INFO 也会记录 ERRWARN 日志级别中包含的信息。

其它资源

  • 有关 domains 的详情,请参考 NetworkManager.conf(5) man page。

42.2. 设置 NetworkManager 日志级别

默认情况下,所有日志域都被设置为记录 INFO 日志级别。在收集调试日志前禁用速率限制。使用速率限制时,如果短时间内有太多信息,systemd-journald 会丢弃信息。这会在日志级别为 TRACE 时发生。

此流程禁用速率限制,并为所有(ALL)域启用记录调试日志。

流程

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

    domains 参数可以包含多个用逗号分开的 domain:level 对。

  4. 重启 NetworkManager 服务。

    # systemctl restart NetworkManager

42.3. 在运行时使用 nmcli 临时设置日志级别

您可以使用 nmcli在运行时更改日志级别。但是,红帽建议使用配置文件启用调试并重启 NetworkManager。使用 .conf 文件更新调试 levelsdomains 可帮助调试引导问题,并捕获来自初始状态的所有日志。

流程

  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

42.4. 查看 NetworkManager 日志

您可以查看 NetworkManager 日志进行故障排除。

流程

  • 要查看日志,请输入:

    # journalctl -u NetworkManager -b

其它资源

  • NetworkManager.conf(5) man page。
  • journalctl man page。

第 43 章 捕获网络数据包

要调试网络问题和通讯,您可以捕获网络数据包。以下部分提供有关捕获网络数据包的步骤和附加信息。

43.1. 使用 xdpdump 捕获包括 XDP 程序丢弃的数据包在内的网络数据包

xdpdump 工具捕获网络数据包。与 tcpdump 实用程序不同,xdpdump 为这个任务使用扩展的 Berkeley Packet Filter(eBPF)程序。这可让 xdpdump 同时捕获由 Express Data Path(XDP)程序丢弃的数据包。用户空间工具(如 tcpdump)无法捕获这些被丢弃的软件包,以及 XDP 程序修改的原始数据包。

您可以使用 xdpdump 来调试已经附加到接口中的 XDP 程序。因此,实用程序可以在 XDP 程序启动和完成后捕获数据包。在后者的情况下,xdpdump 也捕获了 XDP 操作。默认情况下,xdpdump 会在 XDP 程序条目中捕获传入的数据包。

重要

在 AMD 和 Intel 64 位以外的其它构架中, xdpdump 工具仅作为技术预览提供。红帽产品服务级别协议(SLA)不支持技术预览功能,且其功能可能并不完善,因此红帽不建议在生产环境中使用它们。这些预览可让用户早期访问将来的产品功能,让用户在开发过程中测试并提供反馈意见。

如需有关 技术预览功能支持范围 的信息,请参阅红帽客户门户网站中的技术预览功能支持范围。

请注意,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

其它资源

  • 有关 xdpdump 的详情,请查看 xdpdump(8) man page。
  • 如果您是开发人员,并且您对 xdpdump 的源代码有兴趣,请从红帽客户门户网站下载并安装相应的源 RPM(SRPM)。

43.2. 其它资源

第 44 章 在 RHEL 中使用特定内核版本

内核是 Linux 操作系统的一个核心组件,可管理系统资源,并提供硬件和软件应用程序间的接口。在某些情况下,内核可能会影响网络功能,因此建议您使用内核的最新版本。如果需要,也可以将内核版本降级到同一 x-stream 内核的早期版本,并在系统引导时选择特定版本进行故障排除。

这部分解释了当您升级或降级内核时,如何在 GRUB 引导装载程序中选择内核。

44.1. 使用以前的内核版本启动 RHEL

默认情况下,在更新后,系统会引导内核的最新版本。Red Hat Enterprise Linux 允许同时安装三个内核版本。这在 /etc/dnf/dnf.conf 文件(installonly_limit=3)中定义。

如果您在使用新内核载入系统时观察到任何问题,您可以与之前的内核重启并恢复生产环境机器。联系支持人员对此问题进行故障排除。

流程

  1. 启动系统。
  2. 在 GRUB 引导装载程序中,您会看到所安装的内核。使用 键选择一个内核,按 Enter 引导它。

其它资源

第 45 章 提供 DHCP 服务

动态主机配置协议(DHCP)是自动为客户端分配 IP 信息的网络协议。

这部分解释了 dhcpd 服务的一般信息,以及如何设置 DHCP 服务器和 DHCP 转发。

如果 IPv4 和 IPv6 网络的步骤有所不同,本章会包含这两个协议的步骤。

45.1. 对 DHCPv4 和 DHCPv6 使用 dhcpd 时的不同

dhcpd 服务支持在一个服务器中提供 DHCPv4 和 DHCPv6。然而,您需要单独的 dhcpd 实例以及单独的配置文件来为每个协议提供 DHCP。

DHCPv4
  • 配置文件: /etc/dhcp/dhcpd.conf
  • systemd 服务名称: dhcpd
DHCPv6
  • 配置文件: /etc/dhcp/dhcpd6.conf
  • systemd 服务名称: dhcpd6

45.2. dhcpd 服务的租期数据库

DHCP 租期是 dhcpd 服务为客户端分配网络地址的时间周期。dhcpd 服务将 DHCP 租期存储在以下数据库中:

  • 对于 DHCPv4:/var/lib/dhcpd/dhcpd.leases
  • 对于 DHCPv6:/var/lib/dhcpd/dhcpd6.leases
警告

手动更新数据库文件可能会破坏数据库。

租期数据库包含有关分配的租期的信息,如分配给 MAC 地址的 IP 地址或租期到期的时间戳。请注意,租期数据库中的所有时间戳都是 UTC。

dhcpd 服务定期重新创建数据库:

  1. 该服务重命名现存文件:

    • /var/lib/dhcpd/dhcpd.leases/var/lib/dhcpd/dhcpd.leases~
    • /var/lib/dhcpd/dhcpd6.leases/var/lib/dhcpd/dhcpd6.leases~
  2. 该服务将所有已知的租期写入新创建的 /var/lib/dhcpd/dhcpd.leases/var/lib/dhcpd/dhcpd6.leases 文件。

其它资源

45.3. DHCPv6 和 radvd 的比较

在 IPv6 网络中,只有路由器广告信息在 IPv6 默认网关上提供信息。因此,如果您要在需要默认网关设置的子网中使用 DHCPv6,还必须配置路由器广告服务,如 Router Advertisement Daemon(radvd)。

radvd 服务使用路由器广告数据包中的标记声明 DHCPv6 服务器可用。

本节比较 DHCPv6 和 radvd,并提供了有关配置 radvd 的信息。

 DHCPv6radvd

提供默认网关的信息

保证随机地址以保护隐私

发送更多网络配置选项

将 MAC 地址映射到 IPv6 地址

45.4. 为 IPv6 路由器配置 radvd 服务

路由器广告守护进程(radvd)发送路由器公告信息,这是 IPv6 无状态自动配置所需的。这可让用户根据这些公告自动配置其地址、设置、路由和选择默认路由器。

本节中的步骤解释了如何配置 radvd

先决条件

  • 您以 root 用户身份登录。

流程

  1. 安装 radvd 软件包:

    # yum install radvd
  2. 编辑 /etc/radvd.conf 文件并添加以下配置:

    interface enp1s0
    {
      AdvSendAdvert on;
      AdvManagedFlag on;
      AdvOtherConfigFlag on;
    
      prefix 2001:db8:0:1::/64 {
      };
    };

    这些设置配置 radvd2001:db8:0:1::/64 子网在 enp1s0 设备上发送路由器广告信息。AdvManagedFlag on 设置定义客户端应从 DHCP 服务器接收 IP 地址,将 AdvOtherConfigFlag 参数设置为 on 定义客户端还应从 DHCP 服务器接收非地址信息。

  3. (可选)配置 radvd 会在系统引导时自动启动:

    # systemctl enable radvd
  4. 启动 radvd 服务:

    # systemctl start radvd
  5. 另外,还可显示路由器广告软件包的内容以及配置的值 radvd 发送:

    # radvdump

其它资源

  • 有关配置 radvd 的详情,请查看 radvd.conf(5) man page。
  • 如需 radvd 的示例配置,请参阅 /usr/share/doc/radvd/radvd.conf.example 文件。

45.5. 为 DHCP 服务器设置网络接口

默认情况下,dhcpd 服务仅在在服务的配置文件里定义的子网中有 IP 地址的网络接口中处理请求。

例如,在以下场景中,dhcpd 只侦听 enp0s1 网络接口:

  • /etc/dhcp/dhcpd.conf 文件中,只有 192.0.2.0/24 网络的 subnet 定义。
  • enp0s1 网络接口连接到 192.0.2.0/24 子网。
  • enp7s0 接口连接到不同的子网。

如果 DHCP 服务器包含多个网络接口,但该服务应该只侦听特定的接口,请只按照本小节中的步骤操作。

根据您要为 IPv4、IPv6 或两个协议提供 DHCP 的信息,请查看以下操作过程:

先决条件

  • 您以 root 用户身份登录。
  • 已安装 dhcp-server 软件包。

流程

  • 对于 IPv4 网络:

    1. /usr/lib/systemd/system/dhcpd.service 文件复制到 /etc/systemd/system/ 目录中:

      # cp /usr/lib/systemd/system/dhcpd.service /etc/systemd/system/

      不要编辑 /usr/lib/systemd/system/dhcpd.service 文件。dhcp-server 软件包将来的更新可能会覆盖这些更改。

    2. 编辑 /etc/systemd/system/dhcpd.service 文件,附加接口名称, dhcpd 应该侦听 ExecStart 参数中的命令:

      ExecStart=/usr/sbin/dhcpd -f -cf /etc/dhcp/dhcpd.conf -user dhcpd -group dhcpd --no-pid $DHCPDARGS enp0s1 enp7s0

      这个示例配置 dhcpd 只侦听 enp0s1enp7s0 接口。

    3. 重新载入 systemd 管理器配置:

      # systemctl daemon-reload
    4. 重启 dhcpd 服务:

      # systemctl restart dhcpd.service
  • 对于 IPv6 网络:

    1. /usr/lib/systemd/system/dhcpd6.service 文件复制到 /etc/systemd/system/ 目录中:

      # cp /usr/lib/systemd/system/dhcpd6.service /etc/systemd/system/

      不要编辑 /usr/lib/systemd/system/dhcpd6.service 文件。dhcp-server 软件包将来的更新可能会覆盖这些更改。

    2. 编辑 /etc/systemd/system/dhcpd6.service 文件,并附加接口名称, dhcpd 应该侦听 ExecStart 参数中的命令:

      ExecStart=/usr/sbin/dhcpd -f -6 -cf /etc/dhcp/dhcpd6.conf -user dhcpd -group dhcpd --no-pid $DHCPDARGS enp0s1 enp7s0

      这个示例配置 dhcpd 只侦听 enp0s1enp7s0 接口。

    3. 重新载入 systemd 管理器配置:

      # systemctl daemon-reload
    4. 重启 dhcpd6 服务:

      # systemctl restart dhcpd6.service

45.6. 为直接连接到 DHCP 服务器的子网设置 DHCP 服务

如果 DHCP 服务器直接连接到该服务器应响应 DHCP 请求的子网,请使用以下步骤。如果服务器的网络接口有这个子网的 IP 地址,那么就会出现这种情况。

根据您要为 IPv4、IPv6 或两个协议提供 DHCP 的信息,请查看以下操作过程:

先决条件

  • 您以 root 用户身份登录。
  • 已安装 dhcpd-server 软件包。

流程

  • 对于 IPv4 网络:

    1. 编辑 /etc/dhcp/dhcpd.conf 文件:

      1. 另外,如果其它指令没有包含这些设置,请添加 dhcpd 作为默认设置的全局参数:

        option domain-name "example.com";
        default-lease-time 86400;

        这个示例为连接 example.com设置默认域名,默认租期时间为 86400 秒(1 天)。

      2. 在新行中添加 authoritative 声明:

        authoritative;
        重要

        在没有 authoritative 声明的情况下,如果客户端请求池外的地址,dhcpd 服务不会在 DHCPNAK 信息中回答 DHCPREQUEST 信息。

      3. 为每个直接连接到服务器接口的 IPv4 子网添加 subnet 声明:

        subnet 192.0.2.0 netmask 255.255.255.0 {
          range 192.0.2.20 192.0.2.100;
          option domain-name-servers 192.0.2.1;
          option routers 192.0.2.1;
          option broadcast-address 192.0.2.255;
          max-lease-time 172800;
        }

        这个示例为 192.0.2.0/24 网络添加了 subnet 声明。使用这个配置,DHCP 服务器会为发送这个子网的 DHCP 请求的客户端分配下列设置:

        • range 参数中定义的范围内的可用 IPv4 地址
        • 此子网的 DNS 服务器的 IP:192.0.2.1
        • 这个子网的默认网关: 192.0.2.1
        • 这个子网的广播地址: 192.0.2.255
        • 此子网中的客户端发布 IP 并向服务器发送新请求: 172800 秒(2 天)
    2. 另外,还可在系统引导时配置 dhcpd 自动启动:

      # systemctl enable dhcpd
    3. 启动 dhcpd 服务:

      # systemctl start dhcpd
  • 对于 IPv6 网络:

    1. 编辑 /etc/dhcp/dhcpd6.conf 文件:

      1. 另外,如果其它指令没有包含这些设置,请添加 dhcpd 作为默认设置的全局参数:

        option dhcp6.domain-search "example.com";
        default-lease-time 86400;

        这个示例为连接 example.com设置默认域名,默认租期时间为 86400 秒(1 天)。

      2. 在新行中添加 authoritative 声明:

        authoritative;
        重要

        在没有 authoritative 声明的情况下,如果客户端请求池外的地址,dhcpd 服务不会在 DHCPNAK 信息中回答 DHCPREQUEST 信息。

      3. 为每个直接连接到服务器接口的 IPv6 子网添加 subnet 声明:

        subnet6 2001:db8:0:1::/64 {
          range6 2001:db8:0:1::20 2001:db8:0:1::100;
          option dhcp6.name-servers 2001:db8:0:1::1;
          max-lease-time 172800;
        }

        本例为 2001:db8:0:1::/64 网络添加了 subnet 声明。使用这个配置,DHCP 服务器会为发送这个子网的 DHCP 请求的客户端分配下列设置:

        • range6 参数中定义的范围内的可用 IPv6 地址
        • 这个子网的 DNS 服务器的 IP 地址为 2001:db8:0:1::1
        • 这个子网中的客户端发布 IP 并向服务器发送新请求 172800 秒(2 天)。

          请注意: IPv6 需要使用路由器广告信息来识别默认网关。

    2. 另外,还可在系统引导时配置 dhcpd6 自动启动:

      # systemctl enable dhcpd6
    3. 启动 dhcpd6 服务:

      # systemctl start dhcpd6

其它资源

  • 有关您可以在 /etc/dhcp/dhcpd.conf/etc/dhcp/dhcpd6.conf 中设置的所有参数列表,请查看 dhcp-options(5) man page。
  • 有关 authoritative 声明的详情,请查看 dhcpd.conf(5) man page 中的 The authoritative statement 部分。
  • 有关配置示例,请查看 /usr/share/doc/dhcp-server/dhcpd.conf.example/usr/share/doc/dhcp-server/dhcpd6.conf.example 文件。

45.7. 为没有直接连接到 DHCP 服务器的子网设置 DHCP 服务

如果 DHCP 服务器没有直接连接到该服务器应响应 DHCP 请求的子网,请使用以下步骤。DHCP 转发代理将请求转发到 DHCP 服务器时就会出现这种情况,因为 DHCP 服务器的接口都没有直接连接到该服务器应服务的子网。

根据您要为 IPv4、IPv6 或两个协议提供 DHCP 的信息,请查看以下操作过程:

先决条件

  • 您以 root 用户身份登录。
  • 已安装 dhcpd-server 软件包。

流程

  • 对于 IPv4 网络:

    1. 编辑 /etc/dhcp/dhcpd.conf 文件:

      1. 另外,如果其它指令没有包含这些设置,请添加 dhcpd 作为默认设置的全局参数:

        option domain-name "example.com";
        default-lease-time 86400;

        这个示例为连接 example.com设置默认域名,默认租期时间为 86400 秒(1 天)。

      2. 在新行中添加 authoritative 声明:

        authoritative;
        重要

        在没有 authoritative 声明的情况下,如果客户端请求池外的地址,dhcpd 服务不会在 DHCPNAK 信息中回答 DHCPREQUEST 信息。

      3. 为没有直接连接到服务器接口的 IPv4 子网添加 shared-network 声明,比如以下:

        shared-network example {
          option domain-name-servers 192.0.2.1;
          ...
        
          subnet 192.0.2.0 netmask 255.255.255.0 {
            range 192.0.2.20 192.0.2.100;
            option routers 192.0.2.1;
          }
        
          subnet 198.51.100.0 netmask 255.255.255.0 {
            range 198.51.100.20 198.51.100.100;
            option routers 198.51.100.1;
          }
          ...
        }

        这个示例添加了一个共享网络声明,其中包含 192.0.2.0/24 和 198.51.100.0/24 网络的 subnet 声明。使用这个配置,DHCP 服务器会为发送来自这些子网之一 DHCP 请求的客户端分配下列设置:

        • 两个子网的客户端的 DNS 服务器的 IP 是: 192.0.2.1
        • range 参数中定义的空闲的 IPv4 地址,具体要看客户端从哪个子网发送请求。
        • 默认网关根据客户端发送请求的子网是 192.0.2.1 或者 198.51.100.1
      4. 为服务器直接连接到的子网添加 subnet 声明,用于访问上面 shared-network 中指定的远程子网:

        subnet 203.0.113.0 netmask 255.255.255.0 {
        }
        注意

        如果服务器不向这个子网提供 DHCP 服务,则 subnet 声明必须为空,如示例所示。没有直接连接的子网声明,dhcpd 就无法启动。

    2. 另外,还可在系统引导时配置 dhcpd 自动启动:

      # systemctl enable dhcpd
    3. 启动 dhcpd 服务:

      # systemctl start dhcpd
  • 对于 IPv6 网络:

    1. 编辑 /etc/dhcp/dhcpd6.conf 文件:

      1. 另外,如果其它指令没有包含这些设置,请添加 dhcpd 作为默认设置的全局参数:

        option dhcp6.domain-search "example.com";
        default-lease-time 86400;

        这个示例为连接 example.com设置默认域名,默认租期时间为 86400 秒(1 天)。

      2. 在新行中添加 authoritative 声明:

        authoritative;
        重要

        在没有 authoritative 声明的情况下,如果客户端请求池外的地址,dhcpd 服务不会在 DHCPNAK 信息中回答 DHCPREQUEST 信息。

      3. 为没有直接连接到服务器接口的 IPv6 子网添加 shared-network 声明,比如以下:

        shared-network example {
          option domain-name-servers 2001:db8:0:1::1:1
          ...
        
          subnet6 2001:db8:0:1::1:0/120 {
            range6 2001:db8:0:1::1:20 2001:db8:0:1::1:100
          }
        
          subnet6 2001:db8:0:1::2:0/120 {
            range6 2001:db8:0:1::2:20 2001:db8:0:1::2:100
          }
          ...
        }

        这个示例添加了一个共享网络声明,它包含 2001:db8:0:1::1:0/120 和 2001:db8:0:1::2:0/120 网络所需的 subnet6 声明。使用这个配置,DHCP 服务器会为发送来自这些子网之一 DHCP 请求的客户端分配下列设置:

        • 两个子网的客户端的 DNS 服务器的 IP 是 2001:db8:0:1::1:1
        • range6 参数中定义的空闲的 IPv6 地址,具体要看客户端从哪个子网发送请求。

          请注意: IPv6 需要使用路由器广告信息来识别默认网关。

      4. 为服务器直接连接到的子网添加 subnet6 声明,用于访问上面 shared-network 中指定的远程子网:

        subnet6 2001:db8:0:1::50:0/120 {
        }
        注意

        如果服务器不向这个子网提供 DHCP 服务,则 subnet6 声明必须为空,如示例所示。没有直接连接的子网声明,dhcpd 就无法启动。

    2. 另外,还可在系统引导时配置 dhcpd6 自动启动:

      # systemctl enable dhcpd6
    3. 启动 dhcpd6 服务:

      # systemctl start dhcpd6

其它资源

  • 有关您可以在 /etc/dhcp/dhcpd.conf/etc/dhcp/dhcpd6.conf 中设置的所有参数列表,请查看 dhcp-options(5) man page。
  • 有关 authoritative 声明的详情,请查看 dhcpd.conf(5) man page 中的 The authoritative statement 部分。
  • 有关配置示例,请查看 /usr/share/doc/dhcp-server/dhcpd.conf.example/usr/share/doc/dhcp-server/dhcpd6.conf.example 文件。
  • 如需更多信息,请参阅 第 45.11 节 “设置 DHCP 转发代理”

45.8. 使用 DHCP 为主机分配静态地址

使用 host 声明,您可以配置 DHCP 服务器为主机的 MAC 地址分配固定的 IP 地址。例如:使用这个方法总是为服务器或者网络设备分配相同的 IP 地址。

重要

如果您为 MAC 地址配置固定 IP 地址,IP 地址必须是您在 fixed-addressfixed-address6 参数中指定的地址池之外。

根据您要为 IPv4、IPv6 或这两个协议配置固定地址,请查看以下操作过程:

先决条件

  • dhcpd 服务已被配置并正在运行。
  • 您以 root 用户身份登录。

流程

  • 对于 IPv4 网络:

    1. 编辑 /etc/dhcp/dhcpd.conf 文件:

      1. 添加 host 声明:

        host server.example.com {
        	hardware ethernet 52:54:00:72:2f:6e;
        	fixed-address 192.0.2.130;
        }

        这个示例将 DHCP 服务器配置为,总是为 MAC 地址为 52:54:00:72:2f:6e的主机分配 192.0.2.130 IP 地址。

        dhcpd 服务根据 fixed-address 参数中指定的 MAC 地址来识别系统,而不是 host 声明中的名称。因此,您可以将此名称设置为不匹配其他 host 声明的字符串。要为多个网络配置相同的系统,请使用不同的名称,否则 dhcpd 无法启动。

      2. 另外,还可在针对此主机的 host 声明中添加其他设置。
    2. 重启 dhcpd 服务:

      # systemctl start dhcpd
  • 对于 IPv6 网络:

    1. 编辑 /etc/dhcp/dhcpd6.conf 文件:

      1. 添加 host 声明:

        host server.example.com {
        	hardware ethernet 52:54:00:72:2f:6e;
        	fixed-address6 2001:db8:0:1::200;
        }

        这个示例将 DHCP 服务器配置为,总是为 MAC 地址为 52:54:00:72:2f:6e的主机分配 2001:db8:0:1::20 IP 地址。

        dhcpd 服务根据 fixed-address6 参数中指定的 MAC 地址来识别系统,而不是 host 声明中的名称。因此,只要它只用于其他 host 声明,就可以将此名称设置为任意字符串。要为多个网络配置相同的系统,请使用不同的名称。否则 dhcpd 将无法启动。

      2. 另外,还可在针对此主机的 host 声明中添加其他设置。
    2. 重启 dhcpd6 服务:

      # systemctl start dhcpd6

其它资源

  • 有关您可以在 /etc/dhcp/dhcpd.conf/etc/dhcp/dhcpd6.conf 中设置的所有参数列表,请查看 dhcp-options(5) man page。
  • 有关配置示例,请查看 /usr/share/doc/dhcp-server/dhcpd.conf.example/usr/share/doc/dhcp-server/dhcpd6.conf.example 文件。

45.9. 使用 group 声明同时将参数应用到多个主机、子网和共享网络

使用 group 声明,您可以对多个主机、子网和共享网络应用相同的参数。

请注意,本节中的步骤描述了为主机使用 group 声明,但步骤与子网和共享网络相同。

根据您要为 IPv4、IPv6 或两个协议配置组,请查看以下操作过程:

先决条件

  • dhcpd 服务已被配置并正在运行。
  • 您以 root 用户身份登录。

流程

  • 对于 IPv4 网络:

    1. 编辑 /etc/dhcp/dhcpd.conf 文件:

      1. 添加 group 声明:

        group {
          option domain-name-servers 192.0.2.1;
        
          host server1.example.com {
            hardware ethernet 52:54:00:72:2f:6e;
            fixed-address 192.0.2.130;
          }
        
          host server2.example.com {
            hardware ethernet 52:54:00:1b:f3:cf;
            fixed-address 192.0.2.140;
          }
        }

        这个 group 定义为两个 host 条目分组。dhcpd 服务将 option domain-name-servers 参数中设置的值应用到组中的两个主机。

      2. 另外,还可在这些主机的 group 声明中添加其他设置。
    2. 重启 dhcpd 服务:

      # systemctl start dhcpd
  • 对于 IPv6 网络:

    1. 编辑 /etc/dhcp/dhcpd6.conf 文件:

      1. 添加 group 声明:

        group {
          option dhcp6.domain-search "example.com";
        
          host server1.example.com {
            hardware ethernet 52:54:00:72:2f:6e;
            fixed-address 2001:db8:0:1::200;
          }
        
          host server2.example.com {
            hardware ethernet 52:54:00:1b:f3:cf;
            fixed-address 2001:db8:0:1::ba3;
          }
        }

        这个 group 定义为两个 host 条目分组。dhcpd 服务将 option dhcp6.domain-search 参数中设置的值应用到组中的两个主机。

      2. 另外,还可在这些主机的 group 声明中添加其他设置。
    2. 重启 dhcpd6 服务:

      # systemctl start dhcpd6

其它资源

  • 有关您可以在 /etc/dhcp/dhcpd.conf/etc/dhcp/dhcpd6.conf 中设置的所有参数列表,请查看 dhcp-options(5) man page。
  • 有关配置示例,请查看 /usr/share/doc/dhcp-server/dhcpd.conf.example/usr/share/doc/dhcp-server/dhcpd6.conf.example 文件。

45.10. 恢复损坏的租期数据库

如果 DHCP 服务器记录了一个与租期数据库相关的错误,如 Corrupt lease file - possible data loss!,您可以从创建的 dhcpd 服务中恢复租期数据库。请注意,这个副本可能没有反映数据库的最新状态。

警告

如果您删除了租期数据库而不是用备份替换它,则丢失了当前分配的租期的所有信息。因此,DHCP 服务器可以为之前分配给其它主机但还没有过期的客户端分配租期。这会导致 IP 冲突。

根据您要恢复 DHCPv4、DHCPv6 还是两个数据库,请查看:

先决条件

  • 您以 root 用户身份登录。
  • 租期数据库被损坏。

流程

  • 恢复 DHCPv4 租期数据库:

    1. 停止 dhcpd 服务:

      # systemctl stop dhcpd
    2. 重命名损坏租期数据库:

      # mv /var/lib/dhcpd/dhcpd.leases /var/lib/dhcpd/dhcpd.leases.corrupt
    3. 恢复 dhcp 服务在刷新租期数据库时创建的租期数据库副本:

      # cp -p /var/lib/dhcpd/dhcpd.leases~ /var/lib/dhcpd/dhcpd.leases
      重要

      如果您有租期数据库的最新备份,则恢复这个备份。

    4. 启动 dhcpd 服务:

      # systemctl start dhcpd
  • 恢复 DHCPv6 租期数据库:

    1. 停止 dhcpd6 服务:

      # systemctl stop dhcpd6
    2. 重命名损坏租期数据库:

      # mv /var/lib/dhcpd/dhcpd6.leases /var/lib/dhcpd/dhcpd6.leases.corrupt
    3. 恢复 dhcp 服务在刷新租期数据库时创建的租期数据库副本:

      # cp -p /var/lib/dhcpd/dhcpd6.leases~ /var/lib/dhcpd/dhcpd6.leases
      重要

      如果您有租期数据库的最新备份,则恢复这个备份。

    4. 启动 dhcpd6 服务:

      # systemctl start dhcpd6

其它资源

45.11. 设置 DHCP 转发代理

DHCP 转发代理(dhcrelay)启用将 DHCP 和来自没有 DHCP 服务器的子网的 BOOTP 请求转发到其他子网上的一个或多个 DHCP 服务器。当 DHCP 客户端请求信息时,DHCP 转发代理会将该请求转发到指定的 DHCP 服务器列表。当 DHCP 服务器返回一个回复时,DHCP 转发代理会将此请求转发给客户端。

根据您要为 IPv4、IPv6 或两个协议设置 DHCP 转发,请查看以下操作过程:

先决条件

  • 您以 root 用户身份登录。

流程

  • 对于 IPv4 网络:

    1. 安装 dhcp-relay 软件包:

      # yum install dhcp-relay
    2. /lib/systemd/system/dhcrelay.service 文件复制到 /etc/systemd/system/ 目录中:

      # cp /lib/systemd/system/dhcrelay.service /etc/systemd/system/

      不要编辑 /usr/lib/systemd/system/dhcrelay.service 文件。dhcp-relay 软件包将来的更新可能会覆盖这些更改。

    3. 编辑 /etc/systemd/system/dhcrelay.service 文件,并附加 -i interface 参数以及负责该子网的 DHCPv4 服务器的 IP 地址列表:

      ExecStart=/usr/sbin/dhcrelay -d --no-pid -i enp1s0 192.0.2.1

      使用这些附加参数,dhcrelay 侦听 enp1s0 接口上的 DHCPv4 请求,并使用 IP 192.0.2.1 将它们转发到 DHCP 服务器。

    4. 重新载入 systemd 管理器配置:

      # systemctl daemon-reload
    5. 另外,还可配置在系统引导时启动 dhcrelay 服务:

      # systemctl enable dhcrelay.service
    6. 启动 dhcrelay 服务:

      # systemctl start dhcrelay.service
  • 对于 IPv6 网络:

    1. 安装 dhcp-relay 软件包:

      # yum install dhcp-relay
    2. /lib/systemd/system/dhcrelay.service 文件复制到 /etc/systemd/system/ 目录中并命名为 dhcrelay6.service

      # cp /lib/systemd/system/dhcrelay.service /etc/systemd/system/dhcrelay6.service

      不要编辑 /usr/lib/systemd/system/dhcrelay.service 文件。dhcp-relay 软件包将来的更新可能会覆盖这些更改。

    3. 编辑 /etc/systemd/system/dhcrelay6.service 文件,并附加 -l receiving_interface-u outgoing_interface 参数:

      ExecStart=/usr/sbin/dhcrelay -d --no-pid -l enp1s0 -u enp7s0

      使用这些额外参数,dhcrelay 侦听 enp1s0 接口上的 DHCPv6 请求并将其转发到连接到 enp7s0 接口的网络。

    4. 重新载入 systemd 管理器配置:

      # systemctl daemon-reload
    5. 另外,还可配置在系统引导时启动 dhcrelay6 服务:

      # systemctl enable dhcrelay6.service
    6. 启动 dhcrelay6 服务:

      # systemctl start dhcrelay6.service

其它资源

  • 有关 dhcrelay的详情,请查看 dhcrelay(8) man page。

第 46 章 使用和配置 firewalld

防火墙是保护机器不受来自外部的、不需要的网络数据的一种方式。它允许用户通过定义一组防火墙规则 来控制主机上的入站网络流量。这些规则用于对进入的流量进行排序,并可以阻断或允许流量。

firewalld 是一个防火墙服务守护进程,它为使用 D-Bus 接口提供动态可定制主机防火墙的防火墙服务守护进程。如果是动态的,它可在每次修改规则时启用、修改和删除规则,而不需要在每次修改规则时重启防火墙守护进程。

firewalld 使用区(zone)和服务(service)的概念来简化流量管理。zones 是预定义的规则集。网络接口和源可以分配给区。允许的流量取决于您计算机连接到的网络,并分配了这个网络的安全级别。防火墙服务是预定义的规则,覆盖了允许特定服务进入流量的所有必要设置,并在区中应用。

服务使用一个或多个端口或地址进行网络通信。防火墙会根据端口过滤通讯。要允许服务的网络流量,必须打开其端口。firewalld 阻断未明确设置为打开的端口上的所有流量。一些区(如可信区)默认允许所有流量。

请注意,带有 nftables 后端的 firewalld 不支持使用 --direct 选项将自定义 nftables 规则传递给 firewalld

46.1. 开始使用 firewalld

46.1.1. 使用 firewalld、nftables 或者 iptables 时

以下是您应该使用以下工具之一的概述:

  • firewalld: 在简单防火墙用例中使用 firewalld 工具。该工具非常容易使用,并涵盖这些场景的典型用例。
  • nftables: 使用 nftables 实用程序设置复杂和性能的关键防火墙,比如为整个网络设置。
  • iptables:Red Hat Enterprise Linux 8 中的 iptables 工具程序使用 nf_tables 内核 API 而不是 legacy 后端。nf_tables API 提供向后兼容性,使用 iptables 命令的脚本仍然可用于 Red Hat Enterprise Linux 8。对于新的防火墙脚本,红帽建议使用 nftables
重要

要避免不同的防火墙服务相互影响,在 RHEL 主机中只有一个服务,并禁用其他服务。

46.1.2. Zones

firewalld 可以用来根据用户决定放置在那个网络中的接口和流量级别的信任级别将网络划分为不同的区。一个连接只能是一个区的一部分,但一个区可以被用来进行很多网络连接。

NetworkManager 通知接口区的 firewalld。您可以为接口分配区:

  • NetworkManager
  • firewall-config 工具
  • firewall-cmd 命令行工具
  • RHEL web 控制台

后三个只能编辑正确的 NetworkManager 配置文件。如果您使用 web 控制台 firewall-cmdfirewall-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 区。默认区可以被修改。

注意

网络区名称应该自我解释,并允许用户迅速做出合理的决定。要避免安全问题,请查看默认区配置并根据您的需要和风险禁用任何不必要的服务。

其它资源

  • firewalld.zone(5) man page。

46.1.3. 预定义的服务

服务可以是本地端口、协议、源端口和目的地列表,并在启用了服务时自动载入防火墙帮助程序模块列表。使用服务可节省用户时间,因为它们可以完成一些任务,如打开端口、定义协议、启用数据包转发等等,而不必在另外的步骤中设置所有任务。

服务配置选项和通用文件信息请参考 firewalld.service(5) man page。服务通过单独的 XML 配置文件指定,这些文件使用以下格式命名: service-name.xml。协议名称优先于 firewalld 中的服务或者应用程序名称。

可使用图形 firewall-config 工具、firewall-cmdfirewall-offline-cmd添加和删除服务。

另外,您也可以编辑 /etc/firewalld/services/ 目录中的 XML 文件。如果用户没有添加或更改服务,则在 /etc/firewalld/services/ 中没有找到对应的 XML 文件。如果要添加或更改服务,/usr/lib/firewalld/services/ 目录中的文件可作为模板使用。

其它资源

  • firewalld.service(5) man page

46.2. 查看当前状态和设置 firewalld

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

其它资源

在尝试编辑设置前,了解 firewalld 是如何设置的以及哪些规则被强制实施非常重要。要显示防火墙设置,以 root 用户身份使用 firewall-cmd --list-all

46.2.2. 使用 GUI 查看允许的服务

要使用图形化的 firewall-config 工具查看服务列表,请按 Super 键进入" 活动概览",输入 firewall,然后按 Enter 键。firewall-config 工具会出现。现在您可以在 Services 标签页中查看服务列表。

您可以使用命令行启动图形防火墙配置工具。

流程

  • 使用命令行启动图形防火墙配置工具:

    $ firewall-config

Firewall Configuration 窗口将打开。请注意,这个命令可以以普通用户身份运行,但偶尔会提示您输入管理员密码。

46.2.3. 使用 CLI 查看 firewalld 设置

使用 CLI 客户端可能会对当前防火墙设置有不同的视图。--list-all 选项显示 firewalld 设置的完整概述。

firewalld 使用 zone 管理流量。如果 --zone 选项没有指定区,该命令将在分配给活跃网络接口和连接的默认区里有效。

流程

  • 要列出默认区的所有相关信息:

    # 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:
  • 要指定显示设置的区域,在 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]
  • 要查看特定信息(如服务或端口)的设置,请使用特定选项。请查看 firewalld 手册页或使用命令帮助获得选项列表:

    # firewall-cmd --help
  • 查看当前区中允许哪些服务:

    # firewall-cmd --list-services
    ssh dhcpv6-client
注意

使用 CLI 工具列出某个子部分的设置有时会比较困难。例如,允许 SSH 服务, firewalld 为该服务打开所需的端口(22)。之后,如果您列出允许的服务,列表会显示 SSH 服务,但如果您列出了开放端口,则不会显示任何服务。因此,建议您使用 --list-all 选项确定您收到完整信息。

46.3. 使用 firewalld

46.3.1. 使用 CLI 禁用紧急事件的所有流量

在紧急情况下,如系统攻击,可以禁用所有网络流量并关闭攻击者。

流程

  1. 要立即禁用网络流量,请切换 panic 模式:

    # firewall-cmd --panic-on
    重要

    启用 panic 模式可停止所有网络流量。因此,它应只在对机器有物理访问权限或者使用串口控制台登录时才使用。

  2. 关闭 panic 模式会使防火墙恢复到其永久设置。要关闭 panic 模式,请输入:

    # firewall-cmd --panic-off

验证

  • 要查看是否打开或关闭 panic 模式,请使用:

    # firewall-cmd --query-panic

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

46.3.3. 通过 GUI,使用预定义服务控制流量

这个步骤描述了如何使用图形用户界面控制预定义服务的网络流量。

流程

  1. 启用或禁用预定义或自定义服务:

    1. 启动 firewall-config 工具并选择要配置的服务的网络区。
    2. 选择 Services 标签。
    3. 选择您要信任的每种服务类型的复选框,或者清除要阻断服务的复选框。
  2. 编辑服务:

    1. 启动 firewall-config 工具。
    2. 从标记的 Configuration 菜单中选择 Permanent。其它图标和菜单按钮会出现在服务窗口底部。
    3. 选择您要配置的服务。

PortsProtocolsSource Port 标签页启用了为所选服务启用、更改和删除端口、协议和源端口。模块标签是用来配置 Netfilter helper 模块。Destination 标签允许将流量限制到特定的目标地址和互联网协议(IPv4IPv6)。

注意

Runtime 模式中无法更改服务设置。

46.3.4. 添加新服务

可使用图形化的 firewall-config 工具 firewall-cmdfirewall-offline-cmd添加和删除服务。或者,您可以编辑 /etc/firewalld/services/ 中的 XML 文件。如果用户没有添加或更改服务,则在 /etc/firewalld/services/ 中没有找到对应的 XML 文件。如果要添加或更改服务,/usr/lib/firewalld/services/ 文件可作为模板使用。

注意

服务名称必须是字母数字,以及 _(下划线)和 -(横线)字符。

流程

要在终端中添加新服务,请使用 firewall-cmdfirewall-offline-cmd (如果未激活 firewalld)。

  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 中的覆盖文件。这只适用于永久性环境。要在运行时环境中获取这些回退,则需要重新载入。

46.3.5. 使用 GUI 打开端口

允许通过防火墙到特定端口的流量:

  1. 启动 firewall-config 工具并选择要更改的网络区。
  2. 选择 Ports 标签并点击右侧的添加按钮。Port and Protocol 窗口将打开。
  3. 输入要允许的端口号或者端口范围。
  4. 从列表中选择 tcpudp

46.3.6. 使用 GUI 控制协议的流量

使用特定的协议允许通过防火墙的流量:

  1. 启动 firewall-config 工具并选择要更改的网络区。
  2. 选择 Protocols 标签并点击右首的 Add 按钮。Protocol 窗口将打开。
  3. 您可以从列表中选择一个协议,也可以选择 Other Protocol 复选框并在字段中输入协议。

46.3.7. 使用 GUI 打开源端口

允许通过防火墙的流量来自特定端口:

  1. 启动 firewall-config 工具并选择要更改的网络区。
  2. 选择 Source Port 标签并点击右首的 Add 按钮。Source Port 窗口将打开。
  3. 输入要允许的端口号或者端口范围。从列表中选择 tcpudp

46.4. 使用 CLI 控制端口

端口是可让操作系统接收和区分网络流量并将其转发到系统服务的逻辑设备。它们通常由侦听端口的守护进程来表示,它会等待到达这个端口的任何流量。

通常,系统服务侦听为它们保留的标准端口。例如,httpd 守护进程侦听端口 80。但默认情况下,系统管理员会将守护进程配置为在不同端口上侦听以便增强安全性或出于其他原因。

46.4.1. 打开端口

通过打开端口,系统可从外部访问,这代表了安全风险。通常,让端口保持关闭,且只在某些服务需要时才打开。

流程

要获得当前区的打开端口列表:

  1. 列出所有允许的端口:

    # firewall-cmd --list-ports
  2. 在允许的端口中添加一个端口,以便为入站流量打开这个端口:

    # firewall-cmd --add-port=port-number/port-type

    端口类型可以是 tcpudpsctpdccp。这个类型必须与网络通信的类型匹配。

  3. 使新设置具有持久性:

    # firewall-cmd --runtime-to-permanent

    端口类型可以是 tcpudpsctpdccp。这个类型必须与网络通信的类型匹配。

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

46.5. 使用 firewalld 区

zones 代表一种更透明管理传入流量的概念。这些区域连接到联网接口或者分配一系列源地址。您可以独立为每个区管理防火墙规则,这样就可以定义复杂的防火墙设置并将其应用到流量。

46.5.1. 列出区域

这个步骤描述了如何使用命令行列出区。

流程

  1. 查看系统中有哪些可用区:

    # firewall-cmd --get-zones

    firewall-cmd --get-zones 命令显示系统中所有可用的区域,但不显示具体区的详情。

  2. 查看所有区的详细信息:

    # firewall-cmd --list-all-zones
  3. 查看特定区的详细信息:

    # firewall-cmd --zone=zone-name --list-all

46.5.2. 更改特定区的 firewalld 设置

使用 cli 和 Controlling 端口控制预定义服务的流量 解释了如何在当前工作区范围内添加服务或修改端口。有时,需要在不同区内设置规则。

流程

  • 要在不同的区中工作,使用 --zone=zone-name 选项。例如,允许在区 public 中使用 SSH 服务:

    # firewall-cmd --add-service=ssh --zone=public

46.5.3. 更改默认区

系统管理员在其配置文件中为网络接口分配区域。如果接口没有被分配给指定区,它将被分配给默认区。每次重启 firewalld 服务后, firewalld 加载默认区的设置并使其活跃。

流程

设置默认区:

  1. 显示当前的默认区:

    # firewall-cmd --get-default-zone
  2. 设置新的默认区:

    # firewall-cmd --set-default-zone zone-name
    注意

    在此流程后,设置是一个永久设置,即使没有 --permanent 选项。

46.5.4. 将网络接口分配给区

可以为不同区定义不同的规则集,然后通过更改所使用的接口的区来快速改变设置。使用多个接口,可以为每个具体区设置一个区来区分通过它们的网络流量。

流程

要将区分配给特定的接口:

  1. 列出活跃区以及分配给它们的接口:

    # firewall-cmd --get-active-zones
  2. 为不同的区分配接口:

    # firewall-cmd --zone=zone_name --change-interface=interface_name --permanent

46.5.5. 使用 nmcli 为连接分配区域

这个步骤描述了如何使用 nmcli 工具在 NetworkManager 连接中添加 firewalld 区。

流程

  1. NetworkManager 连接配置集分配区域:

    # nmcli connection modify profile connection.zone zone_name
  2. 重新加载连接:

    # nmcli connection up profile

46.5.6. 在 ifcfg 文件中手动将区分配给网络连接

当连接由 网络管理器(NetworkManager)管理时,必须了解它使用的区域。为每个网络连接指定区域,根据计算机有可移植设备的位置提供各种防火墙设置的灵活性。因此,可以为不同的位置(如公司或家)指定区域和设置。

流程

  • 要为连接设置区,编辑 /etc/sysconfig/network-scripts/ifcfg-connection_name 文件并添加为这个连接分配区的行:

    ZONE=zone_name

46.5.7. 创建一个新区

要使用自定义区,创建一个新的区并使用它像预定义区一样。新区需要 --permanent 选项,否则命令无法正常工作。

流程

  1. 创建一个新区:

    # firewall-cmd --new-zone=zone-name
  2. 检查是否在您的永久设置中添加了新的区:

    # firewall-cmd --get-zones
  3. 使新设置具有持久性:

    # firewall-cmd --runtime-to-permanent

46.5.8. 区配置文件

区也可以通过区配置文件创建。如果您需要创建新区,但想从不同区重复使用设置,这种方法就很有用了。

firewalld 区配置文件包含区的信息。这些区描述、服务、端口、协议、icmp-blocks、masquerade、forward-ports 和丰富的语言规则采用 XML 文件格式。文件名必须是 zone-name.xml,其中 zone-name 的长度限制为 17 个字符。区配置文件位于 /usr/lib/firewalld/zones//etc/firewalld/zones/ 目录中。

以下示例显示了允许一个服务(SSH)和一个端口范围的配置,适用于 TCPUDP 协议:

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

要更改那个区的设置,请添加或者删除相关的部分来添加端口、转发端口、服务等等。

其它资源

  • 如需更多信息,请参阅 firewalld.zone man page。

46.5.9. 使用区目标设定传入流量的默认行为

对于每个区,您可以设置一种处理尚未进一步指定的传入流量的默认行为。这种行为是通过设置区目标来定义的。有四个选项 - defaultACCEPTREJECTDROP。通过将目标设置为 ACCEPT,您接受除特定规则禁用的数据包外的所有传入的数据包。如果将目标设置为 REJECTDROP,您将禁用所有传入的数据包,除非您在特定规则中允许的数据包。拒绝数据包时,会通知源机器,但丢弃数据包时不会发送任何信息。

流程

为区设置目标:

  1. 列出特定区的信息以查看默认目标:

    $ firewall-cmd --zone=zone-name --list-all
  2. 在区中设置一个新目标:

    # firewall-cmd --permanent --zone=zone-name --set-target=<default|ACCEPT|REJECT|DROP>

46.6. 根据源使用区管理传入流量

46.6.1. 根据源使用区管理传入流量

您可以使用区管理传入的流量,根据其源管理传入的流量。这可让您对进入的流量进行排序,并将其路由到不同的区,以允许或禁止该流量可访问的服务。

如果您给区添加一个源,区就会成为活跃的,来自该源的所有进入流量都会被定向到它。您可以为每个区指定不同的设置,这些设置相应地应用于来自给定源的网络流量。即使只有一个网络接口,您可以使用更多区域。

46.6.2. 添加源

要将传入的流量路由到特定源,请将源添加到那个区。源可以是一个使用 CIDR 格式的 IP 地址或 IP 掩码。

注意

如果您添加多个带有重叠网络范围的区域,则根据区名称排序,且只考虑第一个区。

  • 在当前区中设置源:

    # firewall-cmd --add-source=<source>
  • 要为特定区设置源 IP 地址:

    # firewall-cmd --zone=zone-name --add-source=<source>

以下流程将在 trusted 区中允许来自 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

46.6.3. 删除源

从区中删除源会关闭来自它的网络流量。

流程

  1. 列出所需区的允许源:

    # firewall-cmd --zone=zone-name --list-sources
  2. 从区永久删除源:

    # firewall-cmd --zone=zone-name --remove-source=<source>
  3. 使新设置具有持久性:

    # firewall-cmd --runtime-to-permanent

46.6.4. 添加源端口

要启用根据原始端口对流量排序,使用 --add-source-port 选项指定源端口。您还可以将此选项与 --add-source 选项合并,将流量限制为特定 IP 地址或 IP 范围。

流程

  • 添加源端口:

    # firewall-cmd --zone=zone-name --add-source-port=<port-name>/<tcp|udp|sctp|dccp>

46.6.5. 删除源端口

通过删除源端口,您可以根据原始端口禁用对流量排序。

流程

  • 要删除源端口:

    # firewall-cmd --zone=zone-name --remove-source-port=<port-name>/<tcp|udp|sctp|dccp>

46.6.6. 使用区和源来允许一个服务只适用于一个特定的域

要允许特定网络的流量在机器上使用服务,请使用区和源。以下流程只允许来自 192.0.2.0/24 网络的 HTTP 流量,同时阻断任何其他流量。

警告

当您配置这种情况时,请使用具有 default 目标的区域。使用将目标设置为 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. internal 区中添加 http 服务:

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

其它资源

  • 有关区的详情,请参考 firewalld.zones(5) man page。

46.7. 使用 firewalld 配置 NAT

使用 firewalld,您可以配置以下网络地址转换(NAT)类型:

  • 伪装
  • 源 NAT(SNAT)
  • 目标 NAT(DNAT)
  • 重定向

46.7.1. 不同的 NAT 类型: masquerading、source NAT、destination NAT 和 redirect

这些是不同的网络地址转换(NAT)类型:

伪装和源 NAT(SNAT)

使用以上 NAT 类型之一更改数据包的源 IP 地址。例如:互联网服务提供商不会路由私有 IP 范围,如 10.0.0.0/8。如果您在网络中使用私有 IP 范围,并且用户可以访问互联网中的服务器,请将这些范围内的数据包源 IP 地址映射到一个公共 IP 地址。

伪装和 SNAT 都非常相似。不同之处是:

  • 伪装自动使用传出接口的 IP 地址。因此,如果传出接口使用了动态 IP 地址,则使用伪装。
  • SNAT 将数据包的源 IP 地址设置为指定的 IP 地址,且不会动态查找传出接口的 IP 地址。因此,SNAT 要比伪装更快。如果传出接口使用了固定 IP 地址,则使用 SNAT。
目标 NAT(DNAT)
使用此 NAT 类型重写传入数据包的目标地址和端口。例如,如果您的网页服务器使用来自私有 IP 范围内的 IP 地址,因此无法直接从互联网访问,您可以在路由器上设置 DNAT 规则来重定向进入该服务器的流量。
重定向
这个类型是 IDT 的特殊示例,它根据链 hook 将数据包重定向到本地机器。例如,如果服务在与标准端口不同的端口中运行,您可以将标准端口传入的流量重定向到这个特定端口。

46.7.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 选项的命令。

要禁用 IP 伪装,以 root 身份输入以下命令:

# firewall-cmd --zone=external --remove-masquerade --permanent

46.8. 端口转发

使用此方法重定向端口只可用于基于 IPv4 的流量。对于 IPv6 重定向设置,您必须使用丰富的规则。

要重定向到外部系统,需要启用伪装。如需更多信息,请参阅配置 IP 地址伪装

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

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

46.8.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>
    2. 禁用伪装:

      # firewall-cmd --remove-masquerade

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

46.9. 管理 ICMP 请求

Internet Control Message ProtocolICMP)是一个支持协议,不同的网络设备使用它来发送错误信息和显示连接问题的操作信息,例如:请求的服务不可用。ICMP 与 TCP 和 UDP 等传输协议不同,因为它没有用来在系统间交换数据。

不幸的是,使用 ICMP 信息(特别是 echo-requestecho-reply )可能会公开您的网络信息,这些信息可能会被利用而造成安全隐患。因此, firewalld 启用阻止 ICMP 请求来保护您的网络信息。

46.9.1. 列出和阻塞 ICMP 请求

列出 ICMP 请求

ICMP 请求在位于 /usr/lib/firewalld/icmptypes/ 目录中的独立 XML 文件中描述。您可以阅读这些文件来查看请求的描述。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 请求,客户端会知道您正在阻断它。这样潜在的攻击者仍然可以看到您的 IP 地址在线。要完全隐藏这些信息,您必须删除所有 ICMP 请求。

  • 阻塞和丢弃所有 ICMP 请求:
  • 将区的目标设置为 DROP:

    # firewall-cmd --permanent --set-target=DROP

现在,除您明确允许的流量外,所有流量(包括 ICMP 请求)将被丢弃。

阻塞或丢弃特定的 ICMP 请求,并允许其他请求:

  1. 将区的目标设置为 DROP:

    # firewall-cmd --permanent --set-target=DROP
  2. 添加 ICMP 块 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. 将区的目标设置为 defaultACCEPT

    # firewall-cmd --permanent --set-target=default
  2. 删除 ICMP 请求的所有添加的块:

    # firewall-cmd --remove-icmp-block=<icmptype>
  3. 删除 ICMP 块 inversion:

    # firewall-cmd --remove-icmp-block-inversion
  4. 使新设置具有持久性:

    # firewall-cmd --runtime-to-permanent

46.9.2. 使用 GUI 配置 ICMP 过滤器

  • 要启用或禁用 ICMP 过滤器,启动 firewall-config 工具并选择过滤消息的网络区。选择 ICMP Filter 标签并选择您要过滤的每种 ICMP 消息类型的复选框。清除复选框以禁用过滤器。这个设置按方向设置,默认允许所有操作。
  • 要编辑 ICMP 类型,启动 firewall-config 工具并在标记为 Configuration 的菜单中选择 Permanent 模式。在 Services 窗口的底部会显示附加图标。选择 Yes 启用伪装并转发到另一台机器工作。
  • 要启用反向 ICMP Filter,请点击右侧的 Invert Filter 复选框。现在只接受标记为 ICMP 的类型,所有其他都被拒绝。在使用 DROP 目标的区域里它们会被丢弃。

46.10. 使用 firewalld

要查看 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

46.10.1. 使用 CLI 配置 IP 设置选项

IP 集可以在 firewalld 区域中用作源,也可以作为丰富的规则的源使用。在 Red Hat Enterprise Linux 中,首选的方法是使用在直接规则 firewalld 中创建的 IP 集合。

  • 要列出永久环境中 firewalld 已知的 IP 集,请使用以下命令 root

    # firewall-cmd --permanent --get-ipsets
  • 要添加新 IP 集,以 root 身份运行以下命令:

    # firewall-cmd --permanent --new-ipset=test --type=hash:net
    success

    以上命令为 IPv4 创建了名称为 test 类型为 hash:net 的新 IP 设置。要创建用于 IPv6 的 IP 集,添加 --option=family=inet6 选项。要使新设置在运行时环境中有效,请重新载入 firewalld

  • 使用以下命令列出新 IP 设置:root

    # 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 集限于永久环境,其它所有 IP 设置选项也可以在运行时环境中使用,即使没有 --permanent 选项。

警告

红帽不推荐使用不是通过 firewalld 管理的 IP 集。要使用这样的 IP 组,需要一个永久直接规则来引用集合,且必须添加自定义服务来创建这些 IP 组件。这个服务需要在 firewalld 启动前启动,否则 firewalld 无法使用这些组添加直接规则。您可以使用 /etc/firewalld/direct.xml 文件添加永久直接规则。

46.11. 丰富规则的优先级

默认情况下,丰富的规则会根据其规则操作进行组织。例如: deny 规则优先于 allow 规则。priority 参数丰富的规则可让管理员对丰富的规则及其执行顺序进行精细的控制。

46.11.1. priority 参数如何将规则组织为不同的链

您可以将 priority 参数设置为在 -3276832767 之间的任意数量,较低值具有更高的优先级。

firewalld 服务根据优先级值在不同的链中组织规则:

  • 优先级低于 0:规则被重定向到带有 _pre 后缀的链中。
  • 优先级高于 0:规则被重定向到使用 _post 后缀的链中。
  • 优先级等于 0:基于操作,规则会被重定向到带有 _log_deny_allow 操作的链中。

在这些子链中,firewalld 会根据其优先级值对规则排序。

46.11.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
      }
    }

46.12. 配置防火墙锁定

如果本地应用程序或服务是作为 root 运行的,(例如: libvirt),则可以更改防火墙配置。使用这个特性,管理员可以锁定防火墙配置,从而达到没有应用程序或只有添加到锁定白名单中的应用程序可以请求防火墙更改的目的。锁定设置默认会被禁用。如果启用,用户就可以确定,防火墙没有被本地的应用程序或服务进行了不必要的配置更改。

46.12.1. 使用 CLI 配置锁定

这个步骤描述了如何使用命令行启用或禁用锁定。

  • 要查询是否启用锁定,使用以下命令: root

    # firewall-cmd --query-lockdown

    如果启用了锁定,则命令会输出 yes,退出状态为 0。否则,它会输出 no,退出状态为 1

  • 要启用锁定,以 root 身份输入以下命令:

    # firewall-cmd --lockdown-on
  • 要禁用锁定,以 root 身份运行以下命令:

    # firewall-cmd --lockdown-off

46.12.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 命令是否在 allowlist 中,以 root 身份输入以下命令:

    # firewall-cmd --query-lockdown-whitelist-command='/usr/bin/python3 -Es /usr/bin/command'

    如果为 true,该命令会输出 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

    如果为 true,输出 yes,退出状态为 0,否则输出 1,退出状态为 no

  • 要列出允许列表中的所有用户 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

    如果为 true,输出 yes,退出状态为 0,否则输出 1,退出状态为 no

  • 要列出允许列表中的所有用户名,以 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

    如果为 true,输出 yes,退出状态为 0,否则输出 1,退出状态为 no

46.12.3. 使用配置文件配置锁定的 allowlist 选项

默认 allowlist 配置文件包含 NetworkManager 上下文和 libvirt 默认上下文。用户 ID 0 也位于列表中。

<?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 iduser name,但只需要一个选项。Python 是程序解释器,它位于命令行的前面。您还可以使用特定的命令,例如:

/usr/bin/python3 /bin/firewall-cmd --lockdown-on

在这个示例中,只允许 --lockdown-on 命令。

在 Red Hat Enterprise Linux 中,所有工具都放置在 /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 属性末尾的 * 意味着,所有以这个字符串开头的命令都匹配。如果没有 *,包括参数的绝对命令必须匹配。

第 47 章 nftables 入门

nftables 框架提供数据包分类工具,它是 iptablesip6tablesarptablesebtablesipset 工具的指定后台。与之前的数据包过滤工具相比,它在方便、特性和性能方面提供了大量改进,最重要的是:

  • 内置查找表而不是线性处理
  • IPv4IPv6 协议都使用同一个框架
  • 规则会以一个整体被应用,而不是分为抓取、更新和存储完整的规则集的步骤
  • 支持在规则集(nftrace)中进行调试和追踪,并监控追踪事件(在 nft 工具中)
  • 更加一致和压缩的语法,没有特定协议的扩展
  • 用于第三方应用程序的 Netlink API

iptables类似, nftables 使用表来存储链。链包含执行动作的独立规则。nft 工具替换了之前数据包过滤框架中的所有工具。libnftnl 库可用于通过 libmnl 库与 nftables Netlink API 进行底层交互。

要显示规则集更改的效果,使用 nft list ruleset 命令。这些工具将表、链、规则、集合和其他对象添加到 nftables 规则集中,请注意,nftables 规则集操作(如 nft flush ruleset 命令)可能会影响使用以前独立的旧命令安装的规则集。

47.1. 从 iptables 迁移到 nftables

如果您将服务器升级到 RHEL 8,或者防火墙配置仍然使用 iptables 规则,您可以将 iptables 规则迁移到 nftables

47.1.1. 使用 firewalld、nftables 或者 iptables 时

以下是您应该使用以下工具之一的概述:

  • firewalld: 在简单防火墙用例中使用 firewalld 工具。该工具非常容易使用,并涵盖这些场景的典型用例。
  • nftables: 使用 nftables 实用程序设置复杂和性能的关键防火墙,比如为整个网络设置。
  • iptables:Red Hat Enterprise Linux 8 中的 iptables 工具程序使用 nf_tables 内核 API 而不是 legacy 后端。nf_tables API 提供向后兼容性,使用 iptables 命令的脚本仍然可用于 Red Hat Enterprise Linux 8。对于新的防火墙脚本,红帽建议使用 nftables
重要

要避免不同的防火墙服务相互影响,在 RHEL 主机中只有一个服务,并禁用其他服务。

47.1.2. 将 iptables 规则转换为 nftables 规则

Red Hat Enterprise Linux 8 提供 iptables-translateip6tables-translate 工具来将现有 iptablesip6tables 规则转换为对等的 nftables 规则。

请注意,一些扩展可能缺少响应的转换支持。如果存在这种扩展,该工具会输出以 # 符号为前缀的未转换的规则。例如:

# iptables-translate -A INPUT -j CHECKSUM --checksum-fill
nft # -A INPUT -j CHECKSUM --checksum-fill

另外,用户可以使用 iptables-restore-translateip6tables-restore-translate 工具来翻译规则转储。请注意,在此之前,用户可以使用 iptables-save 或者 ip6tables-save 命令打印当前规则的转储。例如:

# iptables-save >/tmp/iptables.dump
# iptables-restore-translate -f /tmp/iptables.dump

# Translated by iptables-restore-translate v1.8.0 on Wed Oct 17 17:00:13 2018
add table ip nat
...

要获得更多信息以及可能的选项和值列表,请使用 iptables-translate --help 命令。

47.1.3. 常用 iftables 和 nftables 命令的比较

以下是常见的 iptablesnftables 命令的比较:

  • 列出所有规则:

    iptablesnftables

    iptables-save

    nft list ruleset

  • 列出特定的表和链:

    iptablesnftables

    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

47.2. 编写和执行 nftables 脚本

nftables 框架提供了一个原生脚本环境,它比使用 shell 脚本维护防火墙规则得到主要优势:执行脚本是原子的(以一个整体运行)。这意味着,系统会应用整个脚本,或者在出现错误时防止执行。这样可保证防火墙始终处于一致状态。

另外,nftables 脚本环境使管理员能够:

  • 添加评论
  • 定义变量
  • 包含其他规则集文件

本节介绍如何使用这些功能,以及创建和执行 nftables 脚本。

当您安装 nftables 软件包时,Red Hat Enterprise Linux 会在 /etc/nftables/ 目录中自动生成 *.nft 脚本。这些脚本包含为不同目的创建表和空链的命令。

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

47.2.2. 运行 nftables 脚本

您可以通过将其传递给 nft 工具或直接执行脚本来运行 nftables 脚本。

先决条件

  • 本节的步骤假设您在文件 /etc/nftables/example_firewall.nft 中保存了 nftables 脚本。

流程

  • 要通过传递给 nft 实用程序来运行 nftables 脚本,请输入:

    # nft -f /etc/nftables/example_firewall.nft
  • 直接运行 nftables 脚本:

    1. 只需要执行一次的步骤:

      1. 确保脚本以以下 rbang 序列开头:

        #!/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 成功执行脚本,在脚本中错误地放置规则、缺失的参数或其他问题都有可能导致防火墙的行为不如预期。

其它资源

  • 有关设置文件所有者的详情,请参考 chown(1) man page。
  • 有关设置文件权限的详情,请查看 chmod(1) man page。
  • 有关使用系统引导载入 nftables 规则的详情,请参考系统引导 时自动载入 nftables 规则

47.2.3. 使用 nftables 脚本中的注释

nftables 脚本环境将 # 字符右边的所有内容都作为注释来解释。

例 47.1. nftables 脚本中的注释

注释可在一行的开始,也可以在命令后:

...
# Flush the rule set
flush ruleset

add table inet example_table  # Create a table
...

47.2.4. 使用 nftables 脚本中的变量

要在 nftables 脚本中定义变量,请使用 define 关键字。您可以在变量中存储单个值和匿名集