BGP社区属性就是给路由贴标签:标签本身不改变路由,但入方向打标、出方向按标匹配做过滤或修改本地优先级,就能精确控制这条路由能传多远、在哪个出口更优。 一个标签,两个动作,几乎所有BGP路由策略都能靠它落地。
BGP community属性到底怎么配置:从规划到上线的四个实操步骤
第一步:先规划编号,别随手写
社区属性是4字节可选传递属性,格式是 AS号:自定义值,65001:100,大型社区(Large Community,RFC 8092)扩展到12字节,格式为 全局管理员:局部值1:局部值2,主要给4字节AS号的环境用。
编号规划建议按功能分段,不要今天写 65001:1、明天写 65001:99:
65001:1xx:客户接入类,如65001:100表示”客户A前缀”65001:2xx:出口选择类,如65001:200表示”只走电信出口”65001:3xx:安全类,如65001:300表示”黑洞路由”65001:9xx:临时策略,便于定期清理
行业共识认为,社区编号一旦对外发布,就要当成接口来维护,上游运营商和下游客户可能都会引用,随意变更会直接打断对方的策略匹配。
第二步:入方向打标,出方向才有得玩
所有社区策略的核心动作只有两个:进来的时候贴标签,出去的时候看标签。
华为VRP上的典型写法:
# 入方向:给客户路由打标
route-policy RP_IN_CUST permit node 10
apply community 65001:100 additive
# 出方向:带这个标签的一律不放行
ip community-filter basic CF_CUST permit 65001:100
route-policy RP_OUT permit node 10
if-match community-filter CF_CUST
route-policy RP_OUT deny node 20
bgp 65001
peer 10.0.0.2 as-number 65002
peer 10.0.0.2 route-policy RP_IN_CUST import
peer 10.0.0.2 route-policy RP_OUT export
Cisco IOS的等价配置:
ip community-list standard CF_CUST permit 65001:100
route-map RP_IN permit 10
set community 65001:100 additive
route-map RP_OUT deny 10
match community CF_CUST
route-map RP_OUT permit 20
注意 additive 关键字:不加它,新社区会覆盖原有社区,上游给的标签就丢了,做多层策略时这是最常见的翻车点。
第三步:send-community 别忘开
社区属性是可选传递属性,默认行为各家不一样:
- Cisco IOS默认不向邻居发送社区属性,必须显式配置
neighbor x.x.x.x send-community(或send-community both) - 华为VRP默认发送标准社区,但大型社区需要额外配置
peer x.x.x.x send-community large - 部分厂商在iBGP和eBGP下的默认行为不同,升级版本后也可能变化
配置完先别急着测业务,敲一条 display bgp routing-table 10.1.1.0 或 show ip bgp 10.1.1.0,确认Community字段真的有值,再往下走。
第四步:验证要看路由表,不要只看配置
# 华为:按社区反查路由
display bgp routing-table community 65001:100
# Cisco:同理
show ip bgp community 65001:100
如果查出来为空,按顺序排查:入方向route-policy是否命中、additive是否漏配、邻居是否开启了send-community、对端是否把社区剥掉了,四个点逐一验证,基本能定位。
no-export和no-advertise有什么区别,选错会怎样
四个知名社区各自管什么
RFC 1997定义了几个”约定俗成”的知名社区(Well-known Community),不需要双方约定就能生效:
| 社区 | 十六进制值 | 实际行为 | 典型用途 |
|---|---|---|---|
| NO_EXPORT | 0xFFFFFF01 | 收到后不再向任何eBGP邻居通告,联邦内部仍可传递 | 防止路由泄漏给其他运营商 |
| NO_ADVERTISE | 0xFFFFFF02 | 收到后不再向任何邻居通告,包括iBGP | 本机专用,彻底不外传 |
| NO_EXPORT_SUBCONFED | 0xFFFFFF03 | 联邦内部也不通告 | 联邦环境下的严格隔离 |
| NOPEER | 0xFFFFFF04 | 不向对等体(非客户/非提供商)通告 | 抑制免费互联方向的泄漏 |
两句话的差别,后果差很远
NO_EXPORT 和 NO_ADVERTISE 的区别就一句话:前者允许在你自己AS内部继续传,后者连自己人都不给。
选错的实际后果:
- 该用NO_EXPORT却用了NO_ADVERTISE:路由在你自己的iBGP里就断了,其他边界路由器看不到这条前缀,业务直接不通
- 该用NO_ADVERTISE却用了NO_EXPORT:路由在你AS内部传了一圈,又从另一个边界路由器泄漏给了别的运营商,路由劫持风险就这么来的
一个实用判断法:只需要”出我不出去”用NO_EXPORT,需要”连我自己内部都别扩散”用NO_ADVERTISE。
跨运营商场景下,用社区给路由分等级
真实的多线机房场景通常长这样:一台边界路由器同时对接电信、联通、移动三家上游,还有若干客户接入。
做法是给每类路由打上不同标签,出方向按标签分流:
- 客户A的路由打
65001:100,只向电信和联通通告,移动方向用if-match拒绝 - 全部客户路由打
65001:900,一旦触发黑洞策略,上游按约定社区直接丢弃流量 - 需要优先回程的前缀打
65001:200,配合上游约定的社区体系触发对方调整本地优先级
关键点在于:上游是否认你的社区,取决于双方约定。 国内主流运营商都有自己的社区发布规范,远端触发类社区必须提前申请备案,自己随便打一个对方不认的编号,等于没打。
控制优选范围:社区属性本身不参与选路,但它是那个开关
BGP路由优选顺序是什么,community卡在第几位
这是很多人绕不过去的误区,BGP的选路是固定顺序的12步(华为与Cisco大体一致):
- 首选值(Preferred Value,Cisco称Weight)
- 本地优先级(Local Preference)
- 本地始发的路由优先
- AS_PATH最短
- Origin属性(IGP优于EGP,EGP优于Incomplete)
- MED值最小
- eBGP路由优于iBGP路由
- 到下一跳的IGP开销最小
- 路由最老(eBGP场景)
- Router ID最小
- Cluster List最短
- 邻居地址最小
社区属性不在这12步里的任何一步,它不参与比较,只负责被匹配。
所以正确的用法是:用社区做标签,用route-policy匹配标签后修改本地优先级或MED,让优选结果按你的意图发生。 社区是扳机,本地优先级是子弹。
用社区加本地优先级做出口分流
一个双出口的典型配置:
# 电信方向学来的路由打标
route-policy RP_IN_CT permit node 10
apply community 65001:200 additive
# 本地按标签抬高优先级
ip community-filter basic CF_CT permit 65001:200
route-policy RP_LOCAL permit node 10
if-match community-filter CF_CT
apply local-preference 200
route-policy RP_LOCAL permit node 20
bgp 65001
peer 10.0.0.2 route-policy RP_IN_CT import
peer 10.0.0.2 route-policy RP_LOCAL import
生效后,同一前缀从电信和联通都学到时,电信那条因为本地优先级更高会被选中,改动只发生在本AS内部,对端完全无感。
想影响别人的优选,得靠对方认的社区
如果你的目标是让上游运营商把回程流量走某个方向,靠改自己的本地优先级没用,必须给上游发它们约定好的社区。
操作路径是:
- 向运营商申请社区使用权限,拿到编号清单
- 在出方向route-policy里按目标前缀
apply community <运营商编号> - 确认
send-community已开启 - 在对端设备上用
show ip bgp类命令回查,确认社区已生效
这一步没有捷径,社区编号和生效范围完全取决于运营商侧的策略实现。
两个容易被忽略的细节
- 社区会跨AS传递,但可能被剥掉。 有些运营商在边界清洗未约定社区,自己内部的标签传出去就消失了,设计跨域策略时,要跟对端确认”这个社区你们会不会保留”。
- NO_EXPORT允许联邦内传递。 如果你的AS用了联邦(Confederation),NO_EXPORT和NO_EXPORT_SUBCONFED的行为差异会直接影响路由扩散范围,配之前先在实验环境验证一遍。
BGP community属性控制路由通告与优选范围常见问题解答
BGP community属性能直接决定选哪条路由吗?
不能,社区属性是可选传递属性,只作为策略匹配条件存在,不进入BGP选路的12步比较序列,实际生效路径是:匹配社区后修改本地优先级、MED或首选值,由这些属性去影响优选结果,只打标签不改属性,路由选择不会有任何变化。
大型社区和标准社区在控制通告范围上有什么区别?
协议层面行为一致,都是打标签后供策略匹配,区别在编码长度和容量,标准社区是4字节,格式为AS号加自定义值,2字节AS号环境下够用;大型社区是12字节,格式为三个字段,主要解决4字节AS号无法塞进标准社区格式的问题,跨域场景下用哪种,取决于双方设备能力和运营商约定。
给上游打了社区但回程流量没变化,问题出在哪?
按顺序查四点:一是该社区是否为运营商官方发布并已在对方侧完成备案;二是本端 send-community 是否真的开启,用 display bgp routing-table 确认属性已发出;三是运营商边界是否对未注册社区做了清洗;四是对方策略是否只对特定前缀长度或特定来源生效,四点里前两点是配置问题,后两点只能通过工单与运营商侧核实,无法从本端查证。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/792502.html


