Quando si utilizza un reverse proxy (ad esempio Traefik) verso un server web e si vuole utilizzare fail2ban per poter blacklistare IP che effettuano tentativi di accesso ad applicativi web bisogna considerare due cose:
- il fatto che l’IP con cui il client si presenta al server web a livello applicativo va trattato in modo che il server veda l’IP di origine e non l’IP del reverse proxy
- il fatto che fail2ban agisce con iptables a layer 3 e quindi se anche bloccasse l’IP del client la connessione in arrivo sul server web provverrebbe dal proxy vanificando quindi l’effetto del banning.
Il primo punto è risolvibile impostando il proxy affinchè faccia passare l’IP del client nell’header X-Forwarded-For e impostando nel server web la sostituizione dell’IP remoto con quello dell’header indicato precedentemente (utilizzando ad esempio il modulo Remote-IP su Apache), eventualmente modificando anche il formato dei log (da cui fail2ban prende le informazioni) affinchè ci venga inserito il X-Forwarded-For.
Il secondo punto invece è aggirabile facendo in modo che vengano bloccati i pacchetti che contengono X-Forwarded-For: indirizzoIpDaBloccare:
- si crea una nuova action /etc/fail2ban/action.d/iptables-multiport-proxy-http.conf copiando iptables-multiport.conf e sostituendo le action di ban e unban con le seguente istruzioni
actionban = <iptables> -I f2b-<name> 1 -p tcp --dport 80 -m string --algo bm --string 'X-Forwarded-For: <ip>' -j <blocktype> actionunban = <iptables> -D f2b-<name> -p tcp --dport 80 -m string --algo bm --string 'X-Forwarded-For: <ip>' -j <blocktype>
- si modifica il file /etc/fail2ban/jail.local inserendo nelle jail relative ai servizi web la seguente banaction (eliminando la preesistenze se presente)
banaction = iptables-multiport-proxy-http