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

WN722N无线网卡在Python环境中切换监听模式后自动恢复问题

解决WN722N网卡监听模式自动退出并触发OSError的问题

我来帮你搞定这个头疼的问题——WN722N网卡能进入监听模式但几秒就自动切回去,还报OSError: [Errno 100] Network is down,这在Realtek芯片的网卡上是个挺常见的坑,主要是网络管理服务干扰或者驱动兼容性问题。先理清楚你的场景:

你试过两种方式设置监听模式:

  1. 直接调用系统命令:
    import os
    iface = raw_input("Wireless Interface") #wlan1 in my case
    os.system('ip link set %s down' % iface)
    os.system('iwconfig %s mode monitor' % iface)
    os.system('ip link set %s up' % iface)
    
  2. 使用pythonwifi库:
    from pythonwifi.iwlibs import Wireless
    dev = Wireless(iface)
    dev.setMode("Monitor")
    

然后启动Scapy后台线程抓包:

from scapy.all import *
from threading import Thread
def function(pkt):
    if pkt.haslayer(Dot11Beacon):
        <...snipped...>
sniff(iface=<monitor mode interface here>, prn=function)

但5-6秒后就触发错误:

Exception in thread Thread-3:
Traceback (most recent call last):
File "/usr/lib/python2.7/threading.py", line 801, in __bootstrap_inner
self.run()
File "/usr/lib/python2.7/threading.py", line 754, in run
self.__target(*self.__args, **self.__kwargs)
File "python.py", line 113, in depDev
p = sendp(pckt, iface=interface)
File "/usr/lib/python2.7/dist-packages/scapy/sendrecv.py", line 278, in sendp
return __gen_send(conf.L2socket(iface=iface, *args, **kargs), x, inter=inter, loop=loop, count=count,
File "/usr/lib/python2.7/dist-packages/scapy/arch/linux.py", line 434, in init
_flush_fd(self.ins)
File "/usr/lib/python2.7/dist-packages/scapy/arch/linux.py", line 312, in _flush_fd
os.read(fd,MTU)
OSError: [Errno 100] Network is down

核心原因分析

最常见的两个触发点:

  • NetworkManager等网络管理服务自动重置网卡状态:系统会自动检测网卡模式,发现不是管理模式就会强制切回去。
  • 驱动兼容性问题:WN722N的官方rtl8188cus驱动对监听模式支持不够稳定,容易自动恢复。

分步解决方案

1. 先禁用网络管理服务的干扰

临时测试的话,直接停止NetworkManager:

sudo systemctl stop NetworkManager

然后再运行你的Python代码设置监听模式,看看还会不会自动退出。如果问题解决了,说明就是它在搞鬼,可以选择:

  • 永久禁用NetworkManager(适合专门做无线测试的机器):sudo systemctl disable NetworkManager
  • 让NetworkManager忽略你的无线网卡:
    编辑/etc/NetworkManager/NetworkManager.conf,在[main]段添加:
    unmanaged-devices=interface-name:wlan1
    
    替换成你的网卡名,然后重启服务:sudo systemctl restart NetworkManager

2. 用更可靠的命令设置监听模式

放弃iwconfig,改用更现代的iw命令,同时先杀掉所有可能占用网卡的进程:

# 杀掉dhclient、wpa_supplicant等干扰进程
sudo airmon-ng check kill
# 设置监听模式
sudo ip link set wlan1 down
sudo iw dev wlan1 set type monitor
sudo ip link set wlan1 up

在Python里可以用subprocess替代os.system,这样能捕获命令执行结果,方便排查:

import subprocess
iface = raw_input("Wireless Interface: ")

# 杀掉干扰进程
subprocess.call(["sudo", "airmon-ng", "check", "kill"])
# 设置网卡为down
subprocess.call(["sudo", "ip", "link", "set", iface, "down"])
# 设置监听模式
subprocess.call(["sudo", "iw", "dev", iface, "set", "type", "monitor"])
# 启动网卡
subprocess.call(["sudo", "ip", "link", "set", iface, "up"])

3. 替换为更稳定的驱动

WN722N v1版本的官方驱动rtl8188cus对监听模式支持很差,换成aircrack-ng维护的驱动会好很多:

# 卸载官方驱动
sudo apt remove rtl8188cus-dkms
# 安装aircrack-ng的优化驱动
sudo apt install aircrack-ng

安装完成后重启机器,再测试监听模式。

4. 代码层面增加状态检查

在启动Scapy线程前,先确认网卡确实处于监听模式,避免白忙活:

import subprocess
import time

def check_monitor_mode(iface):
    try:
        output = subprocess.check_output(["iw", iface, "info"]).decode("utf-8")
        return "type monitor" in output
    except subprocess.CalledProcessError:
        return False

# 设置完模式后等待1秒,让系统稳定
time.sleep(1)
if not check_monitor_mode(iface):
    print("Error: Failed to set monitor mode on %s" % iface)
    exit(1)

# 再启动抓包线程
Thread(target=lambda: sniff(iface=iface, prn=function)).start()

另外,在sendp的时候可以加个异常捕获,避免线程直接崩溃:

def depDev(pckt, interface):
    try:
        p = sendp(pckt, iface=interface)
    except OSError as e:
        print("Send failed: %s, checking interface status..." % e)
        # 这里可以尝试重新设置监听模式
        # reset_monitor_mode(interface)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:00:00