2. BGP的理论与实践

125 阅读4分钟

理论知识

1.1 先把“BGP 是什么”讲清楚(核心结论)

  • BGP(BGP-4)是用于自治系统(AS)之间交换路由信息的路径向量协议(path-vector),是互联网骨干路由的基石。它通过建立基于 TCP 的邻居会话来交换路由(协议规范见 RFC 4271)。
  • 在实验环境通常区分 eBGP(不同 AS 之间)和 iBGP(同一 AS 内部)。eBGP 与 iBGP 在 next-hop 处理、AS_PATH 改写、对等策略等方面有不同规则(稍后详述).

1.2 建立会话的基本机制(很重要)

  • BGP 使用 TCP(端口 179) 建立可靠连接;连接建立后交换 OPEN/Capabilities,然后用 KEEPALIVE/UPDATE/NOTIFICATION 完成会话和路由交换。典型的 BGP 消息类型:OPEN / UPDATE / KEEPALIVE / NOTIFICATION(和可选的 route-refresh 等)。
  • BGP 有自己的有限状态机(Idle → Connect → OpenSent → OpenConfirm → Established),会话不在 Established 就无法交换路由,排查常见问题时应查看这些状态。

1.3 重要路径属性(用于决策与策略)

按属性功能分为:Well-known mandatory / Well-known discretionary / Optional transitive / Optional non-transitive(RFC 定义)。实践中最常见且最常用来影响选路的属性包括:

  • AS_PATH(路径回溯与环路检测)
  • NEXT_HOP(数据包下一跳,递归解析)
  • LOCAL_PREF(同 AS 内偏好,本地值,影响出口选择)
  • MED(Multi-Exit Discriminator) (跨 AS 的入口偏好,低值优先)
  • ORIGIN(IGP/EGP/INCOMPLETE)
  • COMMUNITY / EXTENDED COMMUNITY(标签化并用于策略)

这些属性的组合与优先级决定了路由的“最佳路径”选择。RFC

1.4 BGP 最佳路径选择(步骤要熟记)

不同厂商略有细节差异,但主流实现(Cisco/Juniper 等)的常见比较顺序(简化版)大致是:

  1. Weight(厂商私有,路由器本地最高优先)
  2. Local-Preference(本 AS 内,值大者优先)
  3. 是否本地来源(network/aggregate/redistribute)
  4. AS_PATH 最短(更少 AS 跳数优先)
  5. ORIGIN(IGP < EGP < INCOMPLETE)
  6. MED(值小优先;通常只在同一邻居 AS 间比较,厂商可调)
  7. prefer eBGP 路径胜过 iBGP
  8. IGP 路由到 next-hop 的开销(更小优先)
  9. Router ID / 最后 tiebreakers(如最小 BGP router-id)

(此为通用流程,厂商实现会有附加 tie-breaker,例如 Cisco 的 weight、deterministic-med 等设定。)Cisco

1.5 iBGP 的“全网内”限制与扩展机制

  • iBGP 不会把从一个 iBGP 学到的路由再通告给另一个 iBGP 对等体(为避免环路),因此在大型 AS 中需要:
    • 全互连(full-mesh iBGP;规模小可行)
    • Route Reflector(路由反射器)
    • Confederation(联合体) 三种扩展方案来缩放 iBGP。
  • Route Reflector 在“反射”时一般不应改变 NEXT_HOP/AS_PATH 等关键属性(规范上是 SHOULD NOT,但实现上不同厂商/平台可能有可选的 next-hop 改写功能)。这就是为什么在 iBGP 设计中,next-hop 的可达性与 IGP(或 next-hop-self)配置非常关键。NetworkLessons.comipSpace.net Blog

1.6 next-hop 的实务要点(很常踩坑)

  • eBGP 对等体向外宣布时通常会将 next-hop 设置为自身(来源接口);而当一台边缘路由器把从 eBGP 学到的路由通过 iBGP 广播给其他内部路由器时,默认不会改写 next-hop(因此内部路由器必须能通过 IGP/静态等方式解析到该 next-hop 才能转发)。如果不能,就需要用 next-hop-self(或等效命令)或把 next-hop 所在网段注入 IGP/advertise。

info.support.huawei.com/info-finder…

实验

2.1 拓扑图

2.2 各机器配置

A SW1

#
interface LoopBack0
 ip address 192.168.10.1 255.255.255.0
#
interface GigabitEthernet0/0
 port link-mode route
 combo enable copper
 ip address 100.1.1.1 255.255.255.0
#

#
bgp 100
 router-id 1.1.1.1
 peer 100.1.1.2 as-number 200
 #
 address-family ipv4 unicast
  network 192.168.10.0 255.255.255.0 #引入业务网段
  peer 100.1.1.2 enable
#
return

B SW2

#
interface LoopBack0
 ip address 2.2.2.2 255.255.255.255
#
interface GigabitEthernet0/0
 port link-mode route 
 combo enable copper
 ip address 100.1.1.2 255.255.255.0
#
interface GigabitEthernet0/1
 port link-mode route
 combo enable copper
 ip address 100.2.2.2 255.255.255.0
# 

#
ospf 1 router-id 2.2.2.2
 import-route bgp #防止黑洞
#
  分析:由于 R3 没有运行 BGP ,无法学习到业务网段路由,
   然而业务网段之间通讯的数据包会经过 R3 转发,所以造成 R3 上存在 BGP 路由黑洞
  这里通过把 BGP 引入到 OSPF,使 R3 可以通过 OSPF 学习到业务网段的路由,
    来解决 BGP 路由黑洞问题
#
 area 0.0.0.0
  network 2.2.2.2 0.0.0.0
  network 100.1.1.0 0.0.0.255
  network 100.2.2.0 0.0.0.255
#

#
bgp 200
 router-id 2.2.2.2
 peer 4.4.4.4 as-number 200 #ibgp
 peer 4.4.4.4 connect-interface LoopBack0 #ibgp建立连接并不要求直连,所以会指定src端口为loopback
 peer 100.1.1.1 as-number 100 #ebgp
 #
 address-family ipv4 unicast
  peer 4.4.4.4 enable
  peer 4.4.4.4 next-hop-local # 针对ibgp情况,把自己设为下一跳,避免邻居收到了不可达的 next-hop
  peer 100.1.1.1 enable
#

C SW3

#
interface LoopBack0
 ip address 3.3.3.3 255.255.255.255
#
interface GigabitEthernet0/0
 port link-mode route
 combo enable copper
 ip address 100.2.2.3 255.255.255.0
#
interface GigabitEthernet0/1
 port link-mode route
 combo enable copper
 ip address 100.3.3.3 255.255.255.0
#

#
ospf 1 router-id 3.3.3.3
 area 0.0.0.0
  network 3.3.3.3 0.0.0.0
  network 100.2.2.0 0.0.0.255
  network 100.3.3.0 0.0.0.255
#

D SW4

#
interface LoopBack0
 ip address 4.4.4.4 255.255.255.255
#
interface GigabitEthernet0/0
 port link-mode route
 combo enable copper
 ip address 100.3.3.4 255.255.255.0
#
interface GigabitEthernet0/1
 port link-mode route
 combo enable copper
 ip address 100.4.4.4 255.255.255.0
#

#
ospf 1 router-id 4.4.4.4
 import-route bgp
 area 0.0.0.0
  network 4.4.4.4 0.0.0.0
  network 100.3.3.0 0.0.0.255
  network 100.4.4.0 0.0.0.255
#
return

#
bgp 200
 router-id 4.4.4.4
 peer 2.2.2.2 as-number 200
 peer 2.2.2.2 connect-interface LoopBack0
 peer 100.4.4.5 as-number 300
 #
 address-family ipv4 unicast
  peer 2.2.2.2 enable
  peer 2.2.2.2 next-hop-local
  peer 100.4.4.5 enable
#
return

E SW5

#
interface LoopBack0
 ip address 192.168.20.1 255.255.255.0
#
interface GigabitEthernet0/0
 port link-mode route
 combo enable copper
 ip address 100.4.4.5 255.255.255.0
#

#
bgp 300
 router-id 5.5.5.5
 peer 100.4.4.4 as-number 200
 #
 address-family ipv4 unicast
  network 192.168.20.0 255.255.255.0
  peer 100.4.4.4 enable
#
return

2.3 实验结果