Сегодня я покажу вам простой, но эффективный способ автоматической блокировки подозрительных 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, вы можете удалить его вручную с помощью следующей команды: