BGP社区属性是路由策略中的“贴标签”机制,通过传递与过滤控制路由的发布和优选,理解它的工作流程能让你在网络排障时少走弯路。
社区属性在BGP路由优选中的角色定位
社区属性(Community Attribute)不是路由优选算法里的直接比较项,它更像一个“前置标记器”,路由收到后,先看身上贴了哪些社区标签,再决定是否修改LOCAL_PREF、AS_PATH等真正参与优选决策的属性,很多人误以为社区属性本身有优先级,实际上它只起到条件触发的作用。
社区属性的传递遵循“逐跳透明”原则除非被显式过滤,否则它会同路由一起发给所有对等体,这个特性带来两个问题:一是容易把内部标签泄露给外部AS,二是外部社区值可能污染内部策略,所以过滤机制必须和传递机制配合使用。
社区属性的分类与传递路径
公认社区与私有社区的区别
公认社区包括INTERNET(0x00000000)、NO_EXPORT(0xFFFFFF01)、NO_ADVERTISE(0xFFFFFF02)、NOPEER(0xFFFFFF04),私有社区采用ASN:自定义值格式,比如65001:100,只在本AS内有意义。
传递路径上,如果路由从EBGP邻居收到,默认会携带所有社区值继续传给IBGP邻居,但传给下一个EBGP邻居时,很多运营商会用ip community-list和route-map做剥离,业内专家指出,约80%的BGP异常路由都与社区属性误传递有关,这个数据提醒我们建立清晰的过滤边界。
IBGP与EBGP场景下的传递差异
IBGP邻居之间社区属性默认全部透传,所以在一个AS内部,社区值可以跨多台路由器流动,EBGP场景则复杂一些你无法控制对端是否保留你的社区值,只能通过neighbor x.x.x.x send-community和send-community extended主动声明发送。
实际配置时,华为设备和思科设备的语法不同,思科用:
router bgp 65001
neighbor 192.0.2.1 send-community
华为用:
bgp 65001
peer 192.0.2.1 advertise-community
传递路径的验证命令是display bgp routing-table community(华为)或show ip bgp community(思科)。
社区属性过滤机制详解
入方向过滤与出方向过滤的决策顺序
过滤发生在路由接收和发送两个时机,入方向过滤影响本地路由表,出方向过滤影响对端收到的路由,社区过滤的优先级高于其他route-map匹配条件,因为社区匹配通常是route-map里的第一个match子句。
实际排障中,入方向过滤常用于拒绝带特定黑名单社区的路由,
ip community-list 1 deny 65001:666
route-map deny-community in permit 10
match community 1
出方向过滤则常用于控制对端能看到哪些路由,例如把客户路由标记为65001:100,在对端出方向只放行带这个标签的路由。
正则表达式在社区过滤中的应用
社区值本质是32位数字,可以用正则精准匹配,例如^65001:100$匹配精确值,65001:[1-9][0-9]{2}$匹配65001:100到65001:999范围,过滤时注意社区列表默认是“匹配即动作”,多条列表项之间是或关系,需要谨慎设计顺序。
本地策略与对端策略的联动过滤
社区属性产生效用的关键在于“本地打标+对端过滤”的配合,比如你在接收所有上游路由时,按路由来源AS打上不同社区值,然后对核心路由器设置“只接受带特定社区值的路由”,这样就能在不改动大量前缀列表的情况下完成精细化控制。
计算路径时,社区过滤发生在BGP决策过程的第0步也就是进入bestpath比较之前,如果一个路由被本地策略拒绝,它根本不会进入优选环节,这就是为什么说社区过滤是“前置闸门”。
社区属性影响路由优选的典型场景
用NO_EXPORT控制路由传播范围
NO_EXPORT社区告诉接收方:不要把这条路由发给任何EBGP邻居,这在数据中心场景非常实用,比如两个IDC之间建立IBGP,想共享某些内网路由但不想让它们出海,只需给这些路由打上NO_EXPORT。
配置方法:
route-map SET-NO-EXPORT permit 10
set community no-export
然后应用到neighbor的出方向,对端收到后自动不向其他AS通告,无需对端任何策略配合。
用自定义社区触发LP修改
这是社区属性影响路由优选的最直接方式,核心思路是:上游路由器根据社区值修改LOCAL_PREF,从而影响选路结果。
一个常用场景是区分“正常流量”和“备份流量”,比如你的AS有两条出口,你想让对端优先走主链路,就给主链路路由打上65001:10,备份链路路由打上65001:20,对端路由器配置:
route-map community-to-lp permit 10
match community 65001:10
set local-preference 200
这样社区属性就间接改变了BGP选路结果,效果比手动逐条修改LOCAL_PREF更易维护。
社区匹配顺序导致的路由黑洞问题
有个常见的坑:当一条路由同时匹配多个社区值时,route-map的顺序决定了最终动作为permit还是deny,如果你先写了一个deny社区列表,后面又写了一个permit,但顺序颠倒,结果完全不同。
建议把社区过滤的route-map单独拆分,每个route-map只做一件事,通过call语句组合。
route-map FILTER permit 10
match community 1
call SET-LP
这样可读性和可维护性都更高。
社区属性过滤的常见问题与排障思路
为什么对端看不到我打的社区标签
排查步骤:先在本端用show ip bgp确认路由的社区值存在,然后检查邻居是否启用了send-community,如果配置没问题,再检查是否有入方向的community-list过滤把标签剥掉了,相当一部分案例是出方向route-map里用了set community none意外清空。
社区值被莫名加上了多余的可选传递属性
扩展社区(Extended Community)与标准社区不同,它用8字节表达,需要单独配置send-community extended,如果你的策略里需要传递RT(Route Target)等扩展社区,漏掉这个选项会导致对端完全收不到。
运营商级过滤策略如何设计
行业共识认为,运营商级社区过滤应遵循“默认拒绝、显式放行”原则,对外部对等体,只接收公认社区和约定好的私有社区范围;对内部对等体,区分核心层与接入层,不同层级使用不同的过滤模板。
一个成熟的策略模板包含三层:先过滤未知社区,再剥离敏感标签,最后应用动作,命令验证时,用show ip bgp community-list查看匹配结果,用debug ip bgp updates跟踪实际发送的社区值。
Q&A:社区属性与路由优选匹配问题
社区属性会直接参与BGP选路比较吗
不会,BGP选路比较顺序中,没有社区属性这一项,社区属性的作用是前置修改器通过route-map改变LOCAL_PREF、AS_PATH等直接选路参数,从而间接触发优选变化。
如何区分NO_EXPORT和NO_ADVERTISE的作用范围
NO_EXPORT禁止路由被通告给任何EBGP邻居,但允许在AS内部IBGP之间传播,NO_ADVERTISE则完全禁止路由被通告给任何邻居,包括IBGP,需要跨AS传递就用NO_EXPORT,需要限定在本路由器上就用NO_ADVERTISE。
社区过滤和前缀过滤哪个优先级更高
两者都在BGP路由表加载前生效,但执行顺序不同,入方向先执行前缀列表匹配,再做社区过滤,出方向先调用route-map中的match语句,社区匹配和前缀匹配可以同时出现在一个route-map里,匹配逻辑是AND关系,所以不存在谁优先级更高,而是看你的route-map结构如何设计。
回到核心结论:社区属性的传递靠neighbor级别的send-community开启,过滤靠community-list配合route-map完成,它对路由优选的影响体现在间接修改LP等参数上,实际部署时,务必先画清标签规划表,再写配置,然后使用show bgp community逐一验证,秩序比技巧更重要。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/792426.html


