BGP路由优选本质上是逐条比较路径属性,community属性本身不会参与排名,但通过策略把community标签转成local preference或MED,就能间接控制最优路径。
BGP路由优选原则有哪些:先记住比较顺序
做BGP策略之前,一定要先把选路顺序刻在脑子里,因为很多时候你想调一个属性,却被前面另一个属性抢先比较,结果策略不生效。
BGP路由优选的核心比较顺序如下:
- 先比weight:Cisco私有属性,值越大越优先,只在本地路由器有效。
- 再比local preference:本地优先级,值越大越优先,只在AS内部有效。
- 比较本地起源:本路由器产生的路由优先于从邻居学来的路由。
- 比较AS path长度:越短越优先。
- 比较origin code:IGP优于EGP优于incomplete。
- 比较MED:值越小越优先,只在同一个邻居AS之间比较。
- 比较邻居类型:eBGP邻居学来的路由优先于iBGP邻居学来的。
- 比较IGP metric:到达下一跳的IGP开销越小越优先。
- 最后比较router id和邻居地址等。
这中间最容易踩坑的是MED,不少运维发现MED设了没生效,原因是两条路由来自不同AS,或者跨越了AS边界,MED就不参与比较。
可以简单做一个属性对比表:
| 属性 | 比较方向 | 作用范围 | 默认值 |
|---|---|---|---|
| weight | 越大越优先 | 本地路由器 | 0或32768 |
| local preference | 越大越优先 | 整个AS | 100 |
| AS path | 越短越优先 | 全局 | 无 |
| MED | 越小越优先 | 相邻AS之间 | 0 |
BGP community属性怎么设置才能影响选路
先说结论:
community只是一个标签,不是度量值。 它本身不参与BGP最优路径计算,但它是策略的通行证。
如果你想让community影响选路,基本思路是:
- 第一步,在路由进入某个方向时,匹配前缀、AS path等条件,给路由打上特定community标签。
- 第二步,在路由传递时,确保邻居之间开启
send-community。 - 第三步,在对端或本端入方向再匹配这个community标签,然后修改local preference、MED、weight等真正参与选路的属性。
举个实际配置片段,假设你要把从邻居10.0.0.1收到的带有65000:100标签的路由,本地优先级改到200:
ip community-list standard HIGH_LP permit 65000:100
route-map SET_LP permit 10
match community HIGH_LP
set local-preference 200
router bgp 65001
neighbor 10.0.0.1 route-map SET_LP in
neighbor 10.0.0.1 send-community
这样配置后,带65000:100标签的路由在进入该路由器时,本地优先级从默认100提升到200,自然会在BGP路由优选原则中更靠前。
还有一种更常用的做法是在出口方向给路由打标签,再由对方AS匹配标签调整MED,从而影响对方进入本AS的流量路径。
BGP本地优先级和MED区别:两个最常用的选路调节点
很多刚接触BGP路由优选的人会混淆这两个属性,它们一个影响自己怎么出去,一个影响别人怎么进来。
local preference:
- 作用范围小,只在AS内部传播,不会发送给eBGP邻居。
- 值越大越优先。
- 主要用于控制本AS的出口流量走哪条链路。
- 一般在入方向设置,即影响从哪个出口出去。
MED:
- 作用范围跨AS,但通常只在两个直接相连的AS之间比较。
- 值越小越优先。
- 主要用于影响对方AS的入口流量走哪条链路进入本AS。
- 一般在出方向设置,即通告给邻居时设置。
举一个BGP双线机房路由优化的常见例子:
- 机房有电信和联通两条出口。
- 想默认走电信出口,就在从电信邻居收到的路由上设置local preference 200,从联通邻居收到的路由保持100。
- 想让自己对外发布的业务路由优先走电信进入,就在发给电信邻居的MED设置成50,发给联通邻居的MED设置成100。
这样的组合策略很直观,也是运维最常用的手段。
多出口BGP双线机房路由优化:community过滤路由场景
多出口环境下,最容易出的问题不是选路,而是把自己变成了免费中转路由。
比如你同时接电信和联通,如果直接把电信学到的路由通告给联通,对方可能会把流量转给你,你的带宽就被白白占用。
这时就可以用community来标记和过滤,常见的BGP community过滤路由场景步骤如下:
- 从电信邻居收路由时,设置community为
65000:100。 - 从联通邻居收路由时,设置community为
65000:200。 - 在向电信邻居通告路由的out方向,写route-map拒绝带有
65000:100的路由。 - 在向联通邻居通告路由的out方向,写route-map拒绝带有
65000:200的路由。
实际配置思路如下:
route-map FROM_TELECOM permit 10
set community 65000:100
route-map TO_TELECOM deny 10
match community 65000:100
route-map TO_TELECOM permit 20
这样电信学来的路由不会回传给电信,联通学来的路由也不会回传给联通,避免形成路由环路和带宽中转。
更进一步,还可以在出口给业务路由打上no-export或no-advertise这类公认community,控制通告范围。
进阶:community与路由优选配合的完整策略设计
真正把BGP用好的网络,通常不是单独靠local preference或MED,而是用community做一层抽象标签。
匹配标记传递再匹配修改属性的闭环
完整策略一般分五步:
- 在路由入口做前缀匹配或AS path匹配,给不同来源的路由打上不同community。
- 邻居间开启
send-community,确保标签不丢失。 - 路由传到对端后,对端在in方向再次匹配community。
- 匹配成功后修改local preference或MED,影响BGP路由优选结果。
- 在out方向重新设置新的community,控制路由下一跳传播范围。
这样做的好处是,上游运营商或下游客户可以约定一套community值规范,后续调整选路只改标签含义,不动大量前缀列表。
常见community值列表及含义
RFC1997定义了几个公认community:
| community值 | 作用 |
|---|---|
| internet | 通告给所有邻居 |
| no-advertise | 不向任何对等体通告 |
| no-export | 不向eBGP对等体通告 |
| local-as | 不向AS外通告 |
这些值可以直接使用,不需要自定义。
例如在出口route-map里给特定前缀设置no-export,该路由就不会被邻居再传给其他AS,适合做内部业务路由的保护。
Q&A:BGP路由优选与社区属性常见问题
BGP community属性会影响路由选路吗?
不会直接参与最优路径比较,community只是标签,必须先匹配community,再修改weight、local preference、MED等真正参与比较的属性,才能影响BGP路由优选结果。
BGP本地优先级和MED区别是什么?
本地优先级只在AS内传播,值越大越优先,用于控制本AS出口流量,MED跨AS传递,值越小越优先,用于影响邻居AS进入本AS的流量,两者默认值分别为100和0,修改位置通常分别是in方向和out方向。
BGP双线机房如何用community过滤路由?
上游给收到的路由打上标识来源的community标签,出口方向匹配这些标签拒绝向另一个上游回传,或者设置no-export限制继续通告,这样可以阻断免费中转,避免宽带资源被第三方占用。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/643235.html





