因为电信卡非常容易断流,原因很简单,核心网,给终端分配/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