首先,我对网络这块完全是从网上自学的,如果有不对的地方,还请您谅解。

其次,这篇文章是根据小狼大佬的文章而改写的,原文在这里

我只是在 Cisco/FRRouting 平台上再一次实现了这些东西,本质思路都是小狼大佬交给我的。

因此本篇文章将大量引用小狼大佬的原文,他的解释比我更通俗易懂。

我们都知道 IDC 需要使用 BGP 协议来与上游交换路由表和发送自己的 IP Prefix,而且可以通过 BGP 来对路由属性对自己和客户的网段进行修改以达到控制路径的效果。但是有多少人知道其实 BGP 可以使用 community 来实现非常方便的路由路径调整呢?这篇文章将讲述如何使用 community 来打造适合机房的路由控制方案。

要想知道如何使用 BGP community,我们则先需要了解一下 BGP 的属性。

BGP 的属性分以下几种类型,分别是公认必遵,公认自决,可选可过渡,可选不可过渡。而这些属性又有属于他们不同的特点。

公认必遵(Well-Known Mandatory)是所有路由器都必须识别的属性,且这些属性必须出现在路由描述中并传递给 BGP 邻居。公认必遵的属性有以下几个:

  • ORIGIN(起源):这个属性说明了源路由是怎样放到 BGP 表中的。 在路由选择的时候,ORIGIN中,IGP优于EGP,EGP优于INCOMPLETE。
  • AS_PATH(AS路径):指出包含在 UPDATE 报文中的路由信息所经过的自治系统的序列。
  • Next_HOP (下一跳)声明路由器所获得的BGP路由的下一跳,对 eBGP 会话来说,下一跳就是通告该路由的邻居路由器的源地址。

公认自决(Well-Known Discretionary)也是所有路由器必须识别的属性,但是可以让路由器自己决定该属性需不需要传递,以及出不出现在路由描述中。公认自决的属性有以下几个:

  • LOCAL_PREF (本地优先级): 仅在IBGP对等体之间交换,不通告给其他AS。当BGP的路由器通过不同的IBGP对等体得到目的地址相同但下一跳不同的多条路由时,将优先选择LOCAL_PREF属性值较高的路由。
  • ATOMIC_AGGREGATE (原子聚合):原子聚合属性指出已被丢失了的信息。

可选可过渡(Optional Transitive) 与 可选不可过渡(Optional Nontransitive)并不要求所有运行BGP协议的系统都识别。如果属性是可选过渡的,那么,即使运行BGP的系统不能识别该属性,也要接受该属性并将其转发给它的对等体。而如果属性是可选不可过渡的,运行BGP的系统可以忽略包含该属性的消息并且不向它的对等体转发。 这两种类型的属性分别有以下几个:

  • COMMUNITY(团体) 是一组共享相同属性的目的地集合, 用来简化路由策略的应用和降低维护管理的难度,没有物理上的边界,与其所在的AS无关。
  • AGGREGATOR(聚合者) 该属性补充了路由信息在哪里丢失——它包含了发起路由聚合的AS号码和形成聚合路由的BGP发布者的IP地址。
  • MULTI_EXIT_DISC(多出口区分)被用来区分同一个邻接AS的多个接口。
  • ORIGINATOR_ID(起源ID) 用于标识路由反射器,防止引入路由反射器之后出现环路,增加ORIGINATOR_ID这个属性来标识,反射器在发布路由时加入ORIGINATOR_ID,当反射器收到的路由信息中的ORIGINATOR_ID就是自己的ROUTER_ID时,就可以发现路由环路的出现,将该路由丢弃,不再转发。
  • CLUSTER_LIST(簇列表) 用于标识路由反射器组 ,也是用来防止环路,在路由经过路由反射器时路由反射器会将自己的CLUSTER_ID添加到路由携带的CLUSTER_LIST中,当路由反射器发现接收的路由的CLUSTER_LIST中包含有自己的CLUSTER_ID,则将该路由丢弃,不再转发。

那么我们很清楚的看到了,公认属性已经被定义好了该属性所应发挥的作用,我们无法对其进行个性化修改来实现自己想要的效果。而可选属性大部分都是在多出口选路用以及网络内存在路由反射器 (Route reflector) 对其进行标识以起到防环的作用。而唯一的可自定义的属性则是 COMMUNITY(团体)属性了。要使用 COMMUNITY 来对路由路径进行控制,我们得先了解下该属性的定义。

团体属性可以添加在每一个路由前缀中,由RFC1997定义,是一个transitive optional属性。包含有团体属性的路由,表示该路由是一个路由团体中的一员,该路由团体具有某种或多种相同的特征。根据这些特征区分不同的路由,可以大大简化路由策略的配置工作,同时也增强路由策略的能力。

ref: 新华三技术官网

我们可以预先定义 community 来标识路由并管理路由。但是在这之前,我们需要一个 BGP 网络来进行操作。那么我们就先开始搭建一个数据中心的网络吧!

以上是原文,希望到这里你能理解我们要干什么,接着看下去。

设计一个网络,我建议你是老老实实画一张拓扑图,然后跟着这个拓扑图来构建网络。我太懒了不想操作,这里就脑内生成一张拓扑,直接做community-list的构建表。

我们有7个主要的数据中心,分别是香港,新加坡,东京,首尔,西雅图,阿什本以及法兰克福。

其中,香港,新加坡,东京,首尔均为Cisco平台,而西雅图,阿什本和法兰克福则是FRRouting平台,语法其实差不了多少。

路由类型控制标识功能描述备注
HKIX 禁播48024:30010不要将路由发送给 HKIX
HKIX 禁播48024:30020不要将路由发送给 HKIX ALIYUN
HKIX 禁播48024:30030不要将路由发送给 HKIX TENCENT
Transit 禁播48024:4001x操控发送给 HE 的路由x=0 禁播 1,2,3 为prepend次数
Transit 禁播48024:4002x操控发送给 CDN77 的路由x=0 禁播 1,2,3 为prepend次数
上游Transit 禁播48024:6001x特殊 community,操控Level3x=0 禁播 1,2,3 为prepend次数
上游Transit 禁播48024:6002x特殊 community,操控GTTx=0 禁播 1,2,3 为prepend次数
上游Transit 禁播48024:6003xx=0 禁播 1,2,3 为prepend次数
上游Transit 禁播48024:6004x特殊 community,操控CoreBackbonex=0 禁播 1,2,3 为prepend次数
上游Transit 禁播48024:6005x特殊 community,操控Cogentx=0 禁播 1,2,3 为prepend次数
上游Transit 禁播48024:6006x特殊 community,操控NTTx=0 禁播 1,2,3 为prepend次数
上游Transit 禁播48024:6007x特殊 community,操控TATAx=0 禁播 1,2,3 为prepend次数
上游Transit 禁播48024:6008x特殊 community,操控RETNx=0 禁播 1,2,3 为prepend次数
上游Transit 禁播48024:6009x特殊 community,操控UPCx=0 禁播 1,2,3 为prepend次数
上游Transit 禁播48024:6010x特殊 community,操控Sparklex=0 禁播 1,2,3 为prepend次数
上游Transit 禁播48024:6011x特殊 community,操控Teliax=0 禁播 1,2,3 为prepend次数
上游Transit 禁播48024:6012x特殊 community,操控Comcastx=0 禁播 1,2,3 为prepend次数
上游Transit 禁播48024:6013x
上游Transit 禁播48024:6014x
上游Transit 禁播48024:6015x
上游Transit 禁播48024:6016x特殊 community,操控NMEx=0 禁播 1,2,3 为prepend次数
上游Transit 禁播48024:6017x
上游Transit 禁播48024:6018x
上游Transit 禁播48024:6019x特殊 community,操控Telefonicax=0 禁播 1,2,3 为prepend次数
上游Transit 禁播48024:6020x特殊 community,操控Vodafonex=0 禁播 1,2,3 为prepend次数
上游Transit 禁播48024:6021x特殊 community,操控PCCWx=0 禁播 1,2,3 为prepend次数
上游Transit 禁播48024:6022x
上游Transit 禁播48024:6023x
上游Transit 禁播48024:6024x特殊 community,操控Coloaux=0 禁播 1,2,3 为prepend次数
上游Transit 禁播48024:6025x特殊 community,操控Serversaustraliax=0 禁播 1,2,3 为prepend次数
上游Transit 禁播48024:6026x特殊 community,操控Orangex=0 禁播 1,2,3 为prepend次数
内部用 community48024:999匹配上该 community,则向上游发送路由
内部用 community48024:666匹配上该 community,则向上游发送黑洞网内禁播 /32 only
内部用 community48024:1000匹配上该 community,则禁播no-export
内部用 community48024:1001匹配上该 community,则prepend 1次as-path prepend 48024
内部用 community48024:1002匹配上该 community,则prepend 2次as-path prepend 48024 48024
内部用 community48024:1003匹配上该 community,则prepend 3次as-path prepend 48024 48024 48024
内部用 community48024:2100匹配上该 community,则香港禁播
内部用 community48024:2101匹配上该 community,则香港prepend 1次
内部用 community48024:2102匹配上该 community,则香港prepend 2次
内部用 community48024:2103匹配上该 community,则香港prepend 3次
内部用 community48024:2200匹配上该 community,则新加坡禁播
内部用 community48024:2201匹配上该 community,则新加坡prepend 1次
内部用 community48024:2202匹配上该 community,则新加坡prepend 2次
内部用 community48024:2203匹配上该 community,则新加坡prepend 3次
内部用 community48024:2300匹配上该 community,则东京禁播
内部用 community48024:2301匹配上该 community,则东京prepend 1次
内部用 community48024:2302匹配上该 community,则东京prepend 2次
内部用 community48024:2303匹配上该 community,则东京prepend 3次
内部用 community48024:2600匹配上该 community,则首尔禁播
内部用 community48024:2601匹配上该 community,则首尔prepend 1次
内部用 community48024:2602匹配上该 community,则首尔prepend 2次
内部用 community48024:2603匹配上该 community,则首尔prepend 3次
内部用 community48024:3300匹配上该 community,则西雅图禁播
内部用 community48024:3301匹配上该 community,则西雅图prepend 1次
内部用 community48024:3302匹配上该 community,则西雅图prepend 2次
内部用 community48024:3303匹配上该 community,则西雅图prepend 3次
内部用 community48024:3900匹配上该 community,则阿什本禁播
内部用 community48024:3901匹配上该 community,则阿什本prepend 1次
内部用 community48024:3902匹配上该 community,则阿什本prepend 2次
内部用 community48024:3903匹配上该 community,则阿什本prepend 3次
内部用 community48024:4100匹配上该 community,则法兰克福禁播
内部用 community48024:4101匹配上该 community,则法兰克福prepend 1次
内部用 community48024:4102匹配上该 community,则法兰克福prepend 2次
内部用 community48024:4103匹配上该 community,则法兰克福prepend 3次

在一番复制粘贴后,我的community-list构建好了。这里解释一下,我们香港有自己拉的HKIX和HE,其他Transit则是cdn77提供的,而cdn77有很多内部用的community,而我又不想提供给客户这些参数,于是就自己造community然后翻译成cdn77的community发出去。

Cisco 平台这些 community-list 的命令如下

ip community-list standard no-export-hkix permit 48024:30010
ip community-list standard no-export-hkix-aliyun permit 48024:30020
ip community-list standard no-export-hkix-aliyun permit 48024:30030
ip community-list standard no-export-he permit 48024:40010
ip community-list standard prepend1x-he permit 48024:40011
ip community-list standard prepend2x-he permit 48024:40012
ip community-list standard prepend3x-he permit 48024:40013
ip community-list standard no-export-cdn77 permit 48024:40020
ip community-list standard prepend1x-cdn77 permit 48024:40021
ip community-list standard prepend2x-cdn77 permit 48024:40022
ip community-list standard prepend3x-cdn77 permit 48024:40023
ip community-list standard no-export-cdn77-level3 permit 48024:60010
ip community-list standard no-export-cdn77-gtt permit 48024:60020
ip community-list standard no-export-cdn77-corebackbone permit 48024:60040
ip community-list standard no-export-cdn77-cogent permit 48024:60050
ip community-list standard no-export-cdn77-ntt permit 48024:60060
ip community-list standard no-export-cdn77-tata permit 48024:60070
ip community-list standard no-export-cdn77-retn permit 48024:60080
ip community-list standard no-export-cdn77-upc permit 48024:60090
ip community-list standard no-export-cdn77-sparkle permit 48024:60100
ip community-list standard no-export-cdn77-telia permit 48024:60110
ip community-list standard no-export-cdn77-comcast permit 48024:60120
ip community-list standard no-export-cdn77-nme permit 48024:60160
ip community-list standard no-export-cdn77-telefonica permit 48024:60190
ip community-list standard no-export-cdn77-vodafone permit 48024:60200
ip community-list standard no-export-cdn77-pccw permit 48024:60210
ip community-list standard no-export-cdn77-coloau permit 48024:60240
ip community-list standard no-export-cdn77-serversaustralia permit 48024:60250
ip community-list standard no-export-cdn77-orange permit 48024:60260
ip community-list standard nerocloud-rtbh permit 48024:666
ip community-list standard no-export permit 48024:1000
ip community-list standard prepend1x-nerocloud permit 48024:1001
ip community-list standard prepend2x-nerocloud permit 48024:1002
ip community-list standard prepend3x-nerocloud permit 48024:1003

这里因为偷懒,我把cdn77的prepend参数给忽略了。

做到这里,你已经基本上成功一半了,接下来就是写route-map来匹配上这些community然后执行动作。

具体的一个流程大概如下:

客户发送NeroCloud内部的communities,我们的Router收到了,然后匹配,再将匹配到的community做相应的动作,最后发给上游。

因此我们的community转接操作是在内部的import上做的,这里先写一个rtbh黑洞来做示范。

route-map nerocloud-import permit 10 
 match community nerocloud-rtbh
 set ip next-hop xx.xx.xx.xx
 set community 3491:999 4635:666 6939:666 additive
 continue 20
route-map nerocloud-import permit 20 

ip route xx.xx.xx.xx 255.255.255.255 Null0

解释一下:

我们的rtbh是 48024:666,当客户发这个community时,我们网内应该将被攻击的IP封禁,set ip next-hop xx.xx.xx.xx 就是将被攻击的 IP丢到下一跳(并不真实存在的)然后再把这个网关加到NULL0上,就能在网内屏蔽这个/32 IP。

但是如果仅仅是网内封禁是不够的,因为流量还是会通过我们的路由器,造成网内拥塞。因此我们需要拿到上游运营商的rtbh,将/32 blackhole发送至骨干网上,这样就不会有问题了。

我们的上游 PCCW,HKIX和HE,他们的rtbh分别是 3491:999 4635:666 6939:666,因此我们需要一个action就是 set community 3491:999 4635:666 6939:666 additive。这么做可以将我们的路由带上这些community并发送给上游。

验证一下配置:

在没有发送 48024:666 的时候

外网

都是正常可达的,我们在日本的路由器上发送内部rtbh指令,看看会发生什么。

网内已经不可达了
而网外因为需要发送改给运营商的rtbh,因此会延迟一点。


南ことり の 小窝原创文章,转载请注明来自:[Cisco]从零开始设计运营商级community (上)