博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
nginx反向代理下没有获取到正确的clientIP问题发散
阅读量:4478 次
发布时间:2019-06-08

本文共 2622 字,大约阅读时间需要 8 分钟。

问题背景:

在使用nginx服务器NginxA 来反向代理服务 WebAPIA,WebAPIA中要获取ClientIP,结果获取到的IP为NginxA的, 于是引出了以下的一连串概念。。。

首先使用XFF来解决proxy中的ClientIP的记录,同时具体了解一下正向与反向的区别。最后介绍正向代理Squid。

  • XFF
  • 正向代理&反向代理
  • 正向代理Squid

1. XFF

XFF:X-Forwarded-For。用于记录代理信息的,每经过一级代理(匿名代理除外),代理服务器都会把这次请求的来源IP追加在X-Forwarded-For。第一个则为真实客户端的地址。

EG:收到一个来自4.4.4.4的请求,header包含这样一行

X-Forwarded-For: 1.1.1.1, 2.2.2.2, 3.3.3.3

表示请求由1.1.1.1发出,经过三层代理,第一层是2.2.2.2,第二层是3.3.3.3,而本次请求的来源IP4.4.4.4是第三层代理

代码片段:java获取客户端真实IP

public class HttpInfoReader {    /**     * 获取当前网络ip     * @param request     * @return     */    public String getClientIPAddress(HttpServletRequest request){        String ipAddress = request.getHeader("x-forwarded-for");        if(ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {            ipAddress = request.getHeader("Proxy-Client-IP");        }        if(ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {            ipAddress = request.getHeader("WL-Proxy-Client-IP");        }        if(ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {            ipAddress = request.getRemoteAddr();            if(ipAddress.equals("127.0.0.1") || ipAddress.equals("0:0:0:0:0:0:0:1")){                //根据网卡取本机配置的IP                InetAddress inet=null;                try {                    inet = InetAddress.getLocalHost();                } catch (UnknownHostException e) {                    e.printStackTrace();                }                ipAddress= inet.getHostAddress();            }        }        //对于通过多个代理的情况,第一个IP为客户端真实IP,多个IP按照','分割        if(ipAddress!=null && ipAddress.length()>15){ //"***.***.***.***".length() = 15            if(ipAddress.indexOf(",")>0){                ipAddress = ipAddress.substring(0,ipAddress.indexOf(","));            }        }        return ipAddress;    }}

Ref:

  • 【X-Forwarded-For 和 X-Real-IP 的区别?】http://www.cnblogs.com/mypath/articles/5239687.html
  • 【 多级反向代理下,Java获取请求客户端的真实IP地址多中方法整合】http://blog.csdn.net/sgx425021234/article/details/19043459

2. 反向代理 & 正向代理

  • 正向:刚开始的时候,代理多数是帮助内网访问外网server用的,如HTTP代理——从内到外。
  • 反向:代理将来自外网的客户端client的请求,forward到内网server——从外到内。

Ref:

  • 【反向代理为何叫反向代理?】https://www.zhihu.com/question/24723688/answer/128105528

3. Squid是什么?

 Squid是一种用来缓冲Internet数据的软件。它是这样实现其功能的,接受来自人们需要下载的目标(object)的请求并适当地处理这些请求。也就是说,如果一个人想下载一web页面,他请求Squid为他取得这个页面。Squid随之连接到远程服务器(比如:http://squid.nlanr.net/)并向这个页面发出请求。然后,Squid显式地聚集数据到客户端机器,而且同时复制一份。当下一次有人需要同一页面时,Squid可以简单地从磁盘中读到它,那样数据迅即就会传输到客户机上。当前的Squid可以处理HTTP,FTP,GOPHER,SSL和WAIS等协议。但它不能处理如POP,NNTP,RealAudio以及其它类型的东西。

转载于:https://www.cnblogs.com/pengzhen/p/7509894.html

你可能感兴趣的文章
WCF服务端运行时架构体系详解[上篇]
查看>>
单点登录-系统搭建
查看>>
WPF动画应用-几何图形扩散动画
查看>>
Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第二十章:阴影贴图
查看>>
指定程序集的位置 | Microsoft Docs
查看>>
采用Opserver来监控你的ASP.NET项目系列(二、监控SQL Server与Asp.Net项目)
查看>>
AutoMapper在C#中的有趣应用
查看>>
asp.net core 系列 13 日志
查看>>
【HLSL学习笔记】WPF Shader Effect Library算法解读之[BandedSwirl]
查看>>
WPF TextBlock IsTextTrimmed 判断文本是否超出
查看>>
wpf中防止界面卡死的写法
查看>>
WPF中的Application类。
查看>>
PowerDesigner逆向工程导入MYSQL数据库总结(不容易,感谢前者们)
查看>>
WCF技术剖析之二十: 服务在WCF体系中是如何被描述的?
查看>>
IntelliJ IDEA 15 设置默认浏览器
查看>>
MVC5 + EF6 + Bootstrap3 (10) 数据查询页面
查看>>
【实战HTML5与CSS3】用HTML5和CSS3制作页面(上)
查看>>
Winform WebBrowser引用IE版本问题
查看>>
pdf转换word
查看>>
redis.1--SDS结构
查看>>