1. 程式人生 > >LVS FULLNAT模式下客戶端真實地址的傳遞

LVS FULLNAT模式下客戶端真實地址的傳遞

在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
struct toa_data
{
    __u8   opcode;
    __u8   opsize;
    __u16  port;
    __u32  ip;
}

比如,TOA的OPTION為:

1
fe 08 91 cd 0a 05 0c 46

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
/* module init */
static int __init
toa_init(void)
{
    ...
    /* hook funcs for parse and get toa */
    hook_toa_functions();
    TOA_INFO("toa loaded\n");
    return 0;
err:
    ...
    return 1;
}

函式呼叫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
/* replace the functions with our functions */
static inline int
hook_toa_functions(void)
{
    /* hook inet_getname for ipv4 */
    struct proto_ops *inet_stream_ops_p =
            (struct proto_ops *)&inet_stream_ops;
    /* hook tcp_v4_syn_recv_sock for ipv4 */
    struct inet_connection_sock_af_ops *ipv4_specific_p =
            (struct inet_connection_sock_af_ops *)&ipv4_specific;
    ...
    inet_stream_ops_p->getname = inet_getname_toa;
    ...
    ipv4_specific_p->syn_recv_sock = tcp_v4_syn_recv_sock_toa;
    ...
    return 0;
}

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
static struct sock *
tcp_v4_syn_recv_sock_toa(struct sock *sk, struct sk_buff *skb, struct request_sock *req, struct dst_entry *dst)
{
    struct sock *newsock = NULL;
    /* call orginal one */

            
           

相關推薦

LVS FULLNAT模式客戶真實地址傳遞

在LVS的FULLNAT轉發模式下, LVS對資料包同時做SNAT和DNAT,將資料包的源IP、源埠更換為LVS本地的IP和埠,將資料包的目的IP和目的埠修改為RS的IP和埠,從而不再依賴特定網路拓樸轉發資料包。 這種方式存在一個問題: RealServer中接收到資料包中源IP和源埠為LVS機

virtualbox_NAT模式客戶Xshell連結主機

一、主機不能上網情況 1.設定虛擬機器網路為NAT模式(網路地址轉換) 2.開啟虛擬機器內的ssh服務 service sshd restart //服務開啟命令 3.檢視主機IP地址

Nginx在多層代理獲取真實客戶IP地址

最近在研究nginx中如何獲取真實客戶端IP的方法。眾所周知,在編譯Nginx時,可通過新增http_realip_module模組來獲取真實客戶端IP地址。何為真實IP地址呢?請看下圖,既獲取到的真實客戶端IP是101,既不是正向代理服的104,也不是反向代理的105。

配置lvs nat模式real server服務器lvsrs腳本

linux lvs nat real server 配置因為lvs nat模式下,只有入站方向的流量經過lvs服務器,出站流量直接由Real server服務器響應,所以Real Server服務器必須做相應的配置才能響應客戶數據包,即修改Real server做負載均衡時回包的源地址要改為VIP,另外要修改

獲取客戶真實ip地址

String ip = request.getHeader("x-forwarded-for"); if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = request.getHeader("

Java獲取客戶真實IP地址的兩種方法

在JSP裡,獲取客戶端的IP地址的方法是:request.getRemoteAddr(),這種方法在大部分情況下都是有效的。但是在通過了Apache,Squid等反向代理軟體就不能獲取到客戶端的真實IP地址了。     如果使用了反向代理軟體,將http://192.168

如何獲取客戶真實ip地址

    在專案中需要獲取客戶端的真實IP地址,原本使用的是request.getRemoteAddr(),後來釋出到伺服器上時發現取到的值一直是127.0.0.1      原因是,在部署時用了nginx進行反向代理,(小插曲:配nginx的時候一定要記得配 X-Real-I

Java獲取客戶真實IP地址

1、我們一般在程式開發時,總會用到這種獲取訪問者IP的功能,以便記錄客戶端的登入和訪問行為。一般情況下,我們可以使用 request 的 getRemoteAddr() 方法獲取客戶端實際 IP ,但是 Nginx 使用反向代理後,我們使用 getRemo

php獲取客戶真實ip地址的三種方法

php獲取使用者(客戶端)真實IP地址的兩種方法 第一種方法,還算靠譜,本人以前一直用的是這個方法: function get_real_ip(){ $ip=false; if(!empty($_SERVER['HTTP_CL

【ASP介面開發】獲取訪問URL的真實客戶IP地址

目前專案中需要獲取到訪問介面的客戶端的真實IP,暫時用此做一個簡單的認證。在網上搜了個還算靠譜的,特做下記錄: public strIP if strIP="" then strIP="" '如果沒有定義 strIP 全域性變數則定義它 function getIP()

ASP如何獲取客戶真實IP地址

在ASP中使用 Request.ServerVariables("REMOTE_ADDR") 來取得客戶端的IP地址,但如果客戶端是使用代理伺服器來訪問,那取到的就是代理伺服器的IP地址,而不是真正的客戶端IP地址。要想透過代理伺服器取得客戶端的真實IP地址,就要使用 Request.ServerVaria

nginx做負載均衡 tomcat獲得客戶真實ip

需要 項目 參考 real nginx代理 x-real-ip 發現 百度 通過 因項目需要做tomcat2臺機器的負載均衡,配置好負載環境後,發現tomcat的日誌一律是我前置nginx代理服務器的ip 通過百度教材發現需要修改nginx的配置文件,修改代理頭信息,傳遞

LVS DR模式的集群實現步驟

lvs dr模式下的集群實現步驟1.安裝Linux服務器,做為虛擬服務器(DR)2.配置網絡環境,設置靜態IP,並能夠訪問互聯網3.檢查ipvsadm是否安裝,如果沒有安裝請先安裝ipvsadmrpm -ql ipvsadm4.安裝ipvsadmrpm -y install ipvsadm5.設置虛擬IPif

nginx反向代理後web服務器記錄客戶ip地址

spa gin nginx反向代理 lan form https 記錄 客戶端訪問 use nginx在做反向代理的時候,後端的nginx web服務器log中記錄的地址都是反向代理服務器的地址,無法查看客戶端訪問的真實ip。 在反向代理服務器的nginx.conf配置文件

PHP獲取客戶IP地址,服務器IP地址

客戶端 get sse spa gets static p地址 tip sta ============================================獲取客戶端IP==============================================

php獲取客戶mac地址

pre -a 結果 array serve str bre val log exec(‘/sbin/arp -a 2>&1‘, $array, $return_val);dump($array);$mac = ‘‘;foreach($array as $val

前後分離開發模式質量的保證 —— 單元測試

ats 閱讀 寫代碼 pen 介紹 最大 lose 基礎 每天 概述   在今天, 前後端分離已經是首選的一個開發模式。這對於後端團隊來說其實是一個好消息,減輕任務並且更專註。在測試方面,就更加依賴於單元測試對於API以及後端業務邏輯的較驗。當然單元測試並非在前後端分離流

獲取客戶IP地址

type 數字 fun xpl func ram server ip地址 p地址 /** * 獲取客戶端IP地址 * @param integer $type 返回類型 0 返回IP地址 1 返回IPV4地址數字 * @param boole

nginx代理,tomcat部署服務器,後獲取客戶真實ip

nginx代理 獲取真實ip 1、環境部署說明後端部署在tomcat服務器上,前端用nginx做代理訪問tomcat部署目錄nginx配置:upstream wcfront{ server localhost:8991;//後臺接口 } server { listen

首層nginx 傳遞 二級代理nginx 客戶真實IP的方法

add 方法 5.1 pro rom bsp AD ade real-ip 首層nginx:先獲取真實IP($remote_addr),再將真實IP傳遞給X-Forwarded-For proxy_set_header X-Real-IP $remote_addr;