技术博客

HCIP 数通:BGP 路由策略进阶、Route-Policy、Community 属性实战

深入讲解 BGP 路由策略的精细化控制:Route-Policy 与 Filter-Policy 的区别和使用场景、AS-Path Filter 过滤路由、Prefix-List 精确匹配前缀、Community 属性标记路由与策略联动、BGP 路由反射器配置,通过企业双运营商出口策略的完整案例演示路由策略的生产应用。

BGPHCIP路由策略Route-PolicyCommunityFilter数通

BGP 的强大不只在于路由协议本身,更在于其丰富的路由策略能力。Route-Policy、AS-Path Filter、Prefix-List、Community 属性联合使用,可以精确控制哪些路由进入 BGP、哪些传给哪个邻居、如何修改路由属性。这是企业多运营商出口优化的核心技能。

路由策略工具对比

路由策略工具体系:

Filter-Policy(过滤策略):只能过滤(允许/拒绝),不能修改属性
  filter-policy acl/prefix-list import/export

Route-Policy(路由策略):既能过滤,又能修改属性(if-match + apply)
  route-policy NAME {permit|deny} node SEQ
    if-match ... (匹配条件)
    apply ...    (执行动作)

适用场景:
  只需要过滤(不需要改属性)→ Filter-Policy(简单)
  需要修改属性(改 LP/MED/Community)→ Route-Policy

一、Prefix-List(前缀列表)

Prefix-List 比 ACL 更精确地匹配路由前缀(支持长度范围匹配)。

# 匹配精确前缀
ip ip-prefix EXACT-MATCH index 10 permit 10.100.0.0 16   # 精确匹配 10.100.0.0/16

# 匹配前缀及其所有子网(ge/le 指定长度范围)
ip ip-prefix SUBNET-RANGE index 10 permit 10.100.0.0 16 greater-equal 24 less-equal 32
# 匹配:10.100.x.x/24, /25, ..., /32(长度 24-32 的子网)

# 拒绝特定前缀,允许其他
ip ip-prefix DENY-ONE index 5  deny   192.168.1.0 24   # 拒绝这个
ip ip-prefix DENY-ONE index 10 permit 0.0.0.0 0 greater-equal 0 less-equal 32  # 允许其他所有

# 常用:只允许默认路由
ip ip-prefix DEFAULT-ONLY index 10 permit 0.0.0.0 0

# 查看
display ip ip-prefix EXACT-MATCH

二、AS-Path Filter

# AS-Path 使用正则表达式匹配
# 特殊字符:
#   ^  = AS-Path 开头
#   $  = AS-Path 结尾
#   .  = 任意字符
#   *  = 0 或多次
#   +  = 1 或多次
#   _  = 分隔符(空格、逗号、^、$等)

# 只允许本地产生的路由(AS-Path 为空)
ip as-path-filter 1 permit ^$

# 只允许来自直接 EBGP 邻居(AS-Path 只有一个 AS)
ip as-path-filter 2 permit ^[0-9]+$

# 拒绝经过特定 AS 的路由(AS 200 是不信任的 AS)
ip as-path-filter 3 deny _200_
ip as-path-filter 3 permit .*

# 只接收来自 AS 100 或 AS 200 的路由
ip as-path-filter 4 permit _100_|_200_

# 查看 AS-Path Filter
display ip as-path-filter 1

# 使用 AS-Path Filter 过滤(在邻居配置中引用)
bgp 65000
  peer 10.0.12.2 as-path-filter 3 import   # 过滤特定 AS 的路由

三、Route-Policy(核心工具)

Route-Policy 由多个 node 组成,按顺序匹配,第一个匹配的 node 执行对应动作。

# 基本结构
route-policy POLICY_NAME {permit|deny} node 10
  if-match ip-prefix MY_PREFIX      # 匹配条件(可以多个 if-match,AND 关系)
  apply local-preference 200        # 执行动作(修改属性)

route-policy POLICY_NAME permit node 20
  # 没有 if-match = 匹配所有(兜底)

# 注意:
# permit node = 满足 if-match 条件的路由通过(可以用 apply 修改属性)
# deny node   = 满足 if-match 条件的路由拒绝
# 最后一个没有 if-match 的 permit node = 放行所有剩余路由(常用兜底)
# 默认隐含最后一条 deny,没匹配到任何 node 的路由被拒绝

实战:双运营商入向策略

# 目标:
# 从电信接收的路由,LOCAL_PREF=200(高优先,主路由)
# 从联通接收的路由,LOCAL_PREF=100(低优先,备份路由)
# 两者都不接收默认路由

# 1. 创建 Prefix-List:拒绝默认路由
ip ip-prefix NO-DEFAULT index 5 deny 0.0.0.0 0          # 拒绝默认路由
ip ip-prefix NO-DEFAULT index 10 permit 0.0.0.0 0 ge 1  # 允许其他所有路由

# 2. 创建电信入向策略
route-policy TELECOM-IN permit node 10
  if-match ip-prefix NO-DEFAULT      # 不是默认路由
  apply local-preference 200          # 打高 LP

# 没有匹配到的路由(包括默认路由)被拒绝(隐含 deny)

# 3. 创建联通入向策略
route-policy UNICOM-IN permit node 10
  if-match ip-prefix NO-DEFAULT
  apply local-preference 100          # 打低 LP

# 4. 应用策略
bgp 65000
  peer 10.0.12.2 route-policy TELECOM-IN import   # 电信对等体
  peer 10.0.13.2 route-policy UNICOM-IN import    # 联通对等体

实战:出向路由控制

# 目标:
# 只向电信通告我们自己的网段(10.100.0.0/16 及其子网)
# 不通告内部路由

# Prefix-List:只允许我们的网段
ip ip-prefix MY-PREFIXES index 10 permit 10.100.0.0 16 greater-equal 16 less-equal 24

# 出向 Route-Policy
route-policy OUT-TO-ISP permit node 10
  if-match ip-prefix MY-PREFIXES
  # 不需要 apply(不修改属性)

# deny 其他所有(隐含)

bgp 65000
  peer 10.0.12.2 route-policy OUT-TO-ISP export   # 只向电信通告我们的路由

四、Community 属性

Community 是 BGP 路由的“标签”,用于批量标记路由并在不同地点统一处理。

# Community 格式:
# 标准 Community:AA:NN(AS号:团体值)
# 知名 Community:
#   internet(0:0):通告给所有邻居(默认)
#   no-export(65535:65281):不通告给 EBGP 邻居
#   no-advertise(65535:65282):不通告给任何邻居
#   no-export-subconfed(65535:65283):不通告给联盟外邻居

# 场景:标记从电信学到的路由,在 RR 处统一处理

# 1. 给从电信来的路由打上 Community 标签
route-policy MARK-TELECOM permit node 10
  apply community 65000:100    # 标记为电信路由

bgp 65000
  peer 10.0.12.2 route-policy MARK-TELECOM import

# 2. 在路由反射器上,根据 Community 调整 LOCAL_PREF
ip community-filter 1 permit 65000:100   # 匹配 Community 65000:100 的路由

route-policy SET-LP-BY-COMMUNITY permit node 10
  if-match community-filter 1            # 匹配电信标记
  apply local-preference 200

route-policy SET-LP-BY-COMMUNITY permit node 20
  # 其他路由不修改(pass through)

bgp 65000
  peer 10.0.0.1 route-policy SET-LP-BY-COMMUNITY import  # 在 RR Client 上处理

# 3. 确保 Community 属性被传递
bgp 65000
  peer 10.0.0.1 advertise-community    # 传递 Community 属性给 IBGP 邻居

ISP Community(接收方控制)

# 运营商通常提供 Community 值让客户控制路由通告

# 例如某运营商的 Community 服务:
# 100:666  → 不通告给该运营商的其他客户
# 100:1000 → 通告给中国电信
# 100:2000 → 通告给中国联通

# 通过 Community 控制从 ISP 接收到的路由在全球的传播范围
route-policy MY-PREFIX-COMMUNITY permit node 10
  apply community 100:1000 100:2000    # 希望电信和联通都能到达我们

bgp 65000
  peer 10.0.12.2 route-policy MY-PREFIX-COMMUNITY export

五、综合案例:企业双线 BGP 完整配置

# 拓扑:
# 企业 AS 65000:两个出口路由器 R1(接电信)和 R2(接联通)
# 业务网段:10.100.0.0/24

# === R1(电信出口)配置 ===
system-view

# Prefix-List
ip ip-prefix MY-PREFIXES index 10 permit 10.100.0.0 24
ip ip-prefix NO-DEFAULT  index 5  deny   0.0.0.0 0
ip ip-prefix NO-DEFAULT  index 10 permit 0.0.0.0 0 greater-equal 1 less-equal 32

# 入向:标记电信路由,打高 LOCAL_PREF
route-policy TELECOM-IN permit node 10
  if-match ip-prefix NO-DEFAULT
  apply local-preference 200
  apply community 65000:100 additive    # 追加 Community 标记

# 出向:只通告我们的路由,做 AS-Path Prepend(让回程优先走联通)
# 注:如果希望回程也走电信,就不做 Prepend
route-policy TELECOM-OUT permit node 10
  if-match ip-prefix MY-PREFIXES
  # 不做 Prepend,正常通告

bgp 65000
  router-id 1.1.1.1
  peer 10.0.12.2 as-number 100             # 电信 EBGP 邻居
  peer 10.0.12.2 route-policy TELECOM-IN  import
  peer 10.0.12.2 route-policy TELECOM-OUT export

  # R2(联通出口)IBGP 邻居
  peer 2.2.2.2 as-number 65000
  peer 2.2.2.2 connect-interface LoopBack0
  peer 2.2.2.2 next-hop-local
  peer 2.2.2.2 advertise-community         # 传递 Community

  # 宣告本地网段
  network 10.100.0.0 255.255.255.0

quit

# === R2(联通出口)配置 ===(类似,LOCAL_PREF 设低)
route-policy UNICOM-IN permit node 10
  if-match ip-prefix NO-DEFAULT
  apply local-preference 100
  apply community 65000:200 additive

# 出向:AS-Path Prepend(减少联通路由的吸引力,让更多流量走电信回来)
route-policy UNICOM-OUT permit node 10
  if-match ip-prefix MY-PREFIXES
  apply as-path 65000 additive   # 追加一次 AS 号(AS-Path 变长,吸引力降低)

bgp 65000
  peer 10.0.13.2 as-number 200
  peer 10.0.13.2 route-policy UNICOM-IN  import
  peer 10.0.13.2 route-policy UNICOM-OUT export
  network 10.100.0.0 255.255.255.0
quit

六、验证与排障

# 查看 BGP 路由的 Community 属性
display bgp routing-table 8.8.8.0 24 community
# Community: 65000:100

# 验证 Route-Policy 效果
display bgp peer 10.0.12.2 route-policy TELECOM-IN

# 模拟 Route-Policy(查看某路由经过策略后的结果)
display route-policy TELECOM-IN

# 重置 BGP 邻居(策略修改后刷新路由)
# 软重置(不断开邻居,只重新应用策略)
reset bgp 10.0.12.2 soft import       # 重新处理入向路由
reset bgp 10.0.12.2 soft export       # 重新通告出向路由
# 硬重置(断开邻居重建,慎用)
reset bgp 10.0.12.2

# 查看策略应用后的路由
display bgp routing-table peer 10.0.12.2 accepted-routes  # 通过策略的路由
display bgp routing-table peer 10.0.12.2 rejected-routes  # 被策略拒绝的路由

小结

BGP 路由策略的三层工具:Prefix-List 精确匹配路由前缀(比 ACL 更灵活,支持长度范围);AS-Path Filter 基于 AS 路径正则匹配(防止经过不信任的 AS);Route-Policy 是最强大的工具,if-match 做条件匹配,apply 修改路由属性。Community 是跨设备协同策略的粘合剂:给路由打上标签,在不同路由器上根据标签统一处理,避免在每个路由器重复配置相同的过滤逻辑。企业双线出口的黄金策略:LOCAL_PREF 控制出口(流量从哪条线出去)+ AS-Path Prepend 控制入口(流量从哪条线回来)。