端口轉發和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腳本來輸出這個配置文件。

托管於Github

__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

這樣就是一個可以轉發數據包又能實現負載均衡的代理啦。不僅如此,還可以方便的控制用戶連接設備的數量~

标签: shadowsocks, manyuser, haproxy, transfer, proxy