Disassembler

Artificial intelligence is no match for natural stupidity.
15říjen2011

Fail2Ban: Oprava vytváření iptables pravidel


Pokud používáte Fail2Ban na deb-based systémech, možná se vám, stejně jako mě, už někdy stalo, že Fail2Ban nesprávně nastavil iptables pravidla tak, že některá nebyla referencována nebo úplně chyběla. Poradím vám jak tento neduh odstranit.

Paralelní zpracování


Fail2Ban při startu odpálí sérii příkazů, kterými nastaví iptables. Ale na víceprocesorových systémech (tedy v současnosti téměř na všech) se často stane, že spustí dva procesy paralelně a to se iptables nelíbí. V logu Fail2Ban se pak objeví třeba

2011-10-17 11:59:54,211 fail2ban.actions.action: ERROR  iptables -N fail2ban-sasl
iptables -A fail2ban-sasl -j RETURN
iptables -I INPUT -p tcp -m multiport --dports smtp,pop3,pop3s,imap2,imaps -j fail2ban-sasl returned 400

A v iptables pak

root@debian:~# iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination
fail2ban-dovecot  tcp  --  anywhere             anywhere            multiport dports pop3,pop3s,imap2,imaps
fail2ban-ssh  tcp  --  anywhere             anywhere            multiport dports ssh

...

Chain fail2ban-dovecot (1 references)
target     prot opt source               destination
RETURN     all  --  anywhere             anywhere

Chain fail2ban-postfix (1 references)
target     prot opt source               destination
RETURN     all  --  anywhere             anywhere

Chain fail2ban-sasl (0 references)
target     prot opt source               destination
RETURN     all  --  anywhere             anywhere

Jail pro SASL tedy existuje, ale pravidlo, které do něj nevychované IP strká, už ne.

Spěchejte pomalu


Bude asi ještě nějakou chvíli trvat, než tvůrce aplikace problém vyřeší a fix se dostane do oficiálních repozitářů a tak zatím tento neduh léčím workaroundem, který sice také zahrnuje čekání, avšak o mnoho kratší

--- fail2ban-client.old 2011-10-17 12:56:23.000000000 +0200
+++ fail2ban-client     2011-10-17 12:57:00.000000000 +0200
@@ -142,6 +142,7 @@
        def __processCmd(self, cmd, showRet = True):
                beautifier = Beautifier()
                for c in cmd:
+                       time.sleep(0.1)
                        beautifier.setInputCmd(c)
                        try:
                                client = CSocket(self.__conf["socket"])

100ms je dostatečně dlouho na to, aby iptables příkaz provedly a nezasukovaly se. Při vyšším počtu pravidel Fail2Banu je jeho start nepatrně delší, ale pokud server nerestartujete pětkrát do hodiny, myslím, že to ničemu nevadí.