站点图标 Madlax的杂物房

Nginx转发获取客户端真实IP

反向代理相信大家都不陌生,假设要在真实服务器需要做一些区域分析,频率限制等等,就需要拿到真实的请求用户的IP。在4层转发里面,可以通过TOA的方式。在7层转发里面,可以通过头部信息获取(Nginx也可以转发$remote_addr)。

准备环境

如下图所示,在测试环境模拟一个Http请求经过反向代理服务器的过程,观察一下获取真实IP的情况。

用的是Nginx作为反向代理服务器,后端用php展示获得的头部信息。一般来说用X-Forwarded-For ,X-Real-IP这两个头部信息和$remote_addr变量来获取真实IP。

具体的配置如下:

测试过程

real_ip_header X-Forwarded-For;
set_real_ip_from  192.168.50.0/24;
real_ip_recursive off; 

1) 在默认情况下(反代都没有添加头部信息),真实服务器获取客户IP,$remote_addr为最后一台反向代理服务器的IP。此时 X-Forwarded-For 为空值。

2) 对比过程2和3可知, X-Forwarded-For 为数组,后面的反代服务器会把前面的反代服务器IP添加到里面,中间是逗号分隔。

3) 对比过程3和4可知,$remote_addr会被后面的反代服务器吧IP换掉。

4) 由过程5和6可知,由real_ip_header 指定头部可以让$remote_addr获取到真实IP。set_real_ip_from 表示哪些为反向代理的IP,可以用IP(段)表示。real_ip_recursive 表示是否从后递归解析,用于排除set_real_ip_from里面的IP(段)。

$remote_addr 变量,指请求的IP,就是tcp握手那个

$proxy_add_x_forwarded_for 变量,指客户端请求头“X-Forwared-For”这个字段,其中附加了$ remote_addr变量,以逗号分隔。 如果客户端请求标头中不存在“X-Forwarded-For”字段,则$ proxy_add_x_forwarded_for变量等于$ remote_addr变量。用最简单的方法来表示就是:$proxy_add_x_forwarded_for =$http_x_forwarded_for + ‘,‘+$ remote_addr

$http_x_forwarded_for变量,指客户端请求头中的 “X-Forwared-For” 这个字段。

$http_x_real_ip变量,指客户端请求头中的 “X-Real-IP” 这个字段。X-Real-IP就是一个自定义的变量名字,习惯性用法。

伪造头部

在刚刚的过程6的环境中,我们在客户端使用curl命令伪造头部:

# curl -H "Host: www.bcsama.top" -H "X-Forwarded-For: 1.1.1.1" -H "X-Real-IP: 2.2.2.2" http://192.168.50.60
HTTP_X_FORWARDED_FOR -> 1.1.1.1, 192.168.20.237, 192.168.50.60
HTTP_X_REAL_IP -> 192.168.20.237
REMOTE_ADDR -> 192.168.20.237

p.s. 用curl命令得到的结果, X-Forwarded-For 数组顺序为从左到右。

小结


摘自:https://www.bcsama.top/archives/95/

退出移动版