必须将网卡设为混杂模式才能接收所有以太网帧;先用ip -br link确认真实网卡名(如enp0s3),再以root执行ip link set enp0s3 promisc on;验证需检查promiscuity值为1及flags中bit 8置位;抓包后务必执行ip link set enp0s3 promisc off关闭。

要在Linux中让网卡接收所有经过它的以太网帧(包括目的MAC不是本机的流量),必须将接口设为Promisc混杂侦听模式,这是tcpdump、Wireshark等抓包工具正常工作的底层前提,不启用该模式就只能看到发给本机或广播/多播的数据。
确认目标网卡名称
先运行 ip -br link,从输出中排除 lo(回环口)和明显是虚拟设备(如 docker0、veth*)的条目,找到你实际要监听的物理或桥接网卡名,例如 enp0s3、eth0 或 ens33。
这一步不能跳过——对错网卡执行混杂设置不仅无效,还可能干扰生产服务。若系统有多个活动接口,【务必用 ip -br link 确认真实名称,不要凭记忆或旧文档写 eth0】。
临时启用混杂模式
方法一:使用 ip link(推荐,新旧系统通用)
以 root 权限执行:ip link set enp0s3 promisc on,把 enp0s3 替换为你上一步确认的网卡名。
方法二:使用 ifconfig(仅限仍保留该命令的系统)
执行:ifconfig enp0s3 promisc。
注意:两种命令都必须用 root 权限,普通用户执行会静默失败或报“Operation not permitted”。如果你用 sudo 执行却没反应,先检查是否已输入密码——sudo 默认有 15 分钟缓存,但首次执行需手动认证。
验证是否真正生效
第一步:检查 promiscuity 字段
运行 ip link show enp0s3 | grep -o 'promiscuity [0-9]\+',输出必须是 promiscuity 1 才算成功。如果输出是 promiscuity 0 或无输出,说明未生效。
第二步:交叉验证 flags(辅助判断)
执行 cat /sys/class/net/enp0s3/flags,得到一个十六进制数(如 0x1003),用命令 printf "%d\n" $((0x1003 & 0x100)) 计算,结果非零(通常是 256)才表示 bit 8 已置位,即混杂模式被内核真正承认。
⚠️ 关键提醒:【ifconfig 输出里有 PROMISC 字样 ≠ 混杂模式已生效】,Ubuntu 22.04+、RHEL 8+ 等系统常不更新该字段,只信 ip link 的 promiscuity 值。
关闭混杂模式
执行:ip link set enp0s3 promisc off。
这一步必须做——混杂模式不会随抓包工具退出而自动关闭,长期开着会增加内核处理负担,并可能被安全审计系统标记为异常行为。


















