amazon-cloudfront - 如何通过CloudFront获取请求的客户端IP?

标签 amazon-cloudfront

根据CloudFront的文档
(https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/RequestAndResponseBehaviorCustomOrigin.html),客户端IP可以是X-Forwarded-For header 的前端,中间,结尾。

严厉吗?那我该如何获得真实的客户端IP?

最佳答案

Is it right?



不完全是。

CloudFront遵循X-Forwarded-For的正确语义。具体来说,每个处理请求的系统都会在右侧附加其客户地址。这意味着来自CloudFront的请求中X-Forwarded-For中最右边的地址始终是连接到CloudFront的计算机的地址。

如果客户端(与CloudFront建立连接的计算机)在其请求中包含X-Forwarded-For header ,则该 header 可能是伪造的,或者如果客户端是代理服务器,则该 header 可能是合法的,但是您很少有办法知道。因此,无论哪种方式,您都应该将其视为潜在有值(value)的内容,但严格来说是非权威的。

最右边的值(也可能是唯一的值)是您可以信任的来自CloudFront的请求中的唯一值。

一般来说,从右边进行解析,您可以知道的任何您知道的并且可以信任的地址(可以正确识别出其上游客户端)都可以从列表中删除...但是一旦遇到第一个不受信任的地址(从右到左),您便可以使用该地址。正在寻找,因为该地址左侧的任何内容都不受信任。

这意味着,如果堆栈中的组件(例如Application Load Balancer或Web服务器)也添加了X-Forwarded-For,那么您将需要考虑这些组件还将添加到值右侧的内容,从而修改CloudFront提供的内容。

例如。客户发送:
X-Forwarded-For: a, b, c

CloudFront添加客户端的IP d:
X-Forwarded-For: a, b, c, d

ALB从CloudFront接收请求,因此添加了CloudFront导出地址e:
X-Forwarded-For: a, b, c, d, e

然后,您的Web服务器添加平衡器f的内部地址:
X-Forwarded-For: a, b, c, d, e, f

您可以信任和删除f,只要它与您的平衡器子网的CIDR范围相同即可。

您可以信任和删除e,只要它在CloudFront address ranges中即可。

剩下的就是d作为客户端地址。

在此示例中,abc值几乎一文不值,因为您无法信任它们的真实性,因为它们位于第一个(从右侧)不可信地址的左侧...有时,它们可能在鉴识上有用,稍后,但是您不能基于它们做出任何实时决策。

这就是X-Forwarded-For始终起作用的方式。由于缺乏理解,许多开发人员似乎做出了幼稚的假设。在将其用于任何重要事项之前,请务必先了解它。

Lambda@Edge触发器中,CloudFront以event.Records[0].cf.request.clientIp为您提供客户端IP地址。这始终只是一个地址,并且与X-Forwarded-For的最右边的值相同,因为请求使CloudFront一直指向您的来源(如上所述,这可能会在右边添加其他值)。

关于amazon-cloudfront - 如何通过CloudFront获取请求的客户端IP?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51393782/

相关文章:

amazon-web-services - CloudFront - 从 S3 提供静态网站,在自定义端口上将 API 请求路由到 EC2

amazon-s3 - 访问其他用户创建的 S3 存储桶

javascript - AWS 上的分段上传和分块上传有什么区别?

php - CloudFront 与 Elastic Beanstalk 结合用于动态应用程序?

java - 如何在java中获取签名的url?

django - 无法使用 boto 通过 Heroku 将静态收集到 s3 - s3 存储桶返回 NoneType

c# - 如何使用带有 Flowplayer 的 RTMP 从 Cloudfront 运行私有(private)内容视频

amazon-cloudfront - WordPress MU Cloudfront。尾部斜杠重定向转到错误的域

laravel 登录不适用于 cloudFront AWS 和证书管理器

ruby-on-rails - 将 Cloudfront 与 Active Storage 结合使用