Red Hat Training

A Red Hat training course is available for RHEL 8

第 22 章 配置基于策略的路由以定义其他路由

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

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

注意

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

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

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

该流程假设以下网络拓扑:

policy based routing

先决条件

  • 系统使用 NetworkManager 配置网络,这是 RHEL 8 中的默认设置。
  • 要在流程中设置的 RHEL 路由器有四个网络接口:

    • enp7s0 接口连接到供应商 A 的网络。提供商网络中的网关 IP 是 198.51.100.2,网络使用了 /30 网络掩码。
    • enp1s0 接口连接到供应商 B 的网络。提供商网络中的网关 IP 是 192.0.2.2,网络使用了 /30 网络掩码。
    • enp8s0 接口使用内部工作站连接到 10.0.0.0/24 子网。
    • enp9s0 界面连接到有公司服务器的 203.0.113.0/24 子网。
  • 内部工作站子网中的主机使用 10.0.0.1 作为默认网关。在此过程中,您可以将此 IP 地址分配给路由器的 enp8s0 网络接口。
  • 服务器子网中的主机使用 203.0.113.1 作为默认网关。在此过程中,您可以将此 IP 地址分配给路由器的 enp9s0 网络接口。
  • firewalld 服务已启用并激活。

流程

  1. 将网络接口配置为供应商 A:

    # nmcli connection add type ethernet con-name Provider-A ifname enp7s0 ipv4.method manual ipv4.addresses 198.51.100.1/30 ipv4.gateway 198.51.100.2 ipv4.dns 198.51.100.200 connection.zone external

    nmcli connection add 命令创建网络管理器连接配置集。以下列表描述了该命令的选项:

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

    # nmcli connection add type ethernet con-name Provider-B ifname enp1s0 ipv4.method manual ipv4.addresses 192.0.2.1/30 ipv4.routes "0.0.0.0/0 192.0.2.2 table=5000" connection.zone external

    这个命令使用 ipv4.routes 参数而不是 ipv4.gateway 设置默认网关。这需要为这个连接分配默认网关到不同的路由表(5000)而不是默认路由表。当连接被激活时,NetworkManager 会自动创建这个新的路由表。

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

    # nmcli connection add type ethernet con-name Internal-Workstations ifname enp8s0 ipv4.method manual ipv4.addresses 10.0.0.1/24 ipv4.routes "10.0.0.0/24 src=192.0.2.1 table=5000" ipv4.routing-rules "priority 5 from 10.0.0.0/24 table 5000" connection.zone internal

    此命令使用 ipv4.routes 参数将静态路由添加到路由表, ID 为 500010.0.0.0/24 子网的这个静态路由使用本地网络接口的 IP 地址到供应商 B(192.0.2.1)作为下一跳。

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

    请注意,ipv4.routing-rules 参数中的语法与 ip route add 命令中的语法相同,不过 ipv4.routing-rules 始终需要指定优先级。

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

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

验证步骤

  1. 在内部工作站子网的 RHEL 主机上:

    1. 安装 traceroute 软件包:

      # yum install traceroute
    2. 使用 traceroute 工具显示到互联网主机的路由:

      # traceroute redhat.com
      traceroute to redhat.com (209.132.183.105), 30 hops max, 60 byte packets
       1  10.0.0.1 (10.0.0.1)     0.337 ms  0.260 ms  0.223 ms
       2  192.0.2.1 (192.0.2.1)   0.884 ms  1.066 ms  1.248 ms
       ...

      命令的输出显示路由器通过 192.0.2.1发送数据包,这是供应商 B 的网络。

  2. 在服务器子网的 RHEL 主机上:

    1. 安装 traceroute 软件包:

      # yum install traceroute
    2. 使用 traceroute 工具显示到互联网主机的路由:

      # traceroute redhat.com
      traceroute to redhat.com (209.132.183.105), 30 hops max, 60 byte packets
       1  203.0.113.1 (203.0.113.1)    2.179 ms  2.073 ms  1.944 ms
       2  198.51.100.2 (198.51.100.2)  1.868 ms  1.798 ms  1.549 ms
       ...

      命令的输出显示路由器通过 198.51.100.2发送数据包,这是供应商 A 的网络。

故障排除步骤

在 RHEL 路由器中:

  1. 显示规则列表:

    # ip rule list
    0:	from all lookup local
    5:	from 10.0.0.0/24 lookup 5000
    32766:	from all lookup main
    32767:	from all lookup default

    默认情况下,RHEL 包含表 localmaindefault 的规则。

  2. 显示表 5000 中的路由:

    # ip route list table 5000
    0.0.0.0/0 via 192.0.2.2 dev enp1s0 proto static metric 100
    10.0.0.0/24 dev enp8s0 proto static scope link src 192.0.2.1 metric 102
  3. 显示接口和防火墙区:

    # firewall-cmd --get-active-zones
    external
      interfaces: enp1s0 enp7s0
    internal
      interfaces: enp8s0 enp9s0
  4. 验证 external 区是否启用了伪装:

    # firewall-cmd --info-zone=external
    external (active)
      target: default
      icmp-block-inversion: no
      interfaces: enp1s0 enp7s0
      sources:
      services: ssh
      ports:
      protocols:
      masquerade: yes
      ...

其它资源

  • 有关您可以在 nmcli connection add 命令中设置的 ipv4.* 参数的详情,请查看 nm-settings(5) man page 中的 IPv4 settings 部分。
  • 有关您可以在 nmcli connection add 命令中设置的 connection.* 参数的详情,请查看 nm-settings(5) man page 中的 Connection settings 部分。
  • 有关使用 nmcli 管理网络管理器连接的详情,请参考 nmcli(1) man page 中的 Connection management commands 部分。

22.2. 使用旧网络脚本时,涉及基于策略的路由的配置文件概述

如果您使用旧的网络脚本而不是 NetworkManager 配置网络,您也可以配置基于策略的路由。

注意

使用 network-scripts 软件包(在 RHEL 8 中已弃用)提供的旧网络脚本配置网络。红帽建议您使用 NetworkManager 配置基于策略的路由。例如,请参阅 第 22.1 节 “使用 NetworkManager 将特定子网的流量路由到不同的默认网关”

使用旧的网络脚本时,以下配置文件会涉及基于策略的路由:

  • /etc/sysconfig/network-scripts/route-interface:此文件定义 IPv4 路由。使用 table 选项指定路由表。例如:

    192.0.2.0/24 via 198.51.100.1 table 1
    203.0.113.0/24 via 198.51.100.2 table 2
  • /etc/sysconfig/network-scripts/route6-interface:此文件定义 IPv6 路由。
  • /etc/sysconfig/network-scripts/rule-interface:此文件定义内核将流量路由到特定路由表的 IPv4 源网络规则。例如:

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

    1     Provider_A
    2     Provider_B

其它资源

  • 有关 IP 路由的详情,请查看 ip-route(8) man page。
  • 有关路由规则的详情,请查看 ip-rule(8) man page。

22.3. 使用旧网络脚本将特定子网的流量路由到不同的默认网关

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

重要

使用 network-scripts 软件包(在 RHEL 8 中已弃用)提供的旧网络脚本配置网络。只有在主机上使用旧网络脚本而不是 NetworkManager 时,才需要按照本节中的步骤进行操作。如果您使用 NetworkManager 管理网络设置,请参阅 使用 NetworkManager 将特定子网的流量路由到不同的默认网关

该流程假设以下网络拓扑:

policy based routing

注意

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

先决条件

  • 未安装 NetworkManager 软件包,或者 NetworkManager 服务被禁用。
  • 已安装 network-scripts 软件包。
  • 要在流程中设置的 RHEL 路由器有四个网络接口:

    • enp7s0 接口连接到供应商 A 的网络。提供商网络中的网关 IP 是 198.51.100.2,网络使用了 /30 网络掩码。
    • enp1s0 接口连接到供应商 B 的网络。提供商网络中的网关 IP 是 192.0.2.2,网络使用了 /30 网络掩码。
    • enp8s0 接口使用内部工作站连接到 10.0.0.0/24 子网。
    • enp9s0 界面连接到有公司服务器的 203.0.113.0/24 子网。
  • 内部工作站子网中的主机使用 10.0.0.1 作为默认网关。在此过程中,您可以将此 IP 地址分配给路由器的 enp8s0 网络接口。
  • 服务器子网中的主机使用 203.0.113.1 作为默认网关。在此过程中,您可以将此 IP 地址分配给路由器的 enp9s0 网络接口。
  • firewalld 服务已启用并激活。

流程

  1. 通过创建包含以下内容的 /etc/sysconfig/network-scripts/ifcfg-1_Provider-A 文件将网络接口配置添加到供应商 A:

    TYPE=Ethernet
    IPADDR=198.51.100.1
    PREFIX=30
    GATEWAY=198.51.100.2
    DNS1=198.51.100.200
    DEFROUTE=yes
    NAME=1_Provider-A
    DEVICE=enp7s0
    ONBOOT=yes
    ZONE=external

    以下列表描述了配置文件里使用的参数:

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

    1. 使用以下内容创建 /etc/sysconfig/network-scripts/ifcfg-2_Provider-B 文件:

      TYPE=Ethernet
      IPADDR=192.0.2.1
      PREFIX=30
      DEFROUTE=no
      NAME=2_Provider-B
      DEVICE=enp1s0
      ONBOOT=yes
      ZONE=external

      请注意,这个接口的配置文件不包含默认的网关设置。

    2. 2_Provider-B 连接的网关分配给单独的路由表。因此,使用以下内容创建 /etc/sysconfig/network-scripts/route-2_Provider-B 文件:

      0.0.0.0/0 via 192.0.2.2 table 5000

      这个条目将通过这个网关路由的所有子网的网关和流量分配到表 5000.

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

    1. 使用以下内容创建 /etc/sysconfig/network-scripts/ifcfg-3_Internal-Workstations 文件:

      TYPE=Ethernet
      IPADDR=10.0.0.1
      PREFIX=24
      DEFROUTE=no
      NAME=3_Internal-Workstations
      DEVICE=enp8s0
      ONBOOT=yes
      ZONE=internal
    2. 为内部工作站子网添加路由规则配置。因此,使用以下内容创建 /etc/sysconfig/network-scripts/rule-3_Internal-Workstations 文件:

      pri 5 from 10.0.0.0/24 table 5000

      此配置定义了带有优先级 5 的路由规则,该规则将所有流量从 10.0.0.0/24 子网路由到表 5000。低的值具有更高的优先级。

    3. 使用以下内容创建 /etc/sysconfig/network-scripts/route-3_Internal-Workstations 文件,将静态路由添加到路由表, ID 为 5000

      10.0.0.0/24 via 192.0.2.1 table 5000

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

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

    TYPE=Ethernet
    IPADDR=203.0.113.1
    PREFIX=24
    DEFROUTE=no
    NAME=4_Servers
    DEVICE=enp9s0
    ONBOOT=yes
    ZONE=internal
  5. 重启网络:

    # systemctl restart network

验证步骤

  1. 在内部工作站子网的 RHEL 主机上:

    1. 安装 traceroute 软件包:

      # yum install traceroute
    2. 使用 traceroute 工具显示到互联网主机的路由:

      # traceroute redhat.com
      traceroute to redhat.com (209.132.183.105), 30 hops max, 60 byte packets
       1  10.0.0.1 (10.0.0.1)     0.337 ms  0.260 ms  0.223 ms
       2  192.0.2.1 (192.0.2.1)   0.884 ms  1.066 ms  1.248 ms
       ...

      命令的输出显示路由器通过 192.0.2.1发送数据包,这是供应商 B 的网络。

  2. 在服务器子网的 RHEL 主机上:

    1. 安装 traceroute 软件包:

      # yum install traceroute
    2. 使用 traceroute 工具显示到互联网主机的路由:

      # traceroute redhat.com
      traceroute to redhat.com (209.132.183.105), 30 hops max, 60 byte packets
       1  203.0.113.1 (203.0.113.1)    2.179 ms  2.073 ms  1.944 ms
       2  198.51.100.2 (198.51.100.2)  1.868 ms  1.798 ms  1.549 ms
       ...

      命令的输出显示路由器通过 198.51.100.2发送数据包,这是供应商 A 的网络。

故障排除步骤

在 RHEL 路由器中:

  1. 显示规则列表:

    # ip rule list
    0:      from all lookup local
    5:      from 10.0.0.0/24 lookup 5000
    32766:  from all lookup main
    32767:  from all lookup default

    默认情况下,RHEL 包含表 localmaindefault 的规则。

  2. 显示表 5000 中的路由:

    # ip route list table 5000
    default via 192.0.2.2 dev enp1s0
    10.0.0.0/24 via 192.0.2.1 dev enp1s0
  3. 显示接口和防火墙区:

    # firewall-cmd --get-active-zones
    external
      interfaces: enp1s0 enp7s0
    internal
      interfaces: enp8s0 enp9s0
  4. 验证 external 区是否启用了伪装:

    # firewall-cmd --info-zone=external
    external (active)
      target: default
      icmp-block-inversion: no
      interfaces: enp1s0 enp7s0
      sources:
      services: ssh
      ports:
      protocols:
      masquerade: yes
      ...

其它资源