1. 游客, мы просим Вас ознакомиться с Правилами Форума и Отказом от ответственности!

[Мини-гайд] Защита сервера средствами iptables

本贴由 ТАМИОР2011-07-06 发布. 版块名称: PW Сервер

  1. TopicStarter Overlay

    ТАМИОР ... Пользователи

    帖子:
    125
    支持:
    52
    性别:
    Репутация:
    0
    После долгих тестов и чтения дополнительных манулов составил защиту для сервера.
    В целом спасибо pilad'у за мануал и небольшое разъяснение.
    Итак.
    Для начала нужно разрешить то, что Вам нужно. К примеру нужно разрешить порты 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/
    Правила вступают в силу только после перезагрузки серверной машины или перезагрузки apache2 и iptables.

    Еще раз огромное спасибо pilad'у и всем кто давал советы.
    Так же спасибо за помощь в тестировании Hecate, Quutamo и проекту PWPlay Online.
    © ТАМИОР
    已获得20人支持.
  2. nom1nal Moderator Команда форума Модератор Программист Пользователи

    帖子:
    356
    支持:
    117
    性别:
    Репутация:
    0
    По данному гайду можно и свою защиту придумать, тоже средствами iptables но уже по другому принцыпу
  3. TopicStarter Overlay

    ТАМИОР ... Пользователи

    帖子:
    125
    支持:
    52
    性别:
    Репутация:
    0
    Этот гайд составлялся только как пример. Сами правила и их постановку уже будут продумывать юзвери. Я только лишь разобрал саму суть и показал пару примеров.
    已获得4人支持.
  4. maksimillian Define!!!11 Пользователи

    帖子:
    88
    支持:
    25
    性别:
    Репутация:
    0
    Команда:
    Diamond
    ну уже кое-что. по=крайней мере начало положено :)
  5. TopicStarter Overlay

    ТАМИОР ... Пользователи

    帖子:
    125
    支持:
    52
    性别:
    Репутация:
    0
    Начало только по входящим, в плане еще отсечение флуда по tcp\udp протоколам, отсечение DDoS атак методом скоростного коннекта, и разбор по исходящим соединениям =) Если смогу что-то дельное наработать, выложу.
    已获得5人支持.
  6. MegaPW Пользователи

    帖子:
    0
    支持:
    0
    Репутация:
    0
    Какой командой ограничить конекты к порту
    Допустим сделать 200 подключений к порту 29000 в течении 1 минуты
  7. TopicStarter Overlay

    ТАМИОР ... Пользователи

    帖子:
    125
    支持:
    52
    性别:
    Репутация:
    0
    代码:
    iptables -A INPUT -i eth0 -p tcp --dport 29000 -m state --state NEW -m recent --set --name pw
    iptables -A INPUT -i eth0 -p tcp --dport 29000 -m state --state NEW -m recent --update --seconds 30 --hitcount 3 --rttl --name pw -j DROP
    --set --name pw - это имя правила.
    --seconds 30 - время, на которое сервер банит пользователя.
    --hitcount 3 - количество коннектов в секунду, при превышении которого будет бан.
    Как прописать количество коннектов в минуту, прости, не знаю.
    已获得6人支持.
  8. TopicStarter Overlay

    ТАМИОР ... Пользователи

    帖子:
    125
    支持:
    52
    性别:
    Репутация:
    0
    upd:
    Процедура -p tcp означает по какому протоколу производится проверка.
    Для протокола UDP будет выглядеть так -p udp, если нужны ограничения на оба протокола, то нужно написать два правила (как подумали бы многие). Достаточно просто не указывать протокол проверки:

    代码:
    iptables -A INPUT -s IP --dport №№ -j ACCEPT
    iptables -A INPUT --dport №№ -j REJECT
    已获得Hidden, Dion, Tolstes2012另外2人的支持.
  9. TopicStarter Overlay

    ТАМИОР ... Пользователи

    帖子:
    125
    支持:
    52
    性别:
    Репутация:
    0
    upd:
    Защита порта 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. Дана только начальная точка, доработку и все прочее доделываете самостоятельно исходя из гайда.

    © ТАМИОР
    已获得6人支持.
  10. TopicStarter Overlay

    ТАМИОР ... Пользователи

    帖子:
    125
    支持:
    52
    性别:
    Репутация:
    0
    upd:
    Небольшая пакость для сканеров портов. Разработано не совсем мной, я просто лишь уменьшил все в два правила.
    Собственно суть заключается в следующем. Весь трафик идущий не на 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
    iptables -P INPUT DROP
    iptables -P INPUT DROP - ставите либо после либо перед правилами, у каждого сервера почему-то по разному работает.
    --connlimit-above 5 - количество разрешенных подключений с одного IP адреса. Редактируете под себя.

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

    P.S. Это не относится к серверной части Perfect World. Это только для Web-сервера.
    P.P.S. Выложил в эту тему, так как веду полный разбор защиты средствами iptables.
    已获得7人支持.
  11. TopicStarter Overlay

    ТАМИОР ... Пользователи

    帖子:
    125
    支持:
    52
    性别:
    Репутация:
    0
    upd:
    Защищаем шлюз от проброса 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
    Пропускаем пакеты относящиеся к установленным соединениям.

    © ТАМИОР
    已获得8人支持.
  12. TopicStarter Overlay

    ТАМИОР ... Пользователи

    帖子:
    125
    支持:
    52
    性别:
    Репутация:
    0
    upd:
    Защищаем 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

    代码:
    iptables -A INPUT -p all -m state --state ESTABLISHED,RELATED -j ACCEPT
    iptables -A OUTPUT -p all -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
    已获得3人支持.
  13. Dion Пользователи

    帖子:
    5
    支持:
    2
    性别:
    Репутация:
    0
    Команда:
    Frost
    Ура даёш продолжение гайда :unsure:
  14. keks23 Заблокированные

    帖子:
    68
    支持:
    3
    性别:
    Репутация:
    0
    Команда:
    GG
    Кто-нибудь проверял пашет?
  15. TopicStarter Overlay

    ТАМИОР ... Пользователи

    帖子:
    125
    支持:
    52
    性别:
    Репутация:
    0
    Наверное я не стал бы выкладывать то, что не будет работать. И попрошу других, с такими дибильными вопросами пойти в леса мимо темы.
    При прямых руках и нормально работающем мозге, все будет работать.
    И вот еще добавлю, у кого какие пожелания\замечания по поводу защиты, пишите мне в ЛС. Буду дорабатывать\разрабатывать.
    1 человеку нравится это.
  16. Dion Пользователи

    帖子:
    5
    支持:
    2
    性别:
    Репутация:
    0
    Команда:
    Frost
    Жедаю как можно скрыть phpmyadmin от внешних глаз спомощю ipitables, а не апачи(прост вообще несеку внём)
  17. TopicStarter Overlay

    ТАМИОР ... Пользователи

    帖子:
    125
    支持:
    52
    性别:
    Репутация:
    0
    代码:
    iptables -A INPUT -p tcp -s IP --dport 443 -j ACCEPT
    iptables -A INPUT --dport 443 -j DROP
    Вместо IP пишешь свой IP адрес
    Вместо команды DROP можно написать REJECT (DROP не у всех почему то работает)
    Такой командой Вы привяжете порт к своему айпи адресу, то есть любые другие адреса будут отсекаться.
    已获得2人支持.
  18. Dion Пользователи

    帖子:
    5
    支持:
    2
    性别:
    Репутация:
    0
    Команда:
    Frost
    Пасибо тебе=) Оказываеться это было у меня ток там я айпи локальный вбил и думал не пашет хДД
  19. keks23 Заблокированные

    帖子:
    68
    支持:
    3
    性别:
    Репутация:
    0
    Команда:
    GG
    На сколько я понел 443 порт это phpmyadmin :D ?
  20. pilad Команда форума Модератор Пользователи

    帖子:
    1,741
    支持:
    482
    性别:
    Репутация:
    1
    Команда:
    Freeman
    Нет. 443 это https . Он вообще серверу не нужен.

    phpmyadmin работает под апачем. То есть порт будет 80
Черновик сохранён Черновик удалён

分享此页面