Integracja Dockera z firewalld – kontrola ruchu bez iptables

Wprowadzenie

Docker zrewolucjonizował wdrażanie aplikacji dzięki konteneryzacji usług. Jednak domyślnie zarządza on regułami iptables, co może powodować konflikty z narzędziami takimi jak firewalld, które służą do centralnego zarządzania zaporą sieciową.

W tym przewodniku pokażemy, jak wyłączyć domyślne zarządzanie iptables przez Dockera i skonfigurować firewalld do obsługi ruchu sieciowego kontenerów.

Krok 1: Wyłączenie zarządzania iptables przez Dockera

Docker automatycznie dodaje własne reguły iptables, co może kolidować z firewalld. Aby temu zapobiec:

Edytuj lub utwórz plik konfiguracyjny demona Dockera:

// /etc/docker/daemon.json
{
  "iptables": false
}

Zrestartuj Dockera:

sudo systemctl restart docker

Docker przestanie teraz dodawać własne reguły zapory.

Krok 2: Konfiguracja firewalld dla ruchu Docker

Teraz musisz utworzyć odpowiednie reguły w firewalld.

Przykład: Zezwól na ruch HTTP w strefie public

sudo firewall-cmd --zone=public --add-service=http --permanent
sudo firewall-cmd --reload

Opcjonalnie: Utwórz dedykowaną strefę dla Dockera

Można przypisać interfejs docker0 do nowej strefy:

sudo firewall-cmd --permanent --new-zone=docker
sudo firewall-cmd --permanent --zone=docker --add-interface=docker0

Krok 3: Monitorowanie za pomocą dmesg

Użyj dmesg, aby monitorować wpisy REJECT wskazujące na zablokowany ruch:

sudo dmesg -T -w | grep -i REJECT

Przykładowy wynik:

[Tue Oct 31 18:43:42 2023] filter_FWD_FedoraServer_REJECT: IN=br-... SRC=172.18.0.4 DST=172.18.0.2 ...

Podsumowanie

Wyłączając iptables w Dockerze i zarządzając ruchem przez firewalld, zyskujesz:

Uniknięcie konfliktów między Dockerem a innymi zaporami

Centralne zarządzanie portami i usługami

Lepszą widoczność i możliwość audytu logów systemowych

Przed wprowadzeniem zmian zawsze wykonaj kopię zapasową reguł zapory i przetestuj konfigurację.