BGP-community /peer-group/allowas-in
Community
翻译成中文后,为团体,
可以将一些特定的条目归到一个团体里,而进入这个团体的依据就是community值
我的理解有点儿像ospf中的tag,和mstp的多实例,
当然,community和他们两个没有任何的关系,只是意思大概相同而已
Community好处
为什么非要加community值呢?
假设你有100条个路由条目,来自于各地 如果是定义acl+prefix来进行匹配的话,是否要进行逐一设置,这样的话工作量是不是很大?而且想一下,扩展性有吗,肯定是没有的,
连最基本的上下游关系都没有,只能在本地生效。
那么此时我们就需要一个能够贯穿整个链路的属性,即使你不支持,也要进行转发。这样一来,我就可以在整条链路上的任何一个节点,针对于这条路由做属性的修改了,变得非常的灵活,且扩展性极其的高。
Community值的呈现形式
AA:NN
AA:用于填写AS号
NN : 用于自定义填写,当然,在一个超大的网络中,每一个编号都有期特定的含义,也不是乱定的
Community的几个众所周知的值
no-advertise
Local-as
No-export
Additive
Internet
No-advertise, 当设备接收到一条带有no-adv属性的条目时,将不会再把这个条目传递给任何一个邻居,不管你是什么关系、
Local-as,当收到一个带有local-as属性的条目时,将把这个条目限制本设备所在的AS内部进行传递,如果定义了不联邦的话,将会在成员AS内部进行传递,不会走出成员AS
No-export,当接收到一个带有no-export属性的条目时,设备不会把这个条目传递给任何一个EBGP邻居,但是,联邦的EBGP关系除外
Additive 增加,一个条目可以携带多个community属性值 ,但是需要在设置的时候添加上后面的关键字,这也充分说明了community属性有多么的灵活,当起始设备对其设置了属性值,到下游的某一台设备上都可以对其进行修改,如果配置时不加additive,那么将把原有的属性覆盖。
Internet,只要你收到携带了community的条目,默认就是都属于internet ,
这个有点儿像扩展ACL里的IP 协议,你只要permit community internet 的话,那么就是匹配了所有的条目。
Community的实际作用
在我看来,community属性的存在是有绝对意义的,
就拿ACL、prefix-list来和community做个比较,
对于ACL,prefix-list来讲,他们只能应用在本地,如果你想要在下一台设备也影响的话,就必须在下一台也要去抓取条目,它是不会跟随之BGP的update信息传递出去的
而community这个属性相比之下最大的好处是可以随着update信息进行传递,它是一个可选传递属性,你可以不支持这个属性,但是当你不支持的时候你一样要原封不动的进行传递,
So,在一整条完整的链路上我可以将这个值从头一直传到尾,
然后再到链路中适合的节点,做相应的策略,而且是将不同的条目绑定在一个community值,我对这个值部署策略,受影响的将是所有携带这个值的前缀。是不是要比前两个方便很多?~这就是community属性的绝妙之处
Community-list
Community-list,一个很像acl的列表,
但是它所抓取的是携带有特定community属性值,里面包含着一个或多个路由前缀,
这就是我们之前一直提到的,为什么community可以简化我们的配置。
Community-list包含 标准,扩展,命名式的
标准1-99 ,可以直接进行定义
扩展100-500,可以使用正则表达式来相结合(后面的课程中会有所涉及)
命名式的标准和扩展,和ACL意思是一样的,可以取一个相对有意义的名字,方便我们在部署或查看时候提供方便。
和route-map中的二元一样,在community-list中,也可以匹配多个项
但是逻辑关系有些不同,
在route-map 中 match X , Y 这样写成一行的逻辑关系是“或”
或的关系是两个条件满足一个即可
Match x
Match y //这样写成两行的逻辑关系是“且” ,且的关系是两个条件都要满足才可以被匹配住
而community-list中,正好相反,
如:Ip community-list xx per 100:1111 no-advertise
此时就是“且”的关系,只有一个条目同时拥有100:1111 和no-advertise时,才被匹配
2如:ip community-list xx per 100:1111
Ip community-list xx per no-advertise时
此时就是“或”的关系,当两个条件满足一个,即可以匹配
例
如果说,现在有两个条目携带的属性值分别是这样的
100:1111 local-as
100:2222 no-advertise
我写 ip community-list 11 per 100:1111
那么我可以匹配第一条
我写成ip community-list 11 per no-advertise
那么我可以匹配第二条,
只要是我的属性中有其它一个值是匹配的,就能匹配住
例2
如果说我有三个条目携带的属性值是这样的
100:1111 no-advertise
100:2222 no-export
100:1111
我是这样写的
Ip community-list 1 per 100:1111
Route-map 1 per 10
Match community 1
Set xxxx
那么部署策略,受影响的就是第一条和第三条,
但是如果我这样写
Ip community-list 1 per 100:1111
Route-map 1 per 10
Match community 1 exact-match
那么将被我匹配住的,只有第三条,策略部署后受影响的也只有第三条
这就是我们要说的精确匹配,不可以多,也不可以少,我要的就是正好的,一模一样的。
说了这么多,上个实例看看吧,都乱了
实验1
详细了解community的三个常见属性值 local-as no-export no-advertise
实验要求:
1AS100中有4个前缀 192.168.1.0 2.0 3.0 4.0
现要求在R1上配置community属性值,使他们传递到不同的AS内,
R2可以收到4条
R3可以收到3条
R4可以收到2条
R5可以收到1条
分析环境,
分析1 在AS200处,为一个联邦AS,其成员as有64512、64513
分析2 R2上可以收到4条,那对于R2来讲是不做任何的限制的
R3上可以收到3条,那么说明在R2上有一条被干掉了,那分析R2-R3之间是IBGP关系,且为联邦的IBGP,再想一个什么属性是不传给IBGP邻居的呢?
好像只有no-advertise可以实现,当R2收到这样的属性的条目时不会传递给任何人,
这样一来,第一条和第二条要求满足
分析3 R3收到3条,R4收到2条,说明在R3上又干掉一条出来的条目,由于是联邦IBGP,想一下,哪个属性是不会被传出IBGP的,且包括联邦IBGP? local-as,
分析4 R4上有两条,R5只有一条,还是一样的套路,在R4上干掉了一条,他们是EBGP的邻居关系,那么不传出EBGP就OK 了,那就不用想了,这里不是联邦的EBGP,而是普通 的EBGP,所以我们可以使用no-export,
分析完成,如何进行配置呢?
1ACL抓取条目
2route-map匹配不同的条目做不同的community值
3对peer应用route-map out方向
4针对于完整的链路,要一路由上游设备向下游设备发送community
实际的配置(confederation就不在这里详细说明了,可以看一下之前的配置)
R1(config)#access-list 1 per 192.168.1.0 R1(config)#access-list 2 per 192.168.2.0 R1(config)#access-list 3 per 192.168.3.0 R1(config)#access-list 4 per 192.168.4.0 //使用不同的ACL号码抓取不同的条目 R1(config)#route-map wfy per 10 R1(config-route-map)#ma ip add 1 //使用permit 10 匹配acl 1 R1(config-route-map)#set community no-advertise //匹配上的就设置值为no-advertise R1(config-route-map)#exit R1(config)#route-map wfy per 20 R1(config-route-map)#ma ip add 2 //使用permit 20 匹配ACL 2 R1(config-route-map)#set community local-AS //匹配上就设置属性为local-as R1(config-route-map)#exit R1(config)#route-map wfy per 30 R1(config-route-map)#ma ip add 3 //使用permit30 匹配ACL 4 R1(config-route-map)#set community no-export //匹配上就设置属性为no-export R1(config-route-map)#exit R1(config)#route-map wfy per 40 //使用permit 40放行其它条目 R1(config-route-map)#exit //可以看到 192.168.4.0 条目我们没有设置任何的值,要放行 R1(config)#router bgp 100 R1(config-router)#nei 2.2.2.2 send-community //针对于邻居下发community,必须手动指定,默认是不传递community值的,因为是可选传递的 R1(config-router)#nei 2.2.2.2 route-map wfy out //在out方向应用策略
效果
在没有应用策略前,所有的设备上都是同样的条目 4条
但是当我们将策略应用在设备上时,就要发生这样的事情
R2上有四条,R3上有三条,R4上有两条,R5上只有一条
R2上有4 条,一点儿毛病没有,
但是在R3上看只有了三条,哪里去了,?被R2给拦下了,
这一点,我们可以在R2上查看一下1.0的详细信息,community值为no-advertise
R4上只有两个条目,被R3给拒发了,
在R5上只有一个条目,被R4拒发一条
实验完全达到我们的要求, 完美
实验2
实验要求:
192.168.1.0 携带community 值为100:1111
192.168.2.0 携带community 值o 100:2222
在AS200中,针对100:1111的条目新增加属性no-advertise
针对100:2222的条目新增加属性 local-as
让100:1111的条目在到达AS300后metric为1000,这条要求使用精确匹配
让100:2222的条目在到达AS300后as-path 多出三个200
最后在AS300中删除100:1111的no-advertise属性
实验分析
想要拥有不同的community属性,就要使用不同的ACL抓取条目,然后使用一个route-map来定义两个不同的值
在AS200中要使用ip community-list,来结合 additive增加额外值
在AS200中使用ip community-list 结合route-map部署策略,修改med和as-path
具体配置及分析
R1(config)#access-list 1 per 192.168.1.0 R1(config)#access-list 2 per 192.168.2.0 R1(config)#route-map com per 10 R1(config-route-map)#ma ip add 1 R1(config-route-map)#set community 100:1111 //设置community值 R1(config-route-map)#exit R1(config)#route-map com per 20 R1(config-route-map)#ma ip add 2 R1(config-route-map)#set community 100:2222 //同一个route-map使用两个序列号针对于不同的ACL序号,定义不同的community值 R1(config-route-map)#exit R1(config)#route-map com per 30 //放行其它不做配置 R1(config-route-map)#exit R1(config)#router bgp 100 R1(config-router)#nei 2.2.2.2 route-map com out //对peer应用策略out方向 R1(config-router)#nei 2.2.2.2 send-community //向下游peer发送community R1(config-router)#exit R1(config)#ip bgp-community new-format //将community的呈现形式改成RFC标准 R2(config-router)#nei 3.3.3.3 send-community //R2对于R3来讲,也是上游设备 R2(config)#ip bgp-community new-format R3(config)#ip bgp-community new-format //为了查看效果,我们先把R2和R3都配置上RFC呈现形式
那么此时,对于R2来讲,在上游R1上配置了community属性,在本地就应该可以看到得到,具体有没有呢?
没问题,是有的,看来实验第一步完成
第二步是要求针对不同的community值再增加额外的属性值,
这时就要用到ip community-list了,
针对于实验的第二个条件,我们就要在R2上做,因为上游定义了属性,其意义就在于我们可以在下游设备上任何一个地方针对这个属性的条目进行再修改
如何做呢? community-list
R2(config)#ip community-list 11 per 100:1111 R2(config)#ip community-list 22 per 100:2222 //使用不同的列表抓取不同的属性值 R2(config)#route-map 1122 per 10 //定义名字为1122的route-map R2(config-route-map)#match community 11 //匹配community-list 11 R2(config-route-map)#set community no-advertise additive //设置community 属性为no-adv,为额外增加的 R2(config)#route-map 1122 per 20 R2(config-route-map)#match community 22 R2(config-route-map)#set community local-AS additive R2(config-route-map)#exit R2(config)#router bgp 200 R2(config-router)#nei 3.3.3.3 route-map 1122 out //对下游设备应用route-map
那么在R3上能不能够看到额外的属性值呢?
我们来看一下
同样是可以看到的
第三个要求是修改特定携带具体属性条目的属性值 ,med和as-path
因为之前已进行过匹配,所以这里就不用再进行重新定义community-list了,
我们直接可以使用,
但是有一条需要注意
让100:1111的条目在到达AS300后metric为1000,这条要求使用精确匹配
何为精确匹配?
前文提到过,
假设我现在的路径属性为100:1111 no-advertise,两个值
如果我现在match 100:1111,完全可以匹配这个条目
但是如果我使用精确匹配则没有办法
Match 100:1111 no-advertise exact-match才可以的
使用精准匹配,必须和属性中的完全一样才可以,多一点少一点都不行,要一模一样的才能进行匹配上.
还要将前面的no掉
R2(config)#ip community-list 11 per 100:1111 no-advertise //这里是且的关系 R2(config)#route-map 11 per 10 R2(config-route-map)#no match community 11 R2(config-route-map)#match community 11 exact-match //精确匹配 R2(config)#route-map 1122 per 10 R2(config-route-map)#set metric 1000 R2(config-route-map)#exit R2(config)#route-map 1122 per 20 R2(config-route-map)#set as-path prepend 200 200 200
因为之前已经向3.3.3.3应用过route-map ,现在我们使用相同的名称,所以不用再应用一次了
而且对于route-map来说,一个设备上只允许运行一个,你可以设置不同的序列号
(当然,这一步也可以在R3上来做,,最后针对于2.2.2.2 做route-map in方向应用策略,)
此时 ,我们再到R3上来看一下
还是OK的
最后一个要求 ,
我们要在R3上删除一个特定的属性,因为看着它太烦人了,我还要传递给我的IBGP邻居呢
现在删除no-advertise
R3(config)#ip community-list standard del permit no-advertise //我们可以定义一个命名式的community-list来匹配no-adv属性值 R3(config)#route-map 1111 per 10 //使用route-map R3(config-route-map)#set comm-list del delete //使用comm-list * 来delete属性值 R3(config-router)#nei 2.2.2.2 route-map 1111 in //在in方向对上游来的条目进行策略部署 此时我们再到R3上看一下这个条目的属性还在不在~
开始还在
当我们调用策略以后
R3(config-router)#nei 2.2.2.2 route-map 1111 in
至此实验全部完成
总结,
对于ip community-list的应用,要结合route-map来做,此时community-list负责的就是抓取携带相应属性值的条目,然后再由route-map来定义具体的策略,最后再调用即可.
在我看来,对于community而言,只要掌握那几个常用的特性,以及它的一个community-list和route-map的关系即可。
Peer-group
Peer group对等体组,(邻居组)可以实现相同命令的整合,其最主要的是就可现简化配置,使得重复的配置更加的简单。
主要用于拥有相同邻居时,
实验1IBGP
共有五台设备,其中R5做为路由反射器,1234不需要它们之间再建立任何的BGP关系,
只和R5建立IBGP即可就OK
分析,可以看到在R5上如果想要和1234建立 peer,那么需要输入的重复命令有哪些呢
比如现在AS号为100
R5正常是否要配置
#nei 1.1.1.1 remote 100
#nei 1.1.1.1 up lo 1
#nei 1.1.1.1 route-reflector-client //这一步考虑到是IBGP关系,要将R5设置反射器
#nei 2.2.2.2 remote 100
#nei 2.2.2.2 up lo 1
#nei 2.2.2.2 route-reflector-client
#nei 3.3.3.3 remote 100
#nei 3.3.3.3 up lo 1
#nei 3.3.3.3 route-reflector-client
#nei 4.4.4.4 remote 100
#nei 4.4.4.4 up lo 1
#nei 4.4.4.4 route-reflector-client
可以看到,和这4个peer建立 的过程中,输入的命令除了对端的ip不同,其它的都相同,
显然,做为一个技术人员,做重复的工作是没有任何的意义的。
那么该怎么办呢?
思路
建立一个对等体组
把相同的命令敲到对等体组中
把peer放到对等体组中
只需要这三个步骤就可以完成了
那么具体应该怎么做呢?来看一下
R5(config)#router bgp 100 R5(config-router)#neighbor wfy peer-group //创建名为wfy的对等体组 R5(config-router)#nei wfy remote 100 //对等体组中的第一个相同命令,指定所在as R5(config-router)#nei wfy update-source lo 1 //第二个相同命令 指定更新源 R5(config-router)#nei wfy route-reflector-client //第三个相同命令 //指定RR的客户端 R5(config-router)#nei 1.1.1.1 peer-group wfy //进程下针对于peer 调用对等体组的命令 R5(config-router)#nei 2.2.2.2 peer-group wfy R5(config-router)#nei 3.3.3.3 peer-group wfy R5(config-router)#nei 4.4.4.4 peer-group wfy //将四个不同的邻居放入到对等体组中
这样一来,是不是要方便很多???
没错,
Peer-group的用处,就是在当有多个BGP邻居,都要与他们建立邻居的时候,这个peer-group才变的那么的优秀。
实验2EBGP
R5要和R1.R2.R3.R4分别建立 EBGP的邻居关系,可否使用peer-group来简化一下配置呢?
当然可以,但是不能像ibgp那样 ,完全的进行配置
大同小意的,先来分析一下如果想要和R1.R2.R3.R4都建立关系,那么相同的命令有哪些呢?
我们使用loopback接口来建立
ebgp-multihop
update-source lo 1
然后也就没有其它的了。
思路
建立对等体组,设置一个名称
配置对等体组命令
调用对等体组给相应的邻居
具体的配置如下,
因为EBGP关系相对比较特殊,必须要将不同的命令先行手动输入
比如 neighbor x.x.x.x remote-as 100/200/300/400
R5(config)#router bgp 500 R5(config-router)#nei ebgp peer-group //建立名为ebgp的对等体组 R5(config-router)#nei ebgp ebgp-multihop //相同命令ebgp 多跳 R5(config-router)#nei ebgp up lo 1 //设置更新源,相同 R5(config)#router bgp 500 R5(config-router)#nei 1.1.1.1 remote 100 R5(config-router)#nei 1.1.1.1 peer-group ebgp //指定neighbor,然后调用 R5(config-router)#nei 2.2.2.2 remote 200 R5(config-router)#nei 2.2.2.2 peer-group ebgp R5(config-router)#nei 3.3.3.3 remote 300 R5(config-router)#nei 3.3.3.3 peer-group ebgp R5(config-router)#nei 4.4.4.4 remote 400 R5(config-router)#nei 4.4.4.4 peer-group ebgp 四个邻居统统都这样指定,是不是要方便很多, 至少不用你手动的再去一个一个的输入 ebgp multihop,以及 up lo 1 了
总结: 针对于peer-group一定要灵活掌握。在什么情况下使用可以节省更多的时间。
BGP Allowas-in
使用allowas-in可以便BGP路由器接收来自于相同AS号的路由更新
如图
R1-R2=EBGP
R2-R3=IBGP
R3-R4=EBGP
而R1-R4之间并不建立任何的BGP关系,只负责发布自己的条目,以及接收外部的BGP条目。
那么此时有一个问题会出现,R1和R4分别向BGP中注入一个条目,看对方能否收到
正常情况下,R1是不可能收到R4传来的条目的,
为什么?
因为BGP路由器收到的条目中携带自己的AS号,会直接丢弃掉。SO,肯定是收不到的
但有的时候,对方是我的分支机构,必须要使用这样的AS号,必须相同才可以,
那么这时,就要用到一条命令。使得BGP路由器可以接收来自相同AS的路由更新。
最开始看到的是这样儿的
R1(config)#router bgp 100 R1(config-router)#nei 2.2.2.2 allowas-in 1
两点解释
1 neighbor,指的是和自己直连的EBGP邻居
2 后面跟着的数字意思是可以允许接收几个相同AS的路由更新,范围是1-10
此时再来查看,
可以看出来,路由条目有所更新,且这个条目的AS-PATH属性也记录着所经过 的AS
另外提示一个小点,
输入这条命令的意思是接收,不影响发送。默认本来就是都发的。
BGP的笔记就到这里啦
--------------------------------------------------------------
CCIE成长之路 --- 梅利