在 AWS 网络负载均衡器后面的 Nginx 中获取“真实”IP

在 AWS 网络负载均衡器后面的 Nginx 中获取“真实”IP

我有一个网络负载均衡器,它将流量转发到在 ECS 中运行的 Nginx docker 容器(使用 awsvpc 网络模式)。我的 nginx 配置如下:

user  nginx;
worker_processes  1;

error_log  /var/log/nginx/error.log info;
pid        /var/run/nginx.pid;


events {
    worker_connections  1024;
}


http {
    server {

        allow all;
        listen 443 default ssl;
        ssl_certificate /etc/nginx/ssl/cert.pem;
        ssl_certificate_key /etc/nginx/ssl/privkey.pem;
        ssl_trusted_certificate /etc/nginx/ssl/chain.pem;

        ssl_prefer_server_ciphers on;
        ssl_protocols TLSv1.2;

        add_header Strict-Transport-Security "max-age=31536000";
        access_log /var/log/nginx/access.log;

        location / {
            proxy_pass http://blahblahblah;
            proxy_set_header Host $host;
            proxy_set_header X-Forwarded-For $remote_addr, $proxy_add_x_forwarded_for;
        }
    }
}

然而,查看日志时,X-Forwarded-For 标头不包含客户端的“真实”IP,它只包含一系列内部 IP(其中一个是网络负载均衡器的内部 IP)。

我对网络负载均衡器的理解是,客户端的“真实”IP 应该保留为传入 IP,为什么它没有显示在这个标头中?

答案1

https://aws.amazon.com/blogs/aws/new-network-load-balancer-effortless-scaling-to-millions-of-requests-per-second/

源地址保存– 使用网络负载均衡器,传入连接的原始源 IP 地址和源端口保持不变,因此应用程序软件无需支持 X-Forwarded-For、代理协议或其他解决方法。这也意味着可以在目标上使用常规防火墙规则,包括 VPC 安全组。

答案2

nginx 从 1.13.11 开始支持 PROXY 协议 v2,大约在您提出这个问题后一个月。我今天遇到了这个问题,所以如果这对其他人有用的话:

http {
    #...
    server {
        listen 80   proxy_protocol;
        listen 443  ssl proxy_protocol;
        #...
    }
}
   
stream {
    #...
    server {
        listen 12345 proxy_protocol;
        #...
    }
}

添加proxy_protocol到您的侦听器。这将允许您的 nginx接受代理协议 V2 连接。

如果您使用 AWS LB,则需要在目标组上启用代理协议 v2:

(“保留客户端 IP 地址”选项似乎没有必要,$proxy_protocol_addr在日志中正确显示)。

相关内容