【问题标题】:Restrict access by IP in docker nginx container在 docker nginx 容器中通过 IP 限制访问
【发布时间】:2022-11-02 22:07:29
【问题描述】:

我只在 Docker 上工作了很短的时间,所以我是新手,有些概念让我无法理解。 目前,我已经对一个应用程序进行了 dockerized 并创建了该应用程序的映像。 另一方面,该应用程序是几年前制作的,并连接到一个 MYSQL 5.7 数据库,所以我们有这个数据库的图像。 最后,我们有一个 Nginx 镜像作为反向代理。 通过使用我的 Docker-Compose,整个系统可以正常工作,能够毫无问题地访问我的应用程序。 我们希望这个应用程序可以被某些 IP 访问,所以通常(没有 dockerizing),我们使用 apache 和 mod_proxy 和 mod_proxy_http 来拒绝除这些 IP 之外的所有访问。 但是在 docker 中,使用 docker-compose 会创建您的内部网络,并且访问客户端的 IP 会发生变化,因此它会拒绝所有 IP。

由于我发现 Nginx 的文档比 apache 与 docker 的文档更多,因此我正在尝试使用它来配置它。 但是当我允许我的 IP 或另一台计算机的 IP 时,同样的事情不断发生在我身上,它不起作用,给我服务器拒绝访问的错误。 有没有办法添加允许我某些真实 IP 的配置? 我知道它可以通过 IPtables 规则在服务器本身上完成,但我们希望它全部通过 docker 映像完成。

我不在乎它是用 Nginx 还是 Apache 完成的,我已经看到它们都使用 realIP mod,但最重要的是记录访问,我不知道如何在允许或拒绝访问部分使用它。

我的码头工人撰写:

version: '3.0'
services:
   db:
     restart: always
     container_name: bd
     image: mysql:5.7
     environment:
       MYSQL_ROOT_PASSWORD: password
       MYSQL_DATABASE: app
     volumes:
       - dbdata:/var/lib/mysql
       - ./_MySQL_Init_Script:/docker-entrypoint-initdb.d
     ports:
       - "33306:3306"
   app:
     depends_on:
       - db
     restart: always
     container_name: app
     image: app:v1
   proxy:  
     container_name: proxy
     restart: always
     image: nginx
     depends_on:
       - db
       - app
     ports:
       - "80:80" 
     volumes:
       - ./default.conf:/etc/nginx/conf.d/default.conf:ro     
volumes:
    dbdata:

我的默认.conf:

server {
    listen       80;
    listen  [::]:80;
    server_name  localhost; 
    
    location / {      
    root   /usr/share/nginx/html;
    proxy_pass http://app:5885/;
        deny all;       
    Allow 192.X.X.X;
    Allow 192.X.X.X;
    }
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}

Nginx 容器日志:

[错误]23#23: *3 访问被规则禁止,客户端:172.24.0.1,服务器本地主机,请求:"Get /api/Acceso/VersionApp HTTP/1.1" ...

【问题讨论】:

    标签: docker apache nginx


    【解决方案1】:

    我设法解决了这个问题。 该应用程序正在我的工作计算机上使用,这是一个带有 Docker 桌面的 Windows。 尝试进入网络时,我是从同一台计算机上完成的。

    在将 dockerized 应用程序投入生产时,我只需配置 IPTables 就可以不使用 Allow 或 Deny 来设置它。 尝试访问应用程序的 Web 时,它工作正常,但是当我看到 Nginx 日志时,我看到出现的是我的真实 IP,而不是 Docker 容器的 IP。

    因此,我知道问题与 Docker Desktop 的操作有关,因为我在激活 wsl2 选项和未激活选项的情况下进行了测试。

    另外,第一次在 ubuntu 中进行测试时,它给了我一个错误,因为 default.conf 写得不好。 Allow 必须是小写的,并且 IPs 必须放在首位。

    我最终的 default.conf:

    server {
        listen       80;
        listen  [::]:80;
        server_name  localhost; 
    
        location / {      
            root   /usr/share/nginx/html;
            proxy_pass http://app:5885/;
            allow 192.X.X.X;
            allow 192.X.X.X;
            deny all;         
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   /usr/share/nginx/html;
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2015-11-30
      • 2018-09-07
      • 2021-12-16
      • 1970-01-01
      • 2017-05-08
      • 2018-04-21
      • 1970-01-01
      • 2017-02-16
      相关资源
      最近更新 更多