目前很多Web 应用(例如获取用户所在地区,基于 IP 做访问频率控制,禁止某些IP访问等等),为了获取用户真正的 IP,从 HTTP 请求头中获取 IP地址。这些情况下,必须确保获取到的IP地址是真实可靠的。
经过前面的分析和测试,
1.对于直接使用的 Web 应用,必须使用从TCP连接中得到的 Remote Address,才是用户真实的IP;
2.对于使用 nginx 反向代理服务器的Web应用,nginx必须使用Remote Address正确配置set Headers,后端服务器则使用nginx传过来的相应IP地址作为用户真实IP;同时,后端服务器应使用X-Real-IP 或 X-Forwarded-For最后1段IP作为限制,允许自己的nginx服务器访问,禁止其它IP访问,禁止对外提供服务。
上面这解决原理很容易百度到,然后下面是实操;
第一点的解决办法就不用说了,重点说下第二点;
nginx 代理配置加段话 proxy_set_header X-Real-IP $remote_addr;
java获取就String ipAddress = request.getHeader("X-Real-IP");
proxy_set_header X-Real-IP $remote_addr;这个是表示在请求头新增参数X-Real-IP,并且把请求的客户端ip放进去;这里需要注意的是如果有经过多层Nginx代理,例如:
Nginx1->nginx2 ->各个服务;nginx2有配置X-Real-IP,这样的话服务里获取到的X-Real-IP是Nginx1所在的那个服务的ip地址来的,所以正确的是第一层的nginx加上proxy_set_header X-Real-IP $remote_addr; 而后面的nginx就不要加这配置了;