Javascript Node.js:Express为CloudFront设置“信任代理”
我有一个后端。如何正确设置AWS云端:Javascript Node.js:Express为CloudFront设置“信任代理”,javascript,node.js,amazon-web-services,express,amazon-cloudfront,Javascript,Node.js,Amazon Web Services,Express,Amazon Cloudfront,我有一个后端。如何正确设置AWS云端: 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地址范围。有人
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地址范围。有人提到过。您可以通过这一行代码看到它们,需要jq,您可以从MacOs中的brew获得jq:
卷曲'https://ip-ranges.amazonaws.com/ip-ranges.json“|jq-r”.prefixes[]| select.service==CLOUDFRONT |.ip_prefix”
更新:或直接从前面提到的
现在,2021年4月,它给了我122个范围
解决方案
您可以在节点中对此文件进行AJAX调用,解析JSON文件,以字符串cloudFrontIps数组的形式获取列表,并将其传递给app.set'trust proxy',['loopback',…cloudFrontIps]
好消息!
好消息是已经有人做了!退房
最后说明
很明显,但值得一提的是,异步获取此列表!因此,您可能需要延迟,例如等待应用程序启动,直到此列表可用。虽然这不是必须的,但在HTTP服务器启动后调用app.set应该可以工作,因为在短时间内您将记录CloudFront的IP。
您可能希望调用此文件并定期获取新列表。软件包建议每12小时使用setTimeout。
我的理解是,在运行的服务器上调用app.set将使新列表立即适用于未来的调用,而无需重新启动。我是通过X-Forward-For的方式以及app.set在其调用中的方式得到这种印象的。因此,TL;DR:你不需要每隔12小时重新启动一次服务器!
我看了一下express的代码,似乎app.set会覆盖列表,而不是每次调用时都附加列表。因此,如果您有自己的IP,例如AWS ELB中的VPC的CIDR,则每次在setTimeout中调用此app.set时,您必须手动将其添加到列表中。
您可以添加一个