Настройка Fail2Ban для блокировки парсера.
В современном интернете большое количество сайтов сталкивается с проблемами, связанными с нежелательным трафиком, вызванным автоматическими парсерами. Парсеры могут наносить ущерб, создавая чрезмерную нагрузку на серверы, нарушая работу сайтов или копируя контент в обход законов об авторских правах. Учитывая эти угрозы, важным шагом защиты является установка и настройка Fail2Ban для автоматического блокирования IP-адресов, с которых исходят подозрительные или вредоносные запросы.
Процесс настройки Fail2Ban на сервере с использованием CentOS включает несколько этапов. Начнем с установки Fail2Ban с помощью команды sudo yum install fail2ban -y, после чего сервис настраивается на автоматический запуск. Важно настроить мониторинг логов и создание фильтров, которые смогут выявлять поведение, характерное для парсеров. В данном случае был разработан фильтр, который ищет подозрительные запросы в логах Nginx.
Фильтр позволит Fail2Ban автоматически блокировать IP-адреса, с которых происходят необычные или подозрительные попытки доступа, что существенно снижает нагрузку на сервер. В качестве меры безопасности блокировка IP-адресов происходит на длительный срок (например, 10 лет), что минимизирует риск повторных атак с того же адреса.
Также важно настроить логирование запросов в Nginx, чтобы Fail2Ban мог анализировать данные и принимать меры. В данном случае логирование настроено с учетом специфики работы Fail2Ban, и записи запросов записываются в файл /var/log/nginx/block-access.log. Это позволяет эффективно отслеживать активности и своевременно блокировать нежелательные действия.
После настройки Fail2Ban важно провести тестирование работы системы, запустив парсер. В примере был представлен код Python-парсера, который имитирует поведение автоматического сбора данных с сайта. При запуске парсера Fail2Ban должен заблокировать IP-адрес, с которого происходят попытки парсинга.
В дополнение к основной задаче, важным аспектом является автоматизация очистки логов Nginx, чтобы избежать накопления больших объемов данных, что может привести к переполнению диска и затруднить анализ логов. Для этого был написан Bash-скрипт, который архивирует старые логи, удаляет их, если они старше 10 дней, и отправляет сигнал процессу Nginx для переоткрытия лог-файлов.
Автоматизация очистки логов через cron позволяет значительно упростить этот процесс, сделав его регулярным и надежным без вмешательства администратора. Настройка задания cron на выполнение скрипта ежедневно в 2:00 ночи гарантирует, что сервер не будет перегружен старыми логами и будет продолжать работать эффективно.
Преимущества данной настройки:
1. Защита от нежелательных парсеров — Fail2Ban блокирует IP-адреса, что предотвращает чрезмерную нагрузку на сервер и защиту контента от кражи.
2. Автоматическая очистка логов — Скрипт для очистки и архивирования логов позволяет избежать переполнения диска, поддерживая эффективное использование пространства на сервере.
3. Упрощение администрирования — Все задачи, связанные с защитой от парсеров и управлением логами, автоматизируются, что освобождает время системного администратора для решения более важных задач.
4. Долгосрочная защита — Система настроена так, чтобы блокировка IP-адресов происходила на длительный срок (например, 10 лет), что минимизирует риск повторных атак.
1. Установка Fail2Ban на CentOS
Fail2Ban защищает сервер от вредоносных запросов, анализируя логи и блокируя подозрительные IP-адреса. Чтобы установить Fail2Ban на CentOS, выполните следующую команду:
1. sudo yum install fail2ban -y # Устанавливаем Fail2Ban;
2. sudo systemctl enable --now fail2ban # Включаем автозапуск и запускаем службу.
3. sudo systemctl status fail2ban # Проверяем статус службы.
2. Основные команды управления Fail2Ban
– Перезапуск: sudo systemctl restart fail2ban # Перезапускает сервис
– Перезагрузка конфигурации: sudo fail2ban-client reload # Применяет изменения конфигурации
– Статус тюрьмы: sudo fail2ban-client status parser-block # Показывает заблокированные IP-адреса
– Запуск/остановка: sudo systemctl start fail2ban / sudo systemctl stop fail2ban
– Просмотр заблокированных IP-адресов: sudo fail2ban-client status
Разблокировка IP-адреса: sudo fail2ban-client set parser-block unbanip
192.168.1.100
3. Создание фильтра для блокировки парсера
Fail2Ban использует фильтры (регулярные выражения) для анализа логов. Создадим фильтр parser_block.conf:
1. Перейдите в директорию:
cd /etc/fail2ban/filter.d
2. Создайте файл parser_block.conf:
sudo nano parser_block.conf
3. Добавьте в него:
[Definition]
failregex = ^ "\w+ ([^"]+) HTTP/\d\.\d" \d+$ # Поиск подозрительных запросов
ignoreregex = ^(?:127\.0\.0\.1|83\.221\.61\.90)$ # Исключение определенных IP-адресов
4. Настройка тюрьмы (jail)
1. Откройте jail.local:
sudo nano /etc/fail2ban/jail.local
2. Добавьте:
[parser_block]
enabled = true # Включаем тюрьму
port = http,https # Блокируем HTTP/HTTPS
filter = parser_block # Используем фильтр parser_block
logpath = /var/log/nginx/block-access.log # Логи, которые анализирует Fail2Ban
maxretry = 600 # Количество попыток перед блокировкой
findtime = 60 # Период учета попыток (в секундах)
bantime = 315360000 # Время блокировки (10 лет)
action = iptables[name=parser_block, port=http, protocol=tcp] # Действие — блокировка через iptables
ignoreip = 127.0.0.1 83.221.61.90 # IP-адреса, которые игнорируются
5. Настройка логов Nginx
Fail2Ban анализирует логи, поэтому необходимо настроить Nginx.
1. Откройте nginx.conf:
sudo nano /etc/nginx/nginx.conf
2. Добавьте:
log_format block '$remote_addr "$request" $status'; # Формат логов для
Fail2Ban
3. В конфигурации сайта укажите:
access_log /var/log/nginx/block-access.log block; # Запись логов в файл
Перезапустите сервисы:
sudo systemctl restart nginx # Перезапуск Nginx
sudo systemctl restart fail2ban # Перезапуск Fail2Ban
6. Проверка работы Fail2Ban с помощью парсера
Код парсера
import time
import csv
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
# Статические ссылки
STATIC_URLS = [
"https:// сайт.ru",
"https://сайт.ru/krasnodar/kvartiri/",
]
# Генерация динамических ссылок
START_ID = 321640 # Начало
END_ID = 322640 # Конец
BASE_URL = "https:// сайт.ru/novorossiisk/kvartiri/"
DYNAMIC_URLS = [f"{BASE_URL}{i}/" for i in range(START_ID, END_ID + 1)] URLS = STATIC_URLS + DYNAMIC_URLS # Объединение ссылок
# Путь к ChromeDriver
CHROME_DRIVER_PATH = r"C:\Users\Admin\chromedriver-win64\chromedriver.exe"
# Настройки браузера
# chrome_options.add_argument("--headless") # Фоновый режим
chrome_options = Options()
chrome_options.add_argument("--disable-webrtc")
chrome_options.add_argument("--disable-gpu")
chrome_options.add_argument("--window-size=1920x1080")
# Запуск драйвера
service = Service(CHROME_DRIVER_PATH)
driver = webdriver.Chrome(service=service, options=chrome_options)
# Функция парсинга заголовков с повторными попытками
def parse_page(url, max_retries=3):
"""Открывает страницу и собирает заголовки h1, h2, h3 с повторными попытками"""
attempt = 0
while attempt < max_retries:
try:
driver.get(url)
# Ждём загрузки body
WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.TAG_NAME, "body"))
)
time.sleep(0.5) # Даём странице стабилизироваться
# Заново ищем заголовки каждый раз
h1_tags = [tag.text.strip() for tag in driver.find_elements(By.TAG_NAME, 'h1') if tag.text.strip()]
h2_tags = [tag.text.strip() for tag in driver.find_elements(By.TAG_NAME, 'h2') if tag.text.strip()]
h3_tags = [tag.text.strip() for tag in driver.find_elements(By.TAG_NAME, 'h3') if tag.text.strip()]
return {
"URL": url,
"h1": "; ".join(h1_tags) if h1_tags else "Нет заголовков",
"h2": "; ".join(h2_tags) if h2_tags else "Нет заголовков",
"h3": "; ".join(h3_tags) if h3_tags else "Нет заголовков",
}
except Exception as e:
print(f" Попытка {attempt + 1}/{max_retries} не удалась ({url}):{e}")
attempt += 1
time.sleep(1) # Подождём перед повтором
print(f" Ошибка загрузки {url} после {max_retries} попыток")
return {"URL": url, "h1": "Ошибка", "h2": "Ошибка", "h3": "Ошибка"}
# Запускаем парсинг ПО ГРУППАМ по 10 страниц
batch_size = 10
all_headers = []
for i in range(0, len(URLS), batch_size):
batch = URLS[i:i + batch_size]
for url in batch:
headers = parse_page(url)
all_headers.append(headers)
# Запись результатов в CSV
with open("headers_output.csv", "w", newline="", encoding="utf-8") as f:
writer = csv.DictWriter(f, fieldnames=["URL", "h1", "h2", "h3"])
writer.writeheader()
writer.writerows(all_headers)
print(" Парсинг завершен, данные сохранены в headers_output.csv")
driver.quit() # Закрываем браузер
7. Автоматизация очистки логов Nginx
7.1. Описание проблемы
Лог-файлы Nginx постоянно растут и могут занимать значительное пространство на сервере.
Чтобы избежать переполнения диска и упростить анализ логов, рекомендуется автоматизировать их очистку и архивирование.
7.2. Скрипт для очистки логов
Следующий Bash-скрипт выполняет:
1. Архивацию существующих логов с добавлением даты.
2. Удаление оригинальных файлов после архивации.
3. Удаление старых архивов (старше 10 дней).
4. Отправку сигнала Nginx для переоткрытия логов.
#!/bin/bash
# Директория с логами
LOG_DIR="/var/log/nginx"
# Архивируем все .log файлы с добавлением даты и времени к имени архива
find "$LOG_DIR" -type f -name "*.log" | while read -r file; do
# Получаем текущую дату и время в формате ГГГГММДД_ЧЧММСС
timestamp=$(date +"%Y%m%d_%H%M%S")
# Архивируем файл и добавляем дату к имени архива
gzip -c "$file" > "${file}_${timestamp}.gz"
# Удаляем оригинальный .log файл (если нужно)
rm -f "$file"
done
# Удаляем .gz файлы старше 10 дней
find "$LOG_DIR" -type f -name "*.gz" -mtime +10 -exec rm -f {} \;
# Отправляем сигнал USR1 процессу Nginx, чтобы он переоткрыл лог-файлы
if [ -f /var/run/nginx.pid ]; then
kill -USR1 $(cat /var/run/nginx.pid)
echo "Сигнал USR1 отправлен в Nginx для переоткрытия лог-файлов."
else
echo "Файл PID Nginx не найден. Сигнал USR1 не отправлен."
fi
echo "Архивация, очистка и переоткрытие лог-файлов завершены."
7.3. Автоматический запуск через cron
Чтобы этот скрипт выполнялся автоматически, добавим его в планировщик cron.
1. Создайте файл скрипта:
sudo nano /usr/local/bin/clean_nginx_logs.sh
2. Вставьте код выше и сохраните файл.
3. Сделайте скрипт исполняемым:
sudo chmod +x /usr/local/bin/clean_nginx_logs.sh
4. Откройте crontab для редактирования:
sudo crontab -e
5. Добавьте строку, чтобы запускать очистку логов каждый день в 2:00 ночи:
0 2 * * * /usr/local/bin/clean_nginx_logs.sh
7.4. Проверка работы
Для проверки работы скрипта можно запустить его вручную:
sudo /usr/local/bin/clean_nginx_logs.sh
Затем проверить, что файлы архивированы и старые удалены:
ls -lh /var/log/nginx
Также можно убедиться, что Nginx продолжает записывать логи:
sudo tail -f /var/log/nginx/access.log
7.5. Преимущества автоматизации
Экономия дискового пространства. Автоматизация работы без участия администратора. Поддержание чистоты логов для анализа. Снижение нагрузки на сервер.
Теперь ваш сервер всегда будет поддерживать актуальные и чистые логи Nginx!
Итог:
С помощью Fail2Ban и дополнительной автоматизации очистки логов, сервер получает надежную защиту от вредоносных действий, снижая нагрузку и риски, связанные с парсингом и чрезмерным ростом логов. Этот подход позволяет значительно повысить безопасность и стабильность работы веб-ресурса, минимизируя вмешательство со стороны администраторов.
Предложения по улучшению кода ждем в комментариях.