Сегодня я покажу вам простой, но эффективный способ автоматической блокировки подозрительных IP-адресов с помощью небольшого скрипта и таких инструментов, как iptables и Fail2Ban. Эти инструменты мощные, лёгкие и могут помочь защитить ваш Linux-сервер от атак методом перебора, ботов или любого вредоносного трафика.
Это руководство предназначено для начинающих и отлично подойдёт системным администраторам, студентам или всем, кто управляет VPS, веб-сервером или даже домашним Linux-сервером.
Что такое iptables и Fail2Ban?
Прежде чем мы углубимся в настройку, давайте разберемся, какие два ключевых инструмента мы используем — iptables
и Fail2Ban
.
iptables
iptables
— утилита брандмауэра командной строки, встроенная в большинство дистрибутивов Linux, которая работает, применяя набор правил (называемых цепочками политик) для управления сетевым трафиком.
Эти правила могут фильтровать пакеты на основе IP-адреса, номера порта или протокола. Вы можете представить iptables
как привратника, стоящего у двери вашего сервера и пропускающего только доверенный трафик и блокирующего остальной.
Fail2Ban
С другой стороны, Fail2Ban
— это инструмент для мониторинга журналов, который автоматически обнаруживает вредоносное поведение и реагирует на него. Он отслеживает файлы журналов в режиме реального времени и ищет подозрительные шаблоны, такие как несколько неудачных попыток входа в систему.
Когда он обнаруживает что-то подозрительное, например атаку методом перебора на ваш SSH, он блокирует IP-адрес нарушителя, добавляя правило блокировки в iptables. Вы можете указать, сколько попыток сбоя допускается, на какой срок блокируется IP-адрес и даже настроить ответ.
При совместном использовании iptables
и Fail2Ban
предлагают простой, но эффективный способ защиты вашего сервера. В то время как iptables
выполняет функции брандмауэра, Fail2Ban
добавляет интеллектуальные возможности, выявляя угрозы и обновляя правила брандмауэра на лету.
Зачем использовать собственный скрипт для блокировки IP-адресов?
Хотя Fail2Ban отлично справляется со своей задачей, автоматически блокируя подозрительные IP-адреса на основе заранее заданных шаблонов в журнале, наличие пользовательского скрипта для блокировки IP-адресов обеспечивает дополнительный уровень гибкости и контроля.
Пользовательский скрипт позволяет быстро добавлять или удалять IP-адреса из списка блокировки без непосредственного изменения сложных правил брандмауэра. Он также дает возможность создавать логику на основе пользовательских журналов или триггеров, которые Fail2Ban может не отслеживать.
Например, если у вас есть веб-приложение, которое ведет собственные логи, или инструмент мониторинга, который выявляет определенные закономерности, вы можете легко связать эти оповещения с вашим скриптом для автоматической блокировки.
Кроме того, этот скрипт можно интегрировать в другие задачи по автоматизации или инструменты управления серверами, что делает его особенно полезным в крупных средах или для системных администраторов, управляющих несколькими серверами.
Шаг 1. Установка iptables и Fail2Ban
Прежде чем мы приступим к настройке, давайте убедимся, что в вашей системе установлены iptables
и Fail2Ban
. Эти инструменты доступны в стандартных репозиториях большинства основных дистрибутивов Linux, поэтому установка не составит труда.
Если вы используете систему на базе Debian, такую как Ubuntu или сам Debian, начните с обновления списка пакетов, чтобы убедиться, что всё обновлено.
sudo apt update
После завершения обновления установите iptables
и fail2ban
с помощью команды:
sudo apt install iptables fail2ban
Для систем на базе RPM вы можете установить оба инструмента с помощью менеджера пакетов yum.
sudo yum install iptables-services fail2ban
После завершения установки вы сможете настроить брандмауэр и автоматическую защиту с помощью Fail2Ban
.
Шаг 2. Создание простого скрипта для блокировки IP-адресов
Теперь, когда iptables
и Fail2Ban
установлены, давайте создадим простой bash-скрипт (block-ip.sh
), который позволит вам вручную блокировать любой IP-адрес с помощью iptables.
sudo nano /usr/local/bin/block-ip.sh
В этот файл вставьте следующий код:
#!/bin/bash if [ -z "$1" ]; then echo "Использование: $0 " exit 1 fi IP=$1 # Проверить, заблокирован ли IP-адрес if iptables -L INPUT -v -n | grep -q "$IP"; then echo "IP-адрес $IP уже заблокирован." else iptables -A INPUT -s $IP -j DROP echo «IP $IP заблокирован.» fi
Этот скрипт сначала проверяет, указан ли IP-адрес в качестве аргумента. Если нет, он выводит сообщение об использовании и завершает работу. Если IP-адрес указан, он проверяет, заблокирован ли этот IP-адрес с помощью iptables. Если его нет в правилах брандмауэра, он добавляет новое правило для блокировки всего трафика с этого IP-адреса и подтверждает действие.
После того как содержимое скрипта будет готово, нажмите CTRL+O
для сохранения и CTRL+X
для выхода из редактора. Теперь сделайте скрипт исполняемым, чтобы его можно было запускать напрямую из командной строки:
sudo chmod +x /usr/local/bin/block-ip.sh
Теперь, когда скрипт готов, давайте протестируем его, заблокировав пример IP-адреса. Например, чтобы заблокировать IP-адрес 192.168.1.100
, выполните:
sudo /usr/local/bin/block-ip.sh 192.168.1.100
Если всё работает правильно, вы должны увидеть сообщение следующего содержания:
IP-адрес 192.168.1.100 blocked.
Чтобы убедиться, что IP-адрес действительно был заблокирован, вы можете просмотреть текущие правила iptables
с помощью команды:
sudo iptables -L -n -v
Этот скрипт очень полезен, если вы хотите заблокировать IP-адреса вручную или на основе пользовательских журналов.
Шаг 3. Настройка Fail2Ban с помощью iptables
Теперь, когда iptables
готов и наш пользовательский скрипт на месте, пришло время настроить Fail2Ban
так, чтобы он мог автоматически обнаруживать и блокировать вредоносные IP-адреса, пытающиеся скомпрометировать такие сервисы, как SSH, Apache или любое другое приложение на вашем сервере, работающее в интернете.
Fail2Ban использует концепцию под названием «блоки», которые представляют собой просто блоки конфигурации, предназначенные для мониторинга конкретных сервисов. Каждый блок сообщает Fail2Ban, какие логи отслеживать, какие шаблоны искать и как реагировать при обнаружении атаки.
Для начала нам нужно отредактировать или создать файл jail.local
, в котором вы определяете свои пользовательские настройки, не затрагивая конфигурацию по умолчанию.
sudo nano /etc/fail2ban/jail.local
Вставьте в файл следующий блок:
[sshd] enabled = true port = ssh filter = sshd logpath = /var/log/auth.log maxretry = 5 bantime = 3600 findtime = 600
Давайте разберёмся, что означает каждый из этих вариантов:
enabled = true
: Это включает режим ожидания, чтобы он активно отслеживал SSH.port = ssh
Это сообщает Fail2Ban, какой порт нужно отслеживать.filter = sshd
: Здесь указывается фильтр, используемый для обнаружения неудачных попыток входа в систему.logpath = /var/log/auth.log
Это файл журнала, который Fail2Ban будет проверять на наличие неудачных попыток входа в SSH.maxretry = 5
Если IP-адрес не сможет войти в систему 5 раз в течение заданного периода времени, он будет заблокирован.bantime = 3600
: Это устанавливает продолжительность блокировки в 3600 секунд (1 час).findtime = 600
Это определяет временное окно (в секундах), в течение которого подсчитываются максимальные попытки повторной попытки, в данном случае — 10 минут.
Если вы используете систему на базе CentOS или RHEL, вам нужно будет изменить путь к журналу в соответствии с местом хранения журналов SSH.
/var/log/secure
После сохранения файла конфигурации jail перезапустите службу Fail2Ban, чтобы применить изменения:
sudo systemctl restart fail2ban
Чтобы убедиться, что ваша виртуальная машина работает правильно, выполните следующую команду для проверки состояния SSH-виртуальной машины:
sudo fail2ban-client status sshd
Здесь вы увидите, сколько IP-адресов было заблокировано, сколько всего было обнаружено попыток входа и активна ли блокировка.
Если вы хотите узнать, какие IP-адреса в настоящее время заблокированы iptables
(включая те, которые запрещены Fail2Ban), выполните:
sudo iptables -L -n
Наконец, если вы хотите разблокировать конкретный IP-адрес, который был автоматически заблокирован Fail2Ban, вы можете удалить его вручную с помощью следующей команды:
sudo fail2ban-client set sshd unbanip 192.168.1.100
Шаг 4. Объедините свой скрипт с Fail2Ban (по желанию)
По умолчанию Fail2Ban использует собственные внутренние действия для блокировки IP-адресов с помощью iptables
. Однако, если вы предпочитаете, чтобы Fail2Ban вызывал ваш собственный скрипт блокировки IP-адресов, возможно, из-за того, что вы добавили собственную логику или ведение журнала, вы можете настроить собственное действие Fail2Ban.
Для этого сначала нужно создать новый файл с определением действия.
sudo nano /etc/fail2ban/action.d/customblock.conf
В этот файл вставьте следующую конфигурацию:
[Definition] actionstart = actionstop = actioncheck = actionban = /usr/local/bin/block-ip.sh actionunban = iptables -D INPUT -s -j DROP [Init]
Эта конфигурация указывает Fail2Ban на необходимость использовать ваш пользовательский скрипт при блокировке IP-адреса. Строка actionban
запускает ваш скрипт и передаёт ему IP-адрес нарушителя. Для отмены блокировки она напрямую удаляет правило блокировки из iptables.
Далее вам нужно указать Fail2Ban использовать это пользовательское действие в вашей конфигурации jail.
sudo nano /etc/fail2ban/jail.local
В разделе «[sshd]
» jail или любой другой настроенной вами тюрьме обновите строку действия, чтобы она указывала на ваше пользовательское действие:
[sshd] enabled = true port = ssh filter = sshd logpath = /var/log/auth.log maxretry = 5 bantime = 3600 findtime = 600 action = customblock
После внесения этих изменений перезапустите службу Fail2Ban, чтобы применить их:
sudo systemctl restart fail2ban
Теперь, когда Fail2Ban обнаружит подозрительный IP-адрес, он вызовет ваш скрипт для блокировки, что позволит вам при необходимости вести журнал, отправлять оповещения или выполнять дополнительные действия.
Правила сохранения iptables
Важно отметить, что правила iptables
по умолчанию не являются постоянными. Это означает, что любые правила, добавленные вручную или с помощью Fail2Ban, будут удалены после перезагрузки сервера, если вы не сохраните их вручную.
В системах Debian или Ubuntu вы можете сделать правила брандмауэра постоянными, установив пакет iptables-persistent
:
sudo apt install iptables-persistent
После установки сохраните текущие правила с помощью:
sudo netfilter-persistent save
В CentOS или RHEL процесс немного отличается, вы можете сохранить свои правила с помощью следующей команды:
sudo service iptables save
Кроме того, вы можете вручную сохранить правила в соответствующем файле конфигурации следующим образом:
sudo iptables-save > /etc/sysconfig/iptables
Сохраняя свои правила, вы гарантируете, что IP-адреса, заблокированные вручную или с помощью Fail2Ban, останутся заблокированными даже после перезагрузки системы.
Заключение
Защита вашего Linux-сервера не обязательно должна быть сложной. Объединив возможности iptables
с интеллектом Fail2Ban
, вы можете создать надежную и гибкую защиту от атак методом перебора, нежелательных попыток входа в систему и подозрительной активности IP-адресов.
В то время как Fail2Ban
автоматизирует процесс обнаружения и блокировки, пользовательский скрипт для блокировки IP-адресов позволяет вам управлять процессом вручную, когда это необходимо.