💾 Archived View for sysrq.in › ru › gemlog › fail2ban.gmi captured on 2023-09-28 at 16:14:34. Gemini links have been rewritten to link to archived content
⬅️ Previous capture (2023-01-29)
-=-=-=-=-=-=-
Неэффективность мировой экономической системы, направленной лишь на извлечение прибыли, проявляет себя и в логах серверов. Бесполезные и вредные роботы генерируют столько же траффика, сколько и люди, впустую растрачивая ресурсы... В глобальном масштабе человечеству ещё предстоит решить эту проблему, а на отдельном сервере это делается грамотно настроенным файрволом и Fail2ban. Он довольно громоздкий и непонятный, но разобраться в нём (с трудом) можно.
Большинство предпочитают просто поставить Clouflare. Пожалуйста, не делайте так!
Cloudflare является MITM-прокси, который блокирует настоящих, живых пользователей Tor (таких как я) и не является настоящей защитой от DDoS. Он блокирует мне даже больше сайтов, чем Роскомнадзор 😭
Большой список того, что не так с ClownFlare
В конфигурации я приму меры, чтобы случайно не забанить никакую выходную ноду Tor.
За общим представлением о Fail2ban можно обратиться к:
По SSH мне стучатся почти всегда через Tor, и ни в одном из случаев это не я, поэтому буду отклонять эти пакеты.
Я использую nftables, но сойдёт любой файрвол.
Для этого в cron.daily создам скрипт следующего содержания:
#!/bin/sh set -e TABLE="ip sshd-tor" SET="torexitnodes" wget https://check.torproject.org/torbulkexitlist -qO /etc/tor/torbulkexitlist nft add table ${TABLE} nft flush table ${TABLE} nft add chain ${TABLE} input { type filter hook input priority 0 \; } nft add set ${TABLE} "${SET}" { type ipv4_addr \; } for node in $(cat /etc/tor/torbulkexitlist); do nft add element ${TABLE} "${SET}" { "${node}" } done nft add rule ${TABLE} input tcp dport 22 ip saddr "@${SET}" reject /etc/init.d/nftables save
Ну и не забываем включить фильтр sshd для Fail2ban 😉
В комплекте для него ничего не идёт, поэтому идём в /etc/fail2ban и создаём два файла.
1. filter.d/opensmtpd-auth.conf
[Definition] _daemon = smtpd prefregex = <F-MLFID>: \w{16} </F-MLFID><F-CONTENT>.+</F-CONTENT>$ failregex = <F-NOFAIL>smtp connected address=(?:<IP6>|<IP4>) host=.+</F-NOFAIL> smtp failed-command command="AUTH LOGIN" result="503 5.5.1 Invalid command: Command not supported" <F-NOFAIL><F-MLFFORGET>smtp disconnected reason=disconnect</F-MLFFORGET></F-NOFAIL>
2. filter.d/opensmtpd-ssl.conf
[Definition] _daemon = smtpd prefregex = <F-MLFID>: \w{16} </F-MLFID><F-CONTENT>.+</F-CONTENT>$ failregex = <F-NOFAIL>smtp connected address=(?:<IP6>|<IP4>) host=.+</F-NOFAIL> smtp disconnected reason="io-error: .+" <F-NOFAIL><F-MLFFORGET>smtp disconnected</F-MLFFORGET></F-NOFAIL>
Источник: рандомный вопрос на ServerFault
Осталось их включить, для этого нужен файл jail.d/opensmtpd.conf. Банить буду навсегда со второй попытки.
[opensmtpd-auth] enabled = 1 port = smtp,465,submission logpath = %(syslog_mail)s logtimezone = UTC backend = %(syslog_backend)s maxretry = 2 bantime = -1 ignorecommand = /bin/grep <ip> /etc/tor/torbulkexitlist [opensmtpd-ssl] enabled = 1 port = smtp,465,submission logpath = %(syslog_mail)s logtimezone = UTC backend = %(syslog_backend)s maxretry = 2 bantime = -1 ignorecommand = /bin/grep <ip> /etc/tor/torbulkexitlist
С помощью ignorecommand можно убедиться, что пользователи Tor не пострадают. Но, судя по моему опыту, сканеры и спамеры тором и не пользуются.
Ну и можно вручную сразу целый диапазон внести в файрвол, если там нет никого, кроме сканеров.
Проверяем, чтобы в секции server обязательно было
if ($http_user_agent ~* (MauiBot|MJ12bot|SEMrushBot|AhrefsBot|Expanse)){ return 403; }
Сюда можно добавить ещё всяких вредных роботов, "SEO-оптимизаторов" и якобы "исследовательские проекты" (так сразу и поверили, ага).
С fail2ban поставляется фильтр filter.d/botsearch-common.conf, но это минимальная конфигурация. Туда стоит вписать всё, чего так хотят боты, но получают 404. В моём случае это, например, /GponForm, а также все файлы с расширением php и js.
Далее создадим jail.d/nginx-botsearch.conf
[nginx-botsearch] enabled = 1 logpath = /var/log/nginx/*_log ignorecommand = /bin/grep <ip> /etc/tor/torbulkexitlist
Опять же, чаще мне стучатся со взломанных роутеров, а не с выходных нод тора.
--
Следующий пост о том, как я готовлю тонкий клиент.
"Каким удалённым рабочим столом ты пользуешься? Конечно же, спайсом!"