Zobrazit stránkuStarší verzeZpětné odkazyNahoru Tato stránka je pouze pro čtení. Můžete si pouze prohlédnout zdrojový kód, ale ne ho měnit. Zeptejte se správce, pokud si myslíte, že něco není v pořádku. ====== Fail2ban ====== [[https://github.com/fail2ban/fail2ban|Fail2ban]] je nástroj pro dynamické blokování IP adres na základě logů služeb. Typicky se používá pro ochranu proti brute-force útokům na SSH, VPN, webové přihlášení nebo pro reakci na portscan. ===== Instalace ===== <code bash> apt install fail2ban cd /etc/fail2ban cp jail.conf jail.local </code> ===== SoftEther VPN ===== Pro [[infrastruktura:vpn:softether|SoftEther VPN]] je nejdřív potřeba zajistit, aby se neúspěšná přihlášení zapisovala do jednoho stabilního logu. V ''vpncmd'' jsem pro konkrétní hub nastavil: <code> VPN Server/DEFAULT> logswitchset LogSwitchSet command - Set Log File Switch Cycle Select Security or Packet: security Specify sec, min, hour, day, month or none: none </code> Výsledkem je soubor ''sec.log'', například: <code bash> ls -l /usr/vpnserver/security_log/DEFAULT/ </code> Pak stačí filtr a jail. Filtr ''/etc/fail2ban/filter.d/vpnserver.conf'': <code ini> [INCLUDES] before = common.conf [Init] maxlines = 2 [Definition] failregex =IP address: <HOST>.*\n.*User authentication failed.* ignoreregex= </code> Příklad ''jail.local'' pro dva huby: <code ini> [vpnserver] enabled = true logpath = /usr/vpnserver/security_log/DEFAULT/sec.log port = all protocol = all banaction = iptables-allports filter = vpnserver [vpnserver-HUB2] enabled = true logpath = /usr/vpnserver/security_log/HUB2/sec.log port = all protocol = all banaction = iptables-allports filter = vpnserver </code> Po restartu služby lze jail ověřit takto: <code bash> systemctl restart fail2ban fail2ban-client status vpnserver </code> ===== Vyřazení IP adresy z banlistu ===== <code bash> fail2ban-client set vpnserver unbanip 89.24.33.115 fail2ban-client unban 89.24.33.115 </code> ===== Vypsání všech zabanovaných adres ===== <code bash> fail2ban-client banned </code> ===== Akce v action.d ===== Na serverech s UFW jsem řešil i reakci na portscan. K tomu jsem si upravoval akci odvozenou z ''ufw.conf'', aby uměla pracovat i s IPv6 a současně nezablokovala žádoucí porty 80 a 443. Příklad akce ''ufw-portscan.conf'': <code ini> [Definition] actionban = [ -n "<application>" ] && app="app <application>" ufw prepend <blocktype> from <ip> $app ufw prepend allow proto tcp from <ip> to <destination> port 80,443 $app actionunban = [ -n "<application>" ] && app="app <application>" ufw delete <blocktype> from <ip> $app ufw delete allow proto tcp from <ip> to <destination> port 80,443 $app [Init] insertpos = 1 blocktype = deny destination = any application = </code> ===== Filtry ve filter.d ===== Kromě SoftEtheru jsem používal i vlastní filtry pro Nextcloud, UFW portscan a agresivnější SSH. Filtr pro portscan: <code ini> [Definition] failregex = .*\[UFW BLOCK\] IN=.* SRC=<HOST> ignoreregex = </code> Filtr pro Nextcloud: <code ini> [INCLUDES] before = common.conf [Definition] _groupsre = (?:(?:,?\s*"\w+":(?:"[^"]+"|\w+))*) failregex = ^\{%(_groupsre)s,?\s*"remoteAddr":"<HOST>"%(_groupsre)s,?\s*"message":"Login failed: datepattern = ,?\s*"time"\s*:\s*"%%Y-%%m-%%d[T ]%%H:%%M:%%S(%%z)?" ignoreregex = </code> U SSH jsem měl vlastní variantu filtru, která navíc banuje i ''preauth'' uzavření spojení: <code> ^Connection closed by <HOST> port \d+ \[preauth\]$ </code> ===== Nastavení jail.local ===== Základ globální konfigurace: <code ini> bantime = 10m findtime = 10m maxretry = 3 </code> Na některých strojích jsem používal ''iptables-ipset-proto6'', aby se při větším počtu blokovaných IP nezpomaloval firewall: <code ini> banaction = iptables-ipset-proto6 banaction_allports = iptables-ipset-proto6-allports </code> SSH s agresivnějším módem a vlastním portem: <code ini> [sshd] mode = aggressive port = ssh,3333 filter = mysshd logpath = %(sshd_log)s backend = %(sshd_backend)s enabled = true </code> Pomalejší dlouhodobý ban pro opakované pokusy: <code ini> [sshd-slow] filter = sshd[mode=aggressive] port = ssh,3333 maxretry = 6 findtime = 1d bantime = 1w logpath = %(sshd_log)s backend = %(sshd_backend)s enabled = true </code> Nextcloud: <code ini> [nextcloud] enabled = true port = http,https filter = nextcloud logpath = /var/www/nextcloud/data/nextcloud.log maxretry = 6 </code> Recidive jail: <code ini> [recidive] enabled = true logpath = /var/log/fail2ban.log banaction = %(banaction_allports)s bantime = 1w findtime = 12h </code> Portscan přes UFW: <code ini> [ufw-port-scan] enabled = true filter = portscan logpath = /var/log/ufw.log banaction = ufw-portscan bantime = 1w maxretry = 300 findtime = 3h </code> ===== Testování filtrů ===== Pro ověření regulárního výrazu se hodí: <code bash> fail2ban-regex /var/log/ufw.log '.*\[UFW BLOCK\] IN=.* SRC=<HOST>' </code> ===== Zdroje ===== * [[https://github.com/fail2ban/fail2ban|Fail2ban]] * [[https://www.vpnusers.com/viewtopic.php?f=7&t=6375&sid=76707e8a5a16b0c9486a39ba34763901&view=print|SoftEther VPN User forum – fail2ban]] * [[https://serverfault.com/questions/629709/trouble-with-fail2ban-ufw-portscan-filter|Trouble with Fail2Ban UFW Portscan Filter]] * [[https://dodwell.us/security/ufw-fail2ban-portscan.html|UFW, fail2ban and blocking portscans oh my!]] * [[https://bobcares.com/blog/fail2ban-unban-ip/|Fail2Ban: how to unban IPs that are blocked?]] infrastruktura/bezpecnost/fail2ban.txt Poslední úprava: 23.04.2026 11:58autor: Petr Nosek