Вступление
Docker Swarm - это функция Docker, облегчающая запуск хостов и контейнеров Docker в масштабе. Docker Swarm, или Docker кластер, состоит из одного или нескольких Dockerized хостов, которые функционируют как manager узлы, и любого количества worker узлов. Настройка такой системы требует осторожного манипулирования брандмауэром Linux.
Сетевые порты, необходимые для корректной работы Docker Swarm:
-
TCP-порт
+ 2376 +
для безопасного общения с клиентом Docker. Этот порт необходим для работы Docker Machine. Docker Machine используется для организации хостов Docker. -
TCP-порт
+ 2377 +
. Этот порт используется для связи между узлами Docker Swarm или кластера. Его нужно открыть только на узлах менеджера. -
TCP и UDP порт
+ 7946 +
для связи между узлами (обнаружение контейнерной сети). -
UDP-порт
+ 4789 +
для оверлейного сетевого трафика (входная сеть контейнера).
В этой статье вы настроите брандмауэр Linux на CentOS 7, используя FirewallD и IPTables. FirewallD является приложением брандмауэра по умолчанию в CentOS 7, но также доступны IPTables. Хотя это руководство охватывает оба метода, каждый из них дает один и тот же результат, поэтому вы можете выбрать тот, который вам наиболее знаком.
Предпосылки
Прежде чем приступить к этой статье, вы должны:
-
Настройте хосты, которые составляют ваш кластер, включая по крайней мере одного менеджера роя и одного работника роя. Вы можете следовать учебнику How To Provision и Управление удаленными хостами Docker с помощью Docker Machine в CentOS 7), чтобы настроить их.
Метод 1 - Откройте порты Docker Swarm с помощью FirewallD
FirewallD является приложением брандмауэра по умолчанию в CentOS 7, но на новом сервере CentOS 7 оно отключено «из коробки». Итак, давайте включим его и добавим сетевые порты, необходимые для работы Docker Swarm.
Перед началом проверьте его статус:
systemctl status firewalld
Он не должен быть запущен, поэтому запустите его:
systemctl start 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 --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.
Метод 2 - Откройте порты Docker Swarm с помощью IPTables
Чтобы использовать IPTables в любом дистрибутиве Linux, вам сначала нужно удалить любые другие утилиты брандмауэра. Чтобы переключиться на IPTables из FirewallD, сначала остановите 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
Вывод должен выглядеть точно так:
OutputChain 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
Взятые вместе, правила по умолчанию обеспечивают защиту сервера с сохранением состояния, запрещая весь входной трафик, кроме тех, которые уже установлены. SSH трафик разрешен в. Обратите внимание на правило № 5, выделенное выше, потому что это правило отказа от мошенничества. Для правильной работы Docker Swarm добавленные вами правила должны быть добавлены обыше этого правила. Это означает, что новые правила должны быть вставлены, а не добавлены в цепочку INPUT.
Теперь, когда вы знаете, что делать, вы можете добавить нужные вам правила, используя утилиту + 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
Эти правила являются правилами времени выполнения и будут потеряны при перезагрузке системы. Чтобы сохранить текущие правила времени выполнения в файл, чтобы они сохранялись после перезагрузки, введите:
/usr/libexec/iptables/iptables.init save
Правила теперь сохраняются в файле с именем + iptables +
в каталоге + / etc / sysconfig +
. И если вы просматриваете правила, используя + iptables -L --line-numbers +
, вы увидите, что все правила были вставлены над правилом отклонения всеобъемлющего:
OutputChain 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.
Outputsystemctl 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
Это все, что нужно, чтобы открыть необходимые порты для Docker Swarm с помощью IPTables. Вы можете узнать больше о том, как эти правила работают, из учебника Wow the IPTables Firewall Works.
Заключение
FirewallD и IPTables - два самых популярных приложения для управления брандмауэром в мире Linux. Вы только что прочитали, как использовать их для открытия сетевых портов, необходимых для настройки Docker Swarm. Метод, который вы используете, - это вопрос личных предпочтений, потому что все они одинаково способны.