Придумал Автоматическую защиту от DDoS атак

Виталий Литвинов
На сайте с 08.05.2008
Offline
117
1228

 Заметил недавно что мой VDS по ночам начал тормозить, с чего бы вдруг? Ведь я настроил Nginx чтобы он при частых запросах - когда больше 3 запросов в секунду показывал ошибку 444, 503, а тут даже с этим 1 процес Nginx кушает цпу больше 50%, Я уже не говорю про php-fpm и mysql там вообще завал. Нагрузка Load Average 8 ! Да ещё и логи Nginx растут как на дрожжах - за ночь занимают всё место на VDS и от этого ломается база данных!

И решил я сделать защиту от DDoS атак! И мне помогал писать код чат GPT!

Принцип работы это коса которая косит траву . Чистим лог Nginx и ждём 1 минуту и выбираем ip которые самые активные - Я выбрал больше 9 запросов в минуту - всех банить у некоторых было от 10 до 1000 запросов в минуту! Сделал чтоб не банило поисковиков и меня - белый список ip адресов. А остальных всех резвых в бан, добавляет в блокировку в брандмауэре при помощи iptables. И через 4 часа дос атаки было автоматически заблокировано аж 7000 ip! Когда нет нагрузки защита отключается и скрипт не работает. Настраивали с чат GPT дня 4 но зато сейчас песня - когда load average больше 1 запускается скрипт по крону каждую минуту и смотрит рейтинг ip кто больше накосячил и тех сразу в бан!

Здесь все ip что удалось собрать с дос атак.

 https://dj-x.info/TEMP/output_ip.txt

Я подумал что очень много денег тратится на защиту от дос атак, проксирования, а не всегда это нужно. Можно просто запустить скрипт и не париться.

Такой себе локальный аналог Cloudflare у себя на сервере.

LEOnidUKG
На сайте с 25.11.2006
Offline
1723
#1
И мне помогал писать код чат GPT!

Лучше бы гугл помогал.

Вы изобрели fail2ban скрипт, который установлен на сотни тысяч серверов и встроен в самые популярные панели.

Cloudflare

Это про другое и вы наверное не знаете, что такое DDOS.  Да и  Cloudflare бесплатный, за что вы там платите не понятно.
✅ Мой Телеграм канал по SEO, оптимизации сайтов и серверов: https://t.me/leonidukgLIVE ✅ Качественное и рабочее размещение SEO статей СНГ и Бурж: https://getmanylinks.ru/
Виталий Литвинов
На сайте с 08.05.2008
Offline
117
#2
Я сам изобрёл велосипед вместе с чат GPT, а он бесплатный!
fail2ban разве работает с логами nginx?
LEOnidUKG
На сайте с 25.11.2006
Offline
1723
#3
Виталий Литвинов #:
Я сам изобрёл велосипед вместе с чат GPT, а он бесплатный!
fail2ban разве работает с логами nginx?

А я адепт гугла и он тоже бесплатный:

ail2ban+nginx

Виталий Литвинов
На сайте с 08.05.2008
Offline
117
#4
LEOnidUKG #:

А я адепт гугла и он тоже бесплатный:

ail2ban+nginx

Да, а что делать с теми кто не такой резвый и не превышает 5 запросов в секунду. А делает от 4 запросов в секунду до 20 запросов в минуту с одного ip и таких пару сотен ip? Тут fail2ban уже бесполезен!

fliger
На сайте с 17.09.2015
Offline
106
#5
Виталий Литвинов #:
Я сам изобрёл велосипед

Велосипед не изобретал. Написал PHP-скрипт, в котором использую APCu. Решает все задачи блокировки.

Виталий Литвинов
На сайте с 08.05.2008
Offline
117
#6
fliger #:

Велосипед не изобретал. Написал PHP-скрипт, в котором использую APCu. Решает все задачи блокировки.

Там сначала на Nginx идёт очень большая нагрузка - 1 процесс  Nginx  ест 50% процессора. 

Виталий Литвинов
На сайте с 08.05.2008
Offline
117
#7

Вот скрипт который удаляет IP из файла /root/output.txt, в файле belyi-spisok.txt находятся ip из белого списка которые нужно удалить.
Скрипт поддерживает IPv4 и IPv6 и маску подсети - вот такие IP 127.0.0.1/8 2002::/16 ! Не оставляйте пустые строки иначе будет ошибка.

В белый список можно добавить ip поисковых систем.

Диапазоны IP-адресов, используемых Яндексом.
Диапазоны IP-адресов, используемых Google.

belyi-spisok.py


import ipaddress

# Чтение списка подсетей из файла belyi-spisok.txt
subnets = []
with open('/root/belyi-spisok.txt', 'r') as f:
    for line in f:
        subnet_str = line.strip()
        subnet = ipaddress.ip_network(subnet_str, strict=False)
        subnets.append(subnet)

# Удаление дубликатов IP-адресов из файла output.txt
unique_ips = set()
with open('/root/output.txt', 'r') as f:
    for line in f:
        ip_str = line.strip()
        ip = ipaddress.ip_address(ip_str)
        # Проверка наличия IP-адреса в любой из подсетей из списка subnets
        if not any(ip in subnet for subnet in subnets):
            unique_ips.add(ip)

# Запись уникальных IP-адресов в файл output.txt
with open('/root/output.txt', 'w') as f:
    for ip in unique_ips:
        f.write(str(ip) + '\n')
Диапазоны IP-адресов, используемых Яндексом
  • yandex.ru
v4 and v6 IP address ranges, prefix, Yandex networks
Виталий Литвинов
На сайте с 08.05.2008
Offline
117
#8
Я начал изучать fail2ban !
И оказалось что он может делать всё то что я изобрёл!
В нём есть белый список и он умеет работать с IPv4 и IPv6.
Настроил его на /var/log/nginx/acess.log
В него всё записывается со всех сайтов, а на конфигурациях сайтов должны быть отключены логи.
Только в лог не должна записываться статика - jpg png js css и все остальные - Я завтра выложу кусок конфигурации nginx которая это делает.
Завтра ещё протестирую и здесь напишу как это всё настраивать!
Получается можно настроить fail2ban чтобы было за 1 минуту 60 запросов и если больше то бан или можно поставить за 5 минут 300 запросов, а если больше то бан.
И работает всё нормально и никакого флуда на сайтах нет.
The WishMaster
На сайте с 29.09.2005
Offline
2543
#9
*Нобелебский комитет хочет добавить вас в друзья*
Пешу текста дешыго! Тематики - туризм, СЕО, творчество, кулинария, шизотерика :)
Виталий Литвинов
На сайте с 08.05.2008
Offline
117
#10
        location ~* \.(ico|jpg|png|jpeg|gif|swf|ico|svg)$ {
                add_header Cache-Control public;
                access_log   off;
                expires 6d;
                
        }
                
        location ~* \.(css|js|woff|eot)$ {
                add_header Cache-Control private;
                add_header Cache-Control must-revalidate;
                access_log   off;
                expires 1d;

        }

Nginx убираем статику из логов.

В логах  Nginx ip должен быть первым log_format  main  '$remote_addr

/etc/fail2ban/filter.d/nginx-limit.conf

[Definition]
failregex = ^<HOST>
ignoreregex =

/etc/fail2ban/jail.d/nginx.conf

[nginx-limit]
enabled = true
port = http,https
filter = nginx-limit
logpath = /var/log/nginx/access.log
findtime = 60
bantime = 14400
maxretry = 70

findtime = 60 - время 1 минута

bantime = 14400 - на сколько баним - время в секундах

maxretry = 70 - сколько максимум запросов разрешено - если сильная ДОС атака тогда можно поставить  10-30 чтоб быстрее всех банило.

/etc/fail2ban/jail.conf

[DEFAULT]
ip_version = ipv4 + ipv6
loglevel = 1
ignoreip = 127.0.0.1/8 ::1

Вот команда которая вертикальный столбик ip ставит в одну строку через пробел для ignoreip чтоб долго с ним не играться.

tr '\n' ' ' < input.txt > output.tx

Вот и все настройки от флуда на сайтах.  Работает в Ubuntu.

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий