Jedan banaction, dva transporta: popravka fail2ban-VPN-jaila
Ban je samo onoliko širok koliko protokol u njegovoj akciji. Uporedite brojače lanca sa listenerima, pa pokrijte oba transporta u samom jail-u.
Ništa u fail2ban-u ne odbacuje paket samo po sebi: on poziva akciju, a upravo ta akcija imenuje protokol i port. Kada jail prijavi ban dok daemon nastavlja prihvatati prijave, ban je obično stvaran i uži nego što log implicira. Klijent koji se ponovo poveže preko drugog transporta nikada ne susreće instalirano pravilo. Uporedite šta je akcija instalirala sa onim što daemon sluša prije nego što bilo šta promijenite, jer dokaz leži u firewall lancu koji je akcija napisala, a ne u listi jail-a.
Čitajte lanac, a ne sažetak jail-a
fail2ban ubacuje svoj lanac ispred lanca usluge, pa lista brojača pokazuje tačno šta postoji. Lanac nazvan po jail-u, koji drži jedno pravilo čija kolona protokola glasi udp, potpuno objašnjava TCP prijave koje stalno pristižu. Odbijaju se samo UDP paketi sa banovanog izvora. Usluga ima TCP listener i ništa u tom lancu ga ne dira.
Obratite pažnju i na efekat susjednog jail-a. Jedan host može izgledati savršeno konfigurisan samo zato što drugi jail daje polovinu koja nedostaje, a ista gradnja ne radi ništa tamo gdje taj jail nije instaliran.
Akcija imenuje jedan protokol i tu se lomi
Svaki banaction je šablon firewall komande, a protokol stoji u jednom od njegovih rezervisanih mjesta. Uskost je namjerna, jer web jail i DNS jail nemaju šta da traže u blokiranju identičnih portova. To postaje zamka kada usluga sluša na više od jednog transporta, što VPN daemoni rutinski rade. Filter može pratiti neuspjele prijave sa oba transporta dok akcija pokriva jedan.
SoftEther i OpenVPN instalacije obično slušaju na UDP i TCP istovremeno, a pošto log linija izgleda isto u oba slučaja, filter prati oba. Asimetrija se nikada ne pokazuje u izvještaju samog jail-a. fail2ban je tačno izbrojao neuspjehe i zatim instalirao pravilo koje se primjenjuje na polovinu saobraćaja na kojem su ti neuspjesi stigli.
Neka ban pokrije oba transporta
Popravite to u definiciji jail-a; ručno napisana pravila će sljedeće reloadovanje promiješati. Navedite dvije akcije, jednu za svaki protokol:
action = %(banaction)s[name=%(__name__)s-tcp, actionname=%(__name__)s-tcp, protocol="tcp", port="%(port)s", chain="%(chain)s"]
%(banaction)s[name=%(__name__)s-udp, actionname=%(__name__)s-udp, protocol="udp", port="%(port)s", chain="%(chain)s"]
Ne pokušavajte to skratiti sa protocol = all. Podrazumijevani banaction je multiport akcija i proširuje se na -p <protocol> -m multiport --dports <port>; bez L4 protokola nema šta da provjeri podudaranje porta, pa iptables odbija pravilo dok jail i dalje prijavljuje uspješan ban. Akcija za sve portove kao što je iptables-allports ili nftables-allports prihvata jedan unos, ali banuje svaki port na tom izvoru, što je drugačija odluka i traži vlastito obrazloženje. Ostavite protocol na tcp ili udp i prihvatite dva unosa.
Dokažite da pravilo postoji, umjesto da vjerujete postavci, jer postavka opisuje namjeru dok je lanac ne zadrži:
iptables -S f2b-vpn-tcp
iptables -S f2b-vpn-udp
Svaki lanac treba da navede jedno pravilo: u prvom -p tcp, u drugom -p udp, i oba imenuju banovanu adresu. Zatim potvrdite da se ista adresa odbija na oba transporta. Ban koji niste vidjeli u lancu je nada, a sljedeći izvještaj o istom simptomu ponovo će koštati isti sat.
Šta ban još propušta i sljedeći slučaj
Akcija odbija jedan izvor i to samo na portovima navedenim u njoj. Ne radi ništa protiv napadača koji rotira adrese i ne može odvojiti neprijateljsku mašinu od carrier-grade NAT izlaza koji dijeli stotine korisnika, gdje jedan ban isključuje ljude koji nisu učinili ništa. Uvjerite se da filter čita adresu koju klijent zaista ima, a ne proslijeđeno zaglavlje ili proxy adresu. Držite prozor dovoljno kratkim da greška sama istekne.
Ništa od toga ne zagovara preskakanje popravke protokola; zagovara držanje dvije ideje istovremeno. Ban je uži nego što sažetak jail-a sugeriše, a čak i potpun ban je uži od prijetnje. Stavite firewall lanac pored liste listenera daemona i uporedite protokol po protokol, jer te dvije liste odlučuju može li ban uopšte stići do usluge.
Držite komandu za reload i listu lanaca u runbook-u pored jail-a. Sljedeća osoba će trebati oboje, a sažetak jail-a joj neće reći ni jedno.