第 12 章 配置基于策略的路由来定义备用路由
默认情况下,RHEL 中的内核决定使用路由表根据目标地址转发网络数据包。基于策略的路由允许您配置复杂的路由场景。例如,您可以根据各种条件来路由数据包,如源地址、数据包元数据或协议。
本节论述了如何使用 NetworkManager 配置基于策略的路由。
注意
在使用 NetworkManager 的系统中,只有
nmcli
实用程序支持设置路由规则,并将路由分配到特定表。
12.1. 将流量从特定子网路由到不同的默认网关
本节论述了如何将 RHEL 配置为默认路由将所有流量路由到互联网供应商 A 的路由器。使用基于策略的路由,RHEL 会将从内部工作站子网接收的流量路由到供应商 B。
该流程假设以下网络拓扑:
图 12.1. 激活连接
先决条件
- 要在流程中设置的 RHEL 路由器有四个网络接口:
enp7s0
接口连接到供应商 A 的网络。提供商网络中的网关 IP 是198.51.100.2
,网络使用a/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 命令创建 NetworkManager 连接配置集。以下列表描述了该命令的选项:键入 ethernet
:定义连接类型为 Ethernet。con-name connection_name
:设置配置集的名称。使用有意义的名称以避免混淆。ifname network_device
:设置网络接口。ipv4.method 手册
:启用配置静态 IP 地址。ipv4.addresses IP_address/subnet_mask
:设置 IPv4 地址和子网掩码。ipv4.gateway IP_address
:设置默认网关地址。ipv4.dns IP_of_DNS_server
:设置 DNS 服务器的 IPv4 地址。connection.zone firewalld_zone
:将网络接口分配给定义的firewalld
区域。请注意,firewalld
自动启用分配给外部区的伪装接口。
- 将网络接口配置为供应商 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/1 192.0.2.2 table=5000, 128.0.0.0/1 192.0.2.2 table=5000" connection.zone external
这个命令使用ipv4.routes
参数而不是ipv4.gateway
来设置默认网关。这需要将此连接的默认网关分配到不同于默认值的路由表(5000)。当连接被激活时,NetworkManager 会自动创建这个新的路由表。注意nmcli
实用程序不支持将0.0.0.0/0
用于ipv4.gateway
中的默认网关。为临时解决这个问题,命令为0.0.0.0/1 和
子网创建单独的路由,其中也包括完整的 IPv4 地址空间。128.0.0.0/1
- 将网络接口配置为内部工作站子网:
# nmcli connection add type ethernet con-name Internal-Workstations ifname enp8s0 ipv4.method manual ipv4.addresses 10.0.0.1/24 ipv4.routes "10.0.0.0/24 src=192.0.2.1 table=5000" ipv4.routing-rules "priority 5 from 10.0.0.0/24 table 5000" connection.zone trusted
这个命令使用ipv4.routes
参数将静态路由添加到路由表中 ID 为 5000。10.0.0.0/24
子网的这一静态路由使用本地网络接口的 IP 地址到供应商 B(192.0.2.1)作为下一跃点
。另外,该命令使用ipv4.routing-rules
参数添加优先级为 5 的路由规则,该规则将10.0.0.0/24
子网的流量路由到表 5000。低的值具有更高的优先级。请注意,ipv4.routing-rules
参数中的语法与 ip route add 命令中的语法相同,但ipv4.routing-rules
始终需要指定优先级。 - 将网络接口配置为服务器子网:
# nmcli connection add type ethernet con-name Servers ifname enp9s0 ipv4.method manual ipv4.addresses 203.0.113.1/24 connection.zone trusted
验证步骤
- 在内部工作站子网的 RHEL 主机上:
- 安装 traceroute 软件包:
# yum install traceroute
- 使用
traceroute
工具显示到互联网主机的路由:# traceroute redhat.com traceroute to redhat.com (209.132.183.105), 30 hops max, 60 byte packets 1 10.0.0.1 (10.0.0.1) 0.337 ms 0.260 ms 0.223 ms 2 192.0.2.1 (192.0.2.1) 0.884 ms 1.066 ms 1.248 ms ...
命令的输出显示路由器通过192.0.2.1
(提供商 B 的网络)发送数据包。
- 在服务器子网的 RHEL 主机上:
- 安装 traceroute 软件包:
# yum install traceroute
- 使用
traceroute
工具显示到互联网主机的路由:# traceroute redhat.com traceroute to redhat.com (209.132.183.105), 30 hops max, 60 byte packets 1 203.0.113.1 (203.0.113.1) 2.179 ms 2.073 ms 1.944 ms 2 198.51.100.2 (198.51.100.2) 1.868 ms 1.798 ms 1.549 ms ...
命令的输出显示路由器通过198.51.100.2
发送数据包,即供应商 A 的网络。
故障排除步骤
在 RHEL 路由器中:
- 显示规则列表:
# 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
- 显示表 5000 中的路由:
# ip route list table 5000 0.0.0.0/1 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 128.0.0.0/1 via 192.0.2.2 dev enp1s0 proto static metric 100
- 显示将哪些接口分配给哪些防火墙区:
# firewall-cmd --get-active-zones external interfaces: enp1s0 enp7s0 trusted interfaces: enp8s0 enp9s0
- 验证外部区是否启用了伪装 :
# firewall-cmd --info-zone=external external (active) target: default icmp-block-inversion: no interfaces: enp1s0 enp7s0 sources: services: ssh ports: protocols: masquerade: yes ...
其它资源
- 有关您可以在 nmcli connection add 命令中设置的 nm-settings(5) 参数的详情,请查看
ipv4.*
man page 中的 IPv4 设置 部分。 - 有关您可以在 nmcli connection add 命令中设置的 nm-settings(5) 参数的详情,请查看
connection.*
man page 中的 Connection 设置 部分。 - 有关使用 nmcli 管理 NetworkManager 连接的详情,请查看 nmcli(1) man page 中的 连接管理命令 部分。