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

Правила Iptables

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

468d75ec470dc67dfdde3ceb770d1028.jpg

#!/bin/bash 

# Очищаем правила 
/sbin/iptables -F 
/sbin/iptables -t nat -F 
/sbin/iptables -t mangle -F 

# Лимит на 30 запросов в секунду для интерфейса eth0 
/sbin/iptables --new-chain lim1 
/sbin/iptables --insert OUTPUT 1 -p tcp --destination-port 7777 -o eth0 --jump lim1 
/sbin/iptables --insert OUTPUT 1 -p tcp --destination-port 2106 -o eth0 --jump lim1 
/sbin/iptables --append lim1 -m limit --limit 30/sec --jump RETURN 
/sbin/iptables --append lim1 --jump DROP 

# Блокируем ICMP траффик 
/sbin/iptables -A INPUT  -p icmp -j DROP 

# Открываем порт логина 
/sbin/iptables -A INPUT -p tcp --dport 2106 -j ACCEPT 
/sbin/iptables -I INPUT -p tcp --syn --dport 2106 -j DROP -m connlimit --connlimit-above 10 
/sbin/iptables -A INPUT -p tcp -m state --state NEW --dport 2106 -m recent --update --seconds 2 -j DROP 
/sbin/iptables -A INPUT -p tcp -m state --state NEW --dport 2106 -m recent --set -j ACCEPT 

# Открываем порт гейма 
/sbin/iptables -A INPUT -p tcp --dport 7777 -j ACCEPT 
/sbin/iptables -I INPUT -p tcp --syn --dport 7777 -j DROP -m connlimit --connlimit-above 20 
/sbin/iptables -A INPUT -p tcp -m state --state NEW --dport 7777 -m recent --update --seconds 2 -j DROP 
/sbin/iptables -A INPUT -p tcp -m state --state NEW --dport 7777 -m recent --set -j ACCEPT 

# MySQL 
/sbin/iptables -I INPUT -p tcp -s ВАШ_IP --dport 3306 -j ACCEPT 
/sbin/iptables -I INPUT -p tcp -s IP_САЙТА --dport 3306 -j ACCEPT 
/sbin/iptables -A INPUT -p tcp --dport 3306 -j DROP 

# SSH (Рекомендую перенести с 22 порта) 
/sbin/iptables -A INPUT -p tcp --dport 22 -s ВАШ_IP -j ACCEPT 
/sbin/iptables -A INPUT -p tcp --dport 22 -j DROP 

# Все остальное дропим 
/sbin/iptables -A INPUT -i eth0 -p tcp -m tcp --tcp-flags FIN,SYN,ACK SYN -j REJECT --reject-with icmp-port-unreachable 
/sbin/iptables -A FORWARD -o eth0 -p tcp -j DROP

 

>> В идеале было бы переписать логин сервер, который после успешной авторизации будет открывать порт гейма. Так же связать его с ipset (ipset - "плагин" для iptables) <<

 

Также есть

защита для win систем.

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


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

Защита игрового и web сервера средствами iptables

ok-shield.png

После долгих тестов и чтения дополнительных манулов составил не большой гайд по защите игрового и web сервера средствами iptables.

Итак. Рассмотрим защиту игрового сервера на примерах ограничения портов и закрытия портов.

Для начала нужно разрешить то, что Вам нужно. К примеру нужно разрешить порты 22 (ssh) и 80 (http)

 

iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -p tcp --dport 80 -j ACCEPT

Далее нам нужно запретить все, что не разрешено.

 

iptables -P INPUT REJECT

Но разрешать 22 порт всем думаю не стоит. Поэтому надо его ограничить для определенного IP или маски.

 

iptables -A INPUT -p tcp -s IP --dport 22 -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j REJECT

Данное правило разрешит доступ на 22 порт только тому адресу, который Вы впишите. Всех остальных будет сбрасывать. Можно поставить вместо REJECT команду DROP. Но я пишу именно так, потому что на тестах команда DROP у меня выдавала сбой в работе защиты.

Так же можно запретить какому либо IP или маске подключаться к порту. Например, нужно запретить IP адресу 192.168.0.1 подключаться на порт 443:

 

iptables -A INPUT -p tcp -s 192.168.0.1 --dport 443 -j REJECT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT

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

Тоже самое можно сделать и с исходящими соединениями, но эту часть я ещё не разбирал. Если займусь, так же сделаю мини гайд. Надеюсь кому-нибудь будет полезно.

Все правила пишутся в файле rc.local перед строкой exit 0, который лежит в папке /etc/

Правила вступают в силу только после перезагрузки серверной машины или перезагрузки модуля iptables.

Огромное спасибо pilad'у и всем кто давал советы и мануалы.

Так же спасибо за помощь в тестировании Hecate, Quutamo и проекту PWPlay Online.

 

Защита web части.

Защищаем шлюз от проброса icmp туннеля.

Итак, рассмотрим защиту от проброса в 2 варианта.

Вариант 1: Фильтрация на основе размера пакета.

При пробрасывании icmp туннеля характерны нестандартные размеры пересылаемых icmp пакетов (echo-request), следовательно для защиты от туннеля можно фильтровать icmp трафик по длине пакета.

Ping по умолчанию посылает пакет с данными размером 56 байтов + 8 байтов icmp заголовок + 20 байтов ip заголовок, итого 84 байта.

 

iptables -A FORWARD -p icmp --icmp-type echo-request -m length --length 84 -j ACCEPT

Мы разрешили icmp пакет типа echo-request длинной 84 байта.

 

iptables -A FORWARD -p all -m state --state ESTABLISHED,RELATED -j ACCEPT

Пропускаем пакеты относящиеся к установленным соединениям.

Вариант 2: Фильтрация на основе номера последовательности.

При последовательной посылке icmp пакетов echo-request к хосту (ping), поле sequence number заголовка icmp пакета увеличиваться на 1 с каждым посланным пакетом.

 

iptables -A FORWARD -p icmp --icmp-type echo-request -m recent --name BLOCK --rcheck --seconds 240 -j DROP

Этой командой мы создадим таблицу для хранения ip адресов, которые будем блокировать, с интервалом обновления 240 секунд.

 

iptables -A FORWARD -p icmp --icmp-type echo-request -m string --algo kmp --from 27 --to 28 --hex-string "|0f|" -m recent --name BLOCK --set -j DROP

Проверяем вторую половину поля sequence number -from 27 --to 28, если оно равно 15 --hex-string "|0f|" , то добавляем в таблицу BLOCK для блокирования icmp пакетов с этого ip.

 

iptables -A FORWARD -p icmp --icmp-type echo-request -m string --algo kmp --from 26 --to 27 ! --hex-string "|00|" -m recent --name BLOCK --set -j DROP

Проверяем первую половину поля sequence number -from 26 --to 27 на отличное от нуля значения ! --hex-string "|00|" , если больше то добавляем в таблицу BLOCK для блокирования icmp пакетов с этого ip

 

iptables -A FORWARD -p icmp --icmp-type echo-request -j ACCEPT

Разрешаем icmp пакет типа echo-request.

 

iptables -A FORWARD -p all -m state --state ESTABLISHED,RELATED -j ACCEPT

Пропускаем пакеты относящиеся к установленным соединениям.

 

Защита порта 29000, 80 от сканирования.

Внимание: без некоторых дополнительных правил игровой порт станет не доступным для игроков или будет наблюдаться высокий пинг и разрывы!

Итак, что такое сканирование порта? Это отправка, как правило, одного пакета по протоколу tcp с флагом syn. Следовательно нам нужно запретить получать первый пакет и пропускать все остальные.

 

iptables -A INPUT -p tcp --dport 29000 -m state --state NEW -m hashlimit --hashlimit-name NAME1 --hashlimit-mode srcport --hashlimit-upto 1/m --hashlimit-burst 1 -j DROP
iptables -A INPUT -p tcp --dport 80 -m state --state NEW -m hashlimit --hashlimit-name NAME1 --hashlimit-mode srcport --hashlimit-upto 1/m --hashlimit-burst 1 -j DROP
iptables -A INPUT -p tcp --syn -m multiport --dports 29000,80 -j ACCEPT

Данная политика правил запретит первый пакет по протоколу tcp с флагом syn и пропустит все остальные. При сканировании сканер покажет Вам что порт закрыт. Данная политика подходит для порта 80 (проверено), для порта 29000 на свой страх и риск. Единственный минус: не значительно увеличится время соединения.

Значение -hashlimit-upto 1/m и --hashlimit-burst 1 может быть от 1 до 4, при увеличении значения задержка установки соединения будет пропорционально увеличиваться. То есть чем больше первых пакетов пропускается, тем дольше устанавливается соединение.

Так же данный метод может хорошо защитить от syn флуда (один из методов DDoS атаки).

Правила прописываются в файл rc.local по адресу /etc/, после написания правил следует перезагрузить iptables или саму серверную машину.

P.S. Дана только начальная точка, доработку и все прочее доделываете самостоятельно исходя из гайда.

Небольшая пакость для сканеров портов. Разработано не совсем мной, я просто лишь уменьшил все в два правила.

Собственно суть заключается в следующем. Весь трафик идущий не на 80 порт будет перенаправлен на 80 порт:

 

iptables -A PREROUTING -t nat -p tcp ! --dport 80 -j REDIRECT --to-port 80
iptables -A INPUT -p tcp --syn --dport 80 -m connlimit ! --connlimit-above 5 -j ACCEPT

--connlimit-above 5 - количество разрешенных подключений с одного IP адреса. Редактируете под себя.

Ну и в результате сканирования с набором таких правил сканер может Вам показать огромное количество открытых портов, на самом деле закрытых =)

P.S. Это не относится к серверной части Perfect World. Это только для Web-сервера.

 

Защищаем http proxy от пробрасывания http туннеля.

При пробрасывании http туннеля через http proxy, http заголовок пакета имеет маленький размер порядка 80-90 байт, тогда как стандартный заголовок (передаваемый браузером) в среднем равен от 350 байт. Основываясь на этом будем настраивать фильтрацию трафика.

 

Создаем новую цепочку правил LENGHT

 

iptables -N LENGTH

Проверяем длину пакета, если меньше 350 байт то блокируем

 

iptables -A LENGTH -p tcp --dport 3128 -m length --length :350 -j DROP

Если пакет больше 350 байт то пропускаем

 

iptables -A LENGTH -p tcp --dport 3128 -j ACCEPT

Разрешаем подключение на порт 3128

 

iptables -A INPUT -p tcp --syn --dport 3128 -j ACCEPT

В установленом соединении проверяем пакеты на запрос GET --hex-string "|47 45 54 20|" если есть такой пакет то направляем его в цепочку LENGTH для проверки длины пакета

 

iptables -A INPUT -p tcp --dport 3128 -m state --state ESTABLISHED -m string --algo kmp --hex-string "|47 45 54 20|" --from 52 --to 56 -j LENGTH

Автор мануала © ТАМИОР

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


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

Вот это хорошие правила! Юзаем=)

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


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

а я думал кому не спится в 5 утра :friends:

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


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

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

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

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

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

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

Войти

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

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

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

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

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