【问题标题】:Get real IP address of a request instead of Cloudflare's IP address获取请求的真实 IP 地址而不是 Cloudflare 的 IP 地址
【发布时间】:2019-02-01 05:48:39
【问题描述】:

Cloudflare 会更改传入请求的 IP 地址,因为 Cloudflare 是我的网站和 Internet 之间的中间件,一个代理。

我应该如何获取请求的初始 IP 地址,而不是 Cloudflare 的 IP 地址。我听说过mod_cloudflare,但这个插件是否只更新我日志中的 IP 地址(?)而且我没有找到 NGINX 的版本。

【问题讨论】:

标签: javascript node.js nginx cloudflare


【解决方案1】:

Cloudflare 在每个请求上设置 CF-Connecting-IP and the X-Forwarded-For headers

您可以简单地从他们的特殊标头中获取 IP:

let ip = req.headers['cf-connecting-ip']

如果您期望 Cloudflare 之外的请求,您可以通过以下方式获取这些 IP:

let otherIp = req.headers['x-forwarded-for'] || req.connection.remoteAddress

不过,请注意,其他代理(例如 NGINX)也会设置 x-forwarded-for 标头。

【讨论】:

  • 适用于第三方网站请求,我还将自己的网站添加到网站,这是从 req.cf_ip: 2a02:1810:9410:7b00:8829:fc7f:b81f 返回的 IP :10f,知道这是什么吗?
  • 一个 IPv6 地址
  • 不,你不能将它们转换为 IPv4 地址,这是不同版本的互联网协议,习惯它们 ;-)
  • 如果我使用 req.body.remoteAddress 那么它是一个 ipv4 地址。 Nodejs中没有办法检查响应是ipv4还是ipv6?
  • 这不会让您暴露于来自未通过 Cloudflare 的连接的欺骗吗?因此 Cloudflare 建议限制来自其 IP 的连接:support.cloudflare.com/hc/en-us/articles/…
【解决方案2】:

您使用的是快递吗?如果是这样,您可以使用cloudflare-express 中间件包来检索您需要的 IP 地址。

var cloudflare = require('cloudflare-express');
...
var express = require('express');
var app = express();
...
app.use(cloudflare.restore({update_on_start:true}));

然后用户的原始地址在req 对象上显示为cf_ip

如果您的 express 应用位于典型的 nginx 反向代理之后,您也可以使用express's trust proxy setting

例如:

    app.set( 'trust proxy', 'loopback' ); //trust localhost reverse proxy

其他请求处理框架很可能有自己的包来做类似的事情。

【讨论】:

  • 适用于第三方网站请求,我还将自己的网站添加到网站,这是从 req.cf_ip: 2a02:1810:9410:7b00:8829:fc7f:b81f 返回的 IP :10f,知道这是什么吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-31
  • 2022-01-22
  • 1970-01-01
  • 2014-10-19
相关资源
最近更新 更多