TearSnow Fan


OpenWrt自动剔除弱信号WiFi客户端

最近疫情赋闲在家,扯了根网线增加了一个无线路由器刷OpenWrt当(胖)AP来改善信号,还设置了801.11r无缝漫游。

但实际使用中有个问题,就是移动客户端往往已经移动到了已连接的AP信号很差的位置,也不会主动断开远的AP去连接更近、信号更好的AP。所以需要AP主动剔除客户端。

实际上,在AC+AP架构的无线漫游网络中,基本都是带有上述功能的。

考虑到家用的话也就两三个无线路由器,不想费事儿搞AC+AP了。就研究了下shell编程,先参考了文末的两个github项目,然后结合自己需求写了个sh脚本来解决了(wifi-kickout) 。

主要特点

当OpenWrt检测到客户端信号比阈值更差时,主动给客户端发送断开连接命令来剔除客户端。

兼容ash shell

OpenWrt原版使用ash shell,有很多限制,例如不支持数组,不支持[[ ]]和(( ))条件判断结构等(支持普通的[]条件判断)。Github上的项目 Quenii / kickass 就转投了 bash shell 怀抱。需要 opkg install bash 之后使用 bash 来执行该脚本。

本着学习shell编程的目的,我的脚本保持了代码兼容ash shell的特性,可以在原版OpenWrt不安装额外软件包的环境下直接被执行。用 /bin/sh 调用即可。

黑/白名单模式

考虑到用户可能并不想剔除某些设备(例如位置偏远而固定的设备),或者用户可能只想剔除少数几个指定的设备,改脚本设置了blacklist和whitelist两种模式。

黑名单模式:只有mac地址注册在黑名单中的设备才可能被剔除;

白名单模式:除了白名单中注册的mac地址,其他所有设备都可能被剔除。

日志记录

设置了一个log文件: /tmp/wifi-kickout.log 记录剔除历史,以供调试。也会在 linux 系统日志中记录。

使用方法

复制 kickout.sh 到路由器中(例如使用scp命令),例如放在 /usr/kickout.sh 位置。

然后用 /bin/sh 调用该脚本即可,当然如果已经安装了 bash 也可以用 bash 调用。

该脚本执行时只会执行一次检测和判断并提出的操作,周期性运行脚本的方法:

  1. 使用crontab定时器每一分钟执行一次(crontab支持的最高频率),直接添加下面一行到 /etc/crontabs/root 即可,也可以用路由器web管理界面luci操作:*/1 * * * * /bin/sh /usr/kickout.sh
  2. 在脚本末尾增加 sleep 命令(例如 sleep 1 可以暂停1秒) ,然后重新调用该脚本。当然,也可以通过一个while true ... do ... done 的结构来完成,把 sleep 命令添加到循环体末尾即可。

代码发布

代码可能还不时改改,就不贴在这里了,贴个全球最大的同性交友网站链接:

https://github.com/smallerxie/wifi-kickout

欢迎来撩骚。

参考资料:

[1] OpenWrt | How to kick/deauth a 802.11/WiFi client
[2] Github | Quenii / kickass
[3] Github | nikito7 / kickout-wifi

本文固定链接: https://blog.xieyc.com/openwrt-wifi-kickout/ | 小谢的小站

该日志由 xieyc 于2020年04月26日发表在 折腾, 编程 分类下, 你可以发表评论,并在保留原文地址及作者的情况下引用到你的网站或博客。
原创文章转载请注明: OpenWrt自动剔除弱信号WiFi客户端 | 小谢的小站
关键字: ,

OpenWrt自动剔除弱信号WiFi客户端:等您坐沙发呢!

发表评论


快捷键:Ctrl+Enter
//added by myself XIEYC