You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

咨询:如何将AWS API Gateway客户端IP传递至EC2后端

嘿,刚好我之前帮朋友处理过一模一样的场景,给你几个针对EC2后端的实用方案,不用绕Lambda:

方案1:用API Gateway自动转发的X-Forwarded-For头拿真实IP

API Gateway作为请求代理,在把请求转发到你的EC2时,会自动给请求加上X-Forwarded-For头——这个头里的第一个IP就是客户端的真实地址(格式一般是客户端IP, API Gateway的转发IP)。

  • 后端获取方式:
    • 如果是Web应用(比如Python Flask、Java Spring),直接读取请求头里的X-Forwarded-For,拆分后取第一个值就行。举个Flask的简单例子:
      from flask import request
      def get_client_ip():
          xff = request.headers.get('X-Forwarded-For', '')
          return xff.split(',')[0].strip() if xff else request.remote_addr
      
    • 如果EC2上用Nginx做反向代理,得确保Nginx把这个头传给后端应用。可以在Nginx的server配置里加一行:
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      
      要是想在日志里直接看到客户端IP,还能修改日志格式:
      log_format custom '$http_x_forwarded_for - $remote_user [$time_local] "$request" '
                        '$status $body_bytes_sent "$http_referer" "$http_user_agent"';
      access_log /var/log/nginx/access.log custom;
      
方案2:配置自定义请求头(更省心的方式)

要是觉得处理逗号分隔的IP列表麻烦,你可以让API Gateway直接把客户端IP单独放到一个自定义头里,后端直接读就行:

  1. 打开API Gateway控制台,找到你的目标API、资源和方法
  2. 切换到「集成请求」标签页
  3. 在「HTTP头」区域点击「添加头」
  4. 输入自定义头名称(比如X-Client-Real-IP),映射值填$context.identity.sourceIp——这个变量就是API Gateway拿到的客户端真实IP
  5. 保存配置后,重新部署你的API

这样EC2后端就能直接读取X-Client-Real-IP头,一步到位拿到客户端IP,不用再做字符串拆分了。

避坑提醒
  • 别用remote_addr:EC2收到的请求是来自API Gateway的,所以remote_addr显示的是API Gateway的出口IP,不是客户端的真实地址,千万别搞错!
  • VPC内的EC2也适用:如果你的EC2在VPC里,用API Gateway的私有集成(VPC链路)连接,上面的方案依然有效,客户端IP还是会被正确传递。
  • 检查头是否被拦截:有些WAF规则或者后端代理的安全配置可能会过滤自定义请求头,要是拿不到的话,先排查这部分配置。

内容的提问来源于stack exchange,提问作者Sibin Francis

火山引擎 最新活动