Как использовать Docker с UFW параллельно

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

Docker не рабо­та­ет из короб­ки с “Universal Firewall” Linux, или UFW.

UFW заду­ман как очень про­стой брандмауэр.

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

Если вы настро­и­те базо­вый бранд­мау­эр UFW на запрет по умол­ча­нию и раз­ре­ше­ние HTTP и SSH, это будет выгля­деть без­опас­ным, но не будет бло­ки­ро­вать запуск кон­тей­не­ров Docker, при­вя­зан­ных к дру­гим портам.

Эту про­бле­му может быть труд­но пой­мать, посколь­ку UFW и Docker – это отдель­ные системы.

UFW неосо­знан­но обма­ны­ва­ет вас и не пока­зы­ва­ет откры­тые пор­ты кон­тей­не­ров Docker.

Это может стать серьез­ной про­бле­мой, если вы не реши­те ее.

Напри­мер, воз­мож­но, вы хоти­те запу­стить даш­борд адми­ни­стра­то­ра на пор­ту 8000 и вне­сти его в белый спи­сок для ваше­го соб­ствен­но­го IP-адреса.

Хотя это не самая без­опас­ная настрой­ка, обыч­но все в поряд­ке, осо­бен­но если даш име­ет допол­ни­тель­ную аутентификацию.

Тем не менее, UFW пока­жет пра­ви­ло бранд­мау­э­ра как пра­виль­но вне­сен­ное в белый спи­сок, и оно, конеч­но, будет вид­но вам с ваше­го места, вне­сен­но­го в белый список.

Но если оно запу­ще­но через Docker, то по умол­ча­нию оно будет вид­но на пор­ту 8000 из любо­го места.

Исправление конфигурации Docker

Есть реше­ние, кото­рое пред­ла­га­ет Docker: отре­дак­ти­руй­те /etc/default/docker или /etc/docker/daemon.json и про­сто отклю­чи­те функ­ци­о­наль­ность iptables в Docker:

Это рабо­та­ет, одна­ко это лишь поло­вин­ча­тое решение.

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

Это все еще может рабо­тать, но вам при­дет­ся вруч­ную под­дер­жи­вать пра­ви­ла iptables для кон­тей­не­ров Docker и поль­зо­ва­тель­ских сетей, что слож­но, раз­дра­жа­ет и лиша­ет цель про­сто­ты UFW.

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

По сути, вам нуж­но изме­нить кон­фи­гу­ра­цию UFW в /etc/ufw/after.rules и доба­вить сле­ду­ю­щий блок в конце:

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

Вы може­те загру­зить ее из это­го репозитория:

Затем уста­но­ви­те кон­фиг и пере­за­пу­сти­те UFW.

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

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

Белые списки портов контейнеров Docker с помощью UFW

Это реше­ние потре­бу­ет от вас немно­го дру­гой кон­фи­гу­ра­ции портов.

В ути­ли­те ufw-docker есть коман­да, кото­рая выбо­роч­но вно­сит пор­ты в белый спи­сок для опре­де­лен­ных кон­тей­не­ров Docker.

Одна­ко если вы хоти­те исполь­зо­вать более про­дви­ну­тое пра­ви­ло, напри­мер, белый спи­сок на осно­ве IP, вам при­дет­ся исполь­зо­вать ufw route allow