奇葩的国内BGP业务架构

Intro

国内存在BGP业务,但是实际上并不是严格意义上的BGP,而是通过模拟来构建的“静态BGP”;之所以是这样的情况,原因是运营商和政策…打住,扯远了,我什么都不知道🤫。
反正客户需要就做😂,本着先做先完事,隐患日后再说的原则(笑ing),好歹算是捯饬出来一个。

Static BGP Brief Description

与BGP相关的原理内容在这里不介绍了(咱也不太懂🤣),具体说下做这玩意的前因后果吧,这部分内容就当“侃大山”吧🤔。

国内运营商三巨头:中国电信、中国移动、中国联通,这三家国企想必大家都比较熟(tao)知(yan);而与这三家运营商互联的方式呢,一律全部都是采用静态互联的方式;之所以采用静态互联,也不是因为动态技术不成熟等之类的缘由,其实就是简单且易控制,直接放给你就完事,想控制直接修改配置就好,其实还有一个点,那就是采用动态后,对某些网络提供商而言会比较“不公平”,动态路由收敛可是选择延迟最小、损耗最低的线路的。具体嘛,咱也别太深究,是这么个规定,大环境是这样,咱改变不了,遵守就行了。
话在说回来,按照这样的环境,对于网络提供商和运营商接入的路由器而言就只能保证一个线路的方向了(单、多线无法与BGP共存),那BGP又是从何谈起的呢?还有其他的双线、三线之类的业务又是怎么做的?

得嘞,咱还是先从单线业务说起吧,这没啥难度的,单线业务,给服务器配一个IP完事,没啥说的。这类业务的特点就是—不管你用源IP去访问什么地址,都是从一个线路出去的,比如,源IP电信的,那你出局就是电信线路,源IP联通的,出局就是联通线路。

在说双线业务,单线业务配一个IP,那双线业务不就配两个IP完事吗?(⊙﹏⊙),对了一半;双线业务的确需要配置两个IP,但是并不是配置两个IP就完事了,还需要在服务器上导入去往各个地址段的路由。什么鬼?服务器还能加路由,还真能加😓,这如果要说,又要牵扯到一些东西,嗯,别急,给你娓娓道来。

咱先不说怎么去加路由,咱先介绍下国内的网络环境。首先得明确IP地址这个玩意在大网环境内是唯一存在的(私网地址你就折腾去吧),换句话说,三大运营商是拥有只属于自己的IP地址的(什么?你也想要属于自己的IP地址?自己去找管理IP的组织去买吧,多少钱?嘿嘿,自己去问。),并且这些地址在国内的大网环境下是唯一的。这样就会产生一个问题,既然联通的地址只属于联通,那电信用户如何去访问联通的地址呢?答案就是运营商之间做了互联,至于是动态的还是静态的,这个,嘿嘿,不是咱讨论的范围,在有互联的前提下,电信用户也就可以去访问联通的地址啦。
好,这个问题明白了,咱在来看看另外一个现象,不知道各位看官有没有留意过,网络游戏总会有一些网通区、电信区等,如果电信用户已经可以访问联通地址了,那么运营商都做成全网可以互相访问不就得了,那这样还搞这些区干毛?诶,这个其实是有点讲究的,嘿嘿。答案就是,如果你是联通用户,你选择网通区进行游戏,你会觉得网速非常快。你问为啥?因为网通区的游戏服务器IP肯定也是联通的IP,这样在本运营商内部进行访问的时候,那不就是在“内网”里面进行数据交互了吗?都没跑到“公网”上去,速度肯定快啊😂。其他也同理,这也是为啥有人会说中国的网络实际上是一个大的局域网,特别是被Great Firewall of China禁掉一些国际IP后🙊。

好了,在回到加路由的问题上来,咱已经知道给服务器配置两个IP了(现在应该也知道为啥要搞这种双线机器了吧,手动笑哭),那加路由怎么加呢?对于一个IP地址而言,如果要和其他子网通信,必须存在网关,利用网关来接收、发送数据包,双线机器两个IP,肯定也有两个网关啊,服务器能同时配置两个网关?答案是不能,那ta niang的怎么办呢?答案是写路由啊(为了引出你来,写了这么多字,手酸啊🙃)。以配置了联通、电信的地址的双线机器为例,访问联通地址使用联通网关,访问电信地址使用电信网关,这样就可以啦,就可以愉快的访问按指定线路访问指定的运营商的IP地址啦。

写到这里,网络工程师可能会有问题了,路由器、交换机上怎么去配置多个网关(子网划分),并且做到不同线路的出局呢?

当然了,对于网络工程师而言,这里还需要考虑一个问题,双线机器有几个网卡,假如有多个网卡,那很简单,不同的网卡做通不同的数据就好啦,那一个网卡怎么办?

首先,先来解决多个网关的问题,服务器如何去配置,运维工程师自有妙计,咱不去管它;路由器、交换机如何配置呢?
以华为设备为例,配置过程大概如下:

1
2
3
4
[R1]vlan 10
[R1-vlan10]interface vlanif 10
[R1-Vlanif10]ip address 10.0.254.1 24
[R1-Vlanif10]ip address 10.0.253.1 24 sub

完事后是这样:

1
2
3
4
5
#
interface Vlanif10
ip address 10.0.254.1 255.255.255.0
ip address 10.0.253.1 255.255.255.0 sub
#

这样就把两个不同网段的数据做到一个vlan下了。

咱们在看出局的问题,出局需要借助一个叫PBR, Policy Based Routing的玩意,嘿嘿,厂商真会玩,是跟运营商偷偷商量好了是吧。具体如何去做,要视具体的网络架构和环境去做(自己去百度😝)。

好,双线业务大致就是这样了,对应的三线业务,就不用我说了吧,嘿嘿,不过网络提供商可能会用“BGP”地址来代替多线业务配置的多个IP地址来避免IP地址的浪费(但据说“BGP”地址贵啊,不过,这是商务的事情,商务自有商务的一套)。

回过头来看一下,双线、三线业务需要做的配置还是比较多的,不管是服务器还是路由器,不也是累的一逼吗?有没有什么能一次性搞定,而且三网内都跟跑“内网”一样呢?诶,运营商又出马了:觉得麻烦是不是,好,我给你们减负(真是这样么?运营商会这么好心?),我们现在能提供一种“BGP”的产品,这类地址具有能从三网线路独立访问的特性。什么意思呢?也就是说各个运营商的用户访问这些“BGP”地址的时候能用自身运营商的线路去访问,而不需要跨运营商。所达到的效果其实是和三线业务一样的,只不过会方便很多(对客户而言,IP配置一个,服务器也不用写路由,嗨啊),但是一样需要前期把路由器上的配置都做好啊啊啊,还是好麻烦啊。

后来,人们给这种“BGP”地址一个洋气的名字,就叫做Static BGP🤣。

好,故事到此结束🤣。

Static BGP Routing

下面就进入正题啦。
具体架构就按照下面这个图吧~

Architecture-1

又弄了一张图,两张图结合一起看,对比来看,容易一些(据说是TX的网络部门大牛画的)。

Architecture-2

Basic Connection

底层互联,使用静态互联即可,但这需要底层的传输网络足够健壮、稳定
保证二层传输网络健壮性技术主要有VCSERPS等,这些都属于二层无环路保护协议,具体如何配置,在自行研究。
现在就以二层已经配置好了保护协议为例,给出两台路由器的静态互联IP信息来协助配置BGP。

R1-CM-Access
1
2
3
4
#
interface Vlanif925
ip address 10.0.254.2 255.255.255.252
#
R2-BGP-Router
1
2
3
4
!
interface ve 925
ip address 10.0.254.1/30
!

单向测试一下:

BGP-Router
1
ping 10.0.254.1 source 10.254.0.2

BGP Config

下面介绍BGP的相关配置,以与一个运营商接入的情况为例,其中CM-Access为华为设备,BGP-Router为博科设备。
与运营商接入的设备配置比较简单,咱只用做好BGP连接就好了。

R1-CM-Access
1
2
3
4
5
6
7
8
9
10
11
12
13
<R1>system-view
[R1]bgp 9527 //建立BGP进程,设置AS号为9527
[R1-bgp]router-id x.x.x.x //设置router-id,一般为环回接口地址
[R1-bgp]peer 10.0.254.1 as-number 35129 //设置BGP对等体
[R1-bgp]peer 10.0.254.1 description BGP-Router //添加该对等体的描述信息
[R1-bgp]peer 10.0.254.1 enable //建立和BGP对等体的TCP连接
[R1-bgp-af-ipv4]import-route static //导入静态路由
[R1-bgp-af-ipv4]quit
[R1-bgp]quit
[R1]ip route-static ..... //写入移动运营商路由
[R1]ip route-static ...
[R1]quit
<R1>save //保存配置

BGP核心路由器R2的配置相比R1要多很多了,并且是在有意识的进行配置。

R2-BGP-Router
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
R2#configure terminal
R2(config)#router bgp
R2(config-bgp)#local-as 35129 //设置本地AS号
R2(config-bgp)#neighbor 10.0.254.2 remote-as 9527 //设置BGP对等体
R2(config-bgp)#neighbor 10.0.254.2 soft-reconfiguration inbound //开启对等体流入路由软刷新
R2(config-bgp)#neighbor 10.0.254.2 description CM-Access //添加该对等体的描述信息
R2(config-bgp)#show ip bgp summary //检查BGP对等体之间的状态是否为Established
R2(config-bgp)#neighbor 10.0.254.2 shutdown //检查正常则先关闭TCP连接
R2(config-bgp)#exit
R2(config)#ip prefix-list Private_Deny seq 5 deny 0.0.0.0/8 le 32 //创建前缀列表
R2(config)#ip prefix-list Private_Deny seq 10 deny 10.0.0.0/8 le 32
R2(config)#ip prefix-list Private_Deny seq 15 deny 172.16.0.0/12 le 32
R2(config)#ip prefix-list Private_Deny seq 20 deny 192.168.0.0/16 le 32
R2(config)#ip prefix-list Private_Deny seq 25 deny 127.0.0.0/8 le 32
R2(config)#ip prefix-list Private_Deny seq 30 deny 169.254.0.0/16 le 32
R2(config)#ip prefix-list Private_Deny seq 35 deny 192.0.2.0/24 le 32
R2(config)#ip prefix-list Private_Deny seq 40 deny 224.0.0.0/3 le 32
R2(config)#ip prefix-list Private_Deny seq 45 deny 172.160.0.0/16 le 32
R2(config)#ip prefix-list Private_Deny seq 50 permit 0.0.0.0/0 le 32
R2(config)#router bgp
R2(config-bgp)#neighbor 10.0.254.2 prefix-list Private_Deny in //拒绝私网地址等流入
R2(config-bgp)#redistribute connected //重分布发直连路由
R2(config-bgp)#redistribute static //重分布发静态路由
R2(config-bgp)#default-information-origina //重分布发默认路由
R2(config-bgp)#no neighbor 10.0.254.2 shutdown //打开BGP对等体之间的TCP连接
R2(config-bgp)#show ip bgp routes //查看从BGP对等体获取到的路由信息
R2(config-bgp)#exit
R2(config)#exit
R2#write-memory //保存配置

CM-AccessBGP-Router之间的EBGP建立好后,相互之间会自动学习路由,其他运营商对接的情况也可以这样来做。
按照这样的思路做好之后,是否就完事了呢?这个得从需求上看,其实主要分两种情况:

  • BGP-RouterISP-Access包含单线、多线及BGP功能
  • BGP-RouterISP-Access只用作BGP线路

一般而言,对于第二种情况,上述的做法已经完事了,但对于一家企业而言,设备的可利用性可能是越高越好的,这样对应的成本就越低(领导:节约成本啊,我可都是血汗钱,23333)。所以,如何去将单线、多线及BGP功能全部承载在这个架构中呢?答案是使用VRF,利用VRF来建立BGP线路的EBGP连接,这样对于BGP业务就可以在单个VRF内实现了,而其他的业务也在不同的VRF内实现即可。
另外,而对于各个ISP-Access设备,CT-AccessEBGP内重分布默认路由,其他ISP-AccessEBGP重分布明细静态路由,CT-Access需要拒绝(使用ip-prefix list完成即可)从BGP-Router学习到的CM明细路由CU明细路由等,否则就会影响单线及多线业务的默认出局。同时,为了保证单、多线业务,其他ISP-Access也都需要写入默认路由,但不能重分布到EBGP内,避免造成环路和路由错乱

Summary

按照这样的架构实现的Static BGP结构比较简单,不需要Traffic-Policy等之类的技术来配合实现,控制起来也比较简单,直接放静态路由就好,至于从BGP-RouterBGP-Access之间的稳定性,这个也可以用Static with BFD的方式来实现,或者纯依靠底层传输网的健壮性不过有个问题在于,这样做好之后,BGP-Router就只能用作BGP地址的出口网关路由器了,当然根据设备的功能特性,强行要使用某某功能,依然可以用VRF等实现,但这样就会使得设备的功能变得繁杂,在操作的时,误操作或其他BUG就会影响到整个BGP网络架构的稳定性。
另外,这个架构的优点其实很直观,就是简单,易于排障(网络架构在不失健壮性的基础下,越简单越好,真理啊😭),并且不同运营商的路由表易于维护。缺点就是,对底层传输网的稳定性要求比较高。但是,如果是跨区域的BGP业务的话,又会面临新的问题:难道每个地方都搞一台BGP核心路由器吗?那在内网里,这些地址又如何互相访问呢?


Buy me a coffee ? :)
0%