Волшебство Docker + FireWall 🛡️ #
Случайно наткнулся на одну очень занимательную штуку, возможно кому-то будет полезно. А дело касается как ни странно опять Docker`a.
Вся суть в том, что докер связан с фаерволлом вашей хостовой системы (на которой вы запускаете контейнеры). Одна из фич докера - это его изолированность, которая в плане сети и достигается межсетевым экранированием. По-сути, после старта контейнера, в зависимости от заданных параметров сети, докер добавляет запись в цепочку фаерволла (дефолтно - iptables).
Дело в том, что я, например, не использую iptables, я пользуюсь ufw. Эти 2 фаерволла по умолчанию стоят в современных ОС Linux и связаны друг с другом. То есть в цепочках iptables прописано, какие правила какого фаерволла будут выполняться первыми и сетевой трафик по-сути прогоняется через оба фаерволла. А тут что странного?
Собственно “волшебство” началось тогда, когда я запустил контейнеры с пробросом портов наружу, наивно думая, что у меня же ufw все равно заблокирует эти порты, так как действует политика “все что не разрешено - запрещено”. Естественно в цепочке ufw не было разрешения на эти порты. Но вот чудо! Они все равно были доступны извне. И тут я подумал, что у меня не работает ufw. А все дело в том, что по умолчанию докер работает именно с iptables. То есть - при запуске контейнера с пробросом порта на внешний IP, докер вносит изменение в цепочку iptables, и то, что у вас в ufw этот порт не разрешен больше не проблема!
Но забавно то, что, например в браузере я мог перейти на страницу по этому порту извне, а другие приложения не могли по такой же связке ip+port
работать. А вот тут-то и оказалось, что ufw работает в этом случае - не было разрешающего правила для взаимодействия между контейнерами. Отключив его, либо добавив соответствующее правило приложения стали взаимодействовать между собой.
В общем будте осторожны и внимательно проверяйте правильно ли вы все зафильтровали и где вы это сделали)