You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Python嗅探发送至离线主机的ICMP请求?

如何使用Python嗅探发送至离线主机的ICMP请求?

我完全懂你现在的困扰——用Scapy抓ICMP包时,只能抓到有回复的echo-reply,发往离线主机的echo-request根本看不到,这对ping扫检测这类渗透测试场景来说太影响效率了。我来帮你解决这个问题。

问题根源

出现这个情况主要有两个核心原因:

  1. 网卡默认处于非混杂模式:普通模式下,网卡只会接收目标MAC地址指向自己的数据包,发往其他主机(哪怕离线)的包不会被转发到你的网卡(除非是广播泛洪场景,但大部分情况不会)。
  2. Scapy默认只监听接收方向的数据包:如果你是自己ping离线主机,你发出去的echo-request属于发送路径的流量,默认不会被Sniff捕获。

解决方案

只需要修改你的Scapy脚本,加上几个关键参数就能解决问题:

修改后的代码:

#!/usr/bin/python3
from scapy.all import *

def print_pkt(pkt):
    print(pkt.summary())

# 关键修改:开启混杂模式+监听双向流量
pkts = sniff(
    iface='你的网卡名称',  # 替换成实际的网卡名,比如eth0/ens33/wlan0
    filter='icmp',
    prn=print_pkt,
    promisc=True,  # 开启混杂模式,接收所有经过网卡的数据包
    direction="both"  # 同时监听发送和接收方向的流量
)

参数解释

  • promisc=True:强制网卡进入混杂模式,这样它会接收所有经过该网卡的数据包,而不仅仅是发给自己的。这个操作需要管理员权限,所以必须用sudo运行脚本。
  • direction="both":默认Scapy只会捕获网卡接收的数据包,设置这个参数后会同时抓取发送出去的流量,这样你自己ping离线主机时,就能看到发出去的echo-request了。
  • 关于网卡名称:可以用ip link show或ifconfig命令查看你的真实网卡名称,别填错了。

进阶优化(可选)

如果只想专注捕获ICMP echo请求(而不是所有ICMP包),可以把过滤规则改得更精确:

filter='icmp[icmptype] == icmp-echo'

这样输出只会显示echo-request包,避免echo-reply干扰你的检测。

验证方法

运行修改后的脚本(记得加sudo),然后在另一个终端执行ping 192.168.15.201,这时候你应该能看到类似这样的输出:

Ether / IP / ICMP 192.168.15.195 > 192.168.15.201 echo-request 0 / Raw

备注:内容来源于stack exchange,提问作者John Adams

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.14 16:38:01