AWS ELB 后面的 AWS EC2 实例无法获取真实客户端的 IP 地址

AWS ELB 后面的 AWS EC2 实例无法获取真实客户端的 IP 地址

我对 nginx 设置非常陌生。我的 API 应用程序在由我的 AWS Elastic Beanstalk 环境自动创建的 EC2 实例中运行。该应用程序使用 Nginx,实例位于 ELB 负载均衡器(经典)后面。Route 53 域将流量路由到 ELB。

我用Postman或者Packet Sender往该域名发送数据包,但是一直收不到响应。查看nginx错误日志,发现客户端IP显示为10.0.2.63,不是我电脑的IP地址。我的真实IP地址149.15x.1xx.2xx。我猜10.0.2.63是VPC的IP地址。下面是nginx错误日志。

while reading PROXY protocol, client: 10.0.2.63, server: 0.0.0.0:80

据我了解,由于客户端 IP 是 VPC IP 地址,EC2 实例无法将回复发送到真实的客户端 IP 地址(我的 PC 的 IP 地址),因此 Postmand 或 Packet Sender 收到空响应。

我理解正确吗?如何让 EC2 实例接收真实的客户端 IP 地址?如下所示:

while reading PROXY protocol, client: 149.15x.1xx.2xx, server: 0.0.0.0:80

我不知道这是 AWS ELB 设置的问题还是 nginx 设置的问题。

我的 EC2 实例中的 nginx 配置是:

files:
/etc/nginx/conf.d/proxy.conf:
content: |
  client_max_body_size 500M;
  server_names_hash_bucket_size 128;

  upstream backend {
    server unix:///var/run/puma/my_app.sock;
  }

  server {
    listen 80 proxy_protocol;

    access_log /var/log/nginx/access.log;
    error_log /var/log/nginx/error.log;

    large_client_header_buffers 8 32k;

    set_real_ip_from 10.0.0.0/8;
    real_ip_header X-Forwarded-For;

    location / {
      proxy_http_version 1.1;
      proxy_set_header X-Real-IP $proxy_protocol_addr;
      proxy_set_header X-Forwarded-For $proxy_protocol_addr;
      proxy_set_header Host $http_host;
      proxy_set_header X-NginX-Proxy true;
      proxy_buffers 8 32k;
      proxy_buffer_size 64k;
      proxy_pass http://backend;
      proxy_redirect off;

      # Enables WebSocket support
      location /v1/cable {
        proxy_pass http://backend;
        proxy_http_version 1.1;
        proxy_set_header Upgrade "websocket";
        proxy_set_header Connection "Upgrade";
        proxy_set_header X-Real-IP $proxy_protocol_addr;
        proxy_set_header X-Forwarded-For $proxy_protocol_addr;
      }
    }
  }

答案1

您可以从X-Forwarded-For 标头。 这AWS 博客文章为您提供 Apache 和 Nginx 日志的配置。以下是 Nginx

http {
  ...
  log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                    '$status $body_bytes_sent "$http_referer" '
                    '"$http_user_agent" "$http_x_forwarded_for"';
  access_log  /var/log/nginx/access.log  main;
}

我在 Nginx 服务器前面使用 CloudFlare。下面介绍如何将 CloudFlare IP 替换为实际客户端 IP。您需要将“CF-Connecting-IP”替换为“X-Forwarded-For”,并将 IP CIDR 替换为您的 VPC 的 CIDR。

set_real_ip_from 173.245.48.0/20;
real_ip_header CF-Connecting-IP;

相关内容