关键词:BGP、前缀限制、Prefix Limit、安全防护、Route Leak、Max Prefix、BGP 安全

第96篇:BGP 前缀限制与安全防护

一、引言

BGP 是互联网的骨干路由协议,但其设计之初并未充分考虑安全性。一个恶意或配置错误的对等体可能向网络注入大量虚假路由,甚至注入默认路由劫持流量。这种路由劫持(Route Hijacking)和路由泄露(Route Leak)事件在历史上多次造成大规模网络中断。

BGP 前缀限制(Prefix Limit)是最基础也是最有效的 BGP 安全机制之一。通过限制从特定对等体接收的前缀数量,可以有效防止因对端异常或恶意行为导致的 BGP 表膨胀和路由混乱。

二、核心概念

2.1 BGP 安全风险类型

风险类型 描述 危害
路由劫持 注入不属于己网的 IP 前缀 流量被引流到错误目的地
路由泄露 将对端的路由泄露给第三方 成为非预期的 Transit,消耗带宽
路由泛滥 注入大量虚假路由 BGP 表膨胀,设备内存耗尽
默认路由劫持 注入 0.0.0.0/0 默认路由 劫持全部未知目的地流量

2.2 前缀限制原理

前缀限制通过限制从特定 BGP 对等体接收的最大前缀数量来保护本地路由器:

前缀限制原理 - 图示

2.3 BGP 前缀限制的配置参数

参数 说明 建议值
maximum-prefix 最大接收前缀数 根据对端规模设定
overflow-action 超限后的动作 reset / restart / restrict
threshold-percent 警告阈值百分比 75%
restart-interval 重置后等待时间 300 秒

三、技术细节

3.1 前缀限制配置

# 基本前缀限制
bgp 100
 peer 203.0.113.1 as-number 200
 peer 203.0.113.1 maximum-prefix 1000
# 从该对等体最多接收 1000 条前缀

# 完整配置(含超限动作)
bgp 100
 peer 203.0.113.1 as-number 200
 peer 203.0.113.1 maximum-prefix 1000 75 restart-interval 300
# 最大前缀数: 1000
# 警告阈值: 75%(达到 750 条时告警)
# 超限动作: 重置 BGP 会话
# 重置等待时间: 300 秒

# 使用 restrict 模式(超限后拒绝新路由但保持会话)
bgp 100
 peer 203.0.113.1 as-number 200
 peer 203.0.113.1 maximum-prefix 1000 overflow-action restrict

3.2 前缀过滤

除了数量限制,还需要通过前缀列表过滤不合法的路由:

# 定义合法前缀列表
ip prefix-list ALLOWED-PREFIXES seq 10 permit 10.0.0.0 8 less-equal 24
ip prefix-list ALLOWED-PREFIXES seq 20 permit 172.16.0.0 12 less-equal 24
ip prefix-list ALLOWED-PREFIXES seq 30 permit 192.168.0.0 16 less-equal 24
# 隐式 deny all:不在列表中的前缀全部拒绝

# 应用前缀过滤
route-policy PREFIX-FILTER deny node 10
 if-match ip-address prefix-list DENY-LIST

route-policy PREFIX-FILTER permit node 20
 if-match ip-address prefix-list ALLOWED-PREFIXES

bgp 100
 peer 203.0.113.1 as-number 200
 peer 203.0.113.1 route-policy PREFIX-FILTER import

3.3 默认路由过滤

# 定义前缀列表:拒绝默认路由,允许其他所有前缀
ip prefix-list NO-DEFAULT deny 0.0.0.0 0
ip prefix-list NO-DEFAULT permit 0.0.0.0 0 less-equal 32

route-policy FILTER-DEFAULT permit node 10
 if-match ip-address prefix-list NO-DEFAULT

bgp 100
 peer 203.0.113.1 as-number 200
 peer 203.0.113.1 route-policy FILTER-DEFAULT import

3.4 AS_PATH 过滤

通过过滤 AS_PATH 属性来防止来自特定 AS 的路由:

# 拒绝来自特定 AS 的路由
ip as-path-filter 1 deny ^65000.*
# 拒绝 AS_PATH 以 65000 开头的路由(来自 AS 65000)

ip as-path-filter 1 permit .*

route-policy AS-PATH-FILTER deny node 10
 if-match as-path-filter 1

route-policy AS-PATH-FILTER permit node 20

bgp 100
 peer 203.0.113.1 as-number 200
 peer 203.0.113.1 route-policy AS-PATH-FILTER import

3.5 前缀长度限制

防止对端发送过长或过短的前缀:

# 只接受 /24 到 /28 的前缀
ip prefix-list VALID-LENGTH seq 10 deny 0.0.0.0 0 less-equal 23
ip prefix-list VALID-LENGTH seq 20 deny 0.0.0.0 0 greater-equal 29
ip prefix-list VALID-LENGTH seq 30 permit 0.0.0.0 0 less-equal 32

route-policy LENGTH-FILTER permit node 10
 if-match ip-address prefix-list VALID-LENGTH

bgp 100
 peer 203.0.113.1 as-number 200
 peer 203.0.113.1 route-policy LENGTH-FILTER import

四、实战配置/案例分析

4.1 场景一:多 ISP 互联的前缀限制策略

需求:AS 100 与三个 ISP 建立 eBGP 连接,需要根据不同 ISP 的规模设置不同的前缀限制。

场景一:多 ISP 互联的前缀限制策略 - 图示

配置实现:

# === 针对不同 ISP 设置不同的前缀限制 ===
bgp 100
 # ISP1 - 大型 ISP,允许完整路由表
 peer 203.0.113.1 as-number 64501
 peer 203.0.113.1 maximum-prefix 100000 90 restart-interval 600
 peer 203.0.113.1 route-policy ISP1-IMPORT import

 # ISP2 - 中型 ISP,限制路由表规模
 peer 198.51.100.1 as-number 64502
 peer 198.51.100.1 maximum-prefix 50000 80 restart-interval 300
 peer 198.51.100.1 route-policy ISP2-IMPORT import

 # ISP3 - 小型 ISP,严格限制
 peer 192.0.2.1 as-number 64503
 peer 192.0.2.1 maximum-prefix 5000 75 restart-interval 120
 peer 192.0.2.1 route-policy ISP3-IMPORT import

# === 各 ISP 的入向策略 ===
# ISP1 策略:接受全路由
route-policy ISP1-IMPORT permit node 10
 apply local-preference 100

# ISP2 策略:只接受特定前缀
ip prefix-list ISP2-ALLOW seq 10 permit 10.0.0.0 8
ip prefix-list ISP2-ALLOW seq 20 permit 172.16.0.0 12
route-policy ISP2-IMPORT permit node 10
 if-match ip-address prefix-list ISP2-ALLOW
 apply local-preference 100

# ISP3 策略:严格过滤
ip prefix-list ISP3-ALLOW seq 10 permit 10.100.0.0 16
route-policy ISP3-IMPORT permit node 10
 if-match ip-address prefix-list ISP3-ALLOW
 apply local-preference 100

4.2 场景二:防止路由泄露

需求:防止上游 ISP 的路由泄露到下游或对等 ISP。

# 从 ISP 接收路由时添加 no-export Community
route-policy ISP-IMPORT permit node 10
 apply community no-export additive

bgp 100
 peer 203.0.113.1 as-number 64501
 peer 203.0.113.1 route-policy ISP-IMPORT import

# 向对等 ISP 发送路由时,过滤携带 no-export 的路由
# (华为设备默认行为,此处显式配置确保万无一失)
ip community-filter basic NO-EXP permit no-export

route-policy PEER-EXPORT deny node 10
 if-match community-filter NO-EXP

route-policy PEER-EXPORT permit node 20

bgp 100
 peer 198.51.100.1 as-number 64502
 peer 198.51.100.1 route-policy PEER-EXPORT export

4.3 故障案例:前缀超限导致 BGP 震荡

故障现象:BGP 对等体频繁震荡,会话不断建立又断开。

# 查看 BGP 对等体状态
display bgp peer 203.0.113.1
# 状态在 Idle/Connect/Active/Established 之间震荡

# 查看 BGP 日志
display logbuffer | include BGP
# 发现类似告警:
# BGP maximum-prefix exceeded, peer reset

# 根因分析:
# 对端新增了大量路由,超过了 maximum-prefix 限制
# 超限后触发 reset,会话断开
# 重新建立后又超限,再次 reset → 震荡循环

# 解决步骤:
# 1. 临时增大前缀限制
bgp 100
 peer 203.0.113.1 maximum-prefix 20000 90 restart-interval 600

# 2. 与对端协调,确认新增路由的合法性
# 3. 如果新增路由合法,永久增大限制
# 4. 如果新增路由不合法,在对端修正路由发布策略

五、总结

防护手段 防护目标 配置复杂度 推荐度
前缀数量限制 路由泛滥 低 必须
前缀列表过滤 非法前缀 中 必须
AS_PATH 过滤 来自特定 AS 的路由 低 推荐
前缀长度限制 异常前缀长度 低 推荐
Community 标记 路由泄露 中 推荐
默认路由过滤 默认路由劫持 低 必须

BGP 安全防护最佳实践: 1. 为所有 eBGP 对等体配置前缀数量限制,根据对端规模设定合理值 2. 部署前缀列表过滤,只接受预期的 IP 前缀 3. 过滤默认路由(除非明确需要从对端接收) 4. 使用 no-export Community 防止路由泄露 5. 定期审计 BGP 路由策略和前缀列表 6. 监控 BGP 路由表变化,设置告警阈值

思考

  1. 前缀限制的 overflow-action 有 reset、restart、restrict 等选项,在什么场景下应该选择 reset,在什么场景下应该选择 restrict?
  2. 如果将对端的前缀限制设置过小,会导致什么问题?如何确定一个合理的阈值?
  3. 前缀列表过滤和 AS_PATH 过滤各有何优劣?在实际部署中应该如何使用它们?

下篇预告:第97篇:BGP 团体属性在运营商网络中的应用