我在 Docker 容器中运行 Nginx 作为反向代理,使用以下配置。它基本上将请求重定向到在同一台机器上运行的另一个 Docker 容器
问题
问题是访问日志中的输出显示了错误的客户端 IP 地址,具体来说,我获取的是 Docker 主机的 IP 172.17.0.1
:
172.17.0.1 - - [24/May/2016:19:50:18 +0000] "GET /admin/ HTTP/1.1" 200 19243 "-" "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:46.0) Gecko/20100101 Firefox/46.0" "-"
我尝试听从这关于该指令的帖子set_real_ip_from
,但没有任何成功。
配置
server {
listen 8000 ssl;
server_name example.com;
access_log /var/log/nginx/host.access.log main;
ssl_certificate /path/to/cert.pem;
ssl_certificate_key /path/to/key.key;
set_real_ip_from 172.17.0.1;
real_ip_header X-Forwarded-For;
real_ip_recursive on;
proxy_set_header Host $host:$server_port;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
location / {
proxy_pass http://172.17.0.1:8100/;
}
}
我在这里遗漏了什么?
编辑:
答案1
您可能需要以下人员建议的修复womble 的回答以便在真实服务器上看到真实IP。
但是,为了在真实服务器或代理节点上查看真实客户端 IP,您需要修改 Docker 配置。我认为问题源于 nginx 前面的 Docker 网络防火墙。请参阅这个问题寻找该问题的解决方案。
答案2
解决该问题的一个简单方法似乎是以“主机”模式发布端口(来源)。
如果您使用docker-compose,可以这样做:
ports:
- target: 80
published: 80
mode: host
- target: 443
published: 443
mode: host
答案3
您需要在执行代理的机器上设置X-Forwarded-For
标头(不是,这甚至不太标准),X-Real-IP
和您需要告诉接收请求的任何人相信 XFF 标头是合法的,因为它来自已知 IP。您在问题中获得的配置仅适用于一台机器,但它具有两端所需的配置。
答案4
问题是访问日志中的输出显示了错误的客户端 IP 地址,具体来说,我得到的是 Docker 主机 172.17.0.1 的 IP:
我怀疑你的意思
问题是访问日志中的输出原始服务器指出了错误的客户端 IP 地址,具体来说,我得到的是反向代理主机。
在这种情况下,您需要修改原始服务器上的日志记录:
log_format proxied '$http_x_real_ip - $remote_user [$time_local] '
'"$request" $status $bytes_sent '
'"$http_referer" "$http_user_agent" "$gzip_ratio"';
...
access_log /var/log/nginx/access.log proxied;