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

Mac系统混杂模式底层原理及代码设置方法技术问询

Mac 下混杂模式的底层实现原理
  • 默认网卡过滤逻辑:正常状态下,Mac 的网卡(以太网/Wi-Fi)只会接收三类数据包:目标 MAC 地址匹配自身的单播包、广播包,以及自身已订阅的多播包。其余数据包会被网卡硬件直接丢弃,避免不必要的内核资源消耗。
  • 混杂模式的硬件层面触发:开启混杂模式时,系统会向网卡驱动发送指令,让网卡关闭硬件过滤机制,将所有经过该网卡的数据包(无论目标地址是否匹配)全部转发给内核网络栈。
  • 内核与上层应用的交互:内核通过 BSD Packet Filter (BPF) 机制接收网卡传来的全量数据包,再通过 libpcap 这类库将数据包传递给上层抓包应用(比如 Wireshark)。注意:Wi-Fi 网卡有额外限制——普通混杂模式下仍会受 802.11 无线帧过滤规则约束,若要捕获所有无线帧,需先将网卡切换为监控模式(monitor mode)。
代码设置 Mac 的混杂模式

方式一:基于 libpcap 的 C 语言实现

libpcap 是 Wireshark 依赖的底层抓包库,跨平台且直接对接系统网络栈,代码示例如下:

#include <pcap.h>
#include <stdio.h>

int main() {
    char errbuf[PCAP_ERRBUF_SIZE];
    pcap_t *handle;
    // 替换为你的网卡名称,可通过 `ifconfig` 查看(比如 en0、en1)
    const char *dev = "en0";

    // 打开网卡并开启混杂模式:第三个参数为 1 表示开启,0 关闭
    handle = pcap_open_live(dev, BUFSIZ, 1, 1000, errbuf);
    if (!handle) {
        fprintf(stderr, "网卡打开失败: %s\n", errbuf);
        return 1;
    }

    printf("已为网卡 %s 开启混杂模式\n", dev);

    // 此处可添加抓包逻辑,比如调用 pcap_loop 处理数据包
    // ...

    pcap_close(handle);
    return 0;
}

编译与运行:

gcc -o set_promisc set_promisc.c -lpcap
sudo ./set_promisc  # 必须用 root 权限执行

方式二:Python + Scapy 实现

Scapy 封装了底层网络操作,代码更简洁易读:

from scapy.all import IFACES

# 替换为你的网卡名称
dev_name = "en0"
# 获取对应网卡接口对象
iface = IFACES.dev_from_name(dev_name)
# 开启混杂模式
iface.promisc = True

print(f"网卡 {dev_name} 混杂模式已开启")

运行要求:需安装 Scapy(pip install scapy),且必须以 root 权限执行(比如 sudo python3 set_promisc.py)。

方式三:命令行脚本调用(非编程实现)

如果只是在脚本中快速切换,可直接调用 Mac 系统命令:

# 开启混杂模式
sudo ifconfig en0 promisc
# 关闭混杂模式
sudo ifconfig en0 -promisc

内容的提问来源于stack exchange,提问作者2239559319

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 07:22:26