S9700 OSPF多进程与BGP互相引入路由导致业务转发异常

发布时间:  2015-12-22 浏览次数:  1186 下载次数:  105
问题描述

【版本信息】
 

S9700

V200R003C00SPC500

V200R003SPH012


【组网概述】


如上图,LSW1(S9700)作为MCE设备,R1(NE40E-X3)和R2(NE40E-X3)作为MPLS/IBGP VPN网络的PE设备。

2台防火墙FW1(USG6650)和FW2(USG6650)工作在透明模式,透传所有二层业务;

R1/R2、FW1/FW2、LSW1共5台网络设备,均通过VLANIF100进行管理。

LSW1配置OSPF 101和OSPF 102分别绑定2个VPN实例,这2个VPN实例通过BGP实现VPN路由互访。LSW1通过VLANIF 4和VLANIF 6与R1建立2个OSPF邻居,通过VLANIF 5和VLANIF 7与R2建立2个OSPF邻居。

【故障现象】

CLIENT1客户端访问CLIENT2客户端业务不通。

【配置脚本】

LSW1:

#
router id 192.168.100.39
#
ip vpn-instance Both_Internet&Internal_Service
ipv4-family
  route-distinguisher 65013:3
  vpn-target 300:1 export-extcommunity
  vpn-target 100:1 200:1 300:1 import-extcommunity
#
ip vpn-instance Internal_Service
ipv4-family
  route-distinguisher 65013:2
  vpn-target 200:1 export-extcommunity
  vpn-target 200:1 300:1 import-extcommunity
#
interface Vlanif4
ip binding vpn-instance Internal_Service
ip address 10.20.64.9 255.255.255.252 
#
interface Vlanif5
ip binding vpn-instance Internal_Service
ip address 10.20.64.13 255.255.255.252 
#
interface Vlanif6
ip binding vpn-instance Both_Internet&Internal_Service
ip address 10.20.64.17 255.255.255.252 
#
interface Vlanif7
ip binding vpn-instance Both_Internet&Internal_Service
ip address 10.20.64.21 255.255.255.252 
#
interface Vlanif9
ip binding vpn-instance Both_Internet&Internal_Service
ip address 10.20.64.129 255.255.255.192 
#
interface Vlanif100
ip binding vpn-instance Internal_Service
ip address 172.23.16.1 255.255.255.0 
#
interface GigabitEthernet0/0/1
port link-type trunk
undo port trunk allow-pass vlan 1
port trunk allow-pass vlan 4 6 100
#
interface GigabitEthernet0/0/2
port link-type trunk
undo port trunk allow-pass vlan 1
port trunk allow-pass vlan 5 7 100
#
interface GigabitEthernet0/0/23
port link-type access
port default vlan 9
#
interface GigabitEthernet0/0/24
port link-type access
port default vlan 100
#
interface LoopBack0
ip address 192.168.100.39 255.255.255.255 
#
bgp 65013
#
ipv4-family unicast
  undo synchronization
#
ipv4-family vpn-instance Both_Internet&Internal_Service 
  import-route direct
#
ipv4-family vpn-instance Internal_Service 
  import-route direct
#
ospf 101 router-id 192.168.100.39 vpn-instance Internal_Service
import-route direct
import-route static
vpn-instance-capability simple
area 0.0.0.0 
  network 10.20.64.8 0.0.0.3 
  network 10.20.64.12 0.0.0.3 
  network 192.168.200.39 0.0.0.0 
#
ospf 102 router-id 192.168.100.39 vpn-instance Both_Internet&Internal_Service
import-route direct
import-route static
vpn-instance-capability simple
area 0.0.0.0 
  network 10.20.64.16 0.0.0.3 
  network 10.20.64.20 0.0.0.3 
#

R1:

#
router id 192.168.100.37
#
ip vpn-instance Both_Internet&Internal_Service
ipv4-family
  route-distinguisher 65000:75
  vpn-target 300:1 export-extcommunity
  vpn-target 100:1 200:1 300:1 import-extcommunity
#
ip vpn-instance Internal_Service
ipv4-family
  route-distinguisher 65000:74
  vpn-target 200:1 export-extcommunity
  vpn-target 200:1 300:1 import-extcommunity
#
ip vpn-instance Internet
ipv4-family
  route-distinguisher 65000:73
  vpn-target 100:1 export-extcommunity
  vpn-target 100:1 300:1 import-extcommunity
#
mpls lsr-id 192.168.100.37
mpls
#
mpls ldp
#
interface GigabitEthernet0/0/0
ip address 10.20.64.25 255.255.255.252
mpls
mpls ldp
#
interface GigabitEthernet0/0/1.4
vlan-type dot1q 4
ip binding vpn-instance Internal_Service
ip address 10.20.64.10 255.255.255.252
#
interface GigabitEthernet0/0/1.6
vlan-type dot1q 6
ip binding vpn-instance Both_Internet&Internal_Service
ip address 10.20.64.18 255.255.255.252
#
interface GigabitEthernet0/0/1.100
vlan-type dot1q 100
ip binding vpn-instance Internal_Servicef
ip address 172.23.16.2 255.255.255.0
#
interface LoopBack0
ip address 192.168.100.37 255.255.255.255
#
bgp 65000
peer 192.168.100.38 as-number 65000
peer 192.168.100.38 connect-interface LoopBack0
#
ipv4-family unicast
  undo synchronization
  peer 192.168.100.38 enable 

ipv4-family vpnv4
  policy vpn-target
  peer 192.168.100.38 enable 

ipv4-family vpn-instance Both_Internet&Internal_Service 
  import-route static 
  import-route ospf 102 

ipv4-family vpn-instance Internal_Service 
  import-route static 
  import-route ospf 101

ospf 1 router-id 192.168.100.37 
area 0.0.0.0 
  network 10.20.64.24 0.0.0.3 
  network 192.168.100.37 0.0.0.0 

ospf 101 router-id 192.168.100.37 vpn-instance Internal_Service 
import-route static 
import-route bgp 
area 0.0.0.0 
  network 10.20.64.8 0.0.0.3 
  network 192.168.200.37 0.0.0.0 
#
ospf 102 router-id 192.168.100.37 vpn-instance Both_Internet&Internal_Service
import-route static 
import-route bgp 
area 0.0.0.0 
  network 10.20.64.16 0.0.0.3 
#

R2:

#
router id 192.168.100.38
#
ip vpn-instance Both_Internet&Internal_Service
ipv4-family
  route-distinguisher 65000:78
  vpn-target 300:1 export-extcommunity
  vpn-target 100:1 200:1 300:1 import-extcommunity
#
ip vpn-instance Internal_Service
ipv4-family
  route-distinguisher 65000:77
  vpn-target 200:1 export-extcommunity
  vpn-target 200:1 300:1 import-extcommunity
#
ip vpn-instance Internet
ipv4-family
  route-distinguisher 65000:76
  vpn-target 100:1 export-extcommunity
  vpn-target 100:1 300:1 import-extcommunity
#
mpls lsr-id 192.168.100.38
mpls
#
mpls ldp
#
interface GigabitEthernet0/0/0
ip address 10.20.64.26 255.255.255.252
mpls
mpls ldp
#
interface GigabitEthernet0/0/2.5
vlan-type dot1q 5
ip binding vpn-instance Internal_Service
ip address 10.20.64.14 255.255.255.252
#
interface GigabitEthernet0/0/2.7
vlan-type dot1q 7
ip binding vpn-instance Both_Internet&Internal_Service
ip address 10.20.64.22 255.255.255.252
#
interface GigabitEthernet0/0/2.100
vlan-type dot1q 100
ip binding vpn-instance Internal_Service
ip address 172.23.16.3 255.255.255.0
#
interface LoopBack0
ip address 192.168.100.38 255.255.255.255
#
bgp 65000
peer 192.168.100.37 as-number 65000
peer 192.168.100.37 connect-interface LoopBack0
#
ipv4-family unicast
  undo synchronization
  peer 192.168.100.37 enable
#
ipv4-family vpnv4
  policy vpn-target
  peer 192.168.100.37 enable
#
ipv4-family vpn-instance Both_Internet&Internal_Service
  import-route static
  import-route ospf 102
#
ipv4-family vpn-instance Internal_Service
  import-route static
  import-route ospf 101
#
#
ospf 1 router-id 192.168.100.38
area 0.0.0.0
  network 10.20.64.24 0.0.0.3
  network 192.168.100.38 0.0.0.0
#
ospf 101 router-id 192.168.100.38 vpn-instance Internal_Service
import-route static
import-route bgp
area 0.0.0.0
  network 10.20.64.12 0.0.0.3
  network 192.168.100.38 0.0.0.0
#
ospf 102 router-id 192.168.100.38 vpn-instance Both_Internet&Internal_Service
import-route static
import-route bgp
area 0.0.0.0 
network 10.20.64.20 0.0.0.3
#

处理过程

1、路由分析

如图1所示,VLANIF 9和VLANIF 100是跨VPN互访,LSW1在VLANIF 9收到发往172.23.16.0网段的报文。

图4-1 VLANIF 9和VLANIF 100是跨VPN互访


此时,通过路由表查询下一跳,业务应该直接转发给CLIENT2,如图2所示。

 



图3 务直接转发给CLIENT2


但是发现ICMP的响应报文通过负载分担,分别指向了R1和R2,如图4。

 


 

图5ICMP的响应报文的指向

而由于FW1和FW2是基于状态的防火墙,在没有收到ICMP请求报文的时候,如果直接收到了ICMP回应的报文,那么无论域间策略是否允许通过,ICMP回应的报文都是会被Discard的,如图5。

图5ICMP回应的报文都是会被Discard

这就是典型的业务来回路径不一致被防火墙误丢弃的例子。

2、分析来回路径不一致的原因

首先,观察图6红色线条,CLIENT2访问CLIENT1的报文明明是可以直接通过LSW1到达CLIENT1的,为什么现网中却要在路由器上绕行一圈呢?
进一步检查,发现这条绕行的路由是通过OSPF 102学习到的5类路由:


 
在VPN本地互访时,存在本地路由交叉,该路由交叉通过BGP实现,而BGP的路由优先级为255,OSPF的5类路由优先级为150,可以猜测是由于LSW1错误地学习到了OSPF的5类路由,所以将BGP本地交叉的路由给替换掉了。

为验证上述猜测,先理论分析一下,这条5类路由是如何到达LSW1的?

a. LSW1将VLANIF 9的直连路由通过OSPF102发送给了R1,如下图7  蓝线:


b. 查看R1上的路由引入配置,如下:(这里只截取产生问题的部分配置)

R1:

#
BGP 65000
ipv4-family vpn-instance Both_Internet&Internal_Service
  import-route static
  import-route ospf 102
#
ip vpn-instance Both_Internet&Internal_Service
ipv4-family
  route-distinguisher 65000:75
  vpn-target 300:1 export-extcommunity
  vpn-target 100:1 200:1 300:1 import-extcommunity
#
ip vpn-instance Internal_Service
ipv4-family
  route-distinguisher 65000:74
  vpn-target 200:1 export-extcommunity
  vpn-target 200:1 300:1 import-extcommunity
#
ospf 101 router-id 192.168.100.37 vpn-instance Internal_Service
import-route bgp
#

此时在R1上报文走向如图8 所示。

阶段①:R1将OSPF 102中学习到的路由条目引入BGP实例表Both_Internet&Internal_Service中。

阶段②:由于实例Both_Internet&Internal_Service和实例Internal_Service之间存在互访策略,在R1上发生BGP VPN路由本地交叉时,路由条目下发至BGP VPN实例表Internal_Service。

阶段③:由于OSPF 101 VPN-Instance Internal_Service导入了BGP路由表,此时BGP VPN路由下发至OSPF 101路由表,记为5类LSA引入的外部路由。

图8 R1上报文走向

 

 
关于阶段③的过程,可以通过在R1上命令查询OSPF 101的LSDB获得佐证,如下图9:

 



上图中,192.168.100.37 通告者即为R1,192.168.100.38通告者为R2,R2的路由走向与R1相类似,此处略。

c. 如图4-6所示,在R1通过OSPF 101将路由通告给了LSW1。在LSW1上,产生了OSPF 101进程学习到的5类LSA引入的外部路由,此路由的优先级高于BGP VPN本地交叉的路由,导致最终在下发FIB表的时候,将OSPF 101引入的路由下发,而BGP VPN本地交叉的路由未获得下发,导致问题。

图10 在R1通过OSPF 101将路由通告给LSW1


 


3、分析在Client1访问Client2的时候,为什么并没有经过路由器绕行呢?而在LSW1上直接就将报文发送给了Client2?如图11。

图11 LSW1直接将报文发送给Client2


a. 确认R1并未将该路由引入至BGP。

如图12所示,问题就发生在阶段①,由于VLAN 100是用作网络设备管理的,所以每台网络设备都会有这个网段对应的逻辑接口。

图12 问题发生阶段

 



例如,R1上存在如下的管理接口配置:

#
interface GigabitEthernet0/0/1.100
vlan-type dot1q 100
ip binding vpn-instance Internal_Servicef
ip address 172.23.16.2 255.255.255.0
#

这里就存在一个机制:路由协议之间互相引入的路由,都是已经优选的路由。

很明显,在R1上,对于VPN实例Internal_Service,优选的路由为直连路由,如下图13:

 



此时OSPF学习到的路由并未成为优选路由,所以在阶段①,BGP路由引入时,不会引入该路由,可以在R1设备上通过如下命令查询作为佐证,可以看出,R1并未将该路由引入至BGP。

 


 

b. 测试OSPF路由是否被引入。

将R1设备上0/0/1.100逻辑接口shutdown,如下:
 



此时再在R1设备上通过命令查询,可见OSPF路由被引入。

 


 

此时,再在LSW1上查询Client1发往Client2的路由,现象与Client2发往Client1的问题相同。
 

根因
BGP多VPN实例与OSPF多进程路由互相引入时,由于OSPF路由优先级高于BGP,导致路由来回路径不一致,在防火墙上业务被丢弃。
解决方案

1、在BGP中,引入的OSPF路由条目,会有一个团体名的标记如下:
 



事实上,在OSPF中引入BGP路由时,仅仅想引入通过MP-IBGP学习到的L3VPN路由,而不是本地的路由条目,相反,需要禁止OSPF进程之间的路由学习。

基于上述分析,可以在OSPF引入BGP路由时进行路由策略过滤,R1上配置如下:

 


 


 


 


 

R2配置相同,此处不再展示。


2、完成后,看看LSW1上路由问题是否解决。
 


 



通过以上显示信息,可见此时OSPF 101不再引入10.20.64.128/26网段的路由,问题解决。

建议与总结
现网设备由于路由条目数量繁多,问题排查一般需要考虑设备转发行为、路由下发策略,路由优先级等。

END