基于策略的路由
典型的路由系统和协议根据数据包中的目标地址转发流量,并在路由表中查找该地址。但是,有时您网络上的流量需要更手动的方法。有时,您需要根据源地址、数据包大小或数据包标头中的其他信息转发数据包。
PBR 使您能够根据过滤器做出路由决策,这些过滤器会更改特定流量的路由行为,以便您可以覆盖路由表并影响流量的去向。例如,您可以使用 PBR 来实现业务关键型应用程序的最佳带宽利用率、隔离流量以进行检查或分析,或者手动负载均衡出站流量。
Cumulus Linux 将 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 服务可能会影响流量。
配置策略映射。
以下示例命令配置一个名为
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
将下一跳组应用于策略映射。首先配置下一跳组,然后将该组应用于策略映射。以下示例命令创建一个名为
group1
的下一跳组,该组包含输出接口 swp1 和 VRFRED
上的下一跳 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
将 PBR 策略分配给入口接口。以下示例命令将 PBR 策略
map1
分配给接口 swp51cumulus@switch:~$ nv set interface swp51 router pbr map map1 cumulus@switch:~$ nv config apply
在
/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 ...
使用此命令重启 FRR
cumulus@switch:~$ sudo systemctl restart frr.service
重启 FRR 会重启所有已启用并正在运行的路由协议守护进程。
配置策略映射。
以下示例命令配置一个名为
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)#
将下一跳组应用于策略映射。首先配置下一跳组,然后将该组应用于策略映射。以下示例命令创建一个名为
group1
的下一跳组,该组包含输出接口 swp1 和 VRFRED
上的下一跳 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)#
将 PBR 策略分配给入口接口。以下示例命令将 PBR 策略
map1
分配给接口 swp51switch(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
...