因为电信卡非常容易断流,原因很简单,核心网,给终端分配/64的IP V6地址,有效期都很短。

回收后,不通知终端

写了一些脚本 放在OpenWRT的 /root目录, 加入crontab每5分钟检测一次

主程序 keep_alive.sh

#!/bin/ash

#  crontab
# */5 * * * * /root/keep_alive.sh

DIR=$( cd $(dirname $0) ; pwd -P )
SH_INTERNET_TESTS="$DIR/check_internet.sh"
SH_RESTART_INTERFACE="$DIR/restart_wwan.sh"


`$SH_INTERNET_TESTS`

if [ $? -eq 1 ]; then
   echo "Ooops, we're offline!"
   echo ">> Restarting interface.."
   $SH_RESTART_INTERFACE
else
   echo "We're okay!"
fi

检测网络通畅 check_internet.sh

#!/bin/ash

IP_TO_PING=www.qq.com
PACKET_COUNT=4

ONLINE=0

for i in `seq 1 $PACKET_COUNT`;
    do
        nc -G 2 -z $IP_TO_PING 80
        RETVAL=$?
        if [ $RETVAL -eq 0 ]; then
            ONLINE=1
            break
        fi
    sleep 2
    done

if [ $ONLINE -eq 1 ]; then
    # ONLINE
    exit 0
else
    # OFFLINE
    exit 1
fi

原理是通过nc 连接 www.qq.com 的80端口

-z zero-I/O模式,通常用于扫描,以快速检测网络

-G 2 source-routing pointer 源路由点 Loose source routing hop pointe

如果没有装netcat的话, 可以用 ping -c 4 $IP_TO_PING 代替

重启网口, 并删除废弃的IPV6地址 restart_wwan.sh

#!/bin/ash

INTERFACE="nr5g"

ifdown $INTERFACE
sleep 2
ifup $INTERFACE
sleep 5

BAD_IPV6=$(ip -6  addr  show   dev   br-lan  | sed -n '/deprecated/{s/.*inet6 *\([^ ]*\).*/\1/p;q}')
if [ -z "$var" ]; then
	echo "IPV6 ok"
else
	ip -6 addr del   $BAD_IPV6    dev br-lan
fi

参考资料:
https://github.com/mchsk/openwrt-lte-keep-alive