基于策略的路由

典型的路由系统和协议根据数据包中的目标地址转发流量,并在路由表中查找该地址。但是,有时您网络上的流量需要更手动的方法。有时,您需要根据源地址、数据包大小或数据包标头中的其他信息转发数据包。

PBR 使您能够根据过滤器做出路由决策,这些过滤器会更改特定流量的路由行为,以便您可以覆盖路由表并影响流量的去向。例如,您可以使用 PBR 来实现业务关键型应用程序的最佳带宽利用率、隔离流量以进行检查或分析,或者手动负载均衡出站流量。

Cumulus Linux 将 PBR 应用于传入数据包。在启用 PBR 的接口上接收到的所有数据包都将通过增强的数据包过滤器,这些过滤器确定规则并指定将数据包转发到何处。

  • 您最多可以创建 255 个 PBR 匹配规则和 256 个下一跳组(这是 ECMP 限制)。
  • 每个输入接口只能应用一个 PBR 策略。
  • 您可以匹配目标 IP 地址,或者匹配数据包内的 DSCPECN 值。
  • PBR 不支持 VXLAN 隧道。
  • PBR 不支持管理接口,例如 eth0。
  • 一个 PBR 规则不能同时包含 IPv4 和 IPv6 地址。
  • PBR 仅支持将下一跳作为下一跳组;PBR 不支持单独的下一跳。

配置 PBR

一个 PBR 策略包含一个或多个策略映射。每个策略映射

  • 具有唯一的映射名称和序列(规则)编号。规则编号确定映射在策略中的相对顺序。
  • 包含一个匹配源 IP 规则和(或)一个匹配目标 IP 规则以及一个设置规则,或者一个匹配 DSCP 或 ECN 规则以及一个设置规则。
    • 要匹配源地址和目标地址,策略映射可以同时包含匹配源 IP 规则和匹配目标 IP 规则。
    • 设置规则确定策略的 PBR 下一跳。设置规则只能包含下一跳组。

要在 Cumulus Linux 中使用 PBR,您需要定义一个 PBR 策略并将其应用于入口接口(该接口必须已分配 IP 地址)。Cumulus Linux 按照顺序将流量与匹配规则进行匹配,并根据第一个匹配项中的设置规则转发流量。与任何规则都不匹配的流量将传递到正常的基于目标的路由机制。

要配置 PBR 策略

当您使用 NVUE 命令配置 PBR 时,NVUE 会启用 pbrd 服务并重启 FRR 服务;重启 FRR 服务可能会影响流量。

  1. 配置策略映射。

    以下示例命令配置一个名为 map1 的策略映射,规则编号为 1,该规则匹配目标地址 10.1.2.0/24 和源地址 10.1.4.1/24。

    如果规则中的 IP 地址是 0.0.0.0/0 或 ::/0,则任何 IP 地址都匹配。您不能在一个规则中混合使用 IPv4 和 IPv6 地址。

    cumulus@switch:~$ nv set router pbr map map1 rule 1 match destination-ip 10.1.2.0/24
    cumulus@switch:~$ nv set router pbr map map1 rule 1 match source-ip 10.1.4.1/24 
    

    除了匹配 IP 地址,您还可以根据 IP 标头中的 DSCP 或 ECN 字段匹配数据包。DSCP 值可以是 0 到 63 之间的整数或 DSCP 代码点名称。ECN 值可以是 0 到 3 之间的整数。以下示例命令配置一个名为 map1 的策略映射,规则编号为 1,该规则匹配 DSCP 值为 10 的数据包

    cumulus@switch:~$ nv set router pbr map map1 rule 1 match dscp 10
    

    以下示例命令配置一个名为 map1 的策略映射,规则编号为 1,该规则匹配 ECN 值为 2 的数据包

    cumulus@switch:~$ nv set router pbr map map1 rule 1 match ecn 2
    
  2. 将下一跳组应用于策略映射。首先配置下一跳组,然后将该组应用于策略映射。以下示例命令创建一个名为 group1 的下一跳组,该组包含输出接口 swp1 和 VRF RED 上的下一跳 192.168.0.21 以及下一跳 192.168.0.22,然后将下一跳组 group1 应用于 map1 策略映射。

    输出接口和 VRF 是可选的。但是,如果下一跳不在默认 VRF 中,则必须指定 VRF。

    cumulus@switch:~$ nv set router nexthop group group1 via 192.168.0.21 interface swp1
    cumulus@switch:~$ nv set router nexthop group group1 via 192.168.0.21 vrf RED
    cumulus@switch:~$ nv set router nexthop group group1 via 192.168.0.22
    cumulus@switch:~$ nv set router pbr map map1 rule 1 action nexthop-group group1
    

    如果您希望规则使用特定的 VRF 表作为其查找,请设置 VRF。如果您未设置 VRF,则规则使用接口所在的 VRF 表作为其查找。以下示例命令将规则设置为使用 dmz VRF 表。

    您只能在虚拟环境中设置 VRF。NVIDIA 交换机上的 Cumulus Linux 不支持设置 VRF。

    cumulus@switch:~$ nv set router pbr map map1 rule 1 action vrf dmz
    
  3. 将 PBR 策略分配给入口接口。以下示例命令将 PBR 策略 map1 分配给接口 swp51

    cumulus@switch:~$ nv set interface swp51 router pbr map map1
    cumulus@switch:~$ nv config apply
    
  1. /etc/frr/daemons 文件中启用 pbrd 服务

    cumulus@switch:~$ sudo nano /etc/frr/daemons
    ...
    bgpd=yes
    ospfd=no
    ospf6d=no
    ripd=no
    ripngd=no
    isisd=no
    fabricd=no
    pimd=no
    ldpd=no
    nhrpd=no
    eigrpd=no
    babeld=no
    sharpd=no
    pbrd=yes
    ...
    
  1. 使用此命令重启 FRR

cumulus@switch:~$ sudo systemctl restart frr.service

重启 FRR 会重启所有已启用并正在运行的路由协议守护进程。

  1. 配置策略映射。

    以下示例命令配置一个名为 map1 的策略映射,序列号为 1,该规则匹配目标地址 10.1.2.0/24 和源地址 10.1.4.1/24。

    cumulus@switch:~$ sudo vtysh
    
    switch# configure terminal
    switch(config)# pbr-map map1 seq 1
    switch(config-pbr-map)# match dst-ip 10.1.2.0/24
    switch(config-pbr-map)# match src-ip 10.1.4.1/24
    switch(config-pbr-map)# exit
    switch(config)# 
    

    如果规则中的 IP 地址是 0.0.0.0/0 或 ::/0,则任何 IP 地址都匹配。您不能在一个规则中混合使用 IPv4 和 IPv6 地址。

    除了匹配 IP 地址,您还可以根据 IP 标头中的 DSCP 或 ECN 字段匹配数据包。DSCP 值可以是 0 到 63 之间的整数或 DSCP 代码点名称。ECN 值可以是 0 到 3 之间的整数。以下示例命令配置一个名为 map1 的策略映射,序列号为 1,该规则匹配 DSCP 值为 10 的数据包

    switch# configure terminal
    switch(config)# pbr-map map1 seq 1
    switch(config-pbr-map)# match dscp 10
    switch(config-pbr-map)# exit
    switch(config)# 
    

    以下示例命令配置一个名为 map1 的策略映射,序列号为 1,该规则匹配 ECN 值为 2 的数据包

    switch# configure terminal
    switch(config)# pbr-map map1 seq 1
    switch(config-pbr-map)# match ecn 2
    switch(config-pbr-map)# exit
    switch(config)# 
    
  2. 下一跳组应用于策略映射。首先配置下一跳组,然后将该组应用于策略映射。以下示例命令创建一个名为 group1 的下一跳组,该组包含输出接口 swp1 和 VRF RED 上的下一跳 192.168.0.21 以及下一跳 192.168.0.22,然后将下一跳组 group1 应用于 map1 策略映射。

    输出接口和 VRF 是可选的。但是,如果下一跳不在默认 VRF 中,则必须指定 VRF。

    switch(config)# nexthop-group group1
    switch(config-nh-group)# nexthop 192.168.0.21 swp1 nexthop-vrf RED
    switch(config-nh-group)# nexthop 192.168.0.22
    switch(config-nh-group)# exit
    switch(config)# pbr-map map1 seq 1
    switch(config-pbr-map)# set nexthop-group group1
    switch(config-pbr-map)# exit
    switch(config)#
    

    如果您希望规则使用特定的 VRF 表作为其查找,请设置 VRF。如果您未设置 VRF,则规则使用接口所在的 VRF 表作为其查找。以下示例命令将规则设置为使用 dmz VRF 表。

    您只能在虚拟环境中设置 VRF。NVIDIA 交换机上的 Cumulus Linux 不支持设置 VRF。

    switch(config)# pbr-map map1 seq 1
    switch(config-pbr-map)# set vrf dmz
    switch(config-pbr-map)# exit
    switch(config)#
    
  3. 将 PBR 策略分配给入口接口。以下示例命令将 PBR 策略 map1 分配给接口 swp51

    switch(config)# interface swp51
    switch(config-if)# pbr-policy map1
    switch(config-if)# end
    switch# write memory
    switch# exit
    cumulus@switch:~$
    

vtysh 命令将配置保存在 /etc/frr/frr.conf 文件中。例如

...
nexthop-group group1
nexthop 192.168.0.21 nexthop-vrf RED swp1
nexthop 192.168.0.22
pbr-map map1 seq 1
match dst-ip 10.1.2.0/24
match src-ip 10.1.4.1/24
set nexthop-group group1
interface swp51
pbr-policy map1
...

每个接口只能设置一个策略。

修改 PBR 规则

当您想要更改或扩展现有 PBR 规则时,必须首先删除规则中的条件,然后使用修改或添加重新添加该规则。

修改现有的匹配/设置条件
向现有规则添加匹配条件

删除 PBR 规则和策略

您可以删除 PBR 规则、下一跳组或策略。以下命令提供示例。

删除 PBR 规则和下一跳组时请务必小心。不要为 PBR 策略创建不正确的配置。

以下示例显示如何删除 PBR 规则匹配

cumulus@switch:~$ nv unset router pbr map map1 rule 1 match destination-ip
cumulus@switch:~$ nv config apply

以下示例显示如何从组中删除下一跳

cumulus@switch:~$ nv unset router nexthop group group1 via 192.168.0.22
cumulus@switch:~$ nv config apply

以下示例显示如何删除下一跳组

cumulus@switch:~$ nv unset router nexthop group group1
cumulus@switch:~$ nv config apply

以下示例显示如何删除 PBR 策略,以便 PBR 接口不再接收 PBR 流量

cumulus@switch:~$ nv unset interface swp51 router pbr map map1
cumulus@switch:~$ nv config apply

以下示例显示如何删除 PBR 规则

cumulus@switch:~$ nv unset router pbr map map1
cumulus@switch:~$ nv config apply

要删除 PBR 映射和相应的下一跳组,您必须首先删除 PBR 映射并运行 nv config apply,然后删除相应的下一跳组;例如

cumulus@switch:~$ nv unset router pbr map map1 rule 1
cumulus@switch:~$ nv config apply
cumulus@switch:~$ nv unset router nexthop group group1
cumulus@switch:~$ nv config apply

以下示例显示如何删除 PBR 规则匹配

cumulus@switch:~$ sudo vtysh
...
switch# configure terminal
switch(config)# pbr-map map1 seq 1
switch(config-pbr-map)# no match dst-ip 10.1.2.0/24
switch(config-pbr-map)# end
switch# write memory
switch# exit

以下示例显示如何从组中删除下一跳

cumulus@switch:~$ sudo vtysh
...
switch# configure terminal
switch(config)# nexthop-group group1
switch(config-nh-group)# no nexthop 192.168.0.32 swp1 nexthop-vrf RED
switch(config-nh-group)# end
switch# write memory
switch# exit

以下示例显示如何删除下一跳组

cumulus@switch:~$ sudo vtysh
...
switch# configure terminal
switch(config)# no nexthop-group group1
switch(config)# end
switch# write memory
switch# exit

以下示例显示如何删除 PBR 策略,以便 PBR 接口不再接收 PBR 流量

cumulus@switch:~$ sudo vtysh
...
switch# configure terminal
switch(config)# interface swp51
switch(config-if)# no pbr-policy map1
switch(config-if)# end
switch# write memory
switch# exit

以下示例显示如何删除 PBR 规则

cumulus@switch:~$ sudo vtysh
...
switch# configure terminal
switch(config)# no pbr-map map1 seq 1
switch(config)# end
switch# write memory
switch# exit

如果 PBR 规则有多个条件(例如,源 IP 匹配和目标 IP 匹配),但您只想删除一个条件,则必须首先删除所有条件,然后重新添加要保留的条件。

以下示例显示具有源 IP 匹配和目标 IP 匹配的现有配置。

Seq: 6 rule: 305 Installed: yes Reason: Valid
   SRC Match: 10.1.4.1/24
   DST Match: 10.1.2.0/24
nexthop 192.168.0.21
   Installed: yes Tableid: 10011

上述配置的命令是

cumulus@switch:~$ nv set router pbr map pbr-policy rule 6 match source-ip 10.1.4.1/24
cumulus@switch:~$ nv set router pbr map pbr-policy rule 6 match destination-ip 10.1.2.0/24
cumulus@switch:~$ nv set router nexthop group group1 via 192.168.0.21

要删除目标 IP 匹配,您必须首先删除在此序列下定义的所有现有条件

cumulus@switch:~$ nv unset router pbr map pbr-policy rule 6 match source-ip 
cumulus@switch:~$ nv unset router pbr map pbr-policy rule 6 match destination-ip
cumulus@switch:~$ nv unset router nexthop group group1 via 192.168.0.21
cumulus@switch:~$ nv config apply

然后,重新添加要保留的条件

cumulus@switch:~$ nv set router pbr map pbr-policy rule 6 match source-ip 10.1.4.1/24
cumulus@switch:~$ nv unset router nexthop group group1 via 192.168.0.21
cumulus@switch:~$ nv config apply

故障排除

要查看应用于交换机上所有接口的策略,请运行 NVUE nv show router pbr -o json 命令

cumulus@switch:~$ nv show router pbr  -o json
{
  "map": {
    "map1": {
      "rule": {
        "1": {
          "action": {
            "nexthop-group": {
              "group1": {
                "installed": "off",
                "table-id": 10000
              }
            }
          },
          "installed": "off",
          "installed-reason": "Invalid NH-group",
          "ip-rule-id": 300,
          "match": {
            "destination-ip": "10.1.2.0/24",
            "dscp": 10,
            "source-ip": "10.1.4.1/24"
          }
        }
      }
    }
  }
}

要查看应用于交换机上特定接口的策略,请运行 NVUE nv show interface <interface> router pbr 命令或 vtysh show pbr interface <interface> 命令。

要查看有关所有策略的信息,包括映射的表和规则编号,请运行 NVUE nv show router pbr map 命令或 vtysh show pbr map 命令。如果未设置规则,您将看到原因。

cumulus@switch:~$ sudo vtysh
switch# show pbr map
 pbr-map map1 valid: yes
  Seq: 700 rule: 999 Installed: yes Reason: Valid
      SRC Match: 10.0.0.1/32
  nexthop 192.168.0.32
      Installed: yes Tableid: 10003
  Seq: 701 rule: 1000 Installed: yes Reason: Valid
      SRC Match: 90.70.0.1/32
  nexthop 192.168.0.32
      Installed: yes Tableid: 10004

要查看有关策略、其匹配项和关联接口的信息,请运行 NVUE nv show router pbr map <map> -o json 命令或 vtysh show pbr map <map-name> 命令。

cumulus@switch:~$ nv show router pbr map map1 -o json
{
  "rule": {
    "1": {
      "action": {
        "nexthop-group": {
          "group1": {
            "installed": "on",
            "table-id": 10000
          }
        }
      },
      "installed": "no",
      "installed-reason": "Valid",
      "ip-rule-id": 300,
      "match": {
        "destination-ip": "10.1.2.0/24",
        "source-ip": "10.1.4.1/24"
      }
    }
  },
  "valid": "yes"
}

要查看有关所有下一跳组的信息,请运行 NVUE nv show router pbr nexthop-group 命令或 vtysh show pbr nexthop-group 命令。

cumulus@switch:~$ nv show router pbr nexthop-group
Nexthop-groups  installed  valid    Summary         
--------------  ---------  -----    ----------------
group1          yes         yes     Nexthop-index: 1
                                    Nexthop-index: 2

要显示有关下一跳组的更详细信息,请运行 nv show router pbr nexthop-group -o json 命令

cumulus@switch:~$ nv show router pbr nexthop-group -o json
{
  "group1": {
    "installed": "yes",
    "nexthop": {
      "1": {
        "nexthop": "20.1.1.2",
        "valid": "yes",
        "vrf": "swp1s0"
      }
    },
    "valid": "yes"
  }
}
...

要查看有关特定下一跳组的信息,请运行 NVUE nv show router pbr nexthop-group <nexthop-group> 命令或 vtysh show pbr nexthop-group <nexthop-group> 命令。

每个下一跳和下一跳组都使用一个新的 Linux 路由表 ID。

要显示保留的路由表范围,请运行 NVUE nv show system global reserved routing-table pbr 命令。

cumulus@switch:~$ nv show system global reserved routing-table pbr
       operational  applied   
-----  -----------  ----------
begin  10000        10000     
end    4294966272   4294966272

配置示例

在以下示例中,启用 PBR 的交换机具有 PBR 策略,用于将来自 Internet 的所有流量路由到执行反 DDOS 的服务器。清理后,流量返回到启用 PBR 的交换机,然后传递到常规的基于目标的路由机制。

cumulus@switch:~$ nv set router pbr map map1 rule 1 match source-ip 0.0.0.0/0
cumulus@switch:~$ nv set router nexthop group group1 via 192.168.0.32
cumulus@switch:~$ nv set router pbr map map1 rule 1 action nexthop-group group1
cumulus@switch:~$ nv set interface swp51 router pbr map map1
cumulus@switch:~$ nv config apply
cumulus@switch:~$ sudo vtysh

switch# configure terminal
switch(config)# nexthop-group group1
switch(config-nh-group)#  nexthop 192.168.0.32
switch(config-nh-group)# exit
switch(config)# pbr-map map1 seq 1
switch(config-pbr-map)#  match src-ip 0.0.0.0/0
switch(config-pbr-map)#  set nexthop-group group1
switch(config-pbr-map)# exit
switch(config)# interface swp51
switch(config-if)#  pbr-policy map1
switch(config-if)# end
switch# write memory
switch# exit
cumulus@switch:mgmt:~$

vtysh 命令将配置保存在 /etc/frr/frr.conf 文件中。例如

interface swp51
pbr-policy map1
nexthop-group group1
nexthop 192.168.0.32
pbr-map map1 seq 1
match src-ip 0.0.0.0/0
set nexthop-group group1
...