获取请求的客户端IP地址而不是Cloudflare的IP地址

13

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

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


尝试这个:https://support.cloudflare.com/hc/en-us/articles/200170706-How-do-I-restore-original-visitor-IP-with-Nginx- - roryrjb
你是通过套接字连接吗? - Nick Duncan
@roryrjb 已经尝试过了,对我没用。不管怎样,谢谢! - Michiel
2个回答

24

Cloudflare会在每个请求中设置CF-Connecting-IPX-Forwarded-For

您可以从他们的特殊标头中轻松获取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返回的IP是:2a02:1810:9410:7b00:8829:fc7f:b81f:10f。您知道这是什么吗? - Michiel
一个IPv6地址。 - Luca Kiebel
如果我使用 req.body.remoteAddress,那么它就是一个ipv4地址。在Nodejs中有没有一种方法可以检查响应是ipv4还是ipv6? - Michiel
2
这样做不会让你暴露在来自 Cloudflare 以外的连接的欺骗攻击中吗?因此,Cloudflare 建议仅限制连接来自他们的 IP:https://support.cloudflare.com/hc/en-us/articles/200170786-Restoring-original-visitor-IPs - ewall
@ewall 确定只需要通过 Cloudflare 连接,那么您就不需要寻找其他 IP 地址。我已经相应地编辑了答案,谢谢。 - Luca Kiebel
显示剩余4条评论

1

您正在使用Express吗?如果是的话,您可以使用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的trust proxy设置

例如:

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

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


可以用于第三方网站请求,我还将自己的网站添加到了该网站中,并从req.cf_ip返回了这个IP地址:2a02:1810:9410:7b00:8829:fc7f:b81f:10f,你知道这是什么吗? - Michiel
@Michiel,IPv6地址,我非常讨厌它们 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接