【发布时间】:2021-01-05 23:39:12
【问题描述】:
期望的行为
在启用了 Cloudflare 并设置了 app.set('trust proxy', true) 的 Node/MongoDB/Azure 环境中,通过 req.ip 获取用户的 IP 地址。你可以看到the node docs on this setting here。
实际行为
行为不一致,有时req.ip会返回想要的值,例如用点分隔的4个值:
123.456.789.10
有时它会返回这样的值,例如用冒号分隔的 8 个值:
2001:5005:1802:3500:18d2:k446:123b:g5h4
以上数值仅供参考
此外,我正在从两个位置捕获 IP,首先是从 req.ip 服务器端,其次是从 ajax 请求到 ipinfo.io 客户端。我使用req.ip 以防ipinfo.io 查找失败。
所以在某些情况下,ipinfo.io 将以预期格式返回一个值,而 req.ip 将以意外格式返回一个不同的值。我希望这些值保持一致/相同。
我的尝试/上下文
我在 node.js 服务器文件中使用app.set('trust proxy', true) 的原因是该站点启用了 Cloudflare,我需要获取用户的实际 IP 地址。我正在使用两个基于 IP 地址和时间应用限制的速率限制器包 - 例如 user1 可以每 5 分钟提交 3 个请求。因此,IP 地址需要是实际的请求者,而不是 cloudflare 代理。
使用的包有:
Express Rate Limit - 速率限制器逻辑
Rate Limit Mongo - 跟踪来自 MongoDB 中 IP 地址的请求的支持包
我在 Google 上搜索过 req.ip returning string with colons node.js 之类的内容,但结果似乎与 double colons 相关,而不是 single colons,例如:
Why is req.ip in node/Express returning colon separated IP addresses?
所以它们似乎不相关。
我还搜索了ip address formats 并发现了这个:
这似乎表明我看到的是一个 IPv6 地址。
问题
为什么同一用户从ipinfo.io(浏览器)和req.ip(服务器)返回的值不同?
为什么req.ip 为某些用户返回IPv4 地址,而为其他用户返回IPv6 地址?
我是否应该或可以让req.ip 返回格式一致的值,最好是 IPv4 格式,因为它更易于阅读,然后我的速率限制器 mongodb 条目看起来一致?
【问题讨论】:
标签: node.js mongodb express ip-address cloudflare