• Nginx CloudFlare 客户端真实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();
    		}
    	}
    }
    
    
  • 相关阅读:
    索引的实现:B+树
    SQL Server 查
    SQL Server 增、删、改、小部分查
    最最最最最基础的SQL Server
    三大范式
    SQLserver数据类型
    第一阶段项目
    2017.10.17一阶段项目心得
    jquery&bootstrap
    国庆小长假结束后的一阶段小测验
  • 原文地址:https://www.cnblogs.com/develon/p/10816068.html
Copyright © 2020-2023  润新知