BGP社区属性怎么配置?本质就是给路由打标签,再通过路由策略把这些标签翻译成选路依据,实际网络里,你不需要改动上游配置,光是本地把特定community映射到LocalPref或MED,就能完成大多数BGP路由选路策略优化。
BGP社区属性怎么配置:先搞清楚它到底改什么
理解社区属性,第一件事是别把它当成和MED、LocalPref平级的“直接选路参数”,BGP选路顺序里有Weight、LocalPref、AS Path、MED,但唯独没有community,它更像一张不干胶标签,本身不参与打分,只有在路由策略里被匹配后,通过apply语句去改写真正能影响选路的属性,才产生效果。
行业共识认为,社区属性的真正价值在于携带业务信息,前缀列表匹配的是“这条路去哪”,社区属性回答的是“这条路该怎么被对待”,例如上游运营商把“金牌客户”的路由打上65001:10,本地收到后就直接映射成高LocalPref,而不需要逐条维护几十个前缀列表。
BGP Community值作用:标签的编码方式
社区属性是一个32位整数,为了方便阅读,通常写成两个16位十进制数,格式是AS:值,比如65001:10里的65001是AS号,10是业务编号,不同厂商、不同运营商之间只要约定好,这个值可以自由定义。
几个必须记住的知名community值:
INTERNET(0:0):不限制,通告给所有邻居。NO_EXPORT(0xFFFFFF01):不把路由通告给AS外部,但允许传给联盟内子AS。NO_ADVERTISE(0xFFFFFF02):不把路由通告给任何对等体,包括iBGP和eBGP。NOPEER(0xFFFFFF04):不把路由通告给对等体运营商,常用于控制互联网路由传播。
配置时,华为和思科的过滤器写法不同,但逻辑一致:
| 项目 | 华为 | 思科 |
|---|---|---|
| 定义匹配条件 | ip community-filter 1 permit 65001:10 |
ip community-list 10 permit 65001:10 |
| 路由策略中引用 | if-match community-filter 1 |
match community 10 |
| 修改选路因子 | apply local-preference 200 |
set local-preference 200 |
| 应用到BGP邻居 | peer x.x.x.x route-policy XX import |
neighbor x.x.x.x route-map XX in |
注意:如果要对community值做正则匹配,思科默认支持正则表达式,华为需要配合community-filter的复杂模式,多数情况下,用精确值匹配就够了,正则反而容易出低级错误。
BGP路由选路策略优化实操:用community打高LocalPref
我给你一个可以直接套用的双出口场景:AS 65001同时接了运营商A和运营商B,希望从运营商A收到的、携带100:10社区属性的路由,走主用链路,优先级高于另一条链路。
华为执行过程如下:
- 在运营商A侧协商,确认对方会在关键路由上附带
100:10。 - 本地定义community过滤器,只匹配这个值:
ip community-filter 1 permit 100:10
写一个入向路由策略,匹配到后把LocalPref设成200,其他路由保持默认:
route-policy SET-LP permit node 10 if-match community-filter 1 apply local-preference 200 route-policy SET-LP permit node 20
- 在BGP视图里调用这个策略,方向是
import:
bgp 65001 peer 1.1.1.1 route-policy SET-LP import
思科对应版本:
ip community-list 10 permit 100:10 ! route-map SET-LP permit 10 match community 10 set local-preference 200 route-map SET-LP permit 20 ! router bgp 65001 neighbor 1.1.1.1 route-map SET-LP in
配置完成后,用display bgp routing-table community 100:10(华为)或show bgp community 100:10(思科)核对,能看到路由状态从默认值变成了200,此时BGP选路策略优化已经生效,其他路径即使AS Path更短,也会因为LocalPref低而靠边站。
如果对端不打社区属性,本地能不能自己打?
能,这个思路很常用:边界设备在入向收到路由后,先打上内部标签,再在iBGP内部继续传递时匹配,例如在入向策略里加一句apply community 65001:100,然后内部路由器就可以基于这个标记做二次决策。
这种做法的好处是把外部不可控因素转化为内部统一策略,就算上游不配合,你也可以建立一套自己的BGP社区属性规划。
运营商BGP选路优化方案:用community隔离业务等级
真正复杂的场景发生在运营商或大型城域网里,BGP社区属性怎么配置,直接决定了整网路由策略的可维护性,比较成熟的方案是“上游打标,下游翻译”。
某运营商在骨干网出口给不同业务的用户路由打上不同社区值:
| 社区值 | 业务等级 | 下游期望动作 |
|---|---|---|
| 65001:10 | VIP政企 | 设置最高LocalPref |
| 65001:20 | 普通专线 | 默认选路 |
| 65001:30 | 大流量低价业务 | 降低MED或LocalPref |
下游城域网收到这些路由后,只需要维护三条community匹配规则,就能实现差异化选路,如果靠前缀列表区分,每加一个客户就要追加一堆条目,最后策略多到没人敢动。
业内专家指出,这种打标方式的维护成本低于前缀列表,尤其是在需要频繁调整业务优先级时,只需要改路由策略里的映射关系,不用碰具体网段,城域网BGP路由控制中最常见的手段,就是让城域网出口路由器根据上游community值设置不同的BGP本地优先级。
怎么用community控制路由只在本AS内部传播
如果你不想让某条路由被本AS外的任何设备看到,直接在发送方向的策略里添加NO_EXPORT属性即可:
华为写法:
route-policy FILTER permit node 10 apply community no-export bgp 100 peer 2.2.2.2 route-policy FILTER export
思科写法:
route-map FILTER permit 10 set community no-export ! router bgp 100 neighbor 2.2.2.2 route-map FILTER out
这个场景经常出现在企业多As域联盟或运营商互联测试中,还有一个常用技巧是:先给路由打私有community,再在边界路由器统一拒收,动作顺序要保证社区属性已经附加在路由上。
排查社区属性配置的几个典型问题
配置不生效时,先按这个顺序自查:
- 匹配器没生效:定义community过滤器后,没有在route-policy里引用,或者引用了但节点没写
permit。 - 调用方向反了:需要影响选路应放在
import方向;需要影响对外通告应放在export方向,两者用反,结果完全无效。 - LocalPref只对本地AS有效:在eBGP入向设置LocalPref没问题,但如果写在通向其他AS的出口策略里,对方不会认。
- 多节点策略匹配顺序:route-policy是按节点顺序匹配的,先permit的节点会生效,后续节点不执行,常见的错误是把精确匹配放在通用匹配后面,被通用规则截胡了。
- 确认community是否被保留:某些运营商会在对端重置community,需要查看实际收到的路由信息。
验证命令优先级最高的是:
- 查看收到的路由community:
display bgp routing-table community(华为)或show bgp community(思科)。 - 查看策略调用详情:
display route-policy,确认匹配数和命中次数非零。 - 如果命中次数一直为零,说明上游压根没带这个community值,或者匹配条件写错。
收束:BGP社区属性的核心价值,是把路由选路从被动比较路径改为主动识别业务
只要在本地把标签精确映射到LocalPref或MED,大部分多出口、多业务、多运营商的选路策略都能落地,社区属性本身不传路由,但通过它,你能让路由学会“说话”。
BGP社区属性怎么配置这件事,难度并不高;难的是在设计阶段把社区值的语义约定清楚,并保证上下游一致执行。 先从小规模双出口练起,逐步推广到全网,比一开始就想做大全反而更快。
BGP社区属性怎么配置更稳妥?三个高频问题自查
问:BGP社区属性和AS Path过滤能互相替代吗?
不能,AS Path过滤只关心“路由经过了哪些AS”,它无法表达业务类型或优先级,社区属性是附加标记,可以独立于路径存在,例如两条路由来自同一个AS,但一条是业务测试,一条是生产流量,用AS Path无法区分,用community则一目了然,真实网络里两者通常配合使用,AS Path做粗粒度过滤,community做精细选路。
问:对方没有按约定打社区属性,我的策略会失效吗?
会失效,BGP路由中没携带community时,任何匹配操作都为空,应对措施是走“本地打标”路线:在入向策略里用前缀或AS Path先本地附加一个community值,再在内部路由策略中匹配这个值,这样做不依赖对方配合,但需要你本人在边界的同一策略里完成两步。
问:私有community值规划要注意什么?
核心原则是全局唯一、语义清晰,选择标准是允许范围是0到65535,但值本身必须和AS号绑定,避免不同业务方向使用相同数值,建议把高16位固定为本地AS号,低16位定义业务类型,如65001:10、65001:20,另有一条硬性约束:不要使用已公布的知名community值,例如NO_EXPORT,否则路由传播行为会与你预期完全不符。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/792435.html


