Настройка брандмауэра Linux для Docker Swarm в CentOS 7

Docker Swarm – это функция кластеризации Docker, которая значительно упрощает запуск контейнеров и хостов Docker. Кластер Docker Swarm состоит из контейнеризированных хостов Docker, одна часть которых функционирует как ведущие ноды (менеджеры), а вторая – как ведомые ноды (рабочие ноды, или воркеры). Для поддержки такой системы нужно правильно настроить брандмауэр Linux.

Для корректной работы кластера Docker Swarm необходимы следующие порты:

  • TCP-порт 2376 – для безопасного взаимодействия клиентов Docker и работы Docker Machine (программы, которая обеспечивает оркестровку хостов Docker).
  • TCP-порт 2377 – для взаимодействия нод кластера Docker Swarm (нужно открыть только на нодах-менеджерах).
  • TCP- и UDP-порт 7946 – для связи между нодами (обнаружение сети контейнера).
  • UDP-порт 4789 – для трафика оверлейной сети.

Примечание: Помимо вышеперечисленных портов откройте порт 22 (трафик SSH) и любые другие порты, необходимые для поддержки сервисов кластера.

Данное руководство научит вас настраивать брандмауэр Linux на сервере CentOS 7 при помощи различных приложений для управления брандмауэром, доступных в дистрибутивах Linux: FirewallD и IPTables. Дистрибутив CentOS по умолчанию использует FirewallD. В руководстве показано, как при помощи разных методов достичь одного и того же результата; потому вы можете выбрать наиболее знакомый вам инструмент и выполнить предназначенный для него раздел.

Требования

Чтобы следовать руководству, вам понадобятся предварительно настроенные хосты для кластера (минимум один менеджер и один воркер). Советы по настройке можно найти в статье Управление удалёнными хостами Docker с помощью Docker Machine в CentOS 7.

Примечание: В руководстве предполагается, что вы подключились к серверу с помощью команды docker-machine ssh (после его оркестровки через Docker Machine). Потому все команды данного руководства выполняются без sudo.

Метод 1: Настройка FirewallD для поддержки Docker Swarm

Приложение FirewallD по умолчанию используется в Fedora, CentOS и других дистрибутивах на их основе. Однако в CentOS 7 оно отключено по умолчанию. Сначала нужно включить брандмауэр.

Проверьте его состояние:

systemctl status firewalld

По умолчанию он отключен. Чтобы запустить брандмауэр, введите:

systemctl start firewalld

Затем настройте автозапуск FirewallD:

systemctl enable firewalld

Подключитесь к менеджеру Swarm и используйте следующий набор команд, чтоб открыть требуемые порты:

firewall-cmd --add-port=2376/tcp --permanent
firewall-cmd --add-port=2377/tcp --permanent
firewall-cmd --add-port=7946/tcp --permanent
firewall-cmd --add-port=7946/udp --permanent
firewall-cmd --add-port=4789/udp --permanent

Примечание: Если вы допустили ошибку и хотите удалить запись, введите:

firewall-cmd --remove-port=port-number/tcp —permanent

Перезапустите брандмауэр:

firewall-cmd --reload

Перезапустите Docker:

systemctl restart docker

После этого нужно выполнить следующие команды на всех воркерах кластера Swarm:

firewall-cmd --add-port=2376/tcp --permanent
firewall-cmd --add-port=7946/tcp --permanent
firewall-cmd --add-port=7946/udp --permanent
firewall-cmd --add-port=4789/udp --permanent

Не забудьте перезапустить брандмауэр:

firewall-cmd --reload

и Docker:

systemctl restart docker

Теперь брандмауэр FirewallD поддерживает Docker Swarm.

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

firewall-cmd --add-port=80/tcp --permanent

Помните, что после изменения настроек нужно перезапускать брандмауэр.

Метод 2: Настройка IPTables для поддержки Docker Swarm

Чтобы использовать IPtables в любом из дистрибутивов Linux, необходимо сначала удалить другие утилиты брандмауэров (например, FirewallD или UFW). Остановите и отключите FirewallD:

systemctl stop firewalld
systemctl disable firewalld

Затем нужно установить пакет iptables- services, который отвечает за автоматическую загрузку правил IPtables.

yum install iptables-services

Запустите IPTables:

systemctl start iptables

Настройте автозапуск сервиса:

systemctl enable iptables

Прежде чем добавить правила для Docker Swarm в цепочку INPUT, просмотрите стандартные правила в этой цепочке:

iptables -L INPUT --line-numbers

Эта команда вернёт такой набор:

Chain INPUT (policy ACCEPT)
num  target     prot opt source               destination
1    ACCEPT     all  --  anywhere             anywhere             state RELATED,ESTABLISHED
2    ACCEPT     icmp --  anywhere             anywhere
3    ACCEPT     all  --  anywhere             anywhere
4    ACCEPT     tcp  --  anywhere             anywhere             state NEW tcp dpt:ssh
5    REJECT     all  --  anywhere             anywhere             reject-with icmp-host-prohibited

Стандартный набор правил обеспечивает защиту сервера с учетом его состояния и сбрасывает весь входящий трафик, кроме трафика разрешенных сервисов. Трафик SSH разблокирован по умолчанию. Обратите внимание на правило 5 (оно выделено красным). Это общее правило сброса трафика: чтобы настроить поддержку Docker Swarm, все соответствующие правила нужно добавить перед ним.

Чтобы добавить правила, используйте утилиту iptables. Запустите следующий набор команд на менеджерах кластера Swarm:

iptables -I INPUT 5 -p tcp --dport 2376 -j ACCEPT
iptables -I INPUT 6 -p tcp --dport 2377 -j ACCEPT
iptables -I INPUT 7 -p tcp --dport 7946 -j ACCEPT
iptables -I INPUT 8 -p udp --dport 7946 -j ACCEPT
iptables -I INPUT 9 -p udp --dport 4789 -j ACCEPT

Если вы не сохраните эти правила, они будут действительны только до следующей перезагрузки сервера, после чего iptables сбросит их. Чтобы сохранить правила, введите:

/usr/libexec/iptables/iptables.init save

Теперь правила сохранены в каталог /etc/sysconfig. Просмотрите набор правил:

iptables -L --line-numbers

Команда вернёт:

Chain INPUT (policy ACCEPT)
num  target     prot opt source               destination
1    ACCEPT     all  --  anywhere             anywhere             state RELATED,ESTABLISHED
2    ACCEPT     icmp --  anywhere             anywhere
3    ACCEPT     all  --  anywhere             anywhere
4    ACCEPT     tcp  --  anywhere             anywhere             state NEW tcp dpt:ssh
5    ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:2376
6    ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:7946
7    ACCEPT     udp  --  anywhere             anywhere             udp dpt:7946
8    ACCEPT     udp  --  anywhere             anywhere             udp dpt:4789
9    ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:http
10   REJECT     all  --  anywhere             anywhere             reject-with icmp-host-prohibited

Перезапустите Docker:

systemctl restart docker

После этого нужно выполнить следующий набор команд на всех воркерах Swarm:

iptables -I INPUT 5 -p tcp --dport 2376 -j ACCEPT
iptables -I INPUT 6 -p tcp --dport 7946 -j ACCEPT
iptables -I INPUT 7 -p udp --dport 7946 -j ACCEPT
iptables -I INPUT 8 -p udp --dport 4789 -j ACCEPT

Сохраните правила:

/usr/libexec/iptables/iptables.init save

Перезапустите Docker:

systemctl restart docker

Теперь брандмауэр IPTables поддерживает Docker Swarm.

Читайте также: Как работает IPTables

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

iptables -I INPUT rule-number -p tcp --dport 80 -j ACCEPT

Помните, что все правила, которые открывают трафик, нужно добавлять перед правилом сброса.

Заключение

FirewallD и IPTables – основные инструменты для управления брандмауэром в CentOS 7. Теперь вы знаете, как с их помощью открыть порты в брандмауэре для поддержки кластера Docker Swarm.

Tags: , , , , ,

Добавить комментарий