文章目录
- 获取客户端IP背景
- 如何获取客户端 IP
- IP 伪造
- 防范 IP 伪造
- 方法一:Nginx 配置
- 方法二:Tomcat 的 RemoteIpValve
- 方法三:Egg.js 的 maxProxyCount
获取客户端IP背景
分布式拒绝服务攻击(DDoS)和频繁请求的爬虫行为属于异常请求,通过分析 IP 地址可以检测出这些异常行为。
同时,在 Web 应用开发中,获取客户端 IP 地址也是常见的需求。例如,在投票系统中,为了防止刷票,需要限制每个 IP 地址只能投票一次,这就涉及到获取客户端真实 IP 的问题。
如何获取客户端 IP
在 Java 中,获取客户端 IP 最直接的方式是使用 request.getRemoteAddr()
。该方法在没有代理的情况下,可以直接获取连接服务器的客户端 IP。但是如今的 Web 应用通常不会直接将应用服务器对外开放,一般会有 Nginx 作为反向代理和负载均衡,有的甚至有多层代理。在这种情况下,直接使用 request.getRemoteAddr()
获取的 IP 地址会是代理服务器的 IP,而非真实客户端的 IP。
原因是:HTTP 协议基于 TCP 协议,request.getRemoteAddr()
默认获取的是 TCP 层直接连接的 IP,对于应用服务器来说,直接连接的是代理服务器(如 Nginx)。
为了获取真实客户端 IP,很多代