簡體   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