Заблокировать доступ к контейнерам Docker из интернета

Thank you for reading this post, don't forget to subscribe!

Docker по-умол­ча­нию под­ни­ма­ет свои кон­тей­не­ры с досту­пом к ним ото­всю­ду. Ника­ких огра­ни­че­ний нет и настро­ить их не очень про­сто без пони­ма­ния рабо­ты docker и iptables

Docker облег­чил рабо­ту совре­мен­ным раз­ра­бот­чи­кам и услож­нил жизнь адми­нам. Такая про­стая зада­ча, как бло­ки­ров­ка досту­па к како­му-то сер­ви­су с помо­щью iptables рез­ко услож­ни­лась. Напри­мер, есть у вас оди­ноч­ный сер­вер, на нем рабо­та­ют несколь­ко кон­тей­не­ров docker. Iptables вы не настра­и­ва­ли вооб­ще, сво­их пра­вил нет.

Тем не менее, набор пра­вил iptables на хосте будет при­мер­но такой.

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

В круп­ных про­ек­тах эта про­бле­ма реша­ет­ся про­сто — все хосты с кон­тей­не­ра­ми закры­ты внеш­ним шлю­зом с фаер­во­лом, кото­рый может из себя пред­став­лять все, что угод­но, но не хост с кон­тей­не­ра­ми. Реа­ли­за­ции могут быть любы­ми. Важ­но, что это отдель­ная сущность.

Тем, у кого кон­тей­не­ры рабо­та­ют на отдель­ных хостах, смот­ря­щих напря­мую в интер­нет, надо что-то делать у себя. Я пока­жу про­стой при­мер, как забло­ки­ро­вать доступ к како­му-то кон­тей­не­ру Docker из интернет.

Докер созда­ет отдель­ную цепоч­ку DOCKER-USER. Она про­ве­ря­ет­ся рань­ше основ­ной дина­ми­че­ской цепоч­ки DOCKER. Если вы хоти­те настро­ить свои пра­ви­ла досту­па к кон­тей­не­рам, добав­ляй­те их в цепоч­ку DOCKER-USER. Сер­вис не будет их тро­гать и изме­нять при рестар­те или изме­не­ни­ях в контейнерах

Допу­стим, у нас есть кон­тей­нер с postgresql, кото­рый забин­ден на порт хоста 5432. По-умол­ча­нию, к нему будет доступ из интер­не­та. Что­бы запре­тить доступ к кон­тей­не­ру, необ­хо­ди­мо при­ме­нить сле­ду­ю­щее правило.

В дан­ном при­ме­ре eth0 — внеш­ний интер­фейс, кото­рый смот­рит в интер­нет. Услож­ним зада­чу. Вам надо запре­тить доступ из интер­не­та к кон­тей­не­ру, но при этом раз­ре­шить доступ с опре­де­лен­ных ip адре­сов. Нам нуж­но при­ме­нить несколь­ко пра­вил и сле­дить за тем, что­бы раз­ре­ша­ю­щие пра­ви­ла были выше запре­ща­ю­щих. Это мож­но сде­лать обыч­ной нуме­ра­ци­ей правил.

Мы раз­ре­ши­ли доступ с ip 1.2.3.4 и 5.6.7.8, всем осталь­ным запре­ти­ли, при­чем раз­ре­ша­ю­щие пра­ви­ла поста­ви­ли выше.

Посмот­реть спи­сок пра­вил кон­крет­ной цепоч­ки с нуме­ра­ци­ей мож­но командой:

Если вам надо очи­стить кон­крет­ную цепоч­ку с пра­ви­ла­ми, исполь­зуй­те команду.

Если захо­ти­те заод­но забло­ки­ро­вать посто­рон­ним людям доступ по ssh, добавь­те сле­ду­ю­щие пра­ви­ла в цепоч­ку INPUT.

Я реко­мен­дую не ленить­ся и закры­вать доступ посто­рон­ним ко все­му, что им не нуж­но. Важ­но делать это в том чис­ле на dev сер­ве­рах. Эта ста­тья в основ­ном для них. Раз­ра­бот­чи­ки часто созда­ют тесто­вые сер­ве­ры и осо­бо не сле­дят за ними, хотя там могут быть про­дук­то­вые базы и про­чая при­ват­ная инфор­ма­ция. Iptables для них тем­ный лес.

Луч­ше сра­зу после созда­ния dev сер­ве­ра закрыть от посто­рон­них глаз все, что на нем есть, исполь­зуя про­стые пра­ви­ла, кото­рые мож­но при­ме­нить пря­мо в консоли.

Я пред­ло­жил про­стое и топор­ное реше­ние в лоб. Дан­ную зада­чу мож­но решить раз­лич­ны­ми спо­со­ба­ми. Напри­мер, пра­ви­ла iptables мож­но настра­и­вать сра­зу вме­сте с кон­тей­не­ром и при­ме­нять их при запус­ке. Мож­но вооб­ще отклю­чить дина­ми­че­ское управ­ле­ние пра­ви­ла­ми со сто­ро­ны docker и писать их все само­сто­я­тель­но. Но это все тре­бу­ет боль­ше вре­ме­ни на настройку.

Что­бы после ребу­та сер­ве­ра пра­ви­ла авто­ма­ти­че­ски при­ме­ни­лись, мож­но офор­мить их в про­стой bash скрипт и запус­кать его с помо­щью cron, исполь­зуя в каче­стве рас­пи­са­ния пара­метр @reboot. Нуж­но толь­ко учесть один момент. Cron будет запус­кать скрипт рань­ше, чем успе­ет стар­та­нуть докер и создать свои цепоч­ки. Надо каким-то обра­зом его подо­ждать. Самый про­стой спо­соб поста­вить sleep на 5-10 секунд в скрип­те перед при­ме­не­ни­ем пра­вил для DOCKER-USER.