第1章:BGP安全架构总体设计
1.1 为什么BGP安全这么难搞?
说实话,BGP协议本身在设计时就没怎么考虑安全。上世纪90年代的互联网,大家彼此信任,谁会想到今天会有这么多幺蛾子?
我入行那会儿,第一次配置BGP就被师傅教育:BGP是建立在信任模型上的。你想想看,一个AS宣告的路由,其他AS默认就信了。这不就是典型的「信任但验证」吗?可惜现实中,验证这一步经常被跳过。
BGP的安全问题,说白了就三类:
- 路由劫持:有人故意宣告不属于自己的IP前缀
- 路由泄露:不小心把不该传的路由传出去了
- 路由篡改:中间人修改了AS_PATH或NEXT_HOP
我在项目中遇到过最离谱的一次,是某运营商误操作,把/8的默认路由宣告给了所有对等体。结果呢?全网流量都往他家跑,差点把骨干网打瘫。嗯,这就是典型的路由泄露。
核心观点:BGP安全不是单一技术能解决的,需要分层防御。就像你家防盗门,光有锁不够,还得有猫眼、报警器、监控摄像头。
1.2 分层安全模型:洋葱式防御
我个人习惯把BGP安全分成三层:控制平面、数据平面、管理平面。这三层各有各的防守重点,缺一不可。
你看这张图,最外层是管理平面,中间是控制平面,最核心是数据平面。攻击者想搞破坏,得一层层突破。这就是所谓的「纵深防御」。
1.3 控制平面安全:BGP的命门
控制平面安全,说白了就是保护BGP路由信息的真实性。这是整个BGP安全架构的核心。
我建议重点关注这几个方面:
- RPKI(资源公钥基础设施):验证IP前缀的归属权。谁有权宣告这个前缀?RPKI说了算。
- BGPsec:在RPKI基础上,进一步验证AS_PATH的完整性。防止中间人篡改路径。
- 前缀过滤:入方向和出方向都要做。别让不该进来的路由进来,也别让不该出去的路由出去。
- AS_PATH验证:检查AS_PATH是否合理。比如,你的客户不应该宣告属于其他AS的前缀。
避坑指南:我曾经在部署RPKI时犯过一个低级错误——只验证了入方向,没验证出方向。结果呢?自己的合法前缀被别人劫持了,我这边完全没报警。后来才意识到,RPKI验证必须是双向的。
这里给个典型的前缀过滤配置示例:
! 入方向前缀过滤
ip prefix-list CUSTOMER-PREFIXES seq 5 permit 192.0.2.0/24
ip prefix-list CUSTOMER-PREFIXES seq 10 permit 198.51.100.0/24
!
route-map CUSTOMER-IN permit 10
match ip address prefix-list CUSTOMER-PREFIXES
set community 65000:100
!
! 出方向过滤:只宣告自己的前缀
ip prefix-list OUR-PREFIXES seq 5 permit 203.0.113.0/24
!
route-map TO-UPSTREAM permit 10
match ip address prefix-list OUR-PREFIXES
嗯,这里要注意:前缀列表一定要精确匹配。别用ge/le这种模糊匹配,除非你很清楚自己在做什么。
1.4 数据平面安全:流量层面的最后防线
控制平面防不住怎么办?数据平面就是兜底的。虽然BGP是控制平面协议,但数据平面的安全措施能帮你挡住很多「漏网之鱼」。
数据平面安全的核心手段:
| 技术手段 | 作用 | 部署位置 |
|---|---|---|
| uRPF(单播反向路径转发) | 验证源IP地址的真实性 | 边缘路由器入方向 |
| ACL(访问控制列表) | 过滤特定源/目的IP的流量 | 所有边界接口 |
| 流量限速 | 防止DDoS攻击打满链路 | 对等互联接口 |
| BGP Flowspec | 动态下发流量过滤规则 | 核心路由器 |
我记得有一次,某客户被DDoS攻击,攻击流量源IP全是伪造的。控制平面完全没感知,但数据平面的uRPF直接把这些流量挡在了门外。这就是数据平面安全的价值——它不关心路由对不对,只关心流量合不合法。
注意:uRPF有两种模式:严格模式和松散模式。严格模式要求源IP的返回路径必须和入接口一致,这在多宿场景下容易误杀。我建议在边缘用严格模式,在核心用松散模式。
1.5 管理平面安全:别让后门开着
管理平面安全,听起来好像跟BGP没关系?错了。很多BGP攻击,其实是从管理平面入手的。
你想想看,如果攻击者拿到了你的SSH密码,直接登录路由器改配置,那什么RPKI、BGPsec都白搭。所以管理平面安全是基础中的基础。
我个人的管理平面安全清单:
- SSH v2 only:禁用Telnet,禁用SSH v1。这个没得商量。
- AAA认证:用RADIUS或TACACS+做集中认证。别用本地账号,除非是应急。
- 管理接口隔离:管理流量走独立的管理VRF或带外网络。
- 日志审计:所有配置变更都要记录。谁、什么时间、改了啥,一清二楚。
- CoPP(控制平面保护):限制发往CPU的流量,防止控制平面被攻击打瘫。
这里给个CoPP的配置示例:
! 定义ACL匹配BGP流量
access-list 100 permit tcp host 10.0.0.1 host 10.0.0.2 eq bgp
access-list 100 permit tcp host 10.0.0.2 host 10.0.0.1 eq bgp
!
! 定义class-map
class-map match-all BGP-CONTROL
match access-group 100
!
! 定义policy-map
policy-map CONTROL-PLANE-POLICY
class BGP-CONTROL
police 1000000 conform-action transmit exceed-action drop
class class-default
police 500000 conform-action transmit exceed-action drop
!
! 应用到控制平面
control-plane
service-policy input CONTROL-PLANE-POLICY
嗯,这里要注意:CoPP的限速值要根据实际流量来调。我见过有人把BGP的限速设得太低,结果正常的路由更新都被丢了,导致邻居反复震荡。那场面,啧啧...
1.6 三层联动的实战思路
说了这么多,这三层到底怎么配合?我画个实战场景你就明白了。
场景:某ISP收到一个来自客户的路由更新,宣告了192.0.2.0/24。
- 管理平面:先检查这个BGP会话是不是合法的。源IP对不对?TTL是不是255?MD5密码对不对?
- 控制平面:通过RPKI验证这个前缀的归属权。如果ROA不存在或无效,直接拒绝。
- 数据平面:即使前两层都通过了,数据平面仍然要检查流量是否合法。比如,从客户接口进来的流量,源IP必须是客户的前缀范围。
你看,三层联动,层层把关。任何一层发现问题,都能及时阻断。
总结一下:BGP安全架构不是某个单一技术能搞定的。管理平面守住入口,控制平面验证路由,数据平面过滤流量。三层配合,才能构建真正安全的BGP网络。
我个人做了这么多年BGP安全,最大的体会就是:别指望一个银弹能解决所有问题。分层防御,步步为营,这才是正道。
公众号:蓝海资料掘金营,微信deep3321