NginxCloudFlare客户端真实IP

由于 tomcat 被 Nginx 反向代理, 因此request.getRemoteAddr()只能获取到本地回环地址,
Nginx 提供了变量 $remote_addr, 可用于使用 proxy_set_header 设置头信息, 实现向上游的 tomcat 服务器提供远端客户端IP地址

proxy_set_header X-Real-IP $remote_addr; 

但是, 一旦使用了 cdn 的话, 这个地址就变成了 CDN 节点的地址, 并且同一个用户不同时间发出的IP都不一样.
CDN 通常会在 Header 中提供客户端真实IP, 如 CloudFlare 在 x-forwarded-for, cf-connecting-ip 中设置了此数据.

Nginx 提供了变量 $http_x_forwarded_for 用于获取 x-forwarded-for 的值, 因此可以在 Nginx 配置文件中为 X-Real-IP 设置以下两个值:

remote_addr http_x_forwarded_for 

它们分别代表了未使用 CDN 和使用了 CDN 的客户端真实IP.

# Nginx 配置实现

 #CloudFlare set $CDN "CloudFlare"; #set $CDN "NO"; # 如果未使用 CloudFlare, 则取消该行代码的注释 set $Real_IP $remote_addr; if ($CDN = "CloudFlare") { set $Real_IP $http_x_forwarded_for; } #设置代理 Header proxy_set_header Host $host; proxy_set_header X-Real-IP $Real_IP; ...... 

# 民间传说, 一个电信反代的 CF IP

104.25.183.205

这个IP的电信延迟非常低, 而且速度非常不错, 你懂的!

当自选该IP后, x-real-ip 也就是 x-forwarded-for 变成了 59.174.137.107,140.206.61.106
cf-connecting-ip 更是变成了被反代的 140.206.61.106

这种特殊情况应当被考虑.

所以我写了一个 static 方法, 用来从 HttpServlet 中获取 Real-IP:

package common; import javax.servlet.http.HttpServletRequest; /** * 系统工具 & 配置 */ public class Sys { private static final CDN cdn; private enum CDN { Nginx, CloudFlare, } static { cdn = CDN.Nginx; } public static String getRemoteIP(HttpServletRequest thiz) { switch (cdn) { case Nginx: return thiz.getHeader("X-Real-IP"); case CloudFlare: return thiz.getHeader("CF-Connecting-IP"); default: return thiz.getRemoteAddr(); } } } 

原创文章,作者:优速盾-小U,如若转载,请注明出处:https://www.cdnb.net/bbs/archives/30422

(0)
优速盾-小U的头像优速盾-小U
上一篇 2025年6月18日 18:42
下一篇 2025年6月18日 23:04

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

优速盾注册领取大礼包www.cdnb.net
/sitemap.xml