我有一个网络负载均衡器,它将流量转发到在 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
源地址保存– 使用网络负载均衡器,传入连接的原始源 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
在日志中正确显示)。