В качестве результата пришлите ответы на вопросы в личном кабинете студента на сайте netology.ru.
Сервер nginx достаточно часто используется не только как веб-сервер, но и как reverse proxy. Что это значит? Это значит, что его ставят перед тяжёлыми веб-приложениями и позволяют ему решать следующие задачи:
- Отдавать "статику" (статичные файлы, с чем он справляется достаточно хорошо)
- Проксировать запросы на Upstream сервера (т.е. запрос приходит на nginx, nginx его отправляет дальше на сервер с приложением)
Зачем нужна вторая функция? nginx может взять на себя задачи по работе с медленными клиентами, кэшированию и т.д.
А кроме того, может служить программным балансировщиком нагрузки и лимитировать поток входящих запросов (именно это нас и будет интересовать).
Что мы хотим сделать? Мы хотим научиться с помощью nginx ограничивать поток входящих запросов с одного ip-адреса.
У вас должно быть две виртуальные машины:
- Ubuntu с nginx (10.0.0.1)
- Kali (10.0.0.2)
У вас уже должен быть настроенный nginx, если вдруг так случилось, что его нет, то вернуться к соответствующему уроку.
1. Удостоверяетесь, что сервис nginx запущен, порт 80 открыт.
2. Если вы не устанавливали nginx, то:
sudo apt update
sudo apt install nginx
3. Редактируете конфигурацию sudo mcedit /etc/nginx/sites-enabled/default
, чтобы она выглядела следующим образом:
4. Сохраняете изменения
5. Проверяете корректность конфигурации sudo nginx -t
6. Применяете конфигурацию sudo nginx -s reload
Для генерации запросов мы будем использовать утилиту Apache Benchmarks.
ab --help
Если у вас выводится сообщение о том, что программа не найдена (bash: ab command not found
), то установите её:
sudo apt update
sudo apt install ab
Далее сделаем 1000 запросов по 100 запросов одновременно:
ab -n 1000 -c 100 http://netology.local
Удостоверяемся, что все запросы проходят:
Меняем настройки nginx:
sudo mcedit /etc/nginx/sites-enabled/default
Редактируем конфигурацию, чтобы она выглядела следующим образом:
Изменилась только 1-ая и 17-ая строки.
Описание значений
limit_req_zone $binary_remote_addr zone=limit:10m rate=50r/s
Создание зоны по ограничению количества запросов:
$binary_remote_addr
- на основании ip-адреса запрашивающегоzone=limit:10m
- зона с именем limit и памятью 10 мегабайт (информация о 16 000 адресах занимает примерно 1 мегабайт)rate=50r/s
- 50 запросов в секунду
limit_req zone=limit burst=50 nodelay
limit_req zone=limit
- включение лимита для определённого сервера.burst=50
- по умолчанию, 50 запросов в секунду значит, что нельзя делать запросы чаще чем раз в 20ms, т.е. если запросы будут приходить чаще, то nginx будет откидывать их с ошибкой 503.burst
позволяет указать количество запросов, которые допустимы в рамках окна, установленногоrate
, при этом первый будет обслужен, а остальные будут дожидаться установленного лимита по времени (те, кто вышел за пределы 50, получат 503)nodelay
- позволяет не ждать положенного лимита, а отправлять запрос сразу, если это позволяют установленные лимиты
Тестируем конфигурацию и применяем изменения:
sudo nginx -t
sudo nginx -s reload
Ещё раз делаем 1000 запросов по 100 запросов одновременно:
ab -n 1000 -c 100 https://netology.local
Удостоверяемся, что часть из них завершается с ошибкой:
Конечно же, можно пойти дальше и "блочить" IP, в этом нам поможет Fail2Ban, который мы рассмотрели на лекции
sudo apt update
sudo apt install fail2ban
Удостоверяемся, что сервис запущен:
systemctl status fail2ban
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
sudo mcedit /etc/fail2ban/jail.local
Спускаетесь до записи [nginx-limit-req]
и включаете её добавлением строки enabled = true
:
Сохраняете файл и применяете конфигурацию:
sudo fail2ban-server reload
sudo fail2ban-server status
Убедитесь, что после пары запусков ab
вас "забанят":
Удостоверяемся, что адрес Kali действительно забанен:
sudo zgrep 'Ban' /var/log/fail2ban.log
Пришлите следующие скриншоты:
- Скриншот с запросами
ab
до включения limit_req на nginx - Скриншот с запросами
ab
после включения limit_req на nginx - Скриншот с запросами
ab
после включения fail2ban (не обязательно)