旁路由故障无感切换
本帖最后由 wxhwz 于 2023-1-27 23:25 编辑需求原因:因为路由器性能不足,电脑用hyper-v虚拟个op跑科学,但是电脑偶尔需要关机,这时候需要手动切换网关dns,很麻烦
原理:uci、ip route命令
网络结构:
上网的设备网关、dns都设为192.168.5.1
如果旁路由在线,网络流量 ap->旁路由->主路由
如果旁路由离线,网络流量 ap->主路由
脚本代码,自己按自己情况修改,需要除主路由、旁路由外的第三个路由(opnewrt系统),丢到第三个路由里开机运行
#!/bin/bash
#主路由ip
main_router=192.168.5.3
#旁路由ip
side_router=192.168.5.2
#运营商dns
default_dns=223.5.5.5
function check()
{
local i=0
ping -c 2 -W 1 $side_router |grep -q 'ttl='
if [ $? -eq 0 ];then
echo "旁路由正常"
uci show dhcp.@dnsmasq.server | grep -q "$side_router"
if [ $? -gt 0 ];then
i=$((${i}+1))
fi
ip route list main | grep -q $side_router
if [ $? -gt 0 ];then
i=$((${i}+2))
fi
else
echo "旁路由故障"
uci show dhcp.@dnsmasq.server | grep -q "$default_dns"
if [ $? -gt 0 ];then
i=$((${i}+4))
fi
ip route list main | grep -q $main_router
if [ $? -gt 0 ];then
i=$((${i}+5))
fi
fi
return $i
}
uci delete dhcp.@dnsmasq.server
uci set dhcp.@dnsmasq.noresolv="1"
uci commit
while :
do
check
case $? in
1)
echo "需要重置为旁路由dns"
uci delete dhcp.@dnsmasq.server
uci add_list dhcp.@dnsmasq.server="$side_router"
uci set dhcp.@dnsmasq.cachesize="0"
uci commit dhcp
/etc/init.d/dnsmasq restart
;;
2)
echo "gateway需要重置为旁路由"
ip route change default via $side_router dev br-lan
;;
3)
echo "二者都"
uci delete dhcp.@dnsmasq.server
uci add_list dhcp.@dnsmasq.server="$side_router"
uci set dhcp.@dnsmasq.cachesize="0"
uci commit dhcp
ip route change default via $side_router dev br-lan
/etc/init.d/dnsmasq restart
;;
4)
echo "需要重置为主路由dns"
uci delete dhcp.@dnsmasq.server
uci add_list dhcp.@dnsmasq.server="$default_dns"
uci set dhcp.@dnsmasq.cachesize="10000"
uci commit dhcp
/etc/init.d/dnsmasq restart
;;
5)
echo "gateway需要重置为主路由"
ip route change default via $main_router dev br-lan
;;
9)
echo "二者都"
uci delete dhcp.@dnsmasq.server
uci add_list dhcp.@dnsmasq.server="$default_dns"
uci set dhcp.@dnsmasq.cachesize="10000"
uci commit dhcp
ip route change default via $main_router dev br-lan
/etc/init.d/dnsmasq restart
;;
esac
sleep 3s
done
exit 0
只有一个主路由、一个旁路由的话理论上也能实现,思路大致是主路由(openwrt)上单独为旁路由添加一个ip rule add from 旁路由ip,让旁路由的流量下一跳走运营商的默认网关,其余的来自局域网ip的流量下一跳走旁路由,最后把上网设备的网关、dns设置为主路由即可。
因为比较复杂,没去尝试
感兴趣,关注一下
页:
[1]