Ubuntu下libpcap调用pcap_set_rfmon返回成功却无法开启监听模式
问题原因
你遇到的返回值矛盾本质是libpcap的接口设计逻辑导致的:
pcap_set_rfmon()在handle未激活阶段返回0,仅代表libpcap已将「启用监听模式」的配置项写入handle的待生效参数列表,不代表该配置与硬件能力兼容、也不代表配置已实际下发到网卡。所有pcap_set_*前缀的参数设置接口,在pcap_activate()调用前都只做参数合法性校验,不会和内核/驱动交互验证硬件能力,所以你拿到的0只是参数记录成功的返回,不是真的设置成功。pcap_can_set_rfmon()、pcap_activate()才会真正发起内核交互,查询硬件支持能力、执行模式切换操作,这两个接口的返回才反映真实的硬件状态和操作结果。
而你确认支持监听模式的网卡触发这两个接口报错,常见原因有两个:
- 权限不足:设置网卡监听模式需要root权限,你运行自己的编译产物时没有加
sudo,libpcap没有足够权限查询网卡真实能力、也没法修改网卡工作模式,就会返回「不支持监听模式」的错误。你之前用aircrack-ng时肯定是用root权限运行,所以可以成功。 - 网卡被系统网络服务占用:Ubuntu默认的NetworkManager服务会管控无线网卡的工作模式,当网卡处于被托管状态时,第三方程序(包括你的libpcap程序)没有权限修改网卡模式,就会触发不支持监听的报错。你用aircrack-ng前一般会主动停止NetworkManager或者把网卡移出托管列表,所以不会触发这个问题。
解决方法
- 运行程序时必须加上root权限:
sudo ./tsniff 你的网卡名 - 运行程序前先临时停止NetworkManager服务,避免网卡被占用:
sudo systemctl stop NetworkManager,执行完嗅探后可以再sudo systemctl start NetworkManager恢复网络管理 - 代码逻辑修正:
pcap_set_*类接口只能在pcap_activate()调用前执行,你现有代码中pcap_activate()失败后再调用pcap_set_rfmon()是无效操作,正确的逻辑应该是先销毁当前handle,重新创建新的handle,不设置监听模式再执行激活。 - 备选兼容方案:如果不想在代码里处理模式切换逻辑,可以提前用系统命令把网卡切换到监听模式:
sudo iw dev 你的网卡名 set type monitor,再启动嗅探程序时不需要再调用pcap_set_rfmon(),可以直接抓802.11原始帧。
内容的提问来源于stack exchange,提问作者Zane Phillips
相关产品推荐
相关产品推荐

