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

Ubuntu 20.04LTS下用Scapy向自身网口发送以太网包的问题

Ubuntu 20.04下Scapy发送原始以太网包无法被Wireshark/tcpdump捕获的解决方法

问题场景

处理原始以太网数据,无需IP或更高层协议,目标是从以太网接口enp0s31f6向自身发送以太网包,并能在Wireshark或tcpdump中捕获查看,系统为Ubuntu 20.04LTS。

已尝试操作及现象

  1. 发送仅含以太网层的包
    代码:
from scapy.all import *

g = Ether(dst=get_if_hwaddr("enp0s31f6"))
sendp(g, iface="enp0s31f6")

输出:

.
Sent 1 packets.

但Wireshark中未捕获到该网口的数据包。

  1. 尝试发送含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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 20:15:10