ICMP攻击是什么?
ICMP 是 IP 层的差错报告与控制协议,承载差错报文和查询报文,ping 与 traceroute 分别依赖 Echo Request/Reply 和 Time Exceeded 实现连通性测试与路径探测。ICMP 洪泛属于带宽与处理资源耗尽型攻击:攻击者借助僵尸网络或伪造源 IP,向目标高速发送 Echo Request,迫使目标协议栈处理并按策略生成应答,从而消耗入口带宽、软中断 CPU 与包处理能力。由于 ICMP 无认证、无连接状态且源地址可伪造,该手法常被用作反射载体——伪造源地址指向受害者,由第三方主机产生应答流量。值得注意的是,非广播场景下 Echo 反射的流量比约为 1:1,不具备放大能力;具有放大效应的 Smurf 依赖定向广播转发,因 RFC 2644 的默认限制已基本失效。此外,历史上曾出现利用 IP 分片重组长度计算溢出导致缓冲区破坏的 Ping of Death 攻击,该漏洞已于 1996 年前后由各厂商修补,现代协议栈不再受影响。
简单来说
把网络想成一个小区,ICMP 就是楼里的对讲机。
你按一下喊"3 号楼在吗?",对方回一句"在"——这就是 ping。再比如你想知道去某个地方要过几个路口,就一路问过去——这就是 traceroute。
所以 ICMP 本身是个好东西,是网络的问路和报信工具。
ICMP 洪泛攻击:把你家门口喊爆
攻击者做的事,就是找一大群人(被黑的电脑、或者假地址),对着你家门口疯狂喊"在吗在吗在吗"。
结果有两个:
一是你的脑子被占满了,光顾着听这些喊话,正经邻居找你反而没反应(CPU 被打满)。
二是按规矩,每听到一声你就得回一句"在",这些回应把你的出口也堵死了(出口带宽被打满)。如果干脆不理呢?出口确实省了,但门口还是堵着,因为喊话的人还在源源不断地来。
这就是 ICMP 洪泛,本质就是用人海战术把你的门口吵炸。
为什么信封上要写假地址
攻击者通常会在信封上写别人的地址(伪造源 IP),这样你回的那句"在",实际是寄到那个被冒名的人家里去。
所以有时候真正被打的,不是收到喊话的人,而是被冒名的那个人——他没招谁没惹谁,却被一堆回信淹没。这叫反射攻击。
Smurf 是这个套路的升级版:攻击者把喊话寄给"整栋楼的广播喇叭",于是全楼的人都回信给那个倒霉蛋。不过这个方法现在基本不好使了,因为路由器默认不再转发这种"全楼广播"。
顺便说一句常识:普通的 ping 反射是一声喊换一声回,没有放大效果。真正能把 1 变 100 的是 Smurf 那种全楼广播的做法。所以别把 ICMP 洪泛想得和 DNS 放大攻击一样猛。
Ping of Death:一个已经过时的老故事
有些老资料会讲"往对方塞一个超过 64KB 的大包,把系统搞崩溃"。
这个说法要打个补丁:
64KB 不是操作系统定的规矩,是网络协议本身规定的单个包裹上限。
崩溃的原因不是"内存不够",而是当年那些系统在拼装碎包裹时有漏洞——碎块拼起来超过上限,把缓冲区挤爆了。这是程序缺陷,不是资源不足。
最关键的是:这事儿是 1996 年的老毛病,当年几个月内就被各大厂商修好了。 现在的系统根本不吃这一套,别把它当成现在还能用的攻击手段。
还有一招:把东西藏在喊话里
因为保安看到"在吗"这三个字通常都会放行,所以有人会把偷偷要传的东西塞进喊话的包装里,光明正大地传出去。
这叫 ICMP 隧道,用来绕过管理或者偷偷往外送数据。这种方式不炸你家门口,但很隐蔽,靠看"喊话的内容有没有异常"来抓。
怎么防
限速:别让同一个人一直喊,给 ICMP 加个频率限制。
查地址真假:在出口做防伪造检查(专业上叫 BCP 38 / uRPF),从根上减少冒名喊话。这是治本的一招。
关掉全楼广播回信:防止自己被当成 Smurf 的帮凶。
流量太大就找上游帮忙:超过自己线路能力的时候,本地怎么调都没用,得靠运营商或云端清洗。
最后一个重要提醒
千万别为了安全就把 ICMP 全封了。
这相当于把整栋楼的对讲机全砸了。网络有个重要功能叫"先问问对方能接多大的包裹"(PMTUD),全靠 ICMP。封掉之后会出现一个非常气人的现象:小文件能下载,大文件卡死,而且特别难查原因。
正确做法是:该放行的放行,但限制频率;废弃的类型直接拒绝。