端口轉發和haproxy和Proxy/ss優化與負載均衡
稍微借鑒了一下輕小說的標題明明方式 ; )
前些日子,電信直連GMO(ConoHa)機房出現了繞路美利堅的情況。跟蹤路由記錄表明,數據包一旦到達電信骨幹網,便被直接往阿妹你看扔,從美國NTT繞一圈回日本。
f**k電信!
苦苦思索應該怎麼辦。想起前些日子購買了香港Softlayer機房的vps,電信ping這個機房的延時只有50以下,廣東等東南部ping甚至低至10ms
從Softlayer ping GMO的延時穩定在50左右。那麼正好可以拿它當做一個跳板,從香港中轉去日本。
我不得不吐槽一下。中國大陸和日本直線距離只有多少,非得從香港繞一圈...
找了一些資料,想起自己見過clowwindy在ss的wiki裡面留下的方法。一下的東西摘自ss wiki的Setup a Shadowsocks relay裡
轉發數據包
If you want your client connected to a Japan VPS, but you want a US IP.
Client <--> Japan VPS <--> US VPS
iptables
Easy version:
Setup Shadowsocks server as usual on US VPS.
On Japan VPS, enable forwarding. Replace US_VPS_IP and JAPAN_VPS_IP with actual IP:
sudo su
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -t nat -A PREROUTING -p tcp --dport 8388 -j DNAT --to-destination US_VPS_IP:8388
iptables -t nat -A POSTROUTING -p tcp -d US_VPS_IP --dport 8388 -j SNAT --to-source JAPAN_VPS_IP
Set your server to JAPAN_VPS_IP:8388 on your client.
可以用Linux自帶的防火墻iptables進行數據包的中轉。
haproxy
Better version:
For those who want more control and better performance, use haproxy instead. You can also enable load balance by adding multiple servers.
蛤proxy是什麼?
下面這段話摘自百度百科
HAProxy提供高可用性、负载均衡以及基于TCP和HTTP应用的代理,支持虚拟主机,它是免费、快速并且可靠的一种解决方案。HAProxy特别适用于那些负载特大的web站点,这些站点通常又需要会话保持或七层处理。HAProxy运行在当前的硬件上,完全可以支持数以万计的并发连接。并且它的运行模式使得它可以很简单安全的整合进您当前的架构中, 同时可以保护你的web服务器不被暴露到网络上。
HAProxy实现了一种事件驱动, 单一进程模型,此模型支持非常大的并发连接数。多进程或多线程模型受内存限制 、系统调度器限制以及无处不在的锁限制,很少能处理数千并发连接。事件驱动模型因为在有更好的资源和时间管理的用户空间(User-Space) 实现所有这些任务,所以没有这些问题。此模型的弊端是,在多核系统上,这些程序通常扩展性较差。这就是为什么他们必须进行优化以 使每个CPU时间片(Cycle)做更多的工作。
以我現在的知識水平,只能對其原理略懂一二。但我們只需要知道它高效並且方便就行了。來看看它的配置方法
安裝haproxy
他有官方的rpm包,只需要
yum install haproxy
#or
apt-get install haproxy
即可。
配置haproxy
haproxy的默認配置文件一般來說是/etc/haproxy/haproxy.cfg
配置完成之後,運行命令
service haproxy start
即可啟動程序
或者可以使用
haproxy -f **yourCfgName**
來實現啟動特定配置文件
配置文件範例
以下配置文件來自clowwindy
global
ulimit-n 51200
defaults
log global
mode tcp
option dontlognull
contimeout 1000
clitimeout 150000
srvtimeout 150000
#上面這一塊內容即將失效,需要更換為
#timeout connect 1000
#timeout client 150000
#timeout server 150000
frontend ss-in
bind *:8388
default_backend ss-out
backend ss-out
server server1 US_VPS_IP:8388 maxconn 20480
配置文件詳解
它包括了四個區塊內容,這裡只使用了三塊內容
- global
- default
- frontend & backend
以下修改自
http://www.linuxidc.com/wap.aspx?nid=118968
global: 全局配置段
default: 默認配置
所有在backend、frontend、linsten裡面相同的內容可以定義在這裡
frontend:前端配置
定義前端配置,接受客戶端請求
backend: 后端配置
定义后端分配的規則,與後端服務器交互
listen: 绑定配置
直接将指定的客户端与后端特定服务器绑定到一起
它在manyuser下的應用
shadowsocks-manyuser往往有大量用戶,需要監聽大量的端口用於轉發。我寫了一個python腳本來輸出這個配置文件。
__author__ = 'touko'
# -*- coding: utf-8 -*-
#!/usr/bin/python
def blockFunc( portNumber1, portNumber2, domainName ):
portNumber1 = str(portNumber1)
portNumber2 = str(portNumber2)
listAdd('frontend ss-in-' +portNumber1)
listAdd(' bind *:' +portNumber1)
listAdd(' default_backend ss-out-' +portNumber1)
listAdd('backend ss-out-' +portNumber1)
listAdd(' server server1 ' +domainName+ ':' +portNumber2+ ' maxconn 20480')
listAdd(' ')
#return sStr
def listAdd( sStr ):
blockList.append(sStr)
return sStr
#values
blockList = []
targetDomainName = raw_input("Enter your target domain: ")
listenPortStart = raw_input("Enter your first listening port: ")
forwardPortStart = raw_input("Enter your first forwarding port: ")
numbers = raw_input("Enter your port numbers: ")
#values end
defaultStr = '''global
ulimit-n 51200
defaults
log global
mode tcp
option dontlognull
timeout connect 1000
timeout client 150000
timeout server 150000
'''
listAdd(defaultStr)
for i in range(0, int(numbers) ):
blockFunc( int(listenPortStart) + i, int(forwardPortStart) + i, targetDomainName )
outputStr = '\n'.join(blockList)
print outputStr
outputFileName = raw_input("save file name [default : haproxy.cfg]: ")
if outputFileName == '' :
outputFileName = 'haproxy.cfg'
fi = open( outputFileName, 'w')
fi.write( outputStr )
fi.close( )
負載均衡
haproxy本應該是個負載均衡的軟件,僅僅拿來拿來做轉發數據包,是否顯得大材小用了?我閱讀了官方文檔,發現可以給backend添加多個服務器。在服務器後面加上相同的weight『權重』即可。
像這樣
server server1 US_VPS_IP1:8388 maxconn 20480 weight 3
server server2 US_VPS_IP2:8388 maxconn 20480 weight 3
這樣就是一個可以轉發數據包又能實現負載均衡的代理啦。不僅如此,還可以方便的控制用戶連接設備的數量~
- 上一篇: 再見,我的競賽生涯
- 下一篇: 使用.htaccess給網站加上訪問權限控制