Подскажите по nft
Жестко ддосят, nginx перебирает айпишники, а fail2ban пушит их в nftables
За сегодня добавлено порядка 300к элементов (ip) в nft и похоже это только начало.
Интересует вопрос, стоит ли беспокоится о том что в конечном итоге nft ляжет из за объема, если да, то что можно предпринять?
Everything_is_bad, я в этом не силен, как мне кажется просто кучей запросов перебирают страницы сайта.
Сервер на котором расположен сайт, выдерживет, а вот сервер с базой данных нет, работает какой то время и клинет к фигам собачим, под базу взял сервер помощьнее и пока полет нормальный. Ну к базе только у приложения есть доступ, сайт+API сервер, а API сервер уже с базой общается.
Идет ддос с разных ip, с разных стран.
У меня ЦА чисто русская, поэтому мне не особо не важны другие страны, ну только разве что поисковые боты, поэтому через nginx выставил лимиты, ну а fail2ban пушит их в nft на 1 день. Но как я понял у него айпишники вообще не заканчиваются...
Уже где то трое сукот практически без передыху ддосит.
У меня ЦА чисто русская, поэтому мне не особо не важны другие страны,
В таком случае на уровне ОС/железа можно задать вайтлист ру сегмента, что сразу снимет вопрос с объемом хранения, так как ру сегмент адресов относительно скромный. Остаток вполне потянет nft. В общем случае я бы рекомендовал накинуть клоудфлейр, но вроде в РФ он не работает...
еще в fail2ban можно назначить прогрессивную блокировку, когда повторяющимся адресам будет увеличиваться срок бана - день, два, четыре и т.д, как угодно.
далее. я не настраивал в fail2ban и nft , и не помню какие там actions сейчас есть из коробки, но можно(нужно) вместо добавления адресов в таблицы использовать ipset , так быстрее обрабатывается и в целом для системы легче.
Refguser, у меня бан не совсем по ip проходит, nginx смотрит какой язык в браузере стоит у пользователя и если RU, то он не пишет инфу для fail2ban. Т.е. в практическом смысле банятся только забугорные юзеры и только во время атаки, если атаки нет и банить никого не будет.
ThunderCat, клоудфлейр мимо, с ним проблемы к сожалению =)
Ну и я бы не хотел прям жестко банить весь траф кроме ru, порядка 10% из за бугра приходит и норм пользователи, но временно забанить их все же можно, на время атаки.
Когда-то в чуть другом ключе заморачивался с банлистом (пополнялся от honepots), а при росте списка - оффлайн обработка списка для "схлопывания" отдельных ip из списка в подсеть
примерный алгоритм:
- добыть сеть для адреса (например через whois)
- смержить все адреса из этой подсети и создать одну запись блока подсети
как образчик (прям из живого):
2.57.121.28 щупал sip
2.57.121.203 - сунул нос в ftp
по whois оба адреса из одной сети:
d-stream, я тож подсеть банил пару раз, но тут столько данных, это вручную надо будет все проштудировать. Я обычно тут прроверяю ip на спам cleantalk, ну и там же и подсет видна =)
какой язык в браузере стоит у пользователя и если RU, то он не пишет инфу для fail2ban.
Во, первая часть - правильный путь. Одобряю :) А вот вторая.. если ты имеешь ввиду IP - то ладно, но f2b не должен останавливаться только на языке UA. Проверяй другие признаки (начиная от кол-ва запросов в сек).
Refguser, не получится проверять колличество запросов в секунду, потому как весь ддос тогда пройдет. Я режу всех подряд (у кого язык в браузере к примеру en|zh), но только когда nginx забит по лимитам. Zerg89, не, там токен только для общения сайта и апи. Да и смысла не будет, потому как http(s) запросами долбят.
Для статистики в nft уже более 600к айпишников.
Сейчас думаю сделать как:
1. Перенести все айпишники в другую таблицу, тем самым nft немного сократит колличество айпишников, он на автомате интервалы вроде как создает при вставке, что то вроде 47.76.0.0-47.87.255.255
2. Собирать далее с помощью fail2ban новые айпи и после добавлять опять их в другую таблицу.
У меня вообще создана в базе коллекция со всеми подозрительными ips, я эту базу так же прогоняю через cleantalk, ищу спамные и не спамные, делаю поментки. Проблема в том что с моими суточными объемами (бесплатными), я эти 600к айпи год буду проверять)))
Refguser, я может не правмильно понял, но как я проверю число запросов в секунду с одного IP, если они все разные?
Если вы имеете ввиду общее число запросов со всех IP подряд, так у меня nginx этим как раз и занимается, выставленно ограничение 500 запросов в минуту от тех у кого язык в бразуре en|zh, если пошла лавина трафика, т.е. ддос, тогда все те кто в лимитку не уложился баняться fail2ban и заносятся в nft таблицу.
как я проверю число запросов в секунду с одного IP, если они все разные?
Это стандартная настройка f2b. На вскидку не подскажу как настроить, но в манах должно быть. Ну или на крайняк погуглить/спросить у нейронки.
АПД
Вот что выдал я.нейро
Для настройки ограничения количества запросов с помощью Fail2ban необходимо использовать модуль лимитирования запросов в NGINX (ngx_http_limit_req_module). 2
Принцип работы: модуль лимитирования запросов ограничивает количество запросов от пользователей и записывает события в error.log. Fail2Ban парсит данные из лог-файла с использованием фильтров и блокирует IP-адреса, производящие подозрительные запросы. 2
Пример настройки: нужно ограничить 30 запросов в минуту от одного IP-адреса. 2
1. Подключить модуль лимитера запросов в NGINX:
В основном конфигурационном файле /etc/nginx/nginx.conf добавить команду
. Она создаёт зону лимитирования, которая использует IP-адрес клиента для идентификации, хранит данные в зоне example размером 100 МБ и ограничивает 30 запросов в минуту. 2
Далее необходимо применить зону для одного из location:
. 2
Отредактировать /etc/fail2ban/jail.local и привести содержимое фильтра nginx-limit-req к следующему виду:
[nginx-limit-req] enabled = true port = http,https logpath = %(nginx_error_log)s
. 2
По умолчанию в Fail2Ban при срабатывании определённого условия (например, обнаружении 5 совпадений) активируется правило, которое блокирует IP-адрес злоумышленника на 10 минут. Эти значения можно изменить в конфигурации jail.local, подправив параметры
maxretry
(максимальное количество попыток) и
bantime
(время блокировки). 2
После сохранения обоих конфигурационных файлов нужно перезапустить Fail2ban:
Refguser, так у меня все это и стоит, я ж об этом и пишу и работает у меня все так же. За исключением того что nginx до кучи и юзеров en/zh бреет во рвемя нагрузки.
А то что вы пишите работать не будет, потому как fail2ban чекает совпадения с одного IP, а у меня ддос, а не дос идет. С обычным дос проблем вообще бы не было, а тут каждый запрос это новый ip, поэтому дефолтная свзяка nginx+limit+fail2ban не работает и в принципе работать не должна.
Я тут еще вот что надумал, можно ли как то в nginx узнать включен ли в браузере пользователя javascript?
Просто вполне реально что у ддосера js вовсе выключен и тупо сразу его редиректить куда то подальше...
Так же сейчас уменьшил бан-разбан до 30 секунд, вот почему:
За сутки при выборочном переборе айпишников ддосера понял что, он ддосит все время с разных ip, и за сутки они не дублировались ни разу, тогда и смысла нет их хранить долго.
Второе, саме тяжеловесные запросы в базу идут по javascript, собственная коллекция аналитики на миллиона строк за месяц. И если просто тупо банить ip через fail2ban, то доссер только к серверу подрубается, делает пару запросов в базу, ловит бан и до аналитики не доходит. Ну получается просто бан-разбан идел и никакого вреда причинить не может, сервера выыдерживают. Единственно что меня мучает, так это то что постоянная запись-удаление айпишников идет на сервере, ну и nginx логи летатят как не в себя=)
Если бы можно было узнать включен ли javascript с помощью nginx, я бы сделал так что даже банить не пришлось во время нагрузок, и тупо на страницу пустышку редиректил такие запросы.
я тож подсеть банил пару раз, но тут столько данных, это вручную надо будет все проштудировать. Я обычно тут прроверяю ip на спам cleantalk, ну и там же и подсет видна =)
не надо ничего руками - есть миллионы готовых модулей для того же питона и там это в пару строк:
>>>> import whois
>>> w=whois.whois('1.175.187.8')
>>> print(w)
}
nft будет постоянно увеличивать потребление оперативки. Теоретически лечь не должен.
Если fail2ban добавляет отдельные правила (drop ip saddr x.x.x.x) — это плохо, так как каждое правило — отдельный объект, и при сотнях тысяч их ядро может начать тормозить. Если используется динамическое множество (set) , например: add set inet filter blocked_ips { type ipv4_addr; flags interval; } и затем просто: add element inet filter blocked_ips { x.x.x.x } то это гораздо эффективнее.
nft поддерживает TTL (время жизни) для элементов множеств - это позволит автоматически очищать старые записи. Но с TTL придётся поиграться)
WAF + Cloudflare не советую по понятным причинам (если конечно подверженный ресурс не в зоне атаки РКН))
fail2ban пушит новый ip в elements={}. В общем добавляет, а не создает новое правило.
fail2ban тоже имеет настройку по удалению, сейчас просто стоит время на сутки, спустя 24 часа ip удаляется. Но их просто столько, что жестятк =)