LVS FULLNAT模式下客戶端真實地址的傳遞
阿新 • • 發佈:2019-01-14
在LVS的FULLNAT轉發模式下, LVS對資料包同時做SNAT和DNAT,將資料包的源IP、源埠更換為LVS本地的IP和埠,將資料包的目的IP和目的埠修改為RS的IP和埠,從而不再依賴特定網路拓樸轉發資料包。
這種方式存在一個問題: RealServer中接收到資料包中源IP和源埠為LVS機器的IP和埠,這樣應用層程式獲取到的TCP連線的客戶端地址為LVS的IP地址,很多依賴客戶端地址的功能就不能正常工作了。
為了解決這問題,FULLNAT模式在轉發包的時候,在TCP包中新增一個OPTION,來傳遞客戶端的真實地址。RealServer中通過核心模組toa令應用層程式獲取真實的客戶端地址。
TOA OPTION的OPCODE為254(0xfe), 長度為8位元組,結構為:
1 2 3 4 5 6 7 |
|
比如,TOA的OPTION為:
1
|
|
0xfe為opcode, 08為option長度,8位元組,Port和IP都為網路位元組序,埠號為0x91cd(37325), IP為: 0x0a050c46, “10.5.12.70”。
來看toa模組具體實現:
模組的初始化函式為toa_init:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
|
函式呼叫hook_toa_functions函式HOOK兩個函式:
- inet_getname
- tcp_v4_syn_recv_sock
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
|
Linux核心在監聽套接字收到三次握手的ACK包之後,會從SYN_REVC狀態進入到TCP_ESTABLISHED狀態。這時核心會呼叫tcp_v4_syn_recv_sock函式。Hook函式tcp_v4_syn_recv_sock_toa首先呼叫原有的tcp_v4_syn_recv_sock函式,然後呼叫get_toa_data函式從TCP OPTION中提取出TOA OPTION,並存儲在sk_user_data欄位中。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
|