Docker部署的Nginx中$remote_addr显示错误IP(固定为172.28.0.1而非真实访客IP)求助
Docker部署的Nginx中$remote_addr显示错误IP(固定为172.28.0.1而非真实访客IP)求助
嘿,我来帮你排查这个问题!首先,172.28.0.1是你的Docker自定义网络nginx1的网关IP,这说明Nginx容器收到的请求其实是从Docker网关转发过来的,而非直接来自外部访客,所以日志里才会一直显示这个固定IP。我给你梳理几个可能的原因和对应的解决办法:
1. 先排查Synology自带的反向代理是否搞了“双重代理”
很多人在使用Synology NAS时会不小心开启系统自带的反向代理服务,如果你的路由器已经把80/443端口转发到Synology,而Synology又自带反向代理把请求再转发给Docker里的Nginx,那Nginx收到的请求来源自然就是Synology本地的Docker网关IP了。
- 操作步骤:打开DSM控制面板 → 应用程序门户 → 反向代理服务器,看看有没有创建指向Docker Nginx容器的规则。如果有,直接删掉这些规则,让外部请求通过端口映射直接到达Docker里的Nginx。
2. 检查路由器的端口转发是否保留了客户端IP
有些路由器在做端口转发时,默认会把客户端IP替换成路由器自身的IP,导致后端服务拿不到真实访客IP。
- 操作步骤:登录路由器管理后台,找到80/443端口转发到Synology NAS的规则,看看有没有类似「保留客户端IP」「启用X-Forwarded-For」的选项,有的话直接开启。不同品牌路由器的选项名称可能不一样,找不到的话可以查查路由器的说明书。
3. 尝试把Nginx容器切换为Host网络模式
如果上面的方法都没用,可能是Docker自定义网络的桥接模式导致源IP丢失。你可以试试把Nginx容器改成Host网络模式,让它直接使用宿主机的网络,这样就能直接获取到真实访客IP了。
- 操作命令:
不过这种方式下,容器没法再使用自定义的Docker网络和后端服务通信,你可能需要调整后端服务的网络配置,比如让后端服务也使用Host网络,或者用宿主机IP来访问后端服务。# 先停止并删除当前的Nginx容器 docker stop <你的Nginx容器名称> docker rm <你的Nginx容器名称> # 重新创建容器时使用host网络(注意不需要再设置端口映射,直接用宿主机的80/443) docker run -d --name nginx-proxy --net=host -v /你的Nginx配置目录:/etc/nginx nginx:latest
4. 确认Docker端口映射没有被其他容器抢占
最后再检查一下,有没有其他容器也在监听Synology的80/443端口,导致请求先被其他容器接收再转发给Nginx。你可以用docker ps命令查看所有容器的端口映射,确认只有你的Nginx容器绑定了0.0.0.0:80和0.0.0.0:443。
按照上面的步骤一步步排查,应该能解决日志IP不对的问题,这样fail2ban也能正常工作啦!
备注:内容来源于stack exchange,提问作者Andreas
相关产品推荐
相关产品推荐

