Docker Nginx容器按真实IP限制访问的配置方案求助
解决Docker环境下反向代理的真实IP访问限制问题
问题背景
接触Docker时间较短,已通过Docker-Compose完成旧应用、MySQL 5.7数据库及Nginx反向代理的部署,系统可正常访问。现在需要限制仅特定真实IP能访问应用,此前未容器化时用Apache的mod_proxy实现,但Docker内部网络导致客户端IP被替换为172.24.0.1,Nginx的Allow规则失效,日志显示客户端IP为内部网关地址,需找到基于Docker镜像的真实IP限制方案。
核心原因
Docker默认桥接网络模式下,反向代理容器接收到的请求来自Docker网关(172.24.0.1),而非真实客户端IP,导致IP限制规则匹配的是内部IP而非真实IP。同时当前Nginx配置中deny all的顺序错误,会优先拒绝所有请求,后续Allow规则无法生效。
Nginx解决方案
步骤1:修正规则匹配顺序
Nginx访问控制规则按从上到下顺序匹配,需先设置允许的IP,最后再拒绝所有其他IP。
步骤2:配置Nginx获取真实客户端IP
添加real_ip相关指令,让Nginx从请求头提取真实IP,并信任Docker内部网段的请求来源。
修改后的default.conf示例:
server { listen 80; listen [::]:80; server_name localhost; # 配置真实IP获取 real_ip_header X-Forwarded-For; set_real_ip_from 172.17.0.0/16; # Docker默认桥接网段,自定义网段需修改 set_real_ip_from 172.24.0.0/16; # 匹配当前日志中的网关网段 location / { proxy_pass http://app:5885/; # 先允许指定IP allow 192.X.X.X; allow 192.X.X.X; # 最后拒绝所有其他IP deny all; } error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/share/nginx/html; } }
步骤3:重启Nginx容器
执行命令让配置生效:
docker-compose restart proxy
Apache解决方案
若改用Apache作为反向代理,需启用mod_remoteip模块获取真实IP,再配置访问控制规则。
1. 准备Apache配置文件(示例为httpd.conf)
# 启用必要模块 LoadModule remoteip_module modules/mod_remoteip.so LoadModule proxy_module modules/mod_proxy.so LoadModule proxy_http_module modules/mod_proxy_http.so # 配置真实IP获取 RemoteIPHeader X-Forwarded-For RemoteIPInternalProxy 172.17.0.0/16 RemoteIPInternalProxy 172.24.0.0/16 # 虚拟主机配置 <VirtualHost *:80> ServerName localhost ProxyPass / http://app:5885/ ProxyPassReverse / http://app:5885/ # 访问控制规则 <Location /> Require ip 192.X.X.X Require ip 192.X.X.X Require all denied </Location> </VirtualHost>
2. 修改docker-compose.yml的proxy服务
替换为Apache镜像并挂载配置文件:
version: '3.0' services: # 其他服务保持不变 proxy: container_name: proxy restart: always image: httpd:2.4 depends_on: - db - app ports: - "80:80" volumes: - ./httpd.conf:/usr/local/apache2/conf/httpd.conf:ro volumes: dbdata:
3. 重启Apache容器
docker-compose restart proxy
内容的提问来源于stack exchange,提问作者Bethsabet
相关产品推荐
相关产品推荐

