WN722N无线网卡在Python环境中切换监听模式后自动恢复问题
我来帮你搞定这个头疼的问题——WN722N网卡能进入监听模式但几秒就自动切回去,还报OSError: [Errno 100] Network is down,这在Realtek芯片的网卡上是个挺常见的坑,主要是网络管理服务干扰或者驱动兼容性问题。先理清楚你的场景:
你试过两种方式设置监听模式:
- 直接调用系统命令:
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) - 使用
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:wlan1sudo 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

