在家也要玩BGP(1):简单的多运营商接入策略路由配置

拉了两条不同运营商的宽带,想要有效利用两条线路的带宽,但是这时候单纯的负载均衡体验并不好,因为随机分配的出口并不一定速度最快。BGP全球路由表里正好有我们需要的信息——每个IP到哪个运营商距离最近(某种意义来说,速度也应当最快)。那么怎么利用它来优化网络的体验呢?

基线配置

拉了两条宽带,一条中国电信,一条中国移动,均接在一台IOS XE 16.9设备上,分别对应Dialer 0和Dialer 1。基础的双线备份配置如下:

两条线路只是用来做备份有些浪费,况且中国电信上国内网站快,中国移动出国速度快,各有长处。那么怎么才能妥善利用呢?让我们用BGP来做一个策略路由吧。

收一个BGP全球路由表

有很多服务提供商可以给你做免费的BGP会话,在其中选一个便宜又能提供全表的,要一份全表。我用Vultr比较多,那么这次也用它好了。接下来要考虑怎么把全表收回来。因为BGP要求两端IP固定(除非你想用listen-range功能,但是这个功能有潜在的安全性问题),那么要么我们在路由器和收全表的服务器之间打一个隧道,用这台服务器做路由控制,要么先想办法把表收到离路由器逻辑上比较近的服务器上,后者作为路由控制器(control plane),处理数据后再转发给路由器。考虑到中国特色的网络问题,这里使用后一种方法,路由控制器放在内网。

考虑到打隧道不是本文重点,我们就简单地用ZeroTier One无脑打一个隧道,配上IP,在Vultr的VPS上启动一个BGP daemon,和网关起一个eBGP会话,和内网的路由控制器起一个iBGP会话即可。如果不想打隧道,那么简单的TCP转发服务也可以用来解决BGP session两端固定IP的问题。

服务器配置:

  • Vultr侧(下称feeder):5USD的虚拟机(1CPU/1G Memory),Ubuntu 18.04
  • 本地侧(下称controller):J1900 ESXi服务器上的虚拟机(2CPU/2G Memory),Debian 10

Feeder配置很简单,我用的VPS上已经装了Bird 1作为BGP daemon,那么只需要写两组BGP会话即可。参考配置:

Controller用Bird 2作为BGP daemon。首先要注意的一点是,我们需要在路由器上硬编码controller到feeder的路由,以防路由改变以后BGP断开造成路由震荡。

Bird 2配置(先确认全表能收进来,路由策略暂时空着,下一节再讲):

因为两边都是iBGP会话,为了让路由能在两边分发,需要把controller配成route reflector。

确定路由策略

先确定一个最简单的路由策略:

  • 电信(AS4134、AS4809):走电信
  • 移动(AS56041):走移动
  • 其余走移动

那么首先我们在bird配置文件里面完善一下filter:

然后我们在路由器上配置策略路由规则:

这里说明一点:IOS/IOS XE的route-map不支持在BGP in上用set interface,会报以下错误:

对动态IP的interface需要使用recursive方式设置路由,即用两个假的IP设置分别路由到两个interface,然后分别set ip next-hop到这两个IP上。

至于更复杂的路由策略,我在本系列的下一篇文章中会讲。

测试

分别找一个电信的IP和一个移动的IP看一下其路由即可。示例:

结论

整个系统的资源占用:

  • controller内存占用大概在400MiB以下
  • 需要分流的路由总计不到8000条,IOS XE可以轻松处理(如果给IOS XE发全表的话,4GiB内存是不够用的)
  • BGP会话带来的流量消耗大概一天300MiB

感谢某匿名CCNP玩家在本文写作过程中提供的帮助。

参考:

在家也要玩BGP(1):简单的多运营商接入策略路由配置》有2个想法

  1. Pingback引用通告: 在家也要玩BGP(1.5):我的双线分流规则 | Drown in Codes

  2. Pingback引用通告: DN42入坑指南(五)DN42百宝箱 | 辣条部落格

发表评论

电子邮件地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据