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.

Uwaga: ustawienie "iptables": false wyłącza automatyczne reguły Dockera, ale firewalld nie przejmuje automatycznie ich funkcji. Jeśli wybierzesz ten wariant, musisz samodzielnie zapewnić między innymi forwarding, NAT lub masquerading oraz filtrowanie ruchu kontenerów. Poniższy artykuł opisuje eksperymentalne podejście do pełnej ręcznej kontroli i nie powinien być traktowany jako kompletna konfiguracja produkcyjna.

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ę.