Thank you for reading this post, don't forget to subscribe!
Для корректной работы кластера Docker Swarm необходимы следующие порты:
- TCP-порт 2376 – для безопасного взаимодействия клиентов Docker и работы Docker Machine (программы, которая обеспечивает оркестровку хостов Docker).
- TCP-порт 2377 – для взаимодействия нод кластера Docker Swarm (нужно открыть только на нодах-менеджерах).
- TCP- и UDP-порт 7946 – для связи между нодами (обнаружение сети контейнера).
- UDP-порт 4789 – для трафика оверлейной сети.
Примечание: Помимо вышеперечисленных портов откройте порт 22 (трафик SSH) и любые другие порты, необходимые для поддержки сервисов кластера.
Метод 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.
Примечание: Если вы хотите протестировать в кластере приложения, которым необходим доступ к сети, откройте в брандмауэре соответствующий порт. К примеру, чтобы протестировать приложение, которое использует порт 80, добавьте в настройки правило, которое разблокирует этот порт. Для этого запустите на всех менеджерах и воркерах кластера следующую команду:
iptables -I INPUT rule-number -p tcp --dport 80 -j ACCEPT
Помните, что все правила, которые открывают трафик, нужно добавлять перед правилом сброса.