拓扑

要求
- ISP use loopbacks for BGP relationships
- ISP3 as a Router Reflector
- AS65000 send outbound traffic perfer :
- ISP6 primary,then ISP 1 backup,and ISP4 second backup
- Traffic send to AS65000 is send from ISP6 as the primary
- AS65002 perfer
- ISP5 with ISP2 as a backup, then ISP7 as secondary backup (outbound)
- Traffic send to AS65002 is send from ISP2 as the primary inbound device (use MED)
- Full mesh using loopback in AS 65000
- advertise a default route to C1 from both C2 and C5. Do this in BGP nor in OSPF
- 禁止后向路由
实现
从BGP宣告默认路由
- C2 和 C5 的BGP里,针对C1 宣告默认路由:neighbor 1.1.1.1 default-route —— 执行该命令后,C2 和 C5 上 show ip bgp 就会显示0.0.0.0/0 的条目,然后C1 会收到两条来自C2 和 C5 的0.0.0.0

- 我们再在 C2 和 C5 上创建prefix-list ,过滤掉 去往C1的其他路由
- ip prefix-list PRE_DEFAULT_ROUTE permit 0.0.0.0/0
- neighbor 1.1.1.1 prefix-list PRE_DEFAULT_ROUTE out


AS65000 出站路径,通过调整Local Preference 实现
- 在C1、C5上确认去到C4 的Inbound 和 Oubound Traffic,目前实际进站和出站走的都是C2-ISP1(包括C5 的出站也走了C2),接下来看如何调整
- AS65000 的出站流量需要优先走 ISP6,ISP1第2选择,ISP4第3选择,
- AS65000 的进站流量需要需要优先走ISP6

- 在R5 上对进站路由设置更高Preference —— route-map 匹配的是从8.1.9.2 的进站路由,但影响的是去到8.1.9.2 的流量
ip prefix-list PRE_DEFAULT_ROUTE seq 5 permit 0.0.0.0/0
ipv6 ioam timestamp
!
route-map SET_LOCAL_PREFERENCE permit 10
set local-preference 200
!
router bgp 65000
neighbor 8.1.9.2 route-map SET_LOCAL_PREFERENCE in
!

- 可以看到 AS65000 出站路径的变化,开始走C5-ISP6
- BGP 不关心bandwidth,不关心hop count,只关系 AS_PATH

- 但是,此时C1的流量还是会先到C2,然后才到C5. 我们在C5 上来做针对C1的调整
router bgp 65000
address-family ipv4
neighbor 1.1.1.1 default-originate route-map SET_LOCAL_PREFERENCE_C1
!
route-map SET_LOCAL_PREFERENCE_C1 permit 10
set local-preference 200
- 来看C1 的路由变化,现在开始直接走 C5-ISP6

到这里,优先走ISP6 已经实现。还需要实现第2选择ISP1,第3选择ISP4
- 在C2上来做调整,对来自ISP1 的路由设置Preference 180,对来自ISP4 的路由设置Preference 150
router bgp 65000
address-family ipv4
neighbor 8.1.1.2 activate
neighbor 8.1.1.2 route-map SET_LOCAL_PREF_180 in
neighbor 8.1.2.2 activate
neighbor 8.1.2.2 route-map SET_LOCAL_PREF_150 in
exit-address-family
!
route-map SET_LOCAL_PREF_150 permit 10
set local-preference 150
!
route-map SET_LOCAL_PREF_180 permit 10
set local-preference 180
!

- 到C5 上关闭和ISP6 的BGP关系 然后再恢复,然后到C2 查看路径变化 —— 来自C5 的路由消失了,开始走ISP1。在C5和ISP6 连接恢复后,C2的路径也恢复。
- neighbor 8.1.9.2 remote 65003 shutdown

到这里,优先走ISP6 已经实现。第2选择ISP1,第3选择ISP4也都实现。
AS65000进站路径优先走ISP6,通过调整AS_PATH 实现
参考
- Shortest AS_PATH
- BGP Fundamental
- C2上的AS_PATH 修改只会传递给ISP1 和 ISP4, ISP2、ISP5 都不会收到
- AS65000 存在来自不同AS的 相同目的地路由,所以需要通过 AS_PATH (可以在eBGP 之间传递)来实现比较
操作
- C4 和 ISP7 当前进站路径都是65001 的 ISP1

- 来看ISP7 的BGP 路由表,到17.1.1.1 有3条路径
- 逆时针走AS65002,65001,65000
- 向上走65001,65000 —— 目前自动选择的线路
- 顺时针走65003,65000 —— 需要人工干预选择的线路

- 我们在C2 上来对ISP1做AS_PATH 的调整 prepend —— 人为使得其路径变长
- set as-path prepend last-as 3 看效果是增加了3个65003,没有起到影响路径变化的效果 —— 是因为ISP1 本来和65000 是直连,没有last-as,所以last-as 不会对到17.1.1.1 的路由产生影响
- 改为 set as-path prepend 65000 65000 65000 后生效 —— 数值可以随便写,建议使用自己所在的AS
router bgp 65000
address-family ipv4
neighbor 8.1.1.2 route-map SET_AS_PATH out
neighbor 8.1.2.2 route-map SET_AS_PATH out
!
route-map SET_AS_PATH permit 10
set as-path prepend last-as 3
!



- 随着ISP7 向C3宣告自己新的可达路由,从8.1.11.1 到17.1.1.1,C3 也撤回了自己之前宣告的走AS65001,65000 的路由


- 再来看下65001 内部的ISP,此时对于ISP1 来说,原先直连的65000 变成了65000 65000 65000 65000 ,没有65003 65000 更优,所以从ISP1 去往17.1.1.1的路径变成了 ISP1-ISP3-ISP4-ISP6-C5-C1

AS65000 出站和入站 的全部调整完成
AS65002 出站调整,通过调整Weight 实现
- 在C3上直接调整来自不同邻居的Weight,ISP5、ISP2、ISP7 分别为200,180,150
router bgp 65002
address-family ipv4
neighbor 8.1.7.2 weight 180
neighbor 8.1.8.2 weight 200
neighbor 8.1.12.2 weight 150
- 断掉和ISP5 的BGP关系,然后在C4观察路由变化

AS65002 进站调整,要求使用MED
- MED 说明
- MED值只有在同1个AS宣告的路由间才有意义。 如果2个不同的AS,宣告相同的路由,同时带了MED,那么此时MED不会作为路由选择的依据,因为AS_PATH 不一样
- 可选的 Non-Transitive BGP PA ,只在直连的邻居上接收,不会继续传递
- 默认情况下,Cisco的设备如果从eBGP 端收到1条没有配置 MED的路由,就会将其设置为0,作为最优路径向iBGP 宣告
- MED 只在1个AS内有意义,也就意味着在AS65001 内的ISP2 和 ISP5 之间可以通过MED比较。但是ISP7 需要通过AS_PATH 的prepend 来实现
- 我们在C3上对去往ISP2 和 ISP5 的路由设置不同的MED
- 反过来是否可以?在ISP2 和 ISP5 上设置 —— 这样应该就不能将ISP7 加进来做比较了
- 需要测试
- 断开ISP7
- In 和 out 的差异
- 在ISP2、ISP5 上部署,和在C3上部署的差异
router bgp 65002
address-family ipv4
neighbor 8.1.7.2 route-map SET_MED_200 out
neighbor 8.1.8.2 route-map SET_MED_100 out
!
route-map SET_MED_200 permit 10
set metric 200
route-map SET_MED_100 permit 10
set metric 100
- MED 值越小,优先级越高。ISP2 学习到了优先级更高的走ISP5路由,于是撤回了走8.1.7.1 去 17.1.2.0的路由

- 但此时C1 到 C4 的路径,还是走下面的ISP7

- 在C3上对去往ISP7的设置AS_PATH prepend,将ISP7 到C3 的路径改为走ISP5
- 为什么此时又收到了来自ISP6 走8.1.11.1 的路由,因为ISP7 不再对ISP6 宣告走8.1.12.1 的路由了,而ISP6 又重新开始向ISP7 宣告



- 再来看C1 到C4 的路径变化,变为了C5-ISP6-ISP4-ISP3-ISP5
- AS65001 出站需要优先走ISP6
- AS65002 进站需要优先走ISP5

- 此时如果将C3 和 ISP5 的BGP连接断开,AS65002 的进站会走到ISP2 而不是走ISP7,符合预期 —— 网络重新收敛需要等待一段时间

残存问题
- ISP7 上可以看到,还有收到来自C3 的去往17.1.1.0 的路由 —— 理想情况下,Traffic 应该是前向的,不应该走后向的路,即使可行 —— 换句话说,65001 不应该通过65002 到达65004

- 我们在C3上来执行1个过滤,C3 只对方发送源头是65002 的路由,利用正则表达式来做个匹配,然后将这个access-list 附加到所有的 route-map 上(1个route-map 下同时存在多个match时,为“且”的关系)
- ip as-path access-list 1 permit 匹配的是没有

- 之后可以看到,ISP7 收到的BGP路由中,下一跳为8.1.12.1 的路由只剩下了去到17.1.2.0 网络的,其余源头不是65002 的都已经被过滤

- 对称地,我们在C5 上对8.1.9.2 out 方向,在C2对ISP1 和 ISP4 Out 方向,都设置同样的规则,只允许转发源AS 是自己的路由
其他
Weight 是本地设置,影响出站Traffic

- 推荐使用Local_preference 来控制1个AS内去往目的地在其他AS的路径