关键词: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 设置不同的前缀限制 ===
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 路由表变化,设置告警阈值
思考
- 前缀限制的 overflow-action 有 reset、restart、restrict 等选项,在什么场景下应该选择 reset,在什么场景下应该选择 restrict?
- 如果将对端的前缀限制设置过小,会导致什么问题?如何确定一个合理的阈值?
- 前缀列表过滤和 AS_PATH 过滤各有何优劣?在实际部署中应该如何使用它们?
下篇预告:第97篇:BGP 团体属性在运营商网络中的应用