Jak zintegrować Dockera z Fail2ban lub nftables – praktyczny poradnik
Docker domyślnie izoluje kontenery, ale ruch przychodzący do aplikacji (np. Nginx, SSH w kontenerze) przechodzi przez hosta. To oznacza, że Fail2ban i nftables mogą działać na poziomie systemu gospodarza (hosta), chroniąc jednocześnie aplikacje działające w kontenerach.
🔍 Scenariusz: co chcemy osiągnąć?
- Aplikacja w kontenerze (np. nginx lub SSH) narażona jest na ataki
- Chcemy, aby Fail2ban wykrywał złośliwy ruch z logów (np.
/var/log/nginx/access.log) - Chcemy, aby nftables blokował IP źródłowe ataku
- Wszystko to działało na hoście, a nie wewnątrz kontenera
🛠️ Krok 1: Udostępnienie logów kontenera na hoście
Aby Fail2ban mógł analizować logi kontenera, musimy:
- przekierować logi kontenera do hosta
- lub zamontować wolumen z logami
📂 Przykład: logi Nginx z kontenera
Struktura:
/var/log/docker/nginx-access.log
Uruchom kontener z wolumenem:
docker run -d \
--name nginx \
-v /var/log/docker/nginx-access.log:/var/log/nginx/access.log \
nginx
Upewnij się, że nginx loguje do /var/log/nginx/access.log.

🔒 Krok 2: Konfiguracja jail’a Fail2ban
Plik: /etc/fail2ban/jail.d/docker-nginx.conf
[docker-nginx]
enabled = true
filter = nginx-http-auth
port = http,https
logpath = /var/log/docker/nginx-access.log
maxretry = 5
bantime = 600
findtime = 300
action = nftables[name=docker-nginx]
➡️ Zakładamy, że używasz nftables jako backend (opisywane wcześniej).
➡️ Jeśli nie – możesz użyć iptables-multiport, route, sendmail, itp.
🔧 Krok 3: Upewnij się, że filtr działa
W pliku /etc/fail2ban/filter.d/nginx-http-auth.conf powinien znajdować się odpowiedni regex do wykrywania prób nieautoryzowanego dostępu. Możesz napisać własny filtr, np. dla błędów 401/403:
[Definition]
failregex = ^<HOST> -.* "(GET|POST).*HTTP.*" 401
🧱 Krok 4: Docker a nftables – co warto wiedzieć
Docker tworzy własne reguły NAT i często używa własnych łańcuchów (DOCKER, DOCKER-USER). Dlatego:
🔥 Blokada IP przez nftables działa na poziomie INPUT:
Jeśli ruch z kontenera trafia przez bridge (np. docker0), to możesz zablokować IP przychodzące do hosta, zanim trafi do kontenera.
Użyj własnego łańcucha:
nft add rule inet filter input ip saddr 1.2.3.4 drop
🛡️ Dodatkowa ochrona: DOCKER-USER
Jeśli chcesz mieć pełną kontrolę nad ruchem kontenerów, najlepiej użyć DOCKER-USER (w iptables lub jego odpowiednik w nftables):
iptables -I DOCKER-USER -s 1.2.3.4 -j DROP
Albo:
nft add rule ip filter docker-user ip saddr 1.2.3.4 drop
➡️ Fail2ban może wykonywać takie akcje automatycznie, jeśli dostosujesz actionban.
🔧 Krok 5: Restart usług i test
Po dodaniu jail’a:
sudo systemctl restart fail2ban
Test banowania:
fail2ban-client set docker-nginx banip 1.2.3.4
nft list set inet filter f2b-docker-nginx
✅ Podsumowanie
Dzięki integracji Fail2ban + Docker + nftables:
- Zabezpieczasz kontenery bez instalowania Fail2ban wewnątrz nich
- Centralnie zarządzasz bezpieczeństwem na poziomie hosta
- Blokujesz złośliwy ruch automatycznie i skutecznie
To idealne rozwiązanie dla serwerów produkcyjnych, VPS-ów, a także środowisk testowych, gdzie bezpieczeństwo ma znaczenie.






