3、攻击场景模拟:使用GNS3搭建BGP攻击实验环境,模拟路由劫持攻击
说实话,BGP劫持攻击听起来挺吓人的,但真要理解它,最好的办法就是亲手搭个环境,自己打一遍。我当年刚接触BGP安全时,看了无数理论文档,结果一到实际排障还是懵。后来我干脆在GNS3里搭了个小型互联网环境,自己扮演攻击者,才真正搞懂了路由劫持的来龙去脉。
这一节,我就带你走一遍完整的实验搭建过程。你跟着做,半小时内就能跑起来。
3.1 实验拓扑设计
我们先明确一下要模拟什么场景。说白了,就是三个角色:
- 受害者AS:拥有一个合法的IP前缀,比如203.0.113.0/24
- 攻击者AS:恶意宣告同样的前缀,试图劫持流量
- 观察者AS:相当于互联网上的一个普通ISP,用来验证劫持是否成功
我个人习惯用三台路由器加一台PC来模拟。拓扑很简单,但足够说明问题。
核心逻辑:攻击者通过伪造AS_PATH或直接宣告更优前缀,让观察者AS误以为到达受害者网络的最短路径经过了攻击者。
下面是我画的拓扑图,你一看就明白:
3.2 设备选型与配置要点
GNS3里我推荐用思科IOS镜像,比如c7200-adventerprisek9-mz.152-4.M7。为什么?因为它的BGP特性支持得比较全,而且我踩过坑——用某些轻量级镜像,结果不支持as-override,折腾了半天。
你需要准备三台路由器:
| 设备 | 角色 | AS号 | 环回口 |
|---|---|---|---|
| R1 | 受害者 | 100 | 203.0.113.1/24 |
| R2 | 攻击者 | 200 | 198.51.100.1/24 |
| R3 | 观察者 | 300 | 192.0.2.1/24 |
小技巧:环回口地址最好用文档中保留的测试地址段,避免和真实环境冲突。这是RFC 5737规定的,你记一下。
3.3 正常BGP配置(劫持前)
我们先让R1和R3建立正常的eBGP邻居关系。R2暂时不参与。
R1配置:
interface Loopback0
ip address 203.0.113.1 255.255.255.0
!
interface GigabitEthernet0/0
ip address 10.0.1.1 255.255.255.0
!
router bgp 100
neighbor 10.0.3.1 remote-as 300
network 203.0.113.0 mask 255.255.255.0
R3配置:
interface GigabitEthernet0/0
ip address 10.0.3.1 255.255.255.0
!
router bgp 300
neighbor 10.0.1.1 remote-as 100
配置完后,在R3上检查一下:
R3# show ip bgp
BGP table version is 1, local router ID is 192.0.2.1
Network Next Hop Metric LocPrf Weight Path
*> 203.0.113.0/24 10.0.1.1 0 0 100 i
嗯,一切正常。R3看到203.0.113.0/24的下一跳是10.0.1.1,路径是AS 100。
3.4 模拟路由劫持攻击
现在让攻击者R2登场。它要做的就是向R3宣告同样的前缀,但用更优的路径属性来吸引流量。
R2配置(攻击者):
interface Loopback0
ip address 198.51.100.1 255.255.255.0
!
interface GigabitEthernet0/0
ip address 10.0.2.1 255.255.255.0
!
router bgp 200
neighbor 10.0.3.1 remote-as 300
network 203.0.113.0 mask 255.255.255.0
注意:R2宣告的203.0.113.0/24并不是它自己的接口地址。这就是典型的“前缀劫持”——你宣告了一个不属于你的IP段。
配置完成后,我们再看看R3的BGP表:
R3# show ip bgp
BGP table version is 2, local router ID is 192.0.2.1
Network Next Hop Metric LocPrf Weight Path
*> 203.0.113.0/24 10.0.2.1 0 0 200 i
* 10.0.1.1 0 0 100 i
看到了吗?R3现在选择了路径AS 200,下一跳变成了10.0.2.1。为什么会这样?
因为两条路径的AS_PATH长度都是1,但R2的更新可能更晚到达,或者在某些情况下R3的选路策略倾向于最新的更新。实际上,如果两条路径完全等价,BGP会按照收到顺序或路由器ID来选。但攻击者可以进一步优化——比如伪造更短的AS_PATH。
我曾经在客户现场遇到过类似的情况。那是一家跨国企业的分支,突然发现访问总部的流量绕到了另一个国家。排查了半天,发现是上游ISP错误地宣告了更具体的子网。嗯,那次之后,我就养成了在边界路由器上做前缀列表过滤的习惯。
3.5 验证劫持效果
从R3 traceroute到203.0.113.1:
R3# traceroute 203.0.113.1
Type escape sequence to abort.
Tracing the route to 203.0.113.1
1 10.0.2.1 4 msec 4 msec 4 msec
2 * * *
流量到了R2就断了。因为R2虽然宣告了这个前缀,但它并没有真正的路由把流量送到203.0.113.0/24。这就是典型的“黑洞劫持”——流量被吸走,然后消失。
更恶毒的做法是:R2配置一条去往R1的隧道,把流量转发过去,同时窃听或篡改数据。这叫“中间人劫持”。我在实验中也模拟过,但这里就不展开了,你感兴趣可以自己试试。
3.6 避坑指南
做这个实验时,有几个坑我帮你提前踩了:
- GNS3桥接问题:如果你用Cloud节点连接物理网络,记得关闭Windows防火墙,否则BGP报文会被拦截。我当初卡了整整一下午。
- AS号重复:确保三台路由器的AS号不同,否则eBGP邻居起不来。
- 更新源地址:建立eBGP邻居时,默认使用出接口地址。如果你用环回口建立邻居,记得配
update-source Loopback0。 - 路由振荡:攻击者反复撤销和宣告前缀,会导致BGP路由振荡。这在真实网络中会造成严重的性能问题。
核心要点:路由劫持的本质是“信任滥用”。BGP本身没有验证前缀归属的机制,所以任何AS都可以宣告任何前缀。这也是为什么RPKI(资源公钥基础设施)被提出来解决这个问题。
好了,实验环境已经跑起来了。你可以在GNS3里自己动手试试,调整MED、Local Preference等属性,看看选路结果怎么变。动手才是最好的学习方式。