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

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

Тема в разделе 'PW Сервер', создана пользователем ТАМИОР, 6 июл 2011.

  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.740
    Лайки:
    479
    Пол:
    Мужской
    Репутация:
    1
    Команда:
    Freeman
    Нет. 443 это https . Он вообще серверу не нужен.

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

Поделиться этой страницей