09-25-2011, 05:57 PM
После долгих тестов и чтения дополнительных манулов составил не большой гайд по защите игрового и web сервера средствами iptables.
Итак. Рассмотрим защиту игрового сервера на примерах ограничения портов и закрытия портов.
Для начала нужно разрешить то, что Вам нужно. К примеру нужно разрешить порты 22 (ssh) и 80 (http)
Далее нам нужно запретить все, что не разрешено.
Но разрешать 22 порт всем думаю не стоит. Поэтому надо его ограничить для определенного IP или маски.
Данное правило разрешит доступ на 22 порт только тому адресу, который Вы впишите. Всех остальных будет сбрасывать. Можно поставить вместо REJECT команду DROP. Но я пишу именно так, потому что на тестах команда DROP у меня выдавала сбой в работе защиты.
Так же можно запретить какому либо IP или маске подключаться к порту. Например, нужно запретить IP адресу 192.168.0.1 подключаться на порт 443:
Следует запомнить важную деталь. Все правила читаются сверху вниз! И команду "закрыть все" надо вписывать всегда последней, в противном случае защита не гарантирует стабильность.
Тоже самое можно сделать и с исходящими соединениями, но эту часть я ещё не разбирал. Если займусь, так же сделаю мини гайд. Надеюсь кому-нибудь будет полезно.
Все правила пишутся в файле 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 байта.
Мы разрешили icmp пакет типа echo-request длинной 84 байта.
Пропускаем пакеты относящиеся к установленным соединениям.
Вариант 2: Фильтрация на основе номера последовательности.
При последовательной посылке icmp пакетов echo-request к хосту (ping), поле sequence number заголовка icmp пакета увеличиваться на 1 с каждым посланным пакетом.
Этой командой мы создадим таблицу для хранения ip адресов, которые будем блокировать, с интервалом обновления 240 секунд.
Проверяем вторую половину поля sequence number -from 27 --to 28, если оно равно 15 --hex-string "|0f|" , то добавляем в таблицу BLOCK для блокирования icmp пакетов с этого ip.
Проверяем первую половину поля sequence number -from 26 --to 27 на отличное от нуля значения ! --hex-string "|00|" , если больше то добавляем в таблицу BLOCK для блокирования icmp пакетов с этого ip
Разрешаем icmp пакет типа echo-request.
Пропускаем пакеты относящиеся к установленным соединениям.
Защита порта 29000, 80 от сканирования.
Внимание: без некоторых дополнительных правил игровой порт станет не доступным для игроков или будет наблюдаться высокий пинг и разрывы!
Итак, что такое сканирование порта? Это отправка, как правило, одного пакета по протоколу tcp с флагом syn. Следовательно нам нужно запретить получать первый пакет и пропускать все остальные.
Данная политика правил запретит первый пакет по протоколу tcp с флагом syn и пропустит все остальные. При сканировании сканер покажет Вам что порт закрыт. Данная политика подходит для порта 80 (проверено), для порта 29000 на свой страх и риск. Единственный минус: не значительно увеличится время соединения.
Значение -hashlimit-upto 1/m и --hashlimit-burst 1 может быть от 1 до 4, при увеличении значения задержка установки соединения будет пропорционально увеличиваться. То есть чем больше первых пакетов пропускается, тем дольше устанавливается соединение.
Так же данный метод может хорошо защитить от syn флуда (один из методов DDoS атаки).
Правила прописываются в файл rc.local по адресу /etc/, после написания правил следует перезагрузить iptables или саму серверную машину.
P.S. Дана только начальная точка, доработку и все прочее доделываете самостоятельно исходя из гайда.
Небольшая пакость для сканеров портов. Разработано не совсем мной, я просто лишь уменьшил все в два правила.
Собственно суть заключается в следующем. Весь трафик идущий не на 80 порт будет перенаправлен на 80 порт:
--connlimit-above 5 - количество разрешенных подключений с одного IP адреса. Редактируете под себя.
Ну и в результате сканирования с набором таких правил сканер может Вам показать огромное количество открытых портов, на самом деле закрытых =)
P.S. Это не относится к серверной части Perfect World. Это только для Web-сервера.
Защищаем http proxy от пробрасывания http туннеля.
При пробрасывании http туннеля через http proxy, http заголовок пакета имеет маленький размер порядка 80-90 байт, тогда как стандартный заголовок (передаваемый браузером) в среднем равен от 350 байт. Основываясь на этом будем настраивать фильтрацию трафика.
Создаем новую цепочку правил LENGHT
Проверяем длину пакета, если меньше 350 байт то блокируем
Если пакет больше 350 байт то пропускаем
Разрешаем подключение на порт 3128
В установленом соединении проверяем пакеты на запрос GET --hex-string "|47 45 54 20|" если есть такой пакет то направляем его в цепочку LENGTH для проверки длины пакета
© ТАМИОР
Итак. Рассмотрим защиту игрового сервера на примерах ограничения портов и закрытия портов.
Для начала нужно разрешить то, что Вам нужно. К примеру нужно разрешить порты 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
Код:
iptables -A INPUT -p tcp -s IP --dport 22 -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j REJECT
Так же можно запретить какому либо 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
Код:
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
Код:
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
Код:
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
Код:
iptables -A FORWARD -p icmp --icmp-type echo-request -j ACCEPT
Код:
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
Значение -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
Ну и в результате сканирования с набором таких правил сканер может Вам показать огромное количество открытых портов, на самом деле закрытых =)
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
© ТАМИОР