13.多級代理下Nginx透傳真實IP


1.基於代理(七層負載均衡)情況下 透傳客戶端的真實IP

環境:

10.0.0.5 proxy_node1 一級代理
10.0.0.6 proxy_node2 二級代理
10.0.0.7 proxy_node3 三級代理
10.0.0.8 webserver 真實節點
域名:ip.cheng.com 解析 --> 10.0.0.5

1.一級代理proxy_node1 Nginx配置如下:

[root@lb01 conf.d]# cat proxy_ip.cheng.com.conf 
server {
	listen 80;
	server_name ip.cheng.com;

	location / {
	proxy_pass http://10.0.0.6;
	proxy_http_version 1.1;
	proxy_set_header Host $http_host;
	proxy_set_header X-Real-IP $remote_addr;
	proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;	
	}
}

2.二級代理proxy_node2 Nginx配置如下:

[root@lb02 conf.d]# cat proxy_ip.cheng.com.conf 
server {
	listen 80;
	server_name ip.cheng.com;

	location / {
	proxy_pass http://10.0.0.7;
	proxy_http_version 1.1;
	proxy_set_header Host $http_host;
	proxy_set_header X-Real-IP $remote_addr;
	proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;	
	}
}

3.三級代理proxy_node3 Nginx配置如下:

[root@web01 conf.d]# cat proxy_ip.cheng.com.conf 
server {
	listen 80;
	server_name ip.cheng.com;

	location / {
	proxy_pass http://10.0.0.8;
	proxy_http_version 1.1;
	proxy_set_header Host $http_host;
	proxy_set_header X-Real-IP $remote_addr;
	proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;	
	}
}

4.WebServer Nginx配置如下:

[root@web02 conf.d]# cat proxy_ip.cheng.com.conf 
server {
	listen 80;
	server_name ip.cheng.com;
	root /code;

	location / {
	index index.php index.html;
	}

	location ~ \.php$ {
	fastcgi_pass 127.0.0.1:9000;
	fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
	include fastcgi_params;
	}
}

5.測試方式一,通過如下頁面獲取真實IP,或查看 phpinfo() 函數中的 HTTP_X_FORWARDED_FOR

[root@web02 code]# cat index.php 
<?php
	$ip = getenv("HTTP_X_FORWARDED_FOR");
	echo "X_FORWARDED_FOR: $ip";
?>

在這里插入圖片描述
6.測試方式二,通過查看日志測試
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述

2.Nginx RealIP獲取真實IP

使用nginx Realip_module獲取多級代理下的客戶端真實IP地址,在真實Web節點上配置,配置信息如下:

[root@web02 conf.d]# cat proxy_ip.cheng.com.conf 
server {
	listen 80;
	server_name ip.cheng.com;
	root /code;
	set_real_ip_from 10.0.0.5;
	set_real_ip_from 10.0.0.6;
	set_real_ip_from 10.0.0.7;
	real_ip_header   X-Forwarded-For;
	real_ip_recursive on;

	location / {
	index index.php index.html;
	}

	location ~ \.php$ {
	fastcgi_pass 127.0.0.1:9000;
	fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
	include fastcgi_params;
	}
}

最終結果是"10.0.0.1 - - "GET /index.php HTTP/1.1" 200 "10.0.0.5, 10.0.0.6"
10.0.0.5,10.0.0.6都出現在set_real_ip_from中,僅僅10.0.0.1沒出現,那么他就被認為是用戶的ip地址,同時會被賦值到 $remote_addr變量中。

獲取真實IP總結:
forwarded-for:可以獲取到用戶的真實IP地址。
nginx realip:程序無需改動,直接使用remote_addr變量即可獲取真實IP地址,但需要知道所有沿途經過的IP地址或IP段

在這里插入圖片描述


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM