利用HAProxy实现ss-local多IP均衡负载

本文面向Linux/Unix平台,Windows端ss-client自带多IP均衡负载功能。本文不提供任何有关如何获得ss-server的信息。

我们都知道一个ss-local进程(占用一个端口)只能连接一个ss-server,假设我现在有三个ss-server,分别是123.123.123.101:8388,123.123.123.102:8388和123.123.123.103:8388,考虑以下的情况:

  • 如果其中某一条线路故障或速度达不到要求,需要ss-local手动切换,手动切换会造成已有连接断开;
  • 三个ss-server的有流量限制,都是每个月500G,想要均衡的使用避免某一个IP资源浪费。

为了应对上述的情况,我们利用HAProxy实现一个ss-local连接多个ss-server,并且能够无缝自动切换,实现均衡负载的目的。

HAProxy是一个使用C语言编写的自由及开放源代码软件[1],其提供高可用性负载均衡,以及基于TCPHTTP的应用程序代理[2]
包括 GitHubBitbucket[3]Stack Overflow[4]RedditTumblrTwitter[5][6]Tuenti[7]在内的知名网站,及亚马逊网路服务系统都使用了HAProxy。 [8]

注意,HAProxy不具有UDP代理功能,因此经由HAProxy实现的ss-local多IP均衡负载已经不能算真正意义上的socks5代理。

准备工作

使用HAProxy自动切换ss-server的前提是,多个ss-server应当具有相同的密码,因此我们需要远程登录服务器,修改ss-server配置文件,设置同一个密码。

配置HAProxy

以macOS为例,使用brew安装haproxy:

~$ brew install haproxy

brew安装的haproxy不带默认的配置文件,需要自己创建,参考HAProxy文档提供的样例配置文件HAProxy version 1.7.9 - Configuration Manual,新建配置文件:

~$ nano /usr/local/etc/haproxy.cfg

插入如下内容:

defaults
    mode tcp

frontend shadowsocks-in
    mode tcp
    bind *:8388
    default_backend shadowsocks-out

backend shadowsocks-out
    mode tcp
    balance roundrobin
        server  server1_name   123.123.123.101:8388
        server  server2_name   123.123.123.102:8388
        server  server3_name   123.123.123.103:8388

这样,我们就把ss-server端123.123.123.101:8388,123.123.123.102:8388和123.123.123.103:8388绑定到本地localhost:8388上。

运行HAProxy:

~$ haproxy -f /usr/local/etc/haproxy.cfg

配置ss-local

~$ nano /usr/local/etc/shadowsocks-libev.json

现在localhost:8388相当于聚合后的ss-server,因此我们这样修改配置文件:

{
    "server":"127.0.0.1",
    "server_port":8388,
    "local_port":1080,
    "password":"password",
    "timeout":600,
    "method":"aes-256-cfb"
}

运行ss-local:

~$ ss-local -c /usr/local/etc/shadowsocks-libev.json

自动启动ss-local和HAProxy

通过brew安装的ss-local自带自启动plist文件,只需要:

~$ brew services start shadowsocks-libev

通过brew安装的HAProxy同样自带自启动plist文件,只需要:

~$ brew services start haproxy

验证方法

在代理的情况下多访问几次能显示ip的网站,比如百度搜索IP地址,可以看到你的访问ip不只是一个,说明负载均衡生效。

提示一个坑

如果要用brew services后台运行haproxy,一定不要把haproxy自身配置成daemon运行。如果在配置文件中有这句配置:

global
     daemon

而你又用brew services后台自动运行,那么会发现隔几分钟haproxy就会生成一个新的进程,直到耗尽系统资源。

欢迎分享,非商业转载注明出处。

我的其他文章:

结构光发展简史 - 知乎专栏

低成本搭建Time Machine服务器 - 知乎专栏

相机标定究竟在标定什么? - 知乎专栏

三言两语说「相移」,四步相移的前世今生 - 知乎专栏

「真诚赞赏,手留余香」
还没有人赞赏,快来当第一个赞赏的人吧!
文章被以下专栏收录
1 条评论
推荐阅读