http - x-forwarded-for 是否应该在 https 流量中包含代理?

标签 http ssl https proxy

我在代理/负载平衡器后面有一个网络服务器集群。该代理包含我的 SSL 证书并将解密的流量交给 Web 服务器,并在此过程中将“x-forwarded-for” header 添加到 Web 应用程序接收的 HTTP header 中。此应用程序在过去十年中看到了 数百万 个 IP 地址,但今天发生了一些奇怪的事情。

我第一次看到包含第二个地址的 x-forwarded-for 到达应用程序 [地址已更改]:

 x-forwarded-for: 62.211.19.218, 177.168.159.85

这表明流量来自代理,我知道这对于 x-f-f 来说是正常的。我原以为使用 https 作为协议(protocol)这是不可能的(或者至少不太可能)。

谁能解释一下这是怎么回事?

最佳答案

根据 RFC 7239 ,此 HTTP header 指定为

X-Forwarded-For: client, proxy1, proxy2, ...

其中 client 是原始客户端的 IP,然后每个代理在列表末尾添加它收到请求的 IP。在上面的示例中,您会在网络服务器中看到 proxy3 的 IP,而 proxy2 是连接到 proxy3 的 IP。

由于任何人都可以在此 header 中放入任何内容,因此您应该只接受来自已知来源的内容,例如您自己的反向代理或已知合法代理的白名单。例如 Apache 有 mod_rpaf,它透明地将客户端 IP 地址更改为此 header 中提供的地址,但前提是从已知代理服务器的 IP 接收到请求。

在公司网络上,您可以轻松地对 HTTPS 流量进行透明代理,而不会引起普通用户的注意。只需创建您自己的证书颁发机构,例如使用 Windows 组策略在所有公​​司工作站上安装并信任此 CA。然后将所有 HTTPS 连接重定向到您的代理,代理将为所有访问过的域动态生成证书。这是正在发生的事情,您甚至可以使用这种方法购买企业硬件代理。

所以总结一下您可以在 X-Forwarded-For header 中看到多个 IP 的原因:

  1. 如上所述的透明 HTTPS 代理
  2. 无论出于何种原因,请求者自己(浏览器、wget、脚本)添加了 header ,例如隐藏自己的 IP
  3. 如果使用 Cloudflare 等 CDN,可以添加该 header
  4. 有意或无意定义了多个反向代理

结论:如果这个 header 来自您自己的代理,您应该只信任它(如果有多个 IP,只信任最后一个)。

关于http - x-forwarded-for 是否应该在 https 流量中包含代理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30811131/

相关文章:

Java amazonS3.generatePresignedUrl - 如何配置 https ://s3. amazonaws.com/mycompany 而不是 https ://mycompany. s3.amazonaws.com/com.mycompany

客户端证书失败并使用 curl 的 GIT

C# HttpWebRequest.GetResponse - StatusCode 用法是如何处理非异常响应与 webexception 响应的?

ajax - HTTP 并行请求和 AJAX/轮询

java - "java.net.SocketTimeoutException: connect timed out"我的客户端无法调用网络服务

ssl - java.security.spec.InvalidKeySpecException : does not support java. security.spec.ECPublicKeySpec 的原因是什么?

Git 克隆在 Linux VM 上对 HTTPS 进行故障转移(膨胀 : Data Stream Error)

security - SSL:如何平衡 API 性能与安全性?

http - 想远程停止http服务器

java - HttpGet 添加 header