You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 20:01:11