Как ограничить внешний доступ к портам, предоставляемым контейнерами Docker, при этом позволяя ссылкам работать?

У меня есть несколько служб, работающих на машине в контейнерах докеров, которые должны быть доступны для определенный IP-адрес и должен быть доступен для контейнеров со ссылками (как определено в файле docker-compose). Я пробовал эти команды, но, похоже, они также отбрасывают пакеты из контейнеров в той же сети докеров:

iptables -I DOCKER-USER ! -s 8.8.8.8/32 -p tcp -m tcp --dport 1234 -j DROP

iptables -I DOCKER-USER ! -s 8.8.8.8/32 -p tcp -m tcp --dport 12345 -j DROP

Как Могу ли я настроить iptables для отбрасывания пакетов, идущих на порты 1234 и 12345 со всех IP-адресов, кроме 8.8.8.8 и любого контейнера со ссылками (как определено в файле docker-compose)?

docker-compose, похоже, создает мост интерфейс, и множество виртуальных интерфейсов со случайными именами (по одному для каждого контейнера?).

Ее e - это файл docker-compose.yml, который я использую:

version: '3'
services:
    django:
        build: .
        image: django
        depends_on:
            - mysql-db
            - sel
        ports:
            - "80:54321"
        links:
            - mysql-db
            - sel
            - rabbit
            - redis
        volumes:
            - vol1:/media/DataRaid1/vol1
            - /etc/secret_key.txt:/etc/secret_key.txt
            - django-media:/var/www/media
        environment:
            - DJANGO_SETTINGS_MODULE=a_project.settings_production
            - COMMIT
        command: httpd-foreground"
    mysql-db:
        image: mysql:5.7.18
        environment:
            - MYSQL_ROOT_PASSWORD=APASSWORD
        volumes:
            - mysql-data:/var/lib/mysql
            - ./custom-mysql.cnf:/etc/mysql/conf.d/custom-mysql.cnf
    sel:
        image: "selenium/standalone-chrome"
        volumes: #Fixes bug https://github.com/elgalu/docker-selenium/issues/20
            - /dev/shm:/dev/shm
    # Redis
    redis:
        image: redis:4.0.9
        hostname: redis
        ports:
            - "1234:1234"

    # RabbitMQ
    rabbit:
        hostname: rabbit
        image: rabbitmq
        environment:
            - RABBITMQ_DEFAULT_USER=AUSER
            - RABBITMQ_DEFAULT_PASS=APASSWORD
        ports:
            - "12345:12345"
    # Celery worker
    worker:
        build: .
        command: bash -c "sleep 10 && celery worker -A a_project.celeryconf -Q default -n default@%h"
        volumes:
          - .:/var/www
        links:
          - mysql-db
          - rabbit
          - redis
        depends_on:
          - rabbit
        environment:
            - DJANGO_SETTINGS_MODULE=a_project.settings_production
            - C_FORCE_ROOT=true
volumes:
    vol1:
    mysql-data:
    django-media:
0
задан 14 February 2019 в 02:02
1 ответ
  1. Использовать сетевой режим для каждого контейнера:

     network_mode: "host"
     
  2. Использовать порты с привязкой к 127.0.0.1 + некоторый прокси-контейнер:

     порты:
      - «127.0.0.1:12345:12345»
     
  3. Не использовать порты вообще + какой-то прокси-контейнер.

  4. Добавьте правило iptables в соответствующую цепочку докеров, прямо сейчас не знаю, какое ...
0
ответ дан 5 December 2019 в 04:08

Теги

Похожие вопросы