fail2ban настройка
Как установить на сервер fail2ban и правильно настроить. Есть два очевидных варианта установки и последующей настройки fail2ban:
1. Через ssh подключение к серверу, и далее использовать терминал:
— обновите пакеты:
sudo apt update && sudo apt upgrade -y
— установить fail2Ban:
sudo apt install fail2ban -y
— запустить и включить автозапуск:
sudo systemctl enable --now fail2ban
— проверить статус:
sudo systemctl status fail2ban
Если вы зашли под root то можно и без sudo указывать выше озвученные команды. Далее я не буду указывать в коде sudo
2. Через панель управления сервером Fastpanel, как её установить и пользоваться читайте в моих статьях. Так вот чтобы через Fastpanel установить fail2ban достаточно зайти сюда и нажать установить:
Следующий шаг — это настройка fail2ban
1. Создание конфигурационного файла.
По умолчанию, конфигурация хранится в /etc/fail2ban/jail.conf, но редактировать этот файл не рекомендуется. Вместо этого давайте создадим копию и с ней будем работать:
cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
Затем откроем редактор и внесём необходимые данные в созданный выше файл:
nano /etc/fail2ban/jail.local
Какие параметры указать? Сразу после установки и запуска fail2ban работает. По умолчанию идёт защита ssh доступа к серверу и единственное чтобы я изменил это время блокировки, у меня по умолчанию было 10m (10 минут) — этого мало для тех ботов, что штурмуют ваш сервер в надежде взломать его)
2. Основные команды для fail2ban на первое время я приведу ниже. На самом деле вариантов настройки фильтров очень много. Я приведу необходимый минимум на мой взгляд. Здесь нам всё же потребуется терминал. Так как я часто работают из под Windows, то меня вполне устраивает приложение Windows Power Shell. И так вы зашли на сервер под root, напомню как выглядит команда в терминале (в моём случаи повторюсь это Windows Power Shell ):
ssh root@141.15.52.170
и далее пароль.
Напомню, что в терминале можно вставлять ранее скопированные данные нажатием правой кнопки мыши и не забудьте, что при вставлении пароля в терминале он не отображается, то есть скопировали пароль, нажали правую кнопку мышки, далее enter и если данные правильные то вы зашли на сервер)
И так вы на сервере. Как проверить работу fail2ban?
Вот команда, чтобы увидеть кто ломится на ваш сервер через ssh:
fail2ban-client status sshd
Примерно такой результат вы должны увидеть, если всё правильно ранее настроили:
Стоит сказать, что пока ваш сайт не стал немного популярным, или не просуществовал пару лет в сети, или же конкуренты не стали пакостить — боты вряд ли пойдут дальше того чтобы пытаться зайти на сервер через ssh)
В моём случаи, ситуация развивается дальше и нельзя сказать что сайт супер популярен, но однозначно присутствует в поисковой выдачи и в логах сервера напрямую видна активность ботов пытающихся найти слабое место в настройках сервера и сайта. Вот кусок логов, что именно ищут и какие отправляют запросы боты:
2025/03/15 16:30:10 [error] 36391#36391: *27064 FastCGI sent in stderr: "Primary script unknown" while reading response header from upstream, client: 40.84.25.160, server: ysushi.ru, request: "GET /file.php HTTP/1.1", upstream: "fastcgi://unix:/var/run/ysushi.ru.sock:", host: "www.ysushi.ru" 2025/03/15 16:30:10 [error] 36391#36391: *27064 FastCGI sent in stderr: "Primary script unknown" while reading response header from upstream, client: 40.84.25.160, server: ysushi.ru, request: "GET /wp-includes/Text/Diff/Engine/wp-login.php HTTP/1.1", upstream: "fastcgi://unix:/var/run/ysushi.ru.sock:", host: "www.ysushi.ru" 2025/03/15 16:30:11 [error] 36391#36391: *27064 FastCGI sent in stderr: "Primary script unknown" while reading response header from upstream, client: 40.84.25.160, server: ysushi.ru, request: "GET /wp-admin/user/chosen.php HTTP/1.1", upstream: "fastcgi://unix:/var/run/ysushi.ru.sock:", host: "www.ysushi.ru" 2025/03/15 16:30:11 [error] 36391#36391: *27064 FastCGI sent in stderr: "Primary script unknown" while reading response header from upstream, client: 40.84.25.160, server: ysushi.ru, request: "GET /wp-content/uploads/wp-conflg.php HTTP/1.1", upstream: "fastcgi://unix:/var/run/ysushi.ru.sock:", host: "www.ysushi.ru" 2025/03/15 16:30:11 [error] 36391#36391: *27064 FastCGI sent in stderr: "Primary script unknown" while reading response header from upstream, client: 40.84.25.160, server: ysushi.ru, request: "GET /ok.php HTTP/1.1", upstream: "fastcgi://unix:/var/run/ysushi.ru.sock:", host: "www.ysushi.ru" 2025/03/15 16:30:11 [error] 36391#36391: *27064 FastCGI sent in stderr: "Primary script unknown" while reading response header from upstream, client: 40.84.25.160, server: ysushi.ru, request: "GET /wp-includes/IXR/alfa-rex.php HTTP/1.1", upstream: "fastcgi://unix:/var/run/ysushi.ru.sock:", host: "www.ysushi.ru" 2025/03/15 16:30:12 [error] 36391#36391: *27064 FastCGI sent in stderr: "Primary script unknown" while reading response header from upstream, client: 40.84.25.160, server: ysushi.ru, request: "GET /wp-admin/autoload_classmap.php HTTP/1.1", upstream: "fastcgi://unix:/var/run/ysushi.ru.sock:", host: "www.ysushi.ru" 2025/03/15 16:30:12 [error] 36391#36391: *27064 FastCGI sent in stderr: "Primary script unknown" while reading response header from upstream, client: 40.84.25.160, server: ysushi.ru, request: "GET /wp-includes/sodium_compat/src/index.php HTTP/1.1", upstream: "fastcgi://unix:/var/run/ysushi.ru.sock:", host: "www.ysushi.ru" 2025/03/15 16:30:12 [error] 36391#36391: *27064 FastCGI sent in stderr: "Primary script unknown" while reading response header from upstream, client: 40.84.25.160, server: ysushi.ru, request: "GET /wp-includes/block-patterns/about.php HTTP/1.1", upstream: "fastcgi://unix:/var/run/ysushi.ru.sock:", host: "www.ysushi.ru" 2025/03/15 16:30:12 [error] 36391#36391: *27064 FastCGI sent in stderr: "Primary script unknown" while reading response header from upstream, client: 40.84.25.160, server: ysushi.ru, request: "GET /wp-includes/css/alfa-rex.php HTTP/1.1", upstream: "fastcgi://unix:/var/run/ysushi.ru.sock:", host: "www.ysushi.ru" 2025/03/15 16:30:13 [error] 36391#36391: *27064 FastCGI sent in stderr: "Primary script unknown" while reading response header from upstream, client: 40.84.25.160, server: ysushi.ru, request: "GET /images/stories/admin-post.php HTTP/1.1", upstream: "fastcgi://unix:/var/run/ysushi.ru.sock:", host: "www.ysushi.ru"
В коде выше я изменил настоящий url сайта)
Что мы видим в логах которые я выложил выше?
С одного ip идут постоянные запросы к сайту! Делают это боты, идёт поиск уязвимости сайта. Как нам сможет помочь fail2ban?
Вот решение) добавить фильтр для блокировки подозрительных запросов. Для этого надо создать следующий файл на сервере:
/etc/fail2ban/filter.d/nginx-wordpress.conf:
с вот таким содержанием:
[Definition] failregex = ^.*"(GET|POST) /wp-admin/.* HTTP.*$ ^.*"(GET|POST) /wp-content/.* HTTP.*$ ^.*"(GET|POST) /wp-includes/.* HTTP.*$ ignoreregex =
потом добавить в /etc/fail2ban/jail.local эти строки, чтобы отредактировать файл jail.local надо выполнить эту команду:
nano /etc/fail2ban/jail.local
и прописать вот эти строки:
[nginx-wordpress] enabled = true port = http,https filter = nginx-wordpress logpath = /var/log/nginx/access.log maxretry = 3 bantime = 86400
чтобы сохранить нажмите CTRL + O далее Enter и выйти из редактора nano нажимаете CTRL + X (одновременное нажатие клавиш на клавиатуре CTRL и Х)
где,
port — это порты с которыми будет работать фильтр, для сайта достаточно указанных ниже:
port = http,https
filter — это название фильтра:
filter = nginx-wordpress
logpath — это путь в вашим логам. Важно указать правильный путь к логам, а то нечего анализировать будет)
logpath = /var/log/nginx/access.log
maxretry – это количество попыток перед блокировкой
maxretry = 3
bantime – это время блокировки IP, в примере ниже означает 24 часа:
bantime = 86400
Помните, что после каждого внесения изменений в fail2ban требуется перезагрузка. Вот команда чтобы перезагрузить fail2ban
systemctl restart fail2ban
Добавление небольшое, чтобы не разбираться в огромном (относительно конечно) по содержанию файле /etc/fail2ban/jail.local который по умолчанию имеет много разной информации — можно всё что есть в файле /etc/fail2ban/jail.local — удалить и вставить вот этот небольшой фрагмент настроек:
[DEFAULT] bantime = 600 banaction = iptables-ipset-proto6 [sshd] enabled = true maxretry = 6
Как это сделать? Повторюсь значит:
1. Заходите на сервер под root
ssh root@162.12.98.90
указываете пароль
2. Далее заходите в режим редактирования файла /etc/fail2ban/jail.local с настройками fail2ban:
nano /etc/fail2ban/jail.local
3. удаляете всё что там есть и вставляете это вот:
[DEFAULT] bantime = 600 banaction = iptables-ipset-proto6 [sshd] enabled = true maxretry = 6
Повторил просто чтобы было понятнее)
Вот так должно получится:
Чтобы сохранить нажимаете в английской раскладке клавиатуры CTRL + O (плюс нажимать не надо), далее Enter и CTRL + X (это выход из редактора обратно в терминал)
Разбор указанных мною настроек:
[DEFAULT] – секция с общими параметрами по умолчанию для всех служб.
bantime = 600 – IP-адрес нарушителя будет заблокирован на 600 секунд (10 минут).
banaction = iptables-ipset-proto6 – действие при блокировке: использование iptables с поддержкой ipset для IPv6.
[sshd] – секция для защиты SSH:
enabled = true – включает защиту для SSH.
maxretry = 6 – если с одного IP-адреса будет 6 неудачных попыток входа, Fail2Ban заблокирует этот IP.
proto6 в iptables-ipset-proto6 указывает, что правило применяется к IPv6-адресам.
Сканирование и попытки зайти на сервер со стороны ботов идут постоянно и такая защита не будет лишней это точно! Для тех кто ничего не понял из того что я написал, есть другой более простой вариант) Хостинг Beget по умолчанию при создании VPS включает fail2ban и настраивает. Посмотреть тарифы на VPS на хостинге Beget