分类 OpenWrt 下的文章

#!/bin/sh
# Modify by HSIAO-YANG CHEN
# crontab: * * * * *  /bin/sh /usr/kickass.sh
#

#强信号 -60
STRONG=-60
#弱信号 -78
WEAK=-78


# 指定日志文件和5G频段设备MAC保存地址
logfile="/tmp/kickass.log"
dev5gmacfile="/usr/devmac_5g.db" ;


#默认自动添加计划任务  
crontabsfile="/etc/crontabs/root"
if [ -z $( grep -i $0 "$crontabsfile" )  ] ; then
    echo "* * * * *  /bin/sh /usr/kickass.sh" >>$crontabsfile
    echo "Add task scheduler to crontabs"
fi
#只能运行一个kickass任务
if [  "$( ps | grep -c "kick" )" -gt 3 ] ; then
    echo "shell script already running "
else

    datetime=`date +%Y-%m-%d_%H:%M:%S`
    if [ ! -f "$logfile" ]; then
        echo "creating kickass logfile: $logfile"
        echo "$datetime: kickass log file created." > $logfile
    fi
    #踢除wlan-MAC列表
    kicklist=""; while true ; do

        datetime=`date +%Y-%m-%d_%H:%M:%S`
        #从文件中读取5G频段的MAC地址
        if [ -f "$dev5gmacfile" ] ; then
            dev5gmac=$(cat "$dev5gmacfile")
        fi

        # wlanlist for multiple wlans (e.g., 5GHz/2.4GHz)
        wlanlist="" ; wlanlist=$(ifconfig | grep -i wlan | grep -i -v sta | awk '{ print $1 }')
        #echo "$wlanlist"

        #获取多张网卡的SSID,为后面2.4G强信号判定是否踢除5G设备
        ssid2g5g="" ;    for wlan in $wlanlist ; do 
            ssid2g5g="$ssid2g5g $(iw $wlan info | grep ssid | awk '{ print $2 }')"
        done
        #echo "$ssid2g5g"
        #loop for each wlan
        wlan="" ; for wlan in $wlanlist ; do

            maclist="" ; maclist=$(iw $wlan station dump | awk '/Station/{print $2}')

            #5G频段的网卡AP
            if [ "$(iw $wlan info | grep center1 | awk '{ print $2 }')" -gt "14"  ];then
                #loop for each associated client (station)
                for mac in $maclist ; do
                    #新增5G频段的设备MAC
                    if [ -z "$(echo $dev5gmac | grep -i "$mac")"  ] ; then
                            echo "$mac" >> $dev5gmacfile
                        echo  "$datetime: Add new 5G wifi $mac success! " >> $logfile
                    fi
                    #获取信号强度
                    signal=$(iwinfo $wlan assoclist  | awk 'BEGIN{IGNORECASE=1}/'$mac'/{print $2}')
                    #踢除弱信号设备,终端尝试连接2.4G频段
                    if [ "$signal"  -le "$WEAK" ] ; then
                        #匹配2次踢除设备记录,启动踢除设备
                        if [ -n "$(echo $kicklist | grep -i "$wlan-$mac.*$wlan-$mac")" ] ; then
                            ubus call hostapd.$wlan del_client '{"addr":"'"$mac"'", "reason": 5, "deauth": True, "ban_time": 100}' 
                            echo  "$datetime: Kick $wlan MAC:$mac signal:$signal dBm switch 2.4G!" >> $logfile
                            #踢除设备记录删减
                            kicklist=$(echo $kicklist |sed "s/$wlan-$mac//g")
                        else
                            #踢除设备记录新增      
                            kicklist="$kicklist$wlan-$mac"
                        fi
                    else
                            #踢除设备记录删减
                            kicklist=$(echo $kicklist |sed "s/$wlan-$mac//g")
                    fi
                done
            else
                #2.4G频段的网卡AP
                for mac in $maclist ; do
                    signal=$(iwinfo $wlan assoclist  | awk 'BEGIN{IGNORECASE=1}/'$mac'/{print $2}')
                    #踢除弱信号设备
                    if [ "$signal"  -le "$WEAK" ] ; then
                        #匹配2次踢除设备记录,启动踢除设备
                        if [ -n "$(echo $kicklist | grep -i "$wlan-$mac.*$wlan-$mac")" ] ; then
                            ubus call hostapd.$wlan del_client '{"addr":"'"$mac"'", "reason": 5, "deauth": True, "ban_time": 3000}' 
                            echo  "$datetime: Kick $wlan MAC:$mac signal:$signal dBm tool weak!" >> $logfile
                            kicklist=$(echo $kicklist |sed "s/$wlan-$mac//g")
                        else      
                            kicklist="$kicklist$wlan-$mac"
                        fi
                    #踢除强信号,终端尝试连接5G频段(判断条件:信号比STRONG值大,终端MAC记录在5G频段里,有2个相同SSID的AP)
                     elif [ "$signal" -gt "$STRONG" -a -n "$(echo $dev5gmac | grep -i "$mac")" -a -n "$( echo "$ssid2g5g" | grep -i  "$(iw $wlan info | grep ssid | awk '{ print $2 }').*$(iw $wlan info | grep ssid | awk '{ print $2 }')" )"  ] ; then
                        if [ -n "$(echo $kicklist | grep -i "$wlan-$mac.*$wlan-$mac")" ] ; then
                            ubus call hostapd.$wlan del_client '{"addr":"'"$mac"'", "reason": 5, "deauth": True, "ban_time": 100}' 
                            echo  "$datetime: Kick $wlan MAC:$mac signal:$signal dBm switch 5G!" >> $logfile
                            kicklist=$(echo $kicklist |sed "s/$wlan-$mac//g")
                        else      
                            kicklist="$kicklist$wlan-$mac"
                        fi

                    else
                        kicklist=$(echo $kicklist |sed "s/$wlan-$mac//g")
                    fi
                done
            fi
        done
        #监测周期时间
        sleep 2s
    done
fi

解决设备连接上2.4G频段后,不能自动切换回5G频段。
解决思路:

  1. 移动终端近距离连接上无线AP的5G频段,脚本将5G频段的设备MAC记录保存下来;
  2. 当连接上2.4G频段的移动终端,靠近无线AP时,当2.4G的信号强度高于-60dBm,且设备MAC符合5G频段的设备MAC记录,自动踢除2.4G频段的连接,让移动终端自动切换回5G频段;
  3. 当连接上5G频段的移动终端,远离无线AP时,当5G信号强度低于-75dBm,自动踢除5G频段的连接,让移动终端自动切换回信号强度较高的2.4G频段。

使用方法:

  1. 将脚本保存在/usr/目录下,且赋予可执行权限;
  2. 计划任务添加: * /bin/sh /usr/kickass.sh

脚本下载地址:kickass.zip

有遇到设置2.4G,却无法切换到2.4G频段的,可使用本补丁文件,恢复2.4G频段。

--- package/network/services/hostapd/Makefile
+++ package/network/services/hostapd/Makefile
@@ -28,6 +28,7 @@
     CONFIG_PACKAGE_hostapd-mini \
     CONFIG_WPA_RFKILL_SUPPORT \
     CONFIG_DRIVER_WEXT_SUPPORT \
+    CONFIG_DRIVER_11N_SUPPORT \
     CONFIG_DRIVER_11AC_SUPPORT \
     CONFIG_DRIVER_11AX_SUPPORT \
     CONFIG_WPA_ENABLE_WEP
@@ -74,6 +75,10 @@
 
 STAMP_CONFIGURED:=$(STAMP_CONFIGURED)_$(CONFIG_WPA_MSG_MIN_PRIORITY)
 
+ifneq ($(CONFIG_DRIVER_11N_SUPPORT),)
+  HOSTAPD_IEEE80211N:=y
+endif
+
 ifneq ($(CONFIG_DRIVER_11AC_SUPPORT),)
   HOSTAPD_IEEE80211AC:=y
 endif
@@ -85,6 +90,7 @@
 DRIVER_MAKEOPTS= \
     CONFIG_ACS=$(CONFIG_PACKAGE_kmod-cfg80211) \
     CONFIG_DRIVER_NL80211=$(CONFIG_PACKAGE_kmod-cfg80211) \
+    CONFIG_IEEE80211N=$(HOSTAPD_IEEE80211N) \
     CONFIG_IEEE80211AC=$(HOSTAPD_IEEE80211AC) \
     CONFIG_IEEE80211AX=$(HOSTAPD_IEEE80211AX) \
     CONFIG_DRIVER_WEXT=$(CONFIG_DRIVER_WEXT_SUPPORT) \

--- package/network/services/hostapd/Config.in
+++ package/network/services/hostapd/Config.in
@@ -78,6 +78,10 @@
     select KERNEL_WIRELESS_EXT
     default n
 
+config DRIVER_11N_SUPPORT
+    bool
+    default n
+    
 config DRIVER_11AC_SUPPORT
     bool
     default n

--- package/network/services/hostapd/src/src/utils/build_features.h
+++ package/network/services/hostapd/src/src/utils/build_features.h
@@ -7,6 +7,10 @@
     if (!strcmp(feat, "eap"))
         return 1;
 #endif
+#ifdef CONFIG_IEEE80211N
+    if (!strcmp(feat, "11n"))
+        return 1;
+#endif
 #ifdef CONFIG_IEEE80211AC
     if (!strcmp(feat, "11ac"))
         return 1;

补丁文件下载:06_recover_11N.zip

固定IP使用旁路的网关,自由分配的IP使用主路由网关。
1.把DHCP服务器,设置主路由的地址和对应的DNS。
微信图片_20231229010309.png
2.把需要从旁路由出去的设备设置成静态地址分配。
微信图片_20231229010501.png

--- package/network/services/dnsmasq/files/dnsmasq.init
+++ package/network/services/dnsmasq/files/dnsmasq.init
@@ -339,9 +339,9 @@
 
     if [ $DNSMASQ_DHCP_VER -eq 6 ]; then
         addrs="${ip:+,$ip}${hostid:+,[::$hostid]}"
-        xappend "--dhcp-host=$macs${duids:+,$duids}$hosttag$addrs$nametime"
+        xappend "--dhcp-host=set:ssr,$macs${duids:+,$duids}$hosttag$addrs$nametime"
     else
-        xappend "--dhcp-host=$macs$hosttag${ip:+,$ip}$nametime"
+        xappend "--dhcp-host=set:ssr,$macs$hosttag${ip:+,$ip}$nametime"
     fi
 }
 
@@ -951,6 +951,17 @@
     [ ! -d "$dnsmasqconfdir" ] && mkdir -p $dnsmasqconfdir
     xappend "--user=dnsmasq"
     xappend "--group=dnsmasq"
+
+    br_lan="$( ifconfig |grep "Bcast" | sed 's/.*addr://;s/Bcast.*//' )"
+    br_lan6="$( ifconfig |grep -A1 "Bcast" |grep inet6.*addr| sed 's/.*inet6.*addr://;s/\/.*//' )"
+    xappend "--dhcp-option=tag:ssr,option:router,$br_lan"
+    xappend "--dhcp-option=tag:ssr,option:dns-server,$br_lan"
+    xappend "--dhcp-option=tag:ssr,option:nis-server,$br_lan"
+    xappend "--dhcp-option=tag:ssr,option:ntp-server,$br_lan"
+    xappend "--dhcp-option=tag:ssr,option6:dns-server,$br_lan6"
+    xappend "--dhcp-option=tag:ssr,option6:nis-server,$br_lan6"
+    xappend "--dhcp-option=tag:ssr,option6:sntp-server,$br_lan6"
+
     echo >> $CONFIGFILE_TMP
 
     config_get_bool enable_tftp "$cfg" enable_tftp 0


--- feeds/luci/modules/luci-base/po/zh-cn/base.po
+++ feeds/luci/modules/luci-base/po/zh-cn/base.po
@@ -838,8 +838,9 @@
 "\"<code>6,192.168.2.1,192.168.2.2</code>\" which advertises different DNS "
 "servers to clients."
 msgstr ""
-"设置 DHCP 的附加选项,例如设定 \"<code>6,192.168.2.1,192.168.2.2</code>\" 表"
-"示通告不同的 DNS 服务器给客户端。"
+"设置 DHCP 的附加选项,例如设定 \"<code>3,192.168.2.1</code>\" 表"
+"示指定客户端的网关地址;\"<code>6,210.2.4.8,192.168.2.1</code>\" 表"
+"示指定客户端的 DNS 服务器地址。"
 
 msgid "Delete"
 msgstr "删除"

补丁下载地址:02_fixed_router_dns_dnsmasq.zip