Viena banaction, du transportai: fail2ban VPN jail taisymas
Ban yra tik tiek platus, kiek jo veiksmo protokolas. Palyginkite grandinės skaitiklius su klausytojais ir tada apimkite abu transportus pačiame jail.
Niekas fail2ban pats savaime nemeta paketo: jis iškviečia veiksmą, ir būtent tas veiksmas įvardija protokolą ir prievadą. Kai jail praneša apie ban, o demonas toliau priima prisijungimus, ban paprastai yra tikras ir siauresnis, nei leidžia suprasti žurnalas. Klientas, kuris vėl prisijungia kitu transportu, niekada nesusiduria su įdiegta taisykle. Prieš ką nors keisdami palyginkite, ką veiksmas įdiegė, su tuo, ko klausosi demonas, nes įrodymas yra ugniasienės grandinėje, kurią įrašė veiksmas, o ne jail sąraše.
Skaitykite grandinę, o ne jail suvestinę
fail2ban įterpia savo grandinę prieš paslaugos grandinę, todėl skaitiklių sąrašas tiksliai parodo, kas egzistuoja. Grandinė, pavadinta jail vardu, turinti vieną taisyklę, kurios protokolo stulpelis rodo udp, yra išsamus paaiškinimas nuolat atvykstantiems TCP prisijungimams. Atmetami tik UDP paketai iš užblokuoto šaltinio. Paslauga turi TCP klausytoją, ir niekas toje grandinėje jo neliečia.
Atkreipkite dėmesį ir į kaimyninio jail poveikį. Vienas hostas gali atrodyti tobulai sukonfigūruotas vien todėl, kad trūkstamą pusę tiekia kitas jail, o tas pats build nieko nedaro ten, kur tas jail neįdiegtas.
Veiksmas įvardija vieną protokolą, ir būtent ten jis lūžta
Kiekvienas banaction yra ugniasienės komandos šablonas, o protokolas yra viename iš jo rezervuotų laukelių. Siaurumas yra tyčinis, nes interneto jail ir DNS jail neturi ką veikti blokuodami identiškus prievadus. Tai tampa spąstais, kai paslauga klausosi daugiau nei vieno transporto, ką VPN demonai daro nuolat. Filtras gali stebėti nepavykusius prisijungimus iš abiejų transportų, o veiksmas apima vieną.
SoftEther ir OpenVPN diegimai paprastai klausosi UDP ir TCP vienu metu, o kadangi žurnalo eilutė abiem atvejais atrodo vienodai, filtras stebi abu. Asimetrija niekada neparodoma pačio jail ataskaitoje. fail2ban teisingai suskaičiavo nesėkmes ir tada įdiegė taisyklę, kuri galioja pusei srauto, kuriuo atėjo tos nesėkmės.
Leiskite banui apimti abu transportus
Taisykite tai jail apibrėžime; ranka parašytos taisyklės bus sumaišytos kito perkrovimo metu. Išrašykite du veiksmus, po vieną kiekvienam protokolui:
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"]
Nemėginkite to sutrumpinti naudodami protocol = all. Numatytoji banaction yra multiport veiksmas, ir jis išsiplečia į -p <protocol> -m multiport --dports <port>; be L4 protokolo prievado atitikimui nėra ko tikrinti, todėl iptables atmeta taisyklę, o jail vis dar praneša apie sėkmingą ban. Visų prievadų veiksmas, pavyzdžiui, iptables-allports arba nftables-allports, priima vieną įrašą, bet blokuoja kiekvieną to šaltinio prievadą, o tai yra kitas sprendimas ir reikalauja savo pagrindimo. Palikite protocol ties tcp arba udp ir priimkite du įrašus.
Įrodykite, kad taisyklė egzistuoja, o ne pasitikėkite nustatymu, nes nustatymas apibūdina ketinimą tol, kol grandinė jį laiko:
iptables -S f2b-vpn-tcp
iptables -S f2b-vpn-udp
Kiekviena grandinė turėtų išvardyti vieną taisyklę, pirmoje -p tcp, antroje -p udp, ir abi įvardija užblokuotą adresą. Tada patvirtinkite, kad tas pats adresas atmetamas abiem transportais. Ban, kurio nematėte grandinėje, yra viltis, o kitas pranešimas apie tą patį simptomą vėl kainuos tą pačią valandą.
Ko ban vis dar praleidžia, ir kitas atvejis
Veiksmas atmeta vieną šaltinį ir tik prievaduose, kurie jame išvardyti. Jis nieko nedaro prieš užpuoliką, keičiantį adresus, ir negali atskirti priešiškos mašinos nuo operatoriaus lygio NAT išėjimo, kurį dalijasi šimtai naudotojų, kur vienas ban užrakina žmones, kurie nieko nepadarė. Įsitikinkite, kad filtras skaito adresą, kurį klientas iš tikrųjų turi, o ne persiųstą antraštę ar tarpinio serverio adresą. Laikykite langą pakankamai trumpą, kad klaida pasibaigtų savaime.
Niekas iš to nepateisina protokolo pataisos praleidimo; tai pateisina dviejų idėjų laikymąsi vienu metu. Ban yra siauresnis, nei leidžia suprasti jail suvestinė, ir net visiškas ban yra siauresnis už grėsmę. Padėkite ugniasienės grandinę šalia demono klausytojų sąrašo ir palyginkite protokolą po protokolo, nes šie du sąrašai nusprendžia, ar ban apskritai gali pasiekti paslaugą.
Laikykite perkrovimo komandą ir grandinių sąrašą runbook faile šalia jail. Kitam žmogui prireiks abiejų, o jail suvestinė jam nepasakys nė vieno.