---
# System prepended metadata

title: Практическая работа № 7 “Fail2Ban и Dos/DDoS attack” на примере nginx.

---

# Практическая работа № 7 “Fail2Ban и Dos/DDoS attack” на примере nginx.

### Цель работы:

1) Научиться разворачивать сервер nginx;
2) Научиться защищать сервер nginx;
3) Провести тестовую атаку DOS на сервер nginx.

### Задача:

1) Организовать простую-тестовую атаку DoS;
2) Защитить сервер от DoS/DDoS атак через встроенные возможности nginx;
3) Защитить сервер от DoS/DDoS атак с помощью fail2ban при помощи iptables в автоматическом режиме;
4) Защитить сервер от DoS/DDoS атак с помощью fail2ban при помощи ipset в автоматическом режиме;
5) Составить собственную инфструкцию о проделанной работе по данной практике.

# Основные понятия
1) DoS (англ. Denial of Service «отказ в обслуживании») — кибератака на систему с целью вывести ее из строя. Искусственно создаются условия, при которых польз

**Особенности DoS-атак:**
DoS-атака напрямую не опасна для сервера. Но важно помнить о потере потенциальной прибыли из-за простоев во время нападения. Далее рассмотрим три отличительных особенности DoS-атак:

1) Требуется один компьютер
Атака ведется с одного хоста и направлена на отдельные сети или системы.
2) Простое обнаружение
Легко зафиксировать, посмотрев системные журналы сервера. Они покажут все записи, связанные с подозрительным IP-адресом.
3) Легкое предотвращение
Достаточно заблокировать источник кибератаки. С этим может справиться системный администратор или сетевые фильтры.

**DDoS -** к термину добавили дополнительную букву «D» (Distributed т.е. распределенная) и появился новый вид атак — DDoS. Суть осталась прежней, но теперь атаки реализуются с нескольких компьютеров на один целевой хост. От количества атакующих устройств и объема отправляемого трафика, зависит мощность нападения.
# Разворачиваем сервера nginx.

1) Установим необходимы пакеты:

> sudo apt install curl gnupg2 ca-certificates lsb-release debian-archive-keyring

![](https://i.imgur.com/t5Hh7xx.png)



2) Теперь нужно импортировать официальный ключ, используемый apt для проверки подлинности пакетов. Скачайте ключ:

>curl https://nginx.org/keys/nginx_signing.key | gpg --dearmor
    | sudo tee /usr/share/keyrings/nginx-archive-keyring.gpg >/dev/null
    
![](https://i.imgur.com/BREdnh4.png)


3) Проверьте, верный ли ключ был загружен:

>gpg --dry-run --quiet --import --import-options import-show /usr/share/keyrings/nginx-archive-keyring.gpg

![](https://i.imgur.com/O53HB60.png)


Вывод команды должен содержать полный отпечаток ключа

573BFD6B3D8FBC641079A6ABABF5BD827BD9BF62:

![](https://i.imgur.com/lSrnUlU.png)


Если отпечаток отличается от вышеуказанного, удалите файл ключа.

4) Для подключения apt-репозитория для стабильной версии nginx, выполните следующую команду:

> echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg]
http://nginx.org/packages/debian `lsb_release -cs` nginx" 
    | sudo tee /etc/apt/sources.list.d/nginx.list

![](https://i.imgur.com/fwysfw3.png)


5) Для использования пакетов из нашего репозитория вместо распространяемых в дистрибутиве, настройте закрепление:

> echo -e "Package: *\nPin: origin nginx.org\nPin: release o=nginx\nPin-Priority: 900\n" 
    | sudo tee /etc/apt/preferences.d/99nginx
    
![](https://i.imgur.com/uglxcHR.png)


6) Установим nginx:

> sudo apt update

> sudo apt install nginx

7) Потом запустим nginx и проверим статус:

> service nginx start
> service nginx status

![](https://i.imgur.com/s8hG6fM.png)

![](https://i.imgur.com/T4SpxiG.png)
Вводим ip нашей машинки в бразуере, если все сделали правильно, то появится страничка с nginx.

Видим, что nginx запущен, все отлично.

Если при запуске открывается Apache2:

![](https://i.imgur.com/Pshsc7x.png)

То необходимо сделать следующее:

1. Перейти в директорию cd /var/www/html. 
2. Создать в этой директории папку folder1 mkdir folder1.
3. Скопировать index.nginx-debian.html в папку folder1 cp index.html folder1/.
4. Заходим в конфигурацию /etc/nginx/sites-enabled/default и заменяем путь на /var/www/html/folder1.
5. Перезапускаем nginx командой service nginx restart.
6. Переходим в поисковик, вводим свой ip адрес и должны увидеть:

![](https://i.imgur.com/WWcE4yY.png)

# Далее переходим к настройке nginx от DDoS атак на наш сервер.

1) Устанавливаем fail2ban и ipset:

>apt install fail2ban

>apt install ipset - дополнение, чтобы fail2ban мог эффективнее блокировать большое количество запросов

2) Далее переходим:

>nano /etc/nginx/sites-enable/default - тут находится стартовая страничка nginx

3) Выставляем следующие параметры:

>limit_req zone=ltwo burst=5 nodelay;

* limit_req - директива для zone=ltwo
* burst=5 - всплеск разрешён максимально 5
* и стоит опция nodelay, чтобы nginx не задерживал запросы

![](https://i.imgur.com/5mDuwHV.png)

4) Далее переходим в конфигурационный файл nginx.conf:

>nano /etc/nginx/nginx.conf - в данном файле нам надо внести следующие изменения:

>limit_conn_zone $binary_remote_addr zone=lone:10m;
>limit_req_zone $binary_remote_addr zone=ltwo:10m rate=3r/s;
>limit_req_zone $binary_remote_addr zone=highspeed:10m rate=10r/s

* ltwo - зона ограничения частоты запросов
* 10m - размер зоны в мегабайтах
* 3r/s - количество запосов в секунду

![](https://i.imgur.com/Y681fEm.png)

5) Нам необходимо перезапустить nginx для вступлления в силу внесённых изменений:

> service nginx stop
> service nginx start
> service nginx status

После чего вбиваем ip-адрес сервера в браузере, переходим в режим разработчика и далее делаем многочисленные запросы: 

>в Chrome это - ctrl+r



![](https://i.imgur.com/OtnkVqh.png)

Данные ошибки будут отображаться в log файле, его данные дадут нам нужную информация для настройки фильтрации fail2ban:

> cat /var/log/nginx/error.log

![](https://i.imgur.com/homiCNU.png)

# Настройка Fail2Ban от DDoS атак

1) Перейдём в директорию в fail2ban
> cd /etc/fail2ban

2) Затем создадим файл с именем jail.local:
> touch jail.local

3) Внесём в этот файл следующие параметры:
> nano jail.local

[nginx-limit-req]
port = http, https
enabled = true
filter = nginx-limit-req
action = iptables-multiport[name=ReqLimit, port="http,https", protocol=tcp]
logpath = /var/log/nginx/*error.log
findtime = 600
bantime = 3600
maxretry = 4

После чего нам необходимо изменить настройку, что iptables не отсылал reject, а drop, так как для борьбы с ботами - это более эффективно.

4) Далее переходим в файл:

> nano /etc/fail2ban/action.d/iptables-common.conf

5) Но как мы уже знаем, настройки конфигурационных файлов поумолчанию могут быть перезаписаны при обновлении, поэтому создаём новый файл:

> touch iptables-blocktype.local

![](https://i.imgur.com/m0P5YC4.png)

6) Затем делаем рестарт fail2ban:

> service fail2ban restart

7) Теперь нам нужно посмотреть, что iptables отрабатывает и наберём:

> iptables -L -v

![](https://i.imgur.com/UPmPIBa.png)



8) Убедимся, что настройки в fail2ban применились и введём:

> fail2ban-client status

![](https://i.imgur.com/QFGlr9V.png)


Видим, что фильтры работают по nginx-limit-req, sshd.


9) Также проверим, что сейчас нет заблокированных ip-адресов:
> fail2ban-client status nginx-limit-req

![](https://i.imgur.com/YHlP9Dd.png)

# Проверка работоспособности:

1) Теперь переходим на нашу страничку и вводим ip-адрес сервера в браузере, переходим в режим разработчика и далее делаем многочисленные запросы: в Chrome это - ctrl+r

![](https://i.imgur.com/Pq80n45.png)

2) После того как мы добились блокировки нашего ip-адреса посмотрим, что же нам скажет fail2ban:

![](https://i.imgur.com/SxHoAE5.png)


Собственно вот и заблочился айпишник, с которого совершались многочисленные запросы.

3) И iptables:

![](https://i.imgur.com/2io69VH.png)

Видим, что добавилось правило.

