Red Hat Training

A Red Hat training course is available for Red Hat Enterprise Linux

第 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 服务已启用并激活,这是默认设置。

流程

  1. 将网络接口配置为供应商 A:
    # nmcli connection add type ethernet con-name Provider-A ifname enp7s0 ipv4.method manual ipv4.addresses 198.51.100.1/30 ipv4.gateway 198.51.100.2 ipv4.dns 198.51.100.200 connection.zone external
    nmcli connection add 命令创建 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 自动启用分配给外部区的伪装接口
  2. 将网络接口配置为供应商 B:
    # nmcli connection add type ethernet con-name Provider-B ifname enp1s0 ipv4.method manual ipv4.addresses 192.0.2.1/30 ipv4.routes "0.0.0.0/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 和 128.0.0.0/1 子网创建单独的路由,其中也包括完整的 IPv4 地址空间。
  3. 将网络接口配置为内部工作站子网:
    # nmcli connection add type ethernet con-name Internal-Workstations ifname enp8s0 ipv4.method manual ipv4.addresses 10.0.0.1/24 ipv4.routes "10.0.0.0/24 src=192.0.2.1 table=5000" ipv4.routing-rules "priority 5 from 10.0.0.0/24 table 5000" connection.zone trusted
    这个命令使用 ipv4.routes 参数将静态路由添加到路由表中 ID 为 500010.0.0.0/24 子网的这一静态路由使用本地网络接口的 IP 地址到供应商 B(192.0.2.1)作为下一跃点
    另外,该命令使用 ipv4.routing-rules 参数添加优先级为 5 的路由规则,该规则将 10.0.0.0/24 子网的流量路由到表 5000。低的值具有更高的优先级。
    请注意,ipv4.routing-rules 参数中的语法与 ip route add 命令中的语法相同,但 ipv4.routing-rules 始终需要指定优先级。
  4. 将网络接口配置为服务器子网:
    # nmcli connection add type ethernet con-name Servers ifname enp9s0 ipv4.method manual ipv4.addresses 203.0.113.1/24 connection.zone trusted

验证步骤

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

故障排除步骤

在 RHEL 路由器中:
  1. 显示规则列表:
    # ip rule list
    0:	from all lookup local
    5: from 10.0.0.0/24 lookup 5000
    32766:	from all lookup main
    32767:	from all lookup default
  2. 显示表 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
  3. 显示将哪些接口分配给哪些防火墙区:
    # firewall-cmd --get-active-zones
    external
      interfaces: enp1s0 enp7s0
    trusted
      interfaces: enp8s0 enp9s0
  4. 验证外部区是否启用了伪装
    # 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 中的 连接管理命令 部分。