拓扑

实验 6X16 - CCNP Large Scale BGP @David - 图1

要求

  1. ISP use loopbacks for BGP relationships
  2. ISP3 as a Router Reflector
  3. AS65000 send outbound traffic perfer :
    1. ISP6 primary,then ISP 1 backup,and ISP4 second backup
    2. Traffic send to AS65000 is send from ISP6 as the primary
  4. AS65002 perfer
    1. ISP5 with ISP2 as a backup, then ISP7 as secondary backup (outbound)
    2. Traffic send to AS65002 is send from ISP2 as the primary inbound device (use MED)
  5. Full mesh using loopback in AS 65000
  6. advertise a default route to C1 from both C2 and C5. Do this in BGP nor in OSPF
  7. 禁止后向路由

实现

从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

实验 6X16 - CCNP Large Scale BGP @David - 图2

  • 我们再在 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

实验 6X16 - CCNP Large Scale BGP @David - 图3

  • 在C2上查看向C1 宣告的路由

实验 6X16 - CCNP Large Scale BGP @David - 图4

AS65000 出站路径,通过调整Local Preference 实现

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

实验 6X16 - CCNP Large Scale BGP @David - 图5

  • 在R5 上对进站路由设置更高Preference —— route-map 匹配的是从8.1.9.2 的进站路由,但影响的是去到8.1.9.2 的流量
  1. ip prefix-list PRE_DEFAULT_ROUTE seq 5 permit 0.0.0.0/0
  2. ipv6 ioam timestamp
  3. !
  4. route-map SET_LOCAL_PREFERENCE permit 10
  5. set local-preference 200
  6. !
  7. router bgp 65000
  8. neighbor 8.1.9.2 route-map SET_LOCAL_PREFERENCE in
  9. !
  • 观察C2 和C5 的BGP路由条目变化

实验 6X16 - CCNP Large Scale BGP @David - 图6

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

实验 6X16 - CCNP Large Scale BGP @David - 图7

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

实验 6X16 - CCNP Large Scale BGP @David - 图8

到这里,优先走ISP6 已经实现。还需要实现第2选择ISP1,第3选择ISP4
  • 在C2上来做调整,对来自ISP1 的路由设置Preference 180,对来自ISP4 的路由设置Preference 150
  1. router bgp 65000
  2. address-family ipv4
  3. neighbor 8.1.1.2 activate
  4. neighbor 8.1.1.2 route-map SET_LOCAL_PREF_180 in
  5. neighbor 8.1.2.2 activate
  6. neighbor 8.1.2.2 route-map SET_LOCAL_PREF_150 in
  7. exit-address-family
  8. !
  9. route-map SET_LOCAL_PREF_150 permit 10
  10. set local-preference 150
  11. !
  12. route-map SET_LOCAL_PREF_180 permit 10
  13. set local-preference 180
  14. !
  • C2 目前到C4的路径

实验 6X16 - CCNP Large Scale BGP @David - 图9

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

实验 6X16 - CCNP Large Scale BGP @David - 图10

到这里,优先走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

实验 6X16 - CCNP Large Scale BGP @David - 图11

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

实验 6X16 - CCNP Large Scale BGP @David - 图12

  • 我们在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
  1. router bgp 65000
  2. address-family ipv4
  3. neighbor 8.1.1.2 route-map SET_AS_PATH out
  4. neighbor 8.1.2.2 route-map SET_AS_PATH out
  5. !
  6. route-map SET_AS_PATH permit 10
  7. set as-path prepend last-as 3
  8. !

实验 6X16 - CCNP Large Scale BGP @David - 图13

  • 来看ISP7 的前后变化,走

实验 6X16 - CCNP Large Scale BGP @David - 图14

实验 6X16 - CCNP Large Scale BGP @David - 图15

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

实验 6X16 - CCNP Large Scale BGP @David - 图16

  • 再来看C4 的路径变化

实验 6X16 - CCNP Large Scale BGP @David - 图17

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

实验 6X16 - CCNP Large Scale BGP @David - 图18

AS65000 出站和入站 的全部调整完成

AS65002 出站调整,通过调整Weight 实现

  • 在C3上直接调整来自不同邻居的Weight,ISP5、ISP2、ISP7 分别为200,180,150
  1. router bgp 65002
  2. address-family ipv4
  3. neighbor 8.1.7.2 weight 180
  4. neighbor 8.1.8.2 weight 200
  5. neighbor 8.1.12.2 weight 150
  • 断掉和ISP5 的BGP关系,然后在C4观察路由变化

实验 6X16 - CCNP Large Scale BGP @David - 图19

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上部署的差异
  1. router bgp 65002
  2. address-family ipv4
  3. neighbor 8.1.7.2 route-map SET_MED_200 out
  4. neighbor 8.1.8.2 route-map SET_MED_100 out
  5. !
  6. route-map SET_MED_200 permit 10
  7. set metric 200
  8. route-map SET_MED_100 permit 10
  9. set metric 100
  • MED 值越小,优先级越高。ISP2 学习到了优先级更高的走ISP5路由,于是撤回了走8.1.7.1 去 17.1.2.0的路由

实验 6X16 - CCNP Large Scale BGP @David - 图20

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

实验 6X16 - CCNP Large Scale BGP @David - 图21

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

实验 6X16 - CCNP Large Scale BGP @David - 图22

实验 6X16 - CCNP Large Scale BGP @David - 图23

实验 6X16 - CCNP Large Scale BGP @David - 图24

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

实验 6X16 - CCNP Large Scale BGP @David - 图25

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

实验 6X16 - CCNP Large Scale BGP @David - 图26

残存问题

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

实验 6X16 - CCNP Large Scale BGP @David - 图27

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

实验 6X16 - CCNP Large Scale BGP @David - 图28

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

实验 6X16 - CCNP Large Scale BGP @David - 图29

  • 对称地,我们在C5 上对8.1.9.2 out 方向,在C2对ISP1 和 ISP4 Out 方向,都设置同样的规则,只允许转发源AS 是自己的路由

其他

Weight 是本地设置,影响出站Traffic

实验 6X16 - CCNP Large Scale BGP @David - 图30

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