代码之家  ›  专栏  ›  技术社区  ›  nrlakin

使用“allow”指令将对nginx服务器位置的访问限制为特定Docker容器

  •  8
  • nrlakin  · 技术社区  · 8 年前

    +++原始问题+++

    this tutorial

    version: '2'
    services:
      flask:
        restart: always
        image: me/flask-app
        command: /home/app/flask/start_app.sh
        expose:
          - "8080"
    
      nginx:
        restart: always
        build: ./nginx
        command: /runtime/start_nginx.sh
        ports:
          - "80:80"
          - "443:443"
        expose:
          - "81"
        volumes:
          - app-static:/app-static:ro
        links:
          - flask:flask
    
      datadog-agent:
        image: me/datadog-agent
        env_file: ./datadog-agent/dev.env
        links:
            - flask
            - nginx
        volumes:
          - /var/run/docker.sock:/var/run/docker.sock
          - /proc/mounts:/host/proc/mounts:ro
          - /sys/fs/cgroup:/host/sys/fs/cgroup:ro
    

    根据教程,我向nginx添加了一个服务器块,如下所示:

    server {
      listen 81;
    
      location /nginx_status {
        stub_status on;
        access_log off;
        allow 127.0.0.1;
        deny all;
      }
    }
    

    通过这种配置,我可以从nginx容器中检查nginx状态。到目前为止,一切顺利。现在,我想更改位置块中的“allow”指令,以仅允许访问datadog代理服务。然而,我不知道datadog代理的IP。在配置对Flask uwsgi服务器的访问时,我能够使用如下指令:

    location / {
        uwsgi_pass: flask:8080;
    }
    

    但这似乎不适用于allow指令;如果我尝试:

    location /nginx_status {
        ...
        allow datadog-agent;
        ...
    }
    

    nginx: [emerg] invalid parameter "datadog-agent" in /etc/nginx/sites-enabled/nginx-status:8
    

    3 回复  |  直到 8 年前
        1
  •  9
  •   Eugen Mayer    7 年前

    换个角度思考:)

    在端口10080上绑定nginx服务器(vhost) 此外

    80/443上的服务器也在那里,只有那个服务器绑定/暴露于主机(暴露于外部世界)。

    由于datadog是docker网络/服务网络的一部分,因此它仍然可以访问内部网络中的10080,但不能从外部网络访问任何其他网络。

        2
  •  6
  •   Tarun Lalwani    8 年前

    因为我们正在通过 docker-compose 我们的问题是我们不知道代理的IP。因此,简单的解决方案是在启动之前了解IP。这意味着为我们的代理分配一个特定的IP

    这里有一个更新 这样做

    version: '2'
    services:
      flask:
        restart: always
        image: me/flask-app
        command: /home/app/flask/start_app.sh
        expose:
          - "8080"
    
      nginx:
        restart: always
        build: ./nginx
        command: /runtime/start_nginx.sh
        ports:
          - "80:80"
          - "443:443"
        expose:
          - "81"
        volumes:
          - app-static:/app-static:ro
        links:
          - flask:flask
        networks:
          agent:
            ipv4_address: 172.25.0.101
          default:
    
      datadog-agent:
        image: me/datadog-agent
        env_file: ./datadog-agent/dev.env
        links:
            - flask
            - nginx
        volumes:
          - /var/run/docker.sock:/var/run/docker.sock
          - /proc/mounts:/host/proc/mounts:ro
          - /sys/fs/cgroup:/host/sys/fs/cgroup:ro
        networks:
          agent:
            ipv4_address: 172.25.0.100
    networks:
      agent:
        driver: bridge
        ipam:
          config:
          - subnet: 172.25.0.0/24
    

    现在你可以做两件事

    server {
      listen 172.25.0.101:81;
    
      location /nginx_status {
        stub_status on;
        access_log off;
        allow 127.0.0.1;
        allow 172.25.0.100;
        deny all;
      }
    }
    

    172.25.0.101 只有在代理网络上运行的容器才能访问。您还可以添加 allow 172.25.0.100 仅允许代理容器能够访问此。

        3
  •  4
  •   Niyojan    6 年前

    有两种(更简单的)方法。

    第一个是 docker-compose

    第二种方式是 Allow

    如:

        location /stub_status {
            stub_status;
    
            allow 172.18.0.0/16;   # This is my local docker IP range
            allow 192.168.0.0/16;  $ This is my production server IP range
            deny all;              # deny all other hosts   
     }
    

    192.168.* IP范围适用于本地网络,不确定 172.18.* 不过范围很广。

    要了解更多关于IP范围和CIDR的信息,请参阅以下链接 http://nginx.org/en/docs/http/ngx_http_access_module.html

    https://www.ripe.net/about-us/press-centre/understanding-ip-addressing