多级代理中获取客户端真实IP
日志的格式
nginx中常用日志格式配置如下:
其中的main为日志格式的别名,在使用的时候直接使用别名即可。
例子:
日积月累下,日志文件会越来越大,日志文件太大严重影响服务器效率,所以需要定时对日志文件进行切割。
由于这里是演示,所以切割方式是按分钟来切割,正常生产上使用一般是按天来进行分割:
然后添加定时任务:
获取客户端真实IP
服务器资源分配情况如下:
10.1.9.98:充当客户端 10.0.3.137:一级代理 10.0.4.105:二级代理 10.0.4.129:三级代理 10.0.4.120:服务器端,为了方便,这里使用一个nginx充当服务器端,正常情况下一般是一个web服务器,如tomcat。各个服务初始配置如下:
10.0.3.137的配置:
10.0.4.105的配置,其他配置与10.0.3.137的一致:
10.0.4.129的配置,其他配置与10.0.3.137的一致:
10.0.4.120的配置,其他配置与10.0.3.137的一致
下面的记录为access.log中打印的结果:
操作 10.0.3.137 10.0.4.105 10.0.4.129 10.0.4.120 10.1.9.98访问curl http://10.0.3.137 10.1.9.98 – – – – 10.0.3.137 – – – – 10.0.4.105 – – – – 10.0.4.129 – – – – 10.0.3.137开启X-Forwarded-For 10.1.9.98 – – – – 10.0.3.137 – 10.1.9.98 – – 10.0.4.105 – 10.1.9.98 – – 10.0.4.129 – 10.1.9.98 – – 10.0.4.105开启X-Forwarded-For 10.1.9.98 – – – – 10.0.3.137 – 10.1.9.98 – – 10.0.4.105 – 10.1.9.98, 10.0.3.137 – – 10.0.4.129 – 10.1.9.98, 10.0.3.137 – – 10.0.4.129开启X-Forwarded-For 10.1.9.98 – – – – 10.0.3.137 – 10.1.9.98 – – 10.0.4.105 – 10.1.9.98, 10.0.3.137 – – 10.0.4.129 – 10.1.9.98, 10.0.3.137, 10.0.4.105 – – 10.1.9.98伪造头部访问curl http://10.0.3.137 -H ‘X-Forwarded-For: 1.1.1.1’ 10.1.9.98 – 1.1.1.1 – – 10.0.3.137 – 1.1.1.1, 10.1.9.98 – – 10.0.4.105 – 1.1.1.1, 10.1.9.98, 10.0.3.137 – – 10.0.4.129 – 1.1.1.1, 10.1.9.98, 10.0.3.137, 10.0.4.105 – – 10.0.3.137开启X-Real-IP 10.1.9.98 – – – – 10.0.3.137 – 10.1.9.98 – 10.1.9.98 10.0.4.105 – 10.1.9.98, 10.0.3.137 – 10.1.9.98 10.0.4.129 – 10.1.9.98, 10.0.3.137, 10.0.4.105 – 10.1.9.98 10.0.4.105开启X-Real-IP 10.1.9.98 – – – – 10.0.3.137 – 10.1.9.98 – 10.1.9.98 10.0.4.105 – 10.1.9.98, 10.0.3.137 – 10.0.3.137 10.0.4.129 – 10.1.9.98, 10.0.3.137, 10.0.4.105 – 10.0.3.137 10.0.4.129开启X-Real-IP 10.1.9.98 – – – – 10.0.3.137 – 10.1.9.98 – 10.1.9.98 10.0.4.105 – 10.1.9.98, 10.0.3.137 – 10.0.3.137 10.0.4.129 – 10.1.9.98, 10.0.3.137, 10.0.4.105 – 10.0.4.105 10.1.9.98伪造头部访问 curl http://10.0.3.137 -H ‘X-Real-IP: 8.8.8.8’ 10.1.9.98 – – – 8.8.8.8 10.0.3.137 – 10.1.9.98 – 10.1.9.98 10.0.4.105 – 10.1.9.98, 10.0.3.137 – 10.0.3.137 10.0.4.129 – 10.1.9.98, 10.0.3.137, 10.0.4.105 – 10.0.4.105总结:
X-Forwarded-For是一个追加的过程,后面的代理会把前面代理的IP追加到X-Forwarded-For尾部,用逗号进行分隔。 应用服务器(10.0.4.120)无法从X-Forwarded-For中获取到与它直连的代理服务器的IP(10.0.4.129),此时我们可以使用r e m o t e a d d r ( 远 程 i p , 表 示 直 连 的 那 台 代 理 ) 。 当 服 务 器 无 法 过 remote_addr(远程ip,表示直连的那台代理)。当服务器无法过remote addr(远程ip,表示直连的那台代理)。当服务器无法过http_x_forwarded_for获得上级代理或者客户端的ip时(可能没有经过代理),应该使用$remote_addr。 在代理过程中至少有一个代理设置了X-Forwarded-For,否则后面的代理或者应用服务器无法获得相关信息。 X-Forwarded-For中虽然包含了真实的客户端IP,一般是第一个IP,但是如果客户端伪造了请求头,那么真实的客户端IP就不是第一个了。 HTTP中header里面的X-Real-IP只是一个变量,后面的设置会覆盖前面的设置,所以只需要在第一个代理服务器上设置proxy_set_header X-Real-IP $remote_addr即可,然后在应用端直接引用$http_x_real_ip就行。在java中,如果请求没有经过nginx代理,可以使用如下方法获取客户端的真实IP:
如果请求经过了nginx代理,可以从请求头中获取(前提是必须正确配置nginx才能获取到):
如果是用的其他Apache,Squid等反向代理软件,同样是从请求头中获取真实IP,只是属性名不一样而已。
到此这篇关于项目中Nginx多级代理是如何获取客户端的真实IP地址的文章就介绍到这了,更多相关Nginx多级代理获取客户端真实IP内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!
原文链接:https://morris131.blog.csdn.net/article/details/108991869