Перейти к содержанию
Авторизация  
m1ckey

Iptables - балансировка сетевой нагрузки, блекхолинг, порт-кнокинг и мысли в слух

Рекомендуемые сообщения

Всем привет) Вчера начал изучать архитектуру iptables, различные методы описанные на опеннете, на вики... И пришла мысля - создать набор правил который бы максимально фильтровал нелегальный трафик. И так, приступим - мы будем пытаться настроить iptables для машины где стоит игровой, логин сервер и база данных. Это не гайд и не мануал, это пост для размышления людям которым интересна эта тема. Понятное дело,  что от забитого канала это никак не спасет.

Первое что мы должны сделать, это понять какие порты используют наши сервисы ВООБЩЕ и какой трафик они обрабатывают.

9014 - логин сервер

2106 - логин сервер

7777 - игровой сервер

3306 - MySQL

Мои размышления

За основу думаю следует взять правило "Всё что не разрешено - запрещено". То есть мы в начале определяем какой трафик мы пропускаем, разрешаем его и обрабатываем, всё остальное - дропаем. В идеале у нас не должно остаться открытых портов ВООБЩЕ (и в этом нам поможет порт-кнокинг). 

1) Что мы делаем с транзитным FORWARD трафиком? В целом, за сутки простоя мой дедик не обработал не одного пакета который попал бы в цепочку FORWARD, означает ли это что мы можем его дропать?

2) Как мне известно, L2 использует TCP-трафик, означает ли это UDP-пакеты можно дропать на уровне PREROUTING? И вопрос вообще в целом к знакотам - где лучше дропать нежелательные пакеты? На уровне INPUT или всё таки еще до решения о маршрутизации?

3) Поскольку я работаю со сборкой где порт 7777 открывается только после авторизации, мне пришла в голову мысль - а можем ли мы как то для себя "отмечать" новые соединения на 7777? Ну например - мы их помечаем маркером maybePlayer, и во время атаки - трафик который приходит с подключений которые не отмечены маркером maybePlayer отправлять в блекхоллинг (в никуда)? Но что делать при мощной атаке, советуют обратиться к ip route... но я его еще не изучал..

4) Вчера весь день просидел над изучением порт-кнокинга и я загорелся этой темой. Мне мазолит глаза результат из nmap о том что у меня висит 2 открытых порта (ssh и логин). Я всерьез задумался их скрыть и сделать дедик невидимым для лишних глаз. Но я столкнулся с дилемой - модифицировать клиент нет желания, хочется сделать это на уровне ядра. Встает вопрос - как. Все мы знаем, что по умолчанию игровой клиент настроен на 2106 при попытке войти в игру. В таком случае, я подумал - мы можем слушать "стукачей" на порту 2106 и открывать для них порт логин сервера. Но как потом человек подключится к серверу когда, если клиент все равно будет отправлять пакеты на 2106 ? Следующим шагом после "стука" в 2106 мы можем сделать проброс порта с 2106 на 2019 когда мы открываем "дверцу", но ведь в этом случае и нелегальный трафик будет идти таким-же образом. Но ведь логин сервер нужен игроку 1 раз, затем коннект закрывается... в общем эта тема не дает мне покоя. Видел я готовые решения от акуму, но честно я не хочу модифицировать клиент. В идеале моя цель сделать невозможным для игрока получение инфы  о том как надо стучать и в какой порт стучать, я хочу чтобы это делал логин сервер по локальной петле.

5) Еще наткнулся на гайды о том как правильно обрабатывать входящий трафик, как его балансировать и тд - но есть ли смысл делать это на машине-хосте, когда у нас нет дополнительного шлюза ?

Кому интересна эта тема - присоединяйтесь к обсуждению, критику к черту - я всего лишь учусь)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1. FORWARD на игровом сервере не нужен (я рискну предположить что у тебя он вообще выключен)

2. UDP пакеты все равно будут доходить, лучше его дропать ДО машины

3. В сборках на базе 1.7 реализован подобный функционал, можно создать лист ipset и добавлять туда айпи адреса которым разрешено подключаться к порту 7777

4. А вопрос - а какую проблему конкретно в этом пункте вы  хотите решить?

5. Задам точно такой же вопрос как и в 4 пункте

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
20 минут назад, Energy сказал:

1. FORWARD на игровом сервере не нужен (я рискну предположить что у тебя он вообще выключен)

2. UDP пакеты все равно будут доходить, лучше его дропать ДО машины

3. В сборках на базе 1.7 реализован подобный функционал, можно создать лист ipset и добавлять туда айпи адреса которым разрешено подключаться к порту 7777

4. А вопрос - а какую проблему конкретно в этом пункте вы  хотите решить?

5. Задам точно такой же вопрос как и в 4 пункте

3) У меня тоже имеется, но сервер просто добавляет новое правило в цепочку INPUT с разрешением о подключении.  Я модифицировал это добавив удаление доступа при выходе из игрового клиента. Но почему бы при этом не помечать подключения и в случае ддос мы можем дропать весь непомеченный трафик ? Сохранять огромный список адресов игроков в iptables недопустимо, поскольку огромное количество правил замедляет работу firewall.

4) Мы закрываем порт логин сервера и открываем его только для определенного IP, только при отправке с этого IP нескольких пакетов на разные порты нашего сервера. Всё это происходит когда происходит попытка входа в игру. https://putty.org.ru/articles/port-knocking.html  Тоже самое я планирую сделать и с SSH. Таким образом, при прослушивании портов злоумышленник не увидит не одного открытого порта.

Там описан метод как защитить SSH-сервер. Я пытаюсь понять как это использовать в L2 без вмешательства в клиентскую часть..

5) Чтобы при атаке средней мощности нелегальный трафик не так сильно нагружал машину... https://ru.wikipedia.org/w/index.php?title=Iptables&oldid=37388394#Работа_с_цепочками тут выше если пролистать до слов "Userspace-вариант l7-filter" приходят на ум интересные размышления.

Еще размышление - цепочка INPUT не является первой ступенью когда пакет только-только поступает к нам на сервер. Есть цепочка PREROUTING, которая может модифицировать и управлять пакетами на уровне сетевого устройства (когда они только поступают на стеевую карту). Чтобы вы понимали, цепочка INPUT отвечает за пакеты которые предназначены для служб, когда уже ПРИНЯТО решение о маршрутизации. А мы зачем-то на этом уровне занимаемся фильтрацией. С точки зрения забугорья (  https://javapipe.com/blog/iptables-ddos-protection/ ) - отсеивать ненужный трафик необходимо в таблице mangle цепочки PREROUTING.

Цитата

 

Итак, вы хотите знать, почему ваши правила защиты от DDoS в iptables отстой? Это потому, что вы используете таблицу фильтров и цепочку INPUT, чтобы блокировать плохие пакеты!

вау гиф
Лучшее решение , чтобы значительно увеличить производительность ваших правил Iptables и , следовательно, количество (TCP) DDoS атаки трафик они могут фильтровать, чтобы использовать mangle таблицу и PREROUTING цепь!

 

 

Изменено пользователем kickuass

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Еще есть возможность распределять приоритет для TOS (честно я мало понимаю что это).

Пример:

# Для соединений, по которым передано более 500 КБ, ставим минимальный приоритет TOS (требование максимальной полосы)
iptables -t mangle -I INPUT -m connbytes --connbytes 512000: --connbytes-dir both --connbytes-mode bytes -j TOS --set-tos Maximize-Throughput
iptables -t mangle -I OUTPUT -m connbytes --connbytes 512000: --connbytes-dir both --connbytes-mode bytes -j TOS --set-tos Maximize-Throughput
# Для соединений, по которым передано менее 50 КБ, ставим максимальный приоритет TOS (требование минимальной задержки)
iptables -t mangle -I INPUT -m connbytes ! --connbytes 51200: --connbytes-dir both --connbytes-mode bytes -j TOS --set-tos Minimize-Delay
iptables -t mangle -I OUTPUT -m connbytes ! --connbytes 51200: --connbytes-dir both --connbytes-mode bytes -j TOS --set-tos Minimize-Delay

Таким образом, все пакеты, принадлежащие «легким» соединениям, будут маркироваться как наиболее приоритетные, а пакеты, проходящие по «тяжеловесным» соединениям — как наименее приоритетные. Такой подход позволит рационально распределять канал между различными задачами, например, просмотром веб-страниц («легкие» соединения) и скачиванием файлов («тяжелые» соединения).

Конечно, при таком подходе даже «тяжелые» соединения будут занимать канал с наивысшим приоритетом, пока не превысят ограничение. Но даже на медленных соединениях (128 Кбит/с) для этого достаточно всего четырех секунд (если эта закачка в данный момент единственная). После превышения лимита 50 Кбайт соединение получит средний приоритет (TOS не установлен), а еще через некоторое время соединение превысит второй лимит — 500 Кбайт, и получит минимальный приоритет. В то же время, «легкие» соединения в большинстве случаев не превышают даже первого лимита, и поэтому целиком проходят с повышенным приоритетом.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
20 минут назад, kickuass сказал:

3) У меня тоже имеется, но сервер просто добавляет новое правило в цепочку INPUT с разрешением о подключении.  Я модифицировал это добавив удаление доступа при выходе из игрового клиента. Но почему бы при этом не помечать подключения и в случае ддос мы можем дропать весь непомеченный трафик ? Сохранять огромный список адресов игроков в iptables недопустимо, поскольку огромное количество правил замедляет работу firewall.

4) Мы закрываем порт логин сервера и открываем его только для определенного IP, только при отправке с этого IP нескольких пакетов на разные порты нашего сервера. Всё это происходит когда происходит попытка входа в игру. https://putty.org.ru/articles/port-knocking.html  Тоже самое я планирую сделать и с SSH. Таким образом, при прослушивании портов злоумышленник не увидит не одного открытого порта.

Там описан метод как защитить SSH-сервер. Я пытаюсь понять как это использовать в L2 без вмешательства в клиентскую часть..

5) Чтобы при атаке средней мощности нелегальный трафик не так сильно нагружал машину... https://ru.wikipedia.org/w/index.php?title=Iptables&oldid=37388394#Работа_с_цепочками тут выше если пролистать до слов "Userspace-вариант l7-filter" приходят на ум интересные размышления.

Еще размышление - цепочка INPUT не является первой ступенью когда пакет только-только поступает к нам на сервер. Есть цепочка PREROUTING, которая может модифицировать и управлять пакетами на уровне сетевого устройства (когда они только поступают на стеевую карту). Чтобы вы понимали, цепочка INPUT отвечает за пакеты которые предназначены для служб, когда уже ПРИНЯТО решение о маршрутизации. А мы зачем-то на этом уровне занимаемся фильтрацией. С точки зрения забугорья (  https://javapipe.com/blog/iptables-ddos-protection/ ) - отсеивать ненужный трафик необходимо в таблице mangle цепочки PREROUTING.

 

3. А я помоему и ткнул в ipset а не iptables

4. А как это спасет от SYN флуда, например? В теории при каждом подключении создается коннект на порт 2106, и подключается он сразу к логин серверу отправляя ему пакет, какая магия форварда здесь должна произойти без участия клиента - я мало себе представляю.

5. Да, интересное чтиво, можно взять за вооружение

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
1 минуту назад, Energy сказал:

3. А я помоему и ткнул в ipset а не iptables

4. А как это спасет от SYN флуда, например? В теории при каждом подключении создается коннект на порт 2106, и подключается он сразу к логин серверу отправляя ему пакет, какая магия форварда здесь должна произойти без участия клиента - я мало себе представляю.

5. Да, интересное чтиво, можно взять за вооружение

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Господа, а такой вопрос. Есть у кого то возможность запустить тест системы безопасности SYN флудом?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
9 часов назад, kickuass сказал:

Всем привет) Вчера начал изучать архитектуру iptables, различные методы описанные на опеннете, на вики... И пришла мысля - создать набор правил который бы максимально фильтровал нелегальный трафик. И так, приступим - мы будем пытаться настроить iptables для машины где стоит игровой, логин сервер и база данных. Это не гайд и не мануал, это пост для размышления людям которым интересна эта тема. Понятное дело,  что от забитого канала это никак не спасет.

Первое что мы должны сделать, это понять какие порты используют наши сервисы ВООБЩЕ и какой трафик они обрабатывают.

9014 - логин сервер

2106 - логин сервер

7777 - игровой сервер

3306 - MySQL

Мои размышления

За основу думаю следует взять правило "Всё что не разрешено - запрещено". То есть мы в начале определяем какой трафик мы пропускаем, разрешаем его и обрабатываем, всё остальное - дропаем. В идеале у нас не должно остаться открытых портов ВООБЩЕ (и в этом нам поможет порт-кнокинг). 

1) Что мы делаем с транзитным FORWARD трафиком? В целом, за сутки простоя мой дедик не обработал не одного пакета который попал бы в цепочку FORWARD, означает ли это что мы можем его дропать?

2) Как мне известно, L2 использует TCP-трафик, означает ли это UDP-пакеты можно дропать на уровне PREROUTING? И вопрос вообще в целом к знакотам - где лучше дропать нежелательные пакеты? На уровне INPUT или всё таки еще до решения о маршрутизации?

3) Поскольку я работаю со сборкой где порт 7777 открывается только после авторизации, мне пришла в голову мысль - а можем ли мы как то для себя "отмечать" новые соединения на 7777? Ну например - мы их помечаем маркером maybePlayer, и во время атаки - трафик который приходит с подключений которые не отмечены маркером maybePlayer отправлять в блекхоллинг (в никуда)? Но что делать при мощной атаке, советуют обратиться к ip route... но я его еще не изучал..

4) Вчера весь день просидел над изучением порт-кнокинга и я загорелся этой темой. Мне мазолит глаза результат из nmap о том что у меня висит 2 открытых порта (ssh и логин). Я всерьез задумался их скрыть и сделать дедик невидимым для лишних глаз. Но я столкнулся с дилемой - модифицировать клиент нет желания, хочется сделать это на уровне ядра. Встает вопрос - как. Все мы знаем, что по умолчанию игровой клиент настроен на 2106 при попытке войти в игру. В таком случае, я подумал - мы можем слушать "стукачей" на порту 2106 и открывать для них порт логин сервера. Но как потом человек подключится к серверу когда, если клиент все равно будет отправлять пакеты на 2106 ? Следующим шагом после "стука" в 2106 мы можем сделать проброс порта с 2106 на 2019 когда мы открываем "дверцу", но ведь в этом случае и нелегальный трафик будет идти таким-же образом. Но ведь логин сервер нужен игроку 1 раз, затем коннект закрывается... в общем эта тема не дает мне покоя. Видел я готовые решения от акуму, но честно я не хочу модифицировать клиент. В идеале моя цель сделать невозможным для игрока получение инфы  о том как надо стучать и в какой порт стучать, я хочу чтобы это делал логин сервер по локальной петле.

5) Еще наткнулся на гайды о том как правильно обрабатывать входящий трафик, как его балансировать и тд - но есть ли смысл делать это на машине-хосте, когда у нас нет дополнительного шлюза ?

Кому интересна эта тема - присоединяйтесь к обсуждению, критику к черту - я всего лишь учусь)

Можно ваш список правил глянуть?ато интересно очень.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
2 часа назад, k0ss11 сказал:

kali linux hping3

пробовал, в iftop показывает подключения, но в iptables кол-во дропнутых пакетов и кол-во принятых пакетов не меняется. Логин тоже в top молчит 2,6% нагрузки CPU. В iptables вроде прописано дропать... 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Только что, M1SHA сказал:

Можно ваш список правил глянуть?ато интересно очень.

Да там по сути пока ничего нет.

#!/bin/sh
iptables -F 
iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP 
iptables -A INPUT -p tcp ! --syn -m state --state NEW -j DROP 
iptables -A INPUT -p tcp --tcp-flags ALL ALL -j DROP 
iptables -A INPUT -i lo -j ACCEPT 
iptables -A INPUT -p tcp -m tcp --dport SSH -j ACCEPT 
iptables -A INPUT -p tcp -m tcp --dport 2106 -j ACCEPT
iptables -I INPUT -p tcp -s MY_IP --dport 3306 -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport 2106 -m connlimit --connlimit-above 2 -j DROP 
iptables -A INPUT -p tcp -m tcp --dport 7777 -m connlimit --connlimit-above 5 -j DROP 


iptables -I INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT 
iptables -P OUTPUT ACCEPT 
iptables -P INPUT DROP 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Игровой сервер открывается для ip-адреса игрока при успешной авторизации. После отключения от логин сервера правило удаляется, при этом благодаря правилу "ESTABLISHED,RELATED" игрок остается в игре, хотя по сути для него уже нет открытого порта. Т.е. если он захочет подключить спрут и дудосить со своего IP - новые подключения будут дропаться, при этом он будет находится в игре.

Изменено пользователем kickuass

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
8 минут назад, kickuass сказал:

Да там по сути пока ничего нет.


#!/bin/sh
iptables -F 
iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP 
iptables -A INPUT -p tcp ! --syn -m state --state NEW -j DROP 
iptables -A INPUT -p tcp --tcp-flags ALL ALL -j DROP 
iptables -A INPUT -i lo -j ACCEPT 
iptables -A INPUT -p tcp -m tcp --dport SSH -j ACCEPT 
iptables -A INPUT -p tcp -m tcp --dport 2106 -j ACCEPT
iptables -I INPUT -p tcp -s MY_IP --dport 3306 -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport 2106 -m connlimit --connlimit-above 2 -j DROP 
iptables -A INPUT -p tcp -m tcp --dport 7777 -m connlimit --connlimit-above 5 -j DROP 


iptables -I INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT 
iptables -P OUTPUT ACCEPT 
iptables -P INPUT DROP 

 

если применить 1е что вы написали  iptables -F то сервер заблокируетса  , или вы сразу все строки копируете и вставляете

 

Лично у меня очиста правил выглядит воттак 

iptables -F
iptables -X
iptables -t nat -F
iptables -t nat -X
iptables -t mangle -F
iptables -t mangle -X
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT

 

ещо интересно зачем вот ето у вас 

iptables -P OUTPUT ACCEPT 
Изменено пользователем M1SHA

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Только что, M1SHA сказал:

если применить 1е что вы написали  iptables -F то сервер заблокируетса  , или вы сразу все строки копируете и вставляете

 

Лично у меня очиста правил выглядит воттак 

iptables -F
iptables -X
iptables -t nat -F
iptables -t nat -X
iptables -t mangle -F
iptables -t mangle -X
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT

я выполняю .sh скрипт

У вас по сути нет правил, все службы которые работают и слушают интернет-трафик доступны для подключения и они  не как не фильтруются. Т.е. по сути если MySQL в my.cnf есть bind-adress=ип дедика, то любой может слать пакеты в неограниченном кол-ве.

Изменено пользователем kickuass

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
3 минуты назад, kickuass сказал:

я выполняю .sh скрипт

У вас по сути нет правил, все службы которые работают и слушают интернет-трафик доступны для подключения и они  не как не фильтруются. Т.е. по сути если MySQL в my.cnf есть bind-adress=ип дедика, то любой может слать пакеты в неограниченном кол-ве.

В каком плане у меня нет правил? я вам скинул как выглядит очистка а не мои правила , или я чтото нетак понял?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

те правила что я скинул оставляют открытым SSH и логин порт. При этом дропаются нулевые, XMAS и SYN пакеты без флагов. Так же ограничивает кол-во одновременных соединений для логина до 2-ух и для гейм-сервера до 5-ти.

Изменено пользователем kickuass

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
9 минут назад, kickuass сказал:

те правила что я скинул оставляют открытым SSH и логин порт. При этом дропаются нулевые, XMAS и SYN пакеты без флагов. Так же ограничивает кол-во одновременных соединений для логина до 2-ух и для гейм-сервера до 5-ти.

тоисть максимально человек сможет играть в 5 окон?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
18 минут назад, M1SHA сказал:

тоисть максимально человек сможет играть в 5 окон?

Да. А зачем больше?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
32 минуты назад, kickuass сказал:

Да. А зачем больше?

я всеголиш уточнил , хорошо для того чтоб зааставить играть людей в 2 окна)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

К вам что летом AMGALAN приходил со своими нубо ботами и ронял геймсервер что Дос гвард не смог спасти?

Эти правила совсем от школьников помогут типа AMGALANA(который летом нарисовался) только кто по 2106 порту или 7777 бьет ботами

более менее норм дос даже на 1гб забьет вамканал и Ipset Iptables уже не будет фильтровать

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
Авторизация  

  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу

×
×
  • Создать...