arp-scan无法检测混杂模式节点,因其仅发送标准ARP请求并依赖正常协议栈响应;检测需用自定义MAC的畸形ARP包(如ff:ff:ff:ff:ff:fe)并观察异常应答,推荐scapy实现。

arp-scan 本身不支持直接检测混杂模式节点
arp-scan 是纯 ARP 主机发现工具,它只发标准 ARP Request 并收 ARP Reply,所有响应都来自目标系统的协议栈正常行为。而混杂模式(promiscuous mode)是否启用,**不会影响设备对合法单播或广播 ARP 请求的应答逻辑**——只要 IP 和 MAC 匹配,内核就会回;不匹配,网卡硬件就丢弃,根本到不了内核。所以用 arp-scan 扫出来的活跃主机列表,和有没有嗅探器完全无关。
检测混杂模式得靠非标准 ARP 请求+观察异常响应
原理是:普通网卡在非混杂模式下,会按目的 MAC 地址做硬件过滤;而混杂模式下,网卡把“本不该收”的包也交给了内核,某些操作系统(如 Windows)内核会对特定畸形广播 MAC 地址(比如 ff:ff:ff:ff:ff:fe)误判为广播并触发 ARP 应答。Linux 内核一般不这么干,但部分旧版本或定制驱动可能有类似行为。
实操上你要做的是:
- 用
arping发送自定义目的 MAC 的 ARP 探测包,例如:sudo arping -c 1 -I eth0 -s 192.168.1.100 -t ff:ff:ff:ff:ff:fe 192.168.1.50 - 观察
192.168.1.50是否回应——如果它回应了,且你确认它没配置成该 MAC 地址,那它很可能处于混杂模式(或内核有缺陷) - 注意:这个方法在现代 Linux 上成功率极低,Windows 7/10 更容易触发,但 Win11 已修复
- 别指望
arp-scan做这事——它不支持指定任意目的 MAC,也没提供响应行为分析能力
更现实的替代方案:用 scapy 构造探测包
如果你真需要验证某台机器是否混杂,scapy 是更可控的选择:
from scapy.all import *
ans, unans = srp(Ether(dst="ff:ff:ff:ff:ff:fe")/ARP(pdst="192.168.1.50"), timeout=2, iface="eth0")
for s,r in ans:
if r.haslayer(ARP) and r[ARP].op == 2:
print("Host responded to malformed broadcast MAC → likely promiscuous")
关键点:
-
dst="ff:ff:ff:ff:ff:fe"是经典探测 MAC,绕过硬件过滤但被部分系统内核当作广播处理 - 必须用
srp()(二层发送),不能用sr()(三层) - 结果要检查
r[ARP].op == 2(即 ARP Reply),不是看有没有收到包 - 云环境、容器网络、启用了 ebpf 过滤的系统基本无效——它们连包都进不了协议栈
真正该关注的其实是网络层异常行为
比起徒劳地扫混杂模式,实际运维中更可靠的是监控:
- 交换机端口流量突增(尤其无对应上层协议交互时)
- 同一 MAC 地址在多个 VLAN 或子网频繁出现(
arp -a+ 定期比对) - 大量
arping -D(重复地址检测)失败日志,暗示有人在伪造 ARP - 用
tcpdump -i eth0 'arp and (ether dst ff:ff:ff:ff:ff:ff)' -c 100看广播 ARP 流量是否异常密集
混杂模式只是嗅探的必要条件,不是充分条件;而现代防御体系早就不依赖“能不能检测混杂”来判断风险了。与其花时间调参发畸形包,不如加固交换机端口安全、启用 DHCP Snooping 和 ARP Inspection。











