Вступление
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
для оверлейного сетевого трафика (входящая сеть контейнера).
Note: Помимо этих портов, порт22
(для трафика SSH) и любые другие порты, необходимые для работы определенных сервисов в кластере, должны быть открыты.
В этой статье вы узнаете, как настроить брандмауэр Linux в Ubuntu 16.04, используя различные приложения для управления брандмауэром, доступные во всех дистрибутивах Linux. Этими приложениями управления брандмауэром являются FirewallD, IPTables Tools и UFW, несложный брандмауэр. UFW - это приложение брандмауэра по умолчанию в дистрибутивах Ubuntu, включая Ubuntu 16.04. Хотя это руководство охватывает три метода, каждый из них дает один и тот же результат, поэтому вы можете выбрать тот, который вам наиболее знаком.
Предпосылки
Прежде чем приступить к этой статье, вы должны:
-
Настройте хосты, которые составляют ваш кластер, включая по крайней мере одного менеджера роя и одного работника роя. Вы можете следовать руководствуHow To Provision and Manage Remote Docker Hosts with Docker Machine on Ubuntu 16.04, чтобы настроить их.
Note: Вы заметите, что команды (и все команды в этой статье) не имеют префиксаsudo
. Это потому, что предполагается, что вы вошли на сервер с помощью командыdocker-machine ssh
после его инициализации с помощью Docker Machine.
[[method-1 -—- open-docker-swarm-ports-using-ufw]] == Метод 1 - открытие портов Docker Swarm с помощью UFW
Если вы просто настроили свои хосты Docker, UFW уже установлен. Вам просто нужно включить и настроить его. Следуйтеthis guide, чтобы узнать больше об использовании UFW в Ubuntu 16.04.
Выполните следующие команды на узлах, которые будут функционировать как менеджеры Swarm:
ufw allow 22/tcp
ufw allow 2376/tcp
ufw allow 2377/tcp
ufw allow 7946/tcp
ufw allow 7946/udp
ufw allow 4789/udp
После этого перезагрузите UFW:
ufw reload
Если UFW не включен, сделайте это с помощью следующей команды:
ufw enable
Это может быть необязательно, но никогда не повредит перезапустить демон Docker каждый раз, когда вы вносите изменения и перезапускаете брандмауэр:
systemctl restart docker
Затем на каждом узле, который будет работать как рабочий, выполните следующие команды:
ufw allow 22/tcp
ufw allow 2376/tcp
ufw allow 7946/tcp
ufw allow 7946/udp
ufw allow 4789/udp
После этого перезагрузите UFW:
ufw reload
Если UFW не включен, включите его:
ufw enable
Затем перезапустите демон Docker:
systemctl restart docker
Это все, что вам нужно сделать, чтобы открыть необходимые порты для Docker Swarm с помощью UFW.
[[метод-2 -—- open-docker-swarm-ports-using-firewalld]] == Метод 2 - открытие портов Docker Swarm с помощью FirewallD
FirewallD - это приложение брандмауэра по умолчанию в Fedora, CentOS и других дистрибутивах Linux, основанных на них. Но FirewallD также доступен в других дистрибутивах Linux, включая Ubuntu 16.04.
Если вы решите использовать FirewallD вместо UFW, сначала удалите UFW:
apt-get purge ufw
Затем установите FirewallD:
apt-get install firewalld
Убедитесь, что он работает:
systemctl status firewalld
Если он не запущен, запустите его:
systemctl start firewalld
Затем включите его, чтобы он запускался при загрузке:
systemctl enable firewalld
На узле, который будет менеджером Swarm, используйте следующие команды, чтобы открыть необходимые порты:
firewall-cmd --add-port=22/tcp --permanent
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
[.note] #Note: Если вы допустили ошибку и вам нужно удалить запись, введите:firewall-cmd --remove-port=port-number/tcp —permanent
.
#
После этого перезагрузите брандмауэр:
firewall-cmd --reload
Затем перезапустите Docker.
systemctl restart docker
Затем на каждом узле, который будет работать как рабочий Swarm, выполните следующие команды:
firewall-cmd --add-port=22/tcp --permanent
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.
[[method-3 -—- open-docker-swarm-ports-using-iptables]] == Метод 3 - открытие портов Docker Swarm с помощью IPTables
Чтобы использовать IPtables в любом дистрибутиве Linux, вам сначала нужно удалить любые другие утилиты брандмауэра. Если вы переключаетесь с FirewallD или UFW, сначала удалите их.
Затем установите пакетiptables-persistent
, который управляет автоматической загрузкой правил IPtables:
apt-get install iptables-persistent
Затем удалите все существующие правила, используя эту команду:
netfilter-persistent flush
Теперь вы можете добавлять правила с помощью утилитыiptables
. Этот первый набор команд должен выполняться на узлах, которые будут служить менеджерами Swarm.
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -p tcp --dport 2376 -j ACCEPT
iptables -A INPUT -p tcp --dport 2377 -j ACCEPT
iptables -A INPUT -p tcp --dport 7946 -j ACCEPT
iptables -A INPUT -p udp --dport 7946 -j ACCEPT
iptables -A INPUT -p udp --dport 4789 -j ACCEPT
После ввода всех команд сохраните правила на диск:
netfilter-persistent save
Затем перезапустите Docker.
sudo systemctl restart docker
На узлах, которые будут работать как рабочие Swarm, выполните эти команды:
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -p tcp --dport 2376 -j ACCEPT
iptables -A INPUT -p tcp --dport 7946 -j ACCEPT
iptables -A INPUT -p udp --dport 7946 -j ACCEPT
iptables -A INPUT -p udp --dport 4789 -j ACCEPT
Сохраните эти новые правила на диск:
netfilter-persistent save
Затем перезапустите Docker:
sudo systemctl restart docker
Это все, что нужно, чтобы открыть необходимые порты для Docker Swarm с помощью IPTables. Вы можете узнать больше о том, как работают эти правила, в руководствеHow the Iptables Firewall Works.
Если вы хотите переключиться на FirewallD или UFW после использования этого метода, правильный способ - сначала остановить брандмауэр:
sudo netfilter-persistent stop
Затем очистите правила:
sudo netfilter-persistent flush
Наконец, сохраните пустые таблицы на диск:
sudo netfilter-persistent save
Затем вы можете переключиться на UFW или FirewallD.
Заключение
FirewallD, IPTables Tools и UFW - три приложения для управления брандмауэрами в мире Linux. Вы только что узнали, как использовать каждый из них для открытия сетевых портов, необходимых для настройки Docker Swarm. Какой метод вы используете, это вопрос личных предпочтений, так как все они одинаково способны.