如何从CloudFront上获取客户端真实IP地址

一、背景

CloudFront CDN服务和ALB一样,会屏蔽掉最终用户的IP地址。获取真实IP地址,需要通过额外的HTTP Header来获得,在CloudFront CDN上这个Header的名称是 HTTP_CLOUDFRONT_VIEWER_ADDRESS 。因此只要先在CloudFront上配置好,然后从应用层打印这个Header即可获得客户端真实IP地址。

二、CDN配置

进入CloudFront界面,在左侧找到Policy策略的按钮,然后进入Origin request标签页,新建一个源站请求规则。如下截图。

在这个新建的Policy下,将Header部分选择为转发所有viewer的header之外,再额外追加CloudFront自己的Header。然后从下拉框中选择CloudFront-Viewer-Address,表示将这个Header从CloudFront发送到源站。如下截图。

其他的Header,可根据应用程序需要进行额外的转发。配置好后点击保存。

进入CloudFront的发布点界面,点击Behaviors行为,找到转发源站的行为,点击编辑,如下截图。

在下拉框中选择刚才新建的Policy,然后点击应用生效。如下截图。

至此CloudFront配置完成,响应的Header已经转发给源站。

三、应用层打印

构建一个PHP文件,例如如下:

<?php
  print_r($_SERVER);
?>

然后使用curl通过CloudFront的网址访问这个文件。如下截图。

其中可以看到的客户端的IP地址和端口信息:

[HTTP_CLOUDFRONT_VIEWER_ADDRESS] => 13.248.48.11:18758

由此就通过了CloudFront获得了客户端的IP地址。

四、参考文档

CloudFront对客户端IP地址的Header的支持:

https://aws.amazon.com/cn/about-aws/whats-new/2021/10/amazon-cloudfront-client-ip-address-connection-port-header/

AWS CloudFront关于转发Header的解释:

https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/using-cloudfront-headers.html#cloudfront-headers-viewer-location

如果是使用CloudFront Function,也可以参考这个函数:

https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/example-function-add-true-client-ip-header.html