配置和管理网络
管理网络接口和高级网络功能
摘要
对红帽文档提供反馈
我们感谢您对我们文档的反馈。让我们了解如何改进它。
通过 Jira 提交反馈(需要帐户)
- 登录到 Jira 网站。
- 在顶部导航栏中点 Create
- 在 Summary 字段中输入描述性标题。
- 在 Description 字段中输入您对改进的建议。包括文档相关部分的链接。
- 点对话框底部的 Create。
第 1 章 实现一致的网络接口命名
udev
设备管理器在 Red Hat Enterprise Linux 中实现一致的设备命名。设备管理器支持不同的命名方案,默认情况下,根据固件、拓扑和位置信息分配固定的名称。
如果没有一致的设备命名,Linux 内核通过组合固定前缀和索引来为网络接口分配名称。当内核初始化网络设备时,索引会增加。例如:eth0
代表启动时探测到的第一个以太网设备。如果您在系统中添加了另一个网络接口控制器,则内核设备名称的分配不再固定,因为重启后,设备可以以不同的顺序初始化。在这种情况下,内核可以以不同的方式命名设备。
要解决这个问题,udev
需分配一致的设备名称。它有以下优点:
- 设备名称在重启后是稳定的。
- 即使添加或删除了硬件,设备名称也会保持不变。
- 因此,有问题的硬件可以被无缝地替换。
- 网络命名是无状态的,不需要显式配置文件。
通常,红帽不支持禁用了一致设备命名的系统。有关例外情况,请参阅红帽知识库解决方案 可以安全地设置 net.ifnames=0。
1.1. udev 设备管理器如何重命名网络接口
要为网络接口实现一致的命名方案,udev
设备管理器按列出的顺序处理以下规则文件:
只在 Dell 系统上:
/usr/lib/udev/rules.d/71-biosdevname.rules
只有安装了
biosdevname
软件包,且规则文件定义了biosdevname
工具根据其命名策略重命名了接口,如果其没有在之前的步骤中被重命名,该文件才存在。注意仅在 Dell 系统上安装和使用
biosdevname
。/usr/lib/udev/rules.d/75-net-description.rules
此文件定义了
udev
如何检查网络接口,并在udev
-internal 变量中设置属性。然后,这些变量由/usr/lib/udev/rules.d/80-net-setup-link.rules
文件在下一步中进行处理。其中一些属性可以未定义。/usr/lib/udev/rules.d/80-net-setup-link.rules
此文件调用
udev
服务的net_setup_link
builtin,并且udev
根据/usr/lib/systemd/network/99-default.link
文件中NamePolicy
参数中策略的顺序重命名接口。详情请查看 网络接口命名策略。如果没有应用任何策略,则
udev
不会重命名接口。
1.2. 网络接口命名策略
默认情况下,udev
设备管理器使用 /usr/lib/systemd/network/99-default.link
文件来确定在重命名接口时要应用哪些设备命名策略。此文件中的 NamePolicy
参数定义 udev
使用哪些策略以及使用哪个顺序:
NamePolicy=keep kernel database onboard slot path
NamePolicy=keep kernel database onboard slot path
根据哪个策略与 NamePolicy
参数指定的首先匹配,下表描述了 udev
的不同操作:
policy | 描述 | 名称示例 |
---|---|---|
keep |
如果设备在用户空间中已有分配的名称,则 | |
kernel |
如果内核表示设备名称是可预测的,则 |
|
database |
此策略根据 |
|
onboard | 设备名称包含固件或者 BIOS 提供的索引号,用于板上的设备。 |
|
slot | 设备名称包含固件或 BIOS 提供的 PCI Express (PCIe)热插拔插槽索引号。 |
|
path | 设备名称包含硬件连接器的物理位置。 |
|
mac | 设备名称包含 MAC 地址。默认情况下,Red Hat Enterprise Linux 不使用此策略,但管理员可以启用它。 |
|
1.3. 网络接口命名方案
udev
设备管理器使用设备驱动程序提供的某些稳定的接口属性,来生成一致的设备名称。
如果新的 udev
版本更改了服务如何为某些接口创建名称的方式,红帽会添加一个新的方案版本,并在您系统上的 systemd.net-naming-scheme (7)
手册页中记录详细信息。默认情况下,Red Hat Enterprise Linux (RHEL) 10 使用 rhel-10.0
命名方案,即使您安装或升级到更新的 RHEL 次版本。
在 RHEL 10 中,您还可以使用所有 rhel-8You
和 rhel-9opg
命名方案。
如果要使用非默认方案,可以 切换网络接口命名方案。
有关不同设备类型和平台的命名方案的详情,请查看您系统上的 systemd.net-naming-scheme (7)
手册页。
1.4. 切换到不同的网络接口命名方案
默认情况下,Red Hat Enterprise Linux (RHEL) 10 使用 rhel-10.0
命名方案,即使您安装或升级到更新的 RHEL 次版本。虽然默认的命名方案适合大多数情况,但可能有切换到不同的方案版本的理由,例如:
- 如果其向接口名称添加了额外的属性(如插槽号),则新方案可以帮助更好地识别设备。
-
新方案可以防止
udev
回退到内核分配的设备名称(eth*
)。如果驱动程序没有为两个或多个接口提供足够的唯一属性,来为它们生成唯一名称,则会发生这种情况。
先决条件
- 您可以访问服务器的控制台。
步骤
列出网络接口:
ip link show
# ip link show 2: eno1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP mode DEFAULT group default qlen 1000 link/ether 00:00:5e:00:53:1a brd ff:ff:ff:ff:ff:ff ...
Copy to Clipboard Copied! 记录接口的 MAC 地址。
可选:显示网络接口的
ID_NET_NAMING_SCHEME
属性,来识别 RHEL 当前使用的命名方案:udevadm info --query=property --property=ID_NET_NAMING_SCHEME /sys/class/net/eno1
# udevadm info --query=property --property=ID_NET_NAMING_SCHEME /sys/class/net/eno1 ID_NET_NAMING_SCHEME=rhel-10.0
Copy to Clipboard Copied! 请注意,属性在
lo
loopback 设备上不可用。将
net.naming-scheme=<scheme>
选项附加到所有安装的内核的命令行中,例如:grubby --update-kernel=ALL --args=net.naming-scheme=rhel-10.1
# grubby --update-kernel=ALL --args=net.naming-scheme=rhel-10.1
Copy to Clipboard Copied! 重启系统。
reboot
# reboot
Copy to Clipboard Copied! 根据您记录的 MAC 地址,识别因不同的命名方案而更改的网络接口的新名称:
ip link show
# ip link show 2: eno1np0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP mode DEFAULT group default qlen 1000 link/ether 00:00:5e:00:53:1a brd ff:ff:ff:ff:ff:ff ...
Copy to Clipboard Copied! 切换方案后,
udev
将具有指定 MAC 地址eno1np0
的设备命名为 eno1,而之前被命名为eno1
。确定哪个 NetworkManager 连接配置文件使用之前名称的接口:
nmcli -f device,name connection show
# nmcli -f device,name connection show DEVICE NAME eno1 example_profile ...
Copy to Clipboard Copied! 将连接配置文件中的
connection.interface-name
属性设置为新接口名称:nmcli connection modify example_profile connection.interface-name "eno1np0"
# nmcli connection modify example_profile connection.interface-name "eno1np0"
Copy to Clipboard Copied! 重新激活连接配置文件:
nmcli connection up example_profile
# nmcli connection up example_profile
Copy to Clipboard Copied!
验证
通过显示网络接口的
ID_NET_NAMING_SCHEME
属性来识别 RHEL 现在使用的命名方案:udevadm info --query=property --property=ID_NET_NAMING_SCHEME /sys/class/net/eno1np0
# udevadm info --query=property --property=ID_NET_NAMING_SCHEME /sys/class/net/eno1np0 ID_NET_NAMING_SCHEME=_rhel-10.1
Copy to Clipboard Copied!
1.5. 在安装过程中为以太网接口自定义前缀
如果您不想将默认 device-naming 策略用于以太网接口,您可以在 Red Hat Enterprise Linux (RHEL)安装过程中设置一个自定义设备前缀。
只有您在 RHEL 安装过程中设置了前缀,红帽才支持带有自定义以太网前缀的系统。不支持在已部署的系统上使用 prefixdevname
工具。
如果您在安装过程中设置了设备前缀,则 udev
服务在安装后对以太网接口使用 <prefix><index>
格式。例如,如果您设置了前缀 net
,服务会将名称 net0
、net1
等分配给以太网接口。
udev
服务将索引附加到自定义前缀,并保留已知以太网接口的索引值。如果您添加一个接口,udev
会为新接口分配一个比之前分配的索引值大的索引值。
先决条件
- 前缀由 ASCII 字符组成。
- 前缀是一个字母数字字符串。
- 前缀少于 16 个字符。
-
前缀不会与任何其他熟知的网络接口前缀冲突,如
eth
、eno
、ens
和em
。
步骤
- 引导 Red Hat Enterprise Linux 安装介质。
在引导管理器中,请按照以下步骤操作:
- 选择 Install Red Hat Enterprise Linux < version> 条目。
- 按 Tab 编辑条目。
-
将
net.ifnames.prefix=<prefix>
追加到在内核选项中。 - 按 Enter 启动安装程序。
- 安装 Red Hat Enterprise Linux。
验证
要验证接口名称,请显示网络接口:
ip link show
# ip link show ... 2: net0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP mode DEFAULT group default qlen 1000 link/ether 00:00:5e:00:53:1a brd ff:ff:ff:ff:ff:ff ...
Copy to Clipboard Copied!
1.6. 使用 udev
规则配置用户定义的网络接口名称
您可以使用 udev
规则来实现反映您机构要求的自定义网络接口名称。
流程
识别您要重命名的网络接口:
ip link show
# ip link show ... enp1s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP mode DEFAULT group default qlen 1000 link/ether 00:00:5e:00:53:1a brd ff:ff:ff:ff:ff:ff ...
Copy to Clipboard Copied! 记录接口的 MAC 地址。
显示接口的设备类型 ID:
cat /sys/class/net/enp1s0/type 1
# cat /sys/class/net/enp1s0/type 1
Copy to Clipboard Copied! 创建
/etc/udev/rules.d/70-persistent-net.rules
文件,并为您要重命名的每个接口添加一个规则:SUBSYSTEM=="net",ACTION=="add",ATTR{address}=="<MAC_address>",ATTR{type}=="<device_type_id>",NAME="<new_interface_name>"
SUBSYSTEM=="net",ACTION=="add",ATTR{address}=="<MAC_address>",ATTR{type}=="<device_type_id>",NAME="<new_interface_name>"
Copy to Clipboard Copied! 重要如果您在引导过程中需要一致的设备名称,则只使用
70-persistent-net.rules
作为文件名。如果您重新生成 RAM 磁盘镜像,则dracut
工具会在initrd
镜像中添加具有此名称的文件。例如,使用以下规则将 MAC 地址为
00:00:5e:00:53:1a
的接口重命名为provider0
:SUBSYSTEM=="net",ACTION=="add",ATTR{address}=="00:00:5e:00:53:1a",ATTR{type}=="1",NAME="provider0"
SUBSYSTEM=="net",ACTION=="add",ATTR{address}=="00:00:5e:00:53:1a",ATTR{type}=="1",NAME="provider0"
Copy to Clipboard Copied! 可选:重新生成
initrd
RAM 磁盘镜像:dracut -f
# dracut -f
Copy to Clipboard Copied! 只有在 RAM 磁盘中需要网络功能时才需要这一步。例如,如果 root 文件系统存储在网络设备上,如 iSCSI,则是这种情况。
确定哪个 NetworkManager 连接配置文件使用您要重命名的接口:
nmcli -f device,name connection show
# nmcli -f device,name connection show DEVICE NAME enp1s0 example_profile ...
Copy to Clipboard Copied! 在连接配置文件中取消
connection.interface-name
属性的设置:nmcli connection modify example_profile connection.interface-name ""
# nmcli connection modify example_profile connection.interface-name ""
Copy to Clipboard Copied! 临时配置连接配置文件,以匹配新的和以前的接口名称:
nmcli connection modify example_profile match.interface-name "provider0 enp1s0"
# nmcli connection modify example_profile match.interface-name "provider0 enp1s0"
Copy to Clipboard Copied! 重启系统:
reboot
# reboot
Copy to Clipboard Copied! 验证具有您在链接文件中指定的 MAC 地址的设备已重命名为
provider0
:ip link show
# ip link show provider0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP mode DEFAULT group default qlen 1000 link/ether 00:00:5e:00:53:1a brd ff:ff:ff:ff:ff:ff ...
Copy to Clipboard Copied! 将连接配置文件配置为仅匹配新接口名称:
nmcli connection modify example_profile match.interface-name "provider0"
# nmcli connection modify example_profile match.interface-name "provider0"
Copy to Clipboard Copied! 现在,您已从连接配置文件中删除了旧接口名称。
重新激活连接配置文件:
nmcli connection up example_profile
# nmcli connection up example_profile
Copy to Clipboard Copied!
1.7. 使用 systemd 链接文件配置用户定义的网络接口名称
您可以使用 systemd
链接文件来实现反映您机构要求的自定义网络接口名称。
先决条件
- NetworkManager 不管理这个接口。
流程
识别您要重命名的网络接口:
ip link show
# ip link show ... enp1s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP mode DEFAULT group default qlen 1000 link/ether 00:00:5e:00:53:1a brd ff:ff:ff:ff:ff:ff ...
Copy to Clipboard Copied! 记录接口的 MAC 地址。
如果不存在,请创建
/etc/systemd/network/
目录:mkdir -p /etc/systemd/network/
# mkdir -p /etc/systemd/network/
Copy to Clipboard Copied! 对于您要重命名的每个接口,请在
/etc/systemd/network/
目录中,使用如下内容创建一个70-*.link
文件:[Match] MACAddress=<MAC_address> [Link] Name=<new_interface_name>
[Match] MACAddress=<MAC_address> [Link] Name=<new_interface_name>
Copy to Clipboard Copied! 重要使用具有
70-
前缀的文件名,使文件名与基于udev
规则的解决方案一致。例如,使用以下内容创建
/etc/systemd/network/70-provider0.link
文件,将 MAC 地址为00:00:5e:00:53:1a
的接口重命名为provider0
:[Match] MACAddress=00:00:5e:00:53:1a [Link] Name=provider0
[Match] MACAddress=00:00:5e:00:53:1a [Link] Name=provider0
Copy to Clipboard Copied! 可选:重新生成
initrd
RAM 磁盘镜像:dracut -f
# dracut -f
Copy to Clipboard Copied! 只有在 RAM 磁盘中需要网络功能时才需要这一步。例如,如果 root 文件系统存储在网络设备上,如 iSCSI,则是这种情况。
确定哪个 NetworkManager 连接配置文件使用您要重命名的接口:
nmcli -f device,name connection show
# nmcli -f device,name connection show DEVICE NAME enp1s0 example_profile ...
Copy to Clipboard Copied! 在连接配置文件中取消
connection.interface-name
属性的设置:nmcli connection modify example_profile connection.interface-name ""
# nmcli connection modify example_profile connection.interface-name ""
Copy to Clipboard Copied! 临时配置连接配置文件,以匹配新的和以前的接口名称:
nmcli connection modify example_profile match.interface-name "provider0 enp1s0"
# nmcli connection modify example_profile match.interface-name "provider0 enp1s0"
Copy to Clipboard Copied! 重启系统:
reboot
# reboot
Copy to Clipboard Copied! 验证具有您在链接文件中指定的 MAC 地址的设备已重命名为
provider0
:ip link show
# ip link show provider0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP mode DEFAULT group default qlen 1000 link/ether 00:00:5e:00:53:1a brd ff:ff:ff:ff:ff:ff ...
Copy to Clipboard Copied! 将连接配置文件配置为仅匹配新接口名称:
nmcli connection modify example_profile match.interface-name "provider0"
# nmcli connection modify example_profile match.interface-name "provider0"
Copy to Clipboard Copied! 现在,您已从连接配置文件中删除了旧接口名称。
重新激活连接配置文件。
nmcli connection up example_profile
# nmcli connection up example_profile
Copy to Clipboard Copied!
1.8. 使用 systemd 链接文件将替代名称分配给网络接口
通过替代接口命名,内核可以将额外名称分配给网络接口。您可以使用这些替代名称,方式与需要网络接口名称的命令中的普通接口名称相同。
先决条件
- 您必须对替代名称使用 ASCII 字符。
- 备用名称必须小于 128 个字符。
流程
显示网络接口名称及其 MAC 地址:
ip link show
# ip link show ... enp1s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP mode DEFAULT group default qlen 1000 link/ether 00:00:5e:00:53:1a brd ff:ff:ff:ff:ff:ff ...
Copy to Clipboard Copied! 记录您要为其分配替代名称的接口的 MAC 地址。
如果不存在,请创建
/etc/systemd/network/
目录:mkdir -p /etc/systemd/network/
# mkdir -p /etc/systemd/network/
Copy to Clipboard Copied! 对于必须有备用名称的每个接口,在
/etc/systemd/network/
目录中创建一个具有唯一名称和.link
后缀的/usr/lib/systemd/network/99-default.link
文件的副本,例如:cp /usr/lib/systemd/network/99-default.link /etc/systemd/network/98-lan.link
# cp /usr/lib/systemd/network/99-default.link /etc/systemd/network/98-lan.link
Copy to Clipboard Copied! 修改您在上一步中创建的文件。按如下所示重写
[Match]
部分,并将AlternativeName
条目附加到[Link]
部分:[Match] MACAddress=<MAC_address> [Link] ... AlternativeName=<alternative_interface_name_1> AlternativeName=<alternative_interface_name_2> AlternativeName=<alternative_interface_name_n>
[Match] MACAddress=<MAC_address> [Link] ... AlternativeName=<alternative_interface_name_1> AlternativeName=<alternative_interface_name_2> AlternativeName=<alternative_interface_name_n>
Copy to Clipboard Copied! 例如,使用以下内容创建
/etc/systemd/network/70-altname.link
文件,来将provider
作为替代名称分配给 MAC 地址为00:00:5e:00:53:1a
的接口:[Match] MACAddress=00:00:5e:00:53:1a [Link] NamePolicy=keep kernel database onboard slot path AlternativeNamesPolicy=database onboard slot path mac MACAddressPolicy=none AlternativeName=provider
[Match] MACAddress=00:00:5e:00:53:1a [Link] NamePolicy=keep kernel database onboard slot path AlternativeNamesPolicy=database onboard slot path mac MACAddressPolicy=none AlternativeName=provider
Copy to Clipboard Copied! 重新生成
initrd
RAM 磁盘镜像:dracut -f
# dracut -f
Copy to Clipboard Copied! 重启系统:
reboot
# reboot
Copy to Clipboard Copied!
验证
使用替代接口名称。例如,显示具有替代名称
provider
的设备的 IP 地址设置:ip address show provider
# ip address show provider 2: enp1s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000 link/ether 00:00:5e:00:53:1a brd ff:ff:ff:ff:ff:ff altname provider ...
Copy to Clipboard Copied!
第 2 章 配置以太网连接
NetworkManager 为主机上安装的每个以太网适配器创建一个连接配置文件。默认情况下,此配置文件将 DHCP 用于 IPv4 和 IPv6 连接。修改此自动创建的配置文件,或在以下情况下添加新配置文件:
- 网络需要自定义设置,如静态 IP 地址配置。
- 您需要多个配置文件,因为主机在不同的网络中漫游。
Red Hat Enterprise Linux 为管理员提供不同的选项来配置以太网连接。例如:
-
在命令行中使用
nmcli
配置连接。 -
使用
nmtui
在基于文本的用户界面中配置连接。 - 使用 GNOME Settings 菜单在图形界面中配置连接。
-
使用
nmstatectl
通过 Nmstate API 配置连接。 - 使用 RHEL 系统角色在一个或多个主机上自动配置连接。
如果要对运行在 Microsoft Azure 云中的主机手动配置以太网连接,请禁用 cloud-init
服务或将其配置为忽略从云环境检索到的网络设置。否则,cloud-init
将在下次重启时覆盖您手动配置的网络设置。
2.1. 使用 nmcli
配置以太网连接
如果您通过以太网将主机连接到网络,您可以使用 nmcli
工具在命令行上管理连接的设置。
先决条件
- 服务器配置中存在物理或虚拟以太网网络接口控制器(NIC)。
步骤
列出 NetworkManager 连接配置文件:
nmcli connection show
# nmcli connection show NAME UUID TYPE DEVICE Wired connection 1 a5eb6490-cc20-3668-81f8-0314a27f3f75 ethernet enp1s0
Copy to Clipboard Copied! 默认情况下,NetworkManager 为主机中的每个 NIC 创建一个配置文件。如果您计划仅将这个 NIC 连接到特定的网络,请调整自动创建的配置文件。如果您计划使用不同的设置将这个 NIC 连接到网络,请为每个网络创建单独的配置文件。
如果要创建额外的连接配置文件,请输入:
nmcli connection add con-name <connection-name> ifname <device-name> type ethernet
# nmcli connection add con-name <connection-name> ifname <device-name> type ethernet
Copy to Clipboard Copied! 跳过此步骤来修改现有的配置文件。
可选:重命名连接配置文件:
nmcli connection modify "Wired connection 1" connection.id "Internal-LAN"
# nmcli connection modify "Wired connection 1" connection.id "Internal-LAN"
Copy to Clipboard Copied! 在有多个配置文件的主机上,有意义的名称可以更容易识别配置文件的用途。
显示连接配置文件的当前设置:
nmcli connection show Internal-LAN
# nmcli connection show Internal-LAN ... connection.interface-name: enp1s0 connection.autoconnect: yes ipv4.method: auto ipv6.method: auto ...
Copy to Clipboard Copied! 配置 IPv4 设置:
要使用 DHCP,请输入:
nmcli connection modify Internal-LAN ipv4.method auto
# nmcli connection modify Internal-LAN ipv4.method auto
Copy to Clipboard Copied! 如果
ipv4.method
已设置为auto
(默认),请跳过这一步。要设置静态 IPv4 地址、网络掩码、默认网关、DNS 服务器和搜索域,请输入:
nmcli connection modify Internal-LAN ipv4.method manual ipv4.addresses 192.0.2.1/24 ipv4.gateway 192.0.2.254 ipv4.dns 192.0.2.200 ipv4.dns-search example.com
# nmcli connection modify Internal-LAN ipv4.method manual ipv4.addresses 192.0.2.1/24 ipv4.gateway 192.0.2.254 ipv4.dns 192.0.2.200 ipv4.dns-search example.com
Copy to Clipboard Copied!
配置 IPv6 设置:
要使用无状态地址自动配置(SLAAC),请输入:
nmcli connection modify Internal-LAN ipv6.method auto
# nmcli connection modify Internal-LAN ipv6.method auto
Copy to Clipboard Copied! 如果
ipv6.method
已设置为auto
(默认),请跳过这一步。要设置静态 IPv6 地址、网络掩码、默认网关、DNS 服务器和搜索域,请输入:
nmcli connection modify Internal-LAN ipv6.method manual ipv6.addresses 2001:db8:1::fffe/64 ipv6.gateway 2001:db8:1::fffe ipv6.dns 2001:db8:1::ffbb ipv6.dns-search example.com
# nmcli connection modify Internal-LAN ipv6.method manual ipv6.addresses 2001:db8:1::fffe/64 ipv6.gateway 2001:db8:1::fffe ipv6.dns 2001:db8:1::ffbb ipv6.dns-search example.com
Copy to Clipboard Copied!
要在配置文件中自定义其他设置,请使用以下命令:
nmcli connection modify <connection-name> <setting> <value>
# nmcli connection modify <connection-name> <setting> <value>
Copy to Clipboard Copied! 用空格或分号将值括起来。
有关您可以修改哪些设置的详情,请查看系统中的
nm-settings (5)
手册页。激活配置文件:
nmcli connection up Internal-LAN
# nmcli connection up Internal-LAN
Copy to Clipboard Copied!
验证
显示 NIC 的 IP 设置:
ip address show enp1s0
# ip address show enp1s0 2: enp1s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000 link/ether 52:54:00:17:b8:b6 brd ff:ff:ff:ff:ff:ff inet 192.0.2.1/24 brd 192.0.2.255 scope global noprefixroute enp1s0 valid_lft forever preferred_lft forever inet6 2001:db8:1::fffe/64 scope global noprefixroute valid_lft forever preferred_lft forever
Copy to Clipboard Copied! 显示 IPv4 默认网关:
ip route show default
# ip route show default default via 192.0.2.254 dev enp1s0 proto static metric 102
Copy to Clipboard Copied! 显示 IPv6 默认网关:
ip -6 route show default
# ip -6 route show default default via 2001:db8:1::fffe dev enp1s0 proto static metric 102 pref medium
Copy to Clipboard Copied! 显示 DNS 设置:
cat /etc/resolv.conf search example.com nameserver 192.0.2.200 nameserver 2001:db8:1::ffbb
# cat /etc/resolv.conf search example.com nameserver 192.0.2.200 nameserver 2001:db8:1::ffbb
Copy to Clipboard Copied! 如果多个连接配置文件同时处于活跃状态,则
nameserver
条目的顺序取决于这些配置文件中的 DNS 优先级值和连接类型。使用
ping
工具验证这个主机是否可以向其他主机发送数据包:ping <host-name-or-IP-address>
# ping <host-name-or-IP-address>
Copy to Clipboard Copied!
故障排除
- 验证网线是否插入到主机和交换机。
- 检查链路失败是否只存在于此主机上,或者连接到同一交换机的其它主机上。
- 验证网络电缆和网络接口是否如预期工作。执行硬件诊断步骤,并替换缺陷的网线和网络接口卡。
- 如果磁盘中的配置与设备中的配置不匹配,则启动或重启 NetworkManager 会创建一个代表该设备的配置的内存连接。有关详情以及如何避免此问题,请参阅红帽知识库解决方案 NetworkManager 在重启 NetworkManager 服务后复制连接。
2.2. 使用 nmtui
配置以太网连接
如果通过以太网将主机连接到网络,您可以使用 nmtui
应用程序在基于文本的用户界面中管理连接的设置。使用 nmtui
创建新配置文件,并在没有图形界面的主机上更新现有配置文件。
在 nmtui
中:
- 使用光标键导航。
- 选择一个按钮并按 Enter 键。
- 使用 空格 选择和清除复选框。
- 要返回上一个屏幕,请使用 ESC。
先决条件
- 服务器配置中存在物理或虚拟以太网网络接口控制器(NIC)。
流程
如果您不知道连接中使用的网络设备名称,显示可用的设备:
nmcli device status
# nmcli device status DEVICE TYPE STATE CONNECTION enp1s0 ethernet unavailable -- ...
Copy to Clipboard Copied! 启动
nmtui
:nmtui
# nmtui
Copy to Clipboard Copied! - 选择 Edit a connection,然后按 Enter。
选择是否添加新连接配置文件或修改现有连接配置文件:
要创建新配置文件:
- 按 Add。
- 从网络类型列表中选择 Ethernet,然后按 Enter 。
- 要修改现有的配置文件,请从列表中选择配置文件,然后按 Enter。
可选:更新连接配置文件的名称。
在有多个配置文件的主机上,有意义的名称可以更容易识别配置文件的用途。
- 如果创建新连接配置文件,清在 Device 字段中输入网络设备名称。
根据您的环境,相应地在
IPv4 configuration
和IPv6 configuration
区中配置 IP 地址。为此,请按这些区域旁边的按钮,并选择:- Disabled,如果此连接不需要 IP 地址。
- Automatic,如果 DHCP 服务器动态为这个 NIC 分配一个 IP 地址。
Manual,如果网络需要静态 IP 地址设置。在这种情况下,您必须填写更多字段:
- 在您要配置的协议旁边按 Show 以显示其他字段。
按 Addresses 旁边的 Add,并输入无类别域间路由(CIDR)格式的 IP 地址和子网掩码。
如果没有指定子网掩码,NetworkManager 会为 IPv4 地址设置
/32
子网掩码,并为 IPv6 地址设置/64
。- 输入默认网关的地址。
- 按 DNS servers 旁边的 Add,并输入 DNS 服务器地址。
- 按 Search domains 旁边的 Add,并输入 DNS 搜索域。
图 2.1. 使用静态 IP 地址设置的以太网连接示例
- 按 OK 创建并自动激活新连接。
- 按 Back 返回到主菜单。
-
选择 Quit,然后按 Enter 键关闭
nmtui
应用程序。
验证
显示 NIC 的 IP 设置:
ip address show enp1s0
# ip address show enp1s0 2: enp1s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000 link/ether 52:54:00:17:b8:b6 brd ff:ff:ff:ff:ff:ff inet 192.0.2.1/24 brd 192.0.2.255 scope global noprefixroute enp1s0 valid_lft forever preferred_lft forever inet6 2001:db8:1::fffe/64 scope global noprefixroute valid_lft forever preferred_lft forever
Copy to Clipboard Copied! 显示 IPv4 默认网关:
ip route show default
# ip route show default default via 192.0.2.254 dev enp1s0 proto static metric 102
Copy to Clipboard Copied! 显示 IPv6 默认网关:
ip -6 route show default
# ip -6 route show default default via 2001:db8:1::fffe dev enp1s0 proto static metric 102 pref medium
Copy to Clipboard Copied! 显示 DNS 设置:
cat /etc/resolv.conf search example.com nameserver 192.0.2.200 nameserver 2001:db8:1::ffbb
# cat /etc/resolv.conf search example.com nameserver 192.0.2.200 nameserver 2001:db8:1::ffbb
Copy to Clipboard Copied! 如果多个连接配置文件同时处于活跃状态,则
nameserver
条目的顺序取决于这些配置文件中的 DNS 优先级值和连接类型。使用
ping
工具验证这个主机是否可以向其他主机发送数据包:ping <host-name-or-IP-address>
# ping <host-name-or-IP-address>
Copy to Clipboard Copied!
故障排除
- 验证网线是否插入到主机和交换机。
- 检查链路失败是否只存在于此主机上,或者连接到同一交换机的其它主机上。
- 验证网络电缆和网络接口是否如预期工作。执行硬件诊断步骤,并替换缺陷的网线和网络接口卡。
- 如果磁盘中的配置与设备中的配置不匹配,则启动或重启 NetworkManager 会创建一个代表该设备的配置的内存连接。有关详情以及如何避免此问题,请参阅红帽知识库解决方案 NetworkManager 在重启 NetworkManager 服务后复制连接。
2.3. 使用控制中心配置以太网连接
如果您通过以太网将主机连接到网络,您可以使用 GNOME Settings 菜单,通过图形界面管理连接的设置。
请注意,control-center
不支持与 nmcli
工具相同的配置选项。
先决条件
- 服务器配置中存在物理或虚拟以太网网络接口控制器(NIC)。
- 已安装了 GNOME。
步骤
-
按 Super 键,输入
Settings
,然后按 Enter 键。 - 在左侧导航中选择 Network。
选择是否添加新连接配置文件或修改现有连接配置文件:
- 要创建新配置文件,请单击 Ethernet 条目旁边的 按钮。
- 要修改现有配置文件,请点击配置文件条目旁的齿轮图标。
可选:在 Identity 选项卡中,更新连接配置文件的名称。
在有多个配置文件的主机上,有意义的名称可以更容易识别配置文件的用途。
根据您的环境,相应地在 IPv4 和 IPv6 标签页中配置 IP 地址设置:
-
要使用 DHCP 或 IPv6 无状态地址自动配置(SLAAC),请选择
Automatic (DHCP)
作为方法(默认)。 要设置静态 IP 地址、网络掩码、默认网关、DNS 服务器和搜索域,请选择
Manual
作为方法,并在标签页中填写字段:
-
要使用 DHCP 或 IPv6 无状态地址自动配置(SLAAC),请选择
根据您是否添加或修改连接配置文件,点
或 按钮保存连接。GNOME
control-center
会自动激活连接。
验证
显示 NIC 的 IP 设置:
ip address show enp1s0
# ip address show enp1s0 2: enp1s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000 link/ether 52:54:00:17:b8:b6 brd ff:ff:ff:ff:ff:ff inet 192.0.2.1/24 brd 192.0.2.255 scope global noprefixroute enp1s0 valid_lft forever preferred_lft forever inet6 2001:db8:1::fffe/64 scope global noprefixroute valid_lft forever preferred_lft forever
Copy to Clipboard Copied! 显示 IPv4 默认网关:
ip route show default
# ip route show default default via 192.0.2.254 dev enp1s0 proto static metric 102
Copy to Clipboard Copied! 显示 IPv6 默认网关:
ip -6 route show default
# ip -6 route show default default via 2001:db8:1::fffe dev enp1s0 proto static metric 102 pref medium
Copy to Clipboard Copied! 显示 DNS 设置:
cat /etc/resolv.conf search example.com nameserver 192.0.2.200 nameserver 2001:db8:1::ffbb
# cat /etc/resolv.conf search example.com nameserver 192.0.2.200 nameserver 2001:db8:1::ffbb
Copy to Clipboard Copied! 如果多个连接配置文件同时处于活跃状态,则
nameserver
条目的顺序取决于这些配置文件中的 DNS 优先级值和连接类型。使用
ping
工具验证这个主机是否可以向其他主机发送数据包:ping <host-name-or-IP-address>
# ping <host-name-or-IP-address>
Copy to Clipboard Copied!
故障排除步骤
- 验证网线是否插入到主机和交换机。
- 检查链路失败是否只存在于此主机上,或者连接到同一交换机的其它主机上。
- 验证网络电缆和网络接口是否如预期工作。执行硬件诊断步骤,并替换缺陷的网线和网络接口卡。
- 如果磁盘中的配置与设备中的配置不匹配,则启动或重启 NetworkManager 会创建一个代表该设备的配置的内存连接。有关详情以及如何避免此问题,请参阅红帽知识库解决方案 NetworkManager 在重启 NetworkManager 服务后复制连接。
2.4. 使用带有接口名称的 nmstatectl
使用静态 IP 地址配置以太网连接
使用 nmstatectl
工具通过 Nmstate API 配置以太网连接。Nmstate API 确保设置配置后结果与配置文件匹配。如果有任何失败,nmstatectl
会自动回滚更改以避免系统处于不正确的状态。
您可以使用 Nmstate 配置带有静态 IP 地址、网关和 DNS 设置的以太网连接,并将它们分配给指定的接口名称。
先决条件
- 服务器配置中存在物理或虚拟以太网网络接口控制器(NIC)。
-
nmstate
软件包已安装。
步骤
创建包含以下内容的 YAML 文件,如
~/create-ethernet-profile.yml
:--- interfaces: - name: enp1s0 type: ethernet state: up ipv4: enabled: true address: - ip: 192.0.2.1 prefix-length: 24 dhcp: false ipv6: enabled: true address: - ip: 2001:db8:1::1 prefix-length: 64 autoconf: false dhcp: false routes: config: - destination: 0.0.0.0/0 next-hop-address: 192.0.2.254 next-hop-interface: enp1s0 - destination: ::/0 next-hop-address: 2001:db8:1::fffe next-hop-interface: enp1s0 dns-resolver: config: search: - example.com server: - 192.0.2.200 - 2001:db8:1::ffbb
--- interfaces: - name: enp1s0 type: ethernet state: up ipv4: enabled: true address: - ip: 192.0.2.1 prefix-length: 24 dhcp: false ipv6: enabled: true address: - ip: 2001:db8:1::1 prefix-length: 64 autoconf: false dhcp: false routes: config: - destination: 0.0.0.0/0 next-hop-address: 192.0.2.254 next-hop-interface: enp1s0 - destination: ::/0 next-hop-address: 2001:db8:1::fffe next-hop-interface: enp1s0 dns-resolver: config: search: - example.com server: - 192.0.2.200 - 2001:db8:1::ffbb
Copy to Clipboard Copied! 这些设置使用以下设置为
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
-
静态 IPv4 地址 -
可选:您可以在
interfaces
属性中定义identifier: mac-address
和mac-address: <mac_address>
属性,来通过其 MAC 地址而不是其名称来识别网络接口卡,例如:--- interfaces: - name: <profile_name> type: ethernet identifier: mac-address mac-address: <mac_address> ...
--- interfaces: - name: <profile_name> type: ethernet identifier: mac-address mac-address: <mac_address> ...
Copy to Clipboard Copied! 将设置应用到系统:
nmstatectl apply ~/create-ethernet-profile.yml
# nmstatectl apply ~/create-ethernet-profile.yml
Copy to Clipboard Copied!
验证
以 YAML 格式显示当前状态:
nmstatectl show enp1s0
# nmstatectl show enp1s0
Copy to Clipboard Copied! 显示 NIC 的 IP 设置:
ip address show enp1s0
# ip address show enp1s0 2: enp1s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000 link/ether 52:54:00:17:b8:b6 brd ff:ff:ff:ff:ff:ff inet 192.0.2.1/24 brd 192.0.2.255 scope global noprefixroute enp1s0 valid_lft forever preferred_lft forever inet6 2001:db8:1::fffe/64 scope global noprefixroute valid_lft forever preferred_lft forever
Copy to Clipboard Copied! 显示 IPv4 默认网关:
ip route show default
# ip route show default default via 192.0.2.254 dev enp1s0 proto static metric 102
Copy to Clipboard Copied! 显示 IPv6 默认网关:
ip -6 route show default
# ip -6 route show default default via 2001:db8:1::fffe dev enp1s0 proto static metric 102 pref medium
Copy to Clipboard Copied! 显示 DNS 设置:
cat /etc/resolv.conf search example.com nameserver 192.0.2.200 nameserver 2001:db8:1::ffbb
# cat /etc/resolv.conf search example.com nameserver 192.0.2.200 nameserver 2001:db8:1::ffbb
Copy to Clipboard Copied! 如果多个连接配置文件同时处于活跃状态,则
nameserver
条目的顺序取决于这些配置文件中的 DNS 优先级值和连接类型。使用
ping
工具验证这个主机是否可以向其他主机发送数据包:ping <host-name-or-IP-address>
# ping <host-name-or-IP-address>
Copy to Clipboard Copied!
2.5. 使用网络
RHEL 系统角色和接口名称,使用静态 IP 地址配置以太网连接
要将 Red Hat Enterprise Linux 主机连接到以太网网络,请为网络设备创建一个 NetworkManager 连接配置文件。通过使用 Ansible 和 network
RHEL 系统角色,您可以自动化此过程,并在 playbook 中定义的主机上远程配置连接配置文件。
您可以使用 network
RHEL 系统角色配置具有静态 IP 地址、网关和 DNS 的以太网连接,并将它们分配给指定的接口名称。
通常,管理员希望重复使用 playbook,且不会为 Ansible 应该为其分配静态 IP 地址的每个主机维护单独的 playbook。在本例中,您可以在 playbook 中使用变量,并在清单中维护设置。因此,您只需要一个 playbook 来动态地将单个设置分配给多个主机。
先决条件
- 您已准备好控制节点和受管节点
- 以可在受管主机上运行 playbook 的用户登录到控制节点。
-
您用于连接到受管节点的帐户对它们具有
sudo
权限。 - 物理或者虚拟以太网设备在服务器配置中存在。
- 受管节点使用 NetworkManager 配置网络。
流程
编辑
~/inventory
文件,并将特定于主机的设置附加到主机条目中:managed-node-01.example.com interface=enp1s0 ip_v4=192.0.2.1/24 ip_v6=2001:db8:1::1/64 gateway_v4=192.0.2.254 gateway_v6=2001:db8:1::fffe managed-node-02.example.com interface=enp1s0 ip_v4=192.0.2.2/24 ip_v6=2001:db8:1::2/64 gateway_v4=192.0.2.254 gateway_v6=2001:db8:1::fffe
managed-node-01.example.com interface=enp1s0 ip_v4=192.0.2.1/24 ip_v6=2001:db8:1::1/64 gateway_v4=192.0.2.254 gateway_v6=2001:db8:1::fffe managed-node-02.example.com interface=enp1s0 ip_v4=192.0.2.2/24 ip_v6=2001:db8:1::2/64 gateway_v4=192.0.2.254 gateway_v6=2001:db8:1::fffe
Copy to Clipboard Copied! 创建一个包含以下内容的 playbook 文件,如
~/playbook.yml
:--- - name: Configure the network hosts: managed-node-01.example.com,managed-node-02.example.com tasks: - name: Ethernet connection profile with static IP address settings ansible.builtin.include_role: name: redhat.rhel_system_roles.network vars: network_connections: - name: "{{ interface }}" interface_name: "{{ interface }}" type: ethernet autoconnect: yes ip: address: - "{{ ip_v4 }}" - "{{ ip_v6 }}" gateway4: "{{ gateway_v4 }}" gateway6: "{{ gateway_v6 }}" dns: - 192.0.2.200 - 2001:db8:1::ffbb dns_search: - example.com state: up
--- - name: Configure the network hosts: managed-node-01.example.com,managed-node-02.example.com tasks: - name: Ethernet connection profile with static IP address settings ansible.builtin.include_role: name: redhat.rhel_system_roles.network vars: network_connections: - name: "{{ interface }}" interface_name: "{{ interface }}" type: ethernet autoconnect: yes ip: address: - "{{ ip_v4 }}" - "{{ ip_v6 }}" gateway4: "{{ gateway_v4 }}" gateway6: "{{ gateway_v6 }}" dns: - 192.0.2.200 - 2001:db8:1::ffbb dns_search: - example.com state: up
Copy to Clipboard Copied! 此 playbook 从清单文件中动态读取每个主机的某些值,并在 playbook 中对所有主机相同的设置使用静态值。
有关 playbook 中使用的所有变量的详情,请查看控制节点上的
/usr/share/ansible/roles/rhel-system-roles.network/README.md
文件。验证 playbook 语法:
ansible-playbook --syntax-check ~/playbook.yml
$ ansible-playbook --syntax-check ~/playbook.yml
Copy to Clipboard Copied! 请注意,这个命令只验证语法,不能防止错误的、但有效的配置。
运行 playbook:
ansible-playbook ~/playbook.yml
$ ansible-playbook ~/playbook.yml
Copy to Clipboard Copied!
验证
查询受管节点的 Ansible 事实,并验证活跃的网络设置:
ansible managed-node-01.example.com -m ansible.builtin.setup
# ansible managed-node-01.example.com -m ansible.builtin.setup ... "ansible_default_ipv4": { "address": "192.0.2.1", "alias": "enp1s0", "broadcast": "192.0.2.255", "gateway": "192.0.2.254", "interface": "enp1s0", "macaddress": "52:54:00:17:b8:b6", "mtu": 1500, "netmask": "255.255.255.0", "network": "192.0.2.0", "prefix": "24", "type": "ether" }, "ansible_default_ipv6": { "address": "2001:db8:1::1", "gateway": "2001:db8:1::fffe", "interface": "enp1s0", "macaddress": "52:54:00:17:b8:b6", "mtu": 1500, "prefix": "64", "scope": "global", "type": "ether" }, ... "ansible_dns": { "nameservers": [ "192.0.2.1", "2001:db8:1::ffbb" ], "search": [ "example.com" ] }, ...
Copy to Clipboard Copied!
2.6. 使用网络
RHEL 系统角色和设备路径,使用静态 IP 地址配置以太网连接
要将 Red Hat Enterprise Linux 主机连接到以太网网络,请为网络设备创建一个 NetworkManager 连接配置文件。通过使用 Ansible 和 network
RHEL 系统角色,您可以自动化此过程,并在 playbook 中定义的主机上远程配置连接配置文件。
您可以使用 network
RHEL 系统角色配置带有静态 IP 地址、网关和 DNS 设置的以太网连接,并根据其路径而不是其名称将它们分配给设备。
先决条件
- 您已准备好控制节点和受管节点
- 以可在受管主机上运行 playbook 的用户登录到控制节点。
-
您用于连接到受管节点的帐户对它们具有
sudo
权限。 - 服务器配置中有一个物理或者虚拟以太网设备。
- 受管节点使用 NetworkManager 配置网络。
-
您知道设备的路径。您可以使用
udevadm info /sys/class/net/<device_name> | grep ID_PATH=
命令显示设备路径。
流程
创建一个包含以下内容的 playbook 文件,如
~/playbook.yml
:--- - name: Configure the network hosts: managed-node-01.example.com tasks: - name: Ethernet connection profile with static IP address settings ansible.builtin.include_role: name: redhat.rhel_system_roles.network vars: network_connections: - name: example match: path: - pci-0000:00:0[1-3].0 - '&!pci-0000:00:02.0' type: ethernet autoconnect: yes ip: address: - 192.0.2.1/24 - 2001:db8:1::1/64 gateway4: 192.0.2.254 gateway6: 2001:db8:1::fffe dns: - 192.0.2.200 - 2001:db8:1::ffbb dns_search: - example.com state: up
--- - name: Configure the network hosts: managed-node-01.example.com tasks: - name: Ethernet connection profile with static IP address settings ansible.builtin.include_role: name: redhat.rhel_system_roles.network vars: network_connections: - name: example match: path: - pci-0000:00:0[1-3].0 - '&!pci-0000:00:02.0' type: ethernet autoconnect: yes ip: address: - 192.0.2.1/24 - 2001:db8:1::1/64 gateway4: 192.0.2.254 gateway6: 2001:db8:1::fffe dns: - 192.0.2.200 - 2001:db8:1::ffbb dns_search: - example.com state: up
Copy to Clipboard Copied! 示例 playbook 中指定的设置包括如下:
match
-
定义一个应用设置所必须满足的条件。您只能将此变量与
path
选项一起使用。 path
-
定义设备的持久路径。您可以将它设置为固定路径或表达式。其值可以包含修饰符和通配符。这个示例将设置应用到与 PCI ID
0000:00:0[1-3].0
而不是0000:00:02.0
匹配的设备。
有关 playbook 中使用的所有变量的详情,请查看控制节点上的
/usr/share/ansible/roles/rhel-system-roles.network/README.md
文件。验证 playbook 语法:
ansible-playbook --syntax-check ~/playbook.yml
$ ansible-playbook --syntax-check ~/playbook.yml
Copy to Clipboard Copied! 请注意,这个命令只验证语法,不能防止错误的、但有效的配置。
运行 playbook:
ansible-playbook ~/playbook.yml
$ ansible-playbook ~/playbook.yml
Copy to Clipboard Copied!
验证
查询受管节点的 Ansible 事实,并验证活跃的网络设置:
ansible managed-node-01.example.com -m ansible.builtin.setup
# ansible managed-node-01.example.com -m ansible.builtin.setup ... "ansible_default_ipv4": { "address": "192.0.2.1", "alias": "enp1s0", "broadcast": "192.0.2.255", "gateway": "192.0.2.254", "interface": "enp1s0", "macaddress": "52:54:00:17:b8:b6", "mtu": 1500, "netmask": "255.255.255.0", "network": "192.0.2.0", "prefix": "24", "type": "ether" }, "ansible_default_ipv6": { "address": "2001:db8:1::1", "gateway": "2001:db8:1::fffe", "interface": "enp1s0", "macaddress": "52:54:00:17:b8:b6", "mtu": 1500, "prefix": "64", "scope": "global", "type": "ether" }, ... "ansible_dns": { "nameservers": [ "192.0.2.1", "2001:db8:1::ffbb" ], "search": [ "example.com" ] }, ...
Copy to Clipboard Copied!
2.7. 使用带有接口名称的 nmstatectl
使用动态 IP 地址配置以太网连接
使用 nmstatectl
工具通过 Nmstate API 配置以太网连接。Nmstate API 确保设置配置后结果与配置文件匹配。如果有任何失败,nmstatectl
会自动回滚更改以避免系统处于不正确的状态。
您可以使用 Nmstate 配置以太网连接,从 DHCP 服务器和 IPv6 无状态地址自动配置(SLAAC)检索其 IP 地址、网关和 DNS 设置。您可以将连接配置集分配给指定的接口名称。
先决条件
- 服务器配置中存在物理或虚拟以太网网络接口控制器(NIC)。
- 网络中有 DHCP 服务器。
-
nmstate
软件包已安装。
步骤
创建包含以下内容的 YAML 文件,如
~/create-ethernet-profile.yml
:--- interfaces: - name: enp1s0 type: ethernet state: up ipv4: enabled: true auto-dns: true auto-gateway: true auto-routes: true dhcp: true ipv6: enabled: true auto-dns: true auto-gateway: true auto-routes: true autoconf: true dhcp: true
--- interfaces: - name: enp1s0 type: ethernet state: up ipv4: enabled: true auto-dns: true auto-gateway: true auto-routes: true dhcp: true ipv6: enabled: true auto-dns: true auto-gateway: true auto-routes: true autoconf: true dhcp: true
Copy to Clipboard Copied! 这些设置为
enp1s0
设备定义了一个以太网连接配置文件。连接从 DHCP 服务器检索 IPv4 地址、IPv6 地址、默认网关、路由、DNS 服务器和搜索域,以及 IPv6 无状态地址自动配置(SLAAC)。可选:您可以在
interfaces
属性中定义identifier: mac-address
和mac-address: <mac_address>
属性,来通过其 MAC 地址而不是其名称来识别网络接口卡,例如:--- interfaces: - name: <profile_name> type: ethernet identifier: mac-address mac-address: <mac_address> ...
--- interfaces: - name: <profile_name> type: ethernet identifier: mac-address mac-address: <mac_address> ...
Copy to Clipboard Copied! 将设置应用到系统:
nmstatectl apply ~/create-ethernet-profile.yml
# nmstatectl apply ~/create-ethernet-profile.yml
Copy to Clipboard Copied!
验证
以 YAML 格式显示当前状态:
nmstatectl show enp1s0
# nmstatectl show enp1s0
Copy to Clipboard Copied! 显示 NIC 的 IP 设置:
ip address show enp1s0
# ip address show enp1s0 2: enp1s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000 link/ether 52:54:00:17:b8:b6 brd ff:ff:ff:ff:ff:ff inet 192.0.2.1/24 brd 192.0.2.255 scope global noprefixroute enp1s0 valid_lft forever preferred_lft forever inet6 2001:db8:1::fffe/64 scope global noprefixroute valid_lft forever preferred_lft forever
Copy to Clipboard Copied! 显示 IPv4 默认网关:
ip route show default
# ip route show default default via 192.0.2.254 dev enp1s0 proto static metric 102
Copy to Clipboard Copied! 显示 IPv6 默认网关:
ip -6 route show default
# ip -6 route show default default via 2001:db8:1::fffe dev enp1s0 proto static metric 102 pref medium
Copy to Clipboard Copied! 显示 DNS 设置:
cat /etc/resolv.conf search example.com nameserver 192.0.2.200 nameserver 2001:db8:1::ffbb
# cat /etc/resolv.conf search example.com nameserver 192.0.2.200 nameserver 2001:db8:1::ffbb
Copy to Clipboard Copied! 如果多个连接配置文件同时处于活跃状态,则
nameserver
条目的顺序取决于这些配置文件中的 DNS 优先级值和连接类型。使用
ping
工具验证这个主机是否可以向其他主机发送数据包:ping <host-name-or-IP-address>
# ping <host-name-or-IP-address>
Copy to Clipboard Copied!
2.8. 使用网络
RHEL 系统角色和接口名称,使用动态 IP 地址配置以太网连接
要将 Red Hat Enterprise Linux 主机连接到以太网网络,请为网络设备创建一个 NetworkManager 连接配置文件。通过使用 Ansible 和 network
RHEL 系统角色,您可以自动化此过程,并在 playbook 中定义的主机上远程配置连接配置文件。
您可以使用 network
RHEL 系统角色配置以太网连接,该连接从 DHCP 服务器检索其 IP 地址、网关和 DNS 设置,以及 IPv6 无状态地址自动配置(SLAAC)。使用此角色,您可以将连接配置文件分配给指定的接口名称。
先决条件
- 您已准备好控制节点和受管节点
- 以可在受管主机上运行 playbook 的用户登录到控制节点。
-
您用于连接到受管节点的帐户对它们具有
sudo
权限。 - 服务器配置中有一个物理或者虚拟以太网设备。
- 网络中有 DHCP 服务器和 SLAAC。
- 受管节点使用 NetworkManager 服务来配置网络。
流程
创建一个包含以下内容的 playbook 文件,如
~/playbook.yml
:--- - name: Configure the network hosts: managed-node-01.example.com tasks: - name: Ethernet connection profile with dynamic IP address settings ansible.builtin.include_role: name: redhat.rhel_system_roles.network vars: network_connections: - name: enp1s0 interface_name: enp1s0 type: ethernet autoconnect: yes ip: dhcp4: yes auto6: yes state: up
--- - name: Configure the network hosts: managed-node-01.example.com tasks: - name: Ethernet connection profile with dynamic IP address settings ansible.builtin.include_role: name: redhat.rhel_system_roles.network vars: network_connections: - name: enp1s0 interface_name: enp1s0 type: ethernet autoconnect: yes ip: dhcp4: yes auto6: yes state: up
Copy to Clipboard Copied! 示例 playbook 中指定的设置包括如下:
dhcp4: yes
- 启用来自 DHCP、PPP 或类似服务的自动 IPv4 地址分配。
auto6: yes
-
启用 IPv6 自动配置。默认情况下,NetworkManager 使用路由器公告。如果路由器宣布
managed
标记,则 NetworkManager 会从 DHCPv6 服务器请求 IPv6 地址和前缀。
有关 playbook 中使用的所有变量的详情,请查看控制节点上的
/usr/share/ansible/roles/rhel-system-roles.network/README.md
文件。验证 playbook 语法:
ansible-playbook --syntax-check ~/playbook.yml
$ ansible-playbook --syntax-check ~/playbook.yml
Copy to Clipboard Copied! 请注意,这个命令只验证语法,不能防止错误的、但有效的配置。
运行 playbook:
ansible-playbook ~/playbook.yml
$ ansible-playbook ~/playbook.yml
Copy to Clipboard Copied!
验证
查询受管节点的 Ansible 事实,并验证接口是否收到 IP 地址和 DNS 设置:
ansible managed-node-01.example.com -m ansible.builtin.setup
# ansible managed-node-01.example.com -m ansible.builtin.setup ... "ansible_default_ipv4": { "address": "192.0.2.1", "alias": "enp1s0", "broadcast": "192.0.2.255", "gateway": "192.0.2.254", "interface": "enp1s0", "macaddress": "52:54:00:17:b8:b6", "mtu": 1500, "netmask": "255.255.255.0", "network": "192.0.2.0", "prefix": "24", "type": "ether" }, "ansible_default_ipv6": { "address": "2001:db8:1::1", "gateway": "2001:db8:1::fffe", "interface": "enp1s0", "macaddress": "52:54:00:17:b8:b6", "mtu": 1500, "prefix": "64", "scope": "global", "type": "ether" }, ... "ansible_dns": { "nameservers": [ "192.0.2.1", "2001:db8:1::ffbb" ], "search": [ "example.com" ] }, ...
Copy to Clipboard Copied!
2.9. 使用网络
RHEL 系统角色和设备路径,使用动态 IP 地址配置以太网连接
要将 Red Hat Enterprise Linux 主机连接到以太网网络,请为网络设备创建一个 NetworkManager 连接配置文件。通过使用 Ansible 和 network
RHEL 系统角色,您可以自动化此过程,并在 playbook 中定义的主机上远程配置连接配置文件。
您可以使用 network
RHEL 系统角色配置以太网连接,该连接从 DHCP 服务器检索其 IP 地址、网关和 DNS 设置,以及 IPv6 无状态地址自动配置(SLAAC)。角色可以根据其路径而不是接口名称将连接配置文件分配给设备。
先决条件
- 您已准备好控制节点和受管节点
- 以可在受管主机上运行 playbook 的用户登录到控制节点。
-
您用于连接到受管节点的帐户对它们具有
sudo
权限。 - 服务器配置中有一个物理或者虚拟以太网设备。
- 网络中有 DHCP 服务器和 SLAAC。
- 受管主机使用 NetworkManager 配置网络。
-
您知道设备的路径。您可以使用
udevadm info /sys/class/net/<device_name> | grep ID_PATH=
命令显示设备路径。
流程
创建一个包含以下内容的 playbook 文件,如
~/playbook.yml
:--- - name: Configure the network hosts: managed-node-01.example.com tasks: - name: Ethernet connection profile with dynamic IP address settings ansible.builtin.include_role: name: redhat.rhel_system_roles.network vars: network_connections: - name: example match: path: - pci-0000:00:0[1-3].0 - '&!pci-0000:00:02.0' type: ethernet autoconnect: yes ip: dhcp4: yes auto6: yes state: up
--- - name: Configure the network hosts: managed-node-01.example.com tasks: - name: Ethernet connection profile with dynamic IP address settings ansible.builtin.include_role: name: redhat.rhel_system_roles.network vars: network_connections: - name: example match: path: - pci-0000:00:0[1-3].0 - '&!pci-0000:00:02.0' type: ethernet autoconnect: yes ip: dhcp4: yes auto6: yes state: up
Copy to Clipboard Copied! 示例 playbook 中指定的设置包括如下:
match: path
-
定义一个应用设置所必须满足的条件。您只能将此变量与
path
选项一起使用。 path: <path_and_expressions>
-
定义设备的持久路径。您可以将它设置为固定路径或表达式。其值可以包含修饰符和通配符。这个示例将设置应用到与 PCI ID
0000:00:0[1-3].0
而不是0000:00:02.0
匹配的设备。 dhcp4: yes
- 启用来自 DHCP、PPP 或类似服务的自动 IPv4 地址分配。
auto6: yes
-
启用 IPv6 自动配置。默认情况下,NetworkManager 使用路由器公告。如果路由器宣布
managed
标记,则 NetworkManager 会从 DHCPv6 服务器请求 IPv6 地址和前缀。
有关 playbook 中使用的所有变量的详情,请查看控制节点上的
/usr/share/ansible/roles/rhel-system-roles.network/README.md
文件。验证 playbook 语法:
ansible-playbook --syntax-check ~/playbook.yml
$ ansible-playbook --syntax-check ~/playbook.yml
Copy to Clipboard Copied! 请注意,这个命令只验证语法,不能防止错误的、但有效的配置。
运行 playbook:
ansible-playbook ~/playbook.yml
$ ansible-playbook ~/playbook.yml
Copy to Clipboard Copied!
验证
查询受管节点的 Ansible 事实,并验证接口是否收到 IP 地址和 DNS 设置:
ansible managed-node-01.example.com -m ansible.builtin.setup
# ansible managed-node-01.example.com -m ansible.builtin.setup ... "ansible_default_ipv4": { "address": "192.0.2.1", "alias": "enp1s0", "broadcast": "192.0.2.255", "gateway": "192.0.2.254", "interface": "enp1s0", "macaddress": "52:54:00:17:b8:b6", "mtu": 1500, "netmask": "255.255.255.0", "network": "192.0.2.0", "prefix": "24", "type": "ether" }, "ansible_default_ipv6": { "address": "2001:db8:1::1", "gateway": "2001:db8:1::fffe", "interface": "enp1s0", "macaddress": "52:54:00:17:b8:b6", "mtu": 1500, "prefix": "64", "scope": "global", "type": "ether" }, ... "ansible_dns": { "nameservers": [ "192.0.2.1", "2001:db8:1::ffbb" ], "search": [ "example.com" ] }, ...
Copy to Clipboard Copied!
2.10. 按接口名称,使用单个连接配置文件配置多个以太网接口
在大多数情况下,一个连接配置文件包含一个网络设备的设置。但是,当您在连接配置文件中设置接口名称时,NetworkManager 也支持通配符。如果主机在具有动态 IP 地址分配的以太网之间漫游,则您可以使用此功能创建可用于多个以太网接口的单一连接配置文件。
先决条件
- 服务器配置中存在多个物理或虚拟以太网设备。
- 网络中有 DHCP 服务器。
- 主机上不存在连接配置文件。
流程
添加可应用于以
enp
开头的所有接口名称的连接配置文件:nmcli connection add con-name "Wired connection 1" connection.multi-connect multiple match.interface-name enp* type ethernet
# nmcli connection add con-name "Wired connection 1" connection.multi-connect multiple match.interface-name enp* type ethernet
Copy to Clipboard Copied!
验证
显示单个连接配置文件的所有设置:
nmcli connection show "Wired connection 1"
# nmcli connection show "Wired connection 1" connection.id: Wired connection 1 ... connection.multi-connect: 3 (multiple) match.interface-name: enp* ...
Copy to Clipboard Copied! 3
表示接口在特定的时间可以被多次激活。连接配置文件使用与match.interface-name
参数中的模式匹配的所有设备,因此连接配置文件具有相同的通用唯一识别符(UUID)。显示连接的状态:
nmcli connection show
# nmcli connection show NAME UUID TYPE DEVICE ... Wired connection 1 6f22402e-c0cc-49cf-b702-eaf0cd5ea7d1 ethernet enp7s0 Wired connection 1 6f22402e-c0cc-49cf-b702-eaf0cd5ea7d1 ethernet enp8s0 Wired connection 1 6f22402e-c0cc-49cf-b702-eaf0cd5ea7d1 ethernet enp9s0
Copy to Clipboard Copied!
2.11. 使用 PCI ID 为多个以太网接口配置一个连接配置文件
PCI ID 是连接到系统的设备的唯一标识符。连接配置文件根据 PCI ID 列表按匹配的接口来添加多个设备。您可以使用这个流程将多个设备 PCI ID 连接到一个连接配置文件。
先决条件
- 服务器配置中存在多个物理或虚拟以太网设备。
- 网络中有 DHCP 服务器。
- 主机上不存在连接配置文件。
流程
识别设备路径。例如,要显示以
enp
开头的所有接口的设备路径,请输入:udevadm info /sys/class/net/enp* | grep ID_PATH=
# udevadm info /sys/class/net/enp* | grep ID_PATH= ... E: ID_PATH=pci-0000:07:00.0 E: ID_PATH=pci-0000:08:00.0
Copy to Clipboard Copied! 添加可应用于匹配
0000:00:0[7-8].0
表达式的所有 PCI ID 的连接配置文件:nmcli connection add type ethernet connection.multi-connect multiple match.path "pci-0000:07:00.0 pci-0000:08:00.0" con-name "Wired connection 1"
# nmcli connection add type ethernet connection.multi-connect multiple match.path "pci-0000:07:00.0 pci-0000:08:00.0" con-name "Wired connection 1"
Copy to Clipboard Copied!
验证
显示连接的状态:
nmcli connection show
# nmcli connection show NAME UUID TYPE DEVICE Wired connection 1 9cee0958-512f-4203-9d3d-b57af1d88466 ethernet enp7s0 Wired connection 1 9cee0958-512f-4203-9d3d-b57af1d88466 ethernet enp8s0 ...
Copy to Clipboard Copied! 显示连接配置集的所有设置:
nmcli connection show "Wired connection 1"
# nmcli connection show "Wired connection 1" connection.id: Wired connection 1 ... connection.multi-connect: 3 (multiple) match.path: pci-0000:07:00.0,pci-0000:08:00.0 ...
Copy to Clipboard Copied! 此连接配置文件使用 PCI ID 与
match.path
参数中的模式匹配的所有设备,因此连接配置文件具有相同的全局唯一标识符(UUID)。
第 3 章 配置网络绑定
网络绑定是一种组合或聚合物理和虚拟网络接口的方法,以提供高吞吐量或冗余的逻辑接口。在绑定中,内核只处理所有操作。您可以在不同类型的设备中创建绑定,如以太网设备或 VLAN。
Red Hat Enterprise Linux 为管理员提供不同的选项来配置团队设备。例如:
-
使用
nmcli
使用命令行配置绑定连接。 - 通过 RHEL web 控制台使用 Web 浏览器配置绑定连接。
-
使用
nmtui
在基于文本的用户界面中配置绑定连接。 -
使用
nmstatectl
通过 Nmstate API 配置绑定连接。 - 使用 RHEL 系统角色在一个或多个主机上自动绑定配置。
3.1. 了解控制器和端口接口的默认行为
使用 NetworkManager
服务管理或排除绑定端口接口时,请考虑以下默认行为:
- 启动控制器接口不会自动启动端口接口。
- 启动端口接口总会启动控制器接口。
- 停止控制器接口也会停止端口接口。
- 没有端口的控制器可以启动静态 IP 连接。
- 没有端口的控制器在启动 DHCP 连接时会等待端口。
- 当您添加具有载体的端口时,等待端口且具有 DHCP 连接的控制器会完成。
- 当您添加没有载体的端口时,等待端口的具有 DHCP 连接的控制器将继续等待。
3.2. 上游交换机配置依赖绑定模式
根据您要使用的绑定模式,您必须在交换机上配置端口:
绑定模式 | 交换机上的配置 |
---|---|
| 需要启用静态 EtherChannel,而不是协商的链路聚合控制协议(LACP)。 |
| 交换机上不需要配置。 |
| 需要启用静态 EtherChannel,而不是协商的 LACP 。 |
| 需要启用静态 EtherChannel,而不是协商的 LACP 。 |
| 需要启用 LACP 协商的 EtherChannel。 |
| 交换机上不需要配置。 |
| 交换机上不需要配置。 |
| 交换机上不需要配置。 |
有关如何配置交换机的详情,请查看交换机文档。
某些网络绑定的功能,比如故障切换机制,不支持不通过网络交换机的直接电缆连接。详情请查看红帽知识库解决方案 使用跨电缆支持直接连接。
3.3. 使用 nmcli
配置网络绑定
要在命令行上配置网络绑定,请使用 nmcli
工具。
先决条件
- 在服务器中安装两个或者两个以上物理或者虚拟网络设备。
- 要将以太网设备用作绑定的端口,必须在服务器中安装物理或者虚拟以太网设备。
要将网桥或 VLAN 设备用作绑定的端口,您可以在创建绑定时创建这些设备,或者预先创建它们,如:
流程
创建绑定接口:
nmcli connection add type bond con-name bond0 ifname bond0 bond.options "mode=active-backup"
# nmcli connection add type bond con-name bond0 ifname bond0 bond.options "mode=active-backup"
Copy to Clipboard Copied! 这个命令会创建一个使用
active-backup
模式、名为bond0
的绑定。要额外设置介质独立接口(MII)监控间隔,请在
bond.options
属性中添加miimon=interval
选项,例如:nmcli connection add type bond con-name bond0 ifname bond0 bond.options "mode=active-backup,miimon=1000"
# nmcli connection add type bond con-name bond0 ifname bond0 bond.options "mode=active-backup,miimon=1000"
Copy to Clipboard Copied! 显示网络接口以及您要添加到绑定中的接口名称:
nmcli device status
# nmcli device status DEVICE TYPE STATE CONNECTION enp7s0 ethernet disconnected -- enp8s0 ethernet disconnected -- bridge0 bridge connected bridge0 bridge1 bridge connected bridge1 ...
Copy to Clipboard Copied! 在本例中:
-
没有配置
enp7s0
和enp8s0
。要将这些设备用作端口,请在下一步中添加连接配置集。 -
bridge0
和bridge1
都有现有的连接配置文件。要将这些设备用作端口,请在下一步中修改其配置集。
-
没有配置
为绑定分配接口:
如果没有配置您要分配给绑定的接口,为其创建新的连接配置集:
nmcli connection add type ethernet port-type bond con-name bond0-port1 ifname enp7s0 controller bond0 nmcli connection add type ethernet port-type bond con-name bond0-port2 ifname enp8s0 controller bond0
# nmcli connection add type ethernet port-type bond con-name bond0-port1 ifname enp7s0 controller bond0 # nmcli connection add type ethernet port-type bond con-name bond0-port2 ifname enp8s0 controller bond0
Copy to Clipboard Copied! 这些命令为
enp7s0
和enp8s0
创建配置文件,并将它们添加到bond0
连接中。要将现有的连接配置文件分配给绑定:
将这些连接的
controller
参数设置为bond0
:nmcli connection modify bridge0 controller bond0 nmcli connection modify bridge1 controller bond0
# nmcli connection modify bridge0 controller bond0 # nmcli connection modify bridge1 controller bond0
Copy to Clipboard Copied! 这些命令将名为
bridge0
和bridge1
的现有连接配置文件分配给bond0
连接。重新激活连接:
nmcli connection up bridge0 nmcli connection up bridge1
# nmcli connection up bridge0 # nmcli connection up bridge1
Copy to Clipboard Copied!
配置 IPv4 设置:
要为
bond0
连接设置静态 IPv4 地址、网络掩码、默认网关和 DNS 服务器设置,请输入:nmcli connection modify bond0 ipv4.addresses '192.0.2.1/24' ipv4.gateway '192.0.2.254' ipv4.dns '192.0.2.253' ipv4.dns-search 'example.com' ipv4.method manual
# nmcli connection modify bond0 ipv4.addresses '192.0.2.1/24' ipv4.gateway '192.0.2.254' ipv4.dns '192.0.2.253' ipv4.dns-search 'example.com' ipv4.method manual
Copy to Clipboard Copied! - 要使用 DHCP,不需要任何操作。
- 如果您计划将此绑定设备用作其它设备的端口,则不需要任何操作。
配置 IPv6 设置:
要为
bond0
连接设置静态 IPv6 地址、网络掩码、默认网关和 DNS 服务器设置,请输入:nmcli connection modify bond0 ipv6.addresses '2001:db8:1::1/64' ipv6.gateway '2001:db8:1::fffe' ipv6.dns '2001:db8:1::fffd' ipv6.dns-search 'example.com' ipv6.method manual
# nmcli connection modify bond0 ipv6.addresses '2001:db8:1::1/64' ipv6.gateway '2001:db8:1::fffe' ipv6.dns '2001:db8:1::fffd' ipv6.dns-search 'example.com' ipv6.method manual
Copy to Clipboard Copied! - 要使用无状态地址自动配置(SLAAC),不需要采取任何操作。
- 如果您计划将此绑定设备用作其它设备的端口,则不需要任何操作。
可选:如果要在绑定端口上设置任何参数,请使用以下命令:
nmcli connection modify bond0-port1 bond-port.<parameter> <value>
# nmcli connection modify bond0-port1 bond-port.<parameter> <value>
Copy to Clipboard Copied! 激活连接:
nmcli connection up bond0
# nmcli connection up bond0
Copy to Clipboard Copied! 验证端口是否已连接,并且
CONNECTION
列是否显示端口的连接名称:nmcli device
# nmcli device DEVICE TYPE STATE CONNECTION ... enp7s0 ethernet connected bond0-port1 enp8s0 ethernet connected bond0-port2
Copy to Clipboard Copied! 当您激活连接的任何端口时,NetworkManager 也激活绑定,但不会激活它的其它端口。您可以配置 Red Hat Enterprise Linux 在启用绑定时自动启用所有端口:
启用绑定连接的
connection.autoconnect-ports
参数:nmcli connection modify bond0 connection.autoconnect-ports 1
# nmcli connection modify bond0 connection.autoconnect-ports 1
Copy to Clipboard Copied! 重新激活桥接:
nmcli connection up bond0
# nmcli connection up bond0
Copy to Clipboard Copied!
验证
从其中一个网络设备临时拔掉网线,并检查绑定中的其他设备是否在处理流量。
请注意,无法使用软件工具正确测试链路失败事件。停用连接的工具(如
nmcli
),只显示绑定驱动程序可以处理端口配置的更改,而不是实际的链接失败事件。显示绑定状态:
cat /proc/net/bonding/bond0
# cat /proc/net/bonding/bond0
Copy to Clipboard Copied!
3.4. 使用 RHEL web 控制台配置网络绑定
如果您希望使用基于 Web 浏览器的界面管理网络设置,请使用 RHEL web 控制台配置网络绑定。
先决条件
- 已登陆到 RHEL web 控制台。
- 在服务器中安装两个或者两个以上物理或者虚拟网络设备。
- 要将以太网设备用作绑定的成员,必须在服务器中安装物理或者虚拟以太网设备。
要将桥接或 VLAN 设备用作绑定的成员,请提前创建它们,如下所述:
流程
- 在屏幕左侧的导航中选择 Networking 选项卡。
- 在 Interfaces 部分点 。
- 输入您要创建的绑定设备名称。
- 选择应该是绑定成员的接口。
选择绑定模式。
如果您选择 Active backup,Web 控制台会显示额外的 Primary 字段,您可以在其中选择首选的活动设备。
-
设置链路监控模式。例如,当您使用 Adaptive 负载均衡 模式时,将它设置为
ARP
。 可选:调整监控间隔、链接延迟和连接延迟设置。通常,您只需要更改默认值以进行故障排除。
- 点 。
默认情况下,绑定使用动态 IP 地址。如果要设置静态 IP 地址:
- 在 Interfaces 部分点绑定的名称。
- 点您要配置的协议旁的 Edit。
- 选择 Addresses 旁的 Manual,并输入 IP 地址、前缀和默认网关。
- 在 DNS 部分,点 按钮,并输入 DNS 服务器的 IP 地址。重复此步骤来设置多个 DNS 服务器。
- 在 DNS search domains 部分中,点 按钮并输入搜索域。
如果接口需要静态路由,请在 Routes 部分配置它们。
- 点
验证
在屏幕左侧的导航中选择 Networking 选项卡,并检查接口上是否有传入和传出流量:
从其中一个网络设备中临时删除网线,并检查绑定中的其他设备是否在处理流量。
请注意,无法使用软件工具正确测试链路失败事件。取消激活连接的工具(如 Web 控制台)只显示处理成员配置更改且没有实际链路失败事件的能力。
显示绑定状态:
cat /proc/net/bonding/bond0
# cat /proc/net/bonding/bond0
Copy to Clipboard Copied!
3.5. 使用 nmtui
配置网络绑定
nmtui
应用程序为 NetworkManager 提供了一个基于文本的用户界面。您可以使用 nmtui
在没有图形界面的主机上配置网络绑定。
在 nmtui
中:
- 使用光标键导航。
- 选择一个按钮并按 Enter 键。
- 使用 空格 选择和清除复选框。
- 要返回上一个屏幕,请使用 ESC。
先决条件
- 在服务器中安装两个或者两个以上物理或者虚拟网络设备。
- 要将以太网设备用作绑定的端口,必须在服务器中安装物理或者虚拟以太网设备。
流程
如果您不知道您要在其上配置网络绑定的网络设备名称,请显示可用的设备:
nmcli device status
# nmcli device status DEVICE TYPE STATE CONNECTION enp7s0 ethernet unavailable -- enp8s0 ethernet unavailable -- ...
Copy to Clipboard Copied! 启动
nmtui
:nmtui
# nmtui
Copy to Clipboard Copied! - 选择 Edit a connection,然后按 Enter。
- 按 Add。
- 从网络类型列表中选择 Bond,然后按 Enter 键。
可选:为要创建的 NetworkManager 配置集输入一个名称。
在有多个配置文件的主机上,有意义的名称可以更容易识别配置文件的用途。
- 在 Device 字段中输入要创建的绑定设备名称。
为要创建的绑定添加端口:
- 按 Ports 列表旁边的 Add。
- 选择您要添为绑定的端口的接口的类型,例如 Ethernet。
- 可选:为这个绑定端口输入要创建的 NetworkManager 配置文件的名称。
- 在 Device 字段中输入端口的设备名称。
按 OK 返回到绑定设置窗口。
图 3.1. 将以太网设备作为端口添加到绑定
- 重复这些步骤,来向绑定添加更多的端口。
-
设置绑定模式。根据您设置的值,
nmtui
会显示与所选模式相关的设置的额外字段。 根据您的环境,相应地在 IPv4 configuration 和 IPv6 configuration 配置区域中配置 IP 地址。为此,请按这些区域旁边的按钮,并选择:
-
Disabled
,如果绑定不需要 IP 地址。 -
Automatic
,如果 DHCP 服务器或无状态地址自动配置(SLAAC)动态将 IP 地址分配给绑定。 Manual
,如果网络需要静态 IP 地址设置。在这种情况下,您必须填写更多字段:- 在您要配置的协议旁边按 Show 以显示其他字段。
按 Addresses 旁边的 Add,并输入无类别域间路由(CIDR)格式的 IP 地址和子网掩码。
如果没有指定子网掩码,NetworkManager 会为 IPv4 地址设置
/32
子网掩码,并为 IPv6 地址设置/64
。- 输入默认网关的地址。
- 按 DNS servers 旁边的 Add,并输入 DNS 服务器地址。
- 按 Search domains 旁边的 Add,并输入 DNS 搜索域。
图 3.2. 具有静态 IP 地址设置的绑定连接的示例
-
- 按 OK 创建并自动激活新连接。
- 按 Back 返回到主菜单。
-
选择 Quit,然后按 Enter 键关闭
nmtui
应用程序。
验证
从其中一个网络设备临时拔掉网线,并检查绑定中的其他设备是否在处理流量。
请注意,无法使用软件工具正确测试链路失败事件。停用连接的工具(如
nmcli
),只显示绑定驱动程序可以处理端口配置的更改,而不是实际的链接失败事件。显示绑定状态:
cat /proc/net/bonding/bond0
# cat /proc/net/bonding/bond0
Copy to Clipboard Copied!
3.6. 使用 nmstatectl
配置网络绑定
使用 nmstatectl
工具通过 Nmstate API 配置网络绑定。Nmstate API 确保设置配置后结果与配置文件匹配。如果有任何失败,nmstatectl
会自动回滚更改以避免系统处于不正确的状态。
根据您的环境,相应地调整 YAML 文件。例如,要使用与绑定中以太网适配器不同的设备,请调整您在绑定中使用的端口的 base-iface
属性和 type
属性。
先决条件
- 在服务器中安装两个或者两个以上物理或者虚拟网络设备。
- 要将以太网设备用作绑定中的端口,必须在服务器中安装物理或者虚拟以太网设备。
-
要在绑定中使用团队、网桥或 VLAN 设备作为端口,请在
port
列表中设置接口名称,并定义相应的接口。 -
nmstate
软件包已安装。
流程
创建一个包含以下内容的 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 metric: 300 - destination: ::/0 next-hop-address: 2001:db8:1::fffe next-hop-interface: bond0 metric: 300 dns-resolver: config: search: - example.com server: - 192.0.2.200 - 2001:db8:1::ffbb
--- 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 metric: 300 - destination: ::/0 next-hop-address: 2001:db8:1::fffe next-hop-interface: bond0 metric: 300 dns-resolver: config: search: - example.com server: - 192.0.2.200 - 2001:db8:1::ffbb
Copy to Clipboard Copied! 这些设置使用以下设置定义网络绑定:
-
绑定中的网络接口:
enp1s0
和enp7s0
-
模式:
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
-
绑定中的网络接口:
将设置应用到系统:
nmstatectl apply ~/create-bond.yml
# nmstatectl apply ~/create-bond.yml
Copy to Clipboard Copied!
验证
显示设备和连接的状态:
nmcli device status
# nmcli device status DEVICE TYPE STATE CONNECTION bond0 bond connected bond0
Copy to Clipboard Copied! 显示连接配置集的所有设置:
nmcli connection show bond0
# nmcli connection show bond0 connection.id: bond0 connection.uuid: 79cbc3bd-302e-4b1f-ad89-f12533b818ee connection.stable-id: -- connection.type: bond connection.interface-name: bond0 ...
Copy to Clipboard Copied! 以 YAML 格式显示连接设置:
nmstatectl show bond0
# nmstatectl show bond0
Copy to Clipboard Copied!
3.7. 使用 network
RHEL 系统角色配置网络绑定
您可以将网络接口组合在一个绑定中,以提供具有高吞吐量或冗余的逻辑接口。要配置绑定,请创建一个 NetworkManager 连接配置文件。通过使用 Ansible 和 network
RHEL 系统角色,您可以自动化此过程,并在 playbook 中定义的主机上远程配置连接配置文件。
您可以使用 network
RHEL 系统角色配置网络绑定,如果用于绑定的父设备的连接配置文件不存在,角色也可以创建它。
先决条件
- 您已准备好控制节点和受管节点
- 以可在受管主机上运行 playbook 的用户登录到控制节点。
-
您用于连接到受管节点的帐户对它们具有
sudo
权限。 - 在服务器中安装两个或者两个以上物理或者虚拟网络设备。
流程
创建一个包含以下内容的 playbook 文件,如
~/playbook.yml
:--- - name: Configure the network hosts: managed-node-01.example.com tasks: - name: Bond connection profile with two Ethernet ports ansible.builtin.include_role: name: redhat.rhel_system_roles.network vars: network_connections: # Bond profile - name: bond0 type: bond interface_name: bond0 ip: dhcp4: yes auto6: yes bond: mode: active-backup state: up # Port profile for the 1st Ethernet device - name: bond0-port1 interface_name: enp7s0 type: ethernet controller: bond0 state: up # Port profile for the 2nd Ethernet device - name: bond0-port2 interface_name: enp8s0 type: ethernet controller: bond0 state: up
--- - name: Configure the network hosts: managed-node-01.example.com tasks: - name: Bond connection profile with two Ethernet ports ansible.builtin.include_role: name: redhat.rhel_system_roles.network vars: network_connections: # Bond profile - name: bond0 type: bond interface_name: bond0 ip: dhcp4: yes auto6: yes bond: mode: active-backup state: up # Port profile for the 1st Ethernet device - name: bond0-port1 interface_name: enp7s0 type: ethernet controller: bond0 state: up # Port profile for the 2nd Ethernet device - name: bond0-port2 interface_name: enp8s0 type: ethernet controller: bond0 state: up
Copy to Clipboard Copied! 示例 playbook 中指定的设置包括如下:
type: <profile_type>
- 设置要创建的配置文件的类型。示例 playbook 创建三个连接配置文件:一个用于绑定,两个用于以太网设备。
dhcp4: yes
- 启用来自 DHCP、PPP 或类似服务的自动 IPv4 地址分配。
auto6: yes
-
启用 IPv6 自动配置。默认情况下,NetworkManager 使用路由器公告。如果路由器宣布
managed
标记,则 NetworkManager 会从 DHCPv6 服务器请求 IPv6 地址和前缀。 mode: <bond_mode>
设置绑定模式。可能的值有:
-
balance-rr
(默认) -
active-backup
-
balance-xor
-
broadcast
-
802.3ad
-
balance-tlb
-
balance-alb
根据您设置的模式,您需要在 playbook 中设置额外的变量。
-
有关 playbook 中使用的所有变量的详情,请查看控制节点上的
/usr/share/ansible/roles/rhel-system-roles.network/README.md
文件。验证 playbook 语法:
ansible-playbook --syntax-check ~/playbook.yml
$ ansible-playbook --syntax-check ~/playbook.yml
Copy to Clipboard Copied! 请注意,这个命令只验证语法,不能防止错误的、但有效的配置。
运行 playbook:
ansible-playbook ~/playbook.yml
$ ansible-playbook ~/playbook.yml
Copy to Clipboard Copied!
验证
从其中一个网络设备临时拔掉网线,并检查绑定中的其他设备是否在处理流量。
请注意,无法使用软件工具正确测试链路失败事件。停用连接的工具(如
nmcli
),只显示绑定驱动程序可以处理端口配置的更改,而不是实际的链接失败事件。
3.8. 不同的网络绑定模式
Linux 绑定驱动程序提供链路聚合。绑定是并行封装多个网络接口的过程,以提供单个逻辑绑定接口。绑定接口的操作取决于也称为模式的绑定策略。不同的模式提供负载均衡或热待机服务。
Linux 绑定驱动程序支持以下模式:
- Balance-rr (模式 0)
balance-rr
使用循环算法,它按顺序将数据包从第一个可用端口传输到最后一个端口。这个模式提供负载平衡和容错。这个模式需要切换端口聚合组(也称为 EtherChannel 或类似的端口分组)。EtherChannel 是一个端口链路聚合技术,用于将多个物理以太网链接分组到一个逻辑以太网链接中。
这个模式的缺陷在于它不适用于大量工作负载,以及 TCP 吞吐量或排序数据包交付非常重要。
- Active-backup (模式 1)
Active-backup
使用策略来确定在绑定中只有一个端口活跃。这个模式提供容错功能,不需要任何交换机配置。如果活动端口失败,则备用端口将变为活动状态。绑定会向网络发送大量地址解析协议 (ARP) 响应。gratuitous ARP 强制执行 ARP 帧的接收器,以更新它们的转发表。
Active-backup
模式传输一个 gratuitous ARP,宣布为主机维护连接的新路径。primary
选项定义绑定接口的首选端口。- Balance-xor (模式 2)
balance-xor
使用所选传输哈希策略来发送数据包。这个模式提供负载平衡、容错和需要切换配置来设置 Etherchannel 或类似的端口分组。要改变数据包传输和平衡传输,此模式使用
xmit_hash_policy
选项。根据接口上流量的源或目的地,接口需要额外的负载均衡配置。请参阅 xmit_hash_policy bonding 参数。- Broadcast (模式 3)
广播
使用在所有接口上传输每个数据包的策略。这个模式提供容错,需要交换机配置来设置 EtherChannel 或类似的端口分组。这个模式的缺陷在于它不适用于大量工作负载,以及 TCP 吞吐量或排序数据包交付非常重要。
- 802.3ad (模式 4)
802.3ad
使用同名的 IEEE 标准动态链路聚合策略。此模式提供容错功能。这个模式需要切换配置来设置链路聚合控制协议 (LACP) 端口分组。这个模式会创建聚合组,它们共享相同的速度和双工设置,并使用活跃聚合器中的所有端口。根据接口上流量的源或目的地,此模式需要额外的负载平衡配置。
默认情况下,传出流量的端口选择取决于传输哈希策略。使用传输哈希策略的
xmit_hash_policy
选项更改端口选择和平衡传输。802.3ad
和Balance-xor
之间的差别是合规性。802.3ad
策略在端口聚合组之间协商 LACP。请参阅 xmit_hash_policy bonding 参数- Balance-tlb (模式 5)
balance-tlb
使用传输负载均衡策略。这个模式提供容错、负载均衡和建立不需要任何交换机支持的频道绑定。活动端口接收传入流量。如果活动端口失败,另一个则是接管故障端口的 MAC 地址。要确定哪个接口处理传出流量,请使用以下模式之一:
-
值
0
:使用哈希分发策略在不进行负载均衡的情况下分发流量 值
1:
利用负载均衡将流量分配到每个端口使用 bonding 选项
tlb_dynamic_lb=0
,此绑定模式使用xmit_hash_policy
bonding 选项来均衡传输。primary
选项定义绑定接口的首选端口。
-
值
- Balance-alb (模式 6)
balance-alb
使用自适应负载平衡策略。这个模式提供容错、负载平衡,且不需要任何特殊交换机支持。此模式包含 balance-trans-mit 负载平衡 (
balance-tlb
) 和 IPv4 和 IPv6 流量接收负载均衡。绑定会截获本地系统发送的 ARP 回复,并覆盖绑定中某个端口的源硬件地址。ARP 协商管理接收负载平衡。因此,不同的端口为服务器使用不同的硬件地址。primary
选项定义绑定接口的首选端口。使用 bonding 选项tlb_dynamic_lb=0
,此绑定模式使用xmit_hash_policy
bonding 选项来均衡传输。请参阅 xmit_hash_policy bonding 参数。
另外,您可以使用 NetworkManager 来配置以下模式:
- Balance-slb
源负载均衡(SLB)绑定模式根据流量和 VLAN 哈希的源地址在多个网络接口间分发传出的数据流。这个模式不需要任何交换机配置。
NetworkManager 使用
balance-xor
模式结合nftables
规则来提供 SLB。有关配置此模式的详情,请参考 使用源负载均衡在 RHEL 上配置网络绑定。
3.9. xmit_hash_policy bonding 参数
xmit_hash_policy
负载均衡参数在 balance-xor
、802.3ad
、balance-alb
和 balance-tlb
模式中选择节点选择的传输散列策略。如果 tlb_dynamic_lb 参数为 0
,则只适用于模式 5 和 6。此参数可能的值是 layer2
, layer2+3
, layer3+4
, encap2+3
, encap3+4
, 和 vlan+srcmac
。
详情请查看表:
策略或网络层 | Layer2 | Layer2+3 | Layer3+4 | encap2+3 | encap3+4 | VLAN+srcmac |
使用 | 源和目的地 MAC 地址和以太网协议类型的 XOR | 源和目标 MAC 地址和 IP 地址的 XOR | 源和目标端口和 IP 地址的 XOR |
支持的隧道内的目的地 MAC 地址和 IP 地址的 XOR,如虚拟可扩展局域网 (VXLAN)。此模式依赖于 |
受支持的隧道内的目标端口和 IP 地址的 XOR,如 VXLAN。此模式依赖于 | VLAN ID 和源 MAC 厂商和源 MAC 设备的 XOR |
流量放置 | 在同一个底层网络接口上到特定网络对等的所有流量 | 同一底层网络接口上特定 IP 地址的所有流量 | 同一底层网络接口上特定 IP 地址和端口的所有流量 | |||
主要选择 | 如果网络流量在同一广播域中的这个系统和多个其他系统之间 | 如果此系统和多个其他系统间的网络流量会通过默认网关 | 如果此系统和其他系统之间的网络流量使用相同的 IP 地址,但会经历多个端口 | 封装的流量在源系统和多个其它系统中使用多个 IP 地址 | 封装的流量是源系统和其它使用多个端口号的系统间 | 如果绑定承载来自多个容器或虚拟机 (VM) 的网络流量,它会将其 MAC 地址直接公开给外部网络,如桥接网络,您无法配置模式 2 或模式 4 的交换机。 |
辅助选择 | 如果网络流量主要是此系统和默认网关后面的多个其他系统之间 | 如果网络流量主要是此系统和另一个系统间的 | ||||
Compliant | 802.3ad | 802.3ad | Not 802.3ad | |||
默认策略 | 如果没有提供配置,则这是默认策略 |
对于非 IP 流量,公式与 |
对于非 IP 流量,公式与 |
第 4 章 配置 VLAN 标记
Virtual Local Area Network (VLAN) 是物理网络中的一个逻辑网络。当 VLAN 接口通过接口时,VLAN 接口标签带有 VLAN ID 的数据包,并删除返回的数据包的标签。您可以在另一个接口(如以太网、绑定、团队或桥接设备)上创建 VLAN 接口。这些接口被称为父接口
。
Red Hat Enterprise Linux 为管理员提供不同的选项来配置 VLAN 设备。例如:
-
使用
nmcli
使用命令行配置 VLAN 标记。 - 通过 RHEL web 控制台使用 Web 浏览器配置 VLAN 标记。
-
使用
nmtui
在基于文本的用户界面中配置 VLAN 标记。 -
使用
nmstatectl
通过 Nmstate API 配置连接。 - 使用 RHEL 系统角色在一个或多个主机上自动化 VLAN 配置。
4.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=disable
和ipv6.method=disable
选项来确保它。否则,如果 DHCP 或 IPv6 自动配置在一段时间后失败,接口可能会关闭。
- 主机连接到的交换机被配置为支持 VLAN 标签。详情请查看您的交换机文档。
流程
显示网络接口:
nmcli device status
# nmcli device status DEVICE TYPE STATE CONNECTION enp1s0 ethernet disconnected enp1s0 bridge0 bridge connected bridge0 bond0 bond connected bond0 ...
Copy to Clipboard Copied! 创建 VLAN 接口。例如,要创建一个使用
enp1s0
作为其父接口,使用 VLAN ID10
标记数据包,名为vlan10
的 VLAN 接口,请输入:nmcli connection add type vlan con-name vlan10 ifname vlan10 vlan.parent enp1s0 vlan.id 10
# nmcli connection add type vlan con-name vlan10 ifname vlan10 vlan.parent enp1s0 vlan.id 10
Copy to Clipboard Copied! 请注意,VLAN 必须在范围
0
到4094
之间。默认情况下,VLAN 连接会继承上级接口的最大传输单元(MTU)。另外,还可设置不同的 MTU 值:
nmcli connection modify vlan10 ethernet.mtu 2000
# nmcli connection modify vlan10 ethernet.mtu 2000
Copy to Clipboard Copied! 配置 IPv4 设置:
要为
vlan10
连接设置静态 IPv4 地址、网络掩码、默认网关和 DNS 服务器设置,请输入:nmcli connection modify vlan10 ipv4.addresses '192.0.2.1/24' ipv4.gateway '192.0.2.254' ipv4.dns '192.0.2.253' ipv4.method manual
# nmcli connection modify vlan10 ipv4.addresses '192.0.2.1/24' ipv4.gateway '192.0.2.254' ipv4.dns '192.0.2.253' ipv4.method manual
Copy to Clipboard Copied! - 要使用 DHCP,不需要任何操作。
- 如果您计划将此 VLAN 设备用作其它设备的端口,则不需要任何操作。
配置 IPv6 设置:
要为
vlan10
连接设置静态 IPv6 地址、网络掩码、默认网关和 DNS 服务器设置,请输入:nmcli connection modify vlan10 ipv6.addresses '2001:db8:1::1/32' ipv6.gateway '2001:db8:1::fffe' ipv6.dns '2001:db8:1::fffd' ipv6.method manual
# nmcli connection modify vlan10 ipv6.addresses '2001:db8:1::1/32' ipv6.gateway '2001:db8:1::fffe' ipv6.dns '2001:db8:1::fffd' ipv6.method manual
Copy to Clipboard Copied! - 要使用无状态地址自动配置(SLAAC),不需要采取任何操作。
- 如果您计划将此 VLAN 设备用作其它设备的端口,则不需要任何操作。
激活连接:
nmcli connection up vlan10
# nmcli connection up vlan10
Copy to Clipboard Copied!
验证
验证设置:
ip -d addr show vlan10
# ip -d addr show vlan10 4: vlan10@enp1s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000 link/ether 52:54:00:72:2f:6e brd ff:ff:ff:ff:ff:ff promiscuity 0 vlan protocol 802.1Q id 10 <REORDER_HDR> numtxqueues 1 numrxqueues 1 gso_max_size 65536 gso_max_segs 65535 inet 192.0.2.1/24 brd 192.0.2.255 scope global noprefixroute vlan10 valid_lft forever preferred_lft forever inet6 2001:db8:1::1/32 scope global noprefixroute valid_lft forever preferred_lft forever inet6 fe80::8dd7:9030:6f8e:89e6/64 scope link noprefixroute valid_lft forever preferred_lft forever
Copy to Clipboard Copied!
4.2. 使用 nmcli
配置嵌套 VLAN
802.1ad 是用于虚拟局域网(VLAN)标记的协议。它也被称为 Q-in-Q 标记。您可以使用此技术在单个以太网框架中创建多个 VLAN 标签,以实现以下优点:
- 通过在 VLAN 中创建多个隔离网络段来提高网络可扩展性。这可让您将大型网络分段并组织成较小的、可管理的单元。
- 通过隔离和控制不同类型的网络流量,改进了流量管理。这可以提高网络性能并减少网络拥塞。
- 通过创建较小的,多个目标网络段,实现高效资源利用率。
- 通过隔离网络流量,降低未授权访问敏感数据的风险,提高了安全性。
先决条件
- 您计划用作虚拟 VLAN 接口的父接口支持 VLAN 标签。
如果您在绑定接口之上配置 VLAN:
- 绑定的端口是上线的。
-
这个绑定没有使用
fail_over_mac=follow
选项进行配置。VLAN 虚拟设备无法更改其 MAC 地址以匹配父设备的新 MAC 地址。在这种情况下,流量仍会与不正确的源 MAC 地址一同发送。 -
这个绑定通常不会预期从 DHCP 服务器或 IPv6 自动配置获取 IP 地址。在创建绑定时,通过设置
ipv4.method=disable
和ipv6.method=disable
选项来确保它。否则,如果 DHCP 或 IPv6 自动配置在一段时间后失败,接口可能会关闭。
- 主机连接到的交换机被配置为支持 VLAN 标签。详情请查看您的交换机文档。
流程
显示物理网络设备:
nmcli device status
# nmcli device status DEVICE TYPE STATE CONNECTION enp1s0 ethernet connected enp1s0 ...
Copy to Clipboard Copied! 创建基础 VLAN 接口。例如,要创建一个名为
vlan10
的基本 VLAN 接口,它使用enp1s0
作为其父接口,以及 VLAN ID 为10
的标记数据包,请输入:nmcli connection add type vlan con-name vlan10 dev enp1s0 vlan.id 10
# nmcli connection add type vlan con-name vlan10 dev enp1s0 vlan.id 10
Copy to Clipboard Copied! 请注意,VLAN 必须在范围
0
到4094
之间。默认情况下,VLAN 连接会继承上级接口的最大传输单元(MTU)。另外,还可设置不同的 MTU 值:
nmcli connection modify vlan10 ethernet.mtu 2000
# nmcli connection modify vlan10 ethernet.mtu 2000
Copy to Clipboard Copied! 在基本 VLAN 接口之上创建嵌套的 VLAN 接口:
nmcli connection add type vlan con-name vlan10.20 dev enp1s0.10 id 20 vlan.protocol 802.1ad
# nmcli connection add type vlan con-name vlan10.20 dev enp1s0.10 id 20 vlan.protocol 802.1ad
Copy to Clipboard Copied! 此命令会在父 VLAN 连接
vlan10
上创建一个新的 VLAN 连接,名称为vlan10.20
,VLAN ID 为20
。dev
选项指定父网络设备。在本例中,是enp1s0.10
。vlan.protocol
选项指定 VLAN 封装协议。在本例中,它是802.1ad
(Q-in-Q)。配置嵌套 VLAN 接口的 IPv4 设置:
- 要使用 DHCP,不需要任何操作。
要为
vlan10.20
连接设置静态 IPv4 地址、网络掩码、默认网关和 DNS 服务器设置,请输入:nmcli connection modify vlan10.20 ipv4.method manual ipv4.addresses 192.0.2.1/24 ipv4.gateway 192.0.2.254 ipv4.dns 192.0.2.200
# nmcli connection modify vlan10.20 ipv4.method manual ipv4.addresses 192.0.2.1/24 ipv4.gateway 192.0.2.254 ipv4.dns 192.0.2.200
Copy to Clipboard Copied!
配置嵌套 VLAN 接口的 IPv6 设置:
- 要使用无状态地址自动配置(SLAAC),不需要采取任何操作。
要为 vlan10 连接设置静态 IPv6 地址、网络掩码、默认网关和 DNS 服务器设置,请输入:
nmcli connection modify vlan10.20 ipv6.addresses '2001:db8:1::1/64' ipv6.gateway '2001:db8:1::fffe' ipv6.dns '2001:db8:1::fffd' ipv6.dns-search 'example.com' ipv6.method manual
# nmcli connection modify vlan10.20 ipv6.addresses '2001:db8:1::1/64' ipv6.gateway '2001:db8:1::fffe' ipv6.dns '2001:db8:1::fffd' ipv6.dns-search 'example.com' ipv6.method manual
Copy to Clipboard Copied!
激活配置文件:
nmcli connection up vlan10.20
# nmcli connection up vlan10.20
Copy to Clipboard Copied!
验证
验证嵌套 VLAN 接口的配置:
ip -d addr show enp1s0.10.20
# ip -d addr show enp1s0.10.20 10: enp1s0.10.20@enp1s0.10: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000 link/ether 52:54:00:d2:74:3e brd ff:ff:ff:ff:ff:ff promiscuity 0 minmtu 0 maxmtu 65535 vlan protocol 802.1ad id 20 <REORDER_HDR> numtxqueues 1 numrxqueues 1 gso_max_size 65536 gso_max_segs 65535 tso_max_size 65536 tso_max_segs 65535 gro_max_size 65536 inet 192.0.2.1/24 brd 192.0.2.255 scope global noprefixroute enp1s0.10.20 valid_lft forever preferred_lft forever inet6 2001:db8:1::1/32 scope global noprefixroute valid_lft forever preferred_lft forever inet6 fe80::ce3b:84c5:9ef8:d0e6/64 scope link noprefixroute valid_lft forever preferred_lft forever
Copy to Clipboard Copied!
4.3. 使用 RHEL web 控制台配置 VLAN 标记
如果您希望使用基于 Web 浏览器的界面管理网络设置,请使用 RHEL web 控制台配置 VLAN 标记。
先决条件
- 您计划用作虚拟 VLAN 接口的父接口支持 VLAN 标签。
如果您在绑定接口之上配置 VLAN:
- 绑定的端口是上线的。
-
这个绑定没有使用
fail_over_mac=follow
选项进行配置。VLAN 虚拟设备无法更改其 MAC 地址以匹配父设备的新 MAC 地址。在这种情况下,流量仍会与不正确的源 MAC 地址一同发送。 - 这个绑定通常不会预期从 DHCP 服务器或 IPv6 自动配置获取 IP 地址。禁用 IPv4 和 IPv6 协议创建绑定以确保它。否则,如果 DHCP 或 IPv6 自动配置在一段时间后失败,接口可能会关闭。
- 主机连接到的交换机被配置为支持 VLAN 标签。详情请查看您的交换机文档。
流程
- 在屏幕左侧的导航中选择 Networking 选项卡。
- 在 Interfaces 部分点 。
- 选择父设备。
- 输入 VLAN ID。
输入 VLAN 设备的名称,或保留自动生成的名称。
- 点 。
默认情况下,VLAN 设备使用动态 IP 地址。如果要设置静态 IP 地址:
- 点 Interfaces 部分中的 VLAN 设备名称。
- 点您要配置的协议旁的 Edit。
- 选择 Addresses 旁的 Manual,并输入 IP 地址、前缀和默认网关。
- 在 DNS 部分,点 按钮,并输入 DNS 服务器的 IP 地址。重复此步骤来设置多个 DNS 服务器。
- 在 DNS search domains 部分中,点 按钮并输入搜索域。
如果接口需要静态路由,请在 Routes 部分配置它们。
- 点
验证
在屏幕左侧的导航中选择 Networking 选项卡,并检查接口上是否有传入和传出流量:
4.4. 使用 nmtui
配置 VLAN 标记
nmtui
应用程序为 NetworkManager 提供了一个基于文本的用户界面。您可以使用 nmtui
在没有图形界面的主机上配置 VLAN 标签。
在 nmtui
中:
- 使用光标键导航。
- 选择一个按钮并按 Enter 键。
- 使用 空格 选择和清除复选框。
- 要返回上一个屏幕,请使用 ESC。
先决条件
- 您计划用作虚拟 VLAN 接口的父接口支持 VLAN 标签。
如果您在绑定接口之上配置 VLAN:
- 绑定的端口是上线的。
-
这个绑定没有使用
fail_over_mac=follow
选项进行配置。VLAN 虚拟设备无法更改其 MAC 地址以匹配父设备的新 MAC 地址。在这种情况下,流量仍会与不正确的源 MAC 地址一同发送。 -
这个绑定通常不会预期从 DHCP 服务器或 IPv6 自动配置获取 IP 地址。在创建绑定时,通过设置
ipv4.method=disable
和ipv6.method=disable
选项来确保它。否则,如果 DHCP 或 IPv6 自动配置在一段时间后失败,接口可能会关闭。
- 主机连接到的交换机被配置为支持 VLAN 标签。详情请查看您的交换机文档。
流程
如果您不知道要在其上配置 VLAN 标签的网络设备名称,请显示可用的设备:
nmcli device status
# nmcli device status DEVICE TYPE STATE CONNECTION enp1s0 ethernet unavailable -- ...
Copy to Clipboard Copied! 启动
nmtui
:nmtui
# nmtui
Copy to Clipboard Copied! - 选择 Edit a connection,然后按 Enter。
- 按 Add。
- 从网络类型列表中选择 VLAN,然后按 Enter 键。
可选:为要创建的 NetworkManager 配置集输入一个名称。
在有多个配置文件的主机上,有意义的名称可以更容易识别配置文件的用途。
- 在 Device 字段中输入要创建的 VLAN 设备名称。
- 在 Parent 字段中输入您要在其上配置 VLAN 标记的设备的名称。
-
输入 VLAN ID。ID 必须在
0
到4094
之间。 根据您的环境,相应地在 IPv4 configuration 和 IPv6 configuration 配置区域中配置 IP 地址。为此,请按这些区域旁边的按钮,并选择:
-
Disabled
,如果此 VLAN 设备不需要 IP 地址,或者您想要将其用作其它设备的端口。 -
Automatic
,如果 DHCP 服务器或无状态地址自动配置(SLAAC)将 IP 地址动态分配给 VLAN 设备。 Manual
,如果网络需要静态 IP 地址设置。在这种情况下,您必须填写更多字段:- 在您要配置的协议旁边按 Show 以显示其他字段。
按 Addresses 旁边的 Add,并输入无类别域间路由(CIDR)格式的 IP 地址和子网掩码。
如果没有指定子网掩码,NetworkManager 会为 IPv4 地址设置
/32
子网掩码,并为 IPv6 地址设置/64
。- 输入默认网关的地址。
- 按 DNS servers 旁边的 Add,并输入 DNS 服务器地址。
- 按 Search domains 旁边的 Add,并输入 DNS 搜索域。
图 4.1. 具有静态 IP 地址设置的 VLAN 连接示例
-
- 按 OK 创建并自动激活新连接。
- 按 Back 返回到主菜单。
-
选择 Quit,然后按 Enter 键关闭
nmtui
应用程序。
验证
验证设置:
ip -d addr show vlan10
# ip -d addr show vlan10 4: vlan10@enp1s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000 link/ether 52:54:00:72:2f:6e brd ff:ff:ff:ff:ff:ff promiscuity 0 vlan protocol 802.1Q id 10 <REORDER_HDR> numtxqueues 1 numrxqueues 1 gso_max_size 65536 gso_max_segs 65535 inet 192.0.2.1/24 brd 192.0.2.255 scope global noprefixroute vlan10 valid_lft forever preferred_lft forever inet6 2001:db8:1::1/32 scope global noprefixroute valid_lft forever preferred_lft forever inet6 fe80::8dd7:9030:6f8e:89e6/64 scope link noprefixroute valid_lft forever preferred_lft forever
Copy to Clipboard Copied!
4.5. 使用 nmstatectl
配置 VLAN 标记
使用 nmstatectl
工具通过 Nmstate API 配置 Virtual Local Area Network VLAN。Nmstate API 确保设置配置后结果与配置文件匹配。如果有任何失败,nmstatectl
会自动回滚更改以避免系统处于不正确的状态。
根据您的环境,相应地调整 YAML 文件。例如,要使用与 VLAN 中以太网适配器不同的设备,请调整您在 VLAN 中使用的端口的 base-iface
属性和 type
属性。
先决条件
- 要将以太网设备用作 VLAN 中的端口,必须在服务器中安装物理或者虚拟以太网设备。
-
nmstate
软件包已安装。
流程
创建一个包含以下内容的 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
--- interfaces: - name: vlan10 type: vlan state: up ipv4: enabled: true address: - ip: 192.0.2.1 prefix-length: 24 dhcp: false ipv6: enabled: true address: - ip: 2001:db8:1::1 prefix-length: 64 autoconf: false dhcp: false vlan: base-iface: enp1s0 id: 10 - name: enp1s0 type: ethernet state: up routes: config: - destination: 0.0.0.0/0 next-hop-address: 192.0.2.254 next-hop-interface: vlan10 - destination: ::/0 next-hop-address: 2001:db8:1::fffe next-hop-interface: vlan10 dns-resolver: config: search: - example.com server: - 192.0.2.200 - 2001:db8:1::ffbb
Copy to Clipboard Copied! 这些设置定义一个 ID 为 10 的 VLAN,它使用
enp1s0
设备。作为子设备,VLAN 连接有以下设置:-
静态 IPv4 地址 -
192.0.2.1
,子网掩码为/24
-
静态 IPv6 地址 -
2001:db8:1::1
,子网掩码为/64
-
IPv4 默认网关 -
192.0.2.254
-
IPv6 默认网关 -
2001:db8:1::fffe
-
IPv4 DNS 服务器 -
192.0.2.200
-
IPv6 DNS 服务器 -
2001:db8:1::ffbb
-
DNS 搜索域 -
example.com
-
静态 IPv4 地址 -
将设置应用到系统:
nmstatectl apply ~/create-vlan.yml
# nmstatectl apply ~/create-vlan.yml
Copy to Clipboard Copied!
验证
显示设备和连接的状态:
nmcli device status
# nmcli device status DEVICE TYPE STATE CONNECTION vlan10 vlan connected vlan10
Copy to Clipboard Copied! 显示连接配置集的所有设置:
nmcli connection show vlan10
# nmcli connection show vlan10 connection.id: vlan10 connection.uuid: 1722970f-788e-4f81-bd7d-a86bf21c9df5 connection.stable-id: -- connection.type: vlan connection.interface-name: vlan10 ...
Copy to Clipboard Copied! 以 YAML 格式显示连接设置:
nmstatectl show vlan10
# nmstatectl show vlan10
Copy to Clipboard Copied!
4.6. 使用 network
RHEL 系统角色配置 VLAN 标记
如果您的网络使用 Virtual Local Area Networks (VLAN)将网络流量分隔到逻辑网络中,请创建一个 NetworkManager 连接配置文件来配置 VLAN 标记。通过使用 Ansible 和 network
RHEL 系统角色,您可以自动化此过程,并在 playbook 中定义的主机上远程配置连接配置文件。
您可以使用 network
RHEL 系统角色配置 VLAN 标记,如果 VLAN 的父设备的连接配置文件不存在,则角色也可以创建它。
如果 VLAN 设备需要一个 IP 地址、默认网关和 DNS 设置,请在 VLAN 设备上,而不是在父设备上配置它们。
先决条件
- 您已准备好控制节点和受管节点
- 以可在受管主机上运行 playbook 的用户登录到控制节点。
-
您用于连接到受管节点的帐户对它们具有
sudo
权限。
流程
创建一个包含以下内容的 playbook 文件,如
~/playbook.yml
:--- - name: Configure the network hosts: managed-node-01.example.com tasks: - name: VLAN connection profile with Ethernet port ansible.builtin.include_role: name: redhat.rhel_system_roles.network vars: network_connections: # Ethernet profile - name: enp1s0 type: ethernet interface_name: enp1s0 autoconnect: yes state: up ip: dhcp4: no auto6: no # VLAN profile - name: enp1s0.10 type: vlan vlan: id: 10 ip: dhcp4: yes auto6: yes parent: enp1s0 state: up
--- - name: Configure the network hosts: managed-node-01.example.com tasks: - name: VLAN connection profile with Ethernet port ansible.builtin.include_role: name: redhat.rhel_system_roles.network vars: network_connections: # Ethernet profile - name: enp1s0 type: ethernet interface_name: enp1s0 autoconnect: yes state: up ip: dhcp4: no auto6: no # VLAN profile - name: enp1s0.10 type: vlan vlan: id: 10 ip: dhcp4: yes auto6: yes parent: enp1s0 state: up
Copy to Clipboard Copied! 示例 playbook 中指定的设置包括:
type: <profile_type>
- 设置要创建的配置文件的类型。示例 playbook 创建两个连接配置文件:一个用于父以太网设备,另一个用于 VLAN 设备。
dhcp4: <value>
-
如果设置为
yes
,则启用从 DHCP、PPP 或类似服务的自动 IPv4 地址分配。禁用父设备上的 IP 地址配置。 auto6: <value>
-
如果设置为
yes
,则启用 IPv6 自动配置。在这种情况下,NetworkManager 默认使用路由器公告,如果路由器宣布managed
标志,则 NetworkManager 会从 DHCPv6 服务器请求 IPv6 地址和前缀。禁用父设备上的 IP 地址配置。 parent: <parent_device>
- 设置 VLAN 连接配置文件的父设备。在示例中,父设备是以太网接口。
有关 playbook 中使用的所有变量的详情,请查看控制节点上的
/usr/share/ansible/roles/rhel-system-roles.network/README.md
文件。验证 playbook 语法:
ansible-playbook --syntax-check ~/playbook.yml
$ ansible-playbook --syntax-check ~/playbook.yml
Copy to Clipboard Copied! 请注意,这个命令只验证语法,不能防止错误的、但有效的配置。
运行 playbook:
ansible-playbook ~/playbook.yml
$ ansible-playbook ~/playbook.yml
Copy to Clipboard Copied!
验证
验证 VLAN 设置:
ansible managed-node-01.example.com -m command -a 'ip -d addr show enp1s0.10'
# ansible managed-node-01.example.com -m command -a 'ip -d addr show enp1s0.10' managed-node-01.example.com | CHANGED | rc=0 >> 4: vlan10@enp1s0.10: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000 link/ether 52:54:00:72:2f:6e brd ff:ff:ff:ff:ff:ff promiscuity 0 vlan protocol 802.1Q id 10 <REORDER_HDR> numtxqueues 1 numrxqueues 1 gso_max_size 65536 gso_max_segs 65535 ...
Copy to Clipboard Copied!
第 5 章 配置网络桥接
网络桥接是一个链路层设备,它可根据 MAC 地址列表转发网络间的流量。网桥通过侦听网络流量并了解连接到每个网络的主机来构建 MAC 地址表。例如,您可以使用 Red Hat Enterprise Linux 主机上的软件桥接模拟硬件桥接或在虚拟化环境中,将虚拟机(VM)集成到与主机相同的网络中。
桥接需要在桥接应该连接的每个网络中有一个网络设备。当您配置网桥时,网桥被称为 controller
,其使用的设备为。
您可以在不同类型的设备中创建桥接,例如:
- 物理和虚拟以太网设备
- 网络绑定
- 网络团队(team)
- VLAN 设备
由于 IEEE 802.11 标准指定在 Wi-Fi 中使用 3 个地址帧以便有效地使用随机时间,您无法通过 Ad-Hoc 或者 Infrastructure 模式中的 Wi-Fi 网络配置网桥。
Red Hat Enterprise Linux 为管理员提供不同的选项来配置网桥设备。例如:
-
使用
nmcli
使用命令行配置 VLAN 标记。 - 通过 RHEL web 控制台使用 Web 浏览器配置 VLAN 标记。
-
使用
nmtui
在基于文本的用户界面中配置 VLAN 标记。 -
使用
nmstatectl
通过 Nmstate API 配置连接。 - 使用 RHEL 系统角色在一个或多个主机上自动化 VLAN 配置。
5.1. 使用 nmcli
配置网桥
要在命令行上配置网桥,请使用 nmcli
工具。
先决条件
- 在服务器中安装两个或者两个以上物理或者虚拟网络设备。
- 要将以太网设备用作网桥的端口,必须在服务器中安装物理或者虚拟以太网设备。
要将绑定或 VLAN 设备用作网桥的端口,您可以在创建桥接时创建这些设备,或者预先创建它们,如下所述:
流程
创建网桥接口:
nmcli connection add type bridge con-name bridge0 ifname bridge0
# nmcli connection add type bridge con-name bridge0 ifname bridge0
Copy to Clipboard Copied! 此命令创建名为
bridge0
的网桥。显示网络接口,并记录您要添加到网桥中的接口名称:
nmcli device status
# nmcli device status DEVICE TYPE STATE CONNECTION enp7s0 ethernet disconnected -- enp8s0 ethernet disconnected -- bond0 bond connected bond0 bond1 bond connected bond1 ...
Copy to Clipboard Copied! 在本例中:
-
没有配置
enp7s0
和enp8s0
。要将这些设备用作端口,请在下一步中添加连接配置集。 -
bond0
和bond1
已有连接配置文件。要将这些设备用作端口,请在下一步中修改其配置集。
-
没有配置
将接口分配给网桥。
如果没有配置您要分配给网桥的接口,为其创建新的连接配置集:
nmcli connection add type ethernet port-type bridge con-name bridge0-port1 ifname enp7s0 controller bridge0 nmcli connection add type ethernet port-type bridge con-name bridge0-port2 ifname enp8s0 controller bridge0
# nmcli connection add type ethernet port-type bridge con-name bridge0-port1 ifname enp7s0 controller bridge0 # nmcli connection add type ethernet port-type bridge con-name bridge0-port2 ifname enp8s0 controller bridge0
Copy to Clipboard Copied! 这些命令为
enp7s0
和enp8s0
创建配置文件,并将它们添加到bridge0
连接中。如果要将现有的连接配置文件分配给网桥:
将这些连接的
master
参数设为bridge0
:nmcli connection modify bond0 master bridge0 nmcli connection modify bond1 master bridge0
# nmcli connection modify bond0 master bridge0 # nmcli connection modify bond1 master bridge0
Copy to Clipboard Copied! 这些命令将名为
bond0
和bond1
的现有连接配置文件分配给bridge0
连接。重新激活连接:
nmcli connection up bond0 nmcli connection up bond1
# nmcli connection up bond0 # nmcli connection up bond1
Copy to Clipboard Copied!
配置 IPv4 设置:
要为
bridge0
连接设置静态 IPv4 地址、网络掩码、默认网关和 DNS 服务器设置,请输入:nmcli connection modify bridge0 ipv4.addresses '192.0.2.1/24' ipv4.gateway '192.0.2.254' ipv4.dns '192.0.2.253' ipv4.dns-search 'example.com' ipv4.method manual
# nmcli connection modify bridge0 ipv4.addresses '192.0.2.1/24' ipv4.gateway '192.0.2.254' ipv4.dns '192.0.2.253' ipv4.dns-search 'example.com' ipv4.method manual
Copy to Clipboard Copied! - 要使用 DHCP,不需要任何操作。
- 如果您计划将此网桥设备用作其它设备的端口,则不需要任何操作。
配置 IPv6 设置:
要为
bridge0
连接设置静态 IPv6 地址、网络掩码、默认网关和 DNS 服务器设置,请输入:nmcli connection modify bridge0 ipv6.addresses '2001:db8:1::1/64' ipv6.gateway '2001:db8:1::fffe' ipv6.dns '2001:db8:1::fffd' ipv6.dns-search 'example.com' ipv6.method manual
# nmcli connection modify bridge0 ipv6.addresses '2001:db8:1::1/64' ipv6.gateway '2001:db8:1::fffe' ipv6.dns '2001:db8:1::fffd' ipv6.dns-search 'example.com' ipv6.method manual
Copy to Clipboard Copied! - 要使用无状态地址自动配置(SLAAC),不需要采取任何操作。
- 如果您计划将此网桥设备用作其它设备的端口,则不需要任何操作。
可选:配置网桥的其他属性。例如,要将
bridge0
的生成树协议(STP)优先级设为16384
,请输入:nmcli connection modify bridge0 bridge.priority '16384'
# nmcli connection modify bridge0 bridge.priority '16384'
Copy to Clipboard Copied! 默认情况下启用 STP。
激活连接:
nmcli connection up bridge0
# nmcli connection up bridge0
Copy to Clipboard Copied! 验证端口是否已连接,并且
CONNECTION
列是否显示端口的连接名称:nmcli device
# nmcli device DEVICE TYPE STATE CONNECTION ... enp7s0 ethernet connected bridge0-port1 enp8s0 ethernet connected bridge0-port2
Copy to Clipboard Copied! 当您激活连接的任何端口时,NetworkManager 也会激活网桥,但不会激活它的其它端口。您可以配置 Red Hat Enterprise Linux 在启用桥接时自动启用所有端口:
启用网连接的
connection.autoconnect-ports
参数:nmcli connection modify bridge0 connection.autoconnect-ports 1
# nmcli connection modify bridge0 connection.autoconnect-ports 1
Copy to Clipboard Copied! 重新激活桥接:
nmcli connection up bridge0
# nmcli connection up bridge0
Copy to Clipboard Copied!
验证
使用
ip
工具来显示作为特定网桥端口的以太网设备的链接状态:ip link show master 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
Copy to Clipboard Copied! 使用
bridge
工具来显示作为任意网桥设备端口的以太网设备状态:bridge link show
# bridge link show 3: enp7s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 master bridge0 state forwarding priority 32 cost 100 4: enp8s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 master bridge0 state listening priority 32 cost 100 5: enp9s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 master bridge1 state forwarding priority 32 cost 100 6: enp11s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 master bridge1 state blocking priority 32 cost 100 ...
Copy to Clipboard Copied! 要显示特定以太网设备的状态,请使用
bridge link show dev <ethernet_device_name>
命令。
5.2. 使用 RHEL web 控制台配置网桥
如果您希望通过基于 Web 浏览器的界面管理网络设置,请使用 RHEL web 控制台来配置网桥。
前提条件
- 在服务器中安装两个或者两个以上物理或者虚拟网络设备。
- 要将以太网设备用作网桥的端口,必须在服务器中安装物理或者虚拟以太网设备。
要将绑定或 VLAN 设备用作网桥的端口,您可以在创建桥接时创建这些设备,或者预先创建它们,如下所述:
流程
- 在屏幕左侧的导航中选择 Networking 选项卡。
- 在 Interfaces 部分点 。
- 输入您要创建的网桥设备名称。
- 选择应该是网桥端口的接口。
可选:启用 Spanning tree 协议(STP) 功能,以避免桥循环和广播辐射。
- 点 。
默认情况下,网桥使用动态 IP 地址。如果要设置静态 IP 地址:
- 在 Interfaces 部分,点网桥的名称。
- 点您要配置的协议旁的 Edit。
- 选择 Addresses 旁的 Manual,并输入 IP 地址、前缀和默认网关。
- 在 DNS 部分,点 按钮,并输入 DNS 服务器的 IP 地址。重复此步骤来设置多个 DNS 服务器。
- 在 DNS search domains 部分中,点 按钮并输入搜索域。
如果接口需要静态路由,请在 Routes 部分配置它们。
- 点
验证
在屏幕左侧的导航中选择 Networking 选项卡,并检查接口上是否有传入和传出流量:
5.3. 使用 nmtui
配置网桥
nmtui
应用程序为 NetworkManager 提供了一个基于文本的用户界面。您可以使用 nmtui
在没有图形界面的主机上配置网桥。
在 nmtui
中:
- 使用光标键导航。
- 选择一个按钮并按 Enter 键。
- 使用 空格 选择和清除复选框。
- 要返回上一个屏幕,请使用 ESC。
先决条件
- 在服务器中安装两个或者两个以上物理或者虚拟网络设备。
- 要将以太网设备用作网桥的端口,必须在服务器中安装物理或者虚拟以太网设备。
流程
如果您不知道您要在其上配置网桥的网络设备名称,请显示可用的设备:
nmcli device status
# nmcli device status DEVICE TYPE STATE CONNECTION enp7s0 ethernet unavailable -- enp8s0 ethernet unavailable -- ...
Copy to Clipboard Copied! 启动
nmtui
:nmtui
# nmtui
Copy to Clipboard Copied! -
选择
Edit a connection
,点 Enter。 -
按
Add
。 -
从网络类型列表中选择
Bridge
,然后按 Enter 。 可选:为要创建的 NetworkManager 配置集输入一个名称。
在有多个配置文件的主机上,有意义的名称可以更容易识别配置文件的用途。
-
在
Device
字段中输入要创建的网桥设备名称。 将端口添加到要创建的网桥中:
-
按
Ports
列表旁边的Add
。 -
选择您要作为端口添加到网桥的接口类型,例如
Ethernet
。 - 可选:为这个网桥端口输入要创建的 NetworkManager 配置文件的名称。
-
在
Device
字段中输入端口的设备名称。 按
OK
返回到网桥设置窗口。图 5.1. 将以太网设备作为端口添加到网桥
- 重复这些步骤,来向网桥添加更多的端口。
-
按
根据您的环境,相应地在
IPv4 configuration
和IPv6 configuration
区中配置 IP 地址。为此,请按这些区域旁边的按钮,并选择:-
Disabled
,如果网桥不需要 IP 地址。 -
Automatic
,如果 DHCP 服务器或无状态地址自动配置(SLAAC)动态将 IP 地址分配给网桥。 Manual
,如果网络需要静态 IP 地址设置。在这种情况下,您必须填写更多字段:-
按您要配置的协议旁边的
Show
来显示其他字段。 按
Addresses
旁边的Add
,并输入无类别域间路由(CIDR)格式的 IP 地址和子网掩码。如果没有指定子网掩码,NetworkManager 会为 IPv4 地址设置
/32
子网掩码,并为 IPv6 地址设置/64
。- 输入默认网关的地址。
-
按
DNS servers
旁边的Add
,并输入 DNS 服务器地址。 -
按
Search domains
旁边的Add
,并输入 DNS 搜索域。
-
按您要配置的协议旁边的
图 5.2. 没有 IP 地址设置的网桥连接的示例
-
-
按
OK
创建并自动激活新连接。 -
按
Back
返回到主菜单。 -
选择
Quit
,然后按 Enter 键关闭nmtui
应用程序。
验证
使用
ip
工具来显示作为特定网桥端口的以太网设备的链接状态:ip link show master 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
Copy to Clipboard Copied! 使用
bridge
工具来显示作为任意网桥设备端口的以太网设备状态:bridge link show
# bridge link show 3: enp7s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 master bridge0 state forwarding priority 32 cost 100 4: enp8s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 master bridge0 state listening priority 32 cost 100 ...
Copy to Clipboard Copied! 要显示特定以太网设备的状态,请使用
bridge link show dev <ethernet_device_name>
命令。
5.4. 使用 nmstatectl
配置网桥
使用 nmstatectl
工具通过 Nmstate API 配置网桥。Nmstate API 确保设置配置后结果与配置文件匹配。如果有任何失败,nmstatectl
会自动回滚更改以避免系统处于不正确的状态。
根据您的环境,相应地调整 YAML 文件。例如,要使用与网桥中以太网适配器不同的设备,请调整您在网桥中使用的端口的 base-iface
属性和 type
属性。
先决条件
- 在服务器中安装两个或者两个以上物理或者虚拟网络设备。
- 要将以太网设备用作网桥中的端口,必须在服务器中安装物理或者虚拟以太网设备。
-
要使用团队、绑定或 VLAN 设备作为网桥中的端口,请在
port
列表中设置接口名称,并定义对应的接口。 -
nmstate
软件包已安装。
流程
创建一个包含以下内容的 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
--- interfaces: - name: bridge0 type: linux-bridge state: up ipv4: enabled: true address: - ip: 192.0.2.1 prefix-length: 24 dhcp: false ipv6: enabled: true address: - ip: 2001:db8:1::1 prefix-length: 64 autoconf: false dhcp: false bridge: options: stp: enabled: true port: - name: enp1s0 - name: enp7s0 - name: enp1s0 type: ethernet state: up - name: enp7s0 type: ethernet state: up routes: config: - destination: 0.0.0.0/0 next-hop-address: 192.0.2.254 next-hop-interface: bridge0 - destination: ::/0 next-hop-address: 2001:db8:1::fffe next-hop-interface: bridge0 dns-resolver: config: search: - example.com server: - 192.0.2.200 - 2001:db8:1::ffbb
Copy to Clipboard Copied! 这些设置使用以下设置定义一个网桥:
-
网桥中的网络接口:
enp1s0
和enp7s0
- Spanning Tree Protocol (STP): 启用
-
静态 IPv4 地址:
192.0.2.1
,子网掩码为/24
-
静态 IPv6 地址:
2001:db8:1::1
,子网掩码为/64
-
IPv4 默认网关:
192.0.2.254
-
IPv6 默认网关:
2001:db8:1::fffe
-
IPv4 DNS 服务器:
192.0.2.200
-
IPv6 DNS 服务器:
2001:db8:1::ffbb
-
DNS 搜索域:
example.com
-
网桥中的网络接口:
将设置应用到系统:
nmstatectl apply ~/create-bridge.yml
# nmstatectl apply ~/create-bridge.yml
Copy to Clipboard Copied!
验证
显示设备和连接的状态:
nmcli device status
# nmcli device status DEVICE TYPE STATE CONNECTION bridge0 bridge connected bridge0
Copy to Clipboard Copied! 显示连接配置集的所有设置:
nmcli connection show bridge0
# nmcli connection show bridge0 connection.id: bridge0_ connection.uuid: e2cc9206-75a2-4622-89cf-1252926060a9 connection.stable-id: -- connection.type: bridge connection.interface-name: bridge0 ...
Copy to Clipboard Copied! 以 YAML 格式显示连接设置:
nmstatectl show bridge0
# nmstatectl show bridge0
Copy to Clipboard Copied!
5.5. 使用 network
RHEL 系统角色配置网桥
您可以通过创建网桥,在 Open Systems Interconnection (OSI)模型的第 2 层上连接多个网络。要配置网桥,请在 NetworkManager 中创建一个连接配置文件。通过使用 Ansible 和 network
RHEL 系统角色,您可以自动化此过程,并在 playbook 中定义的主机上远程配置连接配置文件。
您可以使用 network
RHEL 系统角色配置网桥,如果网桥的父设备的连接配置文件不存在,则角色也可以创建它。
如果要为网桥分配 IP 地址、网关和 DNS 设置,请在网桥上,而不是在其端口上配置它们。
先决条件
- 您已准备好控制节点和受管节点
- 以可在受管主机上运行 playbook 的用户登录到控制节点。
-
您用于连接到受管节点的帐户对它们具有
sudo
权限。 - 在服务器中安装两个或者两个以上物理或者虚拟网络设备。
流程
创建一个包含以下内容的 playbook 文件,如
~/playbook.yml
:--- - name: Configure the network hosts: managed-node-01.example.com tasks: - name: Bridge connection profile with two Ethernet ports ansible.builtin.include_role: name: redhat.rhel_system_roles.network vars: network_connections: # Bridge profile - name: bridge0 type: bridge interface_name: bridge0 ip: dhcp4: yes auto6: yes state: up # Port profile for the 1st Ethernet device - name: bridge0-port1 interface_name: enp7s0 type: ethernet controller: bridge0 port_type: bridge state: up # Port profile for the 2nd Ethernet device - name: bridge0-port2 interface_name: enp8s0 type: ethernet controller: bridge0 port_type: bridge state: up
--- - name: Configure the network hosts: managed-node-01.example.com tasks: - name: Bridge connection profile with two Ethernet ports ansible.builtin.include_role: name: redhat.rhel_system_roles.network vars: network_connections: # Bridge profile - name: bridge0 type: bridge interface_name: bridge0 ip: dhcp4: yes auto6: yes state: up # Port profile for the 1st Ethernet device - name: bridge0-port1 interface_name: enp7s0 type: ethernet controller: bridge0 port_type: bridge state: up # Port profile for the 2nd Ethernet device - name: bridge0-port2 interface_name: enp8s0 type: ethernet controller: bridge0 port_type: bridge state: up
Copy to Clipboard Copied! 示例 playbook 中指定的设置包括如下:
type: <profile_type>
- 设置要创建的配置文件的类型。示例 playbook 创建三个连接配置文件:一个用于网桥,两个用于以太网设备。
dhcp4: yes
- 启用来自 DHCP、PPP 或类似服务的自动 IPv4 地址分配。
auto6: yes
-
启用 IPv6 自动配置。默认情况下,NetworkManager 使用路由器公告。如果路由器宣布
managed
标记,则 NetworkManager 会从 DHCPv6 服务器请求 IPv6 地址和前缀。
有关 playbook 中使用的所有变量的详情,请查看控制节点上的
/usr/share/ansible/roles/rhel-system-roles.network/README.md
文件。验证 playbook 语法:
ansible-playbook --syntax-check ~/playbook.yml
$ ansible-playbook --syntax-check ~/playbook.yml
Copy to Clipboard Copied! 请注意,这个命令只验证语法,不能防止错误的、但有效的配置。
运行 playbook:
ansible-playbook ~/playbook.yml
$ ansible-playbook ~/playbook.yml
Copy to Clipboard Copied!
验证
显示作为特定网桥端口的以太网设备的链接状态:
ansible managed-node-01.example.com -m command -a 'ip link show master bridge0'
# ansible managed-node-01.example.com -m command -a 'ip link show master bridge0' managed-node-01.example.com | CHANGED | rc=0 >> 3: enp7s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel master bridge0 state UP mode DEFAULT group default qlen 1000 link/ether 52:54:00:62:61:0e brd ff:ff:ff:ff:ff:ff 4: enp8s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel master bridge0 state UP mode DEFAULT group default qlen 1000 link/ether 52:54:00:9e:f1:ce brd ff:ff:ff:ff:ff:ff
Copy to Clipboard Copied! 显示作为任意网桥设备的端口的以太网设备状态:
ansible managed-node-01.example.com -m command -a 'bridge link show'
# ansible managed-node-01.example.com -m command -a 'bridge link show' managed-node-01.example.com | CHANGED | rc=0 >> 3: enp7s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 master bridge0 state forwarding priority 32 cost 100 4: enp8s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 master bridge0 state listening priority 32 cost 100
Copy to Clipboard Copied!
第 6 章 设置 IPsec VPN
虚拟专用网络(VPN)是一种通过互联网连接到本地网络的方法。Libreswan
提供的 IPsec
是创建 VPN 的首选方法。libreswan
是 VPN 的用户空间 IPsec
实现。VPN 通过在中间网络(如互联网)设置隧道来启用 LAN 和另一个远程 LAN 之间的通信。为了安全起见,VPN 隧道总是使用认证和加密。对于加密操作,Libreswan
使用 NSS
库。
6.1. libreswan 作为 IPsec VPN 的实现
在 RHEL 中,您可以使用 Libreswan 应用程序支持的 IPsec 协议配置虚拟专用网络(VPN)。Libreswan 是 Openswan 应用程序的延续,Openswan 文档中的许多示例可以通过 Libreswan 交换。
VPN 的 IPsec 协议使用互联网密钥交换(IKE)协议进行配置。术语 IPsec 和 IKE 可互换使用。IPsec VPN 也称为 IKE VPN、IKEv2 VPN、XAUTH VPN、Cisco VPN 或 IKE/IPsec VPN。
libreswan 是一个开源用户空间 IKE 实现。IKE v1 和 v2 作为用户级别的守护进程实现。IKE 协议也加密。IPsec 协议由 Linux 内核实现,Libreswan 配置内核以添加和删除 VPN 隧道配置。
IKE 协议使用 UDP 端口 500 和 4500。IPsec 协议由两个协议组成:
- 封装安全性 Payload(ESP),其协议号为 50。
- 经过身份验证的标头(AH),其协议号为 51。
不建议使用 AH 协议。建议将 AH 用户迁移到使用 null 加密的 ESP。
IPsec 协议提供两种操作模式:
- 隧道模式(默认)
- 传输模式
您可以用没有 IKE 的 IPsec 来配置内核。这称为 手动键控。您还可以使用 ip xfrm
命令来配置手动密钥,但为了安全起见,强烈建议您不要这样做。Libreswan 使用 Netlink 接口与 Linux 内核进行通信。内核执行数据包加密和解密。
Libreswan 使用网络安全服务 (NSS) 加密库。
IKE/IPsec VPN(由 Libreswan 和 Linux 内核实现)是 RHEL 中推荐的唯一 VPN 技术。在不了解这样做风险的情况下不要使用任何其他 VPN 技术。
在 RHEL 中,Libreswan 默认遵循系统范围的加密策略。这样可确保 Libreswan 将当前威胁模型包括(IKEv2)的安全设置用作默认协议。如需更多信息,请参阅 使用系统范围的加密策略。
Libreswan 没有使用术语"源(source)"和"目的地(destination)"或"服务器(server)"和"客户端(client)",因为 IKE/IPsec 使用对等(peer to peer)协议。相反,它使用术语"左"和"右"来指端点(主机)。这也允许您在大多数情况下在两个端点使用相同的配置。但是,管理员通常选择始终对本地主机使用"左",对远程主机使用"右"。
leftid
和 rightid
选项充当身份验证过程中相应主机的标识。详情请查看 ipsec.conf(5)
手册页。
6.2. Libreswan 中的身份验证方法
Libreswan 支持多种身份验证方法,每种方法适合不同的场景。
- 预共享密钥(PSK)
-
预共享密钥 (PSK)是最简单的身份验证方法。出于安全考虑,请勿使用小于 64 个随机字符的 PSK。在 FIPS 模式中,PSK 必须符合最低强度要求,具体取决于所使用的完整性算法。您可以使用
authby=secret
连接来设置 PSK。 - 原始 RSA 密钥
原始 RSA 密钥 通常用于静态主机到主机或子网到子网 IPsec 配置。每个主机都使用所有其他主机的公共 RSA 密钥手动配置,Libreswan 在每对主机之间建立 IPsec 隧道。对于大量主机,这个方法不能很好地扩展。
您可以使用
ipsec newhostkey
命令在主机上生成原始 RSA 密钥。您可以使用ipsec showhostkey
命令列出生成的密钥。使用 CKA ID 密钥的连接配置需要leftrsasigkey=
行。原始 RSA 密钥使用authby=rsasig
连接选项。- X.509 证书
X.509 证书 通常用于大规模部署连接到通用 IPsec 网关的主机。中心 证书颁发机构 (CA)为主机或用户签署 RSA 证书。此中央 CA 负责中继信任,包括单个主机或用户的撤销。
例如,您可以使用
openssl
命令和 NSScertutil
命令来生成 X.509 证书。因为 Libreswan 使用leftcert=
配置选项中证书的昵称从 NSS 数据库读取用户证书,所以在创建证书时请提供昵称。如果使用自定义 CA 证书,则必须将其导入到网络安全服务(NSS)数据库中。您可以使用
ipsec import
命令将 PKCS #12 格式的任何证书导入到 Libreswan NSS 数据库。警告Libreswan 需要互联网密钥交换(IKE)对等 ID 作为每个对等证书的主题替代名称(SAN),如 RFC 4945 的 3.1 章节 所述。通过设置
require-id-on-certificate=no
connection 选项禁用此检查,可能会导致系统容易受到中间人攻击。使用
authby=rsasig
连接选项,根据使用带 SHA-2 的 RSA 的 X.509 证书进行身份验证。您可以通过将authby=
设为ecdsa
,使用 SHA-2 ,以及使用通过authby=rsa-sha2
的基于 SHA-2 的身份验证的 RSA 概率签名方案(RSASSA-PSS)数字签名来进一步限制 ECDSA 数字签名。IKEv2 peer 身份验证的默认值为authby=rsasig,ecdsa
。证书和
authby=
签名方法应匹配。这提高了互操作性,并在一个数字签名系统中保留身份验证。- NULL 身份验证
-
NULL 身份验证 用来在没有身份验证的情况下获得网状加密。它可防止被动攻击,但不能防止主动攻击。但是,因为 IKEv2 允许非对称身份验证方法,因此 NULL 身份验证也可用于互联网规模的机会主义 IPsec。在此模型中,客户端对服务器进行身份验证,但服务器不对客户端进行身份验证。此模型类似于使用 TLS 的安全网站。使用
authby=null
进行 NULL 身份验证。 - 保护量子计算机
除了上述身份验证方法外,您还可以使用 Post-quantum Pre-shared Key (PPK)方法来防止量子计算机可能的攻击。单个客户端或客户端组可以通过指定与带外配置的预共享密钥对应的 PPK ID 来使用它们自己的 PPK。
使用带有预共享密钥的 IKEv1 防止量子攻击者。重新设计 IKEv2 不会原生提供这种保护。Libreswan 提供使用 Post-quantum Pre-shared Key (PPK)来保护 IKEv2 连接免受量子攻击。
要启用可选的 PPK 支持,请在连接定义中添加
ppk=yes
。如需要 PPK,请添加ppk=insist
。然后,可以给每个客户端一个带有 secret 值的 PPK ID ,该 secret 值在带外进行通信(最好是量子安全的)。PPK 应该具有很强的随机性,而不是基于字典中的单词。PPK ID 和 PPK 数据保存在ipsec.secrets
文件中,例如:@west @east : PPKS "user1" "thestringismeanttobearandomstr"
@west @east : PPKS "user1" "thestringismeanttobearandomstr"
Copy to Clipboard Copied! PPKS
选项指的是静态 PPK。这个实验性功能使用基于一次性平板的动态 PPK。在每个连接中,一次性平板的一个新部件用作 PPK。当使用时,文件中动态 PPK 的那部分被零覆盖,以防止重复使用。如果没有剩下一次性资源,连接会失败。详情请查看ipsec.secrets(5)
手册页。
6.3. 安装 Libreswan
在通过 Libreswan IPsec/IKE 实现设置 VPN 之前,您必须安装相应的软件包,启动 ipsec
服务,并在防火墙中允许服务。
先决条件
-
AppStream
存储库已启用。
流程
安装
libreswan
软件包:dnf install libreswan
# dnf install libreswan
Copy to Clipboard Copied! 如果要重新安装 Libreswan,请删除其旧的数据库文件,并创建一个新的数据库:
systemctl stop ipsec rm /var/lib/ipsec/nss/*db ipsec initnss
# systemctl stop ipsec # rm /var/lib/ipsec/nss/*db # ipsec initnss
Copy to Clipboard Copied! 启动
ipsec
服务,并启用该服务,以便其在引导时自动启动:systemctl enable ipsec --now
# systemctl enable ipsec --now
Copy to Clipboard Copied! 通过添加
ipsec
服务,将防火墙配置为允许 IKE、ESP 和 AH 协议的 500 和 4500/UDP 端口:firewall-cmd --add-service="ipsec" firewall-cmd --runtime-to-permanent
# firewall-cmd --add-service="ipsec" # firewall-cmd --runtime-to-permanent
Copy to Clipboard Copied!
6.4. 创建主机到主机的 VPN
您可以使用原始 RSA 密钥身份验证将 Libreswan 配置为在两个称为 left 和 right 的主机之间创建主机到主机的 IPsec VPN。
先决条件
-
Libreswan 已安装 ,并在每个节点上启动了
ipsec
服务。
流程
在每台主机上生成原始 RSA 密钥对:
ipsec newhostkey
# ipsec newhostkey
Copy to Clipboard Copied! 上一步返回生成的密钥的
ckaid
。在 左 主机上使用ckaid
和以下命令,例如:ipsec showhostkey --left --ckaid 2d3ea57b61c9419dfd6cf43a1eb6cb306c0e857d
# ipsec showhostkey --left --ckaid 2d3ea57b61c9419dfd6cf43a1eb6cb306c0e857d
Copy to Clipboard Copied! 上一命令的输出生成了配置所需的
leftrsasigkey=
行。在第二台主机(右)上执行相同的操作:ipsec showhostkey --right --ckaid a9e1f6ce9ecd3608c24e8f701318383f41798f03
# ipsec showhostkey --right --ckaid a9e1f6ce9ecd3608c24e8f701318383f41798f03
Copy to Clipboard Copied! 在
/etc/ipsec.d/
目录中,创建一个新的my_host-to-host.conf
文件。将上一步中ipsec showhostkey
命令的输出中的 RSA 主机密钥写入新文件。例如:conn mytunnel leftid=@west left=192.1.2.23 leftrsasigkey=0sAQOrlo+hOafUZDlCQmXFrje/oZm [...] W2n417C/4urYHQkCvuIQ== rightid=@east right=192.1.2.45 rightrsasigkey=0sAQO3fwC6nSSGgt64DWiYZzuHbc4 [...] D/v8t5YTQ== authby=rsasig
conn mytunnel leftid=@west left=192.1.2.23 leftrsasigkey=0sAQOrlo+hOafUZDlCQmXFrje/oZm [...] W2n417C/4urYHQkCvuIQ== rightid=@east right=192.1.2.45 rightrsasigkey=0sAQO3fwC6nSSGgt64DWiYZzuHbc4 [...] D/v8t5YTQ== authby=rsasig
Copy to Clipboard Copied! 导入密钥后,重启
ipsec
服务:systemctl restart ipsec
# systemctl restart ipsec
Copy to Clipboard Copied! 加载连接:
ipsec add mytunnel
# ipsec add mytunnel
Copy to Clipboard Copied! 建立隧道:
ipsec up mytunnel
# ipsec up mytunnel
Copy to Clipboard Copied! 要在
ipsec
服务启动时自动启动隧道,请在连接定义中添加以下行:auto=start
auto=start
Copy to Clipboard Copied! - 如果您在带有 DHCP 或无状态地址自动配置(SLAAC)的网络中使用此主机,则连接可能会受到重定向的影响。有关详情和缓解步骤,请参阅将 VPN 连接分配给专用路由表,以防止连接绕过隧道。
6.5. 配置站点到站点的 VPN
要创建站点到站点的 IPsec VPN,通过加入两个网络,在两个主机之间创建一个 IPsec 隧道。主机因此充当端点,它们配置为允许来自一个或多个子网的流量通过。因此您可以将主机视为到网络远程部分的网关。
站点到站点 VPN 的配置只能与主机到主机 VPN 不同,同时必须在配置文件中指定一个或多个网络或子网。
先决条件
- 已配置了主机到主机的 VPN。
流程
将带有主机到主机 VPN 配置的文件复制到新文件中,例如:
cp /etc/ipsec.d/my_host-to-host.conf /etc/ipsec.d/my_site-to-site.conf
# cp /etc/ipsec.d/my_host-to-host.conf /etc/ipsec.d/my_site-to-site.conf
Copy to Clipboard Copied! 在上一步创建的文件中添加子网配置,例如:
conn mysubnet also=mytunnel leftsubnet=192.0.1.0/24 rightsubnet=192.0.2.0/24 auto=start conn mysubnet6 also=mytunnel leftsubnet=2001:db8:0:1::/64 rightsubnet=2001:db8:0:2::/64 auto=start # the following part of the configuration file is the same for both host-to-host and site-to-site connections: conn mytunnel leftid=@west left=192.1.2.23 leftrsasigkey=0sAQOrlo+hOafUZDlCQmXFrje/oZm [...] W2n417C/4urYHQkCvuIQ== rightid=@east right=192.1.2.45 rightrsasigkey=0sAQO3fwC6nSSGgt64DWiYZzuHbc4 [...] D/v8t5YTQ== authby=rsasig
conn mysubnet also=mytunnel leftsubnet=192.0.1.0/24 rightsubnet=192.0.2.0/24 auto=start conn mysubnet6 also=mytunnel leftsubnet=2001:db8:0:1::/64 rightsubnet=2001:db8:0:2::/64 auto=start # the following part of the configuration file is the same for both host-to-host and site-to-site connections: conn mytunnel leftid=@west left=192.1.2.23 leftrsasigkey=0sAQOrlo+hOafUZDlCQmXFrje/oZm [...] W2n417C/4urYHQkCvuIQ== rightid=@east right=192.1.2.45 rightrsasigkey=0sAQO3fwC6nSSGgt64DWiYZzuHbc4 [...] D/v8t5YTQ== authby=rsasig
Copy to Clipboard Copied! - 如果您在带有 DHCP 或无状态地址自动配置(SLAAC)的网络中使用此主机,则连接可能会受到重定向的影响。有关详情和缓解步骤,请参阅将 VPN 连接分配给专用路由表,以防止连接绕过隧道。
6.6. 配置远程访问 VPN
公路勇士是指拥有移动客户端和动态分配的 IP 地址的旅行用户。移动客户端使用 X.509 证书进行身份验证。
以下示例显示了 IKEv2
的配置,并且避免使用 IKEv1
XAUTH 协议。
在服务器中:
conn roadwarriors keyexchange=ikev2 # support (roaming) MOBIKE clients (RFC 4555) mobike=yes fragmentation=yes left=1.2.3.4 # if access to the LAN is given, enable this, otherwise use 0.0.0.0/0 # leftsubnet=10.10.0.0/16 leftsubnet=0.0.0.0/0 leftcert=gw.example.com leftid=%fromcert leftxauthserver=yes leftmodecfgserver=yes right=%any # trust our own Certificate Agency rightca=%same # pick an IP address pool to assign to remote users # 100.64.0.0/16 prevents RFC1918 clashes when remote users are behind NAT rightaddresspool=100.64.13.100-100.64.13.254 # if you want remote clients to use some local DNS zones and servers modecfgdns="1.2.3.4, 5.6.7.8" modecfgdomains="internal.company.com, corp" rightxauthclient=yes rightmodecfgclient=yes authby=rsasig # optionally, run the client X.509 ID through pam to allow or deny client # pam-authorize=yes # load connection, do not initiate auto=add # kill vanished roadwarriors
conn roadwarriors
keyexchange=ikev2
# support (roaming) MOBIKE clients (RFC 4555)
mobike=yes
fragmentation=yes
left=1.2.3.4
# if access to the LAN is given, enable this, otherwise use 0.0.0.0/0
# leftsubnet=10.10.0.0/16
leftsubnet=0.0.0.0/0
leftcert=gw.example.com
leftid=%fromcert
leftxauthserver=yes
leftmodecfgserver=yes
right=%any
# trust our own Certificate Agency
rightca=%same
# pick an IP address pool to assign to remote users
# 100.64.0.0/16 prevents RFC1918 clashes when remote users are behind NAT
rightaddresspool=100.64.13.100-100.64.13.254
# if you want remote clients to use some local DNS zones and servers
modecfgdns="1.2.3.4, 5.6.7.8"
modecfgdomains="internal.company.com, corp"
rightxauthclient=yes
rightmodecfgclient=yes
authby=rsasig
# optionally, run the client X.509 ID through pam to allow or deny client
# pam-authorize=yes
# load connection, do not initiate
auto=add
# kill vanished roadwarriors
在移动客户端(即 road warrior 的设备)上,使用与之前配置稍有不同的配置:
conn to-vpn-server keyexchange=ikev2 # pick up our dynamic IP left=%defaultroute leftsubnet=0.0.0.0/0 leftcert=myname.example.com leftid=%fromcert leftmodecfgclient=yes # right can also be a DNS hostname right=1.2.3.4 # if access to the remote LAN is required, enable this, otherwise use 0.0.0.0/0 # rightsubnet=10.10.0.0/16 rightsubnet=0.0.0.0/0 fragmentation=yes # trust our own Certificate Agency rightca=%same authby=rsasig # allow narrowing to the server's suggested assigned IP and remote subnet narrowing=yes # support (roaming) MOBIKE clients (RFC 4555) mobike=yes # initiate connection auto=start
conn to-vpn-server
keyexchange=ikev2
# pick up our dynamic IP
left=%defaultroute
leftsubnet=0.0.0.0/0
leftcert=myname.example.com
leftid=%fromcert
leftmodecfgclient=yes
# right can also be a DNS hostname
right=1.2.3.4
# if access to the remote LAN is required, enable this, otherwise use 0.0.0.0/0
# rightsubnet=10.10.0.0/16
rightsubnet=0.0.0.0/0
fragmentation=yes
# trust our own Certificate Agency
rightca=%same
authby=rsasig
# allow narrowing to the server's suggested assigned IP and remote subnet
narrowing=yes
# support (roaming) MOBIKE clients (RFC 4555)
mobike=yes
# initiate connection
auto=start
6.7. 配置网格 VPN
网格 VPN 网络(也称为 any-to-any VPN ) 是一个所有节点都使用 IPsec 进行通信的网络。该配置可以对于无法使用 IPsec 的节点进行例外处理。可使用两种方式配置网格 VPN 网络:
- 需要 IPsec。
- 首选 IPsec,但允许回退到使用明文通信。
节点之间的身份验证可以基于 X.509 证书或 DNS 安全扩展(DNSSEC)。
您对 opportunistic IPsec 使用任何常规的 IKEv2 验证方法,因为这些连接是常规的 Libreswan 配置,除了由 right=%opportunisticgroup
条目定义的 opportunistic IPsec 之外。常见的身份验证方法是,主机使用常用的认证机构(CA)根据 X.509 证书互相验证。作为标准流程的一部分,云部署通常为云中的每个节点发布证书。
不要使用 PreSharedKey (PSK)身份验证,因为一个有危险的主机会导致组 PSK secret 也有危险。
您可以使用 NULL 身份验证在节点间部署加密,而无需认证,这只防止被动攻击者。
以下流程使用 X.509 证书。您可以使用任何类型的 CA 管理系统(如 Dogtag 证书系统)生成这些证书。Dogtag 假设每个节点的证书都以 PKCS #12 格式(.p12
文件)提供,其包含私钥、节点证书和用于验证其他节点的 X.509 证书的根 CA 证书。
每个节点的配置与其 X.509 证书不同。这允许在不重新配置网络中的任何现有节点的情况下添加新节点。PKCS #12 文件需要一个"友好名称",为此,我们使用名称"节点",这样引用友好名称的配置文件对所有节点都是相同的。
先决条件
-
Libreswan 已安装 ,并在每个节点上启动了
ipsec
服务。 一个新的 NSS 数据库已初始化。
如果您已经有一个旧的 NSS 数据库,请删除旧的数据库文件:
systemctl stop ipsec rm /var/lib/ipsec/nss/*db
# systemctl stop ipsec # rm /var/lib/ipsec/nss/*db
Copy to Clipboard Copied! 您可以使用以下命令初始化新数据库:
ipsec initnss
# ipsec initnss
Copy to Clipboard Copied!
流程
在每个节点中导入 PKCS #12 文件。此步骤需要用于生成 PKCS #12 文件的密码:
ipsec import nodeXXX.p12
# ipsec import nodeXXX.p12
Copy to Clipboard Copied! 为
IPsec 需要的
(专用)、IPsec 可选的
(private-or-clear)和No IPsec
(clear)配置文件创建以下三个连接定义:cat /etc/ipsec.d/mesh.conf conn clear auto=ondemand type=passthrough authby=never left=%defaultroute right=%group conn private auto=ondemand type=transport authby=rsasig failureshunt=drop negotiationshunt=drop keyexchange=ikev2 left=%defaultroute leftcert=nodeXXXX leftid=%fromcert rightid=%fromcert right=%opportunisticgroup conn private-or-clear auto=ondemand type=transport authby=rsasig failureshunt=passthrough negotiationshunt=passthrough # left left=%defaultroute leftcert=nodeXXXX leftid=%fromcert leftrsasigkey=%cert # right rightrsasigkey=%cert rightid=%fromcert right=%opportunisticgroup
# cat /etc/ipsec.d/mesh.conf conn clear auto=ondemand
1 type=passthrough authby=never left=%defaultroute right=%group conn private auto=ondemand type=transport authby=rsasig failureshunt=drop negotiationshunt=drop keyexchange=ikev2 left=%defaultroute leftcert=nodeXXXX leftid=%fromcert
2 rightid=%fromcert right=%opportunisticgroup conn private-or-clear auto=ondemand type=transport authby=rsasig failureshunt=passthrough negotiationshunt=passthrough # left left=%defaultroute leftcert=nodeXXXX
3 leftid=%fromcert leftrsasigkey=%cert # right rightrsasigkey=%cert rightid=%fromcert right=%opportunisticgroup
Copy to Clipboard Copied! - 1
auto
变量有几个选项:您可以使用带有 opportunistic IPsec 的
ondemand
连接选项来启动 IPsec 连接,或者用于显式配置不需要一直激活的连接。这个选项在内核中建立一个陷阱 XFRM 策略,使 IPsec 连接在收到与该策略匹配的第一个数据包时开始。您可以使用以下选项有效地配置和管理 IPsec 连接,无论是使用 Opportunistic IPsec 还是明确配置的连接:
add
选项-
加载连接配置,并为响应远程启动做好准备。但是,连接不会自动从本地端启动。您可以使用命令
ipsec 手动启动 IPsec 连接
。 start
选项- 加载连接配置,并为响应远程启动做好准备。此外,它会立即启动到远程对等点的连接。您可以将这个选项用于永久的和一直活跃的连接。
- 2
leftid
和rightid
变量标识 IPsec 隧道连接的右和左通道。如果您配置了证书,您可以使用这些变量来获取本地 IP 地址或本地证书的主题 DN 的值。- 3
leftcert
变量定义您要使用的 NSS 数据库的昵称。
将网络的 IP 地址添加到对应的类中。例如,如果所有节点都位于
10.15.0.0/16
网络中,则所有节点都必须使用 IPsec 加密:echo "10.15.0.0/16" >> /etc/ipsec.d/policies/private
# echo "10.15.0.0/16" >> /etc/ipsec.d/policies/private
Copy to Clipboard Copied! 要允许某些节点(如
10.15.34.0/24
)使用或不使用 IPsec,请将这些节点添加到 private-or-clear 组中:echo "10.15.34.0/24" >> /etc/ipsec.d/policies/private-or-clear
# echo "10.15.34.0/24" >> /etc/ipsec.d/policies/private-or-clear
Copy to Clipboard Copied! 要定义一个主机(如
10.15.1.2
),其不能将 IPsec 添加到 clear 组中,请使用:echo "10.15.1.2/32" >> /etc/ipsec.d/policies/clear
# echo "10.15.1.2/32" >> /etc/ipsec.d/policies/clear
Copy to Clipboard Copied! 您可以在
/etc/ipsec.d/policies
目录中从每个新节点的模板创建文件,也可以使用 Puppet 或 Ansible 来置备它们。请注意,每个节点都有相同的异常列表或不同的流量预期。因此,两个节点可能无法通信,因为一个节点需要 IPsec,而另一个节点无法使用 IPsec。
重启节点将其添加到配置的网格中:
systemctl restart ipsec
# systemctl restart ipsec
Copy to Clipboard Copied! - 如果您在带有 DHCP 或无状态地址自动配置(SLAAC)的网络中使用此主机,则连接可能会受到重定向的影响。有关详情和缓解步骤,请参阅将 VPN 连接分配给专用路由表,以防止连接绕过隧道。
验证
使用
ping
命令打开 IPsec 隧道:ping <nodeYYY>
# ping <nodeYYY>
Copy to Clipboard Copied! 显示带有导入认证的 NSS 数据库:
certutil -L -d sql:/var/lib/ipsec/nss/
# certutil -L -d sql:/var/lib/ipsec/nss/ Certificate Nickname Trust Attributes SSL,S/MIME,JAR/XPI west u,u,u ca CT,,
Copy to Clipboard Copied! 查看节点上哪个隧道打开了:
ipsec trafficstatus
# ipsec trafficstatus 006 #2: "private#10.15.0.0/16"[1] ...<nodeYYY>, type=ESP, add_time=1691399301, inBytes=512, outBytes=512, maxBytes=2^63B, id='C=US, ST=NC, O=Example Organization, CN=east'
Copy to Clipboard Copied!
6.8. 部署符合 FIPS 的 IPsec VPN
您可以使用 Libreswan 部署一个符合 FIPS 的 IPsec VPN 解决方案。为此,您可以识别哪些加密算法可用,且哪些在 FIPS 模式下对 Libreswan 禁用了。
先决条件
-
AppStream
存储库已启用。 - 您的系统已在 FIPS 模式下安装
流程
安装
libreswan
软件包:dnf install libreswan
# dnf install libreswan
Copy to Clipboard Copied! 如果您要重新安装 Libreswan,请删除其旧的 NSS 数据库:
systemctl stop ipsec rm /var/lib/ipsec/nss/*db
# systemctl stop ipsec # rm /var/lib/ipsec/nss/*db
Copy to Clipboard Copied! 启动
ipsec
服务,并启用该服务,以便其在引导时自动启动:systemctl enable ipsec --now
# systemctl enable ipsec --now
Copy to Clipboard Copied! 通过添加
ipsec
服务,将防火墙配置为允许 IKE、ESP 和 AH 协议的500
和4500
UDP 端口:firewall-cmd --add-service="ipsec" firewall-cmd --runtime-to-permanent
# firewall-cmd --add-service="ipsec" # firewall-cmd --runtime-to-permanent
Copy to Clipboard Copied!
验证
确认 Libreswan 是否在 FIPS 模式下运行:
ipsec whack --fipsstatus
# ipsec whack --fipsstatus FIPS mode enabled
Copy to Clipboard Copied! 或者,检查
systemd
日志中的ipsec
单元条目:journalctl -u ipsec
$ journalctl -u ipsec ... Jan 22 11:26:50 localhost.localdomain pluto[3076]: FIPS Mode: ON
Copy to Clipboard Copied! 以 FIPS 模式查看可用算法:
ipsec pluto --selftest 2>&1 | head -6
# ipsec pluto --selftest 2>&1 | head -6 Initializing NSS using read-only database "sql:/var/lib/ipsec/nss" FIPS Mode: ON NSS crypto library initialized FIPS mode enabled for pluto daemon NSS library is running in FIPS mode FIPS HMAC integrity support [not required]
Copy to Clipboard Copied! 使用 FIPS 模式查询禁用的算法:
ipsec pluto --selftest 2>&1 | grep disabled
# ipsec pluto --selftest 2>&1 | grep disabled Encryption algorithm CAMELLIA_CTR disabled; not FIPS compliant Encryption algorithm CAMELLIA_CBC disabled; not FIPS compliant Encryption algorithm NULL disabled; not FIPS compliant Encryption algorithm CHACHA20_POLY1305 disabled; not FIPS compliant Hash algorithm MD5 disabled; not FIPS compliant PRF algorithm HMAC_MD5 disabled; not FIPS compliant PRF algorithm AES_XCBC disabled; not FIPS compliant Integrity algorithm HMAC_MD5_96 disabled; not FIPS compliant Integrity algorithm HMAC_SHA2_256_TRUNCBUG disabled; not FIPS compliant Integrity algorithm AES_XCBC_96 disabled; not FIPS compliant DH algorithm MODP1536 disabled; not FIPS compliant DH algorithm DH31 disabled; not FIPS compliant
Copy to Clipboard Copied! 在 FIPS 模式中列出所有允许的算法和密码:
ipsec pluto --selftest 2>&1 | grep ESP | grep FIPS | sed "s/^.*FIPS//"
# ipsec pluto --selftest 2>&1 | grep ESP | grep FIPS | sed "s/^.*FIPS//" aes_ccm, aes_ccm_c aes_ccm_b aes_ccm_a NSS(CBC) 3des NSS(GCM) aes_gcm, aes_gcm_c NSS(GCM) aes_gcm_b NSS(GCM) aes_gcm_a NSS(CTR) aesctr NSS(CBC) aes aes_gmac NSS sha, sha1, sha1_96, hmac_sha1 NSS sha512, sha2_512, sha2_512_256, hmac_sha2_512 NSS sha384, sha2_384, sha2_384_192, hmac_sha2_384 NSS sha2, sha256, sha2_256, sha2_256_128, hmac_sha2_256 aes_cmac null NSS(MODP) null, dh0 NSS(MODP) dh14 NSS(MODP) dh15 NSS(MODP) dh16 NSS(MODP) dh17 NSS(MODP) dh18 NSS(ECP) ecp_256, ecp256 NSS(ECP) ecp_384, ecp384 NSS(ECP) ecp_521, ecp521
Copy to Clipboard Copied!
6.9. 使用密码保护 IPsec NSS 数据库
默认情况下,IPsec 服务在第一次启动时使用空密码创建其网络安全服务(NSS)数据库。要提高安全性,您可以添加密码保护。
先决条件
-
/var/lib/ipsec/nss/
目录包含 NSS 数据库文件。
流程
为 Libreswan 的
NSS
数据库启用密码保护:certutil -N -d sql:/var/lib/ipsec/nss
# certutil -N -d sql:/var/lib/ipsec/nss Enter Password or Pin for "NSS Certificate DB": Enter a password which will be used to encrypt your keys. The password should be at least 8 characters long, and should contain at least one non-alphabetic character. Enter new password:
Copy to Clipboard Copied! 创建包含您在上一步中设置的密码的
/etc/ipsec.d/nsspassword
文件,例如:cat /etc/ipsec.d/nsspassword NSS Certificate DB:<password>
# cat /etc/ipsec.d/nsspassword NSS Certificate DB:<password>
Copy to Clipboard Copied! nsspassword
文件使用以下语法:<token_1>:<password1> <token_2>:<password2>
<token_1>:<password1> <token_2>:<password2>
Copy to Clipboard Copied! 默认的 NSS 软件令牌是
NSS 证书 数据库
。如果您的系统以 FIPS 模式运行,则令牌的名称为NSS FIPS 140-2 证书数据库
。根据您的场景,在完成了
nsspassword
文件后,启动或重启ipsec
服务:systemctl restart ipsec
# systemctl restart ipsec
Copy to Clipboard Copied!
验证
在其 NSS 数据库中添加非空密码后,检查
ipsec
服务是否运行:systemctl status ipsec
# systemctl status ipsec ● ipsec.service - Internet Key Exchange (IKE) Protocol Daemon for IPsec Loaded: loaded (/usr/lib/systemd/system/ipsec.service; enabled; vendor preset: disable> Active: active (running)…
Copy to Clipboard Copied! 检查
Journal
日志是否包含确认成功初始化的条目:journalctl -u ipsec
# journalctl -u ipsec … pluto[6214]: Initializing NSS using read-only database "sql:/var/lib/ipsec/nss" pluto[6214]: NSS Password from file "/etc/ipsec.d/nsspassword" for token "NSS Certificate DB" with length 20 passed to NSS pluto[6214]: NSS crypto library initialized …
Copy to Clipboard Copied!
6.10. 配置 IPsec VPN 以使用 TCP
Libreswan 支持 IKE 和 IPsec 数据包的 TCP 封装,如 RFC 8229 所述。有了这个功能,您可以在网络上建立 IPsec VPN,以防止通过 UDP 和封装安全负载(ESP)传输的流量。您可以将 VPN 服务器和客户端配置为使用 TCP 作为回退,或者作为主 VPN 传输协议。由于 TCP 封装的性能成本较高,因此只有在您的场景中需要永久阻止 UDP 时,才使用 TCP 作为主 VPN 协议。
先决条件
- 已配置了 远程访问 VPN。
流程
在
/etc/ipsec.conf
文件的config setup
部分中添加以下选项:listen-tcp=yes
listen-tcp=yes
Copy to Clipboard Copied! 要在第一次尝试 UDP 失败时使用 TCP 封装作为回退选项,请在客户端的连接定义中添加以下两个选项:
enable-tcp=fallback tcp-remoteport=4500
enable-tcp=fallback tcp-remoteport=4500
Copy to Clipboard Copied! 另外,如果您知道 UDP 会被永久阻止,请在客户端的连接配置中使用以下选项:
enable-tcp=yes tcp-remoteport=4500
enable-tcp=yes tcp-remoteport=4500
Copy to Clipboard Copied!
6.11. 使用 RHEL 系统角色配置 VPN 连接
VPN 是一个加密连接,用于通过不受信任的网络安全地传输流量。通过使用 vpn
RHEL 系统角色,您可以自动化创建 VPN 配置的过程。
vpn
RHEL 系统角色只支持 Libreswan (一个 IPsec 实现),作为 VPN 供应商。
6.11.1. 使用 vpn
RHEL 系统角色,创建一个带有 PSK 身份验证的主机到主机的 IPsec VPN
您可以使用 IPsec ,通过 VPN 直接将主机互联。主机可以使用预共享密钥(PSK)进行相互验证。通过使用 vpn
RHEL 系统角色,您可以自动化创建带有 PSK 身份验证的 IPsec 主机到主机连接的过程。
默认情况下,角色创建一个基于隧道的 VPN。
先决条件
- 您已准备好控制节点和受管节点
- 以可在受管主机上运行 playbook 的用户登录到控制节点。
-
您用于连接到受管节点的帐户对它们具有
sudo
权限。
流程
创建一个包含以下内容的 playbook 文件,如
~/playbook.yml
:--- - name: Configuring VPN hosts: managed-node-01.example.com, managed-node-02.example.com tasks: - name: IPsec VPN with PSK authentication ansible.builtin.include_role: name: redhat.rhel_system_roles.vpn vars: vpn_connections: - hosts: managed-node-01.example.com: managed-node-02.example.com: auth_method: psk auto: start vpn_manage_firewall: true vpn_manage_selinux: true
--- - name: Configuring VPN hosts: managed-node-01.example.com, managed-node-02.example.com tasks: - name: IPsec VPN with PSK authentication ansible.builtin.include_role: name: redhat.rhel_system_roles.vpn vars: vpn_connections: - hosts: managed-node-01.example.com: managed-node-02.example.com: auth_method: psk auto: start vpn_manage_firewall: true vpn_manage_selinux: true
Copy to Clipboard Copied! 示例 playbook 中指定的设置包括如下:
hosts: <list>
定义一个 YAML 字典,其中包含您想要在它们之间配置 VPN 的主机。如果条目不是一个 Ansible 管理的节点,则您必须在
hostname
参数中指定其完全限定域名(FQDN)或 IP 地址,例如:... - hosts: ... external-host.example.com: hostname: 192.0.2.1
... - hosts: ... external-host.example.com: hostname: 192.0.2.1
Copy to Clipboard Copied! 角色在每个受管节点上配置 VPN 连接。连接被命名为
<host_A>-to-<host_B>
,例如managed-node-01.example.com-to-managed-node-02.example.com
。请注意,角色不能在外部(未管理的)节点上配置 Libreswan。您必须在这些主机上手动创建配置。auth_method: psk
-
在主机之间启用 PSK 身份验证。角色在控制节点上使用
openssl
来创建 PSK。 auto: <start-up_method>
-
指定连接的启动方法。有效值是
add
、ondemand
、start
和ignore
。详情请查看安装了 Libreswan 的系统上的ipsec.conf (5)
手册页。此变量的默认值为 null,这意味着没有自动启动操作。 vpn_manage_firewall: true
-
定义角色在受管节点上的
firewalld
服务中打开所需的端口。 vpn_manage_selinux: true
- 定义角色在 IPsec 端口上设置所需的 SELinux 端口类型。
有关 playbook 中使用的所有变量的详情,请查看控制节点上的
/usr/share/ansible/roles/rhel-system-roles.vpn/README.md
文件。验证 playbook 语法:
ansible-playbook --syntax-check ~/playbook.yml
$ ansible-playbook --syntax-check ~/playbook.yml
Copy to Clipboard Copied! 请注意,这个命令只验证语法,不能防止错误的、但有效的配置。
运行 playbook:
ansible-playbook ~/playbook.yml
$ ansible-playbook ~/playbook.yml
Copy to Clipboard Copied!
验证
确认连接已成功启动,例如:
ansible managed-node-01.example.com -m shell -a 'ipsec trafficstatus | grep "managed-node-01.example.com-to-managed-node-02.example.com"'
# ansible managed-node-01.example.com -m shell -a 'ipsec trafficstatus | grep "managed-node-01.example.com-to-managed-node-02.example.com"' ... 006 #3: "managed-node-01.example.com-to-managed-node-02.example.com", type=ESP, add_time=1741857153, inBytes=38622, outBytes=324626, maxBytes=2^63B, id='@managed-node-02.example.com'
Copy to Clipboard Copied! 请注意,只有在 VPN 连接活跃时,这个命令才会成功。如果将 playbook 中的
auto
变量设置为start
以外的值,您可能需要首先手动激活受管节点上的连接。
6.11.2. 创建一个带有 PSK 身份验证的主机到主机的 IPsec VPN,并使用 vpn
RHEL 系统角色分隔数据和控制平面
您可以使用 IPsec ,通过 VPN 直接将主机互联。例如,要通过最大程度减少被截获或破坏的控制消息的风险来增强安全性,您可以为数据流量和控制流量配置单独的连接。通过使用 vpn
RHEL 系统角色,您可以自动化创建带有单独的数据和控制平面及 PSK 身份验证的 IPsec 主机到主机连接的过程。
先决条件
- 您已准备好控制节点和受管节点
- 以可在受管主机上运行 playbook 的用户登录到控制节点。
-
您用于连接到受管节点的帐户对它们具有
sudo
权限。
流程
创建一个包含以下内容的 playbook 文件,如
~/playbook.yml
:--- - name: Configuring VPN hosts: managed-node-01.example.com, managed-node-02.example.com tasks: - name: IPsec VPN with PSK authentication ansible.builtin.include_role: name: redhat.rhel_system_roles.vpn vars: vpn_connections: - name: control_plane_vpn hosts: managed-node-01.example.com: hostname: 203.0.113.1 # IP address for the control plane managed-node-02.example.com: hostname: 198.51.100.2 # IP address for the control plane auth_method: psk auto: start - name: data_plane_vpn hosts: managed-node-01.example.com: hostname: 10.0.0.1 # IP address for the data plane managed-node-02.example.com: hostname: 172.16.0.2 # IP address for the data plane auth_method: psk auto: start vpn_manage_firewall: true vpn_manage_selinux: true
--- - name: Configuring VPN hosts: managed-node-01.example.com, managed-node-02.example.com tasks: - name: IPsec VPN with PSK authentication ansible.builtin.include_role: name: redhat.rhel_system_roles.vpn vars: vpn_connections: - name: control_plane_vpn hosts: managed-node-01.example.com: hostname: 203.0.113.1 # IP address for the control plane managed-node-02.example.com: hostname: 198.51.100.2 # IP address for the control plane auth_method: psk auto: start - name: data_plane_vpn hosts: managed-node-01.example.com: hostname: 10.0.0.1 # IP address for the data plane managed-node-02.example.com: hostname: 172.16.0.2 # IP address for the data plane auth_method: psk auto: start vpn_manage_firewall: true vpn_manage_selinux: true
Copy to Clipboard Copied! 示例 playbook 中指定的设置包括如下:
hosts: <list>
定义一个 YAML 字典,其中包含您想要在它们之间配置 VPN 的主机。连接被命名为
<name>-<IP_address_A>-to-<IP_address_B>
,例如control_plane_vpn-203.0.113.1-to-198.51.100.2
。角色在每个受管节点上配置 VPN 连接。请注意,角色不能在外部(未管理的)节点上配置 Libreswan。您必须在这些主机上手动创建配置。
auth_method: psk
-
在主机之间启用 PSK 身份验证。角色在控制节点上使用
openssl
来创建预共享密钥。 auto: <start-up_method>
-
指定连接的启动方法。有效值是
add
、ondemand
、start
和ignore
。详情请查看安装了 Libreswan 的系统上的ipsec.conf (5)
手册页。此变量的默认值为 null,这意味着没有自动启动操作。 vpn_manage_firewall: true
-
定义角色在受管节点上的
firewalld
服务中打开所需的端口。 vpn_manage_selinux: true
- 定义角色在 IPsec 端口上设置所需的 SELinux 端口类型。
有关 playbook 中使用的所有变量的详情,请查看控制节点上的
/usr/share/ansible/roles/rhel-system-roles.vpn/README.md
文件。验证 playbook 语法:
ansible-playbook --syntax-check ~/playbook.yml
$ ansible-playbook --syntax-check ~/playbook.yml
Copy to Clipboard Copied! 请注意,这个命令只验证语法,不能防止错误的、但有效的配置。
运行 playbook:
ansible-playbook ~/playbook.yml
$ ansible-playbook ~/playbook.yml
Copy to Clipboard Copied!
验证
确认连接已成功启动,例如:
ansible managed-node-01.example.com -m shell -a 'ipsec trafficstatus | grep "control_plane_vpn-203.0.113.1-to-198.51.100.2"'
# ansible managed-node-01.example.com -m shell -a 'ipsec trafficstatus | grep "control_plane_vpn-203.0.113.1-to-198.51.100.2"' ... 006 #3: "control_plane_vpn-203.0.113.1-to-198.51.100.2", type=ESP, add_time=1741860073, inBytes=0, outBytes=0, maxBytes=2^63B, id='198.51.100.2'
Copy to Clipboard Copied! 请注意,只有在 VPN 连接活跃时,这个命令才会成功。如果将 playbook 中的
auto
变量设置为start
以外的值,您可能需要首先手动激活受管节点上的连接。
6.11.3. 使用 vpn
RHEL 系统角色在多个主机间创建基于证书的身份验证 IPsec 网格 VPN
Libreswan 支持创建一个机会网格,以便在每个主机上带有单个配置的大量主机之间建立 IPsec 连接。将主机添加到网格中不需要更新现有主机上的配置。为提高安全性,请在 Libreswan 中使用基于证书的身份验证。
通过使用 vpn
RHEL 系统角色,您可以在受管节点之间自动化配置带有基于证书的身份验证的 VPN 网格。
先决条件
- 您已准备好控制节点和受管节点
- 以可在受管主机上运行 playbook 的用户登录到控制节点。
-
您用于连接到受管节点的帐户对它们具有
sudo
权限。 您可以为每个受管节点准备一个 PKCS #12 文件:
每个文件包含:
- 证书颁发机构(CA)证书
- 节点的私钥
- 节点的客户端证书
-
文件被命名为
<managed_node_name_as_in_the_inventory>.p12
。 - 文件存储在与 playbook 相同的目录中。
流程
编辑
~/inventory
文件,并附加cert_name
变量:managed-node-01.example.com cert_name=managed-node-01.example.com managed-node-02.example.com cert_name=managed-node-02.example.com managed-node-03.example.com cert_name=managed-node-03.example.com
managed-node-01.example.com cert_name=managed-node-01.example.com managed-node-02.example.com cert_name=managed-node-02.example.com managed-node-03.example.com cert_name=managed-node-03.example.com
Copy to Clipboard Copied! 将
cert_name
变量设置为每个主机的证书中使用的通用名称(CN)字段的值。通常,CN 字段被设置为完全限定域名(FQDN)。将敏感变量存储在加密的文件中:
创建 vault :
ansible-vault create ~/vault.yml
$ ansible-vault create ~/vault.yml New Vault password: <vault_password> Confirm New Vault password: <vault_password>
Copy to Clipboard Copied! 在
ansible-vault create
命令打开编辑器后,以<key>: <value>
格式输入敏感数据:pkcs12_pwd: <password>
pkcs12_pwd: <password>
Copy to Clipboard Copied! - 保存更改,并关闭编辑器。Ansible 加密 vault 中的数据。
创建一个包含以下内容的 playbook 文件,如
~/playbook.yml
:- name: Configuring VPN hosts: managed-node-01.example.com, managed-node-02.example.com, managed-node-03.example.com vars_files: - ~/vault.yml tasks: - name: Install LibreSwan ansible.builtin.package: name: libreswan state: present - name: Identify the path to IPsec NSS database ansible.builtin.set_fact: nss_db_dir: "{{ '/etc/ipsec.d/' if ansible_distribution in ['CentOS', 'RedHat'] and ansible_distribution_major_version is version('8', '=') else '/var/lib/ipsec/nss/' }}" - name: Locate IPsec NSS database files ansible.builtin.find: paths: "{{ nss_db_dir }}" patterns: "*.db" register: db_files - name: Remove IPsec NSS database files ansible.builtin.file: path: "{{ item.path }}" state: absent loop: "{{ db_files.files }}" when: db_files.matched > 0 - name: Initialize IPsec NSS database ansible.builtin.command: cmd: ipsec initnss - name: Copy PKCS #12 file to the managed node ansible.builtin.copy: src: "~/{{ inventory_hostname }}.p12" dest: "/etc/ipsec.d/{{ inventory_hostname }}.p12" mode: 0600 - name: Import PKCS #12 file in IPsec NSS database ansible.builtin.shell: cmd: 'pk12util -d {{ nss_db_dir }} -i /etc/ipsec.d/{{ inventory_hostname }}.p12 -W "{{ pkcs12_pwd }}"' - name: Remove PKCS #12 file ansible.builtin.file: path: "/etc/ipsec.d/{{ inventory_hostname }}.p12" state: absent - name: Opportunistic mesh IPsec VPN with certificate-based authentication ansible.builtin.include_role: name: redhat.rhel_system_roles.vpn vars: vpn_connections: - opportunistic: true auth_method: cert policies: - policy: private cidr: default - policy: private cidr: 192.0.2.0/24 - policy: clear cidr: 192.0.2.1/32 vpn_manage_firewall: true vpn_manage_selinux: true
- name: Configuring VPN hosts: managed-node-01.example.com, managed-node-02.example.com, managed-node-03.example.com vars_files: - ~/vault.yml tasks: - name: Install LibreSwan ansible.builtin.package: name: libreswan state: present - name: Identify the path to IPsec NSS database ansible.builtin.set_fact: nss_db_dir: "{{ '/etc/ipsec.d/' if ansible_distribution in ['CentOS', 'RedHat'] and ansible_distribution_major_version is version('8', '=') else '/var/lib/ipsec/nss/' }}" - name: Locate IPsec NSS database files ansible.builtin.find: paths: "{{ nss_db_dir }}" patterns: "*.db" register: db_files - name: Remove IPsec NSS database files ansible.builtin.file: path: "{{ item.path }}" state: absent loop: "{{ db_files.files }}" when: db_files.matched > 0 - name: Initialize IPsec NSS database ansible.builtin.command: cmd: ipsec initnss - name: Copy PKCS #12 file to the managed node ansible.builtin.copy: src: "~/{{ inventory_hostname }}.p12" dest: "/etc/ipsec.d/{{ inventory_hostname }}.p12" mode: 0600 - name: Import PKCS #12 file in IPsec NSS database ansible.builtin.shell: cmd: 'pk12util -d {{ nss_db_dir }} -i /etc/ipsec.d/{{ inventory_hostname }}.p12 -W "{{ pkcs12_pwd }}"' - name: Remove PKCS #12 file ansible.builtin.file: path: "/etc/ipsec.d/{{ inventory_hostname }}.p12" state: absent - name: Opportunistic mesh IPsec VPN with certificate-based authentication ansible.builtin.include_role: name: redhat.rhel_system_roles.vpn vars: vpn_connections: - opportunistic: true auth_method: cert policies: - policy: private cidr: default - policy: private cidr: 192.0.2.0/24 - policy: clear cidr: 192.0.2.1/32 vpn_manage_firewall: true vpn_manage_selinux: true
Copy to Clipboard Copied! 示例 playbook 中指定的设置包括如下:
opportunistic: true
-
在多个主机之间启用机会网格。
policies
变量定义哪些子网和主机流量必须或可以加密,它们中哪些应该继续使用明文连接。 auth_method: cert
- 启用基于证书的身份验证。这要求您在清单中指定每个受管节点的证书的昵称。
policies: <list_of_policies>
以 YAML 列表格式定义 Libreswan 策略。
默认策略是
private-or-clear
。要将它改为private
,上面的 playbook 包含默认cidr
条目的一个相应策略。如果 Ansible 控制节点与受管节点在同一个 IP 子网中,要防止执行 playbook 期间丢失 SSH 连接,请为控制节点的 IP 地址添加一个
clear
策略。例如,如果应该为192.0.2.0/24
子网配置网格,并且控制节点使用 IP 地址192.0.2.1
,则您需要一个用于192.0.2.1/32
的clear
策略,如 playbook 中所示。有关策略的详情,请查看安装了 Libreswan 的系统上的
ipsec.conf (5)
手册页。vpn_manage_firewall: true
-
定义角色在受管节点上的
firewalld
服务中打开所需的端口。 vpn_manage_selinux: true
- 定义角色在 IPsec 端口上设置所需的 SELinux 端口类型。
有关 playbook 中使用的所有变量的详情,请查看控制节点上的
/usr/share/ansible/roles/rhel-system-roles.vpn/README.md
文件。验证 playbook 语法:
ansible-playbook --ask-vault-pass --syntax-check ~/playbook.yml
$ ansible-playbook --ask-vault-pass --syntax-check ~/playbook.yml
Copy to Clipboard Copied! 请注意,这个命令只验证语法,不能防止错误的、但有效的配置。
运行 playbook:
ansible-playbook --ask-vault-pass ~/playbook.yml
$ ansible-playbook --ask-vault-pass ~/playbook.yml
Copy to Clipboard Copied!
验证
在网格的一个节点上,ping 另一个节点来激活连接:
ping managed-node-02.example.com
[root@managed-node-01]# ping managed-node-02.example.com
Copy to Clipboard Copied! 确认连接是否处于活跃状态:
ipsec trafficstatus
[root@managed-node-01]# ipsec trafficstatus 006 #2: "private#192.0.2.0/24"[1] ...192.0.2.2, type=ESP, add_time=1741938929, inBytes=372408, outBytes=545728, maxBytes=2^63B, id='CN=managed-node-02.example.com'
Copy to Clipboard Copied!
6.12. 配置选择不使用系统范围的加密策略的 IPsec 连接
为连接覆盖系统范围的加密策略:
RHEL 系统范围的加密策略会创建一个名为 %default
的特殊连接。此连接包含 ikev2
、esp
和 ike
选项的默认值。但是,您可以通过在连接配置文件中指定上述选项来覆盖默认值。
例如,以下配置允许使用带有 AES 和 SHA-1 或 SHA-2的 IKEv1 连接,以及带有 AES-GCM 或 AES-CBC 的 IPsec(ESP) 连接:
conn MyExample ... keyexchange=ikev1 ike=aes-sha2,aes-sha1;modp2048 esp=aes_gcm,aes-sha2,aes-sha1 ...
conn MyExample
...
keyexchange=ikev1
ike=aes-sha2,aes-sha1;modp2048
esp=aes_gcm,aes-sha2,aes-sha1
...
请注意,AES-GCM 可用于 IPsec(ESP)和 IKEv2,但不适用于 IKEv1。
为所有连接禁用系统范围的加密策略:
要禁用所有 IPsec 连接的系统范围的加密策略,请在 /etc/ipsec.conf
文件中注释掉以下行:
include /etc/crypto-policies/back-ends/libreswan.config
include /etc/crypto-policies/back-ends/libreswan.config
然后,将 keyexchange=ikev1
选项添加到您的连接配置文件。
6.13. IPsec VPN 配置故障排除
与 IPsec VPN 配置相关的问题通常是由于几个主要原因造成的。如果您遇到此类问题,您可以检查问题的原因是否符合一下任何一种情况,并应用相应的解决方案。
- 基本连接故障排除
VPN 连接的大多数问题都发生在新部署中,管理员使用不匹配的配置选项配置了端点。此外,正常工作的配置可能会突然停止工作,通常是由于新引入的不兼容的值。这可能是管理员更改配置的结果。或者,管理员可能已安装了固件更新,或者使用某些选项的不同默认值(如加密算法)安装了软件包更新。
要确认已建立 IPsec VPN 连接:
ipsec trafficstatus
# ipsec trafficstatus 006 #8: "vpn.example.com"[1] 192.0.2.1, type=ESP, add_time=1595296930, inBytes=5999, outBytes=3231, id='@vpn.example.com', lease=100.64.13.5/32
Copy to Clipboard Copied! 如果输出为空或者没有显示具有连接名称的条目,则隧道将断开。
检查连接中的问题:
重新载入 vpn.example.com 连接:
ipsec add vpn.example.com
# ipsec add vpn.example.com 002 added connection description "vpn.example.com"
Copy to Clipboard Copied! 下一步,启动 VPN 连接:
ipsec up vpn.example.com
# ipsec up vpn.example.com
Copy to Clipboard Copied!
- 与防火墙相关的问题
最常见的问题是,其中一个 IPsec 端点或端点之间路由器上的防火墙将所有互联网密钥交换(IKE)数据包丢弃。
对于 IKEv2,类似以下示例的输出说明防火墙出现问题:
ipsec up vpn.example.com
# ipsec up vpn.example.com 181 "vpn.example.com"[1] 192.0.2.2 #15: initiating IKEv2 IKE SA 181 "vpn.example.com"[1] 192.0.2.2 #15: STATE_PARENT_I1: sent v2I1, expected v2R1 010 "vpn.example.com"[1] 192.0.2.2 #15: STATE_PARENT_I1: retransmission; will wait 0.5 seconds for response 010 "vpn.example.com"[1] 192.0.2.2 #15: STATE_PARENT_I1: retransmission; will wait 1 seconds for response 010 "vpn.example.com"[1] 192.0.2.2 #15: STATE_PARENT_I1: retransmission; will wait 2 seconds for ...
Copy to Clipboard Copied! 对于 IKEv1,启动命令的输出如下:
ipsec up vpn.example.com
# ipsec up vpn.example.com 002 "vpn.example.com" #9: initiating Main Mode 102 "vpn.example.com" #9: STATE_MAIN_I1: sent MI1, expecting MR1 010 "vpn.example.com" #9: STATE_MAIN_I1: retransmission; will wait 0.5 seconds for response 010 "vpn.example.com" #9: STATE_MAIN_I1: retransmission; will wait 1 seconds for response 010 "vpn.example.com" #9: STATE_MAIN_I1: retransmission; will wait 2 seconds for response ...
Copy to Clipboard Copied! 由于用于设置 IPsec 的 IKE 协议已经加密,因此您只能使用
tcpdump
工具排除一小部分问题。如果防火墙丢弃了 IKE 或 IPsec 数据包,您可以尝试使用tcpdump
工具来查找原因。但是,tcpdump
无法诊断 IPsec VPN 连接的其他问题。捕获
eth0
接口上的 VPN 协商以及所有加密数据:tcpdump -i eth0 -n -n esp or udp port 500 or udp port 4500 or tcp port 4500
# tcpdump -i eth0 -n -n esp or udp port 500 or udp port 4500 or tcp port 4500
Copy to Clipboard Copied!
- 不匹配的算法、协议和策略
VPN 连接要求端点具有匹配的 IKE 算法、IPsec 算法和 IP 地址范围。如果发生不匹配,连接会失败。如果您使用以下方法之一发现不匹配,请通过匹配算法、协议或策略来修复它。
如果远程端点没有运行 IKE/IPsec,您可以看到一个 ICMP 数据包来指示它。例如:
ipsec up vpn.example.com
# ipsec up vpn.example.com ... 000 "vpn.example.com"[1] 192.0.2.2 #16: ERROR: asynchronous network error report on wlp2s0 (192.0.2.2:500), complainant 198.51.100.1: Connection refused [errno 111, origin ICMP type 3 code 3 (not authenticated)] ...
Copy to Clipboard Copied! 不匹配 IKE 算法示例:
ipsec up vpn.example.com
# ipsec up vpn.example.com ... 003 "vpn.example.com"[1] 193.110.157.148 #3: dropping unexpected IKE_SA_INIT message containing NO_PROPOSAL_CHOSEN notification; message payloads: N; missing payloads: SA,KE,Ni
Copy to Clipboard Copied! 不匹配 IPsec 算法示例:
ipsec up vpn.example.com
# ipsec up vpn.example.com ... 182 "vpn.example.com"[1] 193.110.157.148 #5: STATE_PARENT_I2: sent v2I2, expected v2R2 {auth=IKEv2 cipher=AES_GCM_16_256 integ=n/a prf=HMAC_SHA2_256 group=MODP2048} 002 "vpn.example.com"[1] 193.110.157.148 #6: IKE_AUTH response contained the error notification NO_PROPOSAL_CHOSEN
Copy to Clipboard Copied! 不匹配的 IKE 版本还可导致远程端点在没有响应的情况下丢弃请求。这与丢弃所有 IKE 数据包的防火墙相同。
IKEv2 不匹配的 IP 地址范围示例(称为流量选择器 - TS):
ipsec up vpn.example.com
# ipsec up vpn.example.com ... 1v2 "vpn.example.com" #1: STATE_PARENT_I2: sent v2I2, expected v2R2 {auth=IKEv2 cipher=AES_GCM_16_256 integ=n/a prf=HMAC_SHA2_512 group=MODP2048} 002 "vpn.example.com" #2: IKE_AUTH response contained the error notification TS_UNACCEPTABLE
Copy to Clipboard Copied! IKEv1 的不匹配 IP 地址范围示例:
ipsec up vpn.example.com
# ipsec up vpn.example.com ... 031 "vpn.example.com" #2: STATE_QUICK_I1: 60 second timeout exceeded after 0 retransmits. No acceptable response to our first Quick Mode message: perhaps peer likes no proposal
Copy to Clipboard Copied! 当在 IKEv1 中使用预共享密钥(PSK)时,如果双方没有放入相同的 PSK ,则整个 IKE 信息将无法读取:
ipsec up vpn.example.com
# ipsec up vpn.example.com ... 003 "vpn.example.com" #1: received Hash Payload does not match computed value 223 "vpn.example.com" #1: sending notification INVALID_HASH_INFORMATION to 192.0.2.23:500
Copy to Clipboard Copied! 在 IKEv2 中,不匹配-PSK 错误会导致 AUTHENTICATION_FAILED 信息:
ipsec up vpn.example.com
# ipsec up vpn.example.com ... 002 "vpn.example.com" #1: IKE SA authentication request rejected by peer: AUTHENTICATION_FAILED
Copy to Clipboard Copied!
- 最大传输单元
除防火墙阻止 IKE 或 IPsec 数据包外,网络问题的最常见原因与加密数据包的数据包大小增加有关。网络硬件对于大于最大传输单元(MTU)的数据包进行分片处理,例如 1500 字节。通常,片会丢失,数据包无法重新组装。当使用小数据包的 ping 测试可以正常工作,但其他流量失败时,这会导致间歇性故障。在这种情况下,您可以建立一个 SSH 会话,但是一使用它,终端就会冻结,例如,在远程主机上输入 'ls -al /usr' 命令。
要临时解决这个问题,请通过将
mtu=1400
选项添加到隧道配置文件中来减小 MTU 大小。另外,对于 TCP 连接,启用更改 MSS 值的 iptables 规则:
iptables -I FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu
# iptables -I FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu
Copy to Clipboard Copied! 如果上一命令没有解决您场景中的问题,请在
set-mss
参数中直接指定较小的数值:iptables -I FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --set-mss 1380
# iptables -I FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --set-mss 1380
Copy to Clipboard Copied! - 网络地址转换(NAT)
当 IPsec 主机也充当 NAT 路由器时,可能会意外地重新映射数据包。以下示例配置演示了这个问题:
conn myvpn left=172.16.0.1 leftsubnet=10.0.2.0/24 right=172.16.0.2 rightsubnet=192.168.0.0/16 …
conn myvpn left=172.16.0.1 leftsubnet=10.0.2.0/24 right=172.16.0.2 rightsubnet=192.168.0.0/16 …
Copy to Clipboard Copied! 地址为 172.16.0.1 的系统有一个 NAT 规则:
iptables -t nat -I POSTROUTING -o eth0 -j MASQUERADE
iptables -t nat -I POSTROUTING -o eth0 -j MASQUERADE
Copy to Clipboard Copied! 如果地址为 10.0.2.33 的系统将数据包发送到 192.168.0.1,那么路由器会在应用 IPsec 加密前将源 10.0.2.33 转换为 172.16.0.1。
然后,源地址为 10.0.2.33 的数据包不再与
conn myvpn
配置匹配, IPsec 不会加密此数据包。要解决这个问题,请在路由器上插入目标 IPsec 子网范围不包含 NAT 的规则,例如:
iptables -t nat -I POSTROUTING -s 10.0.2.0/24 -d 192.168.0.0/16 -j RETURN
iptables -t nat -I POSTROUTING -s 10.0.2.0/24 -d 192.168.0.0/16 -j RETURN
Copy to Clipboard Copied! - 内核 IPsec 子系统错误
例如,当 bug 导致 IKE 用户空间和 IPsec 内核不同步时,内核 IPsec 子系统可能会失败。检查此问题:
cat /proc/net/xfrm_stat XfrmInError 0 XfrmInBufferError 0 ...
$ cat /proc/net/xfrm_stat XfrmInError 0 XfrmInBufferError 0 ...
Copy to Clipboard Copied! 上一命令输出中的任何非零值都表示有问题。如果您遇到这个问题,请开一个新的 支持问题单,并附上上一命令的输出与对应的 IKE 日志。
- libreswan 日志
默认情况下,Libreswan 使用
syslog
协议的日志。您可以使用journalctl
命令来查找与 IPsec 有关的日志条目。因为日志中对应的条目由pluto
IKE 守护进程发送,所以搜索 "pluto" 关键字,例如:journalctl -b | grep pluto
$ journalctl -b | grep pluto
Copy to Clipboard Copied! 显示
ipsec
服务的实时日志:journalctl -f -u ipsec
$ journalctl -f -u ipsec
Copy to Clipboard Copied! 如果默认日志记录级别没有显示您的配置问题,请将
plutodebug=all
选项添加到/etc/ipsec.conf
文件的config setup
部分来启用调试日志。请注意,调试日志记录会生成大量的条目,
journald
或syslogd
服务的速率可能会抑制syslog
消息。要确保您有完整的日志,请将日志记录重定向到文件中。编辑/etc/ipsec.conf
,并在config setup
部分中添加logfile=/var/log/pluto.log
。
6.14. 使用 control-center 配置 VPN 连接
如果使用带有图形界面的 Red Hat Enterprise Linux ,您可以在 GNOME control-center
中配置 VPN 连接。
先决条件
-
已安装
NetworkManager-libreswan-gnome
软件包。
流程
-
按 Super 键,输入
Settings
,然后按 Enter 键打开control-center
应用程序。 -
选择左侧的
Network
条目。 - 点 + 图标。
-
选择
VPN
。 选择
Identity
菜单项来查看基本配置选项:General
gateway- 远程 VPN 网关的名称或
IP
地址。认证
类型
-
IKEv2(Certificate)
- 客户端通过证书进行身份验证。它更安全(默认)。 IKEv1(XAUTH)
- 客户端通过用户名和密码或预共享密钥(PSK)进行身份验证。以下配置设置在
高级
部分中提供:警告当使用
gnome-control-center
应用程序配置基于 IPsec 的 VPN 连接时,高级
对话框会显示配置,但它不允许任何更改。因此,用户无法更改任何高级 IPsec 选项。使用nm-connection-editor
或nmcli
工具来配置高级属性。身份识别
域
-如果需要,请输入域名。安全性
-
Phase1 Algorithms
- 对应于ike
Libreswan 参数 - 输入用来验证和设置加密频道的算法。 Phase2 Algorithms
- 对应于esp
Libreswan 参数 - 输入用于IPsec
协商的算法。选择
Disable PFS
字段来关闭 Perfect Forward Secrecy(PFS),以确保与不支持 PFS 的旧服务器兼容。-
Phase1 Lifetime
- 与ikelifetime
Libreswan 参数对应 - 用于加密流量的密钥的有效期。 Phase2 Lifetime
- 与salifetime
Libreswan 参数对应 - 在过期前连接的特定实例应多久。注意:为了安全起见,加密密钥应该不时地更改。
远程网络
与rightsubnet
Libreswan 参数对应 - 应该通过 VPN 访问的目标专用远程网络。检查
缩减
字段以启用缩小字段。请注意,它只在 IKEv2 协商中有效。-
启用碎片
-对应于fragmentation
Libreswan 参数 - 是否允许 IKE 分段。有效值为yes
(默认)或no
。 -
Enable Mobike
- 与mobike
Libreswan 参数对应 - 是否允许移动和多形协议(MOBIKE、RFC 455)启用连接来迁移其端点,而无需从头开始重启连接。这可用于在有线、无线或者移动数据连接之间进行切换的移动设备。值为no
(默认)或yes
。
-
选择
菜单条目:IPv4 方法
-
Automatic (DHCP)
- 如果您要连接的网络使用DHCP
服务器来分配动态IP
地址,请选择这个选项。 -
Link-Local Only
- 如果您要连接的网络没有DHCP
服务器且您不想手动分配IP
地址,请选择这个选项。随机地址将根据 RFC 3927 分配,带有前缀169.254/16
。 -
如果要手动分配
IP
地址,请手动选择这个选项。 在这个连接中禁用 disable-
IPv4
。DNS
在
DNS
部分,当Automatic
为ON
时,将其切换到OFF
以输入您要用逗号分开的 DNS 服务器的 IP 地址。Routes
请注意,在
Routes
部分,当Automatic
为ON
时,会使用 DHCP 的路由,但您也可以添加额外的静态路由。当OFF
时,只使用静态路由。-
address
- 输入远程网络或主机的IP
地址。 -
netmask
- 以上输入的IP
地址的子网掩码或前缀长度。 -
gateway- 上面输入的远程网络或主机的
网关的
IP
地址。 指标
- 网络成本,赋予此路由的首选值。数值越低,优先级越高。仅将此连接用于其网络上的资源
选择这个复选框以防止连接成为默认路由。选择这个选项意味着只有特别用于路由的流量才会通过连接自动获得,或者手动输入到连接上。
-
要在
VPN
连接中配置IPv6
设置,请选择 菜单条目:IPv6 Method
-
自动
选择此选项以使用IPv6
无状态地址自动配置(SLAAC)根据硬件地址和路由器公告(RA)创建自动、无状态的配置。 -
Automatic, DHCP only
- 选择这个选项来不使用 RA,但从DHCPv6
请求信息以创建有状态的配置。 -
Link-Local Only
- 如果您要连接的网络没有DHCP
服务器且您不想手动分配IP
地址,请选择这个选项。随机地址将根据 RFC 4862 分配,前缀为FE80::0
。 -
如果要手动分配
IP
地址,请手动选择这个选项。 在这个连接中禁用 disable-
IPv6
。请注意,
DNS
,Routes
,Use this connection only for resources on its network
项是IPv4
的常规设置。
-
-
编辑完
VPN
连接后,点 按钮自定义配置或 按钮为现有配置保存它。 -
将配置文件切换到
ON
以激活VPN
连接。 - 如果您在带有 DHCP 或无状态地址自动配置(SLAAC)的网络中使用此主机,则连接可能会受到重定向的影响。有关详情和缓解步骤,请参阅将 VPN 连接分配给专用路由表,以防止连接绕过隧道。
6.15. 使用 nmstatectl 配置基于 IPsec 的 VPN 连接
IPsec(互联网协议安全)是一个安全协议套件,由 Libreswan
提供,用于 VPN 的实现。IPsec 包括在连接建立时启动身份验证的协议,并在数据传输过程中管理密钥。当应用程序在网络中部署,并使用 IP 协议进行通信时,IPsec 可以保护数据通信。
要管理基于 IPsec 的配置来验证 VPN 连接,您可以使用 nmstatectl
工具。此工具提供对用于主机网络管理的声明性 API 的命令行访问。以下是 host-to-subnet
和 host-to-host
通信模式的身份验证类型:
- Host-to-subnet PKI 身份验证
- Host-to-subnet RSA 身份验证
- Host-to-subnet PSK 身份验证
- Host-to-host 隧道模式身份验证
- Host-to-host 传输模式身份验证
6.15.1. 使用 nmstatectl ,配置带有 PKI 身份验证和隧道模式的主机到子网 IPSec VPN
如果要根据 IPsec 中的可信实体身份验证使用加密,公钥基础架构(PKI)通过在两个主机之间使用加密密钥来提供安全通信。两个通信主机都生成私钥和公钥,其中每个主机通过与可信实体证书颁发机构(CA)共享公钥来维护私钥。验证真实性后,CA 生成一个数字证书。在加密和解密的情况下,主机使用私钥进行加密,使用公钥进行解密。
通过使用 Nmstate (一个用于网络管理的声明性 API),您可以配置基于 PKI 身份验证的 IPsec 连接。设置配置后,Nmstate API 确保结果与配置文件匹配。如果有任何失败,nmstate
会自动回滚更改,以避免不正确的系统状态。
要在 主机到子网
配置中建立加密通信,远程 IPsec 端通过使用参数 dhcp: true
向主机提供另一个 IP。在 nmstate 中为 IPsec
定义系统的情况,左侧
命名的系统是本地主机,而 右侧
命名的系统是远程主机。
请注意,由于 NetworkManager-libreswan
插件的设计,您可以在一端使用 nmstatectl
,您必须在另一端手动配置 IPsec。
先决条件
- 通过使用密码,您已生成了一个存储证书和加密密钥的 PKCS #12 文件。
流程
安装所需的软件包:
dnf install nmstate libreswan NetworkManager-libreswan
# dnf install nmstate libreswan NetworkManager-libreswan
Copy to Clipboard Copied! 重启 NetworkManager 服务:
systemctl restart NetworkManager
# systemctl restart NetworkManager
Copy to Clipboard Copied! 由于
Libreswan
已安装,请删除其旧的数据库文件,并重新创建它们:systemctl stop ipsec rm /var/lib/ipsec/nss/*db ipsec initnss
# systemctl stop ipsec # rm /var/lib/ipsec/nss/*db # ipsec initnss
Copy to Clipboard Copied! 启用并启动
ipsec
服务:systemctl enable --now ipsec
# systemctl enable --now ipsec
Copy to Clipboard Copied! 导入 PKCS#12 文件:
ipsec import node-example.p12
# ipsec import node-example.p12
Copy to Clipboard Copied! 导入 PKCS#12 文件时,请输入用来创建该文件的密码。
创建一个包含以下内容的 YAML 文件,如
~/create-pki-authentication.yml
:--- interfaces: - name: 'example_ipsec_conn1' type: ipsec ipv4: enabled: true dhcp: true libreswan: ipsec-interface: 'yes' left: '192.0.2.150' leftid: '%fromcert' leftcert: 'local-host.example.com' right: '192.0.2.250' rightid: '%fromcert' ikev2: 'insist' ikelifetime: '24h' salifetime: '24h'
--- interfaces: - name: 'example_ipsec_conn1'
1 type: ipsec ipv4: enabled: true dhcp: true libreswan: ipsec-interface: 'yes'
2 left: '192.0.2.150'
3 leftid: '%fromcert'
4 leftcert: 'local-host.example.com'
5 right: '192.0.2.250'
6 rightid: '%fromcert'
7 ikev2: 'insist'
8 ikelifetime: '24h'
9 salifetime: '24h'
10 Copy to Clipboard Copied! YAML 文件定义以下设置:
- 1
- IPsec 连接名称
- 2
- 值
yes
表示libreswan
创建一个 IPsecxfrm
虚拟接口ipsec<number>
,并自动查找下一个可用数字 - 3
- 用于本地主机的公共网络接口的静态 IPv4 地址
- 4
- 在本地主机上,
%fromcert
的值将 ID 设置为从加载的证书中获取的可分辨名称(DN) - 5
- 本地主机的公钥的可分辨名称(DN)
- 6
- 用于远程主机的公共网络接口的静态 IPv4 地址
- 7
- 在远程主机上,
%fromcert
的值将 ID 设置为从加载的证书中获取的可分辨名称(DN)。 - 8
insist
值只接受并接收互联网密钥交换(IKEv2)协议- 9
- IKE 协议的持续时间
- 10
- IPsec 安全联盟(SA)的持续时间
将设置应用到系统:
nmstatectl apply ~/create-pki-authentication.yml
# nmstatectl apply ~/create-pki-authentication.yml
Copy to Clipboard Copied! - 如果您在带有 DHCP 或无状态地址自动配置(SLAAC)的网络中使用此主机,则连接可能会受到重定向的影响。有关详情和缓解步骤,请参阅将 VPN 连接分配给专用路由表,以防止连接绕过隧道。
验证
验证 IPsec 状态:
ip xfrm state
# ip xfrm state
Copy to Clipboard Copied! 验证 IPsec 策略:
ip xfrm policy
# ip xfrm policy
Copy to Clipboard Copied!
6.15.2. 使用 nmstatectl 配置带有 RSA 身份验证和隧道模式的主机到子网 IPSec VPN
如果要在 IPsec 中使用基于非对称加密的密钥身份验证,则 RSA 算法通过使用私钥和公钥在两个主机之间进行加密和解密来提供安全通信。此方法使用私钥进行加密,使用公钥进行解密。
通过使用 Nmstate (一个用于网络管理的声明性 API),您可以配置基于 RSA 的 IPsec 身份验证。设置配置后,Nmstate API 确保结果与配置文件匹配。如果有任何失败,nmstate
会自动回滚更改,以避免不正确的系统状态。
要在 主机到子网
配置中建立加密通信,远程 IPsec 端通过使用参数 dhcp: true
向主机提供另一个 IP。在 nmstate 中为 IPsec
定义系统的情况,左侧
命名的系统是本地主机,而 右侧
命名的系统是远程主机。
请注意,由于 NetworkManager-libreswan
插件的设计,您可以在一端使用 nmstatectl
,您必须在另一端手动配置 IPsec。
流程
安装所需的软件包:
dnf install nmstate libreswan NetworkManager-libreswan
# dnf install nmstate libreswan NetworkManager-libreswan
Copy to Clipboard Copied! 重启 NetworkManager 服务:
systemctl restart NetworkManager
# systemctl restart NetworkManager
Copy to Clipboard Copied! 如果
Libreswan
已安装,请删除其旧的数据库文件,并重新创建它们:systemctl stop ipsec rm /var/lib/ipsec/nss/*db ipsec initnss
# systemctl stop ipsec # rm /var/lib/ipsec/nss/*db # ipsec initnss
Copy to Clipboard Copied! 在每个主机上生成一个 RSA 密钥对:
ipsec newhostkey
# ipsec newhostkey
Copy to Clipboard Copied! 上一步返回的生成的密钥
ckaid
。对左侧使用以下命令和ckaid
,例如:ipsec showhostkey --left --ckaid <0sAwEAAesFfVZqFzRA9F>
# ipsec showhostkey --left --ckaid <0sAwEAAesFfVZqFzRA9F>
Copy to Clipboard Copied! 上一命令的输出生成了配置所需的
leftrsasigkey=
行。在第二个主机(右侧)上执行相同的操作:ipsec showhostkey --right --ckaid <0sAwEAAesFfVZqFzRA9E>
# ipsec showhostkey --right --ckaid <0sAwEAAesFfVZqFzRA9E>
Copy to Clipboard Copied! 启用
ipsec
服务,来在引导时自动启动:systemctl enable --now ipsec
# systemctl enable --now ipsec
Copy to Clipboard Copied! 创建一个包含以下内容的 YAML 文件,如
~/create-rsa-authentication.yml
:--- interfaces: - name: 'example_ipsec_conn1' type: ipsec ipv4: enabled: true dhcp: true libreswan: ipsec-interface: '99' leftrsasigkey: '0sAwEAAesFfVZqFzRA9F' left: '192.0.2.150' leftid: 'local-host-rsa.example.com' right: '192.0.2.250' rightrsasigkey: '0sAwEAAesFfVZqFzRA9E' rightid: 'remote-host-rsa.example.com' ikev2: 'insist'
--- interfaces: - name: 'example_ipsec_conn1'
1 type: ipsec
2 ipv4: enabled: true dhcp: true libreswan: ipsec-interface: '99'
3 leftrsasigkey: '0sAwEAAesFfVZqFzRA9F'
4 left: '192.0.2.150'
5 leftid: 'local-host-rsa.example.com'
6 right: '192.0.2.250'
7 rightrsasigkey: '0sAwEAAesFfVZqFzRA9E'
8 rightid: 'remote-host-rsa.example.com'
9 ikev2: 'insist'
10 Copy to Clipboard Copied! YAML 文件定义以下设置:
将设置应用到系统:
nmstatectl apply ~/create-rsa-authentication.yml
# nmstatectl apply ~/create-rsa-authentication.yml
Copy to Clipboard Copied! - 如果您在带有 DHCP 或无状态地址自动配置(SLAAC)的网络中使用此主机,则连接可能会受到重定向的影响。有关详情和缓解步骤,请参阅将 VPN 连接分配给专用路由表,以防止连接绕过隧道。
验证
显示网络接口的 IP 设置:
ip addr show <device_name>
# ip addr show <device_name>
Copy to Clipboard Copied! 验证 IPsec 状态:
ip xfrm state
# ip xfrm state
Copy to Clipboard Copied! 验证 IPsec 策略:
ip xfrm policy
# ip xfrm policy
Copy to Clipboard Copied!
6.15.3. 使用 nmstatectl 配置带有 PSK 身份验证和隧道模式的主机到子网 IPSec VPN
如果要在 IPsec 中使用基于相互认证的加密,Pre-Shared Key (PSK)方法通过在两个主机之间使用机密密钥来提供安全通信。文件存储机密密钥,相同的密钥加密通过隧道的数据流。
通过使用 Nmstate (一个用于网络管理的声明性 API),您可以配置基于 PSK 的 IPsec 身份验证。设置配置后,Nmstate API 确保结果与配置文件匹配。如果有任何失败,nmstate
会自动回滚更改,以避免不正确的系统状态。
要在 主机到子网
配置中建立加密通信,远程 IPsec 端通过使用参数 dhcp: true
向主机提供另一个 IP。在 nmstate 中为 IPsec
定义系统的情况,左侧
命名的系统是本地主机,而 右侧
命名的系统是远程主机。
请注意,由于 NetworkManager-libreswan
插件的设计,您可以在一端使用 nmstatectl
,您必须在另一端手动配置 IPsec。
由于此方法使用静态字符串进行身份验证和加密,因此仅用于测试/开发目的。
流程
安装所需的软件包:
dnf install nmstate libreswan NetworkManager-libreswan
# dnf install nmstate libreswan NetworkManager-libreswan
Copy to Clipboard Copied! 重启 NetworkManager 服务:
systemctl restart NetworkManager
# systemctl restart NetworkManager
Copy to Clipboard Copied! 如果
Libreswan
已安装,请删除其旧的数据库文件,并重新创建它们:systemctl stop ipsec rm /var/lib/ipsec/nss/*db ipsec initnss
# systemctl stop ipsec # rm /var/lib/ipsec/nss/*db # ipsec initnss
Copy to Clipboard Copied! 启用
ipsec
服务,来在引导时自动启动:systemctl enable --now ipsec
# systemctl enable --now ipsec
Copy to Clipboard Copied! 创建一个包含以下内容的 YAML 文件,如
~/create-pks-authentication.yml
:--- interfaces: - name: 'example_ipsec_conn1' type: ipsec ipv4: enabled: true dhcp: true libreswan: ipsec-interface: 'no' right: '192.0.2.150' rightid: 'remote-host.example.org' left: '192.0.2.250' leftid: 'local-host.example.org' psk: "example_password" ikev2: 'insist'
--- interfaces: - name: 'example_ipsec_conn1'
1 type: ipsec ipv4: enabled: true dhcp: true libreswan: ipsec-interface: 'no'
2 right: '192.0.2.150'
3 rightid: 'remote-host.example.org'
4 left: '192.0.2.250'
5 leftid: 'local-host.example.org'
6 psk: "example_password" ikev2: 'insist'
7 Copy to Clipboard Copied! YAML 文件定义以下设置:
将设置应用到系统:
nmstatectl apply ~/create-pks-authentication.yml
# nmstatectl apply ~/create-pks-authentication.yml
Copy to Clipboard Copied! - 如果您在带有 DHCP 或无状态地址自动配置(SLAAC)的网络中使用此主机,则连接可能会受到重定向的影响。有关详情和缓解步骤,请参阅将 VPN 连接分配给专用路由表,以防止连接绕过隧道。
验证
显示网络接口的 IP 设置:
ip addr show <device_name>
# ip addr show <device_name>
Copy to Clipboard Copied! 验证 IPsec 状态:
ip xfrm state
# ip xfrm state
Copy to Clipboard Copied! 验证 IPsec 策略:
ip xfrm policy
# ip xfrm policy
Copy to Clipboard Copied!
6.15.4. 使用 nmstatectl 配置具有 PKI 身份验证和隧道模式的主机到主机的 IPsec VPN
IPsec (互联网协议安全)是一个安全协议套件,用于验证和加密网络和设备中的 IP 通信。Libreswan
软件为 VPN 提供一个 IPsec 实现。
在隧道模式中,通信的源和目标 IP 地址在 IPsec 隧道中被加密。外部网络嗅探器只能获取左侧 IP 和右侧 IP。通常,对于隧道模式,它支持 host-to-host
、host-to-subnet
和 subnet-to-subnet
。在此模式中,新的 IP 数据包封装现有的数据包及其有效负载和标头。此模式下的封装保护不安全网络上的 IP 数据、源和目标标头。此模式可用于在 subnet-to-subnet
、远程访问连接和不受信任的网络(如开放的公共 Wi-Fi 网络)中传输数据。默认情况下,IPsec 在隧道模式下,在两个站点之间建立一个安全通道。使用以下配置,您可以将 VPN 连接建立成一个 host-to-host
架构。
通过使用 Nmstate (一个用于网络管理的声明性 API),您可以配置 IPsec VPN 连接。设置配置后,Nmstate API 确保结果与配置文件匹配。如果有任何失败,nmstate
会自动回滚更改,以避免不正确的系统状态。
在 host-to-host
配置中,您需要设置 leftmodecfgclient: no
,以便它不能从服务器接收网络配置,因此该值为 no
。在 nmstate 中为 IPsec
定义系统的情况,左侧
命名的系统是本地主机,而 右侧
命名的系统是远程主机。
请注意,由于 NetworkManager-libreswan
插件的设计,您可以在一端使用 nmstatectl
,您必须在另一端手动配置 IPsec。
先决条件
- 通过使用密码,您已生成了一个存储证书和加密密钥的 PKCS #12 文件。
流程
安装所需的软件包:
dnf install nmstate libreswan NetworkManager-libreswan
# dnf install nmstate libreswan NetworkManager-libreswan
Copy to Clipboard Copied! 重启 NetworkManager 服务:
systemctl restart NetworkManager
# systemctl restart NetworkManager
Copy to Clipboard Copied! 由于
Libreswan
已安装,请删除其旧的数据库文件,并重新创建它们:systemctl stop ipsec rm /var/lib/ipsec/nss/*db ipsec initnss
# systemctl stop ipsec # rm /var/lib/ipsec/nss/*db # ipsec initnss
Copy to Clipboard Copied! 导入 PKCS#12 文件:
ipsec import node-example.p12
# ipsec import node-example.p12
Copy to Clipboard Copied! 在导入 PKCS#12 文件时,输入用来生成该文件的密码。
启用并启动
ipsec
服务:systemctl enable --now ipsec
# systemctl enable --now ipsec
Copy to Clipboard Copied! 一个创建包含以下内容的 YAML 文件,如
~/create-p2p-vpn-authentication.yml
:--- interfaces: - name: 'example_ipsec_conn1' type: ipsec libreswan: left: '192.0.2.150' leftid: 'local-host.example.com' leftcert: 'local-host.example.com' leftmodecfgclient: no right: '192.0.2.250' rightid: 'remote-host.example.com' rightsubnet: '192.0.2.150/32' ikev2: 'insist'
--- interfaces: - name: 'example_ipsec_conn1'
1 type: ipsec libreswan: left: '192.0.2.150'
2 leftid: 'local-host.example.com'
3 leftcert: 'local-host.example.com'
4 leftmodecfgclient: no
5 right: '192.0.2.250'
6 rightid: 'remote-host.example.com'
7 rightsubnet: '192.0.2.150/32'
8 ikev2: 'insist'
9 Copy to Clipboard Copied! YAML 文件定义以下设置:
将设置应用到系统:
nmstatectl apply ~/create-p2p-vpn-authentication.yml
# nmstatectl apply ~/create-p2p-vpn-authentication.yml
Copy to Clipboard Copied! - 如果您在带有 DHCP 或无状态地址自动配置(SLAAC)的网络中使用此主机,则连接可能会受到重定向的影响。有关详情和缓解步骤,请参阅将 VPN 连接分配给专用路由表,以防止连接绕过隧道。
验证
显示创建的 P2P 策略:
ip xfrm policy
# ip xfrm policy
Copy to Clipboard Copied! 验证 IPsec 状态:
ip xfrm state
# ip xfrm state
Copy to Clipboard Copied!
6.15.5. 使用 nmstatectl 使用 PKI 身份验证和传输模式配置主机到主机的 IPsec VPN
IPsec (互联网协议安全)是一个安全协议套件,用于验证和加密网络和设备中的 IP 通信。Libreswan
工具为 VPN 提供基于 IPsec 的实现。
在传输模式下,加密仅适用于 IP 数据包的有效负载。另外,通过保持原始 IP 标头,新的 IPsec 标头被附加到 IP 数据包中。传输模式不会加密通信的源和目标 IP,而是将它们复制到外部 IP 标头中。因此,加密只保护网络中的 IP 数据。此模式可用于在网络的 host-to-host
连接中传输数据。此模式通常与 GRE 隧道一起使用,以节省 20 字节(IP 标头)的开销。默认情况下,IPsec
工具使用隧道模式。要使用传输模式,请为 host-to-host
连接数据传输设置 type: transport
。
通过使用 Nmstate (一个用于网络管理的声明性 API),您可以配置 IPsec VPN 连接。设置配置后,Nmstate API 确保结果与配置文件匹配。如果有任何失败,nmstate
会自动回滚更改,以避免不正确的系统状态。要覆盖默认的 tunnel
模式,请指定 transport
模式。
在 nmstate 中为 IPsec
定义系统的情况,左侧
命名的系统是本地主机,而 右侧
命名的系统是远程主机。
请注意,由于 NetworkManager-libreswan
插件的设计,您可以在一端使用 nmstatectl
,您必须在另一端手动配置 IPsec。
先决条件
- 通过使用密码,您已生成了一个存储证书和加密密钥的 PKCS #12 文件。
流程
安装所需的软件包:
dnf install nmstate libreswan NetworkManager-libreswan
# dnf install nmstate libreswan NetworkManager-libreswan
Copy to Clipboard Copied! 重启 NetworkManager 服务:
systemctl restart NetworkManager
# systemctl restart NetworkManager
Copy to Clipboard Copied! 由于
Libreswan
已安装,请删除其旧的数据库文件,并重新创建它们:systemctl stop ipsec rm /var/lib/ipsec/nss/*db ipsec initnss
# systemctl stop ipsec # rm /var/lib/ipsec/nss/*db # ipsec initnss
Copy to Clipboard Copied! 导入 PKCS#12 文件:
ipsec import node-example.p12
# ipsec import node-example.p12
Copy to Clipboard Copied! 导入 PKCS#12 文件时,请输入用来创建该文件的密码。
启用并启动
ipsec
服务:systemctl enable --now ipsec
# systemctl enable --now ipsec
Copy to Clipboard Copied! 创建一个包含以下内容的 YAML 文件,如
~/create-p2p-transport-authentication.yml
:--- interfaces: - name: 'example_ipsec_conn1' type: ipsec libreswan: type: 'transport' ipsec-interface: '99' left: '192.0.2.150' leftid: '%fromcert' leftcert: 'local-host.example.org' right: '192.0.2.250' prefix-length: '32' rightid: '%fromcert' ikev2: 'insist' ikelifetime: '24h' salifetime: '24h'
--- interfaces: - name: 'example_ipsec_conn1'
1 type: ipsec libreswan: type: 'transport'
2 ipsec-interface: '99'
3 left: '192.0.2.150'
4 leftid: '%fromcert'
5 leftcert: 'local-host.example.org'
6 right: '192.0.2.250'
7 prefix-length: '32'
8 rightid: '%fromcert'
9 ikev2: 'insist'
10 ikelifetime: '24h'
11 salifetime: '24h'
12 Copy to Clipboard Copied! YAML 文件定义以下设置:
- 1
- IPsec 连接名称
- 2
- IPsec 模式
- 3
- 值
99
表示libreswan
创建一个 IPsecxfrm
虚拟接口ipsec<number>
,并自动查找下一个可用数字 - 4
- 用于本地主机的公共网络接口的静态 IPv4 地址
- 5
- 在本地主机上,
%fromcert
的值将 ID 设置为从加载的证书获取的可分辨名称(DN) - 6
- 本地主机的公钥的可分辨名称(DN)
- 7
- 用于远程主机的公共网络接口的静态 IPv4 地址
- 8
- 本地主机的静态 IPv4 地址的子网掩码
- 9
- 在远程主机上,
%fromcert
的值将 ID 设置为从加载的证书中获取的可分辨名称(DN) - 10
- 只接受和接收互联网密钥交换(IKEv2)协议的值
- 11
- IKE 协议的持续时间
- 12
- IPsec 安全联盟(SA)的持续时间
将设置应用到系统:
nmstatectl apply ~/create-p2p-transport-authentication.yml
# nmstatectl apply ~/create-p2p-transport-authentication.yml
Copy to Clipboard Copied! - 如果您在带有 DHCP 或无状态地址自动配置(SLAAC)的网络中使用此主机,则连接可能会受到重定向的影响。有关详情和缓解步骤,请参阅将 VPN 连接分配给专用路由表,以防止连接绕过隧道。
验证
验证 IPsec 状态:
ip xfrm state
# ip xfrm state
Copy to Clipboard Copied! 验证 IPsec 策略:
ip xfrm policy
# ip xfrm policy
Copy to Clipboard Copied!
6.16. 将 VPN 连接分配给专用路由表,以防止连接绕过隧道
DHCP 服务器和无状态地址自动配置(SLAAC)都可以将路由添加到客户端的路由表中。例如,恶意的 DHCP 服务器可以使用此功能强制带有 VPN 连接的主机通过物理接口而不是 VPN 隧道重定向流量。此漏洞也称为 TunnelVision,并参见 CVE-2024-3661 漏洞文章中所述。
要缓解此漏洞,您可以将 VPN 连接分配给专用路由表。这可防止 DHCP 配置或 SLAAC 来处理用于 VPN 隧道的网络数据包的路由决策。
如果至少有一个条件应用到您的环境,请按照以下步骤操作:
- 至少一个网络接口使用 DHCP 或 SLAAC。
- 您的网络不使用阻止恶意 DHCP 服务器的机制,如 DHCP 侦听。
通过 VPN 路由整个流量可防止主机访问本地网络资源。
流程
- 决定您要使用的路由表。以下步骤使用表 75。默认情况下,RHEL 不使用表 1-254,您可以使用其中任何一个。
配置 VPN 连接配置文件,将 VPN 路由放在专用路由表中:
nmcli connection modify <vpn_connection_profile> ipv4.route-table 75 ipv6.route-table 75
# nmcli connection modify <vpn_connection_profile> ipv4.route-table 75 ipv6.route-table 75
Copy to Clipboard Copied! 为您在上一命令中使用的表设置低优先级值:
nmcli connection modify <vpn_connection_profile> ipv4.routing-rules "priority 32345 from all table 75" ipv6.routing-rules "priority 32345 from all table 75"
# nmcli connection modify <vpn_connection_profile> ipv4.routing-rules "priority 32345 from all table 75" ipv6.routing-rules "priority 32345 from all table 75"
Copy to Clipboard Copied! 优先级值可以是 1 到 32766 之间的任何值。值越低,优先级越高。
重新连接 VPN 连接:
nmcli connection down <vpn_connection_profile> nmcli connection up <vpn_connection_profile>
# nmcli connection down <vpn_connection_profile> # nmcli connection up <vpn_connection_profile>
Copy to Clipboard Copied!
验证
在表 75 中显示 IPv4 路由:
ip route show table 75
# ip route show table 75 ... 192.0.2.0/24 via 192.0.2.254 dev vpn_device proto static metric 50 default dev vpn_device proto static scope link metric 50
Copy to Clipboard Copied! 输出确认到远程网络和默认网关路由到路由表 75,因此所有流量都通过隧道路由。如果您在 VPN 连接配置集中设置
ipv4.never-default true
,则不会创建默认路由,因此无法在此输出中可见。在表 75 中显示 IPv6 路由:
ip -6 route show table 75
# ip -6 route show table 75 ... 2001:db8:1::/64 dev vpn_device proto kernel metric 50 pref medium default dev vpn_device proto static metric 50 pref medium
Copy to Clipboard Copied! 输出确认到远程网络和默认网关路由到路由表 75,因此所有流量都通过隧道路由。如果您在 VPN 连接配置集中设置
ipv6.never-default true
,则不会创建默认路由,因此无法在此输出中可见。
第 7 章 设置 WireGuard VPN
WireGuard 是一个在 Linux 内核中运行的高性能 VPN 解决方案。它使用现代加密机制,并且比许多其他 VPN 解决方案更容易配置。另外,WireGuard 的小代码库降低了安全攻击的攻击面,因此提高安全性。对于身份验证和加密,WireGuard 使用类似于 SSH 的键。
WireGuard 只作为技术预览提供。红帽产品服务级别协议(SLA)不支持技术预览功能,且其功能可能并不完善,因此红帽不建议在生产环境中使用它们。这些预览可让用户早期访问将来的产品功能,让用户在开发过程中测试并提供反馈意见。
如需有关 技术预览功能支持范围 的信息,请参阅红帽客户门户网站中的技术预览功能支持范围。
请注意,参与 WireGuard VPN 的所有主机都是同级的。本文档使用术语 客户端
来描述建立连接的主机,使用 服务器
来描述固定主机名或客户端连接的 IP 地址的主机,并可选通过这个服务器路由所有流量。
要设置 WireGuard VPN,您必须完成以下步骤:
- 配置服务器。
- 在本地防火墙中打开 WireGuard 端口。
- 配置客户端。
WireGuard 在网络层(层 3)上运行。因此,您无法使用 DHCP,且必须为服务器和客户端上的隧道设备分配静态 IP 地址或 IPv6 全局地址。
只有在禁用 RHEL 中的 Federal Information Processing Standard(FIPS)模式时,才能使用 WireGuard。
7.1. WireGuard 使用的协议和原语
WireGuard 使用以下协议和原语:
7.2. WireGuard 如何使用隧道 IP 地址、公钥和远程端点
当 WireGuard 将网络数据包发送到对等点时:
- WireGuard 从数据包读取目标 IP,并将其与本地配置中允许的 IP 地址列表进行比较。如果未找到 peer,WireGuard 会丢弃数据包。
- 如果 peer 有效,WireGuard 使用对等的公钥对数据包进行加密。
- 发送主机查找主机的最新互联网 IP 地址,并将加密数据包发送到此地址。
当 WireGuard 接收数据包时:
- WireGuard 使用远程主机的私钥解密数据包。
- WireGuard 从数据包读取内部源地址,并在本地主机上对等点的设置中查询 IP 地址是否配置。如果源 IP 位于允许列表中,WireGuard 会接受数据包。如果 IP 地址不在列表中,WireGuard 会丢弃数据包。
公钥和允许的 IP 地址的关联称为 加密密钥路由表
。这意味着,当发送数据包时,IP 地址列表的行为与路由表相似,在接收数据包时作为一种访问控制列表。
7.3. 使用 NAT 和防火墙后面的 WireGuard 客户端
WireGuard 使用 UDP 协议,只有在对等点发送数据包时才会传输数据。路由器上的有状态防火墙和网络地址转换(NAT)可跟踪连接,以启用 NAT 或防火墙接收数据包的对等点。
为了保持连接处于活动状态,WireGuard 支持 持久性 keepalives
。这意味着您可以设置一个间隔,其中 WireGuard 发送 keepalive 数据包。默认情况下,禁用持久的 keep-alive 功能来减少网络流量。如果您在带有 NAT 的网络中使用客户端,或者防火墙在一定时间不活动状态后关闭连接,在客户端上启用此功能。
请注意,您无法使用 RHEL web 控制台在 WireGuard 连接中配置 keepalive 数据包。要配置此功能,请使用 nmcli
工具编辑连接配置文件。
7.4. 创建在 WireGuard 连接中使用的私钥和公钥
WireGuard 使用 base64 编码的私钥和公钥来互相验证主机。因此,您必须在参与 WireGuard VPN 的每个主机上创建密钥。
对于安全连接,请为每个主机创建不同的密钥,并确保只使用远程 WireGuard 主机共享公钥。不要使用本文档中使用的示例键。
如果您计划使用 RHEL web 控制台创建 WireGuard VPN 连接,您可以在 web 控制台中生成公钥和私钥对。
流程
安装
wireguard-tools
软件包:dnf install wireguard-tools
# dnf install wireguard-tools
Copy to Clipboard Copied! 为主机创建私钥和对应的公钥:
wg genkey | tee /etc/wireguard/$HOSTNAME.private.key | wg pubkey > /etc/wireguard/$HOSTNAME.public.key
# wg genkey | tee /etc/wireguard/$HOSTNAME.private.key | wg pubkey > /etc/wireguard/$HOSTNAME.public.key
Copy to Clipboard Copied! 您需要密钥文件的内容,而不是文件本身。但是,红帽建议在将来需要记住密钥时保留文件。
在密钥文件中设置安全权限:
chmod 600 /etc/wireguard/$HOSTNAME.private.key /etc/wireguard/$HOSTNAME.public.key
# chmod 600 /etc/wireguard/$HOSTNAME.private.key /etc/wireguard/$HOSTNAME.public.key
Copy to Clipboard Copied! 显示私钥:
cat /etc/wireguard/$HOSTNAME.private.key YFAnE0psgIdiAF7XR4abxiwVRnlMfeltxu10s/c4JXg=
# cat /etc/wireguard/$HOSTNAME.private.key YFAnE0psgIdiAF7XR4abxiwVRnlMfeltxu10s/c4JXg=
Copy to Clipboard Copied! 您需要私钥在本地主机上配置 WireGuard 连接。不要共享私钥。
显示公钥:
cat /etc/wireguard/$HOSTNAME.public.key UtjqCJ57DeAscYKRfp7cFGiQqdONRn69u249Fa4O6BE=
# cat /etc/wireguard/$HOSTNAME.public.key UtjqCJ57DeAscYKRfp7cFGiQqdONRn69u249Fa4O6BE=
Copy to Clipboard Copied! 您需要公钥在远程主机上配置 WireGuard 连接。
7.5. 使用 nmcli
配置 WireGuard 服务器
您可以通过在 NetworkManager 中创建连接配置集来配置 WireGuard 服务器。使用此方法让 NetworkManager 管理 WireGuard 连接。
此流程假设以下设置:
server:
-
私钥:
YFAnE0psgIdiAF7XR4abxiwVRnlMfeltxu10s/c4JXg=
-
隧道 IPv4 地址:
192.0.2.1/24
-
频道 IPv6 地址:
2001:db8:1::1/32
-
私钥:
Client:
-
Public key:
bnwfQcC8/g2i4vvEqcRUM2e6Hi3Nskk6G9t4r26nFVM=
-
隧道 IPv4 地址:
192.0.2.2/24
-
频道 IPv6 地址:
2001:db8:1::2/32
-
Public key:
先决条件
- 您已为服务器和客户端生成了公钥和私钥。
您知道以下信息:
- 服务器的私钥
- 客户端的静态隧道 IP 地址和子网掩码
- 客户端的公钥
- 服务器的静态隧道 IP 地址和子网掩码
流程
添加 NetworkManager WireGuard 连接配置集:
nmcli connection add type wireguard con-name server-wg0 ifname wg0 autoconnect no
# nmcli connection add type wireguard con-name server-wg0 ifname wg0 autoconnect no
Copy to Clipboard Copied! 此命令创建一个名为
server-wg0
的配置文件,并将虚拟接口wg0
分配给它。要防止连接在添加后而没有最终配置的情况下自动启动,请禁用autoconnect
参数。设置服务器的隧道 IPv4 地址和子网掩码:
nmcli connection modify server-wg0 ipv4.method manual ipv4.addresses 192.0.2.1/24
# nmcli connection modify server-wg0 ipv4.method manual ipv4.addresses 192.0.2.1/24
Copy to Clipboard Copied! 设置服务器的隧道 IPv6 地址和子网掩码:
nmcli connection modify server-wg0 ipv6.method manual ipv6.addresses 2001:db8:1::1/32
# nmcli connection modify server-wg0 ipv6.method manual ipv6.addresses 2001:db8:1::1/32
Copy to Clipboard Copied! 将服务器的私钥添加到连接配置集中:
nmcli connection modify server-wg0 wireguard.private-key "YFAnE0psgIdiAF7XR4abxiwVRnlMfeltxu10s/c4JXg="
# nmcli connection modify server-wg0 wireguard.private-key "YFAnE0psgIdiAF7XR4abxiwVRnlMfeltxu10s/c4JXg="
Copy to Clipboard Copied! 为传入的 WireGuard 连接设定端口:
nmcli connection modify server-wg0 wireguard.listen-port 51820
# nmcli connection modify server-wg0 wireguard.listen-port 51820
Copy to Clipboard Copied! 在主机上始终设置固定端口号,接收传入的 WireGuard 连接。如果您没有设置端口,WireGuard 会在每次激活
wg0
接口时使用随机的空闲端口。为您要允许与此服务器通信的每个客户端添加对等配置。您必须手动添加这些设置,因为
nmcli
工具不支持设置相应的连接属性。编辑
/etc/NetworkManager/system-connections/server-wg0.nmconnection
文件,并附加:[wireguard-peer.bnwfQcC8/g2i4vvEqcRUM2e6Hi3Nskk6G9t4r26nFVM=] allowed-ips=192.0.2.2;2001:db8:1::2;
[wireguard-peer.bnwfQcC8/g2i4vvEqcRUM2e6Hi3Nskk6G9t4r26nFVM=] allowed-ips=192.0.2.2;2001:db8:1::2;
Copy to Clipboard Copied! -
[wireguard-peer.<public_key_of_the_client>]
条目定义客户端对等的部分,以及包含客户端公钥的部分的名称。 allowed-ips
参数设置允许向这个服务器发送数据的客户端的隧道 IP 地址。为每个客户端添加一个部分。
-
重新载入
server-wg0
连接配置文件:nmcli connection load /etc/NetworkManager/system-connections/server-wg0.nmconnection
# nmcli connection load /etc/NetworkManager/system-connections/server-wg0.nmconnection
Copy to Clipboard Copied!
可选:将连接配置为自动启动,请输入:
nmcli connection modify server-wg0 autoconnect yes
# nmcli connection modify server-wg0 autoconnect yes
Copy to Clipboard Copied! 重新激活
server-wg0
连接:nmcli connection up server-wg0
# nmcli connection up server-wg0
Copy to Clipboard Copied! - 如果您在带有 DHCP 或无状态地址自动配置(SLAAC)的网络中使用此主机,则连接可能会受到重定向的影响。有关详情和缓解步骤,请参阅将 VPN 连接分配给专用路由表,以防止连接绕过隧道。
验证
显示
wg0
设备的接口配置:wg show wg0
# wg show wg0 interface: wg0 public key: UtjqCJ57DeAscYKRfp7cFGiQqdONRn69u249Fa4O6BE= private key: (hidden) listening port: 51820 peer: bnwfQcC8/g2i4vvEqcRUM2e6Hi3Nskk6G9t4r26nFVM= allowed ips: 192.0.2.2/32, 2001:db8:1::2/128
Copy to Clipboard Copied! 要在输出中显示私钥,请使用
WG_HIDE_KEYS=never wg show wg0
命令。显示
wg0
设备的 IP 配置:ip address show wg0
# ip address show wg0 20: wg0: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1420 qdisc noqueue state UNKNOWN group default qlen 1000 link/none inet 192.0.2.1/24 brd 192.0.2.255 scope global noprefixroute wg0 valid_lft forever preferred_lft forever inet6 2001:db8:1::1/32 scope global noprefixroute valid_lft forever preferred_lft forever inet6 fe80::3ef:8863:1ce2:844/64 scope link noprefixroute valid_lft forever preferred_lft forever
Copy to Clipboard Copied!
7.6. 使用 nmtui
配置 WireGuard 服务器
您可以通过在 NetworkManager 中创建连接配置集来配置 WireGuard 服务器。使用此方法让 NetworkManager 管理 WireGuard 连接。
此流程假设以下设置:
server:
-
私钥:
YFAnE0psgIdiAF7XR4abxiwVRnlMfeltxu10s/c4JXg=
-
隧道 IPv4 地址:
192.0.2.1/24
-
频道 IPv6 地址:
2001:db8:1::1/32
-
私钥:
Client:
-
Public key:
bnwfQcC8/g2i4vvEqcRUM2e6Hi3Nskk6G9t4r26nFVM=
-
隧道 IPv4 地址:
192.0.2.2/24
-
频道 IPv6 地址:
2001:db8:1::2/32
-
Public key:
先决条件
- 您已为服务器和客户端生成了公钥和私钥。
您知道以下信息:
- 服务器的私钥
- 客户端的静态隧道 IP 地址和子网掩码
- 客户端的公钥
- 服务器的静态隧道 IP 地址和子网掩码
-
已安装
NetworkManager-tui
软件包。
流程
启动
nmtui
应用程序:nmtui
# nmtui
Copy to Clipboard Copied! - 选择 Edit a connection,然后按 Enter。
- 选择 ,然后按 Enter 键。
- 选择列表中的 WireGuard 连接类型,然后按 Enter 键。
在 Edit connection 窗口中:
-
输入连接名称和虚拟接口,如
wg0
,以便 NetworkManager 应分配给连接。 - 输入服务器的私钥。
为传入的 WireGuard 连接设置侦听端口号,如
51820
。在主机上始终设置固定端口号,接收传入的 WireGuard 连接。如果您没有设置端口,WireGuard 会在每次激活接口时都使用一个随机的空闲端口。
点 Peers 窗格旁的 :
- 输入客户端的公钥。
- 将 Allowed IP 字段设置为允许向这个服务器发送数据的客户端的隧道 IP 地址。
选择
,然后按 Enter 键。
选择 *IPv4 Configuration 旁边的
,然后按 Enter 键。- 选择 IPv4 配置方法 Manual。
- 输入隧道 IPv4 地址和子网掩码。将 Gateway 字段留空。
选择 IPv6 Configuration 旁边的 ,然后按 Enter 键。
- 选择 IPv6 配置方法 Manual。
-
输入隧道 IPv6 地址和子网掩码。将
Gateway
字段留空。
选择
,然后按 Enter键
-
输入连接名称和虚拟接口,如
- 在带有连接列表的窗口中,选择 ,然后按 Enter 键。
- 在 NetworkManager TUI 主窗口中,选择 ,然后按 Enter 键。
- 如果您在带有 DHCP 或无状态地址自动配置(SLAAC)的网络中使用此主机,则连接可能会受到重定向的影响。有关详情和缓解步骤,请参阅将 VPN 连接分配给专用路由表,以防止连接绕过隧道。
验证
显示
wg0
设备的接口配置:wg show wg0
# wg show wg0 interface: wg0 public key: UtjqCJ57DeAscYKRfp7cFGiQqdONRn69u249Fa4O6BE= private key: (hidden) listening port: 51820 peer: bnwfQcC8/g2i4vvEqcRUM2e6Hi3Nskk6G9t4r26nFVM= allowed ips: 192.0.2.2/32, 2001:db8:1::2/128
Copy to Clipboard Copied! 要在输出中显示私钥,请使用
WG_HIDE_KEYS=never wg show wg0
命令。显示
wg0
设备的 IP 配置:ip address show wg0
# ip address show wg0 20: wg0: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1420 qdisc noqueue state UNKNOWN group default qlen 1000 link/none inet 192.0.2.1/24 brd 192.0.2.255 scope global noprefixroute wg0 valid_lft forever preferred_lft forever inet6 _2001:db8:1::1/32 scope global noprefixroute valid_lft forever preferred_lft forever inet6 fe80::3ef:8863:1ce2:844/64 scope link noprefixroute valid_lft forever preferred_lft forever
Copy to Clipboard Copied!
7.7. 使用 RHEL web 控制台配置 WireGuard 服务器
您可以使用基于浏览器的 RHEL web 控制台配置 WireGuard 服务器。使用此方法让 NetworkManager 管理 WireGuard 连接。
先决条件
- 已登陆到 RHEL web 控制台。
您知道以下信息:
- 服务器和客户端的静态隧道 IP 地址和子网掩码
- 客户端的公钥
流程
- 在屏幕左侧的导航中选择 Networking 选项卡。
- 在 Interfaces 部分中点 Add VPN。
-
如果没有安装
wireguard-tools
和systemd-resolved
软件包,Web 控制台会显示一条相应的通知。点 Install 安装这些软件包。 - 输入您要创建的 WireGuard 设备的名称。
配置此主机的密钥对:
如果要使用 web 控制台已创建的密钥:
- 在 Private key 区域中保留预先选择的 Generated 选项。
- 注意 Public key 值。配置客户端时需要此信息。
如果要使用现有的私钥:
- 在 Private key 区域中选择 Paste existing key。
- 将私钥粘贴到文本字段中。Web 控制台自动计算相应的公钥。
为传入的 WireGuard 连接设置一个侦听端口号,如
51820
。在主机上始终设置固定端口号,接收传入的 WireGuard 连接。如果您没有设置端口,WireGuard 会在每次激活接口时都使用一个随机的空闲端口。
设置服务器的隧道 IPv4 地址和子网掩码。
如果还要设置 IPv6 地址,您必须在创建连接后编辑它。
为您要允许与此服务器进行通信的每个客户端添加对等配置:
- 单击 Add peer。
- 输入客户端的公钥。
- 将 Endpoint 字段留空。
- 将 Allowed IP 字段设置为允许向这个服务器发送数据的客户端的隧道 IP 地址。
- 点 Add 创建 WireGuard 连接。
如果您还想设置隧道 IPv6 地址:
- 在 Interfaces 部分中点 WireGuard 连接的名称。
- 点 IPv6 旁边的 edit。
-
将 Addresses 字段设置为
Manual
,并输入服务器的隧道 IPv6 地址和前缀。 - 点击 Save。
- 如果您在带有 DHCP 或无状态地址自动配置(SLAAC)的网络中使用此主机,则连接可能会受到重定向的影响。有关详情和缓解步骤,请参阅将 VPN 连接分配给专用路由表,以防止连接绕过隧道。
验证
显示
wg0
设备的接口配置:wg show wg0
# wg show wg0 interface: wg0 public key: UtjqCJ57DeAscYKRfp7cFGiQqdONRn69u249Fa4O6BE= private key: (hidden) listening port: 51820 peer: bnwfQcC8/g2i4vvEqcRUM2e6Hi3Nskk6G9t4r26nFVM= allowed ips: 192.0.2.2/32, 2001:db8:1::2/128
Copy to Clipboard Copied! 要在输出中显示私钥,请使用
WG_HIDE_KEYS=never wg show wg0
命令。显示
wg0
设备的 IP 配置:ip address show wg0
# ip address show wg0 20: wg0: <POINTOPOINT,NOARP,UP,LOWERUP> mtu 1420 qdisc noqueue state UNKNOWN group default qlen 1000 link/none inet 192.0.2.1/24 brd 192.0.2.255 scope global noprefixroute wg0 valid_lft forever preferred_lft forever inet6 2001:db8:1::1/32 scope global noprefixroute valid_lft forever preferred_lft forever inet6 fe80::3ef:8863:1ce2:844/64 scope link noprefixroute valid_lft forever preferred_lft forever
Copy to Clipboard Copied!
7.8. 使用命令行在 WireGuard 服务器上配置 firewalld
您必须在 WireGuard 服务器上配置 firewalld
服务,以允许来自客户端的传入的连接。另外,如果客户端能够使用 WireGuard 服务器作为默认网关,并通过隧道路由所有流量,则必须启用伪装。
流程
为
firewalld
服务中的传入连接打开 WireGuard 端口:firewall-cmd --permanent --add-port=51820/udp --zone=public
# firewall-cmd --permanent --add-port=51820/udp --zone=public
Copy to Clipboard Copied! 如果客户端应该使用 WireGuard 服务器作为默认网关来通过隧道路由所有流量,请为
public
区域启用伪装:firewall-cmd --permanent --zone=public --add-masquerade
# firewall-cmd --permanent --zone=public --add-masquerade
Copy to Clipboard Copied! 重新加载
firewalld
规则。firewall-cmd --reload
# firewall-cmd --reload
Copy to Clipboard Copied!
验证
显示
public
区域的配置:firewall-cmd --list-all
# firewall-cmd --list-all public (active) ... ports: 51820/udp masquerade: yes ...
Copy to Clipboard Copied!
7.9. 使用 RHEL web 控制台在 WireGuard 服务器上配置 firewalld
您必须在 WireGuard 服务器上配置 firewalld 服务,以允许来自客户端的进入连接。另外,如果客户端能够使用 WireGuard 服务器作为默认网关,并通过隧道路由所有流量,则必须启用伪装。
先决条件
- 已登陆到 RHEL web 控制台。
流程
- 在屏幕左侧的导航中选择 Networking 选项卡。
- 点 Firewall 部分中的 Edit rules and zones。
- 点 Add services。
-
在 Filter services 字段中输入
wireguard
。 从列表中选择
wireguard
条目。- 点 Add services。
如果客户端应该使用 WireGuard 服务器作为默认网关来通过隧道路由所有流量,请为
public
区域启用伪装:firewall-cmd --permanent --zone=public --add-masquerade firewall-cmd --reload
# firewall-cmd --permanent --zone=public --add-masquerade # firewall-cmd --reload
Copy to Clipboard Copied! 请注意,您无法在 web 控制台的
firewalld
区域中启用伪装。
验证
- 在屏幕左侧的导航中选择 Networking 选项卡。
- 点 Firewall 部分中的 Edit rules and zones。
-
列表包含
wireguard
服务的一个条目,并显示您在 WireGuard 连接配置文件中配置的 UDP 端口。 要验证
firewalld
公共区
中是否启用了伪装,请输入:firewall-cmd --list-all --zone=public
# firewall-cmd --list-all --zone=public public (active) ... services: ... wireguard ports: forward: yes masquerade: yes ...
Copy to Clipboard Copied!
7.10. 使用 nmcli
配置 WireGuard 客户端
您可以通过在 NetworkManager 中创建连接配置集来配置 WireGuard 客户端。使用此方法让 NetworkManager 管理 WireGuard 连接。
此流程假设以下设置:
Client:
-
Private key:
aPUcp5vHz8yMLrzk8SsDyYnV33IhE/k20e52iKJFV0A=
-
隧道 IPv4 地址:
192.0.2.2/24
-
频道 IPv6 地址:
2001:db8:1::2/32
-
Private key:
server:
-
公钥:
UtjqCJ57DeAscYKRfp7cFGiQqdONRn69u249Fa4O6BE=
-
隧道 IPv4 地址:
192.0.2.1/24
-
频道 IPv6 地址:
2001:db8:1::1/32
-
公钥:
先决条件
- 您已为服务器和客户端生成了公钥和私钥。
您知道以下信息:
- 客户端的私钥
- 客户端的静态隧道 IP 地址和子网掩码
- 服务器的公钥
- 服务器的静态隧道 IP 地址和子网掩码
流程
添加 NetworkManager WireGuard 连接配置集:
nmcli connection add type wireguard con-name client-wg0 ifname wg0
# nmcli connection add type wireguard con-name client-wg0 ifname wg0
Copy to Clipboard Copied! 此命令创建一个名为
client-wg0
的配置文件,并将虚拟接口wg0
分配给它。可选:配置 NetworkManager,使其不会自动启动
client-wg
连接:nmcli connection modify client-wg0 autoconnect no
# nmcli connection modify client-wg0 autoconnect no
Copy to Clipboard Copied! 设置客户端的隧道 IPv4 地址和子网掩码:
nmcli connection modify client-wg0 ipv4.method manual ipv4.addresses 192.0.2.2/24
# nmcli connection modify client-wg0 ipv4.method manual ipv4.addresses 192.0.2.2/24
Copy to Clipboard Copied! 设置客户端的隧道 IPv6 地址和子网掩码:
nmcli connection modify client-wg0 ipv6.method manual ipv6.addresses 2001:db8:1::2/32
# nmcli connection modify client-wg0 ipv6.method manual ipv6.addresses 2001:db8:1::2/32
Copy to Clipboard Copied! 如果要通过隧道路由所有流量,请将服务器的隧道 IP 地址设置为默认网关:
nmcli connection modify client-wg0 ipv4.gateway 192.0.2.1 ipv6.gateway 2001:db8:1::1
# nmcli connection modify client-wg0 ipv4.gateway 192.0.2.1 ipv6.gateway 2001:db8:1::1
Copy to Clipboard Copied! 通过隧道路由所有流量需要在后续步骤中设置,此客户端上的
允许
IP 为0.0.0.0/0;::/0
。请注意,通过隧道路由所有流量可能会影响到其他主机的连接,具体取决于服务器路由和防火墙配置。
将客户端的私钥添加到连接配置文件中:
nmcli connection modify client-wg0 wireguard.private-key "aPUcp5vHz8yMLrzk8SsDyYnV33IhE/k20e52iKJFV0A="
# nmcli connection modify client-wg0 wireguard.private-key "aPUcp5vHz8yMLrzk8SsDyYnV33IhE/k20e52iKJFV0A="
Copy to Clipboard Copied! 为您要允许与此客户端通信的每台服务器添加对等配置。您必须手动添加这些设置,因为
nmcli
工具不支持设置相应的连接属性。编辑
/etc/NetworkManager/system-connections/client-wg0.nmconnection
文件,并附加:[wireguard-peer.UtjqCJ57DeAscYKRfp7cFGiQqdONRn69u249Fa4O6BE=] endpoint=server.example.com:51820 allowed-ips=192.0.2.1;2001:db8:1::1; persistent-keepalive=20
[wireguard-peer.UtjqCJ57DeAscYKRfp7cFGiQqdONRn69u249Fa4O6BE=] endpoint=server.example.com:51820 allowed-ips=192.0.2.1;2001:db8:1::1; persistent-keepalive=20
Copy to Clipboard Copied! -
[wireguard-peer.<public_key_of_the_server>]
条目定义了服务器的对等部分,部分名称有服务器的公钥。 -
endpoint
参数设置服务器的主机名或 IP 地址以及端口。客户端使用此信息来建立连接。 allowed-ips
参数设置可向这个客户端发送数据的 IP 地址列表。例如,将参数设置为:- 服务器隧道 IP 地址,以仅允许服务器与此客户端通信。上例中的值可配置这种情况。
-
0.0.0.0/0;::/0;
允许任何远程 IPv4 和 IPv6 地址与此客户端进行通信。使用此设置通过隧道路由所有流量,并使用 WireGuard 服务器作为默认网关。
-
可选的
persistent-keepalive
参数定义 WireGuard 将 keepalive 数据包发送给服务器的间隔(以秒为单位)。如果您在网络中使用具有网络地址转换(NAT)的客户端,或者防火墙在一段时间不活跃后关闭 UDP 连接,则设置此参数。
-
重新载入
client-wg0
连接配置文件:nmcli connection load /etc/NetworkManager/system-connections/client-wg0.nmconnection
# nmcli connection load /etc/NetworkManager/system-connections/client-wg0.nmconnection
Copy to Clipboard Copied!
重新激活
client-wg0
连接:nmcli connection up client-wg0
# nmcli connection up client-wg0
Copy to Clipboard Copied! - 如果您在带有 DHCP 或无状态地址自动配置(SLAAC)的网络中使用此主机,则连接可能会受到重定向的影响。有关详情和缓解步骤,请参阅将 VPN 连接分配给专用路由表,以防止连接绕过隧道。
验证
Ping 服务器的 IP 地址:
ping 192.0.2.1 ping6 2001:db8:1::1
# ping 192.0.2.1 # ping6 2001:db8:1::1
Copy to Clipboard Copied! 显示
wg0
设备的接口配置:wg show wg0
# wg show wg0 interface: wg0 public key: bnwfQcC8/g2i4vvEqcRUM2e6Hi3Nskk6G9t4r26nFVM= private key: (hidden) listening port: 51820 peer: UtjqCJ57DeAscYKRfp7cFGiQqdONRn69u249Fa4O6BE= endpoint: server.example.com:51820 allowed ips: 192.0.2.1/32, 2001:db8:1::1/128 latest handshake: 1 minute, 41 seconds ago transfer: 824 B received, 1.01 KiB sent persistent keepalive: every 20 seconds
Copy to Clipboard Copied! 要在输出中显示私钥,请使用
WG_HIDE_KEYS=never wg show wg0
命令。请注意,如果您已经通过 VPN 隧道发送流量,则输出只有
latest handshake
和transfer
条目。显示
wg0
设备的 IP 配置:ip address show wg0
# ip address show wg0 10: wg0: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1420 qdisc noqueue state UNKNOWN group default qlen 1000 link/none inet 192.0.2.2/24 brd 192.0.2.255 scope global noprefixroute wg0 valid_lft forever preferred_lft forever inet6 2001:db8:1::2/32 scope global noprefixroute valid_lft forever preferred_lft forever inet6 fe80::73d9:6f51:ea6f:863e/64 scope link noprefixroute valid_lft forever preferred_lft forever
Copy to Clipboard Copied!
7.11. 使用 nmtui
配置 WireGuard 客户端
您可以通过在 NetworkManager 中创建连接配置集来配置 WireGuard 客户端。使用此方法让 NetworkManager 管理 WireGuard 连接。
此流程假设以下设置:
Client:
-
Private key:
aPUcp5vHz8yMLrzk8SsDyYnV33IhE/k20e52iKJFV0A=
-
隧道 IPv4 地址:
192.0.2.2/24
-
频道 IPv6 地址:
2001:db8:1::2/32
-
Private key:
server:
-
公钥:
UtjqCJ57DeAscYKRfp7cFGiQqdONRn69u249Fa4O6BE=
-
隧道 IPv4 地址:
192.0.2.1/24
-
频道 IPv6 地址:
2001:db8:1::1/32
-
公钥:
先决条件
- 您已为服务器和客户端生成了公钥和私钥。
您知道以下信息:
- 客户端的私钥
- 客户端的静态隧道 IP 地址和子网掩码
- 服务器的公钥
- 服务器的静态隧道 IP 地址和子网掩码
-
已安装
NetworkManager-tui
软件包
流程
启动
nmtui
应用程序:nmtui
# nmtui
Copy to Clipboard Copied! - 选择 Edit a connection,然后按 Enter。
- 选择 ,然后按 Enter 键。
- 选择列表中的 WireGuard 连接类型,然后按 Enter 键。
在 Edit connection 窗口中:
-
输入连接名称和虚拟接口,如
wg0
,以便 NetworkManager 应分配给连接。 输入客户端的私钥。
点 Peers 窗格旁的 :
- 输入服务器的公钥。
设置 Allowed IPs 字段。例如,将其设置为:
- 服务器隧道 IP 地址,以仅允许服务器与此客户端通信。
-
0.0.0.0/0,::/0
以允许任何远程 IPv4 和 IPv6 地址与此客户端通信。使用此设置通过隧道路由所有流量,并使用 WireGuard 服务器作为默认网关。
-
在 Endpoint 字段中输入 WireGuard 服务器的主机名或 IP 地址和端口。使用以下格式:
<hostname_or_IP>:<port_number>
- 可选:如果您在带有网络地址转换(NAT)的网络中使用客户端,或者防火墙在一定时间不活动状态后关闭 UDP 连接,请以秒为单位设置持久性 keepalive 间隔。在这个间隔中,客户端向服务器发送一个保留数据包。
选择
,然后按 Enter 键。
选择 IPv4 Configuration 旁边的 ,然后按 Enter 键。
- 选择 IPv4 配置方法 Manual。
- 输入隧道 IPv4 地址和子网掩码。将 Gateway 字段留空。
选择 IPv6 Configuration 旁边的 ,然后按 Enter 键。
- 选择 IPv6 配置方法 Manual。
- 输入隧道 IPv6 地址和子网掩码。将 Gateway 字段留空。
- 可选:选择 Automatically connect。
选择
,然后按 Enter键
-
输入连接名称和虚拟接口,如
- 在带有连接列表的窗口中,选择 ,然后按 Enter 键。
- 在 NetworkManager TUI 主窗口中,选择 ,然后按 Enter 键。
- 如果您在带有 DHCP 或无状态地址自动配置(SLAAC)的网络中使用此主机,则连接可能会受到重定向的影响。有关详情和缓解步骤,请参阅将 VPN 连接分配给专用路由表,以防止连接绕过隧道。
验证
Ping 服务器的 IP 地址:
ping 192.0.2.1 ping6 2001:db8:1::1
# ping 192.0.2.1 # ping6 2001:db8:1::1
Copy to Clipboard Copied! 显示
wg0
设备的接口配置:wg show wg0
# wg show wg0 interface: wg0 public key: bnwfQcC8/g2i4vvEqcRUM2e6Hi3Nskk6G9t4r26nFVM= private key: (hidden) listening port: 51820 peer: UtjqCJ57DeAscYKRfp7cFGiQqdONRn69u249Fa4O6BE= endpoint: server.example.com:51820_ allowed ips: 192.0.2.1/32, 2001:db8:1::1/128 latest handshake: 1 minute, 41 seconds ago transfer: 824 B received, 1.01 KiB sent persistent keepalive: every 20 seconds
Copy to Clipboard Copied! 要在输出中显示私钥,请使用
WG_HIDE_KEYS=never wg show wg0
命令。请注意,如果已经通过 VPN 隧道发送流量,输出只会包含
latest handshake
和transfer
条目。显示
wg0
设备的 IP 配置:ip address show wg0
# ip address show wg0 10: wg0: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1420 qdisc noqueue state UNKNOWN group default qlen 1000 link/none inet 192.0.2.2/24 brd 192.0.2.255 scope global noprefixroute wg0 valid_lft forever preferred_lft forever inet6 2001:db8:1::2/32 scope global noprefixroute valid_lft forever preferred_lft forever inet6 fe80::73d9:6f51:ea6f:863e/64 scope link noprefixroute valid_lft forever preferred_lft forever
Copy to Clipboard Copied!
7.12. 使用 RHEL web 控制台配置 WireGuard 客户端
您可以使用基于浏览器的 RHEL web 控制台配置 WireGuard 客户端。使用此方法让 NetworkManager 管理 WireGuard 连接。
先决条件
- 已登陆到 RHEL web 控制台。
您知道以下信息:
- 服务器和客户端的静态隧道 IP 地址和子网掩码
- 服务器的公钥
流程
- 在屏幕左侧的导航中选择 Networking 选项卡。
- 在 Interfaces 部分中点 Add VPN。
-
如果没有安装
wireguard-tools
和systemd-resolved
软件包,Web 控制台会显示一条相应的通知。点 Install 安装这些软件包。 - 输入您要创建的 WireGuard 设备的名称。
配置此主机的密钥对:
如果要使用 web 控制台已创建的密钥:
- 在 Private key 区域中保留预先选择的 Generated 选项。
- 注意 Public key 值。配置客户端时需要此信息。
如果要使用现有的私钥:
- 在 Private key 区域中选择 Paste existing key。
- 将私钥粘贴到文本字段中。Web 控制台自动计算相应的公钥。
-
在 Listen port 字段中保留
0
值。 设置客户端的隧道 IPv4 地址和子网掩码。
如果还要设置 IPv6 地址,您必须在创建连接后编辑它。
为您要允许与此客户端进行通信的服务器添加对等配置:
- 单击 Add peer。
- 输入服务器的公钥。
-
将 Endpoint 字段设置为主机名或 IP 地址及端口,如
server.example.com:51820
。客户端使用此信息来建立连接。 将 Allowed IP 字段设置为允许向这个服务器发送数据的客户端的隧道 IP 地址。例如,将字段设置为以下之一:
- 服务器隧道 IP 地址,以仅允许服务器与此客户端通信。下面的屏幕截图中的值配置此场景。
-
0.0.0.0/0
允许任何远程 IPv4 地址与此客户端进行通信。使用此设置通过隧道路由所有流量,并使用 WireGuard 服务器作为默认网关。
- 点 Add 创建 WireGuard 连接。
如果您还想设置隧道 IPv6 地址:
- 在 Interfaces 部分中点 WireGuard 连接的名称。
- 单击 IPv6 旁边的 Edit。
-
将 Addresses 字段设置为
Manual
,并输入客户端的隧道 IPv6 地址和前缀。 - 点击 Save。
- 如果您在带有 DHCP 或无状态地址自动配置(SLAAC)的网络中使用此主机,则连接可能会受到重定向的影响。有关详情和缓解步骤,请参阅将 VPN 连接分配给专用路由表,以防止连接绕过隧道。
验证
Ping 服务器的 IP 地址:
ping 192.0.2.1
# ping 192.0.2.1
Copy to Clipboard Copied! 当您尝试通过隧道发送流量时,WireGuard 会建立连接。
显示
wg0
设备的接口配置:wg show wg0
# wg show wg0 interface: wg0 public key: bnwfQcC8/g2i4vvEqcRUM2e6Hi3Nskk6G9t4r26nFVM= private key: (hidden) listening port: 45513 peer: UtjqCJ57DeAscYKRfp7cFGiQqdONRn69u249Fa4O6BE= endpoint: server.example.com:51820 allowed ips: 192.0.2.1/32, 2001:db8:1::1/128 latest handshake: 1 minute, 41 seconds ago transfer: 824 B received, 1.01 KiB sent persistent keepalive: every 20 seconds
Copy to Clipboard Copied! 要在输出中显示私钥,请使用
WG_HIDE_KEYS=never wg show wg0
命令。请注意,如果您已经通过 VPN 隧道发送流量,则输出只有
latest handshake
和transfer
条目。显示
wg0
设备的 IP 配置:ip address show wg0
# ip address show wg0 10: wg0: <POINTOPOINT,NOARP,UP,LOWERUP> mtu 1420 qdisc noqueue state UNKNOWN group default qlen 1000 link/none inet 192.0.2.2/24 brd 192.0.2.255 scope global noprefixroute wg0 valid_lft forever preferred_lft forever inet6 2001:db8:1::2/32 scope global noprefixroute valid_lft forever preferred_lft forever inet6 fe80::73d9:6f51:ea6f:863e/64 scope link noprefixroute valid_lft forever preferred_lft forever
Copy to Clipboard Copied!
7.13. 将 VPN 连接分配给专用路由表,以防止连接绕过隧道
DHCP 服务器和无状态地址自动配置(SLAAC)都可以将路由添加到客户端的路由表中。例如,恶意的 DHCP 服务器可以使用此功能强制带有 VPN 连接的主机通过物理接口而不是 VPN 隧道重定向流量。此漏洞也称为 TunnelVision,并参见 CVE-2024-3661 漏洞文章中所述。
要缓解此漏洞,您可以将 VPN 连接分配给专用路由表。这可防止 DHCP 配置或 SLAAC 来处理用于 VPN 隧道的网络数据包的路由决策。
如果至少有一个条件应用到您的环境,请按照以下步骤操作:
- 至少一个网络接口使用 DHCP 或 SLAAC。
- 您的网络不使用阻止恶意 DHCP 服务器的机制,如 DHCP 侦听。
通过 VPN 路由整个流量可防止主机访问本地网络资源。
流程
- 决定您要使用的路由表。以下步骤使用表 75。默认情况下,RHEL 不使用表 1-254,您可以使用其中任何一个。
配置 VPN 连接配置文件,将 VPN 路由放在专用路由表中:
nmcli connection modify <vpn_connection_profile> ipv4.route-table 75 ipv6.route-table 75
# nmcli connection modify <vpn_connection_profile> ipv4.route-table 75 ipv6.route-table 75
Copy to Clipboard Copied! 为您在上一命令中使用的表设置低优先级值:
nmcli connection modify <vpn_connection_profile> ipv4.routing-rules "priority 32345 from all table 75" ipv6.routing-rules "priority 32345 from all table 75"
# nmcli connection modify <vpn_connection_profile> ipv4.routing-rules "priority 32345 from all table 75" ipv6.routing-rules "priority 32345 from all table 75"
Copy to Clipboard Copied! 优先级值可以是 1 到 32766 之间的任何值。值越低,优先级越高。
重新连接 VPN 连接:
nmcli connection down <vpn_connection_profile> nmcli connection up <vpn_connection_profile>
# nmcli connection down <vpn_connection_profile> # nmcli connection up <vpn_connection_profile>
Copy to Clipboard Copied!
验证
在表 75 中显示 IPv4 路由:
ip route show table 75
# ip route show table 75 ... 192.0.2.0/24 via 192.0.2.254 dev vpn_device proto static metric 50 default dev vpn_device proto static scope link metric 50
Copy to Clipboard Copied! 输出确认到远程网络和默认网关路由到路由表 75,因此所有流量都通过隧道路由。如果您在 VPN 连接配置集中设置
ipv4.never-default true
,则不会创建默认路由,因此无法在此输出中可见。在表 75 中显示 IPv6 路由:
ip -6 route show table 75
# ip -6 route show table 75 ... 2001:db8:1::/64 dev vpn_device proto kernel metric 50 pref medium default dev vpn_device proto static metric 50 pref medium
Copy to Clipboard Copied! 输出确认到远程网络和默认网关路由到路由表 75,因此所有流量都通过隧道路由。如果您在 VPN 连接配置集中设置
ipv6.never-default true
,则不会创建默认路由,因此无法在此输出中可见。
第 8 章 配置 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 层动作。
8.1. 配置 IPIP 隧道来封装 IPv4 数据包中的 IPv4 流量
IP over IP(IPIP)隧道在 OSI 层 3 上运行,并封装 IPv4 数据包中的 IPv4 流量,如 RFC 2003 所述。
通过 IPIP 隧道发送的数据没有加密。出于安全考虑,只在已经加密的数据中使用隧道,比如 HTTPS。
请注意,IPIP 隧道只支持单播数据包。如果您需要支持多播的 IPv4 隧道,请参阅使用 nmcli 配置 GRE 隧道来封装 IPv4 数据包中的第 3 层流量。
例如,您可以在两个 RHEL 路由器之间创建一个 IPIP 隧道来通过互联网连接两个内部子网,如下图所示:

先决条件
- 每个 RHEL 路由器都有一个网络接口,它连接到其本地子网。
- 每个 RHEL 路由器都有一个网络接口,它连接到互联网。
- 您需要通过隧道发送的流量是 IPv4 单播。
流程
在网络 A 的 RHEL 路由器上:
创建名为
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
# nmcli connection add type ip-tunnel ip-tunnel.mode ipip con-name tun0 ifname tun0 remote 198.51.100.5 local 203.0.113.10
Copy to Clipboard Copied! remote
和local
参数设置远程和本地路由器的公共 IP 地址。将 IPv4 地址设为
tun0
设备:nmcli connection modify tun0 ipv4.addresses '10.0.1.1/30'
# nmcli connection modify tun0 ipv4.addresses '10.0.1.1/30'
Copy to Clipboard Copied! 请注意,具有两个可用 IP 地址的
/30
子网足以满足隧道的需要。将
tun0
连接配置为使用手动 IPv4 配置:nmcli connection modify tun0 ipv4.method manual
# nmcli connection modify tun0 ipv4.method manual
Copy to Clipboard Copied! 添加一个静态路由,其将到
172.16.0.0/24
网络的流量路由到路由器 B 上的隧道 IP:nmcli connection modify tun0 +ipv4.routes "172.16.0.0/24 10.0.1.2"
# nmcli connection modify tun0 +ipv4.routes "172.16.0.0/24 10.0.1.2"
Copy to Clipboard Copied! 启用
tun0
连接。nmcli connection up tun0
# nmcli connection up tun0
Copy to Clipboard Copied! 启用数据包转发:
echo "net.ipv4.ip_forward=1" > /etc/sysctl.d/95-IPv4-forwarding.conf sysctl -p /etc/sysctl.d/95-IPv4-forwarding.conf
# echo "net.ipv4.ip_forward=1" > /etc/sysctl.d/95-IPv4-forwarding.conf # sysctl -p /etc/sysctl.d/95-IPv4-forwarding.conf
Copy to Clipboard Copied!
在网络 B 中的 RHEL 路由器中:
创建名为
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
# nmcli connection add type ip-tunnel ip-tunnel.mode ipip con-name tun0 ifname tun0 remote 203.0.113.10 local 198.51.100.5
Copy to Clipboard Copied! remote
和local
参数设置远程和本地路由器的公共 IP 地址。将 IPv4 地址设为
tun0
设备:nmcli connection modify tun0 ipv4.addresses '10.0.1.2/30'
# nmcli connection modify tun0 ipv4.addresses '10.0.1.2/30'
Copy to Clipboard Copied! 将
tun0
连接配置为使用手动 IPv4 配置:nmcli connection modify tun0 ipv4.method manual
# nmcli connection modify tun0 ipv4.method manual
Copy to Clipboard Copied! 添加一个静态路由,其将路由到
192.0.2.0/24
网络的流量路由到路由器 A 上的隧道 IP:nmcli connection modify tun0 +ipv4.routes "192.0.2.0/24 10.0.1.1"
# nmcli connection modify tun0 +ipv4.routes "192.0.2.0/24 10.0.1.1"
Copy to Clipboard Copied! 启用
tun0
连接。nmcli connection up tun0
# nmcli connection up tun0
Copy to Clipboard Copied! 启用数据包转发:
echo "net.ipv4.ip_forward=1" > /etc/sysctl.d/95-IPv4-forwarding.conf sysctl -p /etc/sysctl.d/95-IPv4-forwarding.conf
# echo "net.ipv4.ip_forward=1" > /etc/sysctl.d/95-IPv4-forwarding.conf # sysctl -p /etc/sysctl.d/95-IPv4-forwarding.conf
Copy to Clipboard Copied!
验证
从每个 RHEL 路由器中,ping 路由器的内部接口的 IP 地址:
在路由器 A 上,ping
172.16.0.1
:ping 172.16.0.1
# ping 172.16.0.1
Copy to Clipboard Copied! 在路由器 B 上,ping
192.0.2.1
:ping 192.0.2.1
# ping 192.0.2.1
Copy to Clipboard Copied!
8.2. 配置 GRE 隧道来封装 IPv4 数据包中的第 3 层流量
Generic Routing Encapsulation(GRE)隧道封装 IPv4 数据包中的第 3 层流量,如 RFC 2784 所述。GRE 隧道可以使用有效的以太网类型封装任何第 3 层协议。
通过 GRE 隧道发送的数据没有加密。出于安全考虑,只在已经加密的数据中使用隧道,比如 HTTPS。
例如,您可以在两个 RHEL 路由器之间创建一个 GRE 隧道来通过互联网连接两个内部子网,如下图所示:

先决条件
- 每个 RHEL 路由器都有一个网络接口,它连接到其本地子网。
- 每个 RHEL 路由器都有一个网络接口,它连接到互联网。
流程
在网络 A 的 RHEL 路由器上:
创建名为
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
# nmcli connection add type ip-tunnel ip-tunnel.mode gre con-name gre1 ifname gre1 remote 198.51.100.5 local 203.0.113.10
Copy to Clipboard Copied! remote
和local
参数设置远程和本地路由器的公共 IP 地址。重要保留
gre0
设备名称。对该设备使用gre1
或者不同的名称。将 IPv4 地址设为
gre1
设备:nmcli connection modify gre1 ipv4.addresses '10.0.1.1/30'
# nmcli connection modify gre1 ipv4.addresses '10.0.1.1/30'
Copy to Clipboard Copied! 请注意,具有两个可用 IP 地址的
/30
子网足以满足隧道的需要。将
gre1
连接配置为使用手动 IPv4 配置:nmcli connection modify gre1 ipv4.method manual
# nmcli connection modify gre1 ipv4.method manual
Copy to Clipboard Copied! 添加一个静态路由,其将到
172.16.0.0/24
网络的流量路由到路由器 B 上的隧道 IP:nmcli connection modify gre1 +ipv4.routes "172.16.0.0/24 10.0.1.2"
# nmcli connection modify gre1 +ipv4.routes "172.16.0.0/24 10.0.1.2"
Copy to Clipboard Copied! 启用
gre1
连接。nmcli connection up gre1
# nmcli connection up gre1
Copy to Clipboard Copied! 启用数据包转发:
echo "net.ipv4.ip_forward=1" > /etc/sysctl.d/95-IPv4-forwarding.conf sysctl -p /etc/sysctl.d/95-IPv4-forwarding.conf
# echo "net.ipv4.ip_forward=1" > /etc/sysctl.d/95-IPv4-forwarding.conf # sysctl -p /etc/sysctl.d/95-IPv4-forwarding.conf
Copy to Clipboard Copied!
在网络 B 中的 RHEL 路由器中:
创建名为
gre1
的 GRE 隧道接口:nmcli connection add type ip-tunnel ip-tunnel.mode gre con-name gre1 ifname gre1 remote 203.0.113.10 local 198.51.100.5
# nmcli connection add type ip-tunnel ip-tunnel.mode gre con-name gre1 ifname gre1 remote 203.0.113.10 local 198.51.100.5
Copy to Clipboard Copied! remote
和local
参数设置远程和本地路由器的公共 IP 地址。将 IPv4 地址设为
gre1
设备:nmcli connection modify gre1 ipv4.addresses '10.0.1.2/30'
# nmcli connection modify gre1 ipv4.addresses '10.0.1.2/30'
Copy to Clipboard Copied! 将
gre1
连接配置为使用手动 IPv4 配置:nmcli connection modify gre1 ipv4.method manual
# nmcli connection modify gre1 ipv4.method manual
Copy to Clipboard Copied! 添加一个静态路由,其将路由到
192.0.2.0/24
网络的流量路由到路由器 A 上的隧道 IP:nmcli connection modify gre1 +ipv4.routes "192.0.2.0/24 10.0.1.1"
# nmcli connection modify gre1 +ipv4.routes "192.0.2.0/24 10.0.1.1"
Copy to Clipboard Copied! 启用
gre1
连接。nmcli connection up gre1
# nmcli connection up gre1
Copy to Clipboard Copied! 启用数据包转发:
echo "net.ipv4.ip_forward=1" > /etc/sysctl.d/95-IPv4-forwarding.conf sysctl -p /etc/sysctl.d/95-IPv4-forwarding.conf
# echo "net.ipv4.ip_forward=1" > /etc/sysctl.d/95-IPv4-forwarding.conf # sysctl -p /etc/sysctl.d/95-IPv4-forwarding.conf
Copy to Clipboard Copied!
验证
从每个 RHEL 路由器中,ping 路由器的内部接口的 IP 地址:
在路由器 A 上,ping
172.16.0.1
:ping 172.16.0.1
# ping 172.16.0.1
Copy to Clipboard Copied! 在路由器 B 上,ping
192.0.2.1
:ping 192.0.2.1
# ping 192.0.2.1
Copy to Clipboard Copied!
8.3. 配置 GRETAP 隧道来通过 IPv4 传输以太网帧
通用路由封装终端接入点(GRETAP)隧道在 OSI 级别 2 上运行,并封装 IPv4 数据包中的以太网流量,如 RFC 2784 所述。
通过 GRETAP 隧道发送的数据没有加密。出于安全考虑,通过 VPN 或不同的加密连接建立隧道。
例如,您可以在两个 RHEL 路由器之间创建一个 GRETAP 隧道,以使用网桥连接两个网络,如下图所示:

先决条件
- 每个 RHEL 路由器都有一个网络接口,它连接到其本地网络,接口没有分配 IP 配置。
- 每个 RHEL 路由器都有一个网络接口,它连接到互联网。
流程
在网络 A 的 RHEL 路由器上:
创建名为
bridge0
的网桥接口:nmcli connection add type bridge con-name bridge0 ifname bridge0
# nmcli connection add type bridge con-name bridge0 ifname bridge0
Copy to Clipboard Copied! 配置网桥的 IP 设置:
nmcli connection modify bridge0 ipv4.addresses '192.0.2.1/24' nmcli connection modify bridge0 ipv4.method manual
# nmcli connection modify bridge0 ipv4.addresses '192.0.2.1/24' # nmcli connection modify bridge0 ipv4.method manual
Copy to Clipboard Copied! 为连接到本地网络的接口添加新连接配置集到网桥:
nmcli connection add type ethernet port-type bridge con-name bridge0-port1 ifname enp1s0 controller bridge0
# nmcli connection add type ethernet port-type bridge con-name bridge0-port1 ifname enp1s0 controller bridge0
Copy to Clipboard Copied! 为网桥添加 GRETAP 隧道接口的新连接配置集:
nmcli connection add type ip-tunnel ip-tunnel.mode gretap port-type bridge con-name bridge0-port2 ifname gretap1 remote 198.51.100.5 local 203.0.113.10 controller bridge0
# nmcli connection add type ip-tunnel ip-tunnel.mode gretap port-type bridge con-name bridge0-port2 ifname gretap1 remote 198.51.100.5 local 203.0.113.10 controller bridge0
Copy to Clipboard Copied! remote
和local
参数设置远程和本地路由器的公共 IP 地址。重要保留
gretap0
设备名称。对该设备使用gretap1
或者不同的名称。可选:如果您不需要,STP(Spanning Tree Protocol):
nmcli connection modify bridge0 bridge.stp no
# nmcli connection modify bridge0 bridge.stp no
Copy to Clipboard Copied! 默认情况下,STP 被启用并导致在使用连接前出现延迟。
配置激活
bridge0
连接会自动激活网桥端口:nmcli connection modify bridge0 connection.autoconnect-ports 1
# nmcli connection modify bridge0 connection.autoconnect-ports 1
Copy to Clipboard Copied! 激活
bridge0
连接:nmcli connection up bridge0
# nmcli connection up bridge0
Copy to Clipboard Copied!
在网络 B 中的 RHEL 路由器中:
创建名为
bridge0
的网桥接口:nmcli connection add type bridge con-name bridge0 ifname bridge0
# nmcli connection add type bridge con-name bridge0 ifname bridge0
Copy to Clipboard Copied! 配置网桥的 IP 设置:
nmcli connection modify bridge0 ipv4.addresses '192.0.2.2/24' nmcli connection modify bridge0 ipv4.method manual
# nmcli connection modify bridge0 ipv4.addresses '192.0.2.2/24' # nmcli connection modify bridge0 ipv4.method manual
Copy to Clipboard Copied! 为连接到本地网络的接口添加新连接配置集到网桥:
nmcli connection add type ethernet port-type bridge con-name bridge0-port1 ifname enp1s0 controller bridge0
# nmcli connection add type ethernet port-type bridge con-name bridge0-port1 ifname enp1s0 controller bridge0
Copy to Clipboard Copied! 为网桥添加 GRETAP 隧道接口的新连接配置集:
nmcli connection add type ip-tunnel ip-tunnel.mode gretap port-type bridge con-name bridge0-port2 ifname gretap1 remote 203.0.113.10 local 198.51.100.5 controller bridge0
# nmcli connection add type ip-tunnel ip-tunnel.mode gretap port-type bridge con-name bridge0-port2 ifname gretap1 remote 203.0.113.10 local 198.51.100.5 controller bridge0
Copy to Clipboard Copied! remote
和local
参数设置远程和本地路由器的公共 IP 地址。可选:如果您不需要,STP(Spanning Tree Protocol):
nmcli connection modify bridge0 bridge.stp no
# nmcli connection modify bridge0 bridge.stp no
Copy to Clipboard Copied! 配置激活
bridge0
连接会自动激活网桥端口:nmcli connection modify bridge0 connection.autoconnect-ports 1
# nmcli connection modify bridge0 connection.autoconnect-ports 1
Copy to Clipboard Copied! 激活
bridge0
连接:nmcli connection up bridge0
# nmcli connection up bridge0
Copy to Clipboard Copied!
验证
在两个路由器上,验证
enp1s0
和gretap1
连接是否已连接,并且CONNECTION
列是否显示端口的连接名称:nmcli device
# nmcli device nmcli device DEVICE TYPE STATE CONNECTION ... bridge0 bridge connected bridge0 enp1s0 ethernet connected bridge0-port1 gretap1 iptunnel connected bridge0-port2
Copy to Clipboard Copied! 从每个 RHEL 路由器中,ping 路由器的内部接口的 IP 地址:
在路由器 A 上,ping
192.0.2.2
:ping 192.0.2.2
# ping 192.0.2.2
Copy to Clipboard Copied! 在路由器 B 上,ping
192.0.2.1
:ping 192.0.2.1
# ping 192.0.2.1
Copy to Clipboard Copied!
第 9 章 管理 wifi 连接
RHEL 提供多个实用程序和应用程序来配置和连接到 wifi 网络,例如:
-
使用
nmcli
工具,使用命令行配置连接。 -
使用
nmtui
应用程序在基于文本的用户界面中配置连接。 -
使用
GNOME Settings
应用程序,使用 GNOME 应用程序配置连接。 -
使用
network
RHEL 系统角色在一个或多个主机上自动配置连接。
9.1. 支持的 wifi 安全类型
根据 wifi 网络支持的安全类型,您可以或多或少安全地传输数据。
不要连接到不使用加密的网络,或者只支持不安全的 WPA 标准。
Red Hat Enterprise Linux 支持以下 wifi 安全类型:
-
None
:加密被禁用,数据在网络中以纯文本形式传输。 -
Enhanced Open
:使用投机无线加密(OWE),设备会协商唯一对主密钥 (PMK) 以在无线网络中加密连接,而无需身份验证。 -
LEAP
:由 Cisco 开发的轻量级可扩展验证协议,是可扩展身份验证协议 (EAP) 的专有版本。 -
WPA & WPA2 Personal
:在个人模式中,WPA)和 Wi-Fi Protected Access 2 (WPA2) 验证方法使用预共享密钥。 -
WPA & WPA2 Enterprise
:在企业模式中,WPA 和 WPA2 使用 EAP 框架,并对用户进行身份验证以远程身份验证服务 (RADIUS) 服务器。 -
WPA3 Personal
- Wi-Fi Protected Access 3(WPA3) Personal 使用 Simultaneous Authentication of Equals (SAE) 而不是预共享密钥 (PSK) 来防止字典攻击。WPA3 使用完美转发保密 (PFS)。
9.2. 使用 nmcli
连接到 wifi 网络
您可以使用 nmcli
工具连接到 wifi 网络。当您第一次尝试连接到网络时,实用程序会自动为其创建一个 NetworkManager 连接配置集。如果网络需要额外的设置,如静态 IP 地址,您可以在它自动创建后修改配置集。
先决条件
- 在主机上安装了 wifi 设备。
-
wifi 设备已启用。要进行验证,请使用
nmcli radio
命令。
流程
如果网络管理器 (NetworkManager) 中禁用了 wifi radio,请启用此功能:
nmcli radio wifi on
# nmcli radio wifi on
Copy to Clipboard Copied! 可选:显示可用的 wifi 网络:
nmcli device wifi list
# nmcli device wifi list IN-USE BSSID SSID MODE CHAN RATE SIGNAL BARS SECURITY 00:53:00:2F:3B:08 Office Infra 44 270 Mbit/s 57 ▂▄▆_ WPA2 WPA3 00:53:00:15:03:BF -- Infra 1 130 Mbit/s 48 ▂▄__ WPA2 WPA3
Copy to Clipboard Copied! 服务设置标识符 (
SSID
) 列包含网络的名称。如果列显示--
,则此网络的接入点不会广播 SSID。连接到 wifi 网络:
nmcli device wifi connect Office --ask
# nmcli device wifi connect Office --ask Password: wifi-password
Copy to Clipboard Copied! 如果您希望在命令中设置密码而不是以交互方式输入密码,请在命令中使用
password <wifi_password>
选项,而不是--ask
:nmcli device wifi connect Office password <wifi_password>
# nmcli device wifi connect Office password <wifi_password>
Copy to Clipboard Copied! 请注意,如果网络需要静态 IP 地址,NetworkManager 无法在此时激活连接。您可以在后续步骤中配置 IP 地址。
如果网络需要静态 IP 地址:
配置 IPv4 地址设置,例如:
nmcli connection modify Office ipv4.method manual ipv4.addresses 192.0.2.1/24 ipv4.gateway 192.0.2.254 ipv4.dns 192.0.2.200 ipv4.dns-search example.com
# nmcli connection modify Office ipv4.method manual ipv4.addresses 192.0.2.1/24 ipv4.gateway 192.0.2.254 ipv4.dns 192.0.2.200 ipv4.dns-search example.com
Copy to Clipboard Copied! 配置 IPv6 地址设置,例如:
nmcli connection modify Office ipv6.method manual ipv6.addresses 2001:db8:1::1/64 ipv6.gateway 2001:db8:1::fffe ipv6.dns 2001:db8:1::ffbb ipv6.dns-search example.com
# nmcli connection modify Office ipv6.method manual ipv6.addresses 2001:db8:1::1/64 ipv6.gateway 2001:db8:1::fffe ipv6.dns 2001:db8:1::ffbb ipv6.dns-search example.com
Copy to Clipboard Copied!
重新激活连接:
nmcli connection up Office
# nmcli connection up Office
Copy to Clipboard Copied!
验证
显示活跃连接:
nmcli connection show --active
# nmcli connection show --active NAME ID TYPE DEVICE Office 2501eb7e-7b16-4dc6-97ef-7cc460139a58 wifi wlp0s20f3
Copy to Clipboard Copied! 如果输出列出了您创建的 wifi 连接,则连接会活跃。
Ping 主机名或 IP 地址:
ping -c 3 example.com
# ping -c 3 example.com
Copy to Clipboard Copied!
9.3. 使用 GNOME 设置应用程序连接到 wifi 网络
您可以使用名为 gnome-control-center
的 GNOME 设置
应用程序连接到 wifi 网络并配置连接。当您第一次连接到网络时,GNOME 会为它创建一个 NetworkManager 连接配置集。
在 GNOME 设置
中,您可以为 RHEL 支持的所有 wifi 网络安全类型配置 wifi 连接。
先决条件
- 在主机上安装了 wifi 设备。
-
wifi 设备已启用。要进行验证,请使用
nmcli radio
命令。
流程
-
按 Super 键,键入
Wi-Fi
,然后按 Enter 键。 - 点您要连接的 wifi 网络的名称。
-
输入网络的密码,点
Connect
。 如果网络需要额外的设置,如静态 IP 地址或 WPA2 个人以外的安全类型:
- 点网络名称旁边的齿轮图标。
可选:在
Details
标签页中配置网络配置集无法自动连接。如果停用这个功能,您必须总是手动连接到网络,例如使用
GNOME settings
或 GNOME 系统菜单。-
在 IPv4 选项卡上配置
IPv4
设置,并在 IPv6 选项卡上配置IPv6
设置。 在
Security
选项卡中,选择网络验证,如WPA3 Personal
,然后输入密码。根据所选安全性,应用程序会显示其他字段。相应地填充它们。详情请参阅 wifi 网络管理员。
-
点
Apply
。
验证
打开顶栏右侧的系统菜单,验证 wifi 网络是否已连接:
如果网络出现在列表中,它已被连接。
Ping 主机名或 IP 地址:
ping -c 3 example.com
# ping -c 3 example.com
Copy to Clipboard Copied!
9.4. 使用 nmtui
配置 wifi 连接
nmtui
应用程序为 NetworkManager 提供了一个基于文本的用户界面。您可以使用 nmtui
连接到 wifi 网络。
在 nmtui
中:
- 使用光标键导航。
- 选择一个按钮并按 Enter 键。
- 使用 空格 选择和清除复选框。
- 要返回上一个屏幕,请使用 ESC。
流程
启动
nmtui
:nmtui
# nmtui
Copy to Clipboard Copied! -
选择
Edit a connection
,点 Enter。 -
按
Add
按钮。 -
从网络类型列表中选择
Wi-Fi
,然后按 Enter 。 可选:为要创建的 NetworkManager 配置集输入一个名称。
在有多个配置文件的主机上,有意义的名称可以更容易识别配置文件的用途。
-
在
SSID
字段中输入 Wi-Fi 网络的名称,即服务集标识符(SSID)。 -
将
Mode
字段设为默认值,Client
。 选择
Security
字段,按 Enter,然后从列表中设置网络的验证类型。根据您选择的验证类型,
nmtui
会显示不同的字段。- 填写与验证类型相关的字段。
如果 Wi-Fi 网络需要静态 IP 地址:
-
按协议旁边的
Automatic
按钮,然后从显示的列表中选择Manual
。 -
按您要配置的协议旁边的
Show
按钮,来显示其他字段并填写它们。
-
按协议旁边的
按
OK
按钮来创建并自动激活新连接。-
按
Back
按钮返回到主菜单。 -
选择
Quit
,然后按 Enter 键关闭nmtui
应用程序。
验证
打开 nmtui :
nmcli connection show --active
# nmcli connection show --active NAME ID TYPE DEVICE Office 2501eb7e-7b16-4dc6-97ef-7cc460139a58 wifi wlp0s20f3
Copy to Clipboard Copied! 如果输出列出了您创建的 wifi 连接,则连接会活跃。
Ping 主机名或 IP 地址:
ping -c 3 example.com
# ping -c 3 example.com
Copy to Clipboard Copied!
9.5. 使用 nmcli
在现有配置文件中配置带有 802.1X 网络身份验证的 wifi 连接
通过使用 nmcli
工具,您可以将客户端配置为向网络验证其自身。例如,您可以在名为 wlp1s0
的 NetworkManager wifi 连接配置文件中使用 Microsoft Challenge-Handshake Authentication Protocol 版本 2 (MSCHAPv2)配置 Protected Extensible Authentication Protocol(PEAP)身份验证。
前提条件
- 网络必须具有 802.1X 网络身份验证。
- Wi-Fi 连接配置集存在于 NetworkManager 中,且具有有效的 IP 配置。
-
如果需要客户端验证验证方的证书,则证书颁发机构(CA)证书必须存储在
/etc/pki/ca-trust/source/anchors/
目录中。 -
wpa_supplicant
软件包已安装。
流程
将 Wi-Fi 安全模式设为
wpa-eap
、将可扩展验证协议(EAP)设为peap
,将内部验证协议设为mschapv2
,和用户名:nmcli connection modify wlp1s0 wireless-security.key-mgmt wpa-eap 802-1x.eap peap 802-1x.phase2-auth mschapv2 802-1x.identity <user_name>
# nmcli connection modify wlp1s0 wireless-security.key-mgmt wpa-eap 802-1x.eap peap 802-1x.phase2-auth mschapv2 802-1x.identity <user_name>
Copy to Clipboard Copied! 请注意,您必须在单个命令中设置
wireless-security.key-mgmt
、802-1x.eap
、802-1x.phase2-auth
和802-1x.identity
参数。可选:将密码存储在配置中:
nmcli connection modify wlp1s0 802-1x.password <password>
# nmcli connection modify wlp1s0 802-1x.password <password>
Copy to Clipboard Copied! 重要默认情况下,NetworkManager 在
/etc/sysconfig/network-scripts/keys-connection_name
文件中以纯文本形式存储密码,该文件只对root
用户可读。但是,配置文件中的纯文本密码可能会造成安全风险。要提高安全性,请将
802-1x.password-flags
参数设置为agent-owned
。使用这个设置,在具有 GNOME 桌面环境或运行nm-applet
的服务器上,NetworkManager 会在您首先解锁密钥环后从这些服务检索密码。在其他情况下,NetworkManager 会提示输入密码。如果客户端需要验证验证器的证书,请将连接配置文件中的
802-1x.ca-cert
参数设为 CA 证书的路径:nmcli connection modify wlp1s0 802-1x.ca-cert /etc/pki/ca-trust/source/anchors/ca.crt
# nmcli connection modify wlp1s0 802-1x.ca-cert /etc/pki/ca-trust/source/anchors/ca.crt
Copy to Clipboard Copied! 注意为安全起见,客户端应验证验证器的证书。
激活连接配置集:
nmcli connection up wlp1s0
# nmcli connection up wlp1s0
Copy to Clipboard Copied!
验证
- 访问需要网络身份验证的网络上的资源。
9.6. 使用 network
RHEL 系统角色配置带有 802.1X 网络身份验证的 wifi 连接
网络访问控制(NAC)保护网络不受未授权客户端的访问。您可以在 NetworkManager 连接配置文件中指定身份验证所需的详情,以使客户端可以访问网络。通过使用 Ansible 和 network
RHEL 系统角色,您可以自动化此过程,并在 playbook 中定义的主机上远程配置连接配置文件。
您可以使用 Ansible playbook 将私钥、证书和 CA 证书复制到客户端,然后使用 network
RHEL 系统角色配置具有 802.1X 网络身份验证的连接配置文件。
先决条件
- 您已准备好控制节点和受管节点
- 以可在受管主机上运行 playbook 的用户登录到控制节点。
-
您用于连接到受管节点的帐户对它们具有
sudo
权限。 - 网络支持 802.1X 网络身份验证。
-
您已在受管节点上安装了
wpa_supplicant
软件包。 - DHCP 位于受管节点的网络中。
control 节点上存在 TLS 身份验证所需的以下文件:
-
客户端密钥存储在
/srv/data/client.key
文件中。 -
客户端证书存储在
/srv/data/client.crt
文件中。 -
CA 证书存储在
/srv/data/ca.crt
文件中。
-
客户端密钥存储在
流程
将敏感变量存储在加密的文件中:
创建 vault :
ansible-vault create ~/vault.yml
$ ansible-vault create ~/vault.yml New Vault password: <vault_password> Confirm New Vault password: <vault_password>
Copy to Clipboard Copied! 在
ansible-vault create
命令打开编辑器后,以<key>: <value>
格式输入敏感数据:pwd: <password>
pwd: <password>
Copy to Clipboard Copied! - 保存更改,并关闭编辑器。Ansible 加密 vault 中的数据。
创建一个包含以下内容的 playbook 文件,如
~/playbook.yml
:--- - name: Configure a wifi connection with 802.1X authentication hosts: managed-node-01.example.com vars_files: - ~/vault.yml tasks: - name: Copy client key for 802.1X authentication ansible.builtin.copy: src: "/srv/data/client.key" dest: "/etc/pki/tls/private/client.key" mode: 0400 - name: Copy client certificate for 802.1X authentication ansible.builtin.copy: src: "/srv/data/client.crt" dest: "/etc/pki/tls/certs/client.crt" - name: Copy CA certificate for 802.1X authentication ansible.builtin.copy: src: "/srv/data/ca.crt" dest: "/etc/pki/ca-trust/source/anchors/ca.crt" - name: Wifi connection profile with dynamic IP address settings and 802.1X ansible.builtin.import_role: name: redhat.rhel_system_roles.network vars: network_connections: - name: Wifi connection profile with dynamic IP address settings and 802.1X interface_name: wlp1s0 state: up type: wireless autoconnect: yes ip: dhcp4: true auto6: true wireless: ssid: "Example-wifi" key_mgmt: "wpa-eap" ieee802_1x: identity: <user_name> eap: tls private_key: "/etc/pki/tls/private/client.key" private_key_password: "{{ pwd }}" private_key_password_flags: none client_cert: "/etc/pki/tls/certs/client.crt" ca_cert: "/etc/pki/ca-trust/source/anchors/ca.crt" domain_suffix_match: "example.com" network_allow_restart: true
--- - name: Configure a wifi connection with 802.1X authentication hosts: managed-node-01.example.com vars_files: - ~/vault.yml tasks: - name: Copy client key for 802.1X authentication ansible.builtin.copy: src: "/srv/data/client.key" dest: "/etc/pki/tls/private/client.key" mode: 0400 - name: Copy client certificate for 802.1X authentication ansible.builtin.copy: src: "/srv/data/client.crt" dest: "/etc/pki/tls/certs/client.crt" - name: Copy CA certificate for 802.1X authentication ansible.builtin.copy: src: "/srv/data/ca.crt" dest: "/etc/pki/ca-trust/source/anchors/ca.crt" - name: Wifi connection profile with dynamic IP address settings and 802.1X ansible.builtin.import_role: name: redhat.rhel_system_roles.network vars: network_connections: - name: Wifi connection profile with dynamic IP address settings and 802.1X interface_name: wlp1s0 state: up type: wireless autoconnect: yes ip: dhcp4: true auto6: true wireless: ssid: "Example-wifi" key_mgmt: "wpa-eap" ieee802_1x: identity: <user_name> eap: tls private_key: "/etc/pki/tls/private/client.key" private_key_password: "{{ pwd }}" private_key_password_flags: none client_cert: "/etc/pki/tls/certs/client.crt" ca_cert: "/etc/pki/ca-trust/source/anchors/ca.crt" domain_suffix_match: "example.com" network_allow_restart: true
Copy to Clipboard Copied! 示例 playbook 中指定的设置包括如下:
ieee802_1x
- 此变量包含与 802.1X 相关的设置。
eap: tls
-
将配置文件配置为对可扩展身份验证协议(EAP)使用基于证书的
TLS
身份验证方法。
有关 playbook 中使用的所有变量的详情,请查看控制节点上的
/usr/share/ansible/roles/rhel-system-roles.network/README.md
文件。验证 playbook 语法:
ansible-playbook --ask-vault-pass --syntax-check ~/playbook.yml
$ ansible-playbook --ask-vault-pass --syntax-check ~/playbook.yml
Copy to Clipboard Copied! 请注意,这个命令只验证语法,不能防止错误的、但有效的配置。
运行 playbook:
ansible-playbook --ask-vault-pass ~/playbook.yml
$ ansible-playbook --ask-vault-pass ~/playbook.yml
Copy to Clipboard Copied!
9.7. 手动设置无线规范域
在 RHEL 上,udev
规则执行 setregdomain
工具来设置无线规范域。然后,实用程序为内核提供此信息。
默认情况下,setregdomain
会尝试自动决定国家代码。如果此操作失败,则无线规范域设置可能会出错。要临时解决这个问题,您可以手动设置国家代码。
手动设置规范域将禁用自动检测。因此,如果您稍后在不同的国家/地区使用计算机,之前配置的设置可能不再正确。在这种情况下,删除 /etc/sysconfig/regdomain
文件以切回到自动检测,或使用此流程再次更新规范域设置。
先决条件
- wifi 设备的驱动程序支持更改规范域。
流程
可选:显示当前规范域设置:
iw reg get
# iw reg get global country US: DFS-FCC ...
Copy to Clipboard Copied! 使用以下内容创建
/etc/sysconfig/regdomain
文件:COUNTRY=<country_code>
COUNTRY=<country_code>
Copy to Clipboard Copied! 将
COUNTRY
变量设置为一个 ISO 3166-1 alpha2 国家代码,如DE
代表德国,US
代表美国。设置规范域:
setregdomain
# setregdomain
Copy to Clipboard Copied!
验证
显示规范域设置:
iw reg get
# iw reg get global country DE: DFS-ETSI ...
Copy to Clipboard Copied!
第 10 章 使用 MACsec 加密同一物理网络中的第 2 层流量
您可以使用 MACsec 来保护两个设备(点到点)之间的通信。例如,您的分支办公室通过城际以太网与中心办公室连接,您可以在连接办公室的两个主机上配置 MACsec,以提高安全性。
10.1. MACsec 如何提高安全性
介质访问控制安全(MACsec)是一种 2 层协议,它保护以太网链路上的不同流量类型,包括:
- 动态主机配置协议(DHCP)
- 地址解析协议(ARP)
- IPv4 和 IPv6 流量
- 任何通过 IP 的流量,如 TCP 或 UDP
MACsec 默认使用 GCM-AES-128 算法加密并验证 LAN 中的所有流量,并使用预共享密钥在参与的主机之间建立连接。要更改预共享密钥,您必须更新所有使用 MACsec 的网络主机上的 NM 配置。
MACsec 连接使用yige 以太网设备,如以太网网卡、VLAN 或隧道设备作为父设备。您只能在 MACsec 设备上设置 IP 配置,以便只使用加密连接与其他主机进行通信,或者在父设备上设置 IP 配置。在后者的情况下,您可以使用父设备使用未加密连接和 MACsec 设备加密连接与其他主机通信。
macsec 不需要任何特殊硬件。例如,您可以使用任何交换机,除非您只想在主机和交换机之间加密流量。在这种情况下,交换机还必须支持 MACsec。
换句话说,您可以为两种常见场景配置 MACsec:
- host-to-host
- host-to-switch 和 switch-to-other-hosts
您只能在位于同一物理或虚拟 LAN 的主机之间使用 MACsec。
使用 MACsec 安全标准保护链路层的通信,也称为 Open Systems Interconnection (OSI)模型的第 2 层,提供以下显著优点:
- 第 2 层的加密消除了在第 7 层加密单个服务的需要。这减少了管理与每个主机上每个端点的大量证书关联的开销。
- 直接连接的网络设备(如路由器和交换机)之间的点对点安全性。
- 不需要对应用程序和高层协议进行更改。
10.2. 使用 nmcli
配置 MACsec 连接
您可以使用 nmcli
工具将以太网接口配置为使用 MACsec。例如,您可以在通过以太网连接的两个主机之间创建一个 MACsec 连接。
流程
在配置 MACsec 的第一个主机上:
为预共享密钥创建连接关联密钥(CAK)和连接关联密钥名称(CKN):
创建一个 16 字节的十六进制 CAK:
dd if=/dev/urandom count=16 bs=1 2> /dev/null | hexdump -e '1/2 "%04x"'
# dd if=/dev/urandom count=16 bs=1 2> /dev/null | hexdump -e '1/2 "%04x"' 50b71a8ef0bd5751ea76de6d6c98c03a
Copy to Clipboard Copied! 创建一个 32 字节的十六进制 CKN:
dd if=/dev/urandom count=32 bs=1 2> /dev/null | hexdump -e '1/2 "%04x"'
# dd if=/dev/urandom count=32 bs=1 2> /dev/null | hexdump -e '1/2 "%04x"' f2b4297d39da7330910a74abc0449feb45b5c0b9fc23df1430e1898fcf1c4550
Copy to Clipboard Copied!
- 在您要通过 MACsec 连接连接的两个主机上:
创建 MACsec 连接:
nmcli connection add type macsec con-name macsec0 ifname macsec0 connection.autoconnect yes macsec.parent enp1s0 macsec.mode psk macsec.mka-cak 50b71a8ef0bd5751ea76de6d6c98c03a macsec.mka-ckn f2b4297d39da7330910a74abc0449feb45b5c0b9fc23df1430e1898fcf1c4550
# nmcli connection add type macsec con-name macsec0 ifname macsec0 connection.autoconnect yes macsec.parent enp1s0 macsec.mode psk macsec.mka-cak 50b71a8ef0bd5751ea76de6d6c98c03a macsec.mka-ckn f2b4297d39da7330910a74abc0449feb45b5c0b9fc23df1430e1898fcf1c4550
Copy to Clipboard Copied! 在
macsec.mka-cak
和macsec.mka-ckn
参数中使用上一步生成的 CAK 和 CKN。在 MACsec-protected 网络的每个主机上,这些值必须相同。配置 MACsec 连接中的 IP 设置。
配置
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'
# nmcli connection modify macsec0 ipv4.method manual ipv4.addresses '192.0.2.1/24' ipv4.gateway '192.0.2.254' ipv4.dns '192.0.2.253'
Copy to Clipboard Copied! 配置
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'
# nmcli connection modify macsec0 ipv6.method manual ipv6.addresses '2001:db8:1::1/32' ipv6.gateway '2001:db8:1::fffe' ipv6.dns '2001:db8:1::fffd'
Copy to Clipboard Copied!
激活连接:
nmcli connection up macsec0
# nmcli connection up macsec0
Copy to Clipboard Copied!
验证
验证流量是否加密:
tcpdump -nn -i enp1s0
# tcpdump -nn -i enp1s0
Copy to Clipboard Copied! 可选:显示未加密的流量:
tcpdump -nn -i macsec0
# tcpdump -nn -i macsec0
Copy to Clipboard Copied! 显示 MACsec 统计信息:
ip macsec show
# ip macsec show
Copy to Clipboard Copied! 显示每种保护类型的单独的计数器:仅完整性(关闭加密)和加密(打开加密)
ip -s macsec show
# ip -s macsec show
Copy to Clipboard Copied!
10.3. 使用 nmstatectl
配置 MACsec 连接
您可以通过 nmstatectl
工具,以声明的方式将以太网接口配置为使用 MACsec。例如,在 YAML 文件中,您可以描述网络所需的状态,假设其在通过以太网连接的两个主机之间有一个 MACsec 连接。nmstatectl
工具解释 YAML 文件,并在主机之间部署持久和一致的网络配置。
先决条件
- 服务器配置中存在一个物理或虚拟以太网网络接口控制器(NIC)。
-
nmstate
软件包已安装。
流程
在您配置 MACsec 的第一个主机上,为预共享密钥创建连接关联密钥(CAK)和连接关联密钥名称(CKN):
创建一个 16 字节的十六进制 CAK:
dd if=/dev/urandom count=16 bs=1 2> /dev/null | hexdump -e '1/2 "%04x"'
# dd if=/dev/urandom count=16 bs=1 2> /dev/null | hexdump -e '1/2 "%04x"' 50b71a8ef0bd5751ea76de6d6c98c03a
Copy to Clipboard Copied! 创建一个 32 字节的十六进制 CKN:
dd if=/dev/urandom count=32 bs=1 2> /dev/null | hexdump -e '1/2 "%04x"'
# dd if=/dev/urandom count=32 bs=1 2> /dev/null | hexdump -e '1/2 "%04x"' f2b4297d39da7330910a74abc0449feb45b5c0b9fc23df1430e1898fcf1c4550
Copy to Clipboard Copied!
在您要通过 MACsec 连接连接的两个主机上,完成以下步骤:
使用以下设置创建一个 YAML 文件,如
create-macsec-connection.yml
:--- routes: config: - destination: 0.0.0.0/0 next-hop-interface: macsec0 next-hop-address: 192.0.2.2 table-id: 254 - destination: 192.0.2.2/32 next-hop-interface: macsec0 next-hop-address: 0.0.0.0 table-id: 254 dns-resolver: config: search: - example.com server: - 192.0.2.200 - 2001:db8:1::ffbb interfaces: - name: macsec0 type: macsec state: up ipv4: enabled: true address: - ip: 192.0.2.1 prefix-length: 32 ipv6: enabled: true address: - ip: 2001:db8:1::1 prefix-length: 64 macsec: encrypt: true base-iface: enp0s1 mka-cak: 50b71a8ef0bd5751ea76de6d6c98c03a mka-ckn: f2b4297d39da7330910a74abc0449feb45b5c0b9fc23df1430e1898fcf1c4550 port: 0 validation: strict send-sci: true
--- routes: config: - destination: 0.0.0.0/0 next-hop-interface: macsec0 next-hop-address: 192.0.2.2 table-id: 254 - destination: 192.0.2.2/32 next-hop-interface: macsec0 next-hop-address: 0.0.0.0 table-id: 254 dns-resolver: config: search: - example.com server: - 192.0.2.200 - 2001:db8:1::ffbb interfaces: - name: macsec0 type: macsec state: up ipv4: enabled: true address: - ip: 192.0.2.1 prefix-length: 32 ipv6: enabled: true address: - ip: 2001:db8:1::1 prefix-length: 64 macsec: encrypt: true base-iface: enp0s1 mka-cak: 50b71a8ef0bd5751ea76de6d6c98c03a mka-ckn: f2b4297d39da7330910a74abc0449feb45b5c0b9fc23df1430e1898fcf1c4550 port: 0 validation: strict send-sci: true
Copy to Clipboard Copied! -
在
mka-cak
和mka-ckn
参数中使用上一步中生成的 CAK 和 CKN。在 MACsec-protected 网络的每个主机上,这些值必须相同。 可选:在同一 YAML 配置文件中,您还可以配置以下设置:
-
静态 IPv4 地址 -
192.0.2.1
,子网掩码为/32
-
静态 IPv6 地址 -
2001:db8:1::1
,子网掩码为/64
-
IPv4 默认网关 -
192.0.2.2
-
IPv4 DNS 服务器 -
192.0.2.200
-
IPv6 DNS 服务器 -
2001:db8:1::ffbb
-
DNS 搜索域 -
example.com
-
静态 IPv4 地址 -
将设置应用到系统:
nmstatectl apply create-macsec-connection.yml
# nmstatectl apply create-macsec-connection.yml
Copy to Clipboard Copied!
验证
以 YAML 格式显示当前状态:
nmstatectl show macsec0
# nmstatectl show macsec0
Copy to Clipboard Copied! 验证流量是否加密:
tcpdump -nn -i enp0s1
# tcpdump -nn -i enp0s1
Copy to Clipboard Copied! 可选:显示未加密的流量:
tcpdump -nn -i macsec0
# tcpdump -nn -i macsec0
Copy to Clipboard Copied! 显示 MACsec 统计信息:
ip macsec show
# ip macsec show
Copy to Clipboard Copied! 显示每种保护类型的单独的计数器:仅完整性(关闭加密)和加密(打开加密)
ip -s macsec show
# ip -s macsec show
Copy to Clipboard Copied!
第 11 章 配置 NetworkManager 以忽略某些设备
默认情况下,NetworkManager 管理除 /usr/lib/udev/rules.d/85-nm-unmanaged.rules
文件中描述的之外的所有设备。要忽略某些其他设备,您可以在 NetworkManager 中将它们配置为 unmanaged
。
11.1. 永久将设备配置为网络管理器(NetworkManager)中非受管设备
您可以根据几个标准,将设备配置为 unmanaged
,如接口名称、MAC 地址或设备类型。如果您使用配置中的 device 部分将设备设置为非受管设备,NetworkManager 不会管理该设备,直到您开始使用该设备。
流程
可选:显示要识别设备的设备列表或您要设置为
unmanaged
的设备的 MAC 地址:ip link show
# ip link show ... 2: enp1s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP mode DEFAULT group default qlen 1000 link/ether 52:54:00:74:79:56 brd ff:ff:ff:ff:ff:ff ...
Copy to Clipboard Copied! -
在
/etc/NetworkManager/
目录中创建 2.2.conf 文件,例如conf
.d//etc/NetworkManager/conf.d/99-unmanaged-devices.conf
。 对于您要配置为 unmanaged 的每个设备,为该文件添加一个带有唯一名称的部分。
重要部分名称必须以
device-
开头。要将特定接口配置为 unmanaged,请添加:
[device-enp1s0-unmanaged] match-device=interface-name:enp1s0 managed=0
[device-enp1s0-unmanaged] match-device=interface-name:enp1s0 managed=0
Copy to Clipboard Copied! 要将具有特定 MAC 地址的设备配置为 unmanaged,请添加:
[device-mac525400747956-unmanaged] match-device=mac:52:54:00:74:79:56 managed=0
[device-mac525400747956-unmanaged] match-device=mac:52:54:00:74:79:56 managed=0
Copy to Clipboard Copied! 要将特定类型的所有设备配置为 unmanaged,请添加:
[device-ethernet-unmanaged] match-device=type:ethernet managed=0
[device-ethernet-unmanaged] match-device=type:ethernet managed=0
Copy to Clipboard Copied! 要将多个设备设置为非受管设备,请使用分号在
unmanaged-devices
参数中分隔条目,例如:[device-multiple-devices-unmanaged] match-device=interface-name:enp1s0;interface-name:enp7s0 managed=0
[device-multiple-devices-unmanaged] match-device=interface-name:enp1s0;interface-name:enp7s0 managed=0
Copy to Clipboard Copied! 另外,您可以为此文件中的每个设备添加单独的部分,或者在
/etc/NetworkManager/
目录中创建额外的 5.2.conf 文件。conf
.d/
重启主机系统:
reboot
# reboot
Copy to Clipboard Copied!
验证
显示设备列表:
nmcli device status
# nmcli device status DEVICE TYPE STATE CONNECTION enp1s0 ethernet unmanaged -- ...
Copy to Clipboard Copied! enp1s0
设备旁边的unmanaged
状态表示 NetworkManager 没有管理该设备。
故障排除
如果
nmcli device status
命令的输出没有将设备列为非受管
,则显示 NetworkManager 配置:NetworkManager --print-config
# NetworkManager --print-config ... [device-enp1s0-unmanaged] match-device=interface-name:enp1s0 managed=0 ...
Copy to Clipboard Copied! 如果输出与您配置的设置不匹配,请确保没有优先级较高的配置文件覆盖了您的设置。有关 NetworkManager 如何合并多个配置文件的详情,请查看系统中的
NetworkManager.conf (5)
手册页。
11.2. 将设备临时配置为在 NetworkManager 中不被管理
您可以临时将设备配置为 unmanaged
,例如,出于测试目的。这个更改会保留重新加载并重启 NetworkManager systemd 服务,而不是系统重启。
流程
可选:显示设备列表,以便识别您要将其设置为
unmanaged
的设备:nmcli device status
# nmcli device status DEVICE TYPE STATE CONNECTION enp1s0 ethernet disconnected -- ...
Copy to Clipboard Copied! 将
enp1s0
设备设置为unmanaged
状态:nmcli device set enp1s0 managed no
# nmcli device set enp1s0 managed no
Copy to Clipboard Copied!
验证
显示设备列表:
nmcli device status
# nmcli device status DEVICE TYPE STATE CONNECTION enp1s0 ethernet unmanaged -- ...
Copy to Clipboard Copied! enp1s0
设备旁边的unmanaged
状态表示 NetworkManager 没有管理该设备。
11.3. 确定 NetworkManager 不管理特定网络设备的原因
除了每个网络设备的状态外,NetworkManager 还跟踪设备处于当前状态的原因。您可以使用此功能来识别 NetworkManager 不管理某些设备的原因。
流程
显示所有网络设备的状态及其原因:
nmcli -f GENERAL.DEVICE,GENERAL.STATE,GENERAL.REASON device show
# nmcli -f GENERAL.DEVICE,GENERAL.STATE,GENERAL.REASON device show
Copy to Clipboard Copied! 如果您将设备名称传递给命令,则只能显示指定设备的输出。
输出示例:
GENERAL.DEVICE: enp1s0 GENERAL.STATE: 10 (unmanaged) GENERAL.REASON: 75 (The device is unmanaged by explicit user decision (e.g. 'nmcli device set $DEV managed no')) GENERAL.DEVICE: enp7s0 GENERAL.STATE: 10 (unmanaged) GENERAL.REASON: 74 (The device is unmanaged by user decision in NetworkManager.conf ('unmanaged' in a [device*] section) GENERAL.DEVICE: veth3 GENERAL.STATE: 10 (unmanaged) GENERAL.REASON: 77 (The device is unmanaged via udev rule)
GENERAL.DEVICE: enp1s0 GENERAL.STATE: 10 (unmanaged) GENERAL.REASON: 75 (The device is unmanaged by explicit user decision (e.g. 'nmcli device set $DEV managed no')) GENERAL.DEVICE: enp7s0 GENERAL.STATE: 10 (unmanaged) GENERAL.REASON: 74 (The device is unmanaged by user decision in NetworkManager.conf ('unmanaged' in a [device*] section) GENERAL.DEVICE: veth3 GENERAL.STATE: 10 (unmanaged) GENERAL.REASON: 77 (The device is unmanaged via udev rule)
Copy to Clipboard Copied! 注意请注意,命令会返回所有设备的状态,无论它们是否被管理还是非受管。
第 12 章 管理默认网关
默认网关是在没有其他路由与数据包的目的地匹配时转发网络数据包的路由器。在本地网络中,默认网关通常是与距离互联网有一跳的主机。
12.1. 使用 nmcli
对现有连接设置默认网关
在大多数情况下,管理员在创建连接时设置默认网关。但是,您也可以使用 nmcli
工具对之前创建的连接设置或更新默认网关设置。
先决条件
- 至少需要在设置默认网关的连接上配置一个静态 IP 地址。
-
如果用户在物理控制台中登录,用户权限就足够了。否则,该用户必须具有
root
权限。
流程
设置默认网关的 IP 地址:
要设置 IPv4 默认网关,请输入:
nmcli connection modify <connection_name> ipv4.gateway "<IPv4_gateway_address>"
# nmcli connection modify <connection_name> ipv4.gateway "<IPv4_gateway_address>"
Copy to Clipboard Copied! 要设置 IPv6 默认网关,请输入:
nmcli connection modify <connection_name> ipv6.gateway "<IPv6_gateway_address>"
# nmcli connection modify <connection_name> ipv6.gateway "<IPv6_gateway_address>"
Copy to Clipboard Copied! 重启网络连接以使更改生效:
nmcli connection up <connection_name>
# nmcli connection up <connection_name>
Copy to Clipboard Copied! 警告所有目前使用这个网络连接的连接在重启过程中暂时中断。
验证
验证路由是否处于活跃状态:
要显示 IPv4 默认网关,请输入:
ip -4 route
# ip -4 route default via 192.0.2.1 dev example proto static metric 100
Copy to Clipboard Copied! 要显示 IPv6 默认网关,请输入:
ip -6 route
# ip -6 route default via 2001:db8:1::1 dev example proto static metric 100 pref medium
Copy to Clipboard Copied!
12.2. 使用 nmstatectl
对现有连接设置默认网关
在大多数情况下,管理员在创建连接时设置默认网关。但是,您也可以使用 nmstatectl
工具对之前创建的连接设置或更新默认网关设置。
使用 nmstatectl
工具通过 Nmstate API 设置默认网关。Nmstate API 确保设置配置后结果与配置文件匹配。如果有任何失败,nmstatectl
会自动回滚更改以避免系统处于不正确的状态。
先决条件
- 至少需要在设置默认网关的连接上配置一个静态 IP 地址。
-
enp1s0
接口已配置,默认网关的 IP 地址在此接口的 IP 配置子网内。 -
nmstate
软件包已安装。
流程
创建一个包含以下内容的 YAML 文件,如
~/set-default-gateway.yml
:--- routes: config: - destination: 0.0.0.0/0 next-hop-address: 192.0.2.1 next-hop-interface: enp1s0
--- routes: config: - destination: 0.0.0.0/0 next-hop-address: 192.0.2.1 next-hop-interface: enp1s0
Copy to Clipboard Copied! 这些设置将
192.0.2.1
定义为默认网关,可通过enp1s0
接口访问默认网关。将设置应用到系统:
nmstatectl apply ~/set-default-gateway.yml
# nmstatectl apply ~/set-default-gateway.yml
Copy to Clipboard Copied!
12.3. 使用 network
RHEL 系统角色对现有连接设置默认网关
如果数据包的目的地无法通过直接连接的网络或主机上配置的任何路由到达,则主机会将网络数据包转发到其默认网关。要配置主机的默认网关,请在作为默认网关连接到与相同网络的 接口的 NetworkManager 连接配置文件中设置它。通过使用 Ansible 和 network
RHEL 系统角色,您可以自动化此过程,并在 playbook 中定义的主机上远程配置连接配置文件。
在大多数情况下,管理员在创建连接时设置默认网关。但是,您也可以在之前创建的连接上设置或更新默认网关设置。
您不能使用 network
RHEL 系统角色只更新现有连接配置文件中的特定值。角色确保连接配置文件与 playbook 中的设置完全匹配。如果具有相同名称的连接配置文件存在,则角色将应用 playbook 中的设置,并将配置文件中的所有其他设置重置为其默认值。要防止重置值,请始终在 playbook 中指定网络连接配置文件的整个配置,包括您不想更改的设置。
先决条件
- 您已准备好控制节点和受管节点
- 以可在受管主机上运行 playbook 的用户登录到控制节点。
-
您用于连接到受管节点的帐户对它们具有
sudo
权限。
流程
创建一个包含以下内容的 playbook 文件,如
~/playbook.yml
:--- - name: Configure the network hosts: managed-node-01.example.com tasks: - name: Ethernet connection profile with static IP address settings ansible.builtin.include_role: name: redhat.rhel_system_roles.network vars: network_connections: - name: enp1s0 type: ethernet autoconnect: yes ip: address: - 198.51.100.20/24 - 2001:db8:1::1/64 gateway4: 198.51.100.254 gateway6: 2001:db8:1::fffe dns: - 198.51.100.200 - 2001:db8:1::ffbb dns_search: - example.com state: up
--- - name: Configure the network hosts: managed-node-01.example.com tasks: - name: Ethernet connection profile with static IP address settings ansible.builtin.include_role: name: redhat.rhel_system_roles.network vars: network_connections: - name: enp1s0 type: ethernet autoconnect: yes ip: address: - 198.51.100.20/24 - 2001:db8:1::1/64 gateway4: 198.51.100.254 gateway6: 2001:db8:1::fffe dns: - 198.51.100.200 - 2001:db8:1::ffbb dns_search: - example.com state: up
Copy to Clipboard Copied! 有关 playbook 中使用的所有变量的详情,请查看控制节点上的
/usr/share/ansible/roles/rhel-system-roles.network/README.md
文件。验证 playbook 语法:
ansible-playbook --syntax-check ~/playbook.yml
$ ansible-playbook --syntax-check ~/playbook.yml
Copy to Clipboard Copied! 请注意,这个命令只验证语法,不能防止错误的、但有效的配置。
运行 playbook:
ansible-playbook ~/playbook.yml
$ ansible-playbook ~/playbook.yml
Copy to Clipboard Copied!
验证
查询受管节点的 Ansible 事实,并验证活跃的网络设置:
ansible managed-node-01.example.com -m ansible.builtin.setup
# ansible managed-node-01.example.com -m ansible.builtin.setup ... "ansible_default_ipv4": { ... "gateway": "198.51.100.254", "interface": "enp1s0", ... }, "ansible_default_ipv6": { ... "gateway": "2001:db8:1::fffe", "interface": "enp1s0", ... } ...
Copy to Clipboard Copied!
12.4. NetworkManager 如何管理多个默认网关
在某些情况下,您可能需要在主机上设置多个默认网关。但是,为了避免异步路由问题,同一协议的每个默认网关都需要单独的指标值。请注意,RHEL 只使用到设置成最低指标的默认网关的连接。
您可以使用以下命令为连接的 IPv4 和 IPv6 网关设置指标:
nmcli connection modify <connection_name> ipv4.route-metric <value> ipv6.route-metric <value>
# 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 |
VLAN | 400 |
Bridge | 425 |
TUN | 450 |
Wi-Fi | 600 |
IP tunnel | 675 |
12.5. 配置 NetworkManager 以避免使用特定配置集提供默认网关
您可以配置 NetworkManager 从不使用特定的配置文件来提供默认网关。对于没有连接到默认网关的连接配置集,请按照以下步骤操作。
先决条件
- 没有连接到默认网关的连接的 NetworkManager 连接配置文件存在。
流程
如果连接使用动态 IP 配置,请配置 NetworkManager 不会使用这个连接作为相应 IP 类型的默认连接,这意味着 NetworkManager 永远不会为其分配默认路由:
nmcli connection modify <connection_name> ipv4.never-default yes ipv6.never-default yes
# nmcli connection modify <connection_name> ipv4.never-default yes ipv6.never-default yes
Copy to Clipboard Copied! 请注意,将
ipv4.never-default
和ipv6.never-default
设为yes
,会自动从连接配置文件中删除相应协议默认网关的 IP 地址。激活连接:
nmcli connection up <connection_name>
# nmcli connection up <connection_name>
Copy to Clipboard Copied!
验证
-
使用
ip -4
路由和ip -6 route
命令,来验证 RHEL 是否未对 IPv4 和 IPv6 协议的默认路使用网络接口。
12.6. 修复因为多个默认网关导致的意外路由行为
只有一些场景,比如使用多路径 TCP 时,您需要在主机上有多个默认网关。在大多数情况下,您只配置一个默认网关,来避免意外的路由行为或异步路由问题。
要将流量路由到不同的互联网提供商,请使用基于策略的路由,而不是多个默认网关。
先决条件
- 主机使用 NetworkManager 管理网络连接,这是默认设置。
- 主机有多个网络接口。
- 主机配置了多个默认网关。
流程
显示路由表:
对于 IPv4,请输入:
ip -4 route
# ip -4 route default via 192.0.2.1 dev enp1s0 proto dhcp metric 101 default via 198.51.100.1 dev enp7s0 proto dhcp metric 102 ...
Copy to Clipboard Copied! 对于 IPv6,请输入:
ip -6 route
# ip -6 route default via 2001:db8:1::1 dev enp1s0 proto ra metric 101 pref medium default via 2001:db8:2::1 dev enp7s0 proto ra metric 102 pref medium ...
Copy to Clipboard Copied!
以
default
开头的条目表示默认路由。注意dev
旁边显示的这些条目的接口名称。使用以下命令显示您使用在上一步中识别的接口的 NetworkManager 连接:
nmcli -f GENERAL.CONNECTION,IP4.GATEWAY,IP6.GATEWAY device show enp1s0 nmcli -f GENERAL.CONNECTION,IP4.GATEWAY,IP6.GATEWAY device show enp7s0
# nmcli -f GENERAL.CONNECTION,IP4.GATEWAY,IP6.GATEWAY device show enp1s0 GENERAL.CONNECTION: Corporate-LAN IP4.GATEWAY: 192.0.2.1 IP6.GATEWAY: 2001:db8:1::1 # nmcli -f GENERAL.CONNECTION,IP4.GATEWAY,IP6.GATEWAY device show enp7s0 GENERAL.CONNECTION: Internet-Provider IP4.GATEWAY: 198.51.100.1 IP6.GATEWAY: 2001:db8:2::1
Copy to Clipboard Copied! 在这些示例中,名为
Corporate-LAN
和Internet-Provider
的配置文件设置了默认网关。因为在本地网络中,默认网关通常是距离互联网一跳的主机,所以此流程的剩下部分假设Corporate-LAN
中的默认网关是不正确的。配置 NetworkManager 不使用
Corporate-LAN
连接作为 IPv4 和 IPv6 连接的默认路由:nmcli connection modify Corporate-LAN ipv4.never-default yes ipv6.never-default yes
# nmcli connection modify Corporate-LAN ipv4.never-default yes ipv6.never-default yes
Copy to Clipboard Copied! 请注意,将
ipv4.never-default
和ipv6.never-default
设为yes
,会自动从连接配置文件中删除相应协议默认网关的 IP 地址。激活
Corporate-LAN
连接:nmcli connection up Corporate-LAN
# nmcli connection up Corporate-LAN
Copy to Clipboard Copied!
验证
显示 IPv4 和 IPv6 路由表,并确认每个协议都只有一个默认网关:
对于 IPv4,请输入:
ip -4 route
# ip -4 route default via 198.51.100.1 dev enp7s0 proto dhcp metric 102 ...
Copy to Clipboard Copied! 对于 IPv6,请输入:
ip -6 route
# ip -6 route default via 2001:db8:2::1 dev enp7s0 proto ra metric 102 pref medium ...
Copy to Clipboard Copied!
第 13 章 配置静态路由
路由可确保您可以在相互连接的网络间发送和接收流量。在较大环境中,管理员通常配置服务以便路由器可以动态地了解其他路由器。在较小的环境中,管理员通常会配置静态路由,以确保流量可以从一个网络到下一个网络访问。
如果适用所有这些条件,您需要静态路由以在多个网络间获得正常运行的通信:
- 流量必须通过多个网络。
- 通过默认网关的独占流量流不足。
需要静态路由部分的网络示例 描述了在没有配置静态路由时不同网络间的流量流。
13.1. 需要静态路由的网络示例
您需要在这个示例中的静态路由,因为并非所有 IP 网络都通过一个路由器直接连接。如果没有静态路由,一些网络无法相互通信。此外,某些网络流的流量仅有一个方向。
本例中的网络拓扑是假设的,仅用于解释静态路由的概念。在生产环境中并不推荐使用这个拓扑。
对于本示例中所有网络中的一个正常运行的通信,请将静态路由配置为 Raleigh (198.51.100.0/24
),下一个越点(hop)路由器 2 (203.0.113.10
)。下一个跃点的 IP 地址是数据中心网络中的一个路由器 2 (203.0.113.0/24
)。
您可以配置静态路由,如下所示:
-
对于简化的配置,仅在路由器 1 上设置此静态路由。但是,这会增加路由器 1 上的流量,因为来自数据中心(
203.0.113.0/24
)的主机将流量发送到 Raleigh (198.51.100.0/24
),始终通过路由器 1 到路由器 2。 -
对于更复杂的配置,请在数据中心的所有主机上配置此静态路由 (
203.0.113.0/24
)。然后,此子网中的所有主机直接向路由器 2 (203.0.113.10
)发送更接近 Raleigh 的主机 (198.51.100.0/24
)。
有关网络流量流或不符的更多详情,请参见以下示意图中的说明。

在所需的静态路由没有配置的情况下 ,如下是通信可以正常工作和不能正常工作的情况:
Berlin 网络中的主机 (
192.0.2.0/24
):- 可以与同一子网中的其他主机通信,因为它们是直接连接的。
-
可以与互联网进行通信,因为路由器 1 位于 Berlin 网络(
192.0.2.0/24
)中,并且有默认网关,其可以访问互联网。 -
可以与数据中心网络 (
203.0.113.0/24
)通信 ,因为路由器 1 在 Berlin (192.0.2.0/24
) 和数据中心(203.0.113.0/24
) 网络中都有接口。 -
无法与 Raleigh 网络 (
198.51.100.0/24
) 通信,因为路由器 1 在此网络中没有接口。因此,路由器 1 将流量发送到自己的默认网关(互联网)。
数据中心网络中的主机 (
203.0.113.0/24
):- 可以与同一子网中的其他主机通信,因为它们是直接连接的。
-
可以与互联网进行通信,因为它们有设置到路由器 1 的默认网关,路由器 1 在两个网络,数据中心(
203.0.113.0/24
)和互联网中都有接口。 -
可以与 Berlin 网络 (
192.0.2.0/24
) 通信,因为它们的默认网关设置为路由器 1,并且路由器 1 在数据中心 (203.0.113.0/24
) 和 Berlin (192.0.2.0/24
) 网络中都存在接口。 -
无法与 Raleigh 网络 (
198.51.100.0/24
) 通信,因为该网络中没有接口。因此,数据中心中的主机 (203.0.113.0/24
) 将流量发送到其默认网关 (路由器 1)。路由器 1 在 Raleigh 网络(198.51.100.0/24
)中没有接口,因此路由器 1 将此流量发送到自己的默认网关(互联网)。
Raleigh 网络中的主机 (
198.51.100.0/24
):- 可以与同一子网中的其他主机通信,因为它们是直接连接的。
-
无法与互联网上的主机进行通信。因为默认的网关设置,路由器 2 将流量发送到路由器 1。路由器 1 的实际行为取决于反向路径过滤器 (
rp_filter
) 系统控制 (sysctl
) 设置。默认情况下,在 RHEL 上,路由器 1 会丢弃传出流量,而不是将其路由到互联网。但是,无论配置的行为如何,都无法在没有静态路由的情况下进行通信。 -
无法与数据中心网络通信(
203.0.113.0/24
)。由于默认网关设置,传出流量通过路由器 2 到达目的地。但是,对数据包的回复不会到达发送者,因为数据中心网络中的主机(203.0.113.0/24
)将回复发送到其默认网关(Router 1)。然后,路由器 1 将流量发送到互联网。 -
无法与 Berlin 网络通信(
192.0.2.0/24
)。因为默认的网关设置,路由器 2 将流量发送到路由器 1。路由器 1 的实际行为取决于sysctl
设置rp_filter
。默认情况下,在 RHEL 中,路由器 1 会丢弃传出流量,而不是将其发送到 Berlin 网络(192.0.2.0/24
)。但是,无论配置的行为如何,都无法在没有静态路由的情况下进行通信。
除了配置静态路由外,还必须在两个路由器上启用 IP 转发。
13.2. 如何使用 nmcli
工具配置静态路由
要配置静态路由,请使用具有以下语法的 nmcli
工具:
nmcli connection modify connection_name ipv4.routes "ip[/prefix] [next_hop] [metric] [attribute=value] [attribute=value] ..."
$ nmcli connection modify connection_name ipv4.routes "ip[/prefix] [next_hop] [metric] [attribute=value] [attribute=value] ..."
该命令支持以下路由属性:
-
cwnd=n
:设置拥塞窗口(CWND)大小,以数据包数定义。 -
lock-cwnd=true|false
:定义内核是否可以更新 CWND 值。 -
lock-mtu=true|false
:定义内核是否可以将 MTU 更新为路径 MTU 发现。 -
lock-window=true|false
:定义内核是否可更新 TCP 数据包的最大窗口大小。 -
mtu=<mtu_value>
:设置沿目标路径使用的最大传输单元(MTU)。 -
onlink=true|false
:定义下一个跃点是否直接附加到此链接,即使它与任何接口前缀都不匹配。 -
scope=<scope>
: 对于 IPv4 路由,此属性设置路由前缀涵盖的目标的范围。将值设为整数(0-255)。 -
src=<source_address>
:当将流量发送到路由前缀所涵盖的目标时,将源地址设置为首选。 -
table=<table_id>
:设置应将路由添加到的表的 ID。如果省略此参数,NetworkManager 将使用main
表。 -
tos=<type_of_service_key>
:设置服务(TOS)密钥的类型。将值设为整数(0-255)。 -
type=<route_type>
:设置路由类型。NetworkManager 支持unicast
、local
、blackhole
、unreachable
、prohibit
和throw
路由类型。默认为unicast
。 -
window=<window_size>
:设置 TCP 向这些目标通告的最大窗口大小,以字节为单位。
如果您使用 ipv4.routes
选项,而前面没有 +
符号,则 nmcli
会覆盖这个参数的所有当前设置。
要创建额外的路由,请输入:
nmcli connection modify connection_name +ipv4.routes "<route>"
$ nmcli connection modify connection_name +ipv4.routes "<route>"
Copy to Clipboard Copied! 要删除特定的路由,请输入:
nmcli connection modify connection_name -ipv4.routes "<route>"
$ nmcli connection modify connection_name -ipv4.routes "<route>"
Copy to Clipboard Copied!
13.3. 使用 nmcli
配置静态路由
您可以使用 nmcli connection modify
命令将静态路由添加到现有 NetworkManager 连接配置集。
以下流程配置以下路由:
-
到远程
198.51.100.0/24
网络的 IPv4 路由。IP 地址为192.0.2.10
的相应网关可以通过LAN
连接配置文件访问。 -
到远程
2001:db8:2::/64
网络的 IPv6 路由。IP 地址为2001:db8:1::10
的相应网关可以通过LAN
连接配置文件访问。
先决条件
-
LAN
连接配置文件存在,且其将位于同一个 IP 子网中的此主机配置为网关。
流程
将静态 IPv4 路由添加到
LAN
连接配置文件中:nmcli connection modify LAN +ipv4.routes "198.51.100.0/24 192.0.2.10"
# nmcli connection modify LAN +ipv4.routes "198.51.100.0/24 192.0.2.10"
Copy to Clipboard Copied! 要在一个步骤中设置多个路由,请将用逗号分开的单个路由传给命令:
nmcli connection modify <connection_profile> +ipv4.routes "<remote_network_1>/<subnet_mask_1> <gateway_1>, <remote_network_n>/<subnet_mask_n> <gateway_n>, ..."
# nmcli connection modify <connection_profile> +ipv4.routes "<remote_network_1>/<subnet_mask_1> <gateway_1>, <remote_network_n>/<subnet_mask_n> <gateway_n>, ..."
Copy to Clipboard Copied! 将静态 IPv6 路由添加到
LAN
连接配置文件中:nmcli connection modify LAN +ipv6.routes "2001:db8:2::/64 2001:db8:1::10"
# nmcli connection modify LAN +ipv6.routes "2001:db8:2::/64 2001:db8:1::10"
Copy to Clipboard Copied! 重新激活连接:
nmcli connection up LAN
# nmcli connection up LAN
Copy to Clipboard Copied!
验证
显示 IPv4 路由:
ip -4 route
# ip -4 route ... 198.51.100.0/24 via 192.0.2.10 dev enp1s0
Copy to Clipboard Copied! 显示 IPv6 路由:
ip -6 route
# ip -6 route ... 2001:db8:2::/64 via 2001:db8:1::10 dev enp1s0 metric 1024 pref medium
Copy to Clipboard Copied!
13.4. 使用 nmtui
配置静态路由
nmtui
应用程序为 NetworkManager 提供了一个基于文本的用户界面。您可以使用 nmtui
在没有图形界面的主机上配置静态路由。
例如,以下流程将路由添加到 192.0.2.0/24
网络,该网络使用运行在 198.51.100.1
上的网关,该网络可通过现有的连接配置文件访问。
在 nmtui
中:
- 使用光标键导航。
- 选择一个按钮并按 Enter 键。
- 使用 空格 选择和清除复选框。
- 要返回上一个屏幕,请使用 ESC。
先决条件
- 网络已配置。
- 静态路由的网关必须在接口上直接访问。
- 如果用户在物理控制台中登录,用户权限就足够了。否则,命令需要 root 权限。
流程
启动
nmtui
:nmtui
# nmtui
Copy to Clipboard Copied! - 选择 Edit a connection,然后按 Enter。
- 选择您可通过其到达目的地网络的下一跳的连接配置文件,然后按 Enter 。
- 根据它是 IPv4 路由还是 IPv6 路由,按协议配置区域旁边的 Show 按钮。
按 Routing 旁边的 Edit 按钮。这将打开一个新窗口,您可在其中配置静态路由:
按 Add 按钮并填写:
- 目的网络,包括无类别域间路由(CIDR)格式的前缀
- 下一跳的 IP 地址
- 指标值,如果您向同一网络添加多个路由,并且希望根据效率对路由进行优先排序
- 对您要添加的每个路由重复上一步,且通过此连接配置文件可达。
按 OK 按钮返回到连接设置窗口。
图 13.1. 没有指标的静态路由的示例
-
按 OK 按钮返回到
nmtui
主菜单。 - 选择 Activate a connection,然后按 Enter。
选择您编辑的连接配置文件,然后按 Enter 两次来停用并再次激活它。
重要如果您通过使用您要重新激活的连接配置文件的远程连接(如 SSH)来运行
nmtui
,请跳过这一步。在这种情况下,如果您在nmtui
中停用了它,连接将被终止,因此您无法再次激活它。要避免这个问题,请使用nmcli connection <connection_profile> up
命令,来在上述场景中重新激活连接。- 按 Back 按钮返回到主菜单。
-
选择 Quit,然后按 Enter 键关闭
nmtui
应用程序。
验证
验证路由是否处于活跃状态:
ip route
$ ip route ... 192.0.2.0/24 via 198.51.100.1 dev example proto static metric 100
Copy to Clipboard Copied!
13.5. 使用 nmstatectl
配置静态路由
使用 nmstatectl
工具,通过 Nmstate API 配置静态路由。Nmstate API 确保设置配置后结果与配置文件匹配。如果有任何失败,nmstatectl
会自动回滚更改以避免系统处于不正确的状态。
先决条件
-
enp1s0
网络接口已配置,且与网关位于同一个 IP 子网。 -
nmstate
软件包已安装。
流程
创建一个包含以下内容的 YAML 文件,如
~/add-static-route-to-enp1s0.yml
:--- routes: config: - destination: 198.51.100.0/24 next-hop-address: 192.0.2.10 next-hop-interface: enp1s0 - destination: 2001:db8:2::/64 next-hop-address: 2001:db8:1::10 next-hop-interface: enp1s0
--- routes: config: - destination: 198.51.100.0/24 next-hop-address: 192.0.2.10 next-hop-interface: enp1s0 - destination: 2001:db8:2::/64 next-hop-address: 2001:db8:1::10 next-hop-interface: enp1s0
Copy to Clipboard Copied! 这些设置定义以下静态路由:
-
到远程
198.51.100.0/24
网络的 IPv4 路由。IP 地址为192.0.2.10
的对应网关可以通过enp1s0
接口访问。 -
到远程
2001:db8:2::/64
网络的 IPv6 路由。IP 地址为2001:db8:1::10
的对应网关可以通过enp1s0
接口访问。
-
到远程
将设置应用到系统:
nmstatectl apply ~/add-static-route-to-enp1s0.yml
# nmstatectl apply ~/add-static-route-to-enp1s0.yml
Copy to Clipboard Copied!
验证
显示 IPv4 路由:
ip -4 route
# ip -4 route ... 198.51.100.0/24 via 192.0.2.10 dev enp1s0
Copy to Clipboard Copied! 显示 IPv6 路由:
ip -6 route
# ip -6 route ... 2001:db8:2::/64 via 2001:db8:1::10 dev enp1s0 metric 1024 pref medium
Copy to Clipboard Copied!
13.6. 使用 network
RHEL 系统角色配置静态路由
您可以使用 network
RHEL 系统角色配置静态路由。
当您运行一个使用 network
RHEL 系统角色的 play 时,如果设置值与 play 中指定的值不匹配,则角色会覆盖具有相同名称的现有连接配置文件。要防止将这些值重置为其默认值,请始终在 play 中指定网络连接配置文件的整个配置,即使配置(如 IP 配置)已存在。
先决条件
- 您已准备好控制节点和受管节点
- 以可在受管主机上运行 playbook 的用户登录到控制节点。
-
您用于连接到受管节点的帐户对它们具有
sudo
权限。
流程
创建一个包含以下内容的 playbook 文件,如
~/playbook.yml
:--- - name: Configure the network hosts: managed-node-01.example.com tasks: - name: Configure an Ethernet connection with static IP and additional routes ansible.builtin.include_role: name: redhat.rhel_system_roles.network vars: network_connections: - name: enp7s0 type: ethernet autoconnect: yes ip: address: - 192.0.2.1/24 - 2001:db8:1::1/64 gateway4: 192.0.2.254 gateway6: 2001:db8:1::fffe dns: - 192.0.2.200 - 2001:db8:1::ffbb dns_search: - example.com route: route: - network: 198.51.100.0 prefix: 24 gateway: 192.0.2.10 - network: '2001:db8:2::' prefix: 64 gateway: 2001:db8:1::10 state: up
--- - name: Configure the network hosts: managed-node-01.example.com tasks: - name: Configure an Ethernet connection with static IP and additional routes ansible.builtin.include_role: name: redhat.rhel_system_roles.network vars: network_connections: - name: enp7s0 type: ethernet autoconnect: yes ip: address: - 192.0.2.1/24 - 2001:db8:1::1/64 gateway4: 192.0.2.254 gateway6: 2001:db8:1::fffe dns: - 192.0.2.200 - 2001:db8:1::ffbb dns_search: - example.com route: route: - network: 198.51.100.0 prefix: 24 gateway: 192.0.2.10 - network: '2001:db8:2::' prefix: 64 gateway: 2001:db8:1::10 state: up
Copy to Clipboard Copied! 根据它是否已存在,流程使用以下设置创建或更新
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
静态路由:
-
198.51.100.0/24
,网关为192.0.2.10
-
2001:db8:2::/64
,网关为2001:db8:1::10
-
-
静态 IPv4 地址 -
验证 playbook 语法:
ansible-playbook --syntax-check ~/playbook.yml
$ ansible-playbook --syntax-check ~/playbook.yml
Copy to Clipboard Copied! 请注意,这个命令只验证语法,不能防止错误的、但有效的配置。
运行 playbook:
ansible-playbook ~/playbook.yml
$ ansible-playbook ~/playbook.yml
Copy to Clipboard Copied!
验证
在受管节点上:
显示 IPv4 路由:
ip -4 route
# ip -4 route ... 198.51.100.0/24 via 192.0.2.10 dev enp7s0
Copy to Clipboard Copied! 显示 IPv6 路由:
ip -6 route
# ip -6 route ... 2001:db8:2::/64 via 2001:db8:1::10 dev enp7s0 metric 1024 pref medium
Copy to Clipboard Copied!
第 14 章 配置基于策略的路由以定义其他路由
默认情况下,RHEL 中的内核决定使用路由表根据目标地址转发网络数据包。基于策略的路由允许您配置复杂的路由场景。例如,您可以根据各种条件来路由数据包,如源地址、数据包元数据或协议。
14.1. 使用 nmcli
将流量从特定子网路由到不同的默认网关
您可以使用基于策略的路由为来自特定子网的流量配置不同的默认网关。例如,您可以将 RHEL 配置为默认路由,使用默认路由将所有流量路由到互联网提供商 A 。但是,从内部工作站子网接收的流量路由到供应商 B。
该流程假设以下网络拓扑:
先决条件
-
系统使用
NetworkManager
来配置网络,这是默认设置。 要在流程中设置的 RHEL 路由器有四个网络接口:
-
enp7s0
接口已连接到提供商 A 的网络。提供商网络中的网关 IP 为198.51.100.2
,网络使用/30
网络掩码。 -
enp1s0
接口已连接到提供商 B 的网络。提供商网络中的网关 IP 为192.0.2.2
,网络使用/30
网络掩码。 -
enp8s0
接口已与连有内部工作站的10.0.0.0/24
子网相连。 -
enp9s0
接口已与连有公司服务器的203.0.113.0/24
子网相连。
-
-
内部工作站子网中的主机使用
10.0.0.1
作为默认网关。在此流程中,您可以将这个 IP 地址分配给路由器的enp8s0
网络接口。 -
服务器子网中的主机使用
203.0.113.1
作为默认网关。在此流程中,您可以将这个 IP 地址分配给路由器的enp9s0
网络接口。 -
firewalld
服务已启用,并处于活动状态。
流程
将网络接口配置为供应商 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 Provider-A ifname enp7s0 ipv4.method manual ipv4.addresses 198.51.100.1/30 ipv4.gateway 198.51.100.2 ipv4.dns 198.51.100.200 connection.zone external
Copy to Clipboard Copied! nmcli connection add
命令创建 NetworkManager 连接配置文件。该命令使用以下选项:-
type ethernet
:定义连接类型是 Ethernet。 -
con-name <connection_name
> : 设置配置集的名称。使用有意义的名称以避免混淆。 -
ifname <network_device&
gt; : 设置网络接口。 -
ipv4.method manual
:允许配置静态 IP 地址。 -
ipv4.addresses & lt;IP_address> / <subnet_mask
> : 设置 IPv4 地址和子网掩码。 -
ipv4.gateway <IP_address
> :设置默认网关地址。 -
ipv4.dns <IP_of_DNS_server
> : 设置 DNS 服务器的 IPv4 地址。 -
connection.zone <firewalld_zone
> :将网络接口分配给定义的firewalld
区。请注意,firewalld
会为分配给external
区域的接口自动启用伪装。
-
将网络接口配置为供应商 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
# nmcli connection add type ethernet con-name Provider-B ifname enp1s0 ipv4.method manual ipv4.addresses 192.0.2.1/30 ipv4.routes "0.0.0.0/0 192.0.2.2 table=5000" connection.zone external
Copy to Clipboard Copied! 此命令使用
ipv4.routes
参数而不是ipv4.gateway
来设置默认网关。这需要将这个连接的默认网关分配给不同于默认的路由表(5000
)。当连接被激活时,NetworkManager 会自动创建这个新的路由表。将网络接口配置为内部工作站子网:
nmcli connection add type ethernet con-name Internal-Workstations ifname enp8s0 ipv4.method manual ipv4.addresses 10.0.0.1/24 ipv4.routes "10.0.0.0/24 table=5000" ipv4.routing-rules "priority 5 from 10.0.0.0/24 table 5000" connection.zone trusted
# nmcli connection add type ethernet con-name Internal-Workstations ifname enp8s0 ipv4.method manual ipv4.addresses 10.0.0.1/24 ipv4.routes "10.0.0.0/24 table=5000" ipv4.routing-rules "priority 5 from 10.0.0.0/24 table 5000" connection.zone trusted
Copy to Clipboard Copied! 此命令使用
ipv4.routes
参数将静态路由添加到 ID 为5000
的路由表中。10.0.0.0/24
子网的这个静态路由使用到供应商 B 的本地网络接口的 IP 地址(192.0.2.1
)来作为下一跳。另外,命令使用
ipv4.routing-rules
参数来添加优先级为5
的路由规则,该规则将来自10.0.0.0/24
子网的流量路由到表5000
。低的值具有更高的优先级。请注意,
ipv4.routing-rules
参数的语法与ip rule add
命令中的语法相同,但ipv4.routing-rules
总是需要指定优先级。将网络接口配置为服务器子网:
nmcli connection add type ethernet con-name Servers ifname enp9s0 ipv4.method manual ipv4.addresses 203.0.113.1/24 connection.zone trusted
# nmcli connection add type ethernet con-name Servers ifname enp9s0 ipv4.method manual ipv4.addresses 203.0.113.1/24 connection.zone trusted
Copy to Clipboard Copied!
验证
在内部工作站子网的 RHEL 主机上:
安装
traceroute
软件包:dnf install traceroute
# dnf install traceroute
Copy to Clipboard Copied! 使用
traceroute
工具显示到互联网上主机的路由:traceroute redhat.com
# traceroute redhat.com traceroute to redhat.com (209.132.183.105), 30 hops max, 60 byte packets 1 _gateway (10.0.0.1) 0.337 ms 0.260 ms 0.223 ms 2 192.0.2.2 (192.0.2.2) 0.884 ms 1.066 ms 1.248 ms ...
Copy to Clipboard Copied! 命令的输出显示路由器通过
192.0.2.1
,即提供商 B 的网络来发送数据包。
在服务器子网的 RHEL 主机上:
安装
traceroute
软件包:dnf install traceroute
# dnf install traceroute
Copy to Clipboard Copied! 使用
traceroute
工具显示到互联网上主机的路由:traceroute redhat.com
# traceroute redhat.com traceroute to redhat.com (209.132.183.105), 30 hops max, 60 byte packets 1 _gateway (203.0.113.1) 2.179 ms 2.073 ms 1.944 ms 2 198.51.100.2 (198.51.100.2) 1.868 ms 1.798 ms 1.549 ms ...
Copy to Clipboard Copied! 命令的输出显示路由器通过
198.51.100.2
,即供应商 A 的网络来发送数据包。
故障排除步骤
在 RHEL 路由器中:
显示规则列表:
ip rule list
# ip rule list 0: from all lookup local 5: from 10.0.0.0/24 lookup 5000 32766: from all lookup main 32767: from all lookup default
Copy to Clipboard Copied! 默认情况下,RHEL 包含表
local
、main
和default
的规则。显示表
5000
中的路由:ip route list table 5000
# ip route list table 5000 default via 192.0.2.2 dev enp1s0 proto static metric 100 10.0.0.0/24 dev enp8s0 proto static scope link src 192.0.2.1 metric 102
Copy to Clipboard Copied! 显示接口和防火墙区:
firewall-cmd --get-active-zones
# firewall-cmd --get-active-zones external interfaces: enp1s0 enp7s0 trusted interfaces: enp8s0 enp9s0
Copy to Clipboard Copied! 验证
external
区是否启用了伪装:firewall-cmd --info-zone=external
# firewall-cmd --info-zone=external external (active) target: default icmp-block-inversion: no interfaces: enp1s0 enp7s0 sources: services: ssh ports: protocols: masquerade: yes ...
Copy to Clipboard Copied!
14.2. 使用 network
RHEL 系统角色,将来自特定子网的流量路由到不同的默认网关
您可以使用基于策略的路由为来自特定子网的流量配置不同的默认网关。例如,您可以将 RHEL 配置为默认路由,使用默认路由将所有流量路由到互联网提供商 A 。但是,从内部工作站子网接收的流量路由到供应商 B。
要远程和在多个节点上配置基于策略的路由,您可以使用 network
RHEL 系统角色。
此流程假设以下网络拓扑:
先决条件
- 您已准备好控制节点和受管节点
- 以可在受管主机上运行 playbook 的用户登录到控制节点。
-
您用于连接到受管节点的帐户对它们具有
sudo
权限。 -
受管节点使用 NetworkManager 和
firewalld
服务。 您要配置的受管节点有 4 个网络接口:
-
enp7s0
接口已连接到提供商 A 的网络。提供商网络中的网关 IP 为198.51.100.2
,网络使用/30
网络掩码。 -
enp1s0
接口已连接到提供商 B 的网络。提供商网络中的网关 IP 为192.0.2.2
,网络使用/30
网络掩码。 -
enp8s0
接口已与连有内部工作站的10.0.0.0/24
子网相连。 -
enp9s0
接口已与连有公司服务器的203.0.113.0/24
子网相连。
-
-
内部工作站子网中的主机使用
10.0.0.1
作为默认网关。在此流程中,您可以将这个 IP 地址分配给路由器的enp8s0
网络接口。 -
服务器子网中的主机使用
203.0.113.1
作为默认网关。在此流程中,您可以将这个 IP 地址分配给路由器的enp9s0
网络接口。
流程
创建一个包含以下内容的 playbook 文件,如
~/playbook.yml
:--- - name: Configuring policy-based routing hosts: managed-node-01.example.com tasks: - name: Routing traffic from a specific subnet to a different default gateway ansible.builtin.include_role: name: redhat.rhel_system_roles.network vars: network_connections: - name: Provider-A interface_name: enp7s0 type: ethernet autoconnect: True ip: address: - 198.51.100.1/30 gateway4: 198.51.100.2 dns: - 198.51.100.200 state: up zone: external - name: Provider-B interface_name: enp1s0 type: ethernet autoconnect: True ip: address: - 192.0.2.1/30 route: - network: 0.0.0.0 prefix: 0 gateway: 192.0.2.2 table: 5000 state: up zone: external - name: Internal-Workstations interface_name: enp8s0 type: ethernet autoconnect: True ip: address: - 10.0.0.1/24 route: - network: 10.0.0.0 prefix: 24 table: 5000 routing_rule: - priority: 5 from: 10.0.0.0/24 table: 5000 state: up zone: trusted - name: Servers interface_name: enp9s0 type: ethernet autoconnect: True ip: address: - 203.0.113.1/24 state: up zone: trusted
--- - name: Configuring policy-based routing hosts: managed-node-01.example.com tasks: - name: Routing traffic from a specific subnet to a different default gateway ansible.builtin.include_role: name: redhat.rhel_system_roles.network vars: network_connections: - name: Provider-A interface_name: enp7s0 type: ethernet autoconnect: True ip: address: - 198.51.100.1/30 gateway4: 198.51.100.2 dns: - 198.51.100.200 state: up zone: external - name: Provider-B interface_name: enp1s0 type: ethernet autoconnect: True ip: address: - 192.0.2.1/30 route: - network: 0.0.0.0 prefix: 0 gateway: 192.0.2.2 table: 5000 state: up zone: external - name: Internal-Workstations interface_name: enp8s0 type: ethernet autoconnect: True ip: address: - 10.0.0.1/24 route: - network: 10.0.0.0 prefix: 24 table: 5000 routing_rule: - priority: 5 from: 10.0.0.0/24 table: 5000 state: up zone: trusted - name: Servers interface_name: enp9s0 type: ethernet autoconnect: True ip: address: - 203.0.113.1/24 state: up zone: trusted
Copy to Clipboard Copied! 验证 playbook 语法:
ansible-playbook --syntax-check ~/playbook.yml
$ ansible-playbook --syntax-check ~/playbook.yml
Copy to Clipboard Copied! 请注意,这个命令只验证语法,不能防止错误的、但有效的配置。
运行 playbook:
ansible-playbook ~/playbook.yml
$ ansible-playbook ~/playbook.yml
Copy to Clipboard Copied!
验证
在内部工作站子网的 RHEL 主机上:
安装
traceroute
软件包:dnf install traceroute
# dnf install traceroute
Copy to Clipboard Copied! 使用
traceroute
工具显示到互联网上主机的路由:traceroute redhat.com
# traceroute redhat.com traceroute to redhat.com (209.132.183.105), 30 hops max, 60 byte packets 1 _gateway (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 ...
Copy to Clipboard Copied! 命令的输出显示路由器通过
192.0.2.1
,即提供商 B 的网络来发送数据包。
在服务器子网的 RHEL 主机上:
安装
traceroute
软件包:dnf install traceroute
# dnf install traceroute
Copy to Clipboard Copied! 使用
traceroute
工具显示到互联网上主机的路由:traceroute redhat.com
# traceroute redhat.com traceroute to redhat.com (209.132.183.105), 30 hops max, 60 byte packets 1 _gateway (203.0.113.1) 2.179 ms 2.073 ms 1.944 ms 2 198.51.100.2 (198.51.100.2) 1.868 ms 1.798 ms 1.549 ms ...
Copy to Clipboard Copied! 命令的输出显示路由器通过
198.51.100.2
,即供应商 A 的网络来发送数据包。
在使用 RHEL 系统角色配置的 RHEL 路由器中:
显示规则列表:
ip rule list
# ip rule list 0: from all lookup local 5: from 10.0.0.0/24 lookup 5000 32766: from all lookup main 32767: from all lookup default
Copy to Clipboard Copied! 默认情况下,RHEL 包含表
local
、main
和default
的规则。显示表
5000
中的路由:ip route list table 5000
# ip route list table 5000 default via 192.0.2.2 dev enp1s0 proto static metric 100 10.0.0.0/24 dev enp8s0 proto static scope link src 192.0.2.1 metric 102
Copy to Clipboard Copied! 显示接口和防火墙区:
firewall-cmd --get-active-zones
# firewall-cmd --get-active-zones external interfaces: enp1s0 enp7s0 trusted interfaces: enp8s0 enp9s0
Copy to Clipboard Copied! 验证
external
区是否启用了伪装:firewall-cmd --info-zone=external
# firewall-cmd --info-zone=external external (active) target: default icmp-block-inversion: no interfaces: enp1s0 enp7s0 sources: services: ssh ports: protocols: masquerade: yes ...
Copy to Clipboard Copied!
第 15 章 使用 hostnamectl 更改主机名
您可以使用 hostnamectl
工具更新主机名。默认情况下,这个工具设置以下主机名类型:
-
静态主机名:存储在
/etc/hostname
文件中。通常,服务使用此名称作为主机名。 -
用户友善的主机名:一个描述性名称,如
数据中心 A 中的代理服务器
。 - 临时主机名:通常从网络配置接收的回退值。
流程
可选:显示当前主机名设置:
hostnamectl status --static
# hostnamectl status --static old-hostname.example.com
Copy to Clipboard Copied! 设置新主机名:
hostnamectl set-hostname new-hostname.example.com
# hostnamectl set-hostname new-hostname.example.com
Copy to Clipboard Copied! 这个命令将静态和临时主机名设置为新值。要只设置一个特定类型,请将
--static
、--pretty
或--transient
选项传给命令。hostnamectl
工具自动重启systemd-hostnamed
来激活新主机名。要使更改生效,请重启主机:reboot
# reboot
Copy to Clipboard Copied! 或者,如果您知道哪个服务使用主机名:
重启在服务启动时仅读取主机名的所有服务:
systemctl restart <service_name>
# systemctl restart <service_name>
Copy to Clipboard Copied! - 活跃的 shell 用户必须重新登录才能使更改生效。
验证
显示主机名:
hostnamectl status --static
# hostnamectl status --static new-hostname.example.com
Copy to Clipboard Copied!
第 16 章 配置 NetworkManager 连接的 DHCP 超时行为
DHCP 客户端在每次连接到网络时都从 DHCP 服务器请求动态 IP 地址和对应配置信息。
当您在连接配置文件中启用 DHCP 时,NetworkManager 默认等待 45 秒,以便此请求完成。
红帽支持 NetworkManager 内部 DHCP 客户端。
先决条件
- 在主机上配置了使用 DHCP 的连接。
流程
可选:设置
ipv4.dhcp-timeout
和ipv6.dhcp-timeout
属性。例如,要将这两个选项都设为30
秒,请输入:nmcli connection modify <connection_name> ipv4.dhcp-timeout 30 ipv6.dhcp-timeout 30
# nmcli connection modify <connection_name> ipv4.dhcp-timeout 30 ipv6.dhcp-timeout 30
Copy to Clipboard Copied! 另外,将参数设置为
infinity
以配置网络管理器(NetworkManager)不会停止尝试请求和续订 IP 地址,直到成功为止。可选:配置如果网络管理器(NetworkManager)在超时前没有接收 IPv4 地址时的行为:
nmcli connection modify <connection_name> ipv4.may-fail <value>
# nmcli connection modify <connection_name> ipv4.may-fail <value>
Copy to Clipboard Copied! 如果将
ipv4.may-fail
选项设为:yes
,连接的状态取决于 IPv6 配置:- 如果启用了 IPv6 配置并成功,NetworkManager 会激活 IPv6 连接,不再尝试激活 IPv4 连接。
- 如果禁用或未配置 IPv6 配置,连接会失败。
no
,连接会被停止。在这种情况下:-
如果启用了连接的
autoconnect
属性,NetworkManager 会根据autoconnect-retries
属性中设置的值尝试多次激活连接。默认值为4
。 - 如果连接仍然无法获得 DHCP 地址,则自动激活会失败。请注意,5 分钟后,自动连接过程会再次启动,从 DHCP 服务器获取 IP 地址。
-
如果启用了连接的
可选:配置如果网络管理器(NetworkManager)在超时前没有接收 IPv6 地址时的行为:
nmcli connection modify <connection_name> ipv6.may-fail <value>
# nmcli connection modify <connection_name> ipv6.may-fail <value>
Copy to Clipboard Copied!
第 17 章 配置 DNS 服务器顺序
大多数应用程序使用 glibc
库的 getaddrinfo
() 函数来解析 DNS 的名称。默认情况下,glibc
将所有 DNS 请求发送到 /etc/resolv.conf
文件中指定的第一个 DNS 服务器。如果这个服务器没有回复,{ProductShortName} 会尝试此文件中的所有其他名称服务器。NetworkManager 可让您影响 /etc/resolv.conf
中的 DNS 服务器顺序。
17.1. NetworkManager 如何在 /etc/resolv.conf 中对 DNS 服务器进行排序
NetworkManager 根据以下规则对 /etc/resolv.conf
文件中的 DNS 服务器进行排序:
- 如果只有一个连接配置集,NetworkManager 将使用那个连接中指定的 IPv4 和 IPv6 DNS 服务器顺序。
如果激活多个连接配置集,NetworkManager 会根据 DNS 优先级值对 DNS 服务器进行排序。如果您设置了 DNS 优先级,NetworkManager 的行为取决于
dns
参数中设置的值。您可以在/etc/NetworkManager/NetworkManager.conf
文件的[main]
部分中设置此参数:dns=default
或者如果dns
参数没有设置:NetworkManager 根据每个连接中的
ipv4.dns-priority
和ipv6.dns-priority
参数对不同连接中的 DNS 服务器进行排序。如果没有设置值,或者您将
ipv4.dns-priority
和ipv6.dns-priority
设为0
,则 NetworkManager 将使用全局默认值。dns=dnsmasq
或dns=systemd-resolved
:当您使用这些设置中的一个时,NetworkManager 将
dnsmasq
的127.0.0.1
或127.0.0.53
设为/etc/resolv.conf
文件中的nameserver
条目。dnsmasq
和systemd-resolved
服务将对 NetworkManager 连接中设置的搜索域的查询转发到该连接中指定的 DNS 服务器,并将对其他域的查询转发到具有默认路由的连接。当多个连接有相同的搜索域集时,dnsmasq
和systemd-resolved
将这个域的查询转发到在具有最低优先级值的连接中设置的 DNS 服务器。
NetworkManager 对连接使用以下默认值:
-
50
用于 VPN 连接 -
100
用于其他连接
您可以将全局默认值和特定于连接的 ipv4.dns-priority
和 ipv6.dns-priority
参数设为 -2147483647
和 2147483647
之间的值。
- 低的值具有更高的优先级。
- 负值具有一个特殊的效果,它会排除其他带有更大值的配置。例如,如果至少有一个连接具有负优先级值,NetworkManager 只使用在连接配置集中指定的具有最低优先级的 DNS 服务器。
如果多个连接具有相同的 DNS 优先级,NetworkManager 会按照以下顺序排列 DNS 的优先顺序:
- VPN 连接
- 带有活跃的默认路由的连接。活跃的默认路由是具有最低指标的默认路由。
17.2. 设置 NetworkManager 范围默认 DNS 服务器优先级值
NetworkManager 为连接使用以下 DNS 优先级默认值:
-
50
用于 VPN 连接 -
100
用于其他连接
您可以对 IPv4 和 IPv6 连接使用自定义的默认值覆盖这些系统范围的默认值。
流程
编辑
/etc/NetworkManager/NetworkManager.conf
文件:添加
[connection]
部分(如果其不存在):[connection]
[connection]
Copy to Clipboard Copied! 将自定义默认值添加到
[connection]
部分。例如,要将 IPv4 和 IPv6 的新默认值设为200
,请添加:ipv4.dns-priority=200 ipv6.dns-priority=200
ipv4.dns-priority=200 ipv6.dns-priority=200
Copy to Clipboard Copied! 您可以将参数设为
-2147483647
和2147483647
之间的值。请注意,将参数设置为0
将启用内置的默认值(对于 VPN 连接为50
,对于其他连接为100
)。
重新载入
NetworkManager
服务:systemctl reload NetworkManager
# systemctl reload NetworkManager
Copy to Clipboard Copied!
17.3. 设置网络管理器连接的 DNS 优先级
如果您需要 DNS 服务器的特定顺序,您可以在连接配置文件中设置优先级值。NetworkManager 使用这些值来在服务创建或更新 /etc/resolv.conf
文件时对服务器进行排序。
请注意,只有在您配置了多个与不同 DNS 服务器的连接时,设置 DNS 优先级才有意义。如果您只有一个与多个 DNS 服务器的连接,请在连接配置集中按首选顺序手动设置 DNS 服务器。
先决条件
- 系统配置了多个网络管理器连接。
-
系统在
/etc/NetworkManager/NetworkManager.conf
文件中未设置dns
参数,或者该参数被设为了default
。
流程
另外,还可显示可用的连接:
nmcli connection show
# nmcli connection show NAME UUID TYPE DEVICE Example_con_1 d17ee488-4665-4de2-b28a-48befab0cd43 ethernet enp1s0 Example_con_2 916e4f67-7145-3ffa-9f7b-e7cada8f6bf7 ethernet enp7s0 ...
Copy to Clipboard Copied! 设置
ipv4.dns-priority
和ipv6.dns-priority
参数。例如,要将这两个参数都设置为10
,请输入:nmcli connection modify <connection_name> ipv4.dns-priority 10 ipv6.dns-priority 10
# nmcli connection modify <connection_name> ipv4.dns-priority 10 ipv6.dns-priority 10
Copy to Clipboard Copied! - 另外,还可为其他连接重复前面的步骤。
重新激活您更新的连接:
nmcli connection up <connection_name>
# nmcli connection up <connection_name>
Copy to Clipboard Copied!
验证
显示
/etc/resolv.conf
文件的内容以验证 DNS 服务器的顺序是否正确:cat /etc/resolv.conf
# cat /etc/resolv.conf
Copy to Clipboard Copied!
17.4. 通过特定接口路由 DNS 流量
NetworkManager 支持在系统中配置 DNS 服务器的不同机制,其中包括将配置添加到 /etc/resolv.conf
文件并配置 DNS 服务,如 systemd-resolved
、dnsmasq
和 dnsconfd
。
连接配置文件中提到的每个 DNS 服务器都与特定网络接口关联。DNS 后端服务 systemd-resolved
和 dnsmasq
确保每个 DNS 名称服务器只能通过正确的网络接口访问。但是,其他后端服务不支持此功能。因此,NetworkManager 具有一个自动添加专用路由的功能,以便仅通过正确的接口访问每个名称服务器。您可以设置 ipv4.routed-dns
和 ipv6.routed-dns
属性来使用此功能。
示例情况:
连接配置文件 1: <example-connection-1>
-
默认网关:
192.0.2.254
-
DNS 服务器:
10.0.0.1
- 搜索域:example-domain.com
-
默认网关:
连接配置文件 2: <example-connection-2>
-
默认网关:
198.51.100.254
(此网关无法访问10.0.0.0/24
网络) -
DNS 服务器:203.0.113.
1
-
默认网关:
在本例中,您有两个连接配置集: <example-connection-1> 和 <example-connection-2> 通过 enp1s0
和 enp7s0
网络接口进行连接。如果 <example-connection-2> 首先连接了第二个配置集,则此连接的默认网关 198.51.100.254
具有较低指标,并且优先于第一个配置集。因此,RHEL 在连接到第一个配置集的 DNS 服务器时使用第二个连接的默认网关。因此,DNS 解析会失败。要解决这个问题,请为两个连接配置文件启用
ipv4.routed-dns
设置,以便 NetworkManager 通过正确的接口为 10.0.0.1
DNS 服务器创建一个专用路由,本例中为 enp1s0
。
先决条件
- 连接配置集已经存在。
流程
修改连接配置文件,以启用为名称服务器创建路由:
对于连接配置文件 1,请输入:
nmcli connection modify <example-connection-1> ipv4.routed-dns yes
# nmcli connection modify <example-connection-1> ipv4.routed-dns yes
Copy to Clipboard Copied! 对于连接配置文件 2,请输入:
nmcli connection modify <example-connection-2> ipv4.routed-dns yes
# nmcli connection modify <example-connection-2> ipv4.routed-dns yes
Copy to Clipboard Copied!
重新激活连接:
nmcli connection up <example-connection-1> nmcli connection up <example-connection-2>
# nmcli connection up <example-connection-1> # nmcli connection up <example-connection-2>
Copy to Clipboard Copied!
验证
显示要访问 IP 地址的路由:
ip route get 203.0.113.1
# ip route get 203.0.113.1 203.0.113.1 dev enp1s0 table 20053 src 10.0.0.1 uid 0
Copy to Clipboard Copied! 此命令验证名称服务器是否通过正确的接口访问,并使用策略路由方法将 DNS 服务器的所有路由放在特殊路由表
20053
中。
第 18 章 在 NetworkManager 中使用 dnsmasq
将特定域的 DNS 请求发送到所选 DNS 服务器
默认情况下,Red Hat Enterprise Linux (RHEL)将所有 DNS 请求发送到 /etc/resolv.conf
文件中指定的第一个 DNS 服务器。如果这个服务器没有回复,RHEL 会尝试此文件中的下一个服务器,直到找到一个正常工作的为止。在一个 DNS 服务器无法解析所有域的环境中,管理员可将 RHEL 配置为将特定域的 DNS 请求发送到所选 DNS 服务器。
例如,您要将服务器连接到虚拟专用网络(VPN),VPN 中的主机使用 example.com
域。在这种情况下,您可以以下方式配置 RHEL ,以处理 DNS 查询:
-
仅将
example.com
的 DNS 请求发送到 VPN 网络中的 DNS 服务器。 - 将所有其他请求发送到使用默认网关在连接配置文件中配置的 DNS 服务器。
您可以将 NetworkManager 配置为启动 dnsmasq
的实例。然后,此 DNS 缓存服务器侦听 loopback
设备上的端口 53
。因此,该服务只能从本地系统访问,而不可从网络访问。
使用这个配置,NetworkManager 将 nameserver 127.0.0.1
条目添加到 /etc/resolv.conf
文件中,dnsmasq
会动态将 DNS 请求路由 NetworkManager 连接配置文件中指定的相应的 DNS 服务器。
先决条件
- 系统配置了多个网络管理器连接。
在负责解析特定域的 NetworkManager 连接配置文件中配置了 DNS 服务器和搜索域。
例如,要确保 VPN 连接中指定的 DNS 服务器解析对
example.com
域的查询,VPN 连接配置文件必须包含以下设置:-
可以解析
example.com
的 DNS 服务器 -
在
ipv4.dns-search
和ipv6.dns-search
参数中设置为example.com
的搜索域
-
可以解析
-
dnsmasq
服务没有运行,或配置为在与localhost
不同的接口上侦听。
流程
安装
dnsmasq
软件包:dnf install dnsmasq
# dnf install dnsmasq
Copy to Clipboard Copied! 编辑
/etc/NetworkManager/NetworkManager.conf
文件,并在[main]
部分中设置以下条目:dns=dnsmasq
dns=dnsmasq
Copy to Clipboard Copied! 重新载入
NetworkManager
服务:systemctl reload NetworkManager
# systemctl reload NetworkManager
Copy to Clipboard Copied!
验证
在
NetworkManager
单元的systemd
日志中搜索服务使用不同的 DNS 服务器的域:journalctl -xeu NetworkManager
# journalctl -xeu NetworkManager ... Jun 02 13:30:17 <client_hostname>_ dnsmasq[5298]: using nameserver 198.51.100.7#53 for domain example.com ...
Copy to Clipboard Copied! 使用
tcpdump
数据包嗅探器来验证 DNS 请求的正确路由:安装
tcpdump
软件包:dnf install tcpdump
# dnf install tcpdump
Copy to Clipboard Copied! 在一个终端上,启动
tcpdump
以捕获所有接口上的 DNS 流量:tcpdump -i any port 53
# tcpdump -i any port 53
Copy to Clipboard Copied! 在另一个终端上,为存在异常的域解析主机名,为另一个域解析主机名,例如:
host -t A www.example.com host -t A www.redhat.com
# host -t A www.example.com # host -t A www.redhat.com
Copy to Clipboard Copied! 在
tcpdump
输出中验证 Red Hat Enterprise Linux 是否只向指定的 DNS 服务器并通过相应的接口发送对example.com
域的 DNS 查询:... 13:52:42.234533 tun0 Out IP server.43534 > 198.51.100.7.domain: 50121+ A? www.example.com. (33) ... 13:52:57.753235 enp1s0 Out IP server.40864 > 192.0.2.1.domain: 6906+ A? www.redhat.com. (33) ...
... 13:52:42.234533 tun0 Out IP server.43534 > 198.51.100.7.domain: 50121+ A? www.example.com. (33) ... 13:52:57.753235 enp1s0 Out IP server.40864 > 192.0.2.1.domain: 6906+ A? www.redhat.com. (33) ...
Copy to Clipboard Copied! Red Hat Enterprise Linux 将对
www.example.com
的 DNS 查询发送到198.51.100.7
上的 DNS 服务器,将对www.redhat.com
的查询发送到192.0.2.1
。
故障排除
验证
/etc/resolv.conf
文件中的nameserver
条目是否指向127.0.0.1
:cat /etc/resolv.conf nameserver 127.0.0.1
# cat /etc/resolv.conf nameserver 127.0.0.1
Copy to Clipboard Copied! 如果缺少条目,请检查
/etc/NetworkManager/NetworkManager.conf
文件中的dns
参数。验证
dnsmasq
服务是否侦听loopback
设备上的端口53
:ss -tulpn | grep "127.0.0.1:53"
# ss -tulpn | grep "127.0.0.1:53" udp UNCONN 0 0 127.0.0.1:53 0.0.0.0:* users:(("dnsmasq",pid=7340,fd=18)) tcp LISTEN 0 32 127.0.0.1:53 0.0.0.0:* users:(("dnsmasq",pid=7340,fd=19))
Copy to Clipboard Copied! 如果服务没有侦听
127.0.0.1:53
,请检查NetworkManager
单元的日志条目:journalctl -u NetworkManager
# journalctl -u NetworkManager
Copy to Clipboard Copied!
第 19 章 使用 802.1X 标准和存储在文件系统上的证书对 RHEL 客户端进行网络验证
管理员通常使用基于 IEEE 802.1X 标准的基于端口的网络访问控制(NAC)来保护网络不受未授权 LAN 和 Wi-Fi 客户端的影响。如果网络使用可扩展身份验证协议传输层安全(EAP-TLS)机制,则您需要证书来向这个网络验证客户端。
19.1. 使用 nmcli
在现有以太网连接上配置 802.1X 网络身份验证
您可以使用 nmcli
工具在命令行上配置带有 802.1X 网络身份验证的以太网连接。
先决条件
- 网络支持 802.1X 网络身份验证。
- 以太网连接配置集存在于 NetworkManager 中,且具有有效的 IP 配置。
客户端上存在 TLS 身份验证所需的以下文件:
-
存储的客户端密钥位于
/etc/pki/tls/private/client.key
文件中,该文件归root
用户所有,且只对 root 可读。 -
客户端证书存储在
/etc/pki/tls/certs/client.crt
文件中。 -
证书颁发机构(CA)证书存储在
/etc/pki/tls/certs/ca.crt
文件中。
-
存储的客户端密钥位于
-
wpa_supplicant
软件包已安装。
流程
将扩展验证协议(EAP)设置为
tls
,将路径设置为客户端证书和密钥文件:nmcli connection modify enp1s0 802-1x.eap tls 802-1x.client-cert /etc/pki/tls/certs/client.crt 802-1x.private-key /etc/pki/tls/certs/certs/client.key
# nmcli connection modify enp1s0 802-1x.eap tls 802-1x.client-cert /etc/pki/tls/certs/client.crt 802-1x.private-key /etc/pki/tls/certs/certs/client.key
Copy to Clipboard Copied! 请注意,您必须在一个命令中设置
802-1x.eap
、802-1x.client-cert
和802-1x.private-key
参数。设置 CA 证书的路径:
nmcli connection modify enp1s0 802-1x.ca-cert /etc/pki/tls/certs/ca.crt
# nmcli connection modify enp1s0 802-1x.ca-cert /etc/pki/tls/certs/ca.crt
Copy to Clipboard Copied! 设置证书中使用的用户的身份:
nmcli connection modify enp1s0 802-1x.identity user@example.com
# nmcli connection modify enp1s0 802-1x.identity user@example.com
Copy to Clipboard Copied! 可选:将密码存储在配置中:
nmcli connection modify enp1s0 802-1x.private-key-password password
# nmcli connection modify enp1s0 802-1x.private-key-password password
Copy to Clipboard Copied! 重要默认情况下,NetworkManager 将密码以明文形式存储在磁盘上的连接配置文件中,但该文件只对
root
用户可读。但是,在配置文件中清除文本密码会有安全隐患。要提高安全性,请将
802-1x.password-flags
参数设置为agent-owned
。使用这个设置,在具有 GNOME 桌面环境或运行nm-applet
的服务器上,NetworkManager 在解锁密钥环后从这些服务检索密码。在其他情况下,NetworkManager 会提示输入密码。激活连接配置集:
nmcli connection up enp1s0
# nmcli connection up enp1s0
Copy to Clipboard Copied!
验证
- 访问需要网络身份验证的网络上的资源。
19.2. 使用 nmstatectl
配置带有 802.1X 网络身份验证的静态以太网连接
使用 nmstatectl
工具,通过 Nmstate API 配置带有 802.1X 网络身份验证的以太网连接。Nmstate API 确保设置配置后结果与配置文件匹配。如果有任何失败,nmstatectl
会自动回滚更改以避免系统处于不正确的状态。
nmstate
库只支持 TLS
可扩展身份验证协议(EAP)方法。
先决条件
- 网络支持 802.1X 网络身份验证。
- 受管节点使用 NetworkManager。
客户端上存在 TLS 身份验证所需的以下文件:
-
存储的客户端密钥位于
/etc/pki/tls/private/client.key
文件中,该文件归root
用户所有,且只对 root 可读。 -
客户端证书存储在
/etc/pki/tls/certs/client.crt
文件中。 -
证书颁发机构(CA)证书存储在
/etc/pki/tls/certs/ca.crt
文件中。
-
存储的客户端密钥位于
流程
创建包含以下内容的 YAML 文件,如
~/create-ethernet-profile.yml
:--- interfaces: - name: enp1s0 type: ethernet state: up ipv4: enabled: true address: - ip: 192.0.2.1 prefix-length: 24 dhcp: false ipv6: enabled: true address: - ip: 2001:db8:1::1 prefix-length: 64 autoconf: false dhcp: false 802.1x: ca-cert: /etc/pki/tls/certs/ca.crt client-cert: /etc/pki/tls/certs/client.crt eap-methods: - tls identity: client.example.org private-key: /etc/pki/tls/private/client.key private-key-password: password routes: config: - destination: 0.0.0.0/0 next-hop-address: 192.0.2.254 next-hop-interface: enp1s0 - destination: ::/0 next-hop-address: 2001:db8:1::fffe next-hop-interface: enp1s0 dns-resolver: config: search: - example.com server: - 192.0.2.200 - 2001:db8:1::ffbb
--- interfaces: - name: enp1s0 type: ethernet state: up ipv4: enabled: true address: - ip: 192.0.2.1 prefix-length: 24 dhcp: false ipv6: enabled: true address: - ip: 2001:db8:1::1 prefix-length: 64 autoconf: false dhcp: false 802.1x: ca-cert: /etc/pki/tls/certs/ca.crt client-cert: /etc/pki/tls/certs/client.crt eap-methods: - tls identity: client.example.org private-key: /etc/pki/tls/private/client.key private-key-password: password routes: config: - destination: 0.0.0.0/0 next-hop-address: 192.0.2.254 next-hop-interface: enp1s0 - destination: ::/0 next-hop-address: 2001:db8:1::fffe next-hop-interface: enp1s0 dns-resolver: config: search: - example.com server: - 192.0.2.200 - 2001:db8:1::ffbb
Copy to Clipboard Copied! 这些设置使用以下设置为
enp1s0
设备定义一个以太网连接配置文件:-
静态 IPv4 地址 -
192.0.2.1
和/24
子网掩码 -
静态 IPv6 地址 -
2001:db8:1::1
和/64
子网掩码 -
IPv4 默认网关 -
192.0.2.254
-
IPv6 默认网关 -
2001:db8:1::fffe
-
IPv4 DNS 服务器 -
192.0.2.200
-
IPv6 DNS 服务器 -
2001:db8:1::ffbb
-
DNS 搜索域 -
example.com
-
使用
TLS
EAP 协议的 802.1x 网络身份验证
-
静态 IPv4 地址 -
将设置应用到系统:
nmstatectl apply ~/create-ethernet-profile.yml
# nmstatectl apply ~/create-ethernet-profile.yml
Copy to Clipboard Copied!
验证
- 访问需要网络身份验证的网络上的资源。
19.3. 使用 network
RHEL 系统角色使用 802.1X 网络身份验证配置静态以太网连接
网络访问控制(NAC)保护网络免受未授权客户端访问。您可以在 NetworkManager 连接配置文件中指定身份验证所需的详情,以使客户端可以访问网络。通过使用 Ansible 和 network
RHEL 系统角色,您可以自动化此过程,并在 playbook 中定义的主机上远程配置连接配置文件。
您可以使用 Ansible playbook 将私钥、证书和 CA 证书复制到客户端,然后使用 network
RHEL 系统角色配置具有 802.1X 网络身份验证的连接配置文件。
先决条件
- 您已准备好控制节点和受管节点
- 以可在受管主机上运行 playbook 的用户登录到控制节点。
-
您用于连接到受管节点的帐户对它们具有
sudo
权限。 - 网络支持 802.1X 网络身份验证。
- 受管节点使用 NetworkManager。
以下 TLS 身份验证所需的文件在控制节点上存在:
-
客户端密钥存储在
/srv/data/client.key
文件中。 -
客户端证书存储在
/srv/data/client.crt
文件中。 -
证书颁发机构(CA)证书存储在
/srv/data/ca.crt
文件中。
-
客户端密钥存储在
流程
将敏感变量存储在加密的文件中:
创建 vault :
ansible-vault create ~/vault.yml
$ ansible-vault create ~/vault.yml New Vault password: <vault_password> Confirm New Vault password: <vault_password>
Copy to Clipboard Copied! 在
ansible-vault create
命令打开编辑器后,以<key>: <value>
格式输入敏感数据:pwd: <password>
pwd: <password>
Copy to Clipboard Copied! - 保存更改,并关闭编辑器。Ansible 加密 vault 中的数据。
创建一个包含以下内容的 playbook 文件,如
~/playbook.yml
:--- - name: Configure an Ethernet connection with 802.1X authentication hosts: managed-node-01.example.com vars_files: - ~/vault.yml tasks: - name: Copy client key for 802.1X authentication ansible.builtin.copy: src: "/srv/data/client.key" dest: "/etc/pki/tls/private/client.key" mode: 0600 - name: Copy client certificate for 802.1X authentication ansible.builtin.copy: src: "/srv/data/client.crt" dest: "/etc/pki/tls/certs/client.crt" - name: Copy CA certificate for 802.1X authentication ansible.builtin.copy: src: "/srv/data/ca.crt" dest: "/etc/pki/ca-trust/source/anchors/ca.crt" - name: Ethernet connection profile with static IP address settings and 802.1X ansible.builtin.include_role: name: redhat.rhel_system_roles.network vars: network_connections: - name: enp1s0 type: ethernet autoconnect: yes ip: address: - 192.0.2.1/24 - 2001:db8:1::1/64 gateway4: 192.0.2.254 gateway6: 2001:db8:1::fffe dns: - 192.0.2.200 - 2001:db8:1::ffbb dns_search: - example.com ieee802_1x: identity: <user_name> eap: tls private_key: "/etc/pki/tls/private/client.key" private_key_password: "{{ pwd }}" client_cert: "/etc/pki/tls/certs/client.crt" ca_cert: "/etc/pki/ca-trust/source/anchors/ca.crt" domain_suffix_match: example.com state: up
--- - name: Configure an Ethernet connection with 802.1X authentication hosts: managed-node-01.example.com vars_files: - ~/vault.yml tasks: - name: Copy client key for 802.1X authentication ansible.builtin.copy: src: "/srv/data/client.key" dest: "/etc/pki/tls/private/client.key" mode: 0600 - name: Copy client certificate for 802.1X authentication ansible.builtin.copy: src: "/srv/data/client.crt" dest: "/etc/pki/tls/certs/client.crt" - name: Copy CA certificate for 802.1X authentication ansible.builtin.copy: src: "/srv/data/ca.crt" dest: "/etc/pki/ca-trust/source/anchors/ca.crt" - name: Ethernet connection profile with static IP address settings and 802.1X ansible.builtin.include_role: name: redhat.rhel_system_roles.network vars: network_connections: - name: enp1s0 type: ethernet autoconnect: yes ip: address: - 192.0.2.1/24 - 2001:db8:1::1/64 gateway4: 192.0.2.254 gateway6: 2001:db8:1::fffe dns: - 192.0.2.200 - 2001:db8:1::ffbb dns_search: - example.com ieee802_1x: identity: <user_name> eap: tls private_key: "/etc/pki/tls/private/client.key" private_key_password: "{{ pwd }}" client_cert: "/etc/pki/tls/certs/client.crt" ca_cert: "/etc/pki/ca-trust/source/anchors/ca.crt" domain_suffix_match: example.com state: up
Copy to Clipboard Copied! 示例 playbook 中指定的设置包括如下:
ieee802_1x
- 此变量包含与 802.1X 相关的设置。
eap: tls
-
将配置文件配置为对可扩展身份验证协议(EAP)使用基于证书的
TLS
身份验证方法。
有关 playbook 中使用的所有变量的详情,请查看控制节点上的
/usr/share/ansible/roles/rhel-system-roles.network/README.md
文件。验证 playbook 语法:
ansible-playbook --ask-vault-pass --syntax-check ~/playbook.yml
$ ansible-playbook --ask-vault-pass --syntax-check ~/playbook.yml
Copy to Clipboard Copied! 请注意,这个命令只验证语法,不能防止错误的、但有效的配置。
运行 playbook:
ansible-playbook --ask-vault-pass ~/playbook.yml
$ ansible-playbook --ask-vault-pass ~/playbook.yml
Copy to Clipboard Copied!
验证
- 访问需要网络身份验证的网络上的资源。
19.4. 使用 network
RHEL 系统角色配置带有 802.1X 网络身份验证的 wifi 连接
网络访问控制(NAC)保护网络不受未授权客户端的访问。您可以在 NetworkManager 连接配置文件中指定身份验证所需的详情,以使客户端可以访问网络。通过使用 Ansible 和 network
RHEL 系统角色,您可以自动化此过程,并在 playbook 中定义的主机上远程配置连接配置文件。
您可以使用 Ansible playbook 将私钥、证书和 CA 证书复制到客户端,然后使用 network
RHEL 系统角色配置具有 802.1X 网络身份验证的连接配置文件。
先决条件
- 您已准备好控制节点和受管节点
- 以可在受管主机上运行 playbook 的用户登录到控制节点。
-
您用于连接到受管节点的帐户对它们具有
sudo
权限。 - 网络支持 802.1X 网络身份验证。
-
您已在受管节点上安装了
wpa_supplicant
软件包。 - DHCP 位于受管节点的网络中。
control 节点上存在 TLS 身份验证所需的以下文件:
-
客户端密钥存储在
/srv/data/client.key
文件中。 -
客户端证书存储在
/srv/data/client.crt
文件中。 -
CA 证书存储在
/srv/data/ca.crt
文件中。
-
客户端密钥存储在
流程
将敏感变量存储在加密的文件中:
创建 vault :
ansible-vault create ~/vault.yml
$ ansible-vault create ~/vault.yml New Vault password: <vault_password> Confirm New Vault password: <vault_password>
Copy to Clipboard Copied! 在
ansible-vault create
命令打开编辑器后,以<key>: <value>
格式输入敏感数据:pwd: <password>
pwd: <password>
Copy to Clipboard Copied! - 保存更改,并关闭编辑器。Ansible 加密 vault 中的数据。
创建一个包含以下内容的 playbook 文件,如
~/playbook.yml
:--- - name: Configure a wifi connection with 802.1X authentication hosts: managed-node-01.example.com vars_files: - ~/vault.yml tasks: - name: Copy client key for 802.1X authentication ansible.builtin.copy: src: "/srv/data/client.key" dest: "/etc/pki/tls/private/client.key" mode: 0400 - name: Copy client certificate for 802.1X authentication ansible.builtin.copy: src: "/srv/data/client.crt" dest: "/etc/pki/tls/certs/client.crt" - name: Copy CA certificate for 802.1X authentication ansible.builtin.copy: src: "/srv/data/ca.crt" dest: "/etc/pki/ca-trust/source/anchors/ca.crt" - name: Wifi connection profile with dynamic IP address settings and 802.1X ansible.builtin.import_role: name: redhat.rhel_system_roles.network vars: network_connections: - name: Wifi connection profile with dynamic IP address settings and 802.1X interface_name: wlp1s0 state: up type: wireless autoconnect: yes ip: dhcp4: true auto6: true wireless: ssid: "Example-wifi" key_mgmt: "wpa-eap" ieee802_1x: identity: <user_name> eap: tls private_key: "/etc/pki/tls/private/client.key" private_key_password: "{{ pwd }}" private_key_password_flags: none client_cert: "/etc/pki/tls/certs/client.crt" ca_cert: "/etc/pki/ca-trust/source/anchors/ca.crt" domain_suffix_match: "example.com" network_allow_restart: true
--- - name: Configure a wifi connection with 802.1X authentication hosts: managed-node-01.example.com vars_files: - ~/vault.yml tasks: - name: Copy client key for 802.1X authentication ansible.builtin.copy: src: "/srv/data/client.key" dest: "/etc/pki/tls/private/client.key" mode: 0400 - name: Copy client certificate for 802.1X authentication ansible.builtin.copy: src: "/srv/data/client.crt" dest: "/etc/pki/tls/certs/client.crt" - name: Copy CA certificate for 802.1X authentication ansible.builtin.copy: src: "/srv/data/ca.crt" dest: "/etc/pki/ca-trust/source/anchors/ca.crt" - name: Wifi connection profile with dynamic IP address settings and 802.1X ansible.builtin.import_role: name: redhat.rhel_system_roles.network vars: network_connections: - name: Wifi connection profile with dynamic IP address settings and 802.1X interface_name: wlp1s0 state: up type: wireless autoconnect: yes ip: dhcp4: true auto6: true wireless: ssid: "Example-wifi" key_mgmt: "wpa-eap" ieee802_1x: identity: <user_name> eap: tls private_key: "/etc/pki/tls/private/client.key" private_key_password: "{{ pwd }}" private_key_password_flags: none client_cert: "/etc/pki/tls/certs/client.crt" ca_cert: "/etc/pki/ca-trust/source/anchors/ca.crt" domain_suffix_match: "example.com" network_allow_restart: true
Copy to Clipboard Copied! 示例 playbook 中指定的设置包括如下:
ieee802_1x
- 此变量包含与 802.1X 相关的设置。
eap: tls
-
将配置文件配置为对可扩展身份验证协议(EAP)使用基于证书的
TLS
身份验证方法。
有关 playbook 中使用的所有变量的详情,请查看控制节点上的
/usr/share/ansible/roles/rhel-system-roles.network/README.md
文件。验证 playbook 语法:
ansible-playbook --ask-vault-pass --syntax-check ~/playbook.yml
$ ansible-playbook --ask-vault-pass --syntax-check ~/playbook.yml
Copy to Clipboard Copied! 请注意,这个命令只验证语法,不能防止错误的、但有效的配置。
运行 playbook:
ansible-playbook --ask-vault-pass ~/playbook.yml
$ ansible-playbook --ask-vault-pass ~/playbook.yml
Copy to Clipboard Copied!
第 20 章 使用带有 FreeRADIUS 后端的 hostapd
为 LAN 客户端设置 802.1x 网络身份验证服务
IEEE 802.1X 标准定义了安全身份验证和授权方法,以保护网络不接受未授权的客户端。通过使用 hostapd
服务和 FreeRADIUS,您可以在您的网络中提供网络访问控制(NAC)。
红帽只支持带有 Red Hat Identity Management (IdM)的 FreeRADIUS 作为身份验证的后端源。
在本文档中,RHEL 主机充当一个网桥,以使用现有的网络连接不同的客户端。但是,RHEL 主机只授权认证的客户端可以访问网络。

20.1. 先决条件
全新安装
freeradius
和freeradius-ldap
软件包。如果软件包已安装,请删除
/etc/raddb/
目录,卸载,然后再次安装软件包。不要使用dnf reinstall
命令重新安装软件包,因为/etc/raddb/
目录中的权限和符号链接是不同的。- 配置 FreeRADIUS 的主机是 IdM 域 中的客户端。
20.2. 在验证器中设置网桥
网桥是一个链路层设备,它根据 MAC 地址表在主机和网络之间转发流量。如果将 RHEL 设置为 802.1X 验证器,请将要在其上执行身份验证的接口和 LAN 接口添加到网桥。
前提条件
- 服务器有多个以太网接口。
流程
如果网桥接口不存在,请创建它:
nmcli connection add type bridge con-name br0 ifname br0
# nmcli connection add type bridge con-name br0 ifname br0
Copy to Clipboard Copied! 将太网接口分配给网桥:
nmcli connection add type ethernet port-type bridge con-name br0-port1 ifname enp1s0 controller br0 nmcli connection add type ethernet port-type bridge con-name br0-port2 ifname enp7s0 controller br0 nmcli connection add type ethernet port-type bridge con-name br0-port3 ifname enp8s0 controller br0 nmcli connection add type ethernet port-type bridge con-name br0-port4 ifname enp9s0 controller br0
# nmcli connection add type ethernet port-type bridge con-name br0-port1 ifname enp1s0 controller br0 # nmcli connection add type ethernet port-type bridge con-name br0-port2 ifname enp7s0 controller br0 # nmcli connection add type ethernet port-type bridge con-name br0-port3 ifname enp8s0 controller br0 # nmcli connection add type ethernet port-type bridge con-name br0-port4 ifname enp9s0 controller br0
Copy to Clipboard Copied! 启用网桥以转发 LAN(EAPOL)数据包上的可扩展验证协议:
nmcli connection modify br0 group-forward-mask 8
# nmcli connection modify br0 group-forward-mask 8
Copy to Clipboard Copied! 在网桥设备上禁用生成树协议(STP):
*nmcli connection modify br0 stp off"
# *nmcli connection modify br0 stp off"
Copy to Clipboard Copied! 配置连接以自动激活端口:
nmcli connection modify br0 connection.autoconnect-ports 1
# nmcli connection modify br0 connection.autoconnect-ports 1
Copy to Clipboard Copied! 激活连接:
nmcli connection up br0
# nmcli connection up br0
Copy to Clipboard Copied!
验证
显示作为特定网桥端口的以太网设备的链接状态:
ip link show master br0
# ip link show master br0 3: enp1s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel master br0 state UP mode DEFAULT group default qlen 1000 link/ether 52:54:00:62:61:0e brd ff:ff:ff:ff:ff:ff ...
Copy to Clipboard Copied! 验证
br0
设备上是否启用了 EAPOL 数据包的转发:cat /sys/class/net/br0/bridge/group_fwd_mask 0x8
# cat /sys/class/net/br0/bridge/group_fwd_mask 0x8
Copy to Clipboard Copied! 如果命令返回
0x8
,则启用了转发。
20.3. 配置 FreeRADIUS ,以使用 EAP 安全地验证网络客户端
FreeRADIUS 支持通过不同的扩展验证协议(EAP)的方法。但是,对于受支持的安全场景,请使用 EAP-TTLS (隧道传输层安全)。
使用 EAP-TTLS ,客户端使用安全 TLS 连接作为外部身份验证协议来设置隧道。然后,内部身份验证使用 LDAP 向身份管理进行身份验证。要使用 EAP-TTLS,您需要一个 TLS 服务器证书。
默认的 FreeRADIUS 配置文件充当文档,并描述了所有参数和指令。如果要禁用某些特性,请注释掉它们,而不是删除配置文件中的相应部分。这可让您保留配置文件和包含的文档的结构。
先决条件
-
您已安装了
freeradius
和freeradius-ldap
软件包。 -
/etc/raddb/
目录中的配置文件保持不变,并由freeradius
软件包提供。 - 主机已在 Red Hat Identity Management (IdM)域中注册。
流程
创建一个私钥并从 IdM 请求一个证书:
ipa-getcert request -w -k /etc/pki/tls/private/radius.key -f /etc/pki/tls/certs/radius.pem -o "root:radiusd" -m 640 -O "root:radiusd" -M 640 -T caIPAserviceCert -C 'systemctl restart radiusd.service' -N freeradius.idm.example.com -D freeradius.idm.example.com -K radius/freeradius.idm.example.com
# ipa-getcert request -w -k /etc/pki/tls/private/radius.key -f /etc/pki/tls/certs/radius.pem -o "root:radiusd" -m 640 -O "root:radiusd" -M 640 -T caIPAserviceCert -C 'systemctl restart radiusd.service' -N freeradius.idm.example.com -D freeradius.idm.example.com -K radius/freeradius.idm.example.com
Copy to Clipboard Copied! certmonger
服务将私钥存储在/etc/pki/tls/private/radius.key
文件中,将证书存储在/etc/pki/tls/certs/radius.pem
文件中,并设置安全权限。另外,certmonger
将监控证书,在证书过期前续订证书,并在证书续订后重启radiusd
服务。验证 CA 是否已成功发布证书:
ipa-getcert list -f /etc/pki/tls/certs/radius.pem
# ipa-getcert list -f /etc/pki/tls/certs/radius.pem ... Number of certificates and requests being tracked: 1. Request ID '20240918142211': status: MONITORING stuck: no key pair storage: type=FILE,location='/etc/pki/tls/private/radius.key' certificate: type=FILE,location='/etc/pki/tls/certs/radius.crt' ...
Copy to Clipboard Copied! 使用 Diffie-Hellman (DH)参数创建
/etc/raddb/certs/dh
文件。例如,要创建带有 2048 位素数的 DH 文件,请输入:openssl dhparam -out /etc/raddb/certs/dh 2048
# openssl dhparam -out /etc/raddb/certs/dh 2048
Copy to Clipboard Copied! 为了安全起见,请不要使用小于 2048 位素数的 DH 文件。根据位数,文件的创建可能需要几分钟。
编辑
/etc/raddb/mods-available/eap
文件:在
tls-config tls-common
指令中配置与 TLS 相关的设置:eap { ... tls-config tls-common { ... private_key_file = /etc/pki/tls/private/radius.key certificate_file = /etc/pki/tls/certs/radius.pem ca_file = /etc/ipa/ca.crt ... } }
eap { ... tls-config tls-common { ... private_key_file = /etc/pki/tls/private/radius.key certificate_file = /etc/pki/tls/certs/radius.pem ca_file = /etc/ipa/ca.crt ... } }
Copy to Clipboard Copied! 将
eap
指令中的default_eap_type
参数设为ttls
:eap { ... default_eap_type = ttls ... }
eap { ... default_eap_type = ttls ... }
Copy to Clipboard Copied! 注释掉
md5
指令,以禁用不安全的 EAP-MD5 身份验证方法:eap { ... # md5 { # } ... }
eap { ... # md5 { # } ... }
Copy to Clipboard Copied! 请注意,在默认的配置文件中,其他不安全的 EAP 身份验证方法默认被注释掉了。
编辑
/etc/raddb/sites-available/default
文件,然后注释掉eap
以外的所有身份验证方法:authenticate { ... # Auth-Type PAP { # pap # } # Auth-Type CHAP { # chap # } # Auth-Type MS-CHAP { # mschap # } # mschap # digest ... }
authenticate { ... # Auth-Type PAP { # pap # } # Auth-Type CHAP { # chap # } # Auth-Type MS-CHAP { # mschap # } # mschap # digest ... }
Copy to Clipboard Copied! 这将只对外部身份验证启用了 EAP,并禁用了纯文本身份验证方法。
编辑
/etc/raddb/sites-available/inner-tunnel
文件,并进行以下更改:注释掉
-ldap
条目,并将ldap
模块配置添加到authorize
指令中:authorize { ... #-ldap ldap if ((ok || updated) && User-Password) { update { control:Auth-Type := ldap } } ... }
authorize { ... #-ldap ldap if ((ok || updated) && User-Password) { update { control:Auth-Type := ldap } } ... }
Copy to Clipboard Copied! 在
authenticate
指令中取消 LDAP 身份验证类型的注释:authenticate { Auth-Type LDAP { ldap } }
authenticate { Auth-Type LDAP { ldap } }
Copy to Clipboard Copied!
启用
ldap
模块:ln -s /etc/raddb/mods-available/ldap /etc/raddb/mods-enabled/ldap
# ln -s /etc/raddb/mods-available/ldap /etc/raddb/mods-enabled/ldap
Copy to Clipboard Copied! 编辑
/etc/raddb/mods-available/ldap
文件,并进行以下更改:在
ldap
指令中,设置 IdM LDAP 服务器 URL 和基本可分辨名称(DN):ldap { ... server = 'ldaps://idm_server.idm.example.com' base_dn = 'cn=users,cn=accounts,dc=idm,dc=example,dc=com' ... }
ldap { ... server = 'ldaps://idm_server.idm.example.com' base_dn = 'cn=users,cn=accounts,dc=idm,dc=example,dc=com' ... }
Copy to Clipboard Copied! 在服务器 URL 中指定
ldaps
协议,以便在 FreeRADIUS 主机和 IdM 服务器之间使用 TLS 加密的连接。在
ldap
指令中,启用 IdM LDAP 服务器的 TLS 证书验证:tls { ... require_cert = 'demand' ... }
tls { ... require_cert = 'demand' ... }
Copy to Clipboard Copied!
编辑
/etc/raddb/clients.conf
文件:在
localhost
和localhost_ipv6
客户端指令中设置安全密码:client localhost { ipaddr = 127.0.0.1 ... secret = localhost_client_password ... } client localhost_ipv6 { ipv6addr = ::1 secret = localhost_client_password }
client localhost { ipaddr = 127.0.0.1 ... secret = localhost_client_password ... } client localhost_ipv6 { ipv6addr = ::1 secret = localhost_client_password }
Copy to Clipboard Copied! 为网络验证器添加客户端指令:
client hostapd.example.org { ipaddr = 192.0.2.2/32 secret = hostapd_client_password }
client hostapd.example.org { ipaddr = 192.0.2.2/32 secret = hostapd_client_password }
Copy to Clipboard Copied! 可选:如果其他主机也能够访问 FreeRADIUS 服务,也为它们添加客户端指令,例如:
client <hostname_or_description> { ipaddr = <IP_address_or_range> secret = <client_password> }
client <hostname_or_description> { ipaddr = <IP_address_or_range> secret = <client_password> }
Copy to Clipboard Copied! ipaddr
参数接受 IPv4 和 IPv6 地址,您可以使用可选的无类别域间路由(CIDR)表示法来指定范围。但是,在这个参数中您只能设置一个值。例如,要授予对 IPv4 和 IPv6 地址的访问,您必须添加两个客户端指令。为客户端指令使用一个描述性名称,如主机名或一个描述 IP 范围在哪里使用的词语。
验证配置文件:
radiusd -XC
# radiusd -XC ... Configuration appears to be OK
Copy to Clipboard Copied! 在
firewalld
服务中打开 RADIUS 端口:firewall-cmd --permanent --add-service=radius firewall-cmd --reload
# firewall-cmd --permanent --add-service=radius # firewall-cmd --reload
Copy to Clipboard Copied! 启用并启动
radiusd
服务:systemctl enable --now radiusd
# systemctl enable --now radiusd
Copy to Clipboard Copied!
故障排除
如果
radiusd
服务无法启动,请验证您是否可以解析 IdM 服务器主机名:host -v idm_server.idm.example.com
# host -v idm_server.idm.example.com
Copy to Clipboard Copied! 对于其他问题,请在 debug 模式下运行
radiusd
:停止
radiusd
服务:systemctl stop radiusd
# systemctl stop radiusd
Copy to Clipboard Copied! 以 debug 模式启动该服务:
radiusd -X
# radiusd -X ... Ready to process requests
Copy to Clipboard Copied! -
在 FreeRADIUS 主机上执行验证测试,如
验证
部分中所述。
后续步骤
- 禁用不再需要的身份验证方法,以及您不使用的其他功能。
20.4. 在有线网络中将 hostapd
配置为验证器
主机访问点守护进程(hostapd
)服务可在有线网络中充当验证器,来提供 802.1X 身份验证。为此,hostapd
服务需要一个用来验证客户端的 RADIUS 服务器。
hostapd
服务提供集成的 RADIUS 服务器。但是,使用集成的 RADIUS 服务器只用于测试目的。对于生产环境,请使用 FreeRADIUS 服务器,它支持其他特性,如不同的身份验证方法和访问控制。
hostapd
服务不与流量平面交互。该服务仅充当身份验证器。例如,使用脚本或服务,该脚本或服务使用 hostapd
控制接口、根据身份验证事件的结果来允许或拒绝流量。
先决条件
-
hostapd
软件包已安装。 - FreeRADIUS 服务器已配置,它已准备好对客户端进行身份验证。
流程
使用以下内容创建
/etc/hostapd/hostapd.conf
文件:General settings of hostapd =========================== Control interface settings Enable logging for all modules Log level Wired 802.1X authentication =========================== Driver interface type Enable IEEE 802.1X authorization Use port access entry (PAE) group address (01:80:c2:00:00:03) when sending EAPOL frames Network interface for authentication requests RADIUS client configuration =========================== Local IP address used as NAS-IP-Address Unique NAS-Identifier within scope of RADIUS server RADIUS authentication server RADIUS accounting server
# General settings of hostapd # =========================== # Control interface settings ctrl_interface=/var/run/hostapd ctrl_interface_group=wheel # Enable logging for all modules logger_syslog=-1 logger_stdout=-1 # Log level logger_syslog_level=2 logger_stdout_level=2 # Wired 802.1X authentication # =========================== # Driver interface type driver=wired # Enable IEEE 802.1X authorization ieee8021x=1 # Use port access entry (PAE) group address # (01:80:c2:00:00:03) when sending EAPOL frames use_pae_group_addr=1 # Network interface for authentication requests interface=br0 # RADIUS client configuration # =========================== # Local IP address used as NAS-IP-Address own_ip_addr=192.0.2.2 # Unique NAS-Identifier within scope of RADIUS server nas_identifier=hostapd.example.org # RADIUS authentication server auth_server_addr=192.0.2.1 auth_server_port=1812 auth_server_shared_secret=hostapd_client_password # RADIUS accounting server acct_server_addr=192.0.2.1 acct_server_port=1813 acct_server_shared_secret=hostapd_client_password
Copy to Clipboard Copied! 有关此配置中使用的参数的详情,请查看
/usr/share/doc/hostapd/hostapd/hostapd.conf
示例配置文件中的描述。启用并启动
hostapd
服务:systemctl enable --now hostapd
# systemctl enable --now hostapd
Copy to Clipboard Copied!
故障排除
如果
hostapd
服务无法启动,请验证您在/etc/hostapd/hostapd.conf
文件中使用的网桥接口是否在系统上存在:ip link show br0
# ip link show br0
Copy to Clipboard Copied! 对于其他问题,请在 debug 模式下运行
hostapd
:停止
hostapd
服务:systemctl stop hostapd
# systemctl stop hostapd
Copy to Clipboard Copied! 以 debug 模式启动该服务:
hostapd -d /etc/hostapd/hostapd.conf
# hostapd -d /etc/hostapd/hostapd.conf
Copy to Clipboard Copied! -
在 FreeRADIUS 主机上执行验证测试,如
验证
部分中所述。
20.5. 针对 FreeRADIUS 服务器或验证器测试 EAP-TTLS 身份验证
要测试在隧道传输层安全(EAP-TTLS)上使用可扩展身份验证协议(EAP-TTLS)的身份验证是否按预期工作,请运行此流程:
- 设置 FreeRADIUS 服务器后
-
将
hostapd
服务设为 802.1X 网络身份验证验证器后。
此流程中使用的测试工具的输出提供有关 EAP 通信的其他信息,并帮助您调试问题。
先决条件
当您要验证:
FreeRADIUS 服务器:
-
hostapd
软件包提供的eapol_test
工具已安装。 - 您在其上运行此流程的客户端已在 FreeRADIUS 服务器的客户端数据库中被授权。
-
-
由同命软件包提供的验证器
wpa_supplicant
工具已安装。
-
您在
/etc/ipa/ca.cert
文件中存储了证书颁发机构(CA)证书。
流程
可选:在 Identity Management (IdM)中创建用户:
ipa user-add --first "Test" --last "User" idm_user --password
# ipa user-add --first "Test" --last "User" idm_user --password
Copy to Clipboard Copied! 使用以下内容创建
/etc/wpa_supplicant/wpa_supplicant-TTLS.conf
文件:ap_scan=0 network={ eap=TTLS eapol_flags=0 key_mgmt=IEEE8021X # Anonymous identity (sent in unencrypted phase 1) # Can be any string anonymous_identity="anonymous" # Inner authentication (sent in TLS-encrypted phase 2) phase2="auth=PAP" identity="idm_user" password="idm_user_password" # CA certificate to validate the RADIUS server's identity ca_cert="/etc/ipa/ca.crt" }
ap_scan=0 network={ eap=TTLS eapol_flags=0 key_mgmt=IEEE8021X # Anonymous identity (sent in unencrypted phase 1) # Can be any string anonymous_identity="anonymous" # Inner authentication (sent in TLS-encrypted phase 2) phase2="auth=PAP" identity="idm_user" password="idm_user_password" # CA certificate to validate the RADIUS server's identity ca_cert="/etc/ipa/ca.crt" }
Copy to Clipboard Copied! 要向以下进行身份验证:
FreeRADIUS 服务器,请输入:
eapol_test -c /etc/wpa_supplicant/wpa_supplicant-TTLS.conf -a 192.0.2.1 -s <client_password>
# eapol_test -c /etc/wpa_supplicant/wpa_supplicant-TTLS.conf -a 192.0.2.1 -s <client_password> ... EAP: Status notification: remote certificate verification (param=success) ... CTRL-EVENT-EAP-SUCCESS EAP authentication completed successfully ... SUCCESS
Copy to Clipboard Copied! -a
选项定义了 FreeRADIUS 服务器的 IP 地址,而-s
选项指定您要在其上运行 FreeRADIUS 服务器的客户端配置中命令的主机的密码。验证器,请输入:
wpa_supplicant -c /etc/wpa_supplicant/wpa_supplicant-TTLS.conf -D wired -i enp0s31f6
# wpa_supplicant -c /etc/wpa_supplicant/wpa_supplicant-TTLS.conf -D wired -i enp0s31f6 ... enp0s31f6: CTRL-EVENT-EAP-SUCCESS EAP authentication completed successfully ...
Copy to Clipboard Copied! -i
选项指定wpa_supplicant
通过 LAN(EAPOL)数据包发送扩展验证协议的网络接口名称。若要了解更多调试信息,请将
-d
选项传给命令。
20.6. 根据 hostapd
身份验证事件阻止和允许流量
hostapd
服务不与流量平面交互。该服务仅充当身份验证器。但是,您可以编写一个脚本,根据身份验证事件的结果来允许或拒绝流量。
此流程不受支持,没有企业级的解决方案。它只演示如何通过评估由 hostapd_cli
检索的事件来阻止或允许流量。
当 802-1x-tr-mgmt
systemd 服务启动时,RHEL 会阻止 hostapd
监听端口上的所有流量,但 LAN(EAPOL)数据包上可扩展验证协议除外,并使用 hostapd_cli
工具连接到 hostapd
控制接口。/usr/local/bin/802-1x-tr-mgmt
脚本随后评估事件。根据 hostapd_cli
收到的不同事件,该脚本允许或阻止 MAC 地址的流量。请注意,当 802-1x-tr-mgmt
服务停止时,所有流量会自动允许。
在 hostapd
服务器上执行这此流程。
先决条件
-
hostapd
服务已配置,服务已准备好对客户端进行身份验证。
流程
使用以下内容创建
/usr/local/bin/802-1x-tr-mgmt
文件:#!/bin/sh TABLE="tr-mgmt-${1}" read -r -d '' TABLE_DEF << EOF table bridge ${TABLE} { set allowed_macs { type ether_addr } chain accesscontrol { ether saddr @allowed_macs accept ether daddr @allowed_macs accept drop } chain forward { type filter hook forward priority 0; policy accept; meta ibrname "$0" jump accesscontrol } } EOF case ${2:-NOTANEVENT} in block_all) nft destroy table bridge "$TABLE" printf "$TABLE_DEF" | nft -f - echo "$1: All the bridge traffic blocked. Traffic for a client with a given MAC will be allowed after 802.1x authentication" ;; AP-STA-CONNECTED | CTRL-EVENT-EAP-SUCCESS | CTRL-EVENT-EAP-SUCCESS2) nft add element bridge tr-mgmt-br0 allowed_macs { $3 } echo "$1: Allowed traffic from $3" ;; AP-STA-DISCONNECTED | CTRL-EVENT-EAP-FAILURE) nft delete element bridge tr-mgmt-br0 allowed_macs { $3 } echo "$1: Denied traffic from $3" ;; allow_all) nft destroy table bridge "$TABLE" echo "$1: Allowed all bridge traffice again" ;; NOTANEVENT) echo "$0 was called incorrectly, usage: $0 interface event [mac_address]" ;; esac
#!/bin/sh TABLE="tr-mgmt-${1}" read -r -d '' TABLE_DEF << EOF table bridge ${TABLE} { set allowed_macs { type ether_addr } chain accesscontrol { ether saddr @allowed_macs accept ether daddr @allowed_macs accept drop } chain forward { type filter hook forward priority 0; policy accept; meta ibrname "$0" jump accesscontrol } } EOF case ${2:-NOTANEVENT} in block_all) nft destroy table bridge "$TABLE" printf "$TABLE_DEF" | nft -f - echo "$1: All the bridge traffic blocked. Traffic for a client with a given MAC will be allowed after 802.1x authentication" ;; AP-STA-CONNECTED | CTRL-EVENT-EAP-SUCCESS | CTRL-EVENT-EAP-SUCCESS2) nft add element bridge tr-mgmt-br0 allowed_macs { $3 } echo "$1: Allowed traffic from $3" ;; AP-STA-DISCONNECTED | CTRL-EVENT-EAP-FAILURE) nft delete element bridge tr-mgmt-br0 allowed_macs { $3 } echo "$1: Denied traffic from $3" ;; allow_all) nft destroy table bridge "$TABLE" echo "$1: Allowed all bridge traffice again" ;; NOTANEVENT) echo "$0 was called incorrectly, usage: $0 interface event [mac_address]" ;; esac
Copy to Clipboard Copied! 使用以下内容创建
/etc/systemd/system/802-1x-tr-mgmt@.service
systemd 服务文件:[Unit] Description=Example 802.1x traffic management for hostapd After=hostapd.service After=sys-devices-virtual-net-%i.device [Service] Type=simple ExecStartPre=bash -c '/usr/sbin/hostapd_cli ping | grep PONG' ExecStartPre=/usr/local/bin/802-1x-tr-mgmt %i block_all ExecStart=/usr/sbin/hostapd_cli -i %i -a /usr/local/bin/802-1x-tr-mgmt ExecStopPost=/usr/local/bin/802-1x-tr-mgmt %i allow_all [Install] WantedBy=multi-user.target
[Unit] Description=Example 802.1x traffic management for hostapd After=hostapd.service After=sys-devices-virtual-net-%i.device [Service] Type=simple ExecStartPre=bash -c '/usr/sbin/hostapd_cli ping | grep PONG' ExecStartPre=/usr/local/bin/802-1x-tr-mgmt %i block_all ExecStart=/usr/sbin/hostapd_cli -i %i -a /usr/local/bin/802-1x-tr-mgmt ExecStopPost=/usr/local/bin/802-1x-tr-mgmt %i allow_all [Install] WantedBy=multi-user.target
Copy to Clipboard Copied! 重新载入 systemd:
systemctl daemon-reload
# systemctl daemon-reload
Copy to Clipboard Copied! 启用并启动接口名称
hostapd
正在侦听的802-1x-tr-mgmt
服务:systemctl enable --now 802-1x-tr-mgmt@br0.service
# systemctl enable --now 802-1x-tr-mgmt@br0.service
Copy to Clipboard Copied!
验证
- 通过客户端向网络进行身份验证。请参阅 针对 FreeRADIUS 服务器或验证器测试 EAP-TTLS 身份验证。
第 21 章 keyfile 格式的 NetworkManager 连接配置文件
Red Hat Enterprise Linux (RHEL)中的 NetworkManager 以密钥文件格式存储连接配置集。这个格式支持 NetworkManager 提供的所有连接设置。
RHEL 10 不支持 ifcfg
格式的连接配置文件。NetworkManager 忽略这种格式的文件,也不能将它们转换为 RHEL 10 上的 keyfile 格式。
21.1. NetworkManager 配置文件的密钥文件格式
keyfile 格式与 INI 格式类似。例如,以下是keyfile 格式的以太网连接配置文件:
[connection] id=example_connection uuid=82c6272d-1ff7-4d56-9c7c-0eb27c300029 type=ethernet autoconnect=true [ipv4] method=auto [ipv6] method=auto [ethernet] mac-address=00:53:00:8f:fa:66
[connection]
id=example_connection
uuid=82c6272d-1ff7-4d56-9c7c-0eb27c300029
type=ethernet
autoconnect=true
[ipv4]
method=auto
[ipv6]
method=auto
[ethernet]
mac-address=00:53:00:8f:fa:66
参数的拼写错误或不正确的放置可能会导致意外行为。因此,请不要手动编辑或创建 NetworkManager 配置文件。
使用 nmcli
工具、network
RHEL 系统角色或 nmstate
API 来管理 NetworkManager 连接。例如,您可以在 离线模式中使用nmcli
工具来 创建连接配置集。
每个部分都对应一个 NetworkManager 设置名称,如 nm-settings (5)
手册页中所述。该部分中的每一个键值对是手册页设置规范中列出的一个属性。
NetworkManager 密钥文件中的大部分变量都具有一对一映射。这意味着 NetworkManager 属性以相同的名称和格式的变量存储在密钥文件中。不过,也有例外情况,主要是为了使密钥文件语法更易于阅读。有关这些例外的列表,请查看您系统上的 nm-settings-keyfile (5)
手册页。
为安全起见,因为连接配置文件可以包含敏感信息,如私钥和密码短语,所以 NetworkManager 仅使用 root
用户所拥有的配置文件,并且仅可由 root
读写。
将带有.nmconnection
后缀的连接配置文件保存在 /etc/NetworkManager/system-connections/
目录中。此目录包含持久性配置文件。如果您使用 NetworkManager API 修改了持久配置文件,NetworkManager 会写并覆盖此目录中的文件。
NetworkManager 不会自动从磁盘重新加载配置文件。当您以密钥文件格式创建或更新连接配置文件时,请使用 nmcli connection reload
命令告知 NetworkManager 这些变化。
21.2. 使用 nmcli
在离线模式下创建 keyfile 连接配置文件
使用 NetworkManager 工具(如 nmcli
)、network
RHEL 系统角色或 nmstate
API)来管理 NetworkManager 连接,以创建和更新配置文件。但是,您也可以使用 nmcli --offline connection add
命令,在离线模式下创建各种 keyfile 格式的连接配置文件。
脱机模式可确保 nmcli
在没有 NetworkManager
服务的情况下运行,以通过标准输出生成 keyfile 连接配置集。此功能在以下场景下很有用:
- 您需要创建需要预先部署的连接配置集。例如在容器镜像中,或者作为 RPM 软件包。
-
您希望在
NetworkManager
服务不可用的环境中创建连接配置文件,例如当您要使用chroot
工具时。或者,当您想通过 Kickstart%post
脚本创建或修改 RHEL 系统的网络配置时。
流程
以 keyfile 格式创建新连接配置集。例如,对于不使用 DHCP 的以太网设备的连接配置文件,请运行类似的
nmcli
命令:nmcli --offline connection add type ethernet con-name Example-Connection ipv4.addresses 192.0.2.1/24 ipv4.dns 192.0.2.200 ipv4.method manual > /etc/NetworkManager/system-connections/example.nmconnection
# nmcli --offline connection add type ethernet con-name Example-Connection ipv4.addresses 192.0.2.1/24 ipv4.dns 192.0.2.200 ipv4.method manual > /etc/NetworkManager/system-connections/example.nmconnection
Copy to Clipboard Copied! 注意使用
con-name
键指定的连接名称被保存到生成的配置集的id
变量中。当您使用nmcli
命令稍后管理这个连接时,请按如下所示指定连接:-
如果没有省略
id
变量,请使用连接名称,如Example-Connection
。 -
当没有使用
id
变量时,请使用没有.nmconnection
后缀的文件名,如output
。
-
如果没有省略
对配置文件设置权限,以便只有
root
用户可以读和更新它:chmod 600 /etc/NetworkManager/system-connections/example.nmconnection chown root:root /etc/NetworkManager/system-connections/example.nmconnection
# chmod 600 /etc/NetworkManager/system-connections/example.nmconnection # chown root:root /etc/NetworkManager/system-connections/example.nmconnection
Copy to Clipboard Copied! 重新载入 NetworkManager 连接:
nmcli connection reload
# nmcli connection reload
Copy to Clipboard Copied! 如果将配置文件中的
autoconnect
变量设置为false
,则激活连接:nmcli connection up Example-Connection
# nmcli connection up Example-Connection
Copy to Clipboard Copied!
验证
验证
NetworkManager
服务是否正在运行:systemctl status NetworkManager.service
# systemctl status NetworkManager.service ● NetworkManager.service - Network Manager Loaded: loaded (/usr/lib/systemd/system/NetworkManager.service; enabled; vendor preset: enabled) Active: active (running) since Wed 2022-08-03 13:08:32 CEST; 1min 40s ago ...
Copy to Clipboard Copied! 验证 NetworkManager 是否可以从配置文件中读取配置集:
nmcli -f TYPE,FILENAME,NAME connection
# nmcli -f TYPE,FILENAME,NAME connection TYPE FILENAME NAME ethernet /etc/NetworkManager/system-connections/example.nmconnection Example-Connection ...
Copy to Clipboard Copied! 如果输出没有显示新创建的连接,请验证密钥文件权限和您所用的语法是否正确。
显示连接配置文件:
nmcli connection show Example-Connection
# nmcli connection show Example-Connection connection.id: Example-Connection connection.uuid: 232290ce-5225-422a-9228-cb83b22056b4 connection.stable-id: -- connection.type: 802-3-ethernet connection.interface-name: -- connection.autoconnect: yes ...
Copy to Clipboard Copied!
21.3. 手动创建 keyfile 格式的 NetworkManager 配置文件
您可以手动创建密钥文件格式的 NetworkManager 连接配置集。
手动创建或更新配置文件可能会导致意外或无法正常工作的网络配置。作为备用方案,您可以在离线模式下使用 nmcli
。请参阅 使用 nmcli
在离线模式下创建密钥文件连接配置集
流程
创建连接配置文件。例如,对于使用 DHCP 的
enp1s0
以太网设备的连接配置文件,请创建具有以下内容的/etc/NetworkManager/system-connections/example.nmconnection
文件:[connection] id=Example-Connection type=ethernet autoconnect=true interface-name=enp1s0 [ipv4] method=auto [ipv6] method=auto
[connection] id=Example-Connection type=ethernet autoconnect=true interface-name=enp1s0 [ipv4] method=auto [ipv6] method=auto
Copy to Clipboard Copied! 注意您可以使用任何以
.nmconnection
为后缀的文件名。但是,当您稍后使用nmcli
命令来管理连接时,您必须在引用此连接时使用id
变量中设置的连接名称。当省略id
变量时,请使用不带.nmconnection
的文件名来引用此连接。对配置文件设置权限,以便只有
root
用户可以读和更新它:chown root:root /etc/NetworkManager/system-connections/example.nmconnection chmod 600 /etc/NetworkManager/system-connections/example.nmconnection
# chown root:root /etc/NetworkManager/system-connections/example.nmconnection # chmod 600 /etc/NetworkManager/system-connections/example.nmconnection
Copy to Clipboard Copied! 重新加载连接配置文件:
nmcli connection reload
# nmcli connection reload
Copy to Clipboard Copied! 验证 NetworkManager 是否从配置文件读取配置文件:
nmcli -f NAME,UUID,FILENAME connection
# nmcli -f NAME,UUID,FILENAME connection NAME UUID FILENAME Example-Connection 86da2486-068d-4d05-9ac7-957ec118afba /etc/NetworkManager/system-connections/example.nmconnection ...
Copy to Clipboard Copied! 如果命令未显示新添加的连接,请验证文件权限和您在文件中使用的语法是否正确。
如果将配置文件中的
autoconnect
变量设置为false
,则激活连接:nmcli connection up Example-Connection
# nmcli connection up Example-Connection
Copy to Clipboard Copied!
验证
显示连接配置文件:
nmcli connection show Example-Connection
# nmcli connection show Example-Connection
Copy to Clipboard Copied!
第 22 章 systemd 网络目标和服务
在应用网络设置时,RHEL 使用 network
和 network-online
目标以及 NetworkManager-wait-online
服务。另外,如果这些服务希望网络启动,且它们无法动态响应网络状态的变化,您可以将 systemd
服务配置为在网络完全可用后启动。
22.1. 网络和网络在线 systemd 目标的不同
systemd 维护 network
和 network-online
目标单元。特殊单元,如 NetworkManager-wait-online.service
,具有 WantedBy=network-online.target
和 Before=network-online.target
参数。如果启用了,这些单元将启动 network-online.target
,并延迟要达到的目标,直到建立了某种形式的网络连接。它们会延迟 network-online
目标,直到网络连接了。
network-online
目标启动一个服务,这会对进一步执行增加更长的延迟。systemd 会自动使用这个目标单元的 Wants
和 After
参数来向所有 System V(SysV) init
脚本服务单元添加依赖项,这些服务单元具有一个指向 $network
工具的 Linux Standard Base(LSB)头。LSB 头是 init
脚本的元数据。您可以使用它指定依赖项。这与 systemd
目标类似。
network
目标不会显著延迟引导进程的执行。到达 network
目标意味着,负责设置网络的服务已启动。但并不意味着已经配置了一个网络设备。这个目标在关闭系统的过程中非常重要。例如,如果您在引导过程中有一个排在 network
目标之后的服务,则这个依赖关系在关闭过程中会反过来。在服务停止后,网络才会断开连接。远程网络文件系统的所有挂载单元都会自动启动 network-online
目标单元,并在其之后排序。
network-online
目标单元仅在系统启动期间有用。系统完成引导后,这个目标不会跟踪网络的在线状态。因此,您无法使用 network-online
来监控网络连接。这个目标提供一个一次性系统启动概念。
22.2. NetworkManager-wait-online
概述
NetworkManager-wait-online
服务延迟到达 network-online
目标,直到 NetworkManager 报告启动已完成。在启动过程中,NetworkManager 会通过将 connection.autoconnect
参数设置为 yes
来激活所有配置文件。但是,只要 NetworkManager 配置集处于激活状态,配置文件的激活就没有完成。如果激活失败,NetworkManager 会根据 connection.autoconnect-retries
的值来重试激活。
设备何时达到激活状态取决于其配置。例如,如果配置文件同时包含 IPv4 和 IPv6 配置,默认情况下,NetworkManager 会在只有一个地址系列就绪时将设备视为完全激活。连接配置文件中的 ipv4.may-fail
和 ipv6.may-fail
参数控制此行为。
对于以太网设备,NetworkManager 会超时等待载体。因此,如果以太网电缆没有连接,则这可能会进一步延迟 NetworkManager-wait-online.service
。
当启动完成后,所有配置集都处于断开连接的状态,或被成功激活。您可以配置配置集来自动连接。以下是一些参数示例,这些参数设定超时或者在连接被视为活跃时定义:
-
connection.wait-device-timeout
:设置驱动程序检测设备的超时时间。 -
ipv4.may-fail
和ipv6.may-fail
:使用一个就绪的 IP 地址系列设置激活,或者一个特定的地址系列是否已完成配置。 -
ipv4.gateway-ping-timeout
: 延迟激活
22.3. 将 systemd 服务配置为在网络已启动后再启动
Red Hat Enterprise Linux 在 /usr/lib/systemd/system/
目录中安装 systemd
服务文件。此流程为 /etc/systemd/system/<service_name>.service.d/
中的一个服务文件创建一个置入片断,其与 /usr/lib/systemd/system/
中的服务文件一起使用,以便在网络在线后启动特定的服务。如果置入段中的设置与 /usr/lib/systemd/system/
中服务文件中的设置重叠,则它具有更高的优先级。
流程
在编辑器中打开服务文件:
systemctl edit <service_name>
# systemctl edit <service_name>
Copy to Clipboard Copied! 输入以下内容并保存更改:
[Unit] After=network-online.target
[Unit] After=network-online.target
Copy to Clipboard Copied! 重新加载
systemd
服务。systemctl daemon-reload
# systemctl daemon-reload
Copy to Clipboard Copied!
22.4. 配置 IP 地址 ping 目标以确保活跃网络连接
NetworkManager 服务在系统引导时启动。某些服务(如网络文件系统(NFS))依赖于网络连接。如果网关 IP 或目标 IP 地址未返回响应,NFS 无法挂载,因为它无法连接到其目的地,因为网络没有完全启动并运行。因此,您可以配置 connection.ip-ping-addresses
和 connection.ip-ping-timeout
设置,以验证与特定目标的连接以避免这样的问题。connection.ip-ping-addresses
设置支持配置 IPv4 和 IPv6 地址。
流程
如果连接配置集尚不存在,请创建它。例如,要为带有动态 IP 地址分配的
enp1s0
接口创建配置集,请输入:nmcli connection add con-name enp1s0 ifname enp1s0 type ethernet
# nmcli connection add con-name enp1s0 ifname enp1s0 type ethernet
Copy to Clipboard Copied! 注意配置
connection.ip-ping-addresses
可能会导致systemd
的network-online
目标服务的响应延迟,因为等待 ping 操作完成或超时周期。配置连接以使用定义的超时时间 ping 指定 IP 地址:
nmcli connection modify enp1s0 connection.ip-ping-addresses "192.0.2.56, 192.0.2.60" connection.ip-ping-timeout 10 ipv4.may-fail no
# nmcli connection modify enp1s0 connection.ip-ping-addresses "192.0.2.56, 192.0.2.60" connection.ip-ping-timeout 10 ipv4.may-fail no
Copy to Clipboard Copied! 将
ipv4.may-fail
属性设置为no
,确保 IPv4 配置必须成功完成。重新激活连接:
nmcli connection up enp1s0
# nmcli connection up enp1s0
Copy to Clipboard Copied!
第 23 章 Nmstate 简介
nmstate 是一个声明性网络管理器 API。使用 Nmstate 时,您可以使用 YAML 或 JSON 格式的指令描述预期的网络状态。
nmstate 有很多优点。例如,它:
- 提供稳定且可扩展的接口来管理 RHEL 网络功能
- 支持主机和集群级别的原子和事务操作
- 支持对大多数属性进行部分编辑,并保留在说明中没有指定的现有设置
Nmstate 由以下软件包组成:
软件包 | 内容 |
---|---|
|
|
|
|
| Nmstate C 库 |
| Nmstate C 库标头 |
23.1. 在 Python 应用程序中使用 libnmstate 库
libnmstate
Python 库可让开发人员在他们自己的应用程序中使用 Nmstate
要使用库,请在源代码中导入它:
import libnmstate
import libnmstate
请注意,您必须安装 nmstate
和 python3-libnmstate
软件包才能使用这个库。
例 23.1. 使用 libnmstate 库查询网络状态
以下 Python 代码导入了 libnmstate
库,并显示可用的网络接口及其状态:
import libnmstate from libnmstate.schema import Interface net_state = libnmstate.show() for iface_state in net_state[Interface.KEY]: print(iface_state[Interface.NAME] + ": " + iface_state[Interface.STATE])
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])
23.2. 使用 nmstatectl
更新当前网络配置
您可以使用 nmstatectl
工具将一个或多个接口的当前网络配置存储在一个文件中。然后您可以使用此文件:
- 修改配置并将其应用到同一系统。
- 将文件复制到其他主机上,并使用相同的或经过修改的设置配置主机。
例如,您可以将 enp1s0
接口的设置导出到一个文件中,修改配置,将设置应用到主机。
前提条件
-
nmstate
软件包已安装。
流程
将
enp1s0
接口的设置导出到~/network-config.yml
文件:nmstatectl show enp1s0 > ~/network-config.yml
# nmstatectl show enp1s0 > ~/network-config.yml
Copy to Clipboard Copied! 此命令会以 YAML 格式存储
enp1s0
的配置。要以 JSON 格式存储输出,请将--json
选项传给命令。如果没有指定接口名称,
nmstatectl
将导出所有接口的配置。-
使用文本编辑器修改
~/network-config.yml
文件,以更新配置。 应用
~/network-config.yml
文件中的设置:nmstatectl apply ~/network-config.yml
# nmstatectl apply ~/network-config.yml
Copy to Clipboard Copied! 如果您以 JSON 格式导出设置,请将
--json
选项传给命令。
23.3. nmstate
systemd 服务
安装 nmstate
软件包后,您可以通过配置 nmstate
systemd 服务,在 Red Hat Enterprise Linux 系统引导时自动应用新的网络设置。此服务是一个 一次性
的 systemd 服务。因此,systemd 仅在系统引导以及手动重启服务时执行它。
默认情况下禁用 nmstate
服务。使用 systemctl enable nmstate
命令启用它。之后,systemd
在每次系统启动时都执行此服务。
要使用这个服务,请将带有 Nmstate 指令的 *.yml
文件存储在 /etc/nmstate/
目录中。然后,nmstate
服务在下次重启时或手动重启服务时自动应用文件。默认情况下,在 Nmstate 成功应用文件后,它会将文件的 .yml
后缀重命名为 .applied
,以防止服务再次处理同样的文件。
您可以在 /etc/nmstate/nmstate.conf
文件中配置 nmstate
服务。例如,要在应用原始 *.yml
文件后保留它,并只创建一个具有 .applied
后缀的副本,请将以下行添加到 /etc/nmstate/nmstate.conf
中:
[service] keep_state_file_after_apply = false
[service]
keep_state_file_after_apply = false
有关详情和其他配置选项,请查看您系统上的 nmstate.service (8)
手册页。
23.4. network
RHEL 系统角色的网络状态
network
RHEL 系统角色支持 playbook 中的状态配置来配置设备。为此,请使用 network_state
变量,后面跟上状态配置。
在 playbook 中使用 network_state
变量的好处:
- 通过与状态配置结合使用声明方法,您可以配置接口,NetworkManager 会在后台为这些接口创建一个配置集。
-
使用
network_state
变量,您可以指定您需要更改的选项,所有其他选项将保持不变。但是,使用network_connections
变量,您必须指定所有设置来更改网络连接配置集。
您只能在 network_state
中设置 Nmstate YAML 指令。这些指令与您可以在 network_connections
中设置的变量有所不同。
例如,要使用动态 IP 地址设置创建以太网连接,请在 playbook 中使用以下 vars
块:
带有状态配置的 playbook | 常规 playbook |
vars: network_state: interfaces: - name: enp7s0 type: ethernet state: up ipv4: enabled: true auto-dns: true auto-gateway: true auto-routes: true dhcp: true ipv6: enabled: true auto-dns: true auto-gateway: true auto-routes: true autoconf: true dhcp: true
|
vars: network_connections: - name: enp7s0 interface_name: enp7s0 type: ethernet autoconnect: yes ip: dhcp4: yes auto6: yes state: up
|
例如,要仅更改您之前创建的动态 IP 地址设置的连接状态,请在 playbook 中使用以下 vars
块:
带有状态配置的 playbook | 常规 playbook |
vars: network_state: interfaces: - name: enp7s0 type: ethernet state: down
|
vars: network_connections: - name: enp7s0 interface_name: enp7s0 type: ethernet autoconnect: yes ip: dhcp4: yes auto6: yes state: down
|
第 24 章 多路径 TCP 入门
传输控制协议(TCP)确保通过互联网的可靠的数据传递,并自动调整其带宽以响应网络负载。多路径 TCP (MPTCP) 是原始 TCP 协议 (single-path) 的扩展。MPTCP 支持传输连接同时在多个路径中运行,并为用户端点设备带来网络连接冗余。
24.1. 了解 MPTCP
多路径 TCP (MPTCP) 协议允许在连接端点间同时使用多个路径。协议设计提高了连接稳定性,与单一路径 TCP 相比也带来了其他好处。
在 MPTCP 术语中,链接被视为路径。
以下是使用 MPTCP 的一些优点:
- 它允许一个连接同时使用多个网络接口。
- 如果连接绑定到链路速度,则使用多个链接可能会增加连接的吞吐量。请注意,如果连接绑定到 CPU,则使用多个链路会导致连接性能下降。
- 它提高对链接故障的恢复能力。
有关 MPTCP 的详情,请查看 其他资源。
24.2. 为 MPTCP 应用程序永久配置多路径
您可以使用 nmcli
命令在源和目标系统之间永久建立多个子流来配置 MultiPath TCP (MPTCP)。子流可以使用不同的资源,不同的路由到目的地,甚至不同网络。例如以太网、单元格、wifi 等。因此,您可以实现组合连接,这提高了网络弹性和吞吐量。
服务器在我们的示例中使用以下网络接口:
-
enp4s0:
192.0.2.1/24
-
enp1s0:
198.51.100.1/24
-
enp7s0:
192.0.2.3/24
客户端在我们的示例中使用以下网络接口:
-
enp4s0f0:
192.0.2.2/24
-
enp4s0f1:
198.51.100.2/24
-
enp6s0:
192.0.2.5/24
先决条件
- 您在相关接口上配置了默认网关。
流程
在内核中启用 MPTCP 套接字:
echo "net.mptcp.enabled=1" > /etc/sysctl.d/90-enable-MPTCP.conf sysctl -p /etc/sysctl.d/90-enable-MPTCP.conf
# echo "net.mptcp.enabled=1" > /etc/sysctl.d/90-enable-MPTCP.conf # sysctl -p /etc/sysctl.d/90-enable-MPTCP.conf
Copy to Clipboard Copied! 可选:用于子流限制的 RHEL 内核默认是 2。如果您需要更多:
使用以下内容创建
/etc/systemd/system/set_mptcp_limit.service
文件:[Unit] Description=Set MPTCP subflow limit to 3 After=network.target [Service] ExecStart=ip mptcp limits set subflows 3 Type=oneshot [Install] WantedBy=multi-user.target
[Unit] Description=Set MPTCP subflow limit to 3 After=network.target [Service] ExecStart=ip mptcp limits set subflows 3 Type=oneshot [Install] WantedBy=multi-user.target
Copy to Clipboard Copied! 在每个引导过程中,当网络 (
network.target
) 可以正常工作后,oneshot 单元会执行ip mptcp limits set subflows 3
命令。ip mptcp limits set subflows 3
命令为每个连接设置附加子流的最大数量,即 4 个。可以最多添加 3 个额外的子流。启用
set_mptcp_limit
服务:systemctl enable --now set_mptcp_limit
# systemctl enable --now set_mptcp_limit
Copy to Clipboard Copied!
在要用于连接聚合的所有连接配置集上启用 MPTCP:
nmcli connection modify <profile_name> connection.mptcp-flags signal,subflow,also-without-default-route
# nmcli connection modify <profile_name> connection.mptcp-flags signal,subflow,also-without-default-route
Copy to Clipboard Copied! connection.mptcp-flags
参数配置 MPTCP 端点和 IP 地址标志。如果在 NetworkManager 连接配置集中启用 MPTCP,则设置会将相关网络接口的 IP 地址配置为 MPTCP 端点。默认情况下,如果没有默认网关,NetworkManager 不会将 MPTCP 标记添加到 IP 地址。如果要绕过该检查,您需要使用
also-without-default-route
标志。
验证
验证您启用了 MPTCP 内核参数:
sysctl net.mptcp.enabled
# sysctl net.mptcp.enabled net.mptcp.enabled = 1
Copy to Clipboard Copied! 验证您正确设置了子流限制,如果默认值是不够的:
ip mptcp limit show
# ip mptcp limit show add_addr_accepted 2 subflows 3
Copy to Clipboard Copied! 验证您正确配置了每个地址 MPTCP 设置:
ip mptcp endpoint show
# ip mptcp endpoint show 192.0.2.1 id 1 subflow dev enp4s0 198.51.100.1 id 2 subflow dev enp1s0 192.0.2.3 id 3 subflow dev enp7s0 192.0.2.4 id 4 subflow dev enp3s0 ...
Copy to Clipboard Copied!
24.3. 配置 mptcpd
mptcpd
服务是 mptcp
协议的一个组件,它提供对配置 mptcp
端点的检测。mptcpd
服务默认为每个地址创建一个子流端点。端点列表根据正在运行的主机上的 IP 地址修改动态更新。mptcpd
服务自动创建端点列表。它使多个路径作为使用 ip
工具的替代选择。
先决条件
-
已安装
mptcpd
软件包
流程
使用以下命令在内核中启用
mptcp.enabled
选项:echo "net.mptcp.enabled=1" > /etc/sysctl.d/90-enable-MPTCP.conf sysctl -p /etc/sysctl.d/90-enable-MPTCP.conf
# echo "net.mptcp.enabled=1" > /etc/sysctl.d/90-enable-MPTCP.conf # sysctl -p /etc/sysctl.d/90-enable-MPTCP.conf
Copy to Clipboard Copied! 启用并启动
mptcpd
服务:systemctl enable --now mptcp.service
# systemctl enable --now mptcp.service
Copy to Clipboard Copied! 要手动配置
mptcpd
服务,修改/etc/mptcpd/mptcpd.conf
配置文件。请注意,端点 mptcpd 服务创建,最后一个主机关闭。
验证
验证端点创建:
ip mptcp endpoint
# ip mptcp endpoint
Copy to Clipboard Copied!
第 25 章 Linux 流量控制
Linux 提供管理和操作数据包传输的工具。Linux 流量控制(TC)子系统帮助进行策略、分类、控制以及调度网络流量。TC 还可以通过使用过滤器和动作在分类过程中利用数据包内容分栏。TC 子系统通过使用排队规则(qdisc
)这个 TC 架构的基本元素来达到此目的。
调度机制在进入或退出不同的队列前确定或者重新安排数据包。最常见的调度程序是先入先出(FIFO)调度程序。您可以使用 tc
工具临时执行 qdiscs
操作,也可以使用 NetworkManager 永久执行操作。
在 Red Hat Enterprise Linux 中,您可以使用各种方法配置默认的排队规则来管理网络接口上的流量。
25.1. 排队规则概述
排队规则(qdiscs
)帮助排队,之后通过网络接口调度流量传输。qdisc
有两个操作:
- 排队请求,以便在以后传输时对数据包进行排队
- 出队请求,以便可以选择其中一个排队的数据包进行即时传输。
每个 qdisc
都有一个 16 位十六进制标识数字,称为 句柄
,带有一个附加的冒号,如 1:
或 abcd:
这个数字被称为 qdisc
主号码。如果 qdisc
有类,则标识符是由两个数字组成的对,主号码在次要号码之前,即 <major>:<minor>
,例如 abcd:1
。次要号码的编号方案取决于 qdisc
类型。有时,编号是系统化的,其中第一类的 ID 为 < <major>:1
,第二类的 ID 为 <major>:2
,等等。一些 qdiscs
允许用户在创建类时随机设置类的次要号码。
- 类
qdiscs
存在不同类型的
qdiscs
,帮助向和从网络接口传输数据包。您可以使用根、父或子类配置qdiscs
。子对象可以被附加的位置称为类。qdisc
中的类是灵活的,始终包含多个子类或一个子类qdisc
。不禁止包含类qdisc
本身的类,这有助于实现复杂的流量控制场景。类
qdiscs
本身不存储任何数据包。相反,它们根据特定于qdisc
的标准,将排队和出队请求传到它们其中的一个子类。最后,这个递归数据包传递最终结束保存数据包的位置(在出现排队时从中提取)。- 无类别
qdiscs
-
有些
qdiscs
不包含子类,它们称为无类别qdiscs
。与类qdiscs
相比,无类别qdiscs
需要较少的自定义。通常情况下,将它们附加到接口就足够了。
25.2. 使用 tc
工具检查网络接口的 qdiscs
默认情况下,Red Hat Enterprise Linux 系统使用 fq_codel qdisc
。您可以使用 tc
工具检查 qdisc
计数器。
流程
可选:查看您当前的
qdisc
:tc qdisc show dev enp0s1
# tc qdisc show dev enp0s1
Copy to Clipboard Copied! 检查当前的
qdisc
计数器:tc -s qdisc show dev enp0s1
# tc -s qdisc show dev enp0s1 qdisc fq_codel 0: root refcnt 2 limit 10240p flows 1024 quantum 1514 target 5.0ms interval 100.0ms memory_limit 32Mb ecn Sent 1008193 bytes 5559 pkt (dropped 233, overlimits 55 requeues 77) backlog 0b 0p requeues 0
Copy to Clipboard Copied! -
dropped
- 由于所有队列已满而丢弃数据包的次数 -
overlimits
- 配置的链路容量已满的次数 -
sent
- 出队的数量
-
25.3. 更新默认的 qdisc
如果使用当前的 qdisc
观察网络数据包丢失情况,您可以根据您的网络要求更改 qdisc
。
流程
查看当前的默认的
qdisc
:sysctl -a | grep qdisc
# sysctl -a | grep qdisc net.core.default_qdisc = fq_codel
Copy to Clipboard Copied! 查看当前以太网连接的
qdisc
:tc -s qdisc show dev enp0s1
# tc -s qdisc show dev enp0s1 qdisc fq_codel 0: root refcnt 2 limit 10240p flows 1024 quantum 1514 target 5.0ms interval 100.0ms memory_limit 32Mb ecn Sent 0 bytes 0 pkt (dropped 0, overlimits 0 requeues 0) backlog 0b 0p requeues 0 maxpacket 0 drop_overlimit 0 new_flow_count 0 ecn_mark 0 new_flows_len 0 old_flows_len 0
Copy to Clipboard Copied! 更新现有的
qdisc
:sysctl -w net.core.default_qdisc=pfifo_fast
# sysctl -w net.core.default_qdisc=pfifo_fast
Copy to Clipboard Copied! 要应用更改,请重新加载网络驱动程序:
modprobe -r NETWORKDRIVERNAME modprobe NETWORKDRIVERNAME
# modprobe -r NETWORKDRIVERNAME # modprobe NETWORKDRIVERNAME
Copy to Clipboard Copied! 启动网络接口:
ip link set enp0s1 up
# ip link set enp0s1 up
Copy to Clipboard Copied!
验证
查看以太网连接的
qdisc
:tc -s qdisc show dev enp0s1
# tc -s qdisc show dev enp0s1 qdisc pfifo_fast 0: root refcnt 2 bands 3 priomap 1 2 2 2 1 2 0 0 1 1 1 1 1 1 1 1 Sent 373186 bytes 5333 pkt (dropped 0, overlimits 0 requeues 0) backlog 0b 0p requeues 0 ...
Copy to Clipboard Copied!
25.4. 使用 tc 工具临时设置网络接口的当前 qdisc
您可以更新当前的 qdisc
而不更改默认的 qdisc 。
流程
可选:查看当前的
qdisc
:tc -s qdisc show dev enp0s1
# tc -s qdisc show dev enp0s1
Copy to Clipboard Copied! 更新当前的
qdisc
:tc qdisc replace dev enp0s1 root htb
# tc qdisc replace dev enp0s1 root htb
Copy to Clipboard Copied!
验证
查看更新后的当前
qdisc
:tc -s qdisc show dev enp0s1
# tc -s qdisc show dev enp0s1 qdisc htb 8001: root refcnt 2 r2q 10 default 0 direct_packets_stat 0 direct_qlen 1000 Sent 0 bytes 0 pkt (dropped 0, overlimits 0 requeues 0) backlog 0b 0p requeues 0
Copy to Clipboard Copied!
25.5. 使用 NetworkManager 永久设置网络接口的当前 qdisc
您可以更新 NetworkManager 连接当前的 qdisc
值。
流程
可选:查看当前的
qdisc
:tc qdisc show dev enp0s1
# tc qdisc show dev enp0s1 qdisc fq_codel 0: root refcnt 2
Copy to Clipboard Copied! 更新当前的
qdisc
:nmcli connection modify enp0s1 tc.qdiscs 'root pfifo_fast'
# nmcli connection modify enp0s1 tc.qdiscs 'root pfifo_fast'
Copy to Clipboard Copied! 可选:要在现有的
qdisc
上添加另一个qdisc
,请使用+tc.qdisc
选项:nmcli connection modify enp0s1 +tc.qdisc 'ingress handle ffff:'
# nmcli connection modify enp0s1 +tc.qdisc 'ingress handle ffff:'
Copy to Clipboard Copied! 激活更改:
nmcli connection up enp0s1
# nmcli connection up enp0s1
Copy to Clipboard Copied!
验证
查看网络接口当前的
qdisc
:tc qdisc show dev enp0s1
# tc qdisc show dev enp0s1 qdisc pfifo_fast 8001: root refcnt 2 bands 3 priomap 1 2 2 2 1 2 0 0 1 1 1 1 1 1 1 1 qdisc ingress ffff: parent ffff:fff1 ................
Copy to Clipboard Copied!
25.6. 使用 tc-ctinfo 工具配置数据包的速率限制
您可以使用速率限制来限制网络流量,并防止网络中资源耗尽。通过速率限制,您还可以通过限制特定时间段内重复的数据包请求来减少服务器上的负载。另外,您可以通过使用 tc-ctinfo
工具在内核中配置流量控制来管理带宽率。
连接跟踪条目存储 Netfilter
标记和连接信息。当路由器转发来自防火墙的数据包时,路由器会删除或修改数据包的连接跟踪条目。连接跟踪信息(ctinfo
)模块将数据从连接跟踪标记检索到各个字段。此内核模块通过将 Netfilter 标记复制到套接字缓冲区(skb
)标记元数据字段来保留 Netfilter
标记。
先决条件
-
iperf3
工具安装在服务器和客户端上。
流程
在服务器上执行以下步骤:
在网络接口中添加一个虚拟链接:
ip link add name ifb4eth0 numtxqueues 48 numrxqueues 48 type ifb
# ip link add name ifb4eth0 numtxqueues 48 numrxqueues 48 type ifb
Copy to Clipboard Copied! 这个命令有以下参数:
name ifb4eth0
- 设置新的虚拟设备接口。
numtxqueues 48
- 设置传输队列的数量。
numrxqueues 48
- 设置接收队列的数量。
type ifb
- 设置新设备的类型。
更改接口的状态:
ip link set dev ifb4eth0 up
# ip link set dev ifb4eth0 up
Copy to Clipboard Copied! 在物理网络接口上添加
qdisc
属性,并将其应用到传入流量:tc qdisc add dev enp1s0 handle ffff: ingress
# tc qdisc add dev enp1s0 handle ffff: ingress
Copy to Clipboard Copied! 在
handle ffff:
选项中,handle
参数将主号ffff:
作为默认值分配给enp1s0
物理网络接口上的类qdisc
,其中qdisc
是一个分析流量控制的排队规则参数。在
ip
协议的物理接口上添加一个过滤器,以对数据包进行分类:tc filter add dev enp1s0 parent ffff: protocol ip u32 match u32 0 0 action ctinfo cpmark 100 action mirred egress redirect dev ifb4eth0
# tc filter add dev enp1s0 parent ffff: protocol ip u32 match u32 0 0 action ctinfo cpmark 100 action mirred egress redirect dev ifb4eth0
Copy to Clipboard Copied! 这个命令有以下属性:
parent ffff:
-
为父
qdisc
设置主号ffff:
。 u32 match u32 0 0
-
设置
u32
过滤器,以匹配
u32
模式的 IP 标头。第一个0
表示 IP 标头的第二个字节,另一个0
用于掩码匹配,告知过滤器要匹配哪个位。 action ctinfo
- 设置操作,以将连接跟踪标记的数据检索到各个字段。
cpmark 100
-
将连接跟踪标记(connmark)
100
复制到数据包 IP 标头字段中。 action mirred egress redirect dev ifb4eth0
-
将
操作
设置为mirred
将接收的数据包重定向到ifb4eth0
目的地接口。
向接口中添加类
qdisc
:tc qdisc add dev ifb4eth0 root handle 1: htb default 1000
# tc qdisc add dev ifb4eth0 root handle 1: htb default 1000
Copy to Clipboard Copied! 此命令将主号
1
设置为 rootqdisc
,并将htb
层次结构令牌存储桶与 minor-id1000
的类qdisc
一起使用。将接口上的流量限制为 1 Mbit/s,上限为 2 Mbit/s:
tc class add dev ifb4eth0 parent 1:1 classid 1:100 htb ceil 2mbit rate 1mbit prio 100
# tc class add dev ifb4eth0 parent 1:1 classid 1:100 htb ceil 2mbit rate 1mbit prio 100
Copy to Clipboard Copied! 这个命令有以下参数:
parent 1:1
-
将
parent
设为classid
为1
,将root
设为1
。 classid 1:100
-
将
classid
设置为1:100
,其中1
是父qdisc
的数量,100
是父qdisc
的类的数量。 htb ceil 2mbit
-
htb
类qdisc
允许上限带宽2 Mbit/s
作为ceil
速率限制。
将无类别
qdisc
的 Stochastic Fairness Queuing (sfq
)应用到 时间间隔为60
秒的接口,以减少队列算法的影响:tc qdisc add dev ifb4eth0 parent 1:100 sfq perturb 60
# tc qdisc add dev ifb4eth0 parent 1:100 sfq perturb 60
Copy to Clipboard Copied! 在接口中添加防火墙标记(
fw
)过滤器:tc filter add dev ifb4eth0 parent 1:0 protocol ip prio 100 handle 100 fw classid 1:100
# tc filter add dev ifb4eth0 parent 1:0 protocol ip prio 100 handle 100 fw classid 1:100
Copy to Clipboard Copied! 从连接标记(
CONNMARK
)恢复数据包元标记:nft add rule ip mangle PREROUTING counter meta mark set ct mark
# nft add rule ip mangle PREROUTING counter meta mark set ct mark
Copy to Clipboard Copied! 在这个命令中,
nft
工具有一个带有PREROUTING
链规则规范的mangle
表,该表在路由之前更改传入的数据包,来将数据包标记替换为CONNMARK
。如果没有
nft
表和链存在,请创建一个表并添加一个链规则:nft add table ip mangle nft add chain ip mangle PREROUTING {type filter hook prerouting priority mangle \;}
# nft add table ip mangle # nft add chain ip mangle PREROUTING {type filter hook prerouting priority mangle \;}
Copy to Clipboard Copied! 在指定目标地址
192.0.2.3
上接收的tcp
数据包上设置 meta 标记:nft add rule ip mangle PREROUTING ip daddr 192.0.2.3 counter meta mark set 0x64
# nft add rule ip mangle PREROUTING ip daddr 192.0.2.3 counter meta mark set 0x64
Copy to Clipboard Copied! 将数据包标记保存到连接标记中:
nft add rule ip mangle PREROUTING counter ct mark set mark
# nft add rule ip mangle PREROUTING counter ct mark set mark
Copy to Clipboard Copied! 使用
-s
参数在系统上运行iperf3
工具来作为服务器,然后服务器等待客户端连接的响应:iperf3 -s
# iperf3 -s
Copy to Clipboard Copied!
在客户端上,将
iperf3
作为客户端运行,并连接到在 IP 地址192.0.2.3
上侦听定期的 HTTP 请求响应时间戳的服务器:iperf3 -c 192.0.2.3 | tee rate
# iperf3 -c 192.0.2.3 | tee rate
Copy to Clipboard Copied! 192.0.2.3
是服务器的 IP 地址,而192.0.2.4
是客户端的 IP 地址。按 Ctrl+C 终止服务器上的
iperf3
工具:Accepted connection from 192.0.2.4, port 52128 [5] local 192.0.2.3 port 5201 connected to 192.0.2.4 port 52130 [ID] Interval Transfer Bitrate [5] 0.00-1.00 sec 119 KBytes 973 Kbits/sec [5] 1.00-2.00 sec 116 KBytes 950 Kbits/sec ... [ID] Interval Transfer Bitrate [5] 0.00-14.81 sec 1.51 MBytes 853 Kbits/sec receiver iperf3: interrupt - the server has terminated
Accepted connection from 192.0.2.4, port 52128 [5] local 192.0.2.3 port 5201 connected to 192.0.2.4 port 52130 [ID] Interval Transfer Bitrate [5] 0.00-1.00 sec 119 KBytes 973 Kbits/sec [5] 1.00-2.00 sec 116 KBytes 950 Kbits/sec ... [ID] Interval Transfer Bitrate [5] 0.00-14.81 sec 1.51 MBytes 853 Kbits/sec receiver iperf3: interrupt - the server has terminated
Copy to Clipboard Copied! 按 Ctrl+C 终止客户端上的
iperf3
工具:Connecting to host 192.0.2.3, port 5201 [5] local 192.0.2.4 port 52130 connected to 192.0.2.3 port 5201 [ID] Interval Transfer Bitrate Retr Cwnd [5] 0.00-1.00 sec 481 KBytes 3.94 Mbits/sec 0 76.4 KBytes [5] 1.00-2.00 sec 223 KBytes 1.83 Mbits/sec 0 82.0 KBytes ... [ID] Interval Transfer Bitrate Retr [5] 0.00-14.00 sec 3.92 MBytes 2.35 Mbits/sec 32 sender [5] 0.00-14.00 sec 0.00 Bytes 0.00 bits/sec receiver iperf3: error - the server has terminated
Connecting to host 192.0.2.3, port 5201 [5] local 192.0.2.4 port 52130 connected to 192.0.2.3 port 5201 [ID] Interval Transfer Bitrate Retr Cwnd [5] 0.00-1.00 sec 481 KBytes 3.94 Mbits/sec 0 76.4 KBytes [5] 1.00-2.00 sec 223 KBytes 1.83 Mbits/sec 0 82.0 KBytes ... [ID] Interval Transfer Bitrate Retr [5] 0.00-14.00 sec 3.92 MBytes 2.35 Mbits/sec 32 sender [5] 0.00-14.00 sec 0.00 Bytes 0.00 bits/sec receiver iperf3: error - the server has terminated
Copy to Clipboard Copied!
验证
显示接口上
htb
和sfq
类的数据包计数的统计信息:tc -s qdisc show dev ifb4eth0
# tc -s qdisc show dev ifb4eth0 qdisc htb 1: root ... Sent 26611455 bytes 3054 pkt (dropped 76, overlimits 4887 requeues 0) ... qdisc sfq 8001: parent ... Sent 26535030 bytes 2296 pkt (dropped 76, overlimits 0 requeues 0) ...
Copy to Clipboard Copied! 显示
mirred
和ctinfo
操作的数据包计数的统计信息:tc -s filter show dev enp1s0 ingress
# tc -s filter show dev enp1s0 ingress filter parent ffff: protocol ip pref 49152 u32 chain 0 filter parent ffff: protocol ip pref 49152 u32 chain 0 fh 800: ht divisor 1 filter parent ffff: protocol ip pref 49152 u32 chain 0 fh 800::800 order 2048 key ht 800 bkt 0 terminal flowid not_in_hw (rule hit 8075 success 8075) match 00000000/00000000 at 0 (success 8075 ) action order 1: ctinfo zone 0 pipe index 1 ref 1 bind 1 cpmark 0x00000064 installed 3105 sec firstused 3105 sec DSCP set 0 error 0 CPMARK set 7712 Action statistics: Sent 25891504 bytes 3137 pkt (dropped 0, overlimits 0 requeues 0) backlog 0b 0p requeues 0 action order 2: mirred (Egress Redirect to device ifb4eth0) stolen index 1 ref 1 bind 1 installed 3105 sec firstused 3105 sec Action statistics: Sent 25891504 bytes 3137 pkt (dropped 0, overlimits 61 requeues 0) backlog 0b 0p requeues 0
Copy to Clipboard Copied! 显示
htb
速率限制器及其配置的统计信息:tc -s class show dev ifb4eth0
# tc -s class show dev ifb4eth0 class htb 1:100 root leaf 8001: prio 7 rate 1Mbit ceil 2Mbit burst 1600b cburst 1600b Sent 26541716 bytes 2373 pkt (dropped 61, overlimits 4887 requeues 0) backlog 0b 0p requeues 0 lended: 7248 borrowed: 0 giants: 0 tokens: 187250 ctokens: 93625
Copy to Clipboard Copied!
25.7. RHEL 中可用的 qdiscs
每个 qdisc
解决唯一的与网络相关的问题。以下是 RHEL 中可用的 qdiscs
列表。您可以使用以下任何一个 qdisc
来根据您的网络要求来塑造网络流量。
qdisc 名称 | 包含在 | 卸载支持 |
---|---|---|
基于信用的塑造程序 |
| 是 |
Enhanced Transmission Selection (ETS) |
| 是 |
最早的 TxTime First (ETF) |
| |
Fair Queue (FQ) |
| |
Fair Queuing Controlled Delay (FQ_CODel) |
| |
Generalized Random Early Detection (GRED) |
| |
Hierarchical Fair Service Curve (HSFC) |
| |
Hierarchy Token Bucket (HTB) |
| 是 |
INGRESS |
| 是 |
Multi Queue Priority (MQPRIO) |
| 是 |
Multiqueue (MULTIQ) |
| 是 |
Network Emulator (NETEM) |
| |
Random Early Detection (RED) |
| 是 |
Stochastic Fairness Queueing (SFQ) |
| |
时间感知优先级 Shaper (TAPRIO) |
| |
Token Bucket Filter (TBF) |
| 是 |
qdisc
卸载需要对 NIC 的硬件和驱动程序的支持。
第 26 章 配置 InfiniBand 和 RDMA 网络
您可以使用各种协议在企业级配置和管理Remote Directory Memory Access (RDMA)网络和 InfiniBand 硬件。这包括 InfiniBand (IB)、RDMA over Converged Ethernet (RoCE)、IP 网络协议,如 iWARP、Omni-Path Architecture (OPA)协议作为 RDMA 支持的硬件的原生支持。对于低延迟和高吞吐量连接,您可以配置通过 InfiniBand (IPoIB)的 IP。
26.1. InfiniBand 和 RDMA 简介
InfiniBand 代表两个不同的因素:
- InfiniBand 网络的物理链路协议
- InfiniBand Verbs API,这是 RDMA(remote direct memory access)技术的一个实现
RDMA 提供了跨两个计算机的主要内存访问,而无需涉及操作系统、缓存或存储。通过使用 RDMA,数据传输具有高吞吐量、低延迟和低 CPU 使用率。
在典型的 IP 数据传输中,当机器中的某个应用程序向另一台机器上的应用程序发送数据时,在接收层时会出现以下操作:
- 内核必须接收数据。
- 内核必须确定该数据是否属于该应用程序。
- 内核唤醒应用程序。
- 内核会等待应用程序执行系统调用到内核。
- 应用程序将内核本身的内部内存空间数据复制到应用程序提供的缓冲中。
此过程意味着,如果主机适配器使用直接内存访问(DMA)或至少两次,则大多数网络流量会被复制到系统的主内存中。另外,计算机执行一些上下文开关以在内核和应用程序上下文间进行切换。这些上下文切换可能会导致 CPU 负载高,并会降低其他任务的速度。
与传统的 IP 通信不同,RDMA 通信会绕过通信过程中的内核干预。这可减少 CPU 开销。数据包进入网络后,RDMA 协议可让主机适配器决定哪个应用程序应该接收它,并将其保存在应用程序的内存空间中。主机适配器不将处理发送到内核并将其复制到用户应用程序的内存中,主机适配器直接在应用程序缓冲中放置数据包内容。此过程需要单独的 API、InfiniBand Verbs API 和应用程序需要实施 InfiniBand Verbs API 来使用 RDMA。
Red Hat Enterprise Linux 支持 InfiniBand 硬件和 InfiniBand Verbs API。另外,它支持以下技术在非 InfiniBand 硬件中使用 InfiniBand Verbs API:
- iWARP :通过 IP 网络实现 RDMA 的网络协议
- RDMA over Converged Ethernet (RoCE),也称为 InfiniBand over Ethernet (IBoE):一个通过以太网实现 RDMA 的网络协议
26.2. 配置核心 RDMA 子系统
rdma
服务配置管理网络协议和通信标准,如 InfiniBand、iWARP 和 RoCE。
流程
安装
rdma-core
软件包:dnf install rdma-core
# dnf install rdma-core
Copy to Clipboard Copied!
验证
安装
libibverbs-utils
和infiniband-diags
软件包:dnf install libibverbs-utils infiniband-diags
# dnf install libibverbs-utils infiniband-diags
Copy to Clipboard Copied! 列出可用的 InfiniBand 设备:
ibv_devices
# ibv_devices mlx5_0 946dae0300418002 mlx5_1 946dae0300418003
Copy to Clipboard Copied! 显示
mlx5_0
设备的信息:ibv_devinfo -d mlx5_0
# ibv_devinfo -d mlx5_0 hca_id: mlx5_0 transport: InfiniBand (0) fw_ver: 28.42.1000 node_guid: 946d:ae03:0041:8002 sys_image_guid: 946d:ae03:0041:8002 vendor_id: 0x02c9 vendor_part_id: 4129 hw_ver: 0x0 board_id: MT_0000000834 phys_port_cnt: 1 port: 1 state: PORT_ACTIVE (4) max_mtu: 4096 (5) active_mtu: 4096 (5) sm_lid: 3 port_lid: 66 port_lmc: 0x00 link_layer: InfiniBand
Copy to Clipboard Copied! 显示
mlx5_0
设备的状态:ibstat mlx5_0
# ibstat mlx5_0 CA 'mlx5_0' CA type: MT4129 Number of ports: 1 Firmware version: 28.42.1000 Hardware version: 0 Node GUID: 0x946dae0300418002 System image GUID: 0x946dae0300418002 Port 1: State: Active Physical state: LinkUp Rate: 100 Base lid: 66 LMC: 0 SM lid: 3 Capability mask: 0xa759e848 Port GUID: 0x946dae0300418002 Link layer: InfiniBand
Copy to Clipboard Copied! ibping
程序通过配置参数来 ping InfiniBand 地址并以客户端/服务器运行。在主机上的端口号
-
P-C
InfiniBand 频道适配器(CA)名称:ibping -S -C mlx5_0 -P 1
# ibping -S -C mlx5_0 -P 1
Copy to Clipboard Copied! 启动客户端模式,在主机上使用带有
-L
Local Identifier (LID)的端口号-P
上发送一些数据包-c
:ibping -c 50 -C mlx5_0 -P 1 -L 2
# ibping -c 50 -C mlx5_0 -P 1 -L 2
Copy to Clipboard Copied!
26.3. 配置 IPoIB
默认情况下,InfiniBand 不使用 IP 进行通信。但是,IP over InfiniBand(IPoIB)在 InfiniBand 远程直接访问(RDMA)网络之上提供 IP 网络模拟层。这允许现有未修改的应用程序通过 InfiniBand 网络传输数据,但如果应用程序可以原生使用 RDMA,则性能较低。
在 RHEL 8 和更新的版本中,从 ConnectX-4 开始的 Mellanox 设备默认使用增强 IPoIB 模式(仅数据报)。在这些设备中不支持连接模式。
26.3.1. IPoIB 通讯模式
IPoIB 设备可在 Datagram
或 Connected
模式中配置。区别在于 IPoIB 层试图在通信的另一端机器打开的队列对的类型:
在
Datagram
模式中,系统会打开一个不可靠、断开连接的队列对。这个模式不支持大于 InfiniBand 链路层的最大传输单元(MTU)的软件包。在传输数据时,IPoIB 层在 IP 数据包之上添加了一个 4 字节 IPoIB 标头。因此,IPoIB MTU 比 InfiniBand link-layer MTU 小 4 个字节。因为
2048
是一个常见的 InfiniBand 链路层 MTU,Datagram
模式中的通用 IPoIB 设备 MTU 为2044
。在
Connected
模式中,系统会打开一个可靠、连接的队列对。这个模式允许消息大于 InfiniBand link-layer MTU。主机适配器处理数据包分段和重新装配。因此,在
Connected
模式中,从 Infiniband 适配器发送的消息没有大小限制。但是,由于data
字段和 TCP/IPheader
字段,存在一个 IP 数据包限制。因此,Connected
模式中的 IPoIB MTU 是65520
字节。Connected
模式性能更高,但是消耗更多内核内存。
虽然系统被配置为使用 Connected
模式,但系统仍然使用 Datagram
模式发送多播流量,因为 InfiniBand 交换机和光纤无法在 Connected
模式下传递多播流量。另外,当主机没有配置为使用 Connected
模式时,系统会返回 Datagram
模式。
在运行应用程序时,在接口上将多播数据发送到 MTU 时,在 Datagram
模式中配置接口,或者将应用程序配置为对数据包的数据包的发送大小上限。
26.3.2. 了解 IPoIB 硬件地址
ipoib 设备有 20
个字节硬件地址,它由以下部分组成:
- 前 4 个字节是标志和队列对号。
接下来的 8 个字节是子网前缀
默认子网前缀为
0xfe:80:00:00:00:00:00:00
。设备连接到子网管理器后,设备会更改此前缀以匹配配置的子网管理器。- 最后 8 个字节是 IPoIB 设备附加到的 InfiniBand 端口的全局唯一标识符(GUID)。
因为前 12 个字节可以更改,因此请不要在 udev
设备管理器规则中使用它们。
26.3.3. 使用 systemd 链接文件重命名 IPoIB 设备
默认情况下,内核会命名 IP over InfiniBand (IPoIB) 设备,例如 ib0
、ib1
等等。为避免冲突,请创建一个 systemd
链接文件来创建持久且有意义的名称,如 mlx5_ib0
。
先决条件
- 您已安装了一个 InfiniBand 设备。
流程
显示设备
ib0
的硬件地址:ip addr show ib0
# ip addr show ib0 7: ib0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 65520 qdisc fq_codel state UP group default qlen 256 link/infiniband 00:00:10:71:fe:80:00:00:00:00:00:00:94:6d:ae:03:00:41:80:02 brd 00:ff:ff:ff:ff:12:40:1b:ff:ff:00:00:00:00:00:00:ff:ff:ff:ff altname ibp7s0 altname ibs2 inet 172.31.0.181/24 brd 172.31.0.255 scope global dynamic noprefixroute ib0 valid_lft 2899sec preferred_lft 2899sec inet6 fe80::f652:1403:7b:e1b1/64 scope link noprefixroute valid_lft forever preferred_lft forever
Copy to Clipboard Copied! 要将 MAC 地址为
00:00:10:71:fe:80:00:00:00:00:00:00:94:6d:ae:03:00:41:80:02
的接口命名为mlx5_ib0
,请创建包含以下内容的/etc/systemd/network/70-custom-ifnames.link
文件:[Match] MACAddress=00:00:10:71:fe:80:00:00:00:00:00:00:94:6d:ae:03:00:41:80:02 [Link] Name=_mlx5_ib0
[Match] MACAddress=00:00:10:71:fe:80:00:00:00:00:00:00:94:6d:ae:03:00:41:80:02 [Link] Name=_mlx5_ib0
Copy to Clipboard Copied! 此链接文件与 MAC 地址相匹配,并将网络接口重命名为
Name
参数中设置的名称。
验证
重启主机:
reboot
# reboot
Copy to Clipboard Copied! 验证链接文件中指定的 MAC 地址的设备是否已分配给
mlx5_ib0
:ip addr show mlx5_ib0
# ip addr show mlx5_ib0 3: mlx5_ib0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 2044 qdisc mq state UP group default qlen 1000 link/infiniband 00:00:00:8c:fe:80:00:00:00:00:00:00:94:6d:ae:03:00:41:80:02 brd 00:ff:ff:ff:ff:12:40:1b:ff:ff:00:00:00:00:00:00:ff:ff:ff:ff altname ibp196s0f0 altname ibs2f0 inet 172.31.0.40/24 brd 172.31.0.255 scope global dynamic noprefixroute mlx5_ib0 valid_lft 2497sec preferred_lft 2497sec inet6 fe80::6a6d:6879:7ccf:34c7/64 scope link noprefixroute valid_lft forever preferred_lft forever
Copy to Clipboard Copied!
26.3.4. 使用 nmcli
配置 IPoIB 连接
您可以使用 nmcli
工具在命令行上通过 InfiniBand 连接创建 IP。
先决条件
- InfiniBand 设备已安装在服务器上
- 加载对应的内核模块
流程
创建 InfiniBand 连接,在
Connected
传输模式中使用mlx5_ib0
接口和最大 MTU65520
字节:nmcli connection add type infiniband con-name mlx5_ib0 ifname mlx5_ib0 transport-mode Connected mtu 65520
# nmcli connection add type infiniband con-name mlx5_ib0 ifname mlx5_ib0 transport-mode Connected mtu 65520
Copy to Clipboard Copied! 设置
P_Key
,例如:nmcli connection modify mlx5_ib0 infiniband.p-key 0x8002
# nmcli connection modify mlx5_ib0 infiniband.p-key 0x8002
Copy to Clipboard Copied! 配置 IPv4 设置:
要使用 DHCP,请输入:
nmcli connection modify mlx5_ib0 ipv4.method auto
# nmcli connection modify mlx5_ib0 ipv4.method auto
Copy to Clipboard Copied! 如果
ipv4.method
已设置为auto
(默认),请跳过这一步。要设置静态 IPv4 地址、网络掩码、默认网关、DNS 服务器和搜索域,请输入:
nmcli connection modify mlx5_ib0 ipv4.method manual ipv4.addresses 192.0.2.1/24 ipv4.gateway 192.0.2.254 ipv4.dns 192.0.2.200 ipv4.dns-search example.com
# nmcli connection modify mlx5_ib0 ipv4.method manual ipv4.addresses 192.0.2.1/24 ipv4.gateway 192.0.2.254 ipv4.dns 192.0.2.200 ipv4.dns-search example.com
Copy to Clipboard Copied!
配置 IPv6 设置:
要使用无状态地址自动配置(SLAAC),请输入:
nmcli connection modify mlx5_ib0 ipv6.method auto
# nmcli connection modify mlx5_ib0 ipv6.method auto
Copy to Clipboard Copied! 如果
ipv6.method
已设置为auto
(默认),请跳过这一步。要设置静态 IPv6 地址、网络掩码、默认网关、DNS 服务器和搜索域,请输入:
nmcli connection modify mlx5_ib0 ipv6.method manual ipv6.addresses 2001:db8:1::fffe/64 ipv6.gateway 2001:db8:1::fffe ipv6.dns 2001:db8:1::ffbb ipv6.dns-search example.com
# nmcli connection modify mlx5_ib0 ipv6.method manual ipv6.addresses 2001:db8:1::fffe/64 ipv6.gateway 2001:db8:1::fffe ipv6.dns 2001:db8:1::ffbb ipv6.dns-search example.com
Copy to Clipboard Copied!
要在配置文件中自定义其他设置,请使用以下命令:
nmcli connection modify mlx5_ib0 <setting> <value>
# nmcli connection modify mlx5_ib0 <setting> <value>
Copy to Clipboard Copied! 用空格或分号将值括起来。
激活配置文件:
nmcli connection up mlx5_ib0
# nmcli connection up mlx5_ib0
Copy to Clipboard Copied!
验证
使用
ping
工具将 ICMP 数据包发送到远程主机的 InfiniBand 适配器,例如:ping -c5 192.0.2.2
# ping -c5 192.0.2.2
Copy to Clipboard Copied!
26.3.5. 使用 network
RHEL 系统角色配置 IPoIB 连接
您可以使用 IP over InfiniBand (IPoIB),通过 InfiniBand 接口发送 IP 数据包。要配置 IPoIB,请创建一个 NetworkManager 连接配置文件。通过使用 Ansible 和 network
系统角色,您可以自动化此过程,并对 playbook 中定义的主机远程配置连接配置文件。
您可以使用 network
RHEL 系统角色配置 IPoIB,如果 InfiniBand 的父设备的连接配置文件不存在,角色也可以创建它。
先决条件
- 您已准备好控制节点和受管节点
- 以可在受管主机上运行 playbook 的用户登录到控制节点。
-
您用于连接到受管节点的帐户对它们具有
sudo
权限。 -
名为
mlx5_ib0
的 InfiniBand 设备安装在受管节点中。 - 受管节点使用 NetworkManager 配置网络。
流程
创建一个包含以下内容的 playbook 文件,如
~/playbook.yml
:--- - name: Configure the network hosts: managed-node-01.example.com tasks: - name: IPoIB connection profile with static IP address settings ansible.builtin.include_role: name: redhat.rhel_system_roles.network vars: network_connections: # InfiniBand connection mlx5_ib0 - name: mlx5_ib0 interface_name: mlx5_ib0 type: infiniband # IPoIB device mlx5_ib0.8002 on top of mlx5_ib0 - name: mlx5_ib0.8002 type: infiniband autoconnect: yes infiniband: p_key: 0x8002 transport_mode: datagram parent: mlx5_ib0 ip: address: - 192.0.2.1/24 - 2001:db8:1::1/64 state: up
--- - name: Configure the network hosts: managed-node-01.example.com tasks: - name: IPoIB connection profile with static IP address settings ansible.builtin.include_role: name: redhat.rhel_system_roles.network vars: network_connections: # InfiniBand connection mlx5_ib0 - name: mlx5_ib0 interface_name: mlx5_ib0 type: infiniband # IPoIB device mlx5_ib0.8002 on top of mlx5_ib0 - name: mlx5_ib0.8002 type: infiniband autoconnect: yes infiniband: p_key: 0x8002 transport_mode: datagram parent: mlx5_ib0 ip: address: - 192.0.2.1/24 - 2001:db8:1::1/64 state: up
Copy to Clipboard Copied! 示例 playbook 中指定的设置包括如下:
type: <profile_type>
- 设置要创建的配置文件的类型。示例 playbook 创建两个连接配置文件:一个用于 InfiniBand 连接,一个用于 IPoIB 设备。
parent: <parent_device>
- 设置 IPoIB 连接配置文件的父设备。
p_key: <value>
-
设置 InfiniBand 分区密钥。如果您设置了此变量,请不要在 IPoIB 设备上设置
interface_name
。 transport_mode: <mode>
-
设置 IPoIB 连接操作模式。您可以将此变量设置为
datagram
(默认)或connected
。
有关 playbook 中使用的所有变量的详情,请查看控制节点上的
/usr/share/ansible/roles/rhel-system-roles.network/README.md
文件。验证 playbook 语法:
ansible-playbook --syntax-check ~/playbook.yml
$ ansible-playbook --syntax-check ~/playbook.yml
Copy to Clipboard Copied! 请注意,这个命令只验证语法,不能防止错误的、但有效的配置。
运行 playbook:
ansible-playbook ~/playbook.yml
$ ansible-playbook ~/playbook.yml
Copy to Clipboard Copied!
验证
显示
mlx5_ib0.8002
设备的 IP 设置:ansible managed-node-01.example.com -m command -a 'ip address show mlx5_ib0.8002'
# ansible managed-node-01.example.com -m command -a 'ip address show mlx5_ib0.8002' managed-node-01.example.com | CHANGED | rc=0 >> ... inet 192.0.2.1/24 brd 192.0.2.255 scope global noprefixroute ib0.8002 valid_lft forever preferred_lft forever inet6 2001:db8:1::1/64 scope link tentative noprefixroute valid_lft forever preferred_lft forever
Copy to Clipboard Copied! 显示
mlx5_ib0.8002
设备的分区密钥(P_Key):ansible managed-node-01.example.com -m command -a 'cat /sys/class/net/mlx5_ib0.8002/pkey' managed-node-01.example.com | CHANGED | rc=0 >> 0x8002
# ansible managed-node-01.example.com -m command -a 'cat /sys/class/net/mlx5_ib0.8002/pkey' managed-node-01.example.com | CHANGED | rc=0 >> 0x8002
Copy to Clipboard Copied! 显示
mlx5_ib0.8002
设备的模式:ansible managed-node-01.example.com -m command -a 'cat /sys/class/net/mlx5_ib0.8002/mode' managed-node-01.example.com | CHANGED | rc=0 >> datagram
# ansible managed-node-01.example.com -m command -a 'cat /sys/class/net/mlx5_ib0.8002/mode' managed-node-01.example.com | CHANGED | rc=0 >> datagram
Copy to Clipboard Copied!
26.3.6. 使用 nmstatectl
配置 IPoIB 连接
您可以使用 nmstatectl
工具通过 Nmstate API 配置 IP over InfiniBand (IPoIB)连接。Nmstate API 确保设置配置后结果与配置文件匹配。如果有任何失败,nmstatectl
会自动回滚更改以避免系统处于不正确的状态。
先决条件
- InfiniBand 设备已安装在服务器上。
- 加载 InfiniBand 设备的内核模块。
流程
创建包含以下内容的 YAML 文件,如
~/create-IPoIB-profile.yml
:interfaces: - name: mlx5_ib0.8002 type: infiniband 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 infiniband: base-iface: "mlx5_ib0" mode: datagram pkey: "0x8002" routes: config: - destination: 0.0.0.0/0 next-hop-address: 192.0.2.254 next-hop-interface: mlx5_ib0.8002 - destination: ::/0 next-hop-address: 2001:db8:1::fffe next-hop-interface: mlx5_ib0.8002
interfaces: - name: mlx5_ib0.8002 type: infiniband 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 infiniband: base-iface: "mlx5_ib0" mode: datagram pkey: "0x8002" routes: config: - destination: 0.0.0.0/0 next-hop-address: 192.0.2.254 next-hop-interface: mlx5_ib0.8002 - destination: ::/0 next-hop-address: 2001:db8:1::fffe next-hop-interface: mlx5_ib0.8002
Copy to Clipboard Copied! IPoIB 连接现在有以下设置:
-
IPOIB 设备名称:
mlx5_ib0.8002
-
基本接口(父):
mlx5_ib0
-
InfiniBand partition key:
0x8002
-
传输模式:data
gram
-
静态 IPv4 地址:
192.0.2.1
,子网掩码为/24
-
静态 IPv6 地址:
2001:db8:1::1
,子网掩码为/64
-
IPv4 默认网关:
192.0.2.254
-
IPv6 默认网关:
2001:db8:1::fffe
-
IPOIB 设备名称:
将设置应用到系统:
nmstatectl apply ~/create-IPoIB-profile.yml
# nmstatectl apply ~/create-IPoIB-profile.yml
Copy to Clipboard Copied!
验证
显示
mlx5_ib0.8002
设备的 IP 设置:ip address show mlx5_ib0.8002
# ip address show mlx5_ib0.8002 ... inet 192.0.2.1/24 brd 192.0.2.255 scope global noprefixroute ib0.8002 valid_lft forever preferred_lft forever inet6 2001:db8:1::1/64 scope link tentative noprefixroute valid_lft forever preferred_lft forever
Copy to Clipboard Copied! 显示
mlx5_ib0.8002
设备的分区密钥(P_Key):cat /sys/class/net/mlx5_ib0.8002/pkey 0x8002
# cat /sys/class/net/mlx5_ib0.8002/pkey 0x8002
Copy to Clipboard Copied! 显示
mlx5_ib0.8002
设备的模式:cat /sys/class/net/mlx5_ib0.8002/mode datagram
# cat /sys/class/net/mlx5_ib0.8002/mode datagram
Copy to Clipboard Copied!
26.3.7. 配置 IPoIB 后,使用 iperf3 测试 RDMA 网络
在以下示例中,大型缓冲区大小用于执行 60 秒测试,以测量最大吞吐量,并使用 iperf3
工具充分利用两台主机之间的带宽和延迟。
先决条件
- 您已在两个主机上配置了 IPoIB。
流程
要在系统中运行
iperf3
作为服务器,定义一个时间间隔,以提供定期带宽更新-i
以侦听,作为一个服务器-s
,等待客户端连接的响应:iperf3 -i 5 -s
# iperf3 -i 5 -s
Copy to Clipboard Copied! 要作为客户端在另一个系统上运行
iperf3
,请定义一个间隔,提供定期带宽更新-i
连接到侦听的服务器-c
连接到 IP 地址192.168.2.2
和-t
秒(以秒为单位):iperf3 -i 5 -t 60 -c 192.168.2.2
# iperf3 -i 5 -t 60 -c 192.168.2.2
Copy to Clipboard Copied! 使用以下命令:
在作为服务器的系统中显示测试结果:
iperf3 -i 10 -s
# iperf3 -i 10 -s ----------------------------------------------------------- Server listening on 5201 ----------------------------------------------------------- Accepted connection from 192.168.2.3, port 22216 [5] local 192.168.2.2 port 5201 connected to 192.168.2.3 port 22218 [ID] Interval Transfer Bandwidth [5] 0.00-10.00 sec 17.5 GBytes 15.0 Gbits/sec [5] 10.00-20.00 sec 17.6 GBytes 15.2 Gbits/sec [5] 20.00-30.00 sec 18.4 GBytes 15.8 Gbits/sec [5] 30.00-40.00 sec 18.0 GBytes 15.5 Gbits/sec [5] 40.00-50.00 sec 17.5 GBytes 15.1 Gbits/sec [5] 50.00-60.00 sec 18.1 GBytes 15.5 Gbits/sec [5] 60.00-60.04 sec 82.2 MBytes 17.3 Gbits/sec - - - - - - - - - - - - - - - - - - - - - - - - - [ID] Interval Transfer Bandwidth [5] 0.00-60.04 sec 0.00 Bytes 0.00 bits/sec sender [5] 0.00-60.04 sec 107 GBytes 15.3 Gbits/sec receiver
Copy to Clipboard Copied! 在作为客户端的系统中显示测试结果:
iperf3 -i 1 -t 60 -c 192.168.2.2
# iperf3 -i 1 -t 60 -c 192.168.2.2 Connecting to host 192.168.2.2, port 5201 [4] local 192.168.2.3 port 22218 connected to 192.168.2.2 port 5201 [ID] Interval Transfer Bandwidth Retr Cwnd [4] 0.00-10.00 sec 17.6 GBytes 15.1 Gbits/sec 0 6.01 MBytes [4] 10.00-20.00 sec 17.6 GBytes 15.1 Gbits/sec 0 6.01 MBytes [4] 20.00-30.00 sec 18.4 GBytes 15.8 Gbits/sec 0 6.01 MBytes [4] 30.00-40.00 sec 18.0 GBytes 15.5 Gbits/sec 0 6.01 MBytes [4] 40.00-50.00 sec 17.5 GBytes 15.1 Gbits/sec 0 6.01 MBytes [4] 50.00-60.00 sec 18.1 GBytes 15.5 Gbits/sec 0 6.01 MBytes - - - - - - - - - - - - - - - - - - - - - - - - - [ID] Interval Transfer Bandwidth Retr [4] 0.00-60.00 sec 107 GBytes 15.4 Gbits/sec 0 sender [4] 0.00-60.00 sec 107 GBytes 15.4 Gbits/sec receiver
Copy to Clipboard Copied!
26.4. 配置 RoCE
通过融合以太网的远程直接内存访问(RDMA)是一种网络协议,它通过以太网网络利用 RDMA。对于配置,RoCE 需要特定的硬件,并且一些硬件供应商是 Mellanox、Broadcom 和 QLogic。
26.4.1. RoCE 协议版本概述
以下是不同的 RoCE 版本:
- RoCE v1
-
RoCE 版本 1 协议是一个以太网链路层协议,带有 Ethertype
0x8915
,它允许同一以太网广播域中的任何两个主机间的通信。 - RoCE v2
-
RoCE 版本 2 协议在 IPv4 或 IPv6 协议的 UDP 上存在。对于 RoCE v2,UDP 目标端口号为
4791
。
RDMA_CM 设置客户端和服务器之间用来传输数据的可靠连接。RDMA_CM 为建立连接提供了一个与 RDMA 传输相关的接口。这个通信使用特定的 RDMA 设备和基于消息的数据传输。
不支持在客户端中使用 RoCE v2 和 server 上的 RoCE v1。在这种情况下,将服务器和客户端都配置为通过 RoCE v1 进行通信。
RoCE v1 在 Data Link layer(Layer 2)工作,它只支持同一网络中的两台计算机的通信。默认情况下,RoCE v2 可用。它适用于网络层(Layer 3)。RoCE v2 支持数据包路由,它提供与多个以太网的连接。
26.4.2. 临时更改默认 RoCE 版本
在客户端中使用 RoCE v2 协议,并不支持服务器上的 RoCE v1。如果您的服务器中的硬件只支持 RoCE v1,请为 RoCE v1 配置客户端,来与服务器进行通信。例如,您可以为只支持 RoCE v1 的 Mellanox ConnectX-5 InfiniBand 设备配置使用 mlx5_0
驱动程序的客户端。
此处描述的更改将保持有效,直到您重启主机。
先决条件
- 客户端使用带有 RoCE v2 协议的 InfiniBand 设备。
- 服务器使用只支持 RoCE v1 的 InfiniBand 设备。
流程
创建
/sys/kernel/config/rdma_cm/mlx5_0/
目录:mkdir /sys/kernel/config/rdma_cm/mlx5_0/
# mkdir /sys/kernel/config/rdma_cm/mlx5_0/
Copy to Clipboard Copied! 显示默认 RoCE 模式:
cat /sys/kernel/config/rdma_cm/mlx5_0/ports/1/default_roce_mode RoCE v2
# cat /sys/kernel/config/rdma_cm/mlx5_0/ports/1/default_roce_mode RoCE v2
Copy to Clipboard Copied! 将默认 RoCE 模式改为版本 1:
echo "IB/RoCE v1" > /sys/kernel/config/rdma_cm/mlx5_0/ports/1/default_roce_mode
# echo "IB/RoCE v1" > /sys/kernel/config/rdma_cm/mlx5_0/ports/1/default_roce_mode
Copy to Clipboard Copied!
26.5. 增加用户可以在系统中固定的内存量
远程直接内存访问(RDMA)操作需要固定物理内存。因此,内核不允许将内存写入交换空间。如果用户固定太多内存,系统会耗尽内存,并且内核会终止进程来释放更多内存。因此,内存固定是一个特权操作。
如果非 root 用户需要运行大型 RDMA 应用程序,则需要增加内存量,以便在主内存中一直保持页面固定。
流程
以
root
用户身份,创建具有以下内容的文件/etc/security/limits.conf
:@rdma soft memlock unlimited @rdma hard memlock unlimited
@rdma soft memlock unlimited @rdma hard memlock unlimited
Copy to Clipboard Copied! 详情请查看您系统中的
limits.conf (5)
手册页。
验证
在编辑
/etc/security/limits.conf
文件后,以rdma
组的成员登录。请注意,当用户登录时,Red Hat Enterprise Linux 会应用更新的
ulimit
设置。使用
ulimit -l
命令显示限制:ulimit -l
$ ulimit -l unlimited
Copy to Clipboard Copied! 如果命令返回
unlimited
,用户可以获得无限数量的内存。
26.6. 在 NFS 服务器上启用 NFS over RDMA
远程直接内存访问(RDMA)是一种协议,它使客户端系统将数据直接从存储服务器的内存传到其自己的内存。这提高了存储吞吐量,降低了服务器和客户端之间数据传输的延迟,并减少了两端的 CPU 负载。如果 NFS 服务器和客户端都通过 RDMA 连接在一起,则客户端可以使用 NFSoRDMA 来挂载导出的目录。
先决条件
- NFS 服务正在运行且已配置
- 服务器上安装了 InfiniBand 或 RDMA over Converged Ethernet (RoCE)设备。
- IP over InfiniBand (IPoIB)已在服务器上配置,InfiniBand 设备已分配了一个 IP 地址。
流程
安装
rdma-core
软件包:dnf install rdma-core
# dnf install rdma-core
Copy to Clipboard Copied! 如果软件包已安装,请验证
/etc/rdma/modules/rdma.conf
文件中的xprtrdma
和svcrdma
模块是否已取消注释:NFS over RDMA client support NFS over RDMA server support
# NFS over RDMA client support xprtrdma # NFS over RDMA server support svcrdma
Copy to Clipboard Copied! 可选:默认情况下,RDMA 上的 NFS 使用端口 20049。如果要使用不同的端口,请在
/etc/nfs.conf
文件的[nfsd]
部分中设置rdma-port
设置:rdma-port=<port>
rdma-port=<port>
Copy to Clipboard Copied! 在
firewalld
中打开 NFSoRDMA 端口:firewall-cmd --permanent --add-port={20049/tcp,20049/udp} firewall-cmd --reload
# firewall-cmd --permanent --add-port={20049/tcp,20049/udp} # firewall-cmd --reload
Copy to Clipboard Copied! 如果您设置了与 20049 不同的端口,请调整端口号。
重启
nfs-server
服务:systemctl restart nfs-server
# systemctl restart nfs-server
Copy to Clipboard Copied!
验证
在带有 InfiniBand 硬件的客户端上执行以下步骤:
安装以下软件包:
dnf install nfs-utils rdma-core
# dnf install nfs-utils rdma-core
Copy to Clipboard Copied! 通过 RDMA 挂载导出的 NFS 共享:
mount -o rdma server.example.com:/nfs/projects/ /mnt/
# mount -o rdma server.example.com:/nfs/projects/ /mnt/
Copy to Clipboard Copied! 如果您设置了与默认端口号(20049)不同的端口号,请将 port
= <port_number>
传给命令:mount -o rdma,port=<port_number> server.example.com:/nfs/projects/ /mnt/
# mount -o rdma,port=<port_number> server.example.com:/nfs/projects/ /mnt/
Copy to Clipboard Copied! 验证共享是否已使用
rdma
选项挂载了:mount | grep "/mnt"
# mount | grep "/mnt" server.example.com:/nfs/projects/ on /mnt type nfs (...,proto=rdma,...)
Copy to Clipboard Copied!
26.7. InfiniBand 子网管理器
所有 InfiniBand 网络都必须运行子网管理器才能正常工作。即使两台机器没有使用交换机直接进行连接,也是如此。
有可能有一个以上的子网管理器。在这种情况下,其中一个充当控制器,另一个子网管理器充当一个在主子网管理器失败时接管的端口。
Red Hat Enterprise Linux 提供了 OpenSM
, InfiniBand 子网管理器的一种实现。但是,OpenSM
的功能是有限的,且没有活跃的上游开发。通常,InfiniBand 交换机中嵌入的子网管理器提供更多功能,并支持最新的 InfiniBand 硬件。详情请查看 安装和配置 OpenSM InfiniBand 子网管理器。