一个典型的WEB应用拓扑如下图。
client — proxy1 — proxy2 … proxyn — web server
由于client并不直接和Web server建立TCP连接,所以WEB server无法直接获得用户的IP,而Web server往往有根据用户IP进行访问控制策略的需求。所以,一个常用的解决方案是由代理服务器添加 X-Real-IP或X-Forwarded-For HTTP头字段,把client ip传递给Web server。在Web服务器端Nginx中引入ngx_http_realip模块获取client ip。
Nginx获取cleint ip的基本处理逻辑是,启用realip模块后将根据上游代理服务器传递过来的X-Real-IP、X-Forwarded-For(XFF)的值替换变量$remote_addr
。【原$remote_addr
是和nginx直接TCP连接的反向代理或CDN的IP】后继再根据$remote_addr
施加访问控制,如限流限速等。而原始$remote_addr
和$remote_port
则保存在$realip_remote_addr
和$realip_remote_port
中。
注:nginx缺省未使能realip模块,需要在编译时添加该模块,如:
./configure --with-http_realip_module
实验环境1:
client ---- server
192.168.31.21 【客户机】 192.168.31.133
192.168.31.133【本机】 192.168.31.133
核心配置:
server {
listen 80;
server_name test;
root html;
access_log logs/50_access.log main;
#set_real_ip_from 192.168.31.133;
set_real_ip_from 192.168.31.0/24;
#set_real_ip_from 4.4.4.0/24;
#set_real_ip_from 3.3.3.0/24;
#set_real_ip_from james;
#real_ip_header X-Real-IP;
real_ip_header X-Forwarded-For;
#real_ip_recursive off;
real_ip_recursive on;
location / {
return 200 "Client real IP:`$remote_addr,$realip_remote_addr`\n";
}
}