VPN 单播逆向路径转发检查
了解单播 RPF(交换机)
为了防止 IP 欺骗以及某些类型的拒绝服务 (DoS) 和分布式拒绝服务 (DDoS) 攻击,单播反向路径转发 (RPF) 会验证数据包是否从合法路径到达。它通过检查到达不受信任入口接口的每个数据包的源地址,并将其与其源地址的转发表条目进行比较来做到这一点。如果数据包来自有效路径(即发件人将用来到达目标的路径)中,设备会将数据包转发到目标地址。如果不是来自有效路径,设备将丢弃数据包。除非得到保护,否则 IP 欺骗可以作为入侵者将 IP 数据包作为真实流量传递到目标的有效方式,而实际上这些数据包实际上并不是针对目标。
IPv4 和 IPv6 协议系列以及虚拟专用网络 (VPN) 地址系列支持单播 RPF。在配置为隧道源的接口上,不支持单播 RPF。这仅影响离开隧道的传输数据包。
有两种模式:单播 RPF、 严格模式和 松散模式。默认为严格模式,这意味着只有当接收接口是数据包单播源地址的最佳返回路径时,交换机才会转发数据包。严格模式对于不受信任的接口(不受信任的用户或进程可以将数据包放入网段)以及对称路由接口(请参阅 何时启用单播 RPF)特别有用。有关严格单播 RPF 的详细信息,请参阅 http://www.ietf.org/rfc/rfc3704.txt 的 RFC 3704 ,多宿主网络的入口过滤 。
要启用所选客户边缘接口上的严格模式单播 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。OSPF 在设备 B 和设备 C 之间的链路以及设备 A 和设备 C 之间的链路上启用,但在设备 A 和设备 B 之间的链路上不会启用 OSPF。因此,设备 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 快速配置
要快速配置此示例,请复制以下命令,将其粘贴到文本文件中,删除所有换行符,更改详细信息,以便与网络配置匹配,然后将命令复制并粘贴到层次结构级别的 CLI 中 [edit]
。
设备 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 protocols
、 show 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,ping 设备 B 的接口,使用 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 操作会成功。