Ubuntu 20.04LTS下用Scapy向自身网口发送以太网包的问题
Ubuntu 20.04下Scapy发送原始以太网包无法被Wireshark/tcpdump捕获的解决方法
问题场景
处理原始以太网数据,无需IP或更高层协议,目标是从以太网接口enp0s31f6向自身发送以太网包,并能在Wireshark或tcpdump中捕获查看,系统为Ubuntu 20.04LTS。
已尝试操作及现象
- 发送仅含以太网层的包
代码:
from scapy.all import * g = Ether(dst=get_if_hwaddr("enp0s31f6")) sendp(g, iface="enp0s31f6")
输出:
. Sent 1 packets.
但Wireshark中未捕获到该网口的数据包。
- 尝试发送含IP层的空包(存在语法错误)
代码:
g = Ether()/IP(dst="127.0.0. sendp(g, iface="enp0s31f6")
Scapy提示已发送数据包,但同样无法被Wireshark或tcpdump捕获。
解决方案
1. 检查捕获工具的过滤规则
确保Wireshark/tcpdump未设置过滤规则过滤目标MAC地址的包。可直接执行tcpdump -i enp0s31f6捕获该网口所有数据包,排除过滤规则干扰。
2. 修复代码语法错误
第二个代码片段中IP(dst="127.0.0.缺少闭合引号和完整IP地址,正确写法:
from scapy.all import * g = Ether()/IP(dst="127.0.0.1") sendp(g, iface="enp0s31f6")
3. 启用网卡混杂模式
Ubuntu默认网卡可能限制捕获发往自身的包,执行以下命令开启混杂模式:
sudo ip link set enp0s31f6 promisc on
开启后重新发送数据包,再用捕获工具尝试抓取。
4. 用Scapy自带功能验证数据包是否发出
通过Scapy的sniff函数在发送时同步捕获,确认包是否真的发出:
from scapy.all import * def packet_callback(packet): print(packet.summary()) # 开启5秒捕获线程 sniff(iface="enp0s31f6", prn=packet_callback, store=0, timeout=5) # 发送以太网包 g = Ether(dst=get_if_hwaddr("enp0s31f6")) sendp(g, iface="enp0s31f6")
如果能打印出包的摘要,说明数据包已发出,问题出在Wireshark/tcpdump的配置上。
5. 尝试发送广播包验证
部分系统会将发往自身MAC的包在网络栈内部处理,不经过物理网卡。可尝试发送广播地址的包测试:
from scapy.all import * g = Ether(dst="ff:ff:ff:ff:ff:ff") sendp(g, iface="enp0s31f6")
内容的提问来源于stack exchange,提问作者stochasticlover1
相关产品推荐
相关产品推荐

