smurf攻击原理

 人参与 | 时间:2026-10-17 07:06:49

1999年2月,击原一个叫TFreak的击原人在邮件列表里贴了一段代码。那段代码干的击原事很简单:伪造一个源IP地址,向一个广播地址发一个ICMP echo请求。击原结果呢?击原目标网络里几百台机器同时回复,全部涌向那个被伪造的击原受害者IP。受害者的击原带宽瞬间被垃圾包塞满,直接掉线。击原这就是击原smurf攻击的雏形,名字来自当时流行的击原蓝精灵卡通——一群小蓝人合力揍一个倒霉蛋,挺形象的击原。

原理本身不复杂,击原但设计思路很阴。击原它利用了两个东西:IP协议对源地址的击原不验证,以及网络广播机制。击原攻击者伪造受害者的IP作为源地址,然后向一个允许定向广播的网络发送ICMP请求。那个网络里的所有主机收到广播后,都会老老实实向“源地址”回一个echo reply。一台机器发一个包,换来几百个包砸向受害者。放大倍数取决于广播域里有多少台活着的机器。

我翻过一些老的安全报告,90年代末到2000年初,smurf是最常见的DDoS手段之一。当时很多企业网络没有关闭定向广播,路由器也默认转发广播包。攻击者甚至不需要多好的带宽,一个拨号连接就能搞瘫一条T1线路。放大倍数轻松上50倍,有些配置差的网络能到200倍。这买卖太划算了。

具体怎么操作?假设攻击者想打10.10.10.10这个IP。他找一个广播地址,比如192.168.1.255,然后构造一个ICMP echo请求包,源IP写成10.10.10.10,目的IP写成192.168.1.255。把这个包发出去。192.168.1.0/24这个网段里如果有100台机器,每台都会向10.10.10.10回一个reply。攻击者只发了一个包,受害者收到100个。如果攻击者每秒发1000个这样的包,受害者每秒收到100000个。链路直接堵死。

这里有个细节容易被忽略。ICMP echo请求的载荷可以很大。攻击者可以把包做到接近MTU上限,比如1500字节。这样一来,不仅数量被放大,单个包的大小也拉满了。受害者不仅要处理海量请求,还要处理大包。CPU和带宽双重压力。

防御手段其实早就有了。在边界路由器上禁用定向广播,这是最直接的一招。Cisco设备上有个命令叫no ip directed-broadcast,默认在较新的IOS版本里就是关闭的。另外,在网络入口做源地址过滤,丢弃源IP不属于该网段的包。RFC 2827就是干这个的。还有,把ICMP echo请求的速率限制一下,别让内网机器随便回。但这些措施在2000年左右普及得很慢,很多网络管理员根本不知道自己的网络被当成放大器用了。

我观察到一个现象:smurf攻击现在几乎绝迹了。不是因为防御变好了,而是因为攻击者找到了更高效的手段。DNS放大、NTP放大、memcached放大,放大倍数动辄上千甚至上万。smurf那50倍的放大率,在今天的DDoS军火库里连入门都算不上。但它作为经典案例,仍然值得讲。它揭示了一个核心问题:任何允许伪造源地址的协议,都可能变成攻击工具。这个逻辑到今天都没变。

有个案例我印象很深。2002年,某家小ISP的整个/16网段被smurf打瘫了将近六个小时。攻击者只用了三个广播地址,每个地址后面挂着几百台机器。ISP的工程师一开始以为是内部故障,查了半天才发现是ICMP风暴。后来他们在上游路由器上加了过滤规则,问题才解决。那会儿没有云清洗,没有CDN分流,硬扛。扛不住就断网。

写到这里,我想说一个自己的判断。smurf攻击的消亡,不是因为互联网变安全了,而是因为攻击面转移了。广播机制在现代网络里被限制得越来越死,但反射放大这个思路被继承下来,换了个马甲继续横行。理解smurf,其实是理解反射放大攻击的底层逻辑。IP协议设计之初信任了太多东西,这个信任被滥用了几十年,到现在也没完全修好。

顶: 585踩: 23