在两个BGP互联的网络中,通常会有多个不同的出口。通常,为了保证网络的正常运行,会选择multi-home的 出口建设方式,以保证网络的稳定运行。这种方案经常被用于运营商网络之间。

  但是,由于BGP协议的特殊性,虽然有BGPmulti-path的选项,但是在在两个BGP网络间,由于管理人员、路由策略的不同,往往会导致多出 口时无法实现多出口的流量负载分担。这个问题使网络带宽的利用率有所下降,这对运营商来说,是非常浪费资源的(运营商之间的网络互联费用是及其昂贵的)。

根据BGP协议的选路原则:
1、最大的WEIGHT值(CISCO私有),只作用于本路由器
2、最大的local preference优先
3、本网络的用network、aggregate或redistribution IGP产生的路由,network/redistribution的路由优于aggregate产生的路由
4、最短的AS路径优先
5、最低的产生方式优先:IGP<EGP<INCOMPLETE
6、最小的MED值优先
7、eBGP优于iBGP
8、最小的到BGP next hop IP地址的IGP metric值的路径优先
9、当配置了maximum-paths命令,允许有多条路径
10、如果多条路径都是外部路由,先接收到的优先
11、最小的router ID优先
12、当多条路径的源或者是RID相同的时候,最小的cluster ID优先
13、最小的neighbor地址优先

   路由反射器会认为来自于路由器A的路由优先。而只对外广播一条最优路由。这种情况下,运营商A流向运营商B的流量大部分将通过路由器A的链路。导致了路 由器A的链路拥塞,而路由器B的链路空闲。

   为了解决这个问题,从而出现了虚拟下一跳的解决方案。
  虚拟下一跳的方案,主要的目的是将运营商A的A、B两个出口路由器上收到的运营商B的所有路由,强行将下一跳地址改为一个相同的IP地址,再将这些路 由广播到路由反射器,而这个IP地址的路由是指向运营商B的。这时,运营商A的路由反射器中,只有一条最优路由,就是到该虚拟下一跳IP地址的路由。从而 避免了路由反射器只反射一条最优路由的问题。

   同样,当在路由器A、B上与路由反射器建立邻居时,即使使用了next-hop-self的命令,由于路由器A、B的Router ID的不一致,在不使用虚拟下一跳的情况下,也会产生只有一条最优路由被广播到网络中的问题。

   下面为路由器A与路由器B的虚拟下一跳配置文件:
路由器A:
router ospf 1
redistribute static metric 1 metric-type 1 subnets route-map virtualaddress-to-ospf
router bgp 100
neighbor 192.168.1.2 remote-as 100
neighbor 192.168.1.2 description TO-RouteReflector
neighbor 192.168.1.2 send-community
neighbor 192.168.1.2 route-map setnexthop-to-virtualaddress out
neighbor 192.168.0.2 remote-as 200
neighbor 192.168.0.2 description ISP-B
route-map setnexthop-to-virtualaddress permit 10
match ip address prefix-list ISP-B
set ip next-hop 10.0.0.1
route-map setnexthop-to-virtualaddress permit 20
route-map virtualaddress-to-ospf permit 10
match ip address prefix-list virtualaddress
ip prefix-list virtualaddress seq 5 permit 10.0.0.1/32
ip prefix-list ISP-B seq 5 permit 172.16.0.0/24
ip prefix-list ISP-B seq 10 permit 172.16.1.0/24
......
ip route 10.0.0.1 255.255.255.255 192.168.0.2

路由器B:
router ospf 1
redistribute static metric 1 metric-type 1 subnets route-map virtualaddress-to-ospf
router bgp 100
neighbor 192.168.1.2 remote-as 100
neighbor 192.168.1.2 description TO-RouteReflector
neighbor 192.168.1.2 send-community
neighbor 192.168.1.2 route-map setnexthop-to-virtualaddress out
neighbor 192.168.0.4 remote-as 200
neighbor 192.168.0.4 description ISP-B
route-map setnexthop-to-virtualaddress permit 10
match ip address prefix-list ISP-B
set ip next-hop 10.0.0.1
route-map setnexthop-to-virtualaddress permit 20
route-map virtualaddress-to-ospf permit 10
match ip address prefix-list virtualaddress
ip prefix-list virtualaddress seq 5 permit 10.0.0.1/32
ip prefix-list ISP-B seq 5 permit 172.16.0.0/24
ip prefix-list ISP-B seq 10 permit 172.16.1.0/24
......
ip route 10.0.0.1 255.255.255.255 192.168.0.4