nmcli 不支持直接为虚拟接口开启混杂模式,需先用 nmcli connection up 激活对应连接,再通过 ip link set dev vlan10 promisc on 手动启用,并用 systemd 服务持久化。

确认虚拟接口归属的 NetworkManager 连接
虚拟接口通常由真实网卡派生(如 VLAN、别名、绑定),需先查清它关联的是哪个 NM 连接:
- 运行 nmcli connection show 列出所有连接
- 对疑似连接(如 "Wired connection 1" 或 "vlan10")执行:
nmcli connection show "vlan10" | grep -E 'interface-name|master|slave' - 若输出中
interface-name: vlan10明确存在,说明该连接直接控制该虚拟接口
用 nmcli 启用连接并确保接口已就绪
混杂模式依赖接口处于 UP 状态。先确保连接已激活:
- 启用连接:nmcli connection up "vlan10"
- 验证接口是否已创建且 UP:ip link show vlan10(应看到
state UP) - 若提示
No such device,说明虚拟接口未被正确创建——检查 VLAN 配置是否完整(如是否设置了 parent、id、协议等)
手动为虚拟接口启用混杂模式(临时生效)
NetworkManager 不提供 ethernet.promiscuous 对虚拟接口的支持(仅对物理以太网连接有效),所以必须绕过 NM 直接操作内核接口:
- 启用:sudo ip link set dev vlan10 promisc on
- 验证:ip link show vlan10 | grep -i promisc → 输出含
promiscuity 1即成功 - 关闭(需要时):sudo ip link set dev vlan10 promisc off
实现开机/重启后自动启用混杂模式
因上述命令重启即失效,需持久化。推荐两种可靠方式:
-
方案一:添加 systemd 服务(推荐)
创建/etc/systemd/system/vlan10-promisc.service:[Unit]<br>After=network-online.target<br>Wants=network-online.target<br><br>[Service]<br>Type=oneshot<br>ExecStart=/usr/bin/ip link set dev vlan10 promisc on<br>RemainAfterExit=yes<br><br>[Install]<br>WantedBy=multi-user.target
然后执行:
sudo systemctl daemon-reload && sudo systemctl enable --now vlan10-promisc.service -
方案二:通过 ifup-post 类钩子(适用于传统 ifconfig 风格系统)
在/etc/network/if-up.d/下新建可执行脚本,判断 $IFACE == "vlan10" 后执行ip link set dev $IFACE promisc on
配合流量审计工具验证效果
启用混杂模式后,用标准抓包工具确认能否捕获非本机流量:
- 运行:sudo tcpdump -i vlan10 -c 5 -n
- 若能捕获到目标 MAC 不是
vlan10自身地址的帧(例如其他主机的 ARP、ICMP),说明混杂模式已生效 - 注意:若使用 Wireshark,需确保其监听的是
vlan10接口,而非any或物理父接口











