Настройка firewall для docker swarm

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

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