我的Debian Nas通过eui64获取IPv6,这种方法相比DHCPv6有个好处是后缀不变,方便openwrt开放端口。
但是有个问题是每次(๐•ᴗ•๐)由器重新拨号后Nas的IPv6就没网了,具体表现是Nas已经获得了新的v6地址但是旧的并没有马上失效,所以所有连接全部超时。
在百度和谷歌之后发现解决方法很少,所以只能自己写脚本重置一下网络服务了。
脚本如下
#!/bin/bash
#
#相关变量解释
# RESET_IPV6_DEV=选中刷新的网卡(物理机eth虚拟机ens)
# RESET_IPV6_SLEEP=循环检测休眠时间
# PingA,PingB=网址或IPv6地址
# CycleIndex=重试次数
# IntervalTime=重试间隔时间(秒)
RESET_IPV6_DEV=$1
RESET_IPV6_SLEEP=$2
PingA=www.qq.com
PingB=www.baidu.com
CycleIndex=1
IntervalTime=3
if [ -z ${RESET_IPV6_SLEEP} ]; then
RESET_IPV6_SLEEP=60
echo "未设置休眠时间,已使用默认值${RESET_IPV6_SLEEP}秒"
if [ -z ${RESET_IPV6_DEV} ]; then
echo '请指定一个网卡'
exit 0
fi
fi
if [ -z ${ERR_IPV6_NUMBER} ]; then
echo 第一次启动,设置环境
export ERR_IPV6_NUMBER=0
export ERR_IPV6_WAIT=0
echo "当前休眠时间:${RESET_IPV6_SLEEP}"
echo "当前选中设备:${RESET_IPV6_DEV}"
fi
function Run()
{
PingYES=0
PingError=0
function NowTimeCall()
{
NowTime=$(date "+%Y-%m-%d %H:%M:%S")
}
while [[ $i -lt $CycleIndex ]]
do
NowTimeCall
echo ---------------------------------------------
echo "$NowTime - 开始尝试Ping $PingA"
if /bin/ping6 -c 1 $PingA >/dev/null
then
NowTimeCall
echo "$NowTime - $PingA 连接正常"
PingYES=1
break
else
NowTimeCall
echo "$NowTime - 无法连接到 $PingA"
NowTimeCall
echo "$NowTime - 开始尝试Ping $PingB"
if /bin/ping6 -c 1 $PingB >/dev/null
then
NowTimeCall
echo "$NowTime - $PingB 连接正常"
PingYES=1
break
else
NowTimeCall
echo "$NowTime - 无法连接到 $PingB"
i=$(($i + 1))
echo "$NowTime - 重新Ping $i/$CycleIndex"
PingError=1
sleep $IntervalTime
fi
fi
done
if [ $PingError = 1 ]; then
NowTimeCall
echo "$NowTime - 网络连接异常,尝试重启IPv6"
echo "$NowTime - 当前尝试次数 ${ERR_IPV6_NUMBER}"
let ERR_IPV6_NUMBER++
export ERR_IPV6_NUMBER
ip addr flush dev ${RESET_IPV6_DEV} dynamic
systemc(๐•ᴗ•๐) restart NetworkManager
sleep 5
echo '当前IPv6信息,注意是否刷新成功'
ip addr show dev ${RESET_IPV6_DEV} dynamic
fi
if [ $PingYES = 1 ]; then
NowTimeCall
echo "$NowTime - 网络连接正常"
export ERR_IPV6_NUMBER=0
fi
}
while (true)
do
if [ ${ERR_IPV6_NUMBER} -ge 5 ]; then
echo "重试次数太多,请等待${ERR_IPV6_NUMBER}次"
let ERR_IPV6_NUMBER--
export ERR_IPV6_NUMBER
export ERR_IPV6_WAIT=1
else
Run
fi
if [ ${ERR_IPV6_WAIT} -eq 1 ]; then
if [ ${ERR_IPV6_NUMBER} = 0 ]; then
echo "请再执行一次"
export ERR_IPV6_WAIT=0
else
echo ”请再等待${ERR_IPV6_NUMBER}次”
let ERR_IPV6_NUMBER--
export ERR_IPV6_NUMBER
fi
fi
sleep ${RESET_IPV6_SLEEP}
done
if(window.hljsLoader && !document.currentScr(๐•ᴗ•๐).parentNode.hasAttribute('data-s9e-livepreview-onupdate')) {
window.hljsLoader.highlightBlocks(document.currentScr(๐•ᴗ•๐).parentNode);
}
将其命名为Reset_IPv6.sh放在目录里
添加可执行权限
chmod u+x Reset_IPv6.sh
这个时候可以运行一下试试
./Reset_IPv6.sh ens224 60
ens224是我的网络接口,60是休眠时间
如果正常的话输出结果如图:
添加开机自启
新建文件
sudo vim /etc/systemd/system/reset-ipv6.service
填入以下内容,修改启动命令
[Unit]
Descr(๐•ᴗ•๐)ion=Auto Reset IPv6
[Service]
User=root
ExecStart=/脚本存放目录/Reset_IPv6.sh 你的网络接口 休眠时间
[Install]
WantedBy=multi-user.target
if(window.hljsLoader && !document.currentScr(๐•ᴗ•๐).parentNode.hasAttribute('data-s9e-livepreview-onupdate')) {
window.hljsLoader.highlightBlocks(document.currentScr(๐•ᴗ•๐).parentNode);
}
启用自启
sudo systemc(๐•ᴗ•๐) enable reset-ipv6.service
手动开启服务
sudo systemc(๐•ᴗ•๐) start reset-ipv6.service
查看服务日志
sudo systemc(๐•ᴗ•๐) status reset-ipv6.service
或者
sudo journalc(๐•ᴗ•๐) -u reset-ipv6.service
效果:
其实最开始我是想做成定时任务来执行的,所以用export来写入环境变量,大致框架写好开始测试之后发现必须要用source执行脚本才能写入全局环境变量,遂转头研究自启服务了
中间Ping的那段脚本是其他人写的,他的情况是(๐•ᴗ•๐)由器用一段时间就没网了,所以需要自动重启Wan,刚好和我这个有点相似,就直接copy过来改了一下。原作者找不到了,脚本名字叫my_pppoe.sh