Node.js:快速为 CloudFront 设置 "trust proxy"

Node.js: Express set the "trust proxy" for CloudFront

我有一个用于 AWS Cloud Front 的 Express backend behind AWS Cloudfront. How properly set trust proxy

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

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

问题

如您所述,AWS CloudFront 使用一长串 IP 地址 范围 。它被提到 in their documenation. You can see them via this one liner (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 as mentioned in their doc。)

现在,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. 您可能希望调用此文件并定期获取新列表。该软件包每 12 小时建议一次,使用 setTimeout.
  3. 我的理解是在 运行 服务器上调用 app.set 将使新列表立即适用于以后的调用,而无需重新启动。我通过 X-Forward-For 在它的调用中如何 examined on every request, and how app.set is calling compileTrust function 得到这种印象。 所以,TL;DR:您不需要为此每 12 小时重新启动一次服务器!
  4. 我查看了 express 的代码,似乎 app.set 会在您每次调用时覆盖(而不是追加)列表。因此,如果您有自己的一些 IP(例如您在 AWS ELB 中的 VPC's CIDR),则每次在 setTimeout 中调用此 app.set 时都必须手动将其添加到列表中。