PHP-скрипт для автоматического обнаружения и блокировки DDoS-атак на веб-сервера Nginx через анализ логов и динамическое управление firewalld.
- Автоматический мониторинг логов Nginx в реальном времени
- Интеллектуальное блокирование IP-адресов при превышении лимита запросов
- Исключение доверенных сетей Google (поисковые боты, облачные сервисы)
- Graceful shutdown с обработкой сигналов SIGTERM и SIGINT
- Режим принуждения (
--force) для запуска даже при недоступности сервиса - Автосоздание необходимых ipset и firewall правил
- Логирование заблокированных IP в файл
ipsettoblock.txt
- PHP 7.4+ с расширениями:
pcntl(для обработки сигналов)curl(для проверки доступности сервиса)
- ОС: Linux с
firewalldиipset - Веб-сервер: Nginx с стандартным форматом логов
- Права: Запуск от root (для управления firewall)
git clone https://github.com/Forsakenrox/PHP-ddosprotector.git
cd PHP-ddosprotectorОтредактируйте параметры в классе DdosProtector:
public $logFile = '/var/log/nginx/your-site.access.log'; // Путь к логам
public $urlToWebApp = "https://your-domain.com/"; // URL для проверки доступности
public $minRequestsToBan = 8; // Порог запросов для блокировкиphp -m | grep pcntl # Должно вернуть "pcntl"
php -m | grep curl # Должно вернуть "curl"
systemctl status firewalld # Должен быть активенphp ddosprotector.phpСкрипт проверит доступность веб-сервиса и при недоступности начнет мониторинг логов.
php ddosprotector.php --forceЗапускает защиту независимо от статуса веб-сервиса.
Создайте файл /etc/systemd/system/ddosprotector.service:
[Unit]
Description=DDoS Protection Service
After=network.target firewalld.service
[Service]
Type=simple
ExecStart=/usr/bin/php /path/to/ddosprotector.php
Restart=always
RestartSec=60
User=root
[Install]
WantedBy=multi-user.targetЗатем выполните:
systemctl daemon-reload
systemctl enable ddosprotector
systemctl start ddosprotector
systemctl status ddosprotector- Проверка доступности: Скрипт проверяет HTTP-статус целевого URL
- Получение белых списков: Загружает диапазоны IP Google для исключения
- Мониторинг логов: Анализирует логи Nginx в реальном времени через
tail -f - Выявление атак: Считает последовательные запросы с одного IP к одному URL
- Блокировка: При превышении порога добавляет IP в firewalld ipset
- Автообновление: Каждые 10 секунд применяет изменения firewall
Скрипт работает только со стандартным форматом логов Nginx:
log_format main '$remote_addr $remote_user $time_local "$request" '
'$status $body_bytes_sent "$http_referer" "$http_user_agent"';
ddosprotector.php- основной скриптddosprotector.lock- lock-файл (создается автоматически)ipsettoblock.txt- журнал заблокированных IP (создается автоматически)
Скрипт автоматически создает ipset blocklist и правило:
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source ipset="blocklist" drop'Для ручного управления:
# Просмотр заблокированных IP
firewall-cmd --info-ipset=blocklist
# Разблокировка IP
firewall-cmd --permanent --ipset=blocklist --remove-entry=192.168.1.1
firewall-cmd --reload- Пороговое значение: Настройте
$minRequestsToBanпод вашу нагрузку - Ложные срабатывания: Белые списки Google могут не покрывать все легитимные боты
- Производительность: При высокой нагрузке мониторинг может потреблять ресурсы
- IPv6: В текущей версии поддерживается только IPv4
MIT License. Смотрите файл LICENSE для деталей.
PHP script for automatic detection and blocking of DDoS attacks on Nginx web servers through log analysis and dynamic firewalld management.
- Automatic real-time monitoring of Nginx logs
- Intelligent IP blocking on request threshold exceedance
- Google trusted networks exclusion (search bots, cloud services)
- Graceful shutdown with SIGTERM and SIGINT handling
- Force mode (
--force) to run even when service is unavailable - Auto-creation of required ipset and firewall rules
- Logging of blocked IPs to
ipsettoblock.txt
- PHP 7.4+ with extensions:
pcntl(for signal handling)curl(for service availability checks)
- OS: Linux with
firewalldandipset - Web server: Nginx with standard log format
- Permissions: Root execution (for firewall management)
git clone https://github.com/Forsakenrox/PHP-ddosprotector.git
cd PHP-ddosprotectorEdit parameters in the DdosProtector class:
public $logFile = '/var/log/nginx/your-site.access.log'; // Log path
public $urlToWebApp = "https://your-domain.com/"; // URL to check
public $minRequestsToBan = 8; // Blocking thresholdphp -m | grep pcntl # Should return "pcntl"
php -m | grep curl # Should return "curl"
systemctl status firewalld # Should be activephp ddosprotector.phpScript checks web service availability and starts log monitoring if unavailable.
php ddosprotector.php --forceStarts protection regardless of web service status.
Create /etc/systemd/system/ddosprotector.service:
[Unit]
Description=DDoS Protection Service
After=network.target firewalld.service
[Service]
Type=simple
ExecStart=/usr/bin/php /path/to/ddosprotector.php
Restart=always
RestartSec=60
User=root
[Install]
WantedBy=multi-user.targetThen execute:
systemctl daemon-reload
systemctl enable ddosprotector
systemctl start ddosprotector
systemctl status ddosprotector- Availability check: Verifies target URL HTTP status
- Whitelist retrieval: Downloads Google IP ranges for exclusion
- Log monitoring: Analyzes Nginx logs in real-time via
tail -f - Attack detection: Counts sequential requests from single IP to same URL
- Blocking: Adds IP to firewalld ipset when threshold exceeded
- Auto-update: Applies firewall changes every 10 seconds
Script works only with standard Nginx log format:
log_format main '$remote_addr $remote_user $time_local "$request" '
'$status $body_bytes_sent "$http_referer" "$http_user_agent"';
ddos_protector.php- main scriptddosprotector.lock- lock file (auto-generated)ipsettoblock.txt- blocked IPs journal (auto-generated)
Script automatically creates ipset blocklist and rule:
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source ipset="blocklist" drop'For manual management:
# View blocked IPs
firewall-cmd --info-ipset=blocklist
# Unblock IP
firewall-cmd --permanent --ipset=blocklist --remove-entry=192.168.1.1
firewall-cmd --reload- Threshold value: Configure
$minRequestsToBanfor your load - False positives: Google whitelists may not cover all legitimate bots
- Performance: High load monitoring may consume resources
- IPv6: Current version supports IPv4 only
MIT License. See LICENSE file for details.
Issues and pull requests are welcome.
If this project helped you, please give it a star!