BGP: 一个更像应用程序的路由协议

BGP: 一个更像应用程序的路由协议

BGP(Border Gateway Protocol),我们称之为边界网关路由协议。用于自治系统(Autonomous System)之间交换路由信息,我们称之为外部BGP,即eBGP;也可以用来在自治系统内部路由器之间来同步路由信息,称之为内部BGP,即iBGP。

BGP建立连接

BGP工作于TCP 179号端口,与其说是路由协议,不如说是一个应用程序,一个用来互相分发路由信息的应用程序。既然是应用程序,就需要底层网络可以提供在应用程序之间建立TCP连接的一切必要前提,即BGP 用来建立TCP 的 Source IP 互相可达。说了半天有的同学肯定还是晕乎乎的,用更通俗的语言来描述一下,举个例子:

两台电脑A与B如果直连并且在一个网段,他们之间通信需要什么路由协议吗?不需要,他们可以直接通信!那如果他们不是直连,当然也不在一个网段,如何通信?用静态路由或路由协议使得A知道如何到达B,B知道如何到达A,双向的路由都畅通了,A与B就可以顺利通信了。

如何把上面的电脑换成路由器A与B,A与B之间的通信是BGP,是不是也类似呢?其实是一样的,路由器RP其实就是一个嵌入Linux操作系统的一台电脑,当路由器A与B直连时,他们之间的BGP通信只需要直连路由,即直连接口在同一个网段就可以建立BGP邻居关系。

但是用直连物理接口作为 source IP 不够健壮,一旦物理接口有 flapping,则容易引起BGP邻居关系的flapping,路由表也会反复重新收敛。如果能够采用软件接口,或虚拟接口loopback来建立邻居关系,A与B之间如果有多条物理连接,即使有一条链路断掉了,还可以切换到另外一条链路,这样BGP邻居关系不受任何影响。

但是不要忘记A 与B如何知道彼此loopback 的地址呢?特别是EBGP的情况下,A与B一般不会建立IGP邻居关系,所以最好的方式就是用静态路由来双向指一下,A的loopback 和B的loopback双向路由畅通,那是不是就可以顺利建立EBGP邻居关系了呢?

如果A 主动建立TCP连接,用的不是loopback,而是用物理接口的IP,而对方却限制一定要用A的loopback才可以接受连接,是不是连接就建立不起来?是的,那我们就需要用配置命令来硬性指示A与B的 updated-source
IP == loopback 不就可以了吗?那是不是完成这步就可以建立BGP了?不可以,因为TCP连接所使用的IP缺省TTL== 1,如果到达彼此loopback,需要两跳,所以需要用命令修改EBGP multi hop == 2 ,到了这里一个EBGP连接就可以顺利建立。


BGP安全保护

在开始这个话题之前,先有一个问题,TCP连接是一个什么概念?TCP连接是一个虚连接,是依靠一个个独立的TCP segment 及其状态标志位(SYN/ACK/FIN/Push/Urgent/Reset)来维系的,这种机制其实是非常脆弱的。TCP的一方如果没有一种认证机制来认证对方发送过来的数据是否合法,则第三方完全可以伪造source
IP,伪造TCP segment 的关键字段,如果这个伪造的IP包和真正的IP包没有太大区别,则很容易骗过接收端,如果数据为伪造的路由表信息,则整个BGP路由表有可能被搅得天翻地覆,所以这完全是不可接受的。

Cisco BGP采用的是TCP Option 19来应对以上的挑战,原理很简单:就是对发出的每一个TCP Segment 都有一个option 19,采用MD5 算法将 TCP segment 和 Pre-Shared Password 作为共同输入量,计算出MD5,并附在TCP segment的末尾,到达对方先校验MD5是否一致,一致则接收,否则丢弃。由于Pre-Shared Password 只有BGP Peer知晓,所以第三方无法伪造合法的MD5而被丢弃。至于Option 29 是采用SHA哈希算法,安全性更高,所以获得更多地支持。

编辑于 2017-10-24

文章被以下专栏收录