侧边栏壁纸
博主头像
华灯上 博主等级

行动起来,活在当下

  • 累计撰写 176 篇文章
  • 累计创建 24 个标签
  • 累计收到 3 条评论

目 录CONTENT

文章目录

旁路由自动无缝切换新思路-更无缝

华灯
2024-04-16 / 0 评论 / 0 点赞 / 29 阅读 / 0 字

旁路由自动无缝切换新思路-更无缝

思路

旁路由方案目前主要有两种

  • 传统的旁网关形式,内外设备单独配置一个网关设备。在这个网关设备失效的后,通过自动脚本配合dhcp等方式实现切换,需要下游设备断开重连,或重启主路由切换时间较长。
  • 主路由用爱快然后根据ip域名等规则分流方案,也就是 ikuai-bypass。此方案需要一个x86设备刷爱快做主路由,也可以实现无缝切换(1分钟左右)。

新方案使用主路由和旁路由 ip轮替的方式,原理:

旁路由配置两个ip 一个ip我们暂且称之为工作ip,另外一个ip暂且称之为检测ip。

主路由不断ping旁路由的第二个ip,如果ping不通,那么主路由把自己的ip修改为工作ip。旁路路由正常再把自己改回去。这样就实现免重连切换。

新方案优点

原理简单维护也简单。切换速度快(10秒以内),不需要内网设备断网后重联,主路由不需要是x86设备。

切换和配置

我们为了便于理解 需要给两个设备规划4个ip,分别为:

主路由 默认IP(10.1.1.1) 主路由辅助ip(10.1.1.11)

旁路由 工作IP(10.1.1.2) 旁路路由辅助ip(10.1.1.22)

主路由负责dhcp,旁路由关闭dhcp。dhcp指定下游设备的网关均为 10.1.1.2。

下文以openwrt为例,内核为5.15.148 版本git-25.050.75038-257d60d 使用 openwrt.ai 的在线编译固件 感谢supes

双ip的实现

openwrt网络-接口面板,新建一个接口也桥接 br-lan 然后静态ip配置为另外一个ip即可。参考/etc/config/network 中lan部分如下

主路由 正常工作状态 (主路由是一个四口硬路由)

config device
        option name 'br-lan'
        option type 'bridge'
        list ports 'lan1'
        list ports 'lan2'
        list ports 'lan3'
        list ports 'lan4'
        option promisc '1'

config interface 'lan'
        option device 'br-lan'
        option proto 'static'
        option ipaddr '10.1.1.1'
        option netmask '255.255.255.0'
        option ip6assign '60'
        option dns '223.5.5.5 114.114.114.114'
        
config interface 'lanManager'
        option proto 'static'
        option device 'br-lan'
        option ipaddr '10.1.1.11'
        option netmask '255.255.255.0'

旁路由正常工作状态 旁路由是一个单口虚拟机的openwrt

config device
        option name 'br-lan'
        option type 'bridge'
        list ports 'eth0'
        option promisc '1'
        
config interface 'lan'
        option device 'br-lan'
        option proto 'static'
        option ipaddr '10.1.1.2'
        option ipaddr '10.1.1.1'
        option netmask '255.255.255.0'
        option ip6assign '60'
        list dns '223.5.5.5'

config interface 'lanCheck'
        option proto 'static'
        option device 'br-lan'
        option ipaddr '10.1.1.22'
        option netmask '255.255.255.0'

配置截图 请参考 作者的恩山帖子 https://www.right.com.cn/forum/thread-8355919-1-1.html

iShot_2024-03-22_23.00.55

iShot_2024-03-22_23.00.55

openwrt 配置dhcp网关

主路由openwrt 配置dhcp服务分配给下游设备的网关为10.1.1.2

uci add_list dhcp.lan.dhcp_option="3,10.1.1.2"
uci commit dhcp

完成后重启dhcp重连下游设备,或干脆重启一下路由器。

dhcp_option的含义以及指定的下游设备通过dhcp单独配置独立网关功能,本文不扩展

检查状态

此时 下游设备dhcp分配的网关应该是10.1.1.2 在旁路由正常的情况下,下游被分配到10.1.1.2网关的设备应该都可以正常低调上网。

此时和传统旁路方案完全一致。旁路由断开后,下游设备无法上网,需要通过dhcp断开重连或手动修改下游设备网关 才可以恢复网络。

下面实现在旁路由下线后,主路由自动接替旁路由工作,并在旁路由上线后实现网络自愈。

主路由切换脚本

这个脚本运行在主路由上。 以openwrt为例。

mkdir /opt
vi /opt/ReplaceBypass.sh
================================
#!/bin/sh
check_ip_available(){  #使用 ping 命令检测旁路由是否在线
    ping -c 3 $1 | grep packets | awk '{print $4}'
}
while true
do
    echo "ping 10.1.1.22 ..."
    res=`check_ip_available 10.1.1.22` 
    current_ip=`uci get network.lan.ipaddr`
    echo "current_ip $current_ip"
    if [ $(($res)) -eq 0 ]; then
        echo "bypass is offline"
        if [ "$current_ip" != "10.1.1.2" ]; then
            echo "change to 10.1.1.2"
            sed -i "s/10.1.1.1'/10.1.1.2'/" /etc/config/network
            ifdown lan && ifup lan
        fi
    else
        echo "bypass is online"
        if [ "$current_ip" != "10.1.1.1" ]; then
            echo "change to 10.1.1.1"
            sed -i "s/10.1.1.2'/10.1.1.1'/" /etc/config/network
            ifdown lan && ifup lan
        fi
    fi
    sleep 5 #时间可以修改为1秒 
done

这是一个循环的shell脚本程序,间隔5秒用ping命令检测一次旁路由的辅助ip然后如果路由在线那么切换自己到10.1.1.1这个ip,否则切换到10.1.1.2替代路由工作。

先手动执行sh /opt/ReplaceBypass.sh执行后,反复断开和联通旁路由观察 ip切换情况。期间可以用 10.1.1.11 这个ip登录到web界面

测试正常后,我们创建一个服务来运行这个脚本,并让openwrt的开机自启这个服务。

vi /etc/init.d/ReplaceBypass 
===========================================
#!/bin/sh /etc/rc.common
START=99
start(){
    echo "ReplaceBypass service  is staring"
    sh /opt/ReplaceBypass.sh  > /dev/null 2>&1 &
}
stop(){
    PID=$(ps | grep "sh /opt/ReplaceBypass.sh" | grep -v grep | awk '{print $1}')
    kill $PID
    echo "ReplaceBypass service  is stop"
}

编辑完成后 启用这个服务

chmod +x /etc/init.d/ReplaceBypass # 必须执行
service ReplaceBypass enable # 开启自启
service ReplaceBypass start # 手动执行
ps |grep ReplaceBypass # 检查进程是否存在

padavan做主路由的检测脚本

补充一个Padavan作为主路由的检测脚本 理论可以,但是未测试 供参考

cat > /etc/storage/change_ip.sh << \EOF
#!/bin/bash
MainDefaultIp='10.1.1.1'
BypassWorkIp='10.1.1.2' 
BypassCheckIp='10.1.1.22'

check_ip_available(){ 
    ping -c 3 $1 | grep packets | awk '{print $4}'
}
res=`check_ip_available $BypassCheckIp`  #检测旁路由是否存在

current_ip=`nvram get lan_ipaddr`  #主路由当前ip 更多命令 nvram show

change_ip(){
   nvram set lan_ipaddr=$1  #设置ip
   nvram set lan_gateway=$1
   nvram commit  #提交修改
   reboot # 需要重启设备 老毛子单独重启lan口貌似无效
}

if [ $(($res)) -eq 0 ]; #即旁路由不存在,主路由应该把自己修改旁路路由的工作ip
then
    if [ "$current_ip" != "$BypassWorkIp" ]; then  #如果当前ip不是工作ip
       echo "change ip to $BypassWorkIp " 
       `change_ip $BypassWorkIp` 
    fi
    exit 1
fi
if [ $(($res)) -ne 0 ]; # 即旁路由存在,主路由应该把自己改为默认ip
then
    if [ "$current_ip" != "$MainDefaultIp" ]; then #如果当前ip不是默认ip
         echo "change ip to $MainDefaultIp " 
       `change_ip $MainDefaultIp`
    fi
    exit 1
fi
EOF

chmod +x   /etc/storage/change_ip.sh #设置脚本运行权限

/sbin/mtd_storage.sh save #保存脚本,防止重启丢失


#自动定时运行脚本(每一分钟检测一次):
#`系统管理 - 服务 ` 调度任务 (Crontab)  加入 `*/1 * * * * /etc/storage/change_ip.sh` 

如果您在使用ikuai-bypass 方案,希望能给点个star

0
  1. 支付宝打赏

    qrcode alipay
  2. 微信打赏

    qrcode weixin
  3. QQ打赏

    qrcode qq

评论区