繁体   English   中英

Node.js:快速设置 CloudFront 的“信任代理”

[英]Node.js: Express set the “trust proxy” for CloudFront

我在AWS Cloudfront后面有一个Express后端。 如何正确设置 AWS Cloud Front 的信任代理

app.set('trust proxy', function (ip) {
  if ( ???????????? ) return true; // trusted IPs
  else return false;
});

AWS Cloudfront 使用大量 ip 地址并且不安全验证所有 AWS ip 地址,因为任何拥有 AWS EC2 实例的人都拥有有效的 IP。

问题

正如您提到的,AWS CloudFront 使用一长串 IP 地址范围 他们的文档中提到了这一点 您可以通过这一行来查看它们( source ,需要jq ,您可以从 MacOs 中的brew获得。):

curl 'https://ip-ranges.amazonaws.com/ip-ranges.json' | jq -r '.prefixes[] | select(.service=="CLOUDFRONT") | .ip_prefix'

(更新:或直接来自http://d7uri8nf7uskq.cloudfront.net/tools/list-cloudfront-ips ,如他们的文档中所述。)

现在,2021 年 4 月,它给了我 122 个范围。

解决方案

您可以在 Node 中对该文件进行 AJAX 调用,解析 JSON 文件,将列表作为字符串数组 ( cloudFrontIps ),然后将其传递给app.set('trust proxy', ['loopback', ...cloudFrontIps])

好消息!

好消息是其他人已经做到了! 检查https://github.com/nhammond101/cloudfront-ip-ranges

最后的笔记

  1. 很明显,但值得一提的是,以异步方式获取此列表,所以。 您可能希望延迟(例如await )您的应用程序启动,直到此列表可用。 但这不是必须的——在 HTTP 服务器启动后调用app.set应该可以工作,认为在短时间内您将记录 CloudFront 的 IP。
  2. 您可能希望调用此文件并定期获取新列表。 package 建议每 12 小时使用一次setTimeout
  3. 我的理解是在正在运行的服务器上调用app.set将使新列表立即适用于未来的调用,而无需重新启动。 对每个请求如何检查X-Forward-For以及app.set如何在调用时调用compileTrust function获得了这种印象。 所以,TL;DR:您不需要每 12 小时重新启动一次服务器!
  4. 我查看了 express 的代码,似乎app.set每次调用它时都会覆盖(而不是附加)列表。 因此,如果您有自己的一些 IP(例如 AWS ELB 中的VPC's CIDR ),则每次在setTimeout中调用此app.set时,都必须手动将其添加到列表中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM