VPN 的单播反向路径转发检查
了解单播 RPF(交换机)
为了防止 IP 欺骗以及某些类型的拒绝服务 (DoS) 和分布式拒绝服务 (DDoS) 攻击,单播逆向路径转发 (RPF) 会验证数据包是否来自合法路径。为此,它检查到达不受信任的入口接口上的每个数据包的源地址,并将其与其源地址的转发表条目进行比较。如果数据包来自有效路径(即发送方用来到达目标的路径),则设备会将数据包转发至目标地址。如果数据包不是来自有效路径,设备会丢弃该数据包。除非对其进行防范,否则 IP 欺骗可能是入侵者将 IP 数据包作为真实流量传递到目的地的有效方式,而事实上这些数据包实际上并不是面向目的地的。
IPv4 和 IPv6 协议家族以及虚拟专用网 (VPN) 地址家族支持单播 RPF。配置为隧道源的接口不支持单播 RPF。这仅影响退出隧道的传输数据包。
单播 RPF 有两种模式: 严格模式和 松散模式。默认设置为严格模式,这意味着仅当接收接口是数据包单播源地址的最佳返回路径时,交换机才会转发数据包。严格模式对于不可信接口(不可信用户或进程可在网段上放置数据包)和对称路由接口(请参阅 何时启用单播 RPF)特别有用。有关严格单播 RPF 的详细信息,请参阅 RFC 3704,http://www.ietf.org/rfc/rfc3704.txt 上多宿主网络的入口过滤 。
要在选定的客户边缘接口上启用严格模式单播 RPF,请执行以下作:
[编辑接口]user@switch# set interface-name unit 0 family inet rpf-check
另一种模式是松散模式,这意味着系统会检查数据包在路由表中是否有带有相应前缀的源地址,但不会检查接收接口是否是数据包单播源地址的最佳返回路径。
要启用单播 RPF 松散模式,请输入:
[编辑接口]user@switch# set interface-name unit 0 family inet rpf-check mode loose
交换机单播 RPF 概述
单播 RPF 充当入口过滤器,可减少可能欺骗地址的 IP 数据包的转发。默认情况下,交换机接口上的单播 RPF 处于禁用状态。交换机仅支持使用活动路径方法确定返回到单播源地址的最佳返回路径。活动路径方法在转发表中查找最佳反向路径条目。在确定最佳返回路径时,它不会考虑使用特定于路由协议的方法指定的备用路由。
如果转发表将接收接口列为用于将数据包转发回其单播源的接口,则该接口是最佳返回路径接口。
单播 RPF 实现
单播 RPF 数据包过滤
在交换机上启用单播 RPF 后,交换机将按以下方式处理流量:
如果交换机在接口上收到的数据包是该数据包的单播源地址的最佳返回路径,则交换机会转发该数据包。
如果从交换机到数据包的单播源地址的最佳返回路径不是接收接换机将丢弃数据包。
如果交换机收到的数据包的源 IP 地址在转转发表中没有路由条目,则交换机将丢弃该数据包。
自举协议 (BOOTP) 和 DHCP 请求
自举协议 (BOOTP) 和 DHCP 请求数据包使用广播 MAC 地址发送,因此交换机不会对其执行单播 RPF 检查。交换机会转发所有 BOOTP 数据包和 DHCP 请求数据包,而不执行单播 RPF 检查。
默认路由处理
如果到源的最佳返回路径是默认路由 (0.0.0.0),且默认路由指向 reject,交换机会丢弃数据包。如果默认路由指向有效的网络接换机会对数据包执行正常的单播 RPF 检查。
在 EX4300 上,如果交换机配置为单播 RPF 严格模式,则不使用默认路由。
何时启用单播 RPF
如果希望确保到达网络接口的流量来自驻留在该接口可以到达的网络上的源,请启用单播 RPF。您可以在不可信接口上启用单播 RPF,以过滤欺骗数据包。例如,单播 RPF 的一个常见应用是帮助企业网络抵御来自互联网的 DoS/DDoS 攻击。
仅在对称路由的接口上启用单播 RPF,并尽可能靠近流量源阻止欺骗流量,以免欺骗流量扩散或到达未启用单播 RPF 的接口。由于 EX3200、EX4200 和 EX4300 交换机全局启用单播 RPF,因此在这些交换机上启用单播 RPF 之前,请确保 所有 接口均采用对称路由,如 图 1 所示。在非对称路由接口上启用单播 RPF 会导致来自合法来源的数据包被过滤。对称路由接口在源和目标之间的两个方向上使用相同的路由。
EX3200、EX4200 和 EX4300 交换机已全局启用单播 RPF,对于这些设备,请确保 所有 接口均已对称路由,然后在这些交换机上启用单播 RPF。在非对称路由接口上启用单播 RPF 会导致来自合法来源的数据包被过滤。
以下交换机接口最有可能采用对称路由,因此可以考虑启用单播 RPF:
客户的服务提供商边缘
服务提供商的客户边缘
网络外的单个接入点(通常位于网络外围)
只有一个链路的终端网络
在 EX3200、EX4200 和 EX4300 交换机上,我们建议在所有接口上或仅在一个接口上显式启用单播 RPF。为避免可能的混淆,请勿仅在某些接口上启用它:
如果选择在一个接口上显式启用单播 RPF,则将来会更容易,因为您必须在显式启用单播 RPF 的每个接口上显式禁用单播 RPF。如果在两个接口上显式启用单播 RPF,而仅在一个接口上禁用单播 RPF,则交换机上仍会以隐式方式全局启用单播 RPF。这种方法的缺点是交换机会显示一个标志,指示仅在显式启用了单播 RPF 的接口上启用单播 RPF,因此,即使在所有接口上启用了单播 RPF,也不会显示此状态。
通过在所有接口上显式启用单播 RPF,可以更轻松地了解交换机上是否启用了单播 RPF,因为每个接口都显示正确的状态。(只有显式启用了单播 RPF 的接口才会显示指示已启用单播 RPF 的标志。这种方法的缺点是,如果要禁用单播 RPF,则必须在每个接口上显式禁用它。如果在任何接口上启用了单播 RPF,则会在所有接口上隐式启用该 RPF。
何时不启用单播 RPF
通常,在以下情况下,不会启用单播 RPF:
交换机接口为多宿主接口。
交换机接口是受信任的接口。
BGP 带有前缀,其中一些前缀不会播发,或者根据其策略,ISP 不接受这些前缀。(在这种情况下,效果与使用不完整的访问列表过滤接口相同。
交换机接口面向网络核心。面向核心的接口通常是非对称路由的。
非对称路由接口使用不同的路径在源和目标之间发送和接收数据包,如 图 2 所示。这意味着,如果接口收到数据包,则该接口与作为返回源的最佳返回路径的转转发表条目不匹配。如果接收接口不是数据包源的最佳返回路径,则单播 RPF 会导致交换机丢弃数据包,即使该数据包来自有效源。
如果任何交换机接口采用非对称路由,请勿在 EX3200、EX4200 和 EX4300 交换机上启用单播 RPF,因为单播 RPF 已在这些交换机的所有接口上全局启用。所有交换机接口都必须对称路由,才能启用单播 RPF,而不会有交换机丢弃要转发的流量的风险。
EX3200、EX4200 和 EX4300 交换机上实施单播 RPF 的限制
在 EX3200、EX4200 和 EX4300 交换机上,交换机将在全球范围内实施单播 RPF。您无法按接口启用单播 RPF。默认情况下,单播 RPF 处于全局禁用状态。
在任何接口上启用单播 RPF 时,都会在所有交换机接口上自动启用,包括链路聚合组 (LAG)、集成路由和桥接 (IRB) 接口以及路由 VLAN 接口 (RVI)。
在启用了单播 RPF 的一个或多个接口上禁用单播 RPF 时,它将在所有交换机接口上自动禁用。
您必须在显式启用单播 RPF 的每个接口上显式禁用单播 RPF,或者在所有交换机接口上保持单播 RPF 启用状态。
QFX 交换机、OCX 交换机以及 EX3200 和 EX4200 交换机不会对等价多路径 (ECMP) 流量执行单播 RPF 过滤。单播 RPF 检查仅检查到数据包源的一个最佳返回路径,但 ECMP 流量使用由多个路径组成的地址块。在这些交换机上使用单播 RPF 过滤 ECMP 流量可能会导致交换机丢弃您要转发的数据包,因为单播 RPF 过滤器不会检查整个 ECMP 地址块。
另见
示例:配置单播 RPF(在路由器上)
此示例说明如何通过在客户边缘接口上配置单播 RPF 来过滤传入流量,从而帮助保护入口接口免遭拒绝服务 (DoS) 和分布式拒绝服务 (DDoS) 攻击。
要求
除设备初始化外,不需要任何特殊配置。
概述
在此示例中,设备 A 使用 OSPF 为连接到设备 D 的链路播发前缀。设备 B 配置了单播 RPF。在设备 B 和设备 C 之间的链路以及设备 A 和设备 C 之间的链路上启用 OSPF,但在设备 A 和设备 B 之间的链路上不启用。因此,设备 B 通过设备 C 了解到设备 D 的路由。
如果在使用 DHCP 或 BOOTP 的环境中使用入口过滤,则应确保在适当时允许源地址为 0.0.0.0 且目标地址为 255.255.255.255 的数据包到达路由器中的中继代理。
此示例还包括失败筛选器。当数据包未通过单播 RPF 检查时,将对故障过滤器进行评估,以确定是否仍应接受该数据包。此示例中的故障过滤器允许设备 B 的接口接受动态主机配置协议 (DHCP) 数据包。该过滤器接受源地址为 0.0.0.0 且目标地址为 255.255.255.255 的所有数据包。
配置
CLI 快速配置
要快速配置此示例,请复制以下命令,将其粘贴到文本文件中,删除所有换行符,更改详细信息,以便与网络配置匹配,然后将命令复制并粘贴到层 [edit] 级的 CLI 中。
设备 A
set interfaces fe-1/2/0 unit 1 family inet address 10.0.0.1/30 set interfaces fe-0/0/2 unit 5 family inet address 10.0.0.5/30 set interfaces fe-0/0/1 unit 17 family inet address 10.0.0.17/30 set interfaces fe-0/1/1 unit 25 family inet address 10.0.0.25/30 set interfaces fe-1/1/1 unit 29 family inet address 10.0.0.29/30 set protocols ospf export send-direct set protocols ospf area 0.0.0.0 interface fe-0/1/1.25 set protocols ospf area 0.0.0.0 interface fe-1/1/1.29 set policy-options policy-statement send-direct from protocol direct set policy-options policy-statement send-direct from route-filter 10.0.0.16/30 exact set policy-options policy-statement send-direct then accept
设备 B
set interfaces fe-1/2/0 unit 2 family inet rpf-check fail-filter rpf-special-case-dhcp set interfaces fe-1/2/0 unit 2 family inet address 10.0.0.2/30 set interfaces fe-1/1/1 unit 6 family inet rpf-check fail-filter rpf-special-case-dhcp set interfaces fe-1/1/1 unit 6 family inet address 10.0.0.6/30 set interfaces fe-0/1/1 unit 9 family inet rpf-check fail-filter rpf-special-case-dhcp set interfaces fe-0/1/1 unit 9 family inet address 10.0.0.9/30 set interfaces fe-0/1/0 unit 13 family inet rpf-check fail-filter rpf-special-case-dhcp set interfaces fe-0/1/0 unit 13 family inet address 10.0.0.13/30 set protocols ospf area 0.0.0.0 interface fe-0/1/1.9 set protocols ospf area 0.0.0.0 interface fe-0/1/0.13 set routing-options forwarding-table unicast-reverse-path active-paths set firewall filter rpf-special-case-dhcp term allow-dhcp from source-address 0.0.0.0/32 set firewall filter rpf-special-case-dhcp term allow-dhcp from destination-address 255.255.255.255/32 set firewall filter rpf-special-case-dhcp term allow-dhcp then count rpf-dhcp-traffic set firewall filter rpf-special-case-dhcp term allow-dhcp then accept set firewall filter rpf-special-case-dhcp term default then log set firewall filter rpf-special-case-dhcp term default then reject
设备 C
set interfaces fe-1/2/0 unit 10 family inet address 10.0.0.10/30 set interfaces fe-0/0/2 unit 14 family inet address 10.0.0.14/30 set interfaces fe-1/0/2 unit 21 family inet address 10.0.0.21/30 set interfaces fe-1/2/2 unit 26 family inet address 10.0.0.26/30 set interfaces fe-1/2/1 unit 30 family inet address 10.0.0.30/30 set protocols ospf area 0.0.0.0 interface fe-1/2/0.10 set protocols ospf area 0.0.0.0 interface fe-0/0/2.14 set protocols ospf area 0.0.0.0 interface fe-1/2/2.26 set protocols ospf area 0.0.0.0 interface fe-1/2/1.30
设备 D
set interfaces fe-1/2/0 unit 18 family inet address 10.0.0.18/30
设备 E
set interfaces fe-1/2/0 unit 22 family inet address 10.0.0.22/30
配置设备 A
分步过程
下面的示例要求您在各个配置层级中进行导航。有关 CLI 导航的信息,请参阅 在配置模式下使用 CLI 编辑器。
要配置设备 A,请执行以下作:
配置接口。
[edit interfaces] user@A# set fe-1/2/0 unit 1 family inet address 10.0.0.1/30 user@A# set fe-0/0/2 unit 5 family inet address 10.0.0.5/30 user@A# set fe-0/0/1 unit 17 family inet address 10.0.0.17/30 user@A# set fe-0/1/1 unit 25 family inet address 10.0.0.25/30 user@A# set fe-1/1/1 unit 29 family inet address 10.0.0.29/30
配置 OSPF。
[edit protocols ospf] user@A# set export send-direct user@A# set area 0.0.0.0 interface fe-0/1/1.25 user@A# set area 0.0.0.0 interface fe-1/1/1.29
配置路由策略。
[edit policy-options policy-statement send-direct] user@A# set from protocol direct user@A# set from route-filter 10.0.0.16/30 exact user@A# set then accept
如果完成设备 A 的配置,请提交配置。
[edit] user@A# commit
配置设备 B
分步过程
下面的示例要求您在各个配置层级中进行导航。有关 CLI 导航的信息,请参阅 在配置模式下使用 CLI 编辑器。
要配置设备 B,请执行以下作:
配置接口。
[edit interfaces] user@B# set fe-1/2/0 unit 2 family inet address 10.0.0.2/30 user@B# set fe-1/1/1 unit 6 family inet address 10.0.0.6/30 user@B# set fe-0/1/1 unit 9 family inet address 10.0.0.9/30 user@B# set fe-0/1/0 unit 13 family inet address 10.0.0.13/30
配置 OSPF。
[edit protocols ospf area 0.0.0.0] user@B# set interface fe-0/1/1.9 user@B# set interface fe-0/1/0.13
配置单播 RPF,并应用可选的故障筛选器。
[edit interfaces] user@B# set fe-1/2/0 unit 2 family inet rpf-check fail-filter rpf-special-case-dhcp user@B# set fe-1/1/1 unit 6 family inet rpf-check fail-filter rpf-special-case-dhcp user@B# set fe-0/1/1 unit 9 family inet rpf-check fail-filter rpf-special-case-dhcp user@B# set fe-0/1/0 unit 13 family inet rpf-check fail-filter rpf-special-case-dhcp
(选答)配置故障过滤器,当数据包未通过 RPF 检查时,将对其进行评估。
[edit firewall filter rpf-special-case-dhcp] user@B# set term allow-dhcp from source-address 0.0.0.0/32 user@B# set term allow-dhcp from destination-address 255.255.255.255/32 user@B# set term allow-dhcp then count rpf-dhcp-traffic user@B# set term allow-dhcp then accept user@B# set term default then log user@B# set term default then reject
(选答)仅配置要在 RPF 检查中考虑的活动路径。
这是默认行为。
[edit routing-options forwarding-table] user@B# set unicast-reverse-path active-paths
如果完成设备 B 的配置,请提交配置。
[edit] user@B# commit
结果
通过发出show firewall、show interfaces、show protocolsshow routing-options、和show policy-options命令来确认您的配置。如果输出未显示预期的配置,请重复此示例中的说明以更正配置。
设备 A
user@A# show interfaces
fe-1/2/0 {
unit 1 {
family inet {
address 10.0.0.1/30;
}
}
}
fe-0/0/2 {
unit 5 {
family inet {
address 10.0.0.5/30;
}
}
}
fe-0/0/1 {
unit 17 {
family inet {
address 10.0.0.17/30;
}
}
}
fe-0/1/1 {
unit 25 {
family inet {
address 10.0.0.25/30;
}
}
}
fe-1/1/1 {
unit 29 {
family inet {
address 10.0.0.29/30;
}
}
}
user@A# show protocols
ospf {
export send-direct;
area 0.0.0.0 {
interface fe-0/1/1.25;
interface fe-1/1/1.29;
}
}
user@A# show policy-options
policy-statement send-direct {
from {
protocol direct;
route-filter 10.0.0.16/30 exact;
}
then accept;
}
设备 B
user@B# show firewall
filter rpf-special-case-dhcp {
term allow-dhcp {
from {
source-address {
0.0.0.0/32;
}
destination-address {
255.255.255.255/32;
}
}
then {
count rpf-dhcp-traffic;
accept;
}
}
term default {
then {
log;
reject;
}
}
}
user@B# show interfaces
fe-1/2/0 {
unit 2 {
family inet {
rpf-check fail-filter rpf-special-case-dhcp;
address 10.0.0.2/30;
}
}
}
fe-1/1/1 {
unit 6 {
family inet {
rpf-check fail-filter rpf-special-case-dhcp;
address 10.0.0.6/30;
}
}
}
fe-0/1/1 {
unit 9 {
family inet {
rpf-check fail-filter rpf-special-case-dhcp;
address 10.0.0.9/30;
}
}
}
fe-0/1/0 {
unit 13 {
family inet {
rpf-check fail-filter rpf-special-case-dhcp;
address 10.0.0.13/30;
}
}
}
user@B# show protocols
ospf {
area 0.0.0.0 {
interface fe-0/1/1.9;
interface fe-0/1/0.13;
}
}
user@B# show routing-options
forwarding-table {
unicast-reverse-path active-paths;
}
输入设备 C、设备 D 和设备 E 上的配置,如 CLI 快速配置中所示。
验证
确认配置工作正常。
确认已启用单播 RPF
目的
确保设备 B 上的接口已启用单播 RPF。
行动
user@B> show interfaces fe-0/1/0.13 extensive
Logical interface fe-0/1/0.13 (Index 73) (SNMP ifIndex 553) (Generation 208)
Flags: SNMP-Traps 0x4000 Encapsulation: ENET2
Traffic statistics:
Input bytes : 999390
Output bytes : 1230122
Input packets: 12563
Output packets: 12613
Local statistics:
Input bytes : 998994
Output bytes : 1230122
Input packets: 12563
Output packets: 12613
Transit statistics:
Input bytes : 396 0 bps
Output bytes : 0 0 bps
Input packets: 0 0 pps
Output packets: 0 0 pps
Protocol inet, MTU: 1500, Generation: 289, Route table: 22
Flags: Sendbcast-pkt-to-re, uRPF
RPF Failures: Packets: 0, Bytes: 0
Addresses, Flags: Is-Preferred Is-Primary
Destination: 10.0.0.12/30, Local: 10.0.0.13, Broadcast: 10.0.0.15, Generation: 241
意义
uRPF 标志确认在此接口上启用了单播 RPF。
确认源地址已被阻止
目的
ping使用命令确保设备 B 阻止来自意外源地址的流量。
行动
从设备 A 对设备 B 的接口执行 ping作,使用 10.0.0.17 作为源地址。
user@A> ping 10.0.0.6 source 10.0.0.17 PING 10.0.0.6 (10.0.0.6): 56 data bytes ^C --- 10.0.0.6 ping statistics --- 3 packets transmitted, 0 packets received, 100% packet loss
意义
正如预期的那样,ping作失败。
确认源地址已解锁
目的
ping使用命令确保在停用 RPF 检查时设备 B 不会阻塞流量。
行动
停用其中一个接口上的 RPF 检查。
重新运行 ping作。
user@B> deactivate interfaces fe-1/1/1.6 family inet rpf-check user@A> ping 10.0.0.6 source 10.0.0.17 PING 10.0.0.2 (10.0.0.2): 56 data bytes 64 bytes from 10.0.0.2: icmp_seq=0 ttl=63 time=1.316 ms 64 bytes from 10.0.0.2: icmp_seq=1 ttl=63 time=1.263 ms ^C --- 10.0.0.2 ping statistics --- 2 packets transmitted, 2 packets received, 0% packet loss round-trip min/avg/max/stddev = 1.263/1.289/1.316/0.027 ms
意义
正如预期的那样,ping作成功。
