wxhwz 发表于 2023-1-27 22:42

旁路由故障无感切换

本帖最后由 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设置为主路由即可。
因为比较复杂,没去尝试

huohua3930 发表于 2023-1-28 10:13

感兴趣,关注一下
页: [1]
查看完整版本: 旁路由故障无感切换