Scapy发送原始以太网帧无法在Wireshark显示问题求助
问题分析与解决办法
你遇到的这种情况,主要有几个常见原因,对应解决办法如下:
1. 构造的以太网帧不符合规范,被网卡/内核丢弃
你当前只构造了一个包含目标MAC的空Ether帧,没有以太网类型字段(比如IPv4的0x0800、ARP的0x0806),也没有任何负载数据。很多网卡驱动或内核网络栈会直接丢弃这种不符合规范的“空帧”,哪怕Scapy显示发送成功。
解决办法:给帧添加协议类型或负载,比如:
from scapy.all import * # 加上IPv4协议类型和测试负载 g = Ether(dst=get_if_hwaddr("enp0s31f6"), type=0x0800) / IP(dst="127.0.0.1") / "test frame" sendp(g, iface="enp0s31f6")
哪怕只加个类型字段,也能让网卡认为这是合法帧:
g = Ether(dst=get_if_hwaddr("enp0s31f6"), type=0x0806) # ARP类型 sendp(g, iface="enp0s31f6")
2. 目标MAC是自身接口MAC,被环回过滤拦截
当你把帧发往自身接口的MAC时,部分网卡的环回过滤机制会直接在内核层面处理这个帧,不会把它放到抓包工具能捕获的链路中,所以Wireshark/tcpdump看不到。
解决办法:换一个目标MAC测试,比如同网段其他设备的MAC,或者广播MAC:
g = Ether(dst="ff:ff:ff:ff:ff:ff", type=0x0800) / IP(dst="192.168.1.255") / "broadcast test" sendp(g, iface="enp0s31f6")
3. 网卡优化功能干扰帧的发送或捕获
部分网卡的硬件卸载功能(如TCP分段卸载TSO、校验和卸载)可能会干扰原始二层帧的发送,或者抓包工具无法捕获被硬件修改后的帧。
解决办法:
- 临时关闭网卡的相关优化:
sudo ethtool -K enp0s31f6 tso off tx-checksum-ip-generic off - 将网卡设置为混杂模式,确保能捕获所有帧:
sudo ip link set enp0s31f6 promisc on
4. 抓包工具的配置问题
确保抓包时指定了正确的接口,并且用root权限运行(否则可能捕获不到原始帧):
# tcpdump指定接口并显示二层信息 sudo tcpdump -i enp0s31f6 -e -vvv
内容的提问来源于stack exchange,提问作者stochasticlover1
相关产品推荐
相关产品推荐

