BGP(TCP封装 端口号:xxx → 179)
网络设备之间 |
使用范围 |
邻居建立 |
路由发布 |
|
IGP内部网关协议 |
相互信任 统一管理 |
AS内部 |
自动发现 |
自动发布 |
BGP边界网关协议 |
相互不信任 不统一管理 |
AS之间 |
Peer指定 |
network import-route |
BGP是一种矢量路径协议:
BGP以AS作为拓扑节点(IGP以路由器作为拓扑节点)
- BGP可工作在非直连邻居之间
TCP主动方port:any → 被动方port:179
- BGP路由不周期性更新,只发送增量更新和触发性更新
eBGP:不同AS之间的BGP 防环:AS_PATH
iBGP:同一AS内部的BGP 防环:iBGP水平分割
Router-ID
32位,IPv4地址格式
手工配置 > LoopBack↑ > 接口IP↑
- Router-ID在Open报文中携带
- Router-ID全网唯一
- RR反射路由时, Originator_ID =始发路由器的RID
Cluster-id=RR的RID
路由通告规则
前提:仅通告BGP协议内的最优路由 > *
1. 从EBGP对等体学到的路由,通告给IBGP、EBGP
2. IBGP水平分割: 从IBGP对等体学到的路由,
不会通告给其他IBGP对等体
也不能引入IGP协议中(IGP协议仅引入eBGP路由)
3. BGP同步规则(关闭且无法开启): 路由器从自己的IBGP对等体学习到BGP路由时, 只有又从IGP协议学习到相同路由,才会通告给EBGP对等体
4. 增量更新(仅更新变化的路由)
关于第一条:
只有当一个BGP路由器有≥2个EBGP邻居时,才会将EBGP发来的路由再重新通告回去
例如这个图上,只有R1有2个EBGP邻居
R1会将R3通告来的3.3.3.3/32路由重新通告给R3
R1会将R2通告来的2.2.2.2/32、4.4.4.4/32、5.5.5.5/32路由重新通告给R2
然后再因为AS_Path问题,R3、R2拒收这些路由
而在其他路由器上,并不会将EBGP通过来的路由再通告回去。
BGP需要关注的问题
由于BGP以AS作为节点,且可以建立非直连邻居。需要关注以下几点:
- iBGP水平分割
- eBGP最大跳数问题
- Next_Hop可达性问题
- 更新源接口问题Connect-interface
- 路由黑洞问题
iBGP水平分割带来的问题
由于iBGP水平分割规则(从iBGP邻居收到的路由不会再通告给iBGP邻居),造成BGP路由无法通过iBGP邻居接收
R3无法收到4.0.0.0/8路由
解决办法:
- 全互联iBGP邻居 (R1-R3建立iBGP邻居)
- 路由反射器 (R2配置成RR反射路由)
- 联邦
- RR和联邦是解决AS内全互联的两种方式(使AS内达到IBGP全互联的效果,且IBGP邻居数不至于过多)
- 全互联的iBGP需要更多的TCP连接数n(n-1)/2,若AS内有10个BGP路由器则需要45个连接数,极大得消耗CPU资源,一般不会采用。
- 路由反射器和联邦旨在减少IBGP邻居关系,并解决水平分割问题
BGP路由黑洞问题
R1将1.0.0.0/8发布到了AS 34567,由于AS 34567内部运行OSPF,R7学到这条路由,又发布给R2。此时若R2访问1.0.0.0/8网段,首先访问R7。R7收到数据包后,知道BGP下一跳应该访问R3,于是从OSPF学到下一跳访问R4。R4收到数据包后,由于没有1.0.0.0/8路由,直接丢包。(R5、R6也会有同样问题)
解决BGP路由黑洞问题有以下方法:
1. 开启BGP同步规则(华为默认关闭,且不可开启):
R从IBGP对等体学到的路由,只有同时从IGP协议(静态不算)也学到这条路由,才会通告给EBGP对等体
- R7不通告1.0.0.0/8给R2,除非从OSPF也学到了这条路由
2. AS 34567内iBGP全互联
3. R3将1.0.0.0/8这条BGP路由引入OSPF
4. MPLS
- 如果采用方式3,假设R2上有路由2.0.0.0/8。此时在R3上,会有1.0.0.0/8、2.0.0.0/8两条BGP路由,如果此时[R3-ospf] import-route bgp,只会引入1.0.0.0而不会引入2.0.0.0(IBGP水平分割扩展)
∴ 还需要[R7-ospf] import-route bgp,R1-R2才可互通
ebgp-max-hop问题
EBGP发送的Open报文,默认TTL=1
因此,在使用非直连接口建立EBGP邻居时,需要 [R-bgp] peer x.x.x.x ebgp-max-hop x
- ebgp-max-hop是修改TTL
GTSM是检查TTL在不在合法范围
- ebgp-max-hop仅是针对Open报文的TTL,影响邻居关系建立
GTSM是针对所有BGP报文的TTL
connect-interface问题
BGP默认使用物理接口(路由可达的出接口)建立邻居关系
- connect-interface是Update报文的更新源接口IP
IPv4,建议
1. 使用直连接口(默认),起eBGP邻居(不用修改ebgp-max-hop)
[R1] peer 12.0.0.2 as-number xxx
[R2] peer 12.0.0.1 as-number xxx
2. 使用环回口地址,起iBGP邻居(稳定,如果接口down只要IP可达,邻居还在)
[R1] peer 2.2.2.2 as-number xxx
peer 2.2.2.2 connect-interface LoopBack0
[R2] peer 1.1.1.1 as-number xxx
peer 1.1.1.1 connect-interface LoopBack0
- 如果R1-R2间多条物理链路,使用loopback建立ibgp邻居还可以实现负载分担
- 如果不写更新源,则是12.0.0.1→2.2.2.2和12.0.0.2→1.1.1.1。两个TCP连接都无法启用。
- 如果同时使用两种方式,则建立的是2个邻居关系
IPv6,建议
EBGP邻居:在直连接口配置全球单播地址
IBGP邻居:使用Loopback地址,并指定connect-interface=Loopback地址
- 还需要 [R-bgp] ipv6-family unicast
peer xxxx enable
- (不建议)如果物理接口上没有IPv6全球单播地址,可不配置connect-interface(路由器根据peer指定的LoopBack口地址作为更新源)。但是如果物理接口、环回口同时有IPv6全球单播地址,不指定connect-interface将导致BGP邻居无法建立。
- (不建议)如果,直连邻居使用Link-local起IBGP邻居,也可以。(IBGP邻居可能不直连,Link-local不跨链路)
[R1] bgp 100
router-id 1.1.1.1
peer fe80::2 as-number 100
peer fe80::2 connect-interface g0/0/0 //同一设备多个接口Link-local地址可能相同
ipv6-family unicast
peer fe80::2 enable
BGP防环
AS内: iBGP水平分割: 从iBGP邻居学到的路由不再传给iBGP邻居
RR: 簇内依靠Originator_ID防环
簇间依靠Cluster_List防环
联邦: 依靠联邦内的AS_Path防环
AS间: AS_Path
路由聚合时,聚合路由器上产生一条指向NULL0的聚合路由
SoO
BGP基本配置
[RC] bgp 100
peer 10.1.35.5 as-number 300 //建立EBGP邻居
peer 10.1.35.5 ebgp-max-hop xxx //这里使用直连地址建立RBGP邻居,无需
peer 2.2.2.2 as-number 100 //建立IBGP邻居,前提是AS100中IGP可达
peer 2.2.2.2 connect-interface LoopBack0
- BGP没有多进程(v4、v6在MP-BGP中独立拓扑)
- 常使用LoopBack地址建立IBGP邻居关系,因为LoopBack口不容易Down
[RC] network 3.3.3.3 32
//引入这条直连路由至BGP(注意与OSPF不同,不是激活接口,也没用反掩码)
- BGP协议本身不产生路由,只引入路由。
[RC] ipv4-family unicast //ipv4单播地址族视图
undo synchronization //(自动生成的)华为默认关闭BGP同步规则,实际上也打不开
peer 10.1.35.5 enable
peer 2.2.2.2 enable //(自动生成的)由于建立邻居时使用的是v4地址
peer 2.2.2.2 next-hop-local
//解决下一跳问题(在bgp视图下配置,自动进入地址族视图)
BGP状态机
1. Idle:初始状态。接收到Start事件(操作者配置peer x.x.x.x)转至connect
- 若BGP对等体IP不可达,则一直Idle
2. Connect:主动发起一次TCP连接(然后被动等待TCP连接),启动TCP重传计时器(32s)。
3. Active:主动不断发起TCP连接。
- Connect、Active状态下,
TCP连接 成功发送一个Open报文并转至OpenSent
失败(TCP NAK)转至Active
超时转至Connect
- IP单播不通,TCP超时,双方始终connect
4. OpenSent: 表示自己已发Open,等待对方Open并检查参数
收到Open报文后,检查参数(见Open报文)
如果Open报文正确,转至OpenConfirm状态
5. OpenConfirm: 表示收到了正确的Open报文,发送Keepalive报文。
收到Keepalive报文,转至Established
- Keepalive是对Open报文携带参数的确认
6. Established:邻居关系建立。BGP对等体间交换Update、Keepalive、Route-refresh、Notification报文
- 任何状态下,一旦出错收到Notification报文,状态机返回Idle
- 还有一种No neg(未协商)状态,例如BGP对等体(单播-组播)起邻居
BGP报文
- BGP是承载在TCP协议之上的协议(源端口:随机→目的端口:179)
BGP五种报文均为单播:
Open
Update
Notification
Keepalive
Route-refresh
- Open、Update、Notification、Route-refresh报文采用Header + Message + Data格式
- Keepalive报文只有Header
- BGP报文没有Hello,是因为IGP协议多使用Hello报文(目的组播地址)寻找邻居,而BGP邻居手动指定。
BGP报文头Header
标记128:全1
长度16:BGP报文总长
类型8: 1=Open
2=Update
3=Notification
4=Keepalive
5=Route-refresh
Open报文(建立邻居,协商参数)
TCP建立起来后,邻居双发都要发送一次(无错误情况下)Open报文协商参数。
协商通过,回复一个Keepalive报文。
- TCP保活依赖Keepalive/Update
版本:4
My AS:我的AS号。相同AS号对等体建立IBGP邻居;不同AS号建立EBGP邻居
Hold Time: 邻居关系保活时间。收到Keepalive或Update重置。超时邻居Idle。
Hold Time=180s=3 * Keepalive(60s)
Hold Time可以=0, BGP邻居状态永远Up,且不会发送Keepalive报文
- 双方Hold Time不一致时,可以建立邻居,采用Hold Time↓的
Router-ID:邻居RID冲突无法建立;RR中Originator和Cluster-List使用RID。
可选参数(变长):TLV,支持Route-Refresh、四字节AS号等能力
AFI:Address Family ID地址族ID
SAFI:Sub-AFI
影响BGP邻居关系建立的因素
收到了Open报文:
- 版本
- My AS
- RID
收到不到Open报文:
- TCP层面:双方179端口都被禁止、BGP认证(TCP认证)失败
- IP层面:IP不可达、更新源错误、ebgp-max-hop问题(TTL)
邻居正常、没有路由
- 路由没引入BGP
- RT(私网路由交叉失败)
- 下一跳不可达
- active-route-advertise(BGP邻居间,仅通告全局路由表中活跃的BGP路由)
- 策略
不指定/单向指定connect-interface
(基于环回口)当双方都不指定更新源时,邻居关系无法建立:
R1:192.168.0.1 → 2.2.2.2 //R2 peer的不是192.168.0.1
R2:192.168.0.2 → 1.1.1.1
邻居关系无法建立
一方不指定更新源,一方指定更新源时,可以建立邻居关系:
指定更新源的一方一定为TCP主动方。
R1:1.1.1.1 → 2.2.2.2尝试建立TCP
R2:因为是TCP建链,所以使用2.2.2.2 → 1.1.1.1,而不直连接口地址
- R2主动发起的TCP连接无法建立
Update报文(撤销、通告路由及其属性)
- 一个Update报文通告一条或多条相同路径属性的路由
不同路径属性的路由需要用多个Update报文通告
撤销路由长度16:表示【撤销的路由】字段的长度
撤销的路由(变长):撤销n条路由。需要撤销的路由采用<Length,prefix>格式来表达。 Eg. <24,192.168.1.0>表示192.168.1.0/24路由需被撤销
路径属性长度16:表示【路径属性】字段的长度
路径属性(变长):表示此Update报文中通告给对等体的路由的路径属性
0 |
0 |
0 |
0 |
属性类型代码(8bit) |
第0位: 0=公认 1=可选
第1位: 0=非传递 1=传递
第2位:表示可选传递属性中的信息是完全的(=0)还是部分的(=1)
第3位:表示[路径属性]字段长度是1Byte(=0)还是2Byte(=1)
属性类型代码:
网络层可达信息NLRI(变长):需要被通告的 网络号/掩码 <Length,prefix>
BGP 路由的撤销
使用Update报文,不携带路径属性
Withdraw Routes Length:撤销路由长度(可以撤销多条路由)
Withdraw Routes:撤销的(IPv4)路由
- IPv6、VPNv4等,在【路径属性】中的MP-UNREACH-NLRI撤销
Notification报文(错误通知)
- 当检测到错误时,就会发送Notification报文
- Notification由 错误代码 + 错误子代码 + 数据(变长) 组成
数据字段用于诊断差错原因
Keepalive报文(保活TCP连接)
- BGP没有周期Hello(Open)报文,为了使TCP连接不超时,周期发送Keepalive
- Keepalive报文只携带BGP头部
- Keepalive(默认60s)= 1/3 * Hold Time(默认180s)
- 如果Open报文中协商Hold Time=0,则BGP对等体邻居关系永远Established,不发送Keepalive(但是TCP会超时断链,仅保留邻居关系)
- 如果在Hold Time间隔内,对等体发送过Update消息,则此间隔内不发送Keepalive