Сегодня я расскажу, как защитить сайт с помощью Nginx. Интернет — место, где всегда есть риск наткнуться на хакеров, DDoS-атаки или просто недоброжелательных пользователей. Но не волнуйся, Nginx способен стать твоим щитом.

В этой статье ты научишься:

  • Блокировать подозрительные IP-адреса.
  • Ограничивать частоту запросов.
  • Прятать сервер от автоматических сканеров.
  • Настраивать базовую защиту от DDoS-атак.

Зачем защищать сайт?

Веб-приложения подвержены множеству угроз:

  • DDoS-атаки: сервер перегружают большим количеством запросов.
  • Брутфорс: хакеры подбирают пароли или ключи API.
  • Сканирование: злоумышленники ищут уязвимости.

Наша задача — минимизировать эти риски и не допустить сбоев.

Шаг 1: Блокируем IP-адреса

Почему это важно? Если ты заметил подозрительную активность с конкретного IP-адреса, проще всего его заблокировать.

Настройка в Nginx

http {  
    deny 192.168.1.1;  
    allow 192.168.1.2;  
    deny all;  
}  
  • deny: блокирует доступ с указанного IP.
  • allow: разрешает доступ.
  • deny all: запрещает всё остальное.

Альтернативный подход:

Создай отдельный файл с заблокированными IP:

sudo nano /etc/nginx/blocked_ips.conf  

Добавь IP-адреса:

deny 192.168.1.1;  
deny 10.0.0.2;  

Подключи файл в конфигурацию:

http {  
    include /etc/nginx/blocked_ips.conf;  
}  

Теперь ты можешь легко добавлять новые адреса в список.

Шаг 2: Ограничиваем частоту запросов

Зачем это нужно? Ограничение запросов помогает предотвратить злоупотребления, например, когда бот отправляет сотни запросов в секунду.

Настройка

Добавь блок для лимита запросов:

http {  
    limit_req_zone $binary_remote_addr zone=one:10m rate=10r/s;  

    server {  
        location /api/ {  
            limit_req zone=one burst=20 nodelay;  
            proxy_pass http://backend;  
        }  
    }  
}  
  • limit_req_zone: создаёт зону лимитов (в нашем случае 10 МБ).
  • rate=10r/s: разрешает 10 запросов в секунду.
  • burst=20: допускает «всплеск» до 20 запросов.
  • nodelay: отправляет лишние запросы немедленно в очередь.

Теперь бот, который пытается отправить 100 запросов в секунду, будет ограничен.

Шаг 3: Прячем сервер

Автоматические сканеры ищут версии серверов, уязвимости и открытые порты. Давай усложним им задачу.

Скрываем информацию о сервере

Отключи заголовок Server:

http {  
    server_tokens off;  
}  

Теперь Nginx не будет сообщать, какая версия сервера используется.

Скрываем директории

Если у тебя на сервере есть открытые директории, закрой их доступ с помощью:

location / {  
    autoindex off;  
}  

Теперь пользователи не смогут просматривать содержимое папок.

Шаг 4: Базовая защита от DDoS

DDoS-атаки направлены на перегрузку сервера. Вот несколько базовых приёмов, которые помогут снизить риски.

Ограничиваем количество соединений

Добавь ограничение на количество одновременных соединений:

http {  
    limit_conn_zone $binary_remote_addr zone=addr:10m;  

    server {  
        location / {  
            limit_conn addr 10;  
        }  
    }  
}  
  • limit_conn_zone: создаёт зону для отслеживания соединений.
  • limit_conn addr 10: ограничивает до 10 одновременных соединений с одного IP.

Настраиваем таймауты

Если бот открывает соединение, но не завершает его, сервер тратит ресурсы впустую. Настрой таймауты:

http {  
    client_body_timeout 10s;  
    client_header_timeout 10s;  
    send_timeout 10s;  
}  

Теперь соединения будут завершаться, если пользователь не отвечает в течение 10 секунд.

Шаг 5: Используем рекапчу и WAF

  1. Google reCAPTCHA Для страниц входа или регистрации добавь защиту с помощью Google reCAPTCHA.
  2. Web Application Firewall (WAF) Подключи ModSecurity или другой WAF для блокировки подозрительных запросов.

Шаг 6: Мониторинг и логи

Без мониторинга сложно понять, кто атакует сервер и как часто.

Включаем логи:

http {  
    log_format custom '$remote_addr - $remote_user [$time_local] "$request" '  
                      '$status $body_bytes_sent "$http_referer" '  
                      '"$http_user_agent" "$http_x_forwarded_for"';  
    access_log /var/log/nginx/access.log custom;  
}  

Теперь ты будешь видеть подробные данные о каждом запросе.

Задание для самостоятельной практики

  • Создай список заблокированных IP-адресов и подключи его к серверу.
  • Настрой лимиты на частоту запросов и количество соединений.
  • Отключи отображение версии сервера и закрой директории.
  • Настрой таймауты для обработки соединений.
  • Проверь, как сервер реагирует на частые запросы с одного IP.

Итоги

Теперь ты знаешь, как защитить свой сайт от нежелательной активности с помощью Nginx. Эти простые настройки помогут тебе избежать множества проблем и сделают сервер более устойчивым. В следующей статье мы поговорим о перенаправлениях и rewrite-правилах в Nginx.