BGP-基础

  • BGP 系列第一篇: BGP-基础

  • 资料来源:

    https://www.bilibili.com/video/av38160343
    http://ccietea.com/Folder_TechNotes/BGP.pdf

  • 更新

    1
    2020.11.19 初始

导语

BGP 的笔记整理快半个月了,还没敲定终稿.先发着吧…

目前应用最多的就剩下俩路由协议了 OSPF 和 BGP.一个域内,一个域间就构成了经典的地面网络架构.

于是开了俩天坑,到现在还没到半山腰

这一篇是 BGP 的综述 && 基础.

BGP

BGP 全称是 边界网关协议 是一个互联网上去中心的自治路由协议.

  • 维护IP路由表或‘前缀’表来实现自治系统(AS)之间的可达性
  • bgp 更应该称为矢量性协议,而不是路由协议
  • 大多数 isp 之间使用的都是 bgp
  • 最新的是 BGP-4 于 2006 年 RFC 4271

最通俗来说,bgp 主要用来协调维护 AS 之间的路由表,使用 tcp 通信.

  • AS: Autonomous system 自治系统,可以说是一个大型的局域网.然后互联网就建立在这些局域网(AS) 的互联互通上.一个 isp 可能有很多 AS.
  • 每个 AS 都有一个编号,2字节 1-65535.(64512-65535 私有).
  • bgp 运行在 tcp 之上,使用 179 端口.这让 bgp 可以运行在 vpn 组网上(好像没别的路由协议是传输层往上的).

bgp 协议运行在 AS 之间,当路由信息变化时交换路由信息选择最佳路径,最基础的原则 AS 跳数最少.

  • 原则上只有路由信息变化后,bgp 对等体之间才会有路由信息更新.
  • 每一条 bgp 更新消息都带有一个 AS-PATH 属性,携带这条路由信息走过的所有 AS ,这条属性最根本的作用是防止路由环路.
  • bgp 对等体分为两种v
    • ebgp: 不同 AS 的出口路由器之间.一般是直连.
    • ibgp: AS 内部运行路由器之间,只要求 tcp 通.
    • 在 ebgp 和 ibgp 之间的路由信息交换如何设计隐藏了陷阱.

BGP 表

bgp 默认有 3 张表

  • 邻居表 Neighbor table: show ip bgp summary
    • 保存有 bgp 邻居的信息
  • bgp 表 BGP table: show ip bgp
    • 存放所有路由条目,bgp 会按照选路规则选出最优路径放到路由表.
  • 路由表 Routing table: show ip route
    • 实际使用 ip 路由表

BGP 报文

Tcp 179端口,无需对等直连,只要能通,就能建立连接.

L2 hraderip headertcp headerbgp packetsfcs
协议号6179端口bag header,bgp packet

BGP消息报头:

bgp header
marker(16B)length 2BType 1B
  • Marker:用于检测BGP对等体之间同步丢失情况,并且在支持验证功能的情况下进行消息验证如果消息类型为open或open消息中 没有包含验证消息,标志字段被置为全1,否则标志字段通过某些计算得到(作为验证进程的一部分)
  • Length:表示BGP报文的全部长度,包括头部
  • TYPE:1-open;2-update;3-Notification;4-keepalive

BGP消息报文:

bgp packet
OPENUpdateNotificationKeepaliveRoute-refresh
  • open: 协调 bgp 邻居的参数,tcp建立后第一个报文.

  • update: (对等邻居)更新路由信息

  • notification: 检测到错误,通告对等体,之后链接可能断开.

  • keepalive: 保活,保持邻居关系.(建立链接时,第二个报文)

  • route-refresh: 刷新 bgp 路由.

BGP 状态机

Peer状态名称发什么包在做什么
idel尝试建立 tcp 连接路由表寻找到邻居,准备TCP的连接,监视远程peer启动TCP连接.
Connect发 tcp 包tcp 连不上,进入 Active.成功连上进入 Opensent 发送 Open 消息
Active发 tcp 包连不上一直连
OpenSent发 Open 包发送 Open 包协商.存在错误,发送 Notification消息.正常没错,则进入OpenConfirm
OpenConfirm发 Keepalive 包协商成功,发 Keepalive,收到对等体的 Keepalive 进入 Established
Established发 Update 包收到对等体 Keepalive,开始发送路由信息

update-source

BGP无法自动发现邻居,而需手工指定.

邻居的 ip 由本地的 BGP neighbor命令指定,而该 BGP 连接的源 IP(更新源)默认情况下为流量的出接口 IP.注意只有当本地配置的邻居IP与邻居用于BGP连接建立的源IP相同时,BGP连接才能被正常建立.同时,仅需保证一方满足条件即可.

更详细示例在后续.

中转 AS 的路由黑洞问题

图

问题

  • 两个边界 bgp 路由没有直连路径,但是是 igbp 对等体.
  • as 内连接这俩路由路径上的其他非 bgp 路由,没有 as 外的路由表.
  • 当流量需要途经这俩路由,目的地不是这俩路由的情况下.进入 as 内部,有可能因为其他非 bgp 路由没有相应路由表,进入黑洞.

解决

  • bgp 同步规则(鸡肋,一般默认关闭): EBGP 得来的路由,同时在本地或 IGP 也能找得到时.才通报给其他 EBGP 对等体.
  • 全网路由 bgp 改造.
  • mpls 标签交换.(这又是另一个天坑了)

IBGP 水平分割规则

问题:

  • BGP 防环是通过 AS_PATH 实现的,as_path 只在跨 as 时才发生改变,不能用于 as 内 bgp 放环.

解决 -> IBGP 的水平分割规则 :

  • IBGP 的水平分割规则 : bgp 收到的 ibgp 规则,不会继续向下一个 ibgp 对等体发送

  • 确实能防环了,缺点是 bgp 路由消息有可能无法通过 as.

改进:

  • as 内组 bgp mesh,bgp 无需直接链接,正好.换一种说法是,要求 as 内 ibgp 邻居的关系全互联.
  • 但是 bgp mesh 消耗资源有点大,于是有
    • [[路由反射器]]
    • [[联邦]]

BGP 通告规则

同一目的地存在多条路径,bgp 只取一条 best 通告.(没有开启负载均衡)

bgp 只将自己认为 best 的路由传递给 bgp 对等体.

bgp 从 ebgp 对等体获取的路由会向全部 bgp 对等体通告(ibgp / ebgp)

bgp 从 ibgp 对等体获取的路由不会向 ibgp 对等体通告.(路由反射器除外) -> IBGP 水平分割规则

bgp 从 ibgp 对等体获取的路由,是否向 ebgp 对等体通告,视 igp 和 bgp 同步是否开启而定.

路由更新,只发送更新的路由.

结束语

BGP 算是给天坑,希望期末前能弄完…