Назад | Перейти на главную страницу

Каковы правильные правила iptables для хоста Docker?

У меня есть сервер Ubuntu с Docker для обслуживания MySQL и SSH / SFTP, и мне нужны все порты, кроме 3306 и 22 быть защищенным от брандмауэра, довольно стандартное и тривиальное требование, не так ли?

Теперь мне удалось найти своего рода решение но у меня он не работает полностью, как и после его применения:

  1. Я не могу получить доступ ни к одной из упомянутых служб (по умолчанию)
  2. Я не могу получить доступ к Интернету из контейнеров (если я поставлю iptables: false в Докере daemon.json файл конфигурации)

Я пробовал использовать ряд других результатов поиска, но они в основном настолько сложны, что я не понимаю, что они делают, или они сильно запрограммированы на скрипты, что делает меня, непрофессионала по iptables, невыполнимой задачей.

Предлагаемое решение выглядит довольно простым и понятным, но вся сложность сети Docker значительно усложняет отладку.

Может ли кто-нибудь поделиться своими рабочими правилами iptables для хостов Docker или хотя бы направить меня в правильном направлении?

Я использую docker-compose для запуска сервисов, и это мой yaml:

version: '3.7'

services:
  mysql:
    container_name: 'mysql'
    image: mysql:8.0.13
    command: --default-authentication-plugin=mysql_native_password
    user: 1000:1000
    ports:
      - "3306:3306"
    volumes:
      - ./data:/var/lib/mysql
      - ./config/custom.cnf:/etc/mysql/conf.d/custom.cnf
    networks:
      - database
    restart: always

networks:
  database:
    driver: bridge

Редактировать: Я обнаружил, что разрешение Docker управлять правилами iptables рекомендуется и менее требовательно, по крайней мере, в долгосрочной перспективе, и это нормально - позволить Docker открывать требуемые порты, даже если я не делал этого так, как я предпочитаю, он все еще действует. На этом этапе я хочу выяснить, можно ли использовать iptables для блокировки портов, открытых Docker, и как это сделать (возможно, с помощью предварительной маршрутизации mangle?). Какие-либо предложения? Благодаря тонну!

Я не могу получить доступ к Интернету из контейнеров (если я добавлю iptables: false в файл конфигурации Docker daemon.json)

Docker использует iptables для настройки своей сети. Сюда входят правила NAT для обработки доступа во внешнюю сеть и из нее, а также множество других правил для настройки доступа контейнеров друг к другу в сетях докеров. По умолчанию этот доступ открыт, но при создании сетей есть опции для ограничения внешнего доступа и межконтейнерной связи. Поэтому я не рекомендую устанавливать iptables для параметра docker значение false, поскольку это нарушит все функции, как вы видели.

Публикация порта на хосте неявно разрешает доступ извне. Поэтому самый простой способ избежать доступа извне - не публиковать порт. Вы можете опубликовать порт для определенного интерфейса, например 127.0.0.1:8080:80 который опубликует порт 8080 на петлевом интерфейсе хоста (127.0.0.1) для подключения к порту 80 контейнера, и этот интерфейс обратной петли недоступен извне. Однако, если оставить порт неопубликованным не вариант, это можно сделать с помощью iptables.

На этом этапе я хочу выяснить, можно ли использовать iptables для блокировки портов, открытых Docker, и как

Это можно сделать, изменив DOCKER-USER цепочка фильтров. Вы можете найти примеры этого, например:

$ iptables -I DOCKER-USER -i ext_if ! -s 192.168.1.0/24 -j DROP

из следующих документов: https://docs.docker.com/network/iptables/

Обратите внимание, что порт изменяется некоторыми правилами искажения, которые выполняются перед правилами фильтрации, поэтому, если вы хотите фильтровать по порту, вам нужно будет использовать conntrack для получения исходного порта назначения:

$ iptables -I DOCKER-USER -i eth0 -p tcp \
    -m conntrack --ctorigdstport 8080 -j DROP
$ iptables -I DOCKER-USER -i eth0 -s 10.0.0.0/24 -p tcp \
    -m conntrack --ctorigdstport 8080 -j ACCEPT

Обратите внимание, что в DOCKER-USER есть правило по умолчанию для принятия всех, поэтому вам нужно вставить правила в верхней части цепочки (-I) вместо добавления в конец (-A).

Видеть: Шаги по ограничению внешних подключений к контейнеру докеров с помощью iptables?