为了高可用,以及平衡多个Shadowsocks服务器流量,可以借助HAProxy代理+多个Shadowsocks服务端来配置一个Shadowsocks服务群。利用HAProxy的4层代理作流量分发,使用外部检查工具实时监控Shadowsocks服务器的状态,以完成服务群的配置。
HAProxy是一个高性能负载均衡/代理服务器,可以提供4/7层的TCP代理。通过HAProxy的负载均衡器,可以将TCP连接分发到多个Shadowsocks服务端。同时在外部工具的帮助下,HAProxy提供的服务检查功能也可以对多个服务可用性进行检查,进行多服务容灾处理。
整体架构如上图。有一些其它方案是把HAProxy放在Shadowsocks后面的,但这样就需要多个服务端使用相同的配置,即端口、密码和加密方式都一样。但这样不是很利于多个服务的维护,安全性也有一些影响,对于v2ray等混淆方案也是不支持的。放在前面可以有效支持多个不同配置的服务,只是这样HAProxy就无法直接检测到远程服务器的可用状态,因为它只与本地的ss-local交互。而本地的TCP连接检查一定是通过的,因此这样就失去了高可用功能了。
不过HAProxy提供了使用外部工具进行服务检查的功能,于是我写了一个专门用于测试Shadowsocks服务的检查脚本,其原理是按照Socks5协议和ss-local进行握手,再通过Shadowsocks建立ssl连接去请求google主页,看能否收到200 OK的回复。
源代码放在Github上:haproxy-shadowsocks-checker,编辑HAProxy的配置文件,修改配置如下:
检查结果:
注意
2020/07/30:自从haproxy的v2.2版本开始,需要在global设置中开启insecure-fork-wanted设置。