NAS的反向代理挂了All-in-Boom?Keepalived高可用方案来了!
本文的前提是你已经通过公网ipv4,v6,stun等等办法实现了外网访问内网的反代哈!
现在各大NAS品牌的系统更新都很频繁,各种社区app,docker也是三天两头的更新,大家好不容易设置好反向代理,在外网访问家里的NAS,正美滋滋的时候,有没有遇到这些情况:
反代跑在群晖的docker里,突然看到有个目录挂载错了,点修改提示被占用要先停止容器应用,点停止应用,Boom~!再也进不去了~~
反代跑在unraid的docker里,看到阵列有个地方不太对,想停阵列修改一下,Boom~!Docker服务跟随阵列一起停了~~
修改反代配置加点东西,AI说这个必须放在静态配置里,就这样改,相信我!于是你把静态配置改完,为了生效点了重启,Boom~!再也没反应了
还有可能就是单纯的一不小心,手贱点了停止,Boom~!
更不巧的是,这个时候你在公司上班,在路上玩手机,在。。。。反正就是不在家,毕竟反代配好了,就是要出来浪一下的嘛,结果。。。。
那要怎么办呢?有没有办法让反代不要这么脆弱呢?当然有啦~聪明的你肯定想到,那我把反代服务放在主路由上行不行?也行,但是如果配置错误或者停服,还是会挂。那要是一个反代不抗打,上两个三个的不就行啦~~
没错,还真就是这个方案,增加反代的数量!但是咱们家用,NAS前面大概率还有个路由器,NAS上跑的反代还要在路由器上映射一个外网端口才行。但是家用路由器一个端口只能绑定一个服务,两个反代怎么办呢?开放两个端口?可以是可以,但是也太蠢了吧,还要多记忆一个端口号,脑细胞很宝贵的好不好
那有没有办法让内网在多个设备上同时跑反代,然后路由器上只配置一个端口映射?
当然有,这就是本文要说的办法!核心工具就是:Keepalived!
不过在家庭环境下,能做到尽可能接近宽带相同的稳定水平就可以了,比宽带的稳定性还高的高可用也没有意义了~
简单说一下设计思路:
Keepalived的功能是部署一个虚拟网络,维护网络内服务的负载均衡,注册到网络里的服务可以监听同一个端口,并且在某个设备出现故障时自动漂移到另一台设备上。
原理就是当发现主设备上的Keepalived或者traefik任意一个服务不可用时就降低这台设备的权重,虚拟网络接着会寻找最高的节点置为MASTER,所有请求路由到新的节点上。等主设备恢复后又升高权重,流量自然就切回去了。
当然也有大佬说,我直接在家里装个k8s不行啊,嗯。。。当然也是行的,您随意
另外Keepalived只处理四层网络包,所以七层http的大流量流媒体请求并不会在内网来回的复制,性能上尽管放心~
反向代理我用的是traefik,注意这个反代有个毛病,映射出来的所有文件必须是600的权限,差一点都不行。
设备上我用了一台x86的unraid做主服务,一台x86的群晖和一台arm的飞牛做后备,正好测试一下不同架构下的可行性。
三台机器上分别安装好Keepalived和traefik
x86上我用的镜像是osxia/keepalived和traefik
arm上则是ednxzu/keepalived和arm64v8/traefik
假设三台设备的ip是192.168.1.10,192.168.1.11,192.168.1.12,虚拟网络是192.168.1.100

简单说下keepalived的配置,AI在这里会绕圈圈,我直接给出可用的:
首先要找到网卡的名字,群晖和unraid的有线网卡都叫eth0,如果聚合了就叫bond0,飞牛叫end0,无线或者其他网卡大家自己ip -a查一下吧。
然后就是主机的priority配置最高,比如100,其他分级降低,比如90,80。weight都配成-60,表示出问题就降这么多权重。
然后就是虚拟网络一下,在网络里在配置上当前设备上的真实服务就可以了。注意由于docker运行权限的问题,keepalived是无法检查traefik的进程状态的,真实服务也不能配127.0.0.1,具体见下,所有的坑我都标出来了:
global_defs { #全局配置
router_id keepalived-master #起个名字,没啥用,另外两个后备节点也各起一个就好
script_user root #脚本运行的账号,实际上为了安全没有给这么高的权限
enable_script_security
}
vrrp_script chk_traefik { #检测traefik是否存活的脚本
script "/bin/bash -c '/tcp/127.0.0.1/443'" # 只有这个命令有权限
interval 2 # 每隔 2 秒检查一次
weight -60 # 如果检查失败,将当前节点的优先级减去60
fall 2 # 连续失败 2 次,判定为失败
rise 2 # 连续成功 2 次,判定为恢复
}
vrrp_instance VI_1 { #主配置
state MASTER
interface eth0 #这里必须和网卡名字一样
virtual_router_id 51
priority 100 #权重,后备权重要低于主设备
advert_int 1
track_script { #运行traefik是否存活的检测脚本
chk_traefik
}
unicast_peer { #指出网络里的其他节点,不能有自己
192.168.1.12
192.168.1.13
}
authentication { #所有节点配成一样的,pass不能超过8个字节
auth_type PASS
auth_pass VIP2026
}
virtual_ipaddress { #虚拟网络ip地址,会绑定在指定的网卡上,如果成功了命令行ip -a可以看到
192.168.1.100/32 dev eth0
}
}
virtual_server 192.168.1.100 443 { # 虚拟网络配置,不开负载均衡,只转发到本地 Traefik即可
delay_loop 3
lb_algo rr # 只有一台,无所谓算法
lb_kind NAT
protocol TCP
real_server 192.168.1.10 443 { #不能是127.0.0.1,我这里反代的是https
weight 1
TCP_CHECK {
connect_port 443 #将虚拟网络的443连接到traefik的443
connect_timeout 3
}
}
}
另外两台将MASTER改为BACKUP,其他的照着说明改改就好了。
traefik的配置就不在这里展开了,后面专门水一篇,哈哈。
所有设备上所有服务启动,然后就是最后一步,在路由器上映射端口到虚拟网络:

测试一下~先用流量打开域名,注意访问的端口改为虚拟网络的那个端口
接着手动随意停止各个设备上的Keepalived,或者traefik,只要保证有一台设备上的Keepalived+traefik还活着,你就会发现。。。
神奇的事情发生了,页面顶多转两秒钟的圈圈,然后又可以继续响应请求了!大成功有木有!!
看看Keepalived的日志,里面很清晰的记录了自己现在是MASTER还是BACKUP,当前网络切换的权重有没有超过自己,监控的服务是否还活着,等等。
哈哈,从此再也不怕单点反代挂掉就all in boom了~~~
最后布置一个小作业,其实Keepalived还可以实现负载均衡,并且当前设备的反代挂掉后流量立刻转向其他设备的反代,更加灵活,但是这样的话要怎么配置呢?咱们评论区见!
水完,收工,谢谢观看~
作者声明本文无利益相关,欢迎值友理性交流,和谐讨论~
