Виталий Литвинов

Виталий Литвинов
Рейтинг
132
Регистрация
08.05.2008
Интересы
Музыка

Только что была атака снова и была нагрузка load average: 86 и fail2ban не справился с атакой!

Пришлось запускать мой скрипт и за 5 минут всех забанил и нагрузка упала до load average: 0.77

А я то думал что  fail2ban крутая программа! А оказалось нет!

Aisamiery #:

Ну так это парсеры с проксями же, примерно так и работают они. Я сколько ловил DDOS'ов, там редко IP повторяются

Так я за 4 часа наловил их аж 7000. И потом всё закончилось.

-= Serafim =- #:
Виталий, зачем ты это все пишешь? Если хочешь поделиться тем, что уже давно везде разжевано и куча мануалов - составь нормальный пост и от и до опиши.

Хорошо, а то из одного перешел в другое!

Aisamiery #:

DDOS'ом забивают канал, он все же ограничен, и никакие защиты на уровне сервера уже не спасут, а у вас больше похоже на парсеры какие то чем на ддос

Ну они как то обошли дос защиту хостера. Было 100-200  одновременно ходящих по сайту IP очень быстро открывающих страницы. И так ходили пока место не закончилось на VDS и база данных не сломалась.

Напишите здесь если и вам тоже как и мне  помогло от DDoS флуд атаки то что я здесь написал, мне же интересно!

От меня досеры сбежали!

Этой командой можно смотреть список забаненных IP

sqlite3 /var/lib/fail2ban/fail2ban.sqlite3 "SELECT ip FROM bans;"
Нужно изменить в этом файле чтобы влоги лишнее не писалось, а только кого забанили и розбанили.
/etc/fail2ban/fail2ban.conf

loglevel = NOTICE

/var/log/fail2ban.log
-= Serafim =- #:

Ничего себе! Внезапно!

Но со статикой влоге Nginx ничего бы не получилось 💪

Вот ещё команда для разблокировки ip, пригодится если вас заблокирует.

fail2ban-client set nginx-limit unbanip 127.0.0.1

Вот пример команды, которая выполняет проверку и выполнение команды, если размер файла /var/log/nginx/access.log больше 1 GB:

file_size=$(du -b /var/log/nginx/access.log | awk '{print $1}')
if [ "$file_size" -gt 1073741824 ]; then
    # Здесь вставьте команду, которую нужно выполнить, если размер файла больше 1 GB
        truncate -s 0 /var/log/nginx/access.log
    echo "Файл слишком большой!"
fi
        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.

Я начал изучать fail2ban !
И оказалось что он может делать всё то что я изобрёл!
В нём есть белый список и он умеет работать с IPv4 и IPv6.
Настроил его на /var/log/nginx/acess.log
В него всё записывается со всех сайтов, а на конфигурациях сайтов должны быть отключены логи.
Только в лог не должна записываться статика - jpg png js css и все остальные - Я завтра выложу кусок конфигурации nginx которая это делает.
Завтра ещё протестирую и здесь напишу как это всё настраивать!
Получается можно настроить fail2ban чтобы было за 1 минуту 60 запросов и если больше то бан или можно поставить за 5 минут 300 запросов, а если больше то бан.
И работает всё нормально и никакого флуда на сайтах нет.

Вот скрипт который удаляет 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')
Всего: 75