Защита игрового сервера от очень многих программ (IPTables)

WeSTMan

А вот тут текст!
Сообщения
833
Реакции
516
Использовать PREROUTING имеет смысл, там работают U32/ALGO STRING модули. Если ты конкретно знаешь какие пакеты невалидны, допустим TCP с левыми флагами, или идет атака A2S_MIXED - просто ограничить на уровне PREROUTING конкретно этот трафик, а внутри - все как обычно.
1: Нагрузка на CPU ниже.
2: Зная конкретные сигнатуры левого трафика - можно его заблокировать.
3: Можно напрямую помечать трафик левый в INPUT, а убивать в PREROUTING через кастомные цепочки.
Не использовать PREROUTING в связке с INPUT просто глупо. PREROUTING значительно сохраняет ресурсы CPU, и чувак скидывал схему - она реалистичная. (Ну для сравнения - без правил под атакой - 35% CPU везде, под атакой с правилами PRER - 20% CPU на одном ядре из 8).
У меня реализовано 160 правил под 8 серверов в PREROUTING, там куча правил которая смотрит на A2S соединения. А в INPUT реализован Hashlimit. И если IP умудряется попасть в этот лимит - он блокируется в PREROUTING. Если ты объединяешь правила для всех портов - если сработало правило - может произойти блокировка всех серверов, поэтому там нельзя совмещать правила по DPORTS. Конкретно разделяйте.
Я столкнулся как и Accelerator с атакой. Заказной (15-20к дурачки потратили, но точно хз сколько), A2S флуд с CAIDA-списков (IP-Spoofing). SYN-Flood/UDP Flood.
2.500000 пакетов A2S отбивал как мог. Забили порт - подключили внешние серверы-фильтры, и там тоже правил под 60 нагробастал. Понадобилась статья о Mikrotik RAW настройке (ибо там нечто подобное на серверах реализовано).
TCP-SYN отбил внешним сервером через SYN_LIMIT + там же встроенный TCP SYN COOKIES, ибо не проходит соединение если оно изначально не валидировано внешним сервером. С UDP значительно сложнее работать.
Какой у тебя инет канал?
 

Lappland_Saluzzo

Мимо пробегал
Сообщения
128
Реакции
57
Какой у тебя инет канал?
Гигабитка, негарантированные 30 ТБ. Этого хватает ибо внешний скраббер по сути молотит трафик. Куча трафика, выше гигабита - фильтруется до 10 Мбит на порт. Если будут бить по всем портам IP Spoofing даже с размером пакета 1500 (обычный ETH/IP кадр) - Сервер не погибнет, а атаку всю отобьет (я рассчитал что в гигабитке умещается около 80к пакетов и 2.5кк мелких заголовков Only). Но там у меня есть проблема, ибо я заюзал IPTables транслятор на nf_tables - посмотрел вчера содержимое что он там накалякал - дико удивился через какие костыли это работает. Но работает, и фиг бы с ним. Перевести - это надо курить man nf_tables конкретно. Самые мерзкие протоколы типа NTP/DNS/TCP SYN/TCP SYN-ACK (основные протоколы DDoS) хостинг уже блокирует, а вот заказные атаки - нет. Поэтому пришлось малость поизвращаться и прошариться.
http://109.248.250.217/nftables.conf - если хочется заценить, че я там намудрил (вывод с транслятора внутрянки (внешку - надо оформлять). Логика очень сложная, и по хорошему там надо ИИ-шкой пройтись чтобы понятно было что за что отвечает, а файл на ПК дома. Вчера просто сайтом занимался, запилил мощное оформление для правил на MA.
Да, конечно система не идеальна, из-за отсутствия нормальных инструментов фильтрации - но если цель сохранить игроков любой ценой, и чтобы сервер не погиб - система более чем адекватная. Там чекаются порты с которых клиенты чаще всего подключены - и они разрешаются на внешнем фильтре, CG-NAT игроки - только определенный диапазон разрешен и то под LIMIT. Лучше пусть часть игроков дисконнектнет (и то не факт ибо подсети VALID я ввел через HLStatsX, игроки ещё меньше страдают от фигни) Фильтрация Stateful в INPUT. Stateless в PREROUTING. Если там пакеты с IP SPOOFING - приходят - увеличены параметры таблицы, ибо сервер не слабый, и больше памяти под Conntrack выделено - с NOTRACK вчера пытался покурить документацию, но че-то понял что я слишком жесточайше упоролся пока защищал сервер, и сам не всю логику догоняю, че я там изобрел. Как завещал нам великий Крузя - год назад только 2 знали как это работает, я и бог, теперь это знает только бог - (С) init.php Material Admin
Чеки - Source Engine Packets. 0x55-56-57-58 биты проверяются, 55 вроде (Могу ошибаться!) A2S_RULES вообще блокируется - выдает инфу о сервере, не влияет на мониторинги, максимум настройки не видны, но меня это не интересует.
Сообщения автоматически склеены:

Какой у тебя инет канал?
Что-ж, ковыряйте, как обещал.
 

Вложения

  • SONNET_IPTABLES.txt
    31.4 КБ · Просмотры: 14
  • Документация к SONNET_IPTABLES.txt
    13.7 КБ · Просмотры: 14
Последнее редактирование:

WeSTMan

А вот тут текст!
Сообщения
833
Реакции
516
Гигабитка, негарантированные 30 ТБ. Этого хватает ибо внешний скраббер по сути молотит трафик. Куча трафика, выше гигабита - фильтруется до 10 Мбит на порт. Если будут бить по всем портам IP Spoofing даже с размером пакета 1500 (обычный ETH/IP кадр) - Сервер не погибнет, а атаку всю отобьет (я рассчитал что в гигабитке умещается около 80к пакетов и 2.5кк мелких заголовков Only). Но там у меня есть проблема, ибо я заюзал IPTables транслятор на nf_tables - посмотрел вчера содержимое что он там накалякал - дико удивился через какие костыли это работает. Но работает, и фиг бы с ним. Перевести - это надо курить man nf_tables конкретно. Самые мерзкие протоколы типа NTP/DNS/TCP SYN/TCP SYN-ACK (основные протоколы DDoS) хостинг уже блокирует, а вот заказные атаки - нет. Поэтому пришлось малость поизвращаться и прошариться.
http://109.248.250.217/nftables.conf - если хочется заценить, че я там намудрил (вывод с транслятора внутрянки (внешку - надо оформлять). Логика очень сложная, и по хорошему там надо ИИ-шкой пройтись чтобы понятно было что за что отвечает, а файл на ПК дома. Вчера просто сайтом занимался, запилил мощное оформление для правил на MA.
Да, конечно система не идеальна, из-за отсутствия нормальных инструментов фильтрации - но если цель сохранить игроков любой ценой, и чтобы сервер не погиб - система более чем адекватная. Там чекаются порты с которых клиенты чаще всего подключены - и они разрешаются на внешнем фильтре, CG-NAT игроки - только определенный диапазон разрешен и то под LIMIT. Лучше пусть часть игроков дисконнектнет (и то не факт ибо подсети VALID я ввел через HLStatsX, игроки ещё меньше страдают от фигни) Фильтрация Stateful в INPUT. Stateless в PREROUTING. Если там пакеты с IP SPOOFING - приходят - увеличены параметры таблицы, ибо сервер не слабый, и больше памяти под Conntrack выделено - с NOTRACK вчера пытался покурить документацию, но че-то понял что я слишком жесточайше упоролся пока защищал сервер, и сам не всю логику догоняю, че я там изобрел. Как завещал нам великий Крузя - год назад только 2 знали как это работает, я и бог, теперь это знает только бог - (С) init.php Material Admin
Чеки - Source Engine Packets. 0x55-56-57-58 биты проверяются, 55 вроде (Могу ошибаться!) A2S_RULES вообще блокируется - выдает инфу о сервере, не влияет на мониторинги, максимум настройки не видны, но меня это не интересует.
Сообщения автоматически склеены:


Что-ж, ковыряйте, как обещал.
Если я дам 2 гбит/с на игровой порт с ip udp spoof и валидными пакетами, то какое поведение будет у защиты?
 

Lappland_Saluzzo

Мимо пробегал
Сообщения
128
Реакции
57
Если я дам 2 гбит/с на игровой порт с ip udp spoof и валидными пакетами, то какое поведение будет у защиты?
Очень сложно сказать точно!
2 Гбит IP/UDP со Spoof на допустим 27015... А содержимое пакетов какое? А с какого порта бить будешь?
С указанными условиями - твои 2 Гбита, это 5 миллионов пакетов сожмутся до 26 тысяч пакетов, при условии что Payload мелкий... Если бить ещё в открытые порты все разом, то суммарно 68к пакетов. Если атака с мелким Payload то её отфильтрует внутрянка. Если Null Zero Length || A2S - вообще пофигу, сразу в /dev/null атака улетит. Если пакет более 1260 байт - улетит в /dev/null оставшийся. Если фрагментированный трафик - в /dev/null. Если TTL == 1 - /dev/null. Если в районе от 28 до 53 байт - ограничитель для защиты кэша Source Engine - в /dev/null. Отключишь ты пару человек и всё, выходом за пределы лимита внешнего сервера фильтра. Серверу игровому будет ни холодно ни жарко. Conntrack - не переполнится тупо потому что у него таймауты сильно урезаны, записи увеличены (CPU/RAM позволяют + ZRAM и файл подкачки на такой случай [NVMe же]). Если содержимое пакетов случайное - ты частично попадешь в PREROUTING-сигнатуры. Частично в INPUT. В INPUT если попался - попал в PREROUTING DROP. В OUTPUT - сейчас блокируется отправка любого запроса на заблокированные адреса.
DNS/NTP/SSDP - бесполезно, фильтр на уровне хостинга - такая атака даже не дойдёт.
Использовать ботнеты с Reflection атаками - вообще даже до игрового сервера не дойдет. Многие SRC порты заблокированы на внешнем фильтре.
Короче ты только часть игроков отключишь по итогу атаки, но потом удивишься что сервер работает и ему как-то пофигу на твою атаку. И игроки подключаются и отключаются спокойно... Лучше реализовать можно только внутрянку в INPUT, но мне лень пока что.
Что там вообще...
INVALID трафик дропается, установленные, связанные подключения - принимаются. Если с IP поступает более 5 подключений с разных SRC-Port - улетает IP в блокировку. Если с IP более 80 пакетов в секунду идёт с кратковременным всплеском до 160 - тоже улетает в PREROUTING (Макс на вход - 66 игровых плюс Voice данные). Это ловит DoS-IP и флудеров или чит-клиенты которые решили пофлудить в Net_Channel + net_chan_limit_msec 125, потому что могу себе позволить из-за AMD Epyc 7763, 8 ядер, VMWare + 12 ГБ DDR4.
 
Последнее редактирование:

WeSTMan

А вот тут текст!
Сообщения
833
Реакции
516
Очень сложно сказать точно!
2 Гбит IP/UDP со Spoof на допустим 27015... А содержимое пакетов какое? А с какого порта бить будешь?
С указанными условиями - твои 2 Гбита, это 5 миллионов пакетов сожмутся до 26 тысяч пакетов, при условии что Payload мелкий... Если бить ещё в открытые порты все разом, то суммарно 68к пакетов. Если атака с мелким Payload то её отфильтрует внутрянка. Если Null Zero Length || A2S - вообще пофигу, сразу в /dev/null атака улетит. Если пакет более 1260 байт - улетит в /dev/null оставшийся. Если фрагментированный трафик - в /dev/null. Если TTL == 1 - /dev/null. Если в районе от 28 до 53 байт - ограничитель для защиты кэша Source Engine - в /dev/null. Отключишь ты пару человек и всё, выходом за пределы лимита внешнего сервера фильтра. Серверу игровому будет ни холодно ни жарко. Conntrack - не переполнится тупо потому что у него таймауты сильно урезаны, записи увеличены (CPU/RAM позволяют + ZRAM и файл подкачки на такой случай [NVMe же]). Если содержимое пакетов случайное - ты частично попадешь в PREROUTING-сигнатуры. Частично в INPUT. В INPUT если попался - попал в PREROUTING DROP. В OUTPUT - сейчас блокируется отправка любого запроса на заблокированные адреса.
DNS/NTP/SSDP - бесполезно, фильтр на уровне хостинга - такая атака даже не дойдёт.
Использовать ботнеты с Reflection атаками - вообще даже до игрового сервера не дойдет. Многие SRC порты заблокированы на внешнем фильтре.
Короче ты только часть игроков отключишь по итогу атаки, но потом удивишься что сервер работает и ему как-то пофигу на твою атаку. И игроки подключаются и отключаются спокойно... Лучше реализовать можно только внутрянку в INPUT, но мне лень пока что.
Что там вообще...
INVALID трафик дропается, установленные, связанные подключения - принимаются. Если с IP поступает более 5 подключений с разных SRC-Port - улетает IP в блокировку. Если с IP более 80 пакетов в секунду идёт с кратковременным всплеском до 160 - тоже улетает в PREROUTING (Макс на вход - 66 игровых плюс Voice данные). Это ловит DoS-IP и флудеров или чит-клиенты которые решили пофлудить в Net_Channel + net_chan_limit_msec 125, потому что могу себе позволить из-за AMD Epyc 7763, 8 ядер, VMWare + 12 ГБ DDR4.
Трафик будет идти со всех ip адресов v4, с разного src port, с разным TTL, с разным содержимым, но валидным, с разным размером байт. Это игровые пакеты + A2S
 

Lappland_Saluzzo

Мимо пробегал
Сообщения
128
Реакции
57
Трафик будет идти со всех ip адресов v4, с разным TTL, с разным содержимым, но валидным, с разным размером байт. Это игровые пакеты + A2S
Если очень упрощенно - A2S запросы в лимите - 100% блокировка. Игровые пакеты - левые отбрасываются, вся атака с 2 Гбит превращается в 1-20мбит в секунду. Потеряется часть игроков, но не смертельно из-за особенностей внешнего фильтра. Сервер такое спокойно пережевывает. Ничего ему не будет. Проверено в боевых условиях именно такой атакой. 2.5 ляма было таких пакетов что-ли? Даже больше. Мне просто порт забили в самом начале.

- Порты с 1-1024 - блокировка полная.
- Порты с Reflection - блокировка полная.
- Порты с диапазона 11211,1900,5353,5000,1434,32768:32775 - блок.
- Порты с диапазона 7547,5555,37215,52869,17185,53413 - блок.
- Порты с диапазона CG-NAT (1025 - 8192) - Лимит 10к пакетов в секунду.
- Подключения с белого списка CIDR блоков - разрешен полностью, внутренний справится.
- Подключения с GEOIP - 6к пакетов максимум.
- Порт 27005 - разрешен, лимит 3200 пакетов.
- Все неуказанные обрабатываются GeoIP-правилами.
- NTP/DNS/SSDP/LDAP - блокировка полная.
- TCP - блокировка полная.
Ну до 20к пакетов добьешь, всю атаку сожрет внешний фильтр, остатки - внутренний фильтр. 20к пакетов для сервера - это полная фигня, справляется легко. DDoS превращается в уровень DoS, только рандомные адреса - поэтому в такие моменты я хочу сделать интересную фичу с NOTRACK, но пока не знаю как это реализовать грамотнее.
 
Последнее редактирование:

WeSTMan

А вот тут текст!
Сообщения
833
Реакции
516
Если очень упрощенно - A2S запросы в лимите - 100% блокировка. Игровые пакеты - левые отбрасываются, вся атака с 2 Гбит превращается в 1-20мбит в секунду. Потеряется часть игроков, но не смертельно из-за особенностей внешнего фильтра. Сервер такое спокойно пережевывает. Ничего ему не будет. Проверено в боевых условиях именно такой атакой. 2.5 ляма было таких пакетов что-ли? Даже больше. Мне просто порт забили в самом начале.

- Порты с 1-1024 - блокировка полная.
- Порты с Reflection - блокировка полная.
- Порты с диапазона 11211,1900,5353,5000,1434,32768:32775 - блок.
- Порты с диапазона 7547,5555,37215,52869,17185,53413 - блок.
- Порты с диапазона CG-NAT (1025 - 8192) - Лимит 10к пакетов в секунду.
- Подключения с белого списка CIDR блоков - разрешен полностью, внутренний справится.
- Подключения с GEOIP - 6к пакетов максимум.
- Порт 27005 - разрешен, лимит 3200 пакетов.
- Все неуказанные обрабатываются GeoIP-правилами.
- NTP/DNS/SSDP/LDAP - блокировка полная.
- TCP - блокировка полная.
Ну до 20к пакетов добьешь, всю атаку сожрет внешний фильтр, остатки - внутренний фильтр. 20к пакетов для сервера - это полная фигня, справляется легко. DDoS превращается в уровень DoS, только рандомные адреса - поэтому в такие моменты я хочу сделать интересную фичу с NOTRACK, но пока не знаю как это реализовать грамотнее.
Как я посмотрел твои правила, то при такой атаке - у тебя полностью перестанет сервер отвечать на A2S + забьётся канал, если хостинг не предоставляет защиту. Обычно они ограничивают порт, а если так, то начнёт лагать и все игроки повылетают, т. к. Трафик будет забит мусором (валидными игровыми пакетами). Так же у тебя будут ошибки по переполнению таблицы hash limit.

В правилах есть несколько упущений связанных с алгоритмом bm в качестве проверки строки. Правила выглядят избыточными их можно нормализовать, чтобы не привязываться к конкретному порту, а сделать универсальными.

Обычно атаки до 1 Гбит/с являются детской игрой, так как любой стрессер бесплатно тебе выдаст такую производительность, а вот атаки более умные - вот это уже поинтереснее.

Если тебе интересно протестировать свою защиту, то я могу найти уязвимости в ней и эксплуатировать, но это потребует аренды тачки, за твой счёт

Напомню, что фаер твой не отбрасывает игровые пакеты тем способом, что я написал, а значит они все пройдут проверки и попадут на srcds
 

Lappland_Saluzzo

Мимо пробегал
Сообщения
128
Реакции
57
1. Я знаю прикол с A2S, и знаю как его исправить, это легко, и спасибо что намекнул на недочет.
2. TTL - тут согласен - меньше 32 никогда на UDP/TCP не встречается в природе.
3. Канал не забъется гарантированного, см. пункт 4.
4. Правила разработаны под конкретный тип атаки, который ты явно указал (кстати под этот тип атаки правила и стоят), внешний фильтр грубо режет трафик, а внутренний добивает. Соответственно Hashlimit, с увеличенными лимитами и низкими таймаутами - творят чудо.
5. Буферы не переполнятся, ибо они увеличены.
6. 20 мбит флуда игровым трафиком - это не гигабит - выдержит спокойно, с учетом мощного CPU.
7. У меня появилась новая идея фильтрации по DSCP, потому что у TF2 он равен 24. Неочевидный прикол.
(Когда как)
 
Последнее редактирование:
Сверху Снизу