遇到的BGP中更新源检测失败现象
在iBGP建立邻居关系时,往往会采用单播方式的环回口建立邻居,这样做是因为环回口有永不Down的特点。在这种情况下即使是在一个接口出现问题之后,仍然可以通过其他的可用接口保持BGP邻居。然而这种建立方式也存在问题——更新源检测失败。什么是更新源检测失败?
默认下路由器在封装源IP的时候会用自己的发包出接口地址封装源IP,并不使用互相指的单播地址作为源IP。在对端路由器收到Hello报文(建立邻居的数据报)时,路由器会出现更新源检测不通过的情况,因为在对端路由器收到该Hello数据包时会检查数据包中源IP地址是否和对端所指的对端的单播IP相同,如果不是则会被路由器认为是非法报文而丢包,所以我们会用如下的命令修改更新源,使得对端设备的更新源检测通过来建立IBGP邻居。
Router(config) router bgp XX
Router(config-router) neighbor X.X.X.X update-source X.X.X.X
IGP中依然存在更新源检测失败丢弃路由更新包的现象
在IGP双方建邻居的时候,通常是用network命令把接口宣告进入IGP进程中(例如OSPF,RIP,EIGRP等),由于在使用network命令后路由协议都是使用组播建立邻居,所以不需要管理员手动指定对方的地址,就不会出现环回口建立后手动修改更新源的问题,甚至IGP也没有必要用环回口建立邻居,即使在用neighbor命令在建立单播邻居的时候也不会需要修改更新源。
但是不容易发现IGP的更新源检测并不代表着IGP路由器不会进行更新源检测,从而盲目信任对端传路由器过来的更新路由。
下图是以RIP为例,由于RIP更新报文的目的地址是224.0.0.9,所以对端R2会收到R1的RIP的路由更新报文,但是可以看到R2却把这个路由更新报文丢弃了(如下图)。
实例的分析
为什么会丢弃这个报文?通过抓取R1发包到R2的RIP更新包我们可以看见的是,源IP的地址13.0.0.1并不在R1和R2所处在12.0.0.0/24的网段中,出现了更新源检测失败的情况,即源IP和接收报文所在接口的网段不一致(这就是IGP中更新源检测失败的情况),所以R2路由器认为R1发来的路由更新报文是非法报文,而丢弃了这个数据包。
问题的解决
在IGP中出现这种现象往往是由于接口地址配错导致,当重新修改接口IP地址后,等待RIP的重新收敛之后,R1的路由表项正常,说明R1能够正常收到邻居R2\R3传过来的路由。