使用ELB和Node防止X-Forwarded-For欺骗

6
我正在分析一个基于 Elastic Load Balancer 的公共路由堆栈,该路由堆栈打开了 PM2 所暴露的端口,并使用 koa 模块启动了一个 Node 应用程序。目前,IP 地址是记录在日志中的,这完全取决于 X-Forwarded-For 标头。如果使用 curl 手动创建此标头,则应用程序将其写入为 IP 地址。
有没有一种简单的方法来防止篡改此标头或设置 AWS 的 ELB 以忽略手动插入的标头?还是有比易受欺骗的标头更好的方法来获取访问者的真实 IP 地址?
2个回答

13
根据文档,如果一个客户端的请求已经包含了X-Forwarded-For头部,弹性负载均衡会将客户端的IP地址添加到头部值的末尾。在这种情况下,列表中的最后一个IP地址就是客户端的真实IP地址,因此最后一个IP地址总是真实的IP地址。

在公司的情况下,最后一个IP是伪造的IP,当调用koa的ctx.request.ip时返回。这是由AWS的ELB填充的,我认为可能会将最后一个X-Forwarded-IP(在这种情况下,它是伪造的)设置在数组的末尾。 - SomeGuyOnAComputer
2
也许koa会颠倒顺序?返回这些IP的数组,按照上游->下游的顺序排序 参考 - Gabriel Bleu
@SomeGuyOnAComputer,负载均衡器和代理服务器会将X-Forwarded-for附加到标准行为中。最右侧未知(对您而言)地址是您始终希望信任的客户端IP,而该地址左侧的任何内容都应被视为“信息性”(即如果直接上游对等方是实际提供此信息的代理,则可能有效,但可能被伪造)。 - Michael - sqlbot
这有点令人困惑,不是吗?如果请求不包含XFF头=客户端的真实IP是第一个条目(最左边;有ELB、CF等的IP);如果请求包含XFF头=客户端的真实IP是最后一个条目(最右边)。这是正确的吗? - Zdeněk
2
关于X-Forwarded-For没有普遍认可的标准,nginx与ELB相反。请参见:https://github.com/koajs/koa/issues/1094#issuecomment-345861282 - Ming
看起来这段文字已经从当前版本的 ELB 文档中删除了。 - Eric

1
文档中:
引用: ...负载均衡器将客户端IP地址附加到现有的标头并将标头传递给您的服务器。X-Forwarded-For请求标头可能包含多个以逗号分隔的IP地址。最左边的地址是最初发出请求的客户端IP地址。然后是任何后续的代理标识符,形成一个链。
第一个IP地址是正确的客户端IP地址。

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