3、攻击场景模拟:使用GNS3搭建BGP攻击实验环境,模拟路由劫持攻击

说实话,BGP劫持攻击听起来挺吓人的,但真要理解它,最好的办法就是亲手搭个环境,自己打一遍。我当年刚接触BGP安全时,看了无数理论文档,结果一到实际排障还是懵。后来我干脆在GNS3里搭了个小型互联网环境,自己扮演攻击者,才真正搞懂了路由劫持的来龙去脉。

这一节,我就带你走一遍完整的实验搭建过程。你跟着做,半小时内就能跑起来。

3.1 实验拓扑设计

我们先明确一下要模拟什么场景。说白了,就是三个角色:

  • 受害者AS:拥有一个合法的IP前缀,比如203.0.113.0/24
  • 攻击者AS:恶意宣告同样的前缀,试图劫持流量
  • 观察者AS:相当于互联网上的一个普通ISP,用来验证劫持是否成功

我个人习惯用三台路由器加一台PC来模拟。拓扑很简单,但足够说明问题。

核心逻辑:攻击者通过伪造AS_PATH或直接宣告更优前缀,让观察者AS误以为到达受害者网络的最短路径经过了攻击者。

下面是我画的拓扑图,你一看就明白:

BGP路由劫持实验拓扑 受害者 AS 100 203.0.113.0/24 R1 (10.0.1.1) 攻击者 AS 200 伪造 203.0.113.0/24 R2 (10.0.2.1) 观察者 AS 300 R3 (10.0.3.1) 验证劫持效果 eBGP 正常 eBGP 恶意宣告 攻击路径:R2 伪造前缀 → R3 选择更优路径 → 流量被劫持

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等属性,看看选路结果怎么变。动手才是最好的学习方式。


专注资料整理