У меня есть сервер Ubuntu с Docker для обслуживания MySQL и SSH / SFTP, и мне нужны все порты, кроме 3306 и 22 быть защищенным от брандмауэра, довольно стандартное и тривиальное требование, не так ли?
Теперь мне удалось найти своего рода решение но у меня он не работает полностью, как и после его применения:
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?