设备在获取了ipv6地址后,如果wan口重拨更换了ipv6地址,路由器后面的设备dns分别有不同的问题,比如:ipv6更新后ssh会连不上,需要重启dropbear,原因是设备的dns地址已经通过dhcp自动获取,但是路由器ipv6变更后,dns服务器应该也会变更,但是设备这时是不知道的,还是用着变更前的dns地址,导致出现这种问题。
我已知的情况:
- 苹果手机:暂时没有发现有影响
- 安卓手机:dns解析不再经过路由器53端口
- 电脑有线:dns解析不再优先使用ipv6,基本全部都是ipv4进行dns解析。
基于以上情况,写了一个脚本:
wan_check.sh
[ "$(cat /proc/uptime | awk '{print $1}' | sed "s/...$//g")" -le 100 ] && exit
ipv4=`ifconfig pppoe-wan | grep P-t-P | grep -oE [0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3} | head -n1`
ipv6=`ifconfig pppoe-wan | grep Global | grep -oE [0-9a-z]{1,4}:[0-9a-z]{1,4}:[0-9a-z]{1,4}:[0-9a-z]{1,4}:[0-9a-z]{1,4}:[0-9a-z]{1,4}:[0-9a-z]{1,4}:[0-9a-z]{1,4}`
updateIPFile(){
echo IPv4=$ipv4 > var/ip
echo IPv6=$ipv6 >> var/ip
}
[ -z "$ipv4" ] && ifup wan || [ -f /var/ip ] && source /var/ip
[ -n "$ipv4" -a "$IPv4" != "$ipv4" ] && {
updateIPFile
}
[ -n "$ipv6" -a "$IPv6" != "$ipv6" ] && {
updateIPFile
interface=`uci get network.lan.ifname`
for ifname in $interface lan;do
ubus call network.interface down "{ \"interface\" : \"${ifname}\" }"
done
sleep 1
for ifname in $interface lan;do
ubus call network.interface up "{ \"interface\" : \"${ifname}\" }"
done
sleep 10
wlist=`cat /etc/config/wireless | grep ifname | awk '{print $3}' | sed "s/'//g"`
for wl in $wlist;do
macs=`iwinfo $wl assoclist | grep ..:..:..:..:..:.. | grep dBm | awk '{print $1}'`
for mac in $macs;do
iwpriv $wl kickmac $mac
done
done
}
若检测到ipv6地址更换,将所有wifi设备踢出,强制断开lan网口(模拟物理拔网线),此时路由器下的设备就可以通过dhcp重新获取地址来解决上述情况了。
链接: https://pan.baidu.com/s/1Z7iJtuSBqYfKQdSQ109Ygw
提取码: luyw
下载解压将里面的脚本放到/data文件夹,然后控制台输入命令即可:
chmod 755 data/wan_check.sh && sed -i '$a\*/1 * * * * /data/wan_check.sh' etc/crontabs/root && etc/init.d/cron restart