旁路由方案,自动切换网关方案 参考

# 旁路由方案的痛点

旁路由在出问题的时候,会影响网关配置为旁路由的设备使用。所以需要自动检测旁路由。
首先 主路由要有完整权限的系统,就是有ssh权限的! 爱快请使用分流方案 到二级路由以及环回等方式实现。
旁路由的自动切换方案是很多的人的刚性需求。
用软路由做主路由,主要问题两点,折腾过程中的失误一些不确定东西,容易断网。还有x86软路由 不少人遇到突然断电导致的无法启动后全家断网
自动切换旁路由方案,更加稳定一些。

本文撰写于2019年,后期虽有修改补充,但是部分内容已经落后
有能力有时间的朋友,建议还是上x86 方案,不需要旁路由。 或者使用爱快分流方案。 https://dev.leiyanhui.com/route/ikuai-bypass-gfw/
个人经验 爱快分流方案更为稳健,但是需要另外开一个op 以及docker来处理分流规则。 对设备内存要求较高(x32爱快不支持kvm docker可用镜像有限,爱快x64 需要4G内存安装 2G内存运行)。 如果内存紧张最好还是选择openwrt one only

# 实现目标

主路由为硬路由负责上网和dhcp 顺带wifi,硬交换负责nas和机顶盒 台式机之间通讯。 去掉 x86 软路由
nas或者aio主机 或者 N1 或者闲置手机作为旁路由/旁网关(后面统称旁路由)

# 重点目标:

  • 旁路由离线后,所有设备自动切换到主路由网关
  • 双旁路由A和B A正常运行的时候B删除不存在在需要调整的时候,复制一个独立的旁路由出来,自己手动修改主机电脑的网关到旁路由B测试没问题后替换A
  • 可控制部分设备科学,部分设备不科学
  • ksm ipsec 科学 广告过滤 alist ddns nas 等,全部由旁路由或者aio/nas处理。

# 实现原理

旁路由用pve 或者 unraid 或者docker运行,关闭dhcp服务,静态ip(10.0.0.50),网关指定为主路由。也就是旁路由只是主路由下面的一个普通设备而已。

双DHCP 存在抢dhcp的情况,所以dhcp本身占不了太多资源,还是主路由统一管理。 主路由10.1.1.1 开启dhcp dhcp的网关改为程序脚本控制 dhcp的租期尽可能短一些(120秒) 主路由 dhcp的ip段为 10.1.1.200-245 重点设备 静态绑定到 10.1.1.200以内的ip段。

# 逻辑如下

主路由每隔一定时间 30秒或者1分钟,检查一次旁路由是否在线, 如果在线那么 dhcp服务的网关改为旁路由(10.0.0.50)
如果旁路由不在线 那么dhcp服务的网关改为主路由(10.0.0.1)

如果旁路由状态发生了变化,那么重启一次dnsmasq(或者再重启wifi 或者重启整个系统)
科学部分,由openclash 实现分流,就是部分设备不走科学还有部分设备强制全局科学等等。 这个可以看我以前的文章 https://dev.leiyanhui.com/openwrt/openclash/

# 具体实现

我主路由依旧用10多年前的 古董级k2p刷Padavan 固件,因为他的2.4G信号一直很好,Padavan 可以跑满1000M,5G的话也能跑到500M,另外一个5G路由器因为2.4G信号一般所以只能做ap用。 万兆由下级一个交换机处理,千兆以内众生平等 适合自己的才是最好的。
Padavan 也是开源linux 和openwrt使用起来在系统层面差距不是很大 ,只要有ssh权限,所有固件都大同小异。
旁路由 用 pve 跑的自己编译的openwrt,直接挂的vm跑的,因为我这边,8核心,64G内存 所以没用lxc和docker。

# 脚本测试

padvan默认是关闭ssh的,系统管理 - 服务 找到ssh 打开,客户端登录ssh

# 检查旁路由是否在线
1
curl http://10.1.1.50

这是openwrt的登录页面 他会自动301跳转,查看返回http代码 -m 3 是3秒

1
curl -I -s -m 3 http://10.1.1.50 -w %{http_code} | tail -n1

应该会自动返回一个301代码, http://10.1.1.50/cgi-bin/luci/ 的话应该是返回403,这个先不管 如果是不存在的地址,那么应该是返回 000

# 找dnsmasql的配置文件地址
1
find / -name  "*dnsmasq*"

返回 结果 逐个检查后发现Padavan和openwrt一样 都是/etc/dnsmasq.conf 这个文件,同时已经分配的列表也是/tmp/dnsmasq.leases这个文件。
在主路由中 设置dhcp的网关为 旁路由地址10.1.1.50 ,然后执行 cat /etc/dnsmasq.conf应该有一行dhcp-option=tag:lan,3,10.1.1.50

# 测试配置文件的查找和替换

记住上面的那段 dhcp-option=tag:lan,3,10.1.1.50 用grep搜索试试

1
grep dhcp-option=tag:lan,3,10.1.1.50 /etc/dnsmasq.conf |wc -l  # 查找 如果有的话应该返回1

替换

1
2
3
sed -i "s/dhcp-option=tag:lan,3,10.1.1.50/dhcp-option=tag:lan,3,10.1.1.1/g" /etc/dnsmasq.conf
## 检查
cat /etc/dnsmasq.conf

如果padavan的话不用这么麻烦 用nvram set dhcp_gateway_x=10.1.1.1

# 重启 dnsmasq

openwrt 下面这两个命令 都一样的效果

1
2
service dnsmasq restart
/etc/init.d/dnsmasq restart

Padavan 下可执行文件是 /usr/sbin/dnsmasq 通过查询网上资料得知 Padavan把服务脚本放在/sbin 直接执行/sbin/restart_dhcpd 即可

# 编写脚本

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
#!/bin/bash

default_gateway='10.1.1.1'  #主路由 IP
up_gateway='10.1.1.50'   #旁路由 IP (需设置的主路由 DNS 地址)

check_ip_available(){  #使用 ping 命令检测旁路由是否在线
    ping -c 3 $1 | grep packets | awk '{print $4}'
}

change_gateway_dns(){  #网关 DNS 切换
   nvram set dhcp_gateway_x=$1  #设置网关
   nvram set dhcp_dns1_x=$1
   nvram set dhcp_dns2_x=""  #设置 DNS
   nvram commit  #提交修改
   sleep 2
   rc rc_service restart_net_and_phy  #重启主路由 网络服务
   restart_dns    #重启主路由 DNS
   restart_dhcpd  #重启主路由 DHCP
   # sleep 5
   # reboot  #自动修改后存在网络故障,可能需要直接重启路由器, 等待时间较长
}

# If the gateway of the up close, the network is completely unusable

res=`check_ip_available $up_gateway`  #检测旁路由是否存在
current_gateway=`nvram get dhcp_gateway_x`  #获取主路由当前网关

if [ $(($res)) -eq 0 ]; #检测结果等于 0,即旁路由不存在,应设置网关和 DNS 为主路由地址
then
    if [ "$current_gateway" != "$default_gateway" ]; then  #如果当前网关地址不是主路由地址
        echo "up_gateway to default"
        `change_gateway_dns $default_gateway`  #将网关和DNS切换为主路由地址 并重启
    fi
    echo "use default gateway , nothing changed" # 什么都不用做
    exit 1
fi
if [ $(($res)) -ne 0 ]; #检测结果不等于 0,即旁路由存在,应设置网关和 DNS 为旁路由地址
then
    if [ "$current_gateway" != "$up_gateway" ]; then #如果当前网关地址不是主路由地址
        echo "up_gateway to  auxiliary_gateway" 
        `change_gateway_dns $up_gateway` #将网关和DNS切换为旁路由地址 并重启
    fi
    echo "use auxiliary_gateway , nothing changed" # 什么都不用做
    exit 1
fi

#将脚本置于 /etc/storage/change_gatway.sh 
#设置脚本运行权限:`chmod +x  /etc/storage/change_gatway.sh `  
#保存脚本,防止重启丢失:`/sbin/mtd_storage.sh save`
#自动定时运行脚本(每一分钟检测一次):
#`系统管理 - 服务 ` 调度任务 (Crontab)  加入 `*/1 * * * * /etc/storage/change_gatway.sh` 

最后

将脚本置于 /etc/storage/change_gatway.sh 设置脚本运行权限:chmod +x /etc/storage/change_gatway.sh
保存脚本,防止重启丢失:/sbin/mtd_storage.sh save 自动定时运行脚本(每一分钟检测一次): 系统管理 - 服务 调度任务 (Crontab) 加入 */1 * * * * /etc/storage/change_gatway.sh

以上内容抄 自:恩山,xuezou

# 最后存在的问题

经过测试 无论是wifi接入还是网线加入的设备 都可以在短暂掉线后 自动切换成功

Licensed under CC BY-NC-SA 4.0
comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计