Вы используете устаревший браузер. Этот и другие сайты могут отображаться в нём некорректно. Вам необходимо обновить браузер или попробовать использовать другой.
Защита игрового сервера от очень многих программ (IPTables)
Да не, мне не надо, у меня фильтры прописаны. Фишка в том, что если в этом цыкле блокировать тот же флуд от UH ( не войс експлоит ), то сервер все равно лагает, а если без цыкла то все ок)
В целом у меня зафикшено, это я так к слову)
hashlimit прописан, там осталось только бан прописать по логам и все. Я имею ввиду, что когда в твою цепочку добавлял правила против UH то с войсом все норм, а с flood exploit серв зависал хоть и дропало пакеты
Хорошие правила для защиты от мощных атак типа DNS Amplification, или NTP Amplification.
Подредактируй правила ещё для TCP подключений на игровой порт. SYN-Метод для атаки слабомощного хоста по порту сервера/загруженного игроками сервера - убивает его в 0 автоматически. (Тики упадут до 2-1). Думаю, что нужно ставить ограничение на использование порта удаленными машинами. ~3 подключения в секунду, или больше, в зависимости от нагрузки TCP сокета игрового сервера.
Хорошие правила для защиты от мощных атак типа DNS Amplification, или NTP Amplification.
Подредактируй правила ещё для TCP подключений на игровой порт. SYN-Метод для атаки слабомощного хоста по порту сервера/загруженного игроками сервера - убивает его в 0 автоматически. (Тики упадут до 2-1). Думаю, что нужно ставить ограничение на использование порта удаленными машинами. ~3 подключения в секунду, или больше, в зависимости от нагрузки TCP сокета игрового сервера.
Защита для:
OC: Linux (iptables)
Игра: CS:S v34
Закрыты все порты, кроме TCP 22,27015,27016 и UDP 27015,27016
Блокирует ОЧЕНЬ много известных программ для CS:S v34.
Добрый день, форумчане. Очень долго тестировал свою защиту и даже обращался к ND для взлома. В результате защита показа себя очень отлично и я решил поделиться этим с вами.
Я надеюсь, что после моих правил вы защитите свои сервера. И надеюсь, что мои правила не будут интересны взломщикам для их обхода. Спасибо.
Защиту делал для своих серверов CS:S v34. И так.. приступим...
Правила можно подобрать под разные тикрейты сервера. Например у меня стоит 40 тик. Соответственно я ставил 50 пакетов до сброса в DROP. Почему на 10 больше? Потому что еще есть пакеты, когда игрок играет и обновляет статистику, заходит на сервер и т . д..
В этой теме я укажу под тикрейт 100 для одного игрока. Если нужно 2 игрока, то увеличиваете количество проходимых пакетов. Вы можете подстроить правила для себя.
Когда разбирал UDP и TCP трафик от различных программ, который приходит на сервер.. Я выявил некоторую закономерность. Теперь поподробнее о моих правилах:
БУДЬТЕ ОЧЕНЬ ВНИМАТЕЛЬНЫЕ К ПРАВИЛАМ. При неправильной настройке - Вы можете заблокировать себе доступ по SSH.
#Разрешаем соединения локальной сети
iptables -A INPUT -i lo -j ACCEPT
#Если количество пакетов не превышает 120 в секунду на порты 27015 и 27016, то перенаправляем в цепочку проверки пакета
iptables -A INPUT -p udp -m multiport --dports 27015,27016 -m hashlimit --hashlimit-upto 120/sec --hashlimit-burst 120 --hashlimit-mode srcip --hashlimit-name CSS -j Check_Packet
#Цепочка Check
#Проверка пакетов на длину. Не меньше 30 и не более 900
iptables -A Check_Packet -p udp -m length --length :30 -j DROP
iptables -A Check_Packet -p udp -m length --length 900: -j DROP
#Проверка первых 8 бит игрового пакета
iptables -A Check_Packet -p udp -m u32 --u32 "28&0xFF=0x00" -j ACCEPT
#Проверка первых 8 бит запроса на сервер
iptables -A Check_Packet -p udp -m string --hex-string "|ffffffff|" --algo kmp -j ACCEPT
#Для отладки и блокировки IP адресов. Если вы не разбираетесь, то можете удалить это правило.
#Логгирование битых пакетов. Здесь можно заблокировать доступ через Fail2Ban
iptables -A Check_Packet -p udp -m udp -j LOG --log-prefix "Invalid Packets: "
#Если не попало ни в одно из правил, то выкидываем пакет
iptables -A Check_Packet -p udp -m udp -j DROP
#Конец цепочки Check_Packet
#Если пакетов более 120 в секунду, то выбрасываем их
iptables -A INPUT -p udp -m udp -m multiport --dports 27015:27016 -j DROP
#Разрешаем себе любимому TCP подключение
iptables -A INPUT -s IP_Address/32 -p tcp -m multiport --dports 22,27015,27016 -j ACCEPT
#Разрешаем ранее установленные соединения
#Например... когда инициатор сам хост
iptables -A INPUT -m conntrack --ctstate ESTABLISHED -j ACCEPT
#По умолчанию входящие пакеты DROP'аются
iptables -P INPUT DROP
Я готов к критике и новым идеям. Буду очень рад за оставленные комментарии!
"В этой теме я укажу под тикрейт 100 для одного игрока. Если нужно 2 игрока, то увеличиваете количество проходимых пакетов." - вот это не понял.. обьясните что вы имеете введу.
"В этой теме я укажу под тикрейт 100 для одного игрока. Если нужно 2 игрока, то увеличиваете количество проходимых пакетов." - вот это не понял.. обьясните что вы имеете введу.
Это ограничение идёт по 1 ип адресу. Если у вас на сервере тикрейт 100, то нужно ставить кол-во проходимых пакетов чуть больше 100.
Если вы хотите, что бы 2 человека играло через 1 ип, то соответственно ставьте более 200+ пакетов. Т.к. каждый игрок с одним ИП адресом будет потреблять 100+ пакетов.
Если у вас все люди с разных ИП, то оставляйте 100+
Это ограничение идёт по 1 ип адресу. Если у вас на сервере тикрейт 100, то нужно ставить кол-во проходимых пакетов чуть больше 100.
Если вы хотите, что бы 2 человека играло через 1 ип, то соответственно ставьте более 200+ пакетов. Т.к. каждый игрок с одним ИП адресом будет потреблять 100+ пакетов.
Если у вас все люди с разных ИП, то оставляйте 100+
#Если количество пакетов не превышает 120 в секунду на порты 27015 и 27016, то перенаправляем в цепочку проверки пакета
iptables -A INPUT -p udp -m multiport --dports 27015,27016 -m hashlimit --hashlimit-upto 120/sec --hashlimit-burst 120 --hashlimit-mode srcip --hashlimit-name CSS -j Check_Packet
Я сча застрелюсь. Input для защиты от спама не оч использовать, т.к он не имеет цепочки raw.
Логичнее было бы сделать фильтрацию на прероутинге:
iptables -t raw -A PREROUTING -i eth0 -p udp -m limit --limit 1/s --limit-burst 1000 -j ACCEPT
Я сча застрелюсь. Input для защиты от спама не оч использовать, т.к он не имеет цепочки raw.
Логичнее было бы сделать фильтрацию на прероутинге:
iptables -t raw -A PREROUTING -i eth0 -p udp -m limit --limit 1/s --limit-burst 1000 -j ACCEPT
Я понял вас, но вы ограничиваете приток и отток только до конечной машины. Если я подам свыше 1к / сек, то все остальные пакеты других игроков будут отброшены. Так же здесь можно спамить игровым флудом, войс атакой и другими спамерами.
Вывод:
Не рекомендую такое ставить, будет больше проблем
Я сча застрелюсь. Input для защиты от спама не оч использовать, т.к он не имеет цепочки raw.
Логичнее было бы сделать фильтрацию на прероутинге:
iptables -t raw -A PREROUTING -i eth0 -p udp -m limit --limit 1/s --limit-burst 1000 -j ACCEPT
Дополнение:
Вы не понимаете смысл цепочки prerouting. Она нужна - чтобы была возможность перенаправлять пакеты. Вы экономите на прохождении одной цепочке и лишаетесь использовать netfilter на полную. Iptables работает на уровне ядра и уж быстрее него, скорее всего асики на маршрутизаторе, которые работают на аппаратном уровне. Так что бессмысленно ставить правила раньше
Я понял вас, но вы ограничиваете приток и отток только до конечной машины. Если я подам свыше 1к / сек, то все остальные пакеты других игроков будут отброшены. Так же здесь можно спамить игровым флудом, войс атакой и другими спамерами.
Вывод:
Не рекомендую такое ставить, будет больше проблем
1. Я написал, что лимиты надо указать свои.
2. raw prerouting - только на вход
Насчет спамеров - я свои правила использую на ксго, а там не так много сплоитов. Это правило их спокойно обрывает. Еще правило можно модифицировать и поставить 1к/сек на клиента (или меньше), что автоматически сломает любые спаммеры.
Использование INPUT значительно увеличивает нагрузку на проц, что не очень хорошо.
Также фильтрация на уровне прероутинга помогает защититься от всратой ддос атаки, если канал позволяет. От LDAP он конечно не защитит, но от остальных видов - вполне
1. Я написал, что лимиты надо указать свои.
2. raw prerouting - только на вход
Насчет спамеров - я свои правила использую на ксго, а там не так много сплоитов. Это правило их спокойно обрывает. Еще правило можно модифицировать и поставить 1к/сек на клиента (или меньше), что автоматически сломает любые спаммеры.
Использование INPUT значительно увеличивает нагрузку на проц, что не очень хорошо.
Также фильтрация на уровне прероутинга помогает защититься от всратой ддос атаки, если канал позволяет. От LDAP он конечно не защитит, но от остальных видов - вполне
Видно, что вы не очень разбираетесь в iptables. Я не буду с вами спорить. И напомню:
iptables работает очень быстро. Так как работает на уровне ядра. И делать акцент на нагрузку проца - я бы даже сказал некорректно. Она настолько мизерная, что это смешно.
Делайте свои выводы. Я не принуждаю устанавливать мои правила. Это все добровольно. Аргументы я привел
Сообщения автоматически склеены:
Дополнение: нагрузка в плане прохождения пакетов по цепочке, а не сама фильтрация
@WeSMan, Недавно навернулась вся сеть. Долго думал, почему. Дело в том, что были прописаны эти правила. Видимо обнова в iptables что то изменила. (больше Вангую, чем уверенно могу утверждать)
Правила я обнулил. Были вот такого вида:
Bash:
# Generated by iptables-save v1.8.7 on Wed Feb 3 11:50:26 2021
*nat
:PREROUTING ACCEPT [3121:272315]
:INPUT ACCEPT [2258:191439]
:OUTPUT ACCEPT [2012:136761]
:POSTROUTING ACCEPT [538:33150]
-A OUTPUT -d 195.82.146.120/30 -p tcp -m tcp --dport 80 -j DNAT --to-destination 163.172.167.207:3128
-A POSTROUTING -o ppp0 -j SNAT --to-source внешний ip
COMMIT
# Completed on Wed Feb 3 11:50:26 2021
# Generated by iptables-save v1.8.7 on Wed Feb 3 11:50:26 2021
*filter
:INPUT ACCEPT [30:1684]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [137:13885]
:Check_Packet - [0:0]
-A INPUT -p udp -m multiport --dports 27015,27016 -m hashlimit --hashlimit-upto 88/sec --hashlimit-burst 88 --hashlimit-mode srcip --hashlimit-name CSS -j Check_Packet
-A INPUT -p udp -m multiport --dports 27015:27016 -j DROP
-A INPUT -s 31.214.160.243/32 -j REJECT --reject-with icmp-port-unreachable
-A INPUT -s 52.113.225.76/32 -j REJECT --reject-with icmp-port-unreachable
-A INPUT -s 52.112.97.212/32 -j REJECT --reject-with icmp-port-unreachable
-A INPUT -s 51.83.217.86/32 -j REJECT --reject-with icmp-port-unreachable
-A Check_Packet -p udp -m length --length 0:30 -j DROP
-A Check_Packet -p udp -m length --length 900:65535 -j DROP
-A Check_Packet -p udp -m u32 --u32 "0x1c&0xff=0x0" -j ACCEPT
-A Check_Packet -p udp -m string --hex-string "|ffffffff|" --algo kmp --to 65535 -j ACCEPT
-A Check_Packet -p udp -j DROP
COMMIT
# Completed on Wed Feb 3 11:50:26 2021
От всего осталось лишь более-менее рабочее:
Bash:
# Generated by iptables-save v1.8.4 on Fri May 8 22:27:04 2020
*nat
:PREROUTING ACCEPT [3121:272315]
:INPUT ACCEPT [2258:191439]
:OUTPUT ACCEPT [2012:136761]
:POSTROUTING ACCEPT [538:33150]
-A POSTROUTING -o ppp0 -j SNAT --to-source внешний ip
-A OUTPUT -d 195.82.146.120/30 -p tcp -m tcp --dport 80 -j DNAT --to-destination 163.172.167.207:3128
COMMIT
# Completed on Fri May 8 22:27:04 2020
Теперь хочу настроить заново. Ввожу и получаю
Bash:
# iptables -A INPUT -p udp -m multiport --dports 27015,27016 -m hashlimit --hashlimit-upto 120/sec --hashlimit-burst 120 --hashlimit-mode srcip --hashlimit-name CSS -j Check_Packet
iptables v1.8.7 (legacy): Couldn't load target `Check_Packet':No such file or directory
Try `iptables -h' or 'iptables --help' for more information.
Если старьё впихивать в iptables.rules сеть естественно мертва. А локалка стартует, если выдернуть кабель с выходом в интернет. Вот эту бяку Couldn't load target `Check_Packet':No such file or directory нагуглить не выходит. Либо я делаю что то не так.
@WeSMan, Недавно навернулась вся сеть. Долго думал, почему. Дело в том, что были прописаны эти правила. Видимо обнова в iptables что то изменила. (больше Вангую, чем уверенно могу утверждать)
Правила я обнулил. Были вот такого вида:
Bash:
# Generated by iptables-save v1.8.7 on Wed Feb 3 11:50:26 2021
*nat
:PREROUTING ACCEPT [3121:272315]
:INPUT ACCEPT [2258:191439]
:OUTPUT ACCEPT [2012:136761]
:POSTROUTING ACCEPT [538:33150]
-A OUTPUT -d 195.82.146.120/30 -p tcp -m tcp --dport 80 -j DNAT --to-destination 163.172.167.207:3128
-A POSTROUTING -o ppp0 -j SNAT --to-source внешний ip
COMMIT
# Completed on Wed Feb 3 11:50:26 2021
# Generated by iptables-save v1.8.7 on Wed Feb 3 11:50:26 2021
*filter
:INPUT ACCEPT [30:1684]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [137:13885]
:Check_Packet - [0:0]
-A INPUT -p udp -m multiport --dports 27015,27016 -m hashlimit --hashlimit-upto 88/sec --hashlimit-burst 88 --hashlimit-mode srcip --hashlimit-name CSS -j Check_Packet
-A INPUT -p udp -m multiport --dports 27015:27016 -j DROP
-A INPUT -s 31.214.160.243/32 -j REJECT --reject-with icmp-port-unreachable
-A INPUT -s 52.113.225.76/32 -j REJECT --reject-with icmp-port-unreachable
-A INPUT -s 52.112.97.212/32 -j REJECT --reject-with icmp-port-unreachable
-A INPUT -s 51.83.217.86/32 -j REJECT --reject-with icmp-port-unreachable
-A Check_Packet -p udp -m length --length 0:30 -j DROP
-A Check_Packet -p udp -m length --length 900:65535 -j DROP
-A Check_Packet -p udp -m u32 --u32 "0x1c&0xff=0x0" -j ACCEPT
-A Check_Packet -p udp -m string --hex-string "|ffffffff|" --algo kmp --to 65535 -j ACCEPT
-A Check_Packet -p udp -j DROP
COMMIT
# Completed on Wed Feb 3 11:50:26 2021
От всего осталось лишь более-менее рабочее:
Bash:
# Generated by iptables-save v1.8.4 on Fri May 8 22:27:04 2020
*nat
:PREROUTING ACCEPT [3121:272315]
:INPUT ACCEPT [2258:191439]
:OUTPUT ACCEPT [2012:136761]
:POSTROUTING ACCEPT [538:33150]
-A POSTROUTING -o ppp0 -j SNAT --to-source внешний ip
-A OUTPUT -d 195.82.146.120/30 -p tcp -m tcp --dport 80 -j DNAT --to-destination 163.172.167.207:3128
COMMIT
# Completed on Fri May 8 22:27:04 2020
Теперь хочу настроить заново. Ввожу и получаю
Bash:
# iptables -A INPUT -p udp -m multiport --dports 27015,27016 -m hashlimit --hashlimit-upto 120/sec --hashlimit-burst 120 --hashlimit-mode srcip --hashlimit-name CSS -j Check_Packet
iptables v1.8.7 (legacy): Couldn't load target `Check_Packet':No such file or directory
Try `iptables -h' or 'iptables --help' for more information.
Если старьё впихивать в iptables.rules сеть естественно мертва. А локалка стартует, если выдернуть кабель с выходом в интернет. Вот эту бяку Couldn't load target `Check_Packet':No such file or directory нагуглить не выходит. Либо я делаю что то не так.
1 Вариант (ограничение доступа только с конкретного ипшника [поменяйте на который нужен])
sudo iptables -I INPUT -p tcp -s 127.0.0.1 --dport 20000:30000 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 20000:30000 -j DROP
2 Вариант (Ограничение на кол-во подключений с одного ипшника) - не будет актуально если эксплойт допишут и будет работать с разных прокси
iptables -A INPUT -p tcp -m multiport --dports 20000:30000 conntrack --ctstate NEW -m limit --limit 10/s --limit-burst 6 -j ACCEPT
iptables -A INPUT -p tcp -m multiport --dports 20000:30000 conntrack --ctstate NEW -j DROP
3 Вариант самый адекватный (это патчинг серверного движка и фикс эксплойта)
Делайте уже сами
1 Вариант (ограничение доступа только с конкретного ипшника [поменяйте на который нужен])
sudo iptables -I INPUT -p tcp -s 127.0.0.1 --dport 20000:30000 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 20000:30000 -j DROP
2 Вариант (Ограничение на кол-во подключений с одного ипшника) - не будет актуально если эксплойт допишут и будет работать с разных прокси
iptables -A INPUT -p tcp -m multiport --dports 20000:30000 conntrack --ctstate NEW -m limit --limit 10/s --limit-burst 6 -j ACCEPT
iptables -A INPUT -p tcp -m multiport --dports 20000:30000 conntrack --ctstate NEW -j DROP
3 Вариант самый адекватный (это патчинг серверного движка и фикс эксплойта)
Делайте уже сами
Начнем к критике, защитой это не назвать от слова совсем. Максимально чего можно добиться это фильтрации трафика, но это делается отдельным оборудованием или серверами, зачастую вашей денежкой в сторону провайдера или поставщика услуг для полноценной защиты L4-L7, но это может не гарантировать 100% аплайм и отсутствие проблем.
Блокирует ОЧЕНЬ много известных программ для CS:S v34.
Добрый день, форумчане. Очень долго тестировал свою защиту и даже обращался к ND для взлома. В результате защита показа себя очень отлично и я решил поделиться этим с вами.
Я надеюсь, что после моих правил вы защитите свои сервера. И надеюсь, что мои правила не будут интересны взломщикам для их обхода. Спасибо.
Защиту делал для своих серверов CS:S v34. И так.. приступим...
Правила можно подобрать под разные тикрейты сервера. Например у меня стоит 40 тик. Соответственно я ставил 50 пакетов до сброса в DROP. Почему на 10 больше? Потому что еще есть пакеты, когда игрок играет и обновляет статистику, заходит на сервер и т . д..
В этой теме я укажу под тикрейт 100 для одного игрока. Если нужно 2 игрока, то увеличиваете количество проходимых пакетов. Вы можете подстроить правила для себя.
Когда разбирал UDP и TCP трафик от различных программ, который приходит на сервер.. Я выявил некоторую закономерность. Теперь поподробнее о моих правилах:
Стало интересны ваши вычисления пакетов, какими программами вы пользовались, и долго ли ждали результатов? Моя статистика по подключениям и пакетам за час при онлайн около 500-1000 в сутки, с учатом того что у меня cisco 9000 и не один физический сервер.
(Статистика из cisco + zabbix за час!)
Подключения: 145 тысяч
Редиректы: 292 тысячи
Отклоненные запросы: 30 тысяч
Запросы в фильтре: 2310
RTT: 0.2 ms
RTTsd: 0.5 ms
Общие потери покетов: 1 из 1000
ОЗУ: 24 Гб из 32 гб
Процессор: 35% из 100%
Так вот интересно, мне как высчитывать ваше значение "hashlimit --hashlimit-upto 120/sec --hashlimit-burst 120 --hashlimit-mode" которое только сожрет все данные игроков...