利用nignx反向代理ss实现负载均衡

现在各大云服务器厂商都推出了免费一年的试用,像google、aws和azure都有,我们有了免费的梯子,那么如何做一个负载能让我们访问更丝滑呢

**技术的瓶颈

由于TCP/IP网络模型的瘦腰结构,最终所有流量都会通过IP协议传送。因此防火墙的终极大杀器,就是封禁IP。一旦IP被封杀,此服务器便废了。

现在能正常上网的同学不要高兴太早。因为现在的防火墙采用的是黑名单方式,等到哪天逼急了采用白名单方式,那所以翻墙方法都会失效。因此闷声发大财,这是最好的。

另一个瓶颈在于DNS协议。并且现在的DNS污染已经上升到新的高度,即使设置自定义DNS也不能避免。因为除非使用VPN,否则系统的DNS请求全部通过53/UDP端口发送。 DNS请求是未加密的。因此各级网关可以对53/UDP的请求进行针对性的拦截。

运营商对53/UDP端口的拦截已经是公开的秘密了,只不过大多数时候用户是无法感知的。在ping Google.com时,发现竟然能ping通,并且延时只有几毫秒,不是GFW罢工了,也不是网络信号可以超光速了,只是你的DNS被劫持了而已 :)

有两种解决方案:

  • 挂VPN或者使用类似软件,将DNS请求也经由代理发送。
  • 手工配置Hosts

国内转发的重要性

一个常规的数据包流向:

用户网络环境 —-> 国外VPS —-> 目标国外网站

其中,第二段链路往往是比较流畅的(如果你不是又回过头来访问国内网站的话), 而第一段链路波动就比较大,尤其不同运营商会有不同表现。可能联通宽带可以很快访问,换移动宽带就很慢,甚至换了手机4G就完全访问不了。 这种速度、可靠性不稳定的访问体验是非常差的。

一个比较好的方案是使用一台国内机器作为中转。

用户网络环境 —-> 国内VPS —-> 国外VPS —-> 国外目标网站

首先,完全不要担心多了一步中转是否会影响速度(延时),因为本来IP数据包就会经过多次路由转发,添加一台机器中转相当于手动优化了路由规则。 绝大多数情况下,经过中转会降低大大降低数据包从用户端到国外目标网站的传输时间。

像阿里云腾讯云这样的大厂,他们的机房都在主干网上,并且针对国内各个运营商的线路都做了优化。 因此可以保证在新的数据流动路径上,第一段链路在绝大多数情况下都是快速稳定的。

至于第二段链路,国内VPS到国外VPS。由于阿里云等厂商基本都是BGP机房,出国线路也比较快速和稳定。 此外,由于是两个机房之间的通信,并且都有公网IP,没有NAT问题。

这三段链路中,第二段和第三段链路的带宽都不是瓶颈,因为阿里云可以选择按流量计费然后带宽选择100Mb,国外流量更加便宜大碗,VPS基本上都是1Gb带宽。 所以整条链路带宽瓶颈就是用户的宽带带宽。

负载均衡

不过这样也有一个问题,你会发现整条链路是单链的,其中最脆弱的一环依然在国内到国外这一段,因为GFW只建在国境线上。 一旦IP暴露,被GFW封锁,则这台机器就废了,必须换一台。

对于自建的VPS,闷声发大财,往往没有这个问题。而对于和人共用飞机场的,则很容易被封。

一个比较好的解决方法是在国内的VPS上挂载负载均衡器,后端挂着多台国外VPS,一个IP被封杀则自动切换到下一个。

并且多线程下载时也有加速效果

中转工具

常用的、也是网上最常搜到的中转方案,是使用iptables和HaProxy 两个工具都有致命缺点:

  • iptables只是简单转发,没有负载均衡功能,并且配置相对不友好。
  • HaProxy是专门的负载均衡器,可惜只支持TCP。虽说大多数时候够用,但很多时候我们确实需要UDP,譬如查询DNS或者玩游戏。

所以这篇文章主要介绍用Nginx来进行流量转发和负载均衡,它支持UDP这一点弥补了HaProxy的不足。 并且Nginx支持插件扩展,可以实现更丰富的负载均衡功能。

Nignx 的TCP代理设置

nignx在1.9版本以后就可以进行tcp协议的代理了,不再需要安装 ngx_http_google_filter_module等模块了。

nignx代理的转发跟http代理同级,所以我们可以直接在nginx配置文件中加入:

1
2
3
4
5
6
7
8
9
10
11
12
13
stream {
upstream shadowsocks{
hash $remote_addr consistent;
server xxxx:xx
server xxxx:xx
server xxxx:xx
}
server {
listen 8388;
listen 8388 udp;
proxy_pass shadowsocks;
}
}

把其中的xxxx替换为你的海外服务器和端口即可。

本文参考自:Nginx中转Shadowsocks与负载均衡