Zavier's Blog

LEDE固件踢出弱信号客户端,实现WiFi无缝漫游脚本

最近一直在折腾LEDE和openwrt,才发现自己手头的好几个斐讯都弱爆了,首先斐讯K2的2.4G就是个坑,由于其闭源驱动的缘故,导致除了潘多拉固件和Padavan固件外,刷入原生LEDE和OpenWrt的K2在2.4G频段上表现非常差,具体表现为速率忽高忽低,甚至完全没速度,好在我又从淘宝入了两个洋垃圾NETGEAR wndr3800,原先是打算买Cisco洋垃圾的,但是店家缺货,权衡之下购入了WNDR3800。这款路由在有线上表现的很优秀,5口全千兆,CPU为AR7161,频率是680MHz,而无线速率是150Mbps(2.4G)+300Mbps(5G)的组合。

由于家里面积较大,每天访客也多,单个AP难以完整覆盖,所以这两个WNDR3800是我特地买来做无线AP用于做覆盖的,后端主路由器是H3C MSR系列路由,并且在WNDR3800上配置了基于SSID的VLAN(下一篇文章会细说),将访客和私有VLAN分离开以确保安全性。

传统的wifi漫游是通过FIT模式的无线AP与AC控制器的组合来实现的,而这套设备都非常贵,个人使用完全没必要,因此我选择刷了lede固件的路由器来实现WiFi漫游,其实就是充当胖AP。首要条件就是各个AP的SSID、加密方式、密钥完全一致,然而有了这些条件是不够的,因为在切换AP时,是由于手机信号低于某个阈值,系统自动断开连接,从而导致手机重新搜索WiFi连接,并选择信号最强的AP连接。这个阈值不同厂商设定不一样,且通常为了保持网络的畅通性,这个阈值都会被厂商调的很低,即信号只剩下一格左右才会断开重连,并不会因为旁边有信号更强的AP而重新与它建立连接。所以必须让无线AP根据客户端的信号强度,来决定是否要将客户端踢出,将原本AC做的事情交给AP来做,一旦低于设定的阈值,AP就会向客户端发出Deauthentication信号从而强制让客户端断开连接,然后客户端会重新搜索信号更强的AP,并连接上去以完成漫游过程。

LEDE固件的LUCI界面是没有踢出弱信号客户端的选项的,所以所有过程必须通过shell脚本来实现,所以我编写了如下脚本,然后通过系统的crontab计划任务来实现定时检查客户端信号,并判断是否踢出。

logo.png

脚本如下:


#!/bin/sh
#输入设备名
DEV=
#设定阈值,低于该阈值客户端会被踢出
THRESHOLD=-75
CLIENT_COUNT=$(iwinfo $DEV assoclist|grep dBm|awk '{print $1" "$2}'|wc -l)
LINE=1
while [ $LINE -le $CLIENT_COUNT ]
do
   MAC=$(iwinfo $DEV assoclist|grep dBm|awk '{print $1}'|sed -n "$LINE"p)
   SIGNAL=$(iwinfo $DEV assoclist|grep dBm|awk '{print $2}'|sed -n "$LINE"p)
   if [ "$SIGNAL" -lt "$THRESHOLD" ]; then
      ubus call hostapd.$DEV del_client '{"addr":"'"$MAC"'", "reason": 5, "deauth": True, "ban_time": 1000}'
   fi
let LINE=LINE+1
done

脚本使用说明:

1、设备名查看方式:设备名即网卡名,与SSID是一一对应的,不同SSID的设备名不同,查看方法是通过putty或者xshell等软件SSH进入路由器,然后用iwinfo命令即可列出所有无线网卡名和对应的SSID。

2、阈值设定:最好是设定在-75到-80之间,阈值过低可能适得其反,导致网络不稳定。

3、定时任务的设置方法:系统的crontab不支持设定单位为秒的定任务,因此可以参考这篇文章通过crontab与sleep的结合的方法来实现:https://blog.csdn.net/bk_guo/article/details/54021032


发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

Copyright © 2017-2019 Zavier的博客.网站地图