LINUX.ORG.RU
ФорумAdmin

Как правильно закрыть порт для докера?

 ,


0

1

Как известно, докер плевал на мнение админа и добавляет в iptables правила, открывающие порты.

Мне нужно, чтобы контейнер биндился на 0.0.0.0, но тем не менее не был доступен публично. На сервере два интерфейса (один VPN), через VPN порт должен быть открыт.

В доке пишут: «It is possible to set the iptables key to false in the Docker engine’s configuration file at /etc/docker/daemon.json, but this option is not appropriate for most users. It is not possible to completely prevent Docker from creating iptables rules, and creating them after-the-fact is extremely involved and beyond the scope of these instructions. Setting iptables to false will more than likely break container networking for the Docker engine.»

Не очень понятно, что конкретно поломается.

Есть ли простой рецепт, как добиться желаемого? Т.е. чтобы докер вёл себя, как любой другой сервер, чтобы я сначала биндил на 0.0.0.0, а потом уже открывал порт в фаерволе и никак иначе.

На одном сервере CentOS 7, поэтому желательна нормальная интеграция с firewalld, т.е. чтобы все манипуляции можно было производить через него. На другом Ubuntu 16.04, там ufw.

★★★★★

Казалось бы, а причём тут докер?

Не очень понятно, что конкретно поломается

🤦‍♀️

WitcherGeralt ★★
()

А ты пробовал развернуть контейнер и из вне достучаться до портов контейнера? При этом ничего не меняя в конфиге демона. И при условии, что хост не дырявый. А то может быть по дефолту крутится nftables без правил Попытайся достучаться, потом нам расскажешь как оно.

achilles_85
()
Последнее исправление: achilles_85 (всего исправлений: 1)

Не очень понятно, что конкретно поломается.

docker перестанет добавлять/удалять правила в firewall, придётся всё это делать вручную.

Есть ли простой рецепт, как добиться желаемого?

Есть, я, например, открытие/закрытие портов делал в mangle PREROUTING (т.к. docker открывает порты через nat PREROUTING, а нам хотелось бы вклиниться перед ним):

iptables -t mangle -N FROM_INET

iptables -t mangle -A PREROUTING -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
iptables -t mangle -A PREROUTING -p icmp -j ACCEPT
iptables -t mangle -A PREROUTING -i $inet_iface -j FROM_INET
iptables -t mangle -A PREROUTING -i $inet_iface -j DROP

-A FROM_INET -p tcp --dport XXX -m comment --comment service-X -j ACCEPT
...

Можно делать блокировку в FORWARD-цепочках - более правильном месте, но к этому моменту уже успеет отработать DNAT. А зачем нам это нужно, если пакеты мы будем блокировать ? К тому же в filter FORWARD хозяйничает docker.

С некоторых версий docker-а (20.x) в filter FORWARD появился запрыг в цепочку DOCKER-USER, которую авторы docker как раз и рекомендуют использовать администраторам. Вот только создаётся она при старте docker-а, который запускается после поднятия сети, а firewall лучше бы наполнять до поднятия. Нормально ли отнесётся docker, если эта цепочка уже будет присутствовать на момент его старта ? Поддерживает ли ваша версия docker эту цепочку ? Вопрос.

Способов организовать firewall хватает, дальше выбор за вами.

spirit ★★★★★
()
Ответ на: комментарий от spirit

Хотелось бы пользоваться стандартными средствами вроде firewalld/ufw.

Пока планирую отключить iptables в докере и попробовать без него. Как я понял, там нужен NAT для исходящих соединений из докера, это вроде несложно.

Legioner ★★★★★
() автор топика

Внимательно читаем: https://github.com/chaifeng/ufw-docker

Для firewalld, тоже есть что-то, если он у тебя с поддержкой policy objects, ищи в блоге проекта.

anonymous
()

Если iptables, то так:

-A DOCKER-USER -i <внешний_интерфейс> -s <разрешенная подсеть> -p tcp --dport <порт> -j ACCEPT
-A DOCKER-USER -i <внешний_интерфейс> -p tcp --dport <порт> -j DROP

DOCKER-USER - штатное имя для цепочки правил, которые применяются перед разрешениями на проброшенные порты.

Как там в более других рулилках файрволами - хз, не пользуюсь.

Pinkbyte ★★★★★
()
Последнее исправление: Pinkbyte (всего исправлений: 1)

Может просто не указывать опцию -p при запуске контейнера? Тогда процесс в контейнере будет по-прежнему слушать порт, а вот наружу он выставляться не будет.

bigbit ★★★★★
()
Ответ на: комментарий от bigbit

Это понятно, но во-первых мне нужно подключаться к нему извне, просто через VPN (можно решить биндингом на VPN-интерфейс, но тогда контейнер может не стартануть, если интерфейс не поднят, опять же решается определённым sysctl-ом, но это уже слишком замороченно на мой взгляд), во-вторых эту систему в будущем буду сопровождать не только я, поэтому всё должно работать максимально дуракоустойчиво.

Legioner ★★★★★
() автор топика
Ответ на: комментарий от Legioner

Поднял контейнер
Перезагрузил [свои] правила фаервола

Или так не делают?

Brillenschlange
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.