天天看點

lvs 負載均衡fullnat 模式clientip 怎樣傳遞給 realserver

    關于LVS和FULLNAT的介紹可以看一下 淘寶吳佳明(普空)的視訊  http://blog.aliyun.com/1750 ,

FULLNAT模式很大簡化了LVS的配置和部署,目前淘寶和百度基本上都在使用FULLNAT模式來作為接入側的

負載均衡模式.

        百度的LVS叫做BVS, Baidu Virtual Server, 是在LVS基礎上修改的增加了L3 Though 和

SYN Porxy,貌似也是吳佳明(普空)在百度搞的, 類似FULLNAT 項目.

        下面的圖來自吳佳明(普空)的PPT, 自己重畫了一遍,關于NAT和FULLNAT的差別如下圖所示:

lvs 負載均衡fullnat 模式clientip 怎樣傳遞給 realserver

         看完上圖後發現 FULLNAT有一個問題是:RealServer無法獲得使用者IP;淘寶通過叫TOA的方式解決的,

主要原理是:将client address放到了TCP Option裡面帶給後端RealServer,RealServer收到後儲存在socket

的結構體裡并通過toa核心子產品hook了getname函數,這樣當使用者調用getname擷取遠端位址時,傳回的是保

存在socket的TCPOption的IP. 百度的BVS是通過叫ttm子產品實作的,其實作方式跟toa基本一樣,隻是沒有開源.

 實作原理圖如下:

lvs 負載均衡fullnat 模式clientip 怎樣傳遞給 realserver

lvs側在TCP封包的選項中插入clientip代碼:  tcp_fnat_in_handler()

lvs 負載均衡fullnat 模式clientip 怎樣傳遞給 realserver

RS側收到建連封包時,取出toa裡面的client ip和port 存放在socket的use_data裡,toa.c

lvs 負載均衡fullnat 模式clientip 怎樣傳遞給 realserver

HOOK挂載:

lvs 負載均衡fullnat 模式clientip 怎樣傳遞給 realserver

當應用層調用getpeername() 或者 getsocketname() 時,會進入到inet_getname_toa,如果存在toa資訊則将

socket裡存放的真是的clientip 傳回給應用層。

      本文轉自Tenderrain 51CTO部落格,原文連結:http://blog.51cto.com/tenderrain/1982335,如需轉載請自行聯系原作者

繼續閱讀