Авторские статьи Advanced Features of netfilter/iptables

Discussion in 'Статьи' started by ShadOS, 20 Sep 2007.

  1. ShadOS

    ShadOS ы

    Joined:
    11 Feb 2007
    Messages:
    667
    Likes Received:
    351
    Reputations:
    413
    Ещё одна старенькая статья от меня для потомков.

    --[ Расширенные возможности iptables ]--

    Вольный перевод статьи "Advanced Features of netfilter/iptables" by Barry O'Donovan с конструктивными замечаниями и дополнениями by ShadOS


    /* Вступление */

    В последнее время в ядре Linux появилась куча новых модулей iptables. О многих Вы, наверное, слышали, некоторые, возможно, уже используете, но Вы даже представить себе не можете, насколько легче становится жизнь системного администратора и сколько действительно интересных и полезных возможностей обеспечивают эти модули.
    Все, рассматриваемые в статье дополнения являются расширениями пакетного фильтра iptables. Некоторые из модулей, представленных в этой статье (помечены звездочкой) еще не присутствуют в обычных ядрах, но Вы можете поставить пакет "patch-o-matic", который добавит эти модули в любое ядро. О том, как поставить пакет Patch-o-Matic, можно прочитать в статье Forb'а из бумажной версии Хакера 09(69) за сентябрь 2004. Кроме того, часть модулей уже была описана там же, но я надеюсь, что эта статья не потеряет своего значения от этого.

    В этой части будут рассмотрены следующие возможности:
    1. Определение нескольких портов в одном правиле
    2. Сбалансированная загрузка
    3. Ограничение числа подключений.
    4. Расширения сравнения и фильтрации по списку недавних подключений
    5. Фильтрация по строке в полезных данных пакета
    6. Правила, действующие по расписанию
    7. Установка квот трафика
    8. Фильтрация по значениям TTL

    1. Определение нескольких портов в одном правиле при помощи multiport модуля.Расширение multiport позволяет определить несколько разных портов в одном правиле. Это дает возможность использовать меньше правил и упрощает редактирование и контроль файла конфигурации iptables, а также поиск правил в нем. Например, если мы хотим разрешить полный доступ к SMTP, HTTP, HTTPS и SSH сервисам на нашем сервере, Мы, скорее всего сделали бы так:

    -A INPUT -i eth0 -p tcp -m state --state NEW --dport ssh -j ACCEPT
    -A INPUT -i eth0 -p tcp -m state --state NEW --dport smtp -j ACCEPT
    -A INPUT -i eth0 -p tcp -m state --state NEW --dport http -j ACCEPT
    -A INPUT -i eth0 -p tcp -m state --state NEW --dport https -j ACCEPT

    Используя модуль multiport модуль, можно сократить запись и написать, например, так:

    -A INPUT -i eth0 -p tcp -m state --state NEW -m multiport --dports ssh,smtp,http,https -j ACCEPT

    Это должно использоваться или вместе с опцией -p tcp или -p udp, причем только 15 портов может быть определенно единовременно в одном правиле. Такие вот ограничения =( Также поддерживаются варианты записи вида:

    --sports port[,port,port...]
    matches source port(s)
    --dports port[,port,port...]
    matches destination port(s)
    --ports port[,port,port...]
    matches both source and destination port(s)

    mport* - другое подобное расширение, которое еще и позволяет вам определять диапазоны портов, например - dport 22,80,6000:6100.
    Все просто и ясно.
    2. Сбалансированная загрузка c использованием random* или nth*
    Как расширение random, так и nth могут быть использовано для сбалансированной загрузки. Например, если Вы желаете сбалансировать весь входящий web-трафик между четырьмя зеркалами Вашего сайта, Вы можете добавить любой из следующих наборов правил:
    A PREROUTING -i eth0 -p tcp --dport 80 -m state --state NEW -m nth --counter 0 --every 4 --packet 0 \
    -j DNAT --to-destination 192.168.0.5:80
    -A PREROUTING -i eth0 -p tcp --dport 80 -m state --state NEW -m nth --counter 0 --every 4 --packet 1 \
    -j DNAT --to-destination 192.168.0.6:80
    -A PREROUTING -i eth0 -p tcp --dport 80 -m state --state NEW -m nth --counter 0 --every 4 --packet 2 \
    -j DNAT --to-destination 192.168.0.7:80
    -A PREROUTING -i eth0 -p tcp --dport 80 -m state --state NEW -m nth --counter 0 --every 4 --packet 3 \
    -j DNAT --to-destination 192.168.0.8:80

    или:

    -A PREROUTING -i eth0 -p tcp --dport 80 -m state --state NEW -m random --average 25 \
    -j DNAT --to-destination 192.168.0.5:80
    -A PREROUTING -i eth0 -p tcp --dport 80 -m state --state NEW -m random --average 25 \
    -j DNAT --to-destination 192.168.0.6:80
    -A PREROUTING -i eth0 -p tcp --dport 80 -m state --state NEW -m random --average 25 \
    -j DNAT --to-destination 192.168.0.7:80
    -A PREROUTING -i eth0 -p tcp --dport 80 -m state --state NEW \
    -j DNAT --to-destination 192.168.0.8:80

    Расширение фильтрации nth позволяет создать до 16ти (0..15) счетчиков для одной машины, по которым будет производиться счет пришедшего пакета. В приведенном выше примере используется счетчик 0 для каждого четвертого пакета. Как только получен 4й пакет, счетчик устанавливается в 0. Первое правило применяется для первого по счету пакета номер 4 (т.е четвертый из четырех подряд идущих пакетов, равнозначно четвертый по общему счету количества пакетов, пришедших на данный порт) (--every 4 --packet 0), второе правило - для второго по счету пакета номер 4 из четырех (--every 4 --packet 1) ,т.е восьмой полученный пакет по счету и так далее.

    Расширение random предоставляет возможность фильтровать пакеты с заданной частотой. Так в примере правила random перенаправляют около 25% (--average 25) соединений на 80й порт к зеркалу Вашего web-сервера. 75% подключений не удовлетворяют этому правилу и 25% из них будут перенаправлены вторым правилом, еще 25% следующим, и оставшиеся 25% соответственно последним.

    Другим применением фильтрации по random может быть эмуляция перегрузки системных ресурсов.

    3. Ограничение числа подключений, используя limit и iplimit*.
    Расширение фильтрации limit может быть использовано, чтобы ограничить число подключений за определенный промежуток времени, в то время как iplimit может ограничивать число параллельных TCP соединений от определенного порта или сети. Эти возможности могут быть использованы для разных целей:
    чтобы защищаться от DOS атак (отказ в обслуживании) или нападения типа HTTP-flood, не доставляя неудобств вашим клиентам и пользователям;
    предотвращать bruteforce атаки (перебор паролей);
    ограничивать использование Internet сотрудников в течение рабочего дня;

    Рассмотрим пример, в котором ты вредный админ, и шеф дал тебе указание запретить бездельникам из офиса сидеть в Интернете целый день и пинать пингвинов. Можем использовать правило:

    -A FORWARD -m state --state NEW -p tcp -m multiport --dport http,https -o eth0 -i eth1 \
    -m limit --limit 50/hour --limit-burst 5 -j ACCEPT

    Это правило предполагает, что мы действуем как прокси-сервер, где внешнее подключение идет через интерфейс eth0, а eth1 соединен с нашей офисной сетью. Правило ограничивает все наши внутренние компьютеры только 50 новыми подключениями по HTTP и HTTPS, а использование limit-burst предотвращает израсходование лимита в 50 соединений одним единственным офисным жлобом. Ограничение также можно ставить с параметрами /day, /hour, /minute.
    Параметр limit-burst может показаться сначала слегка запутанным. В вышеупомянутом примере он гарантирует, что, если все служащие будут лезть в Internet в течение часа, то только 5 подключений будут происходить каждые 5 минут. Если истекут 30 минут на протяжении которых не будет происходить подключений, а затем в оставшиеся 30 минут пользователи начнут обращаться к проксе, то 5 подключений будут разрешаться каждые 2.5 минут. Иногда это объясняют еще подобным образом :Для каждого правила limit, есть "область памяти", содержащая "маркеры". Всякий раз, когда срабатывает правило, маркер убирается, и когда количество маркеров достигает нуля, правило больше не существует.

    --limit это область памяти;
    --limit-bursts - размер области памяти (количество маркеров).

    Расширение iplimit позволяет нам ограничивать число параллельных подключений по TCP протоколу от определенного хоста или сети. Если, например, мы хотим ограничить число подключений по HTTP от определенного IP-адреса пятью параллельными соединениями, можно сделать так:

    -A INPUT -p tcp -m state --state NEW --dport http -m iplimit --iplimit-above 5 -j DROP.


    4. Расширения сравнения и фильтрации по списку недавних подключений
    Используя подобное расширение, можно, как и следовало ожидать, создавать динамические списки фильтрации IP-адресов на основе неких заданных условий и применять к ним соответствующие правила. Выражаясь более просто это расширение дает чрезвычайно удобный инструмент для создания пассивной IDS, которая способна, к примеру, перекрывать доступ к некоторому порту, к которому за определенный промежуток времени обращались более n раз. Пусть некий bad boy сканирует диапазон IP адресов, натыкается на нашу машину, и его сканнер портов несколько раз обращается к ней в поисках открытого 139 порта. Прекратить творящееся безобразие можно используя расширение сравнения по списку недавних подключений:

    -A FORWARD -m recent --name portscan --rcheck --seconds 300 -j DROP
    -A FORWARD -p tcp -i eth0 --dport 139 -m recent --name portscan --set -j DROP

    Теперь все пакеты фильтруются в течение 300 секунд. Поддерживаются также такие варианты задания этого правила:

    --name name

    Имя списка, чтобы хранить в нем IP адреса или сравнивать их. Если не задано имя, используется значение по умолчанию с именем DEFAULT.

    --set

    Это добавит исходный адрес пакета в список. Если исходный адрес уже находится в списке, это обновит существующее вхождение.

    --rcheck

    Проверить, находится ли исходный адрес пакета в настоящее время в списке.

    --update

    Проверить, находится ли исходный адрес пакета в настоящее время в списке. Если да, то вхождение будет обновлено, и правило возвратит истину.

    --remove
    Проверит, находится ли исходный адрес пакета в настоящее время в списке и если так, то адрес будет удален из списка, и правило вернет истину.

    --seconds seconds

    Эта опция должна использоваться только вместе с - rcheck или update. Это сузит список поиска соответствий до предела последнего данного количества секунд.

    --hitcount hits

    Эта опция также должна использоваться только вместе с - rcheck или update. Если используется, то это сузит список соответствий до количества вхождений с равными или больше или равным количеством пришедших пакетов. Эта опция может использоваться наряду с --seconds, чтобы создать более узкий критерий соответствия, требующий некоторого числа обращений в пределах определенной временной рамки.


    5. Фильтрация по строке в полезных данных пакета
    Это расширение позволяет производить поиск подстроки в полезных данных пакета. Хотя этому расширению действительно можно найти полезное применение, я советую вам работать с ним как можно аккуратней. Допустим, наш внешний firewall, построенный на Линуксе, защищает внутреннюю сеть, где есть несколько машин под управлением Windows и мы хотели бы блокировать все исполняемые файлы, которые могут быть получены из внешней сети. Можно попытаться использовать что-то вроде этого:

    -A FORWARD -m string --string '.com' -j DROP
    -A FORWARD -m string --string '.exe' -j DROP

    Но это доставит вам несколько неприятных моментов:
    Если '.com' или '.exe' файл разбит на два пакета данных, то подобное правило не принесет желаемого результата и пакет не будет отфильтрован.
    Любой пакет, содержащий такую подстроку, включая HTTP ответы и почту, будет заблокирован.

    Короче, handle with care!

    6. Правила, действующие по расписаниию
    Используя модуль времени, мы можем применять правила фильтрации, основанные на времени дня и дне недели. Это может использоваться для ограничения доступа пользователям к сети, например, чтобы во время обеда выполнить архивацию данных или обслуживание системы. Следующий пример запрещает доступ к сети в течение часа:

    -A FORWARD -p tcp -m multiport --dport http,https -o eth0 -i eth1 \
    -m time --timestart 12:30 --timestop 13:30 --days Mon,Tue,Wed,Thu,Fri -j DROP

    Понятно, что время является 24-часовыми с форматом HH:MM. День - отделенный запятыми список, который зависит от регистра символов и может состоять из Mon, Tue, Wed, Thu, Fri, Sat и/или Sun.


    7. Установка квот трафика
    Установка квот трафика может быть полезна во многих ситуациях. Как пример, множество широкополосных пользователей сети имеют ограничение по трафику, установленные их провайдером Интернет-доступа, который взимает дополнительную плату при превышении этих ограничений. В этом случае Вы можете использовать iptables со следующим набором правил, чтобы контролировать использование сети и отключить себя при превышении квоты (пусть в 2GB):

    -A INPUT -p tcp -m quota --quota 2147483648 -j ACCEPT
    -A INPUT -j DROP

    Также просмотреть расход можно командой:
    $ iptables -v L

    Учтите, что Вы должны вручную сбрасывать Ваше ограничение в конце месяца(перезапуская iptables) или использовать cron для этих целей. Естественно, что ваш компьютер должен быть постоянно включен, чтобы этот пример мог быть хоть как-нибудь использован. Но существует множество других ситуаций, где расширения квот может быть задействовано.

    8. Фильтрация по значениям TTL
    Значение TTL (Time to live) это восьмибитовое число, которое уменьшается каждый раз, когда пакет обрабатывается промежуточным хостом между источником и получателем этого пакета.Значение TTL по умолчанию зависит от операционной системы и обычно находится в пределах 32-128. Это значение служит
    цели, чтобы никакой пакет в сети из за плохих таблиц маршрутизации не застревал в конечной петле на неопределенный промежуток времени. Как только значение TTL пакета достигает нуля, он уничтожается, и источнику посылается сообщение, который решает, посылать ли этот пакет еще раз.
    Интересный факт не в тему - как работает traceroute: посылается первый пакет со значением TTL равным 1, получаем ответ от первого промежуточного хоста, затем пакет со значением TTL равным 2, и так до тех пор, пока пакет не достигнет пункта назначения.
    Полезность фильтрации по значениям TTL зависит только от Вашего воображения. Одно из самых полезных применений защита
    от нападения man-in-the-middle (сниффинг и подмена пакетов между источником и приемником). Иногда man-in-the-middle еще с сарказмом именуют monkey-in-the-middle. Если Вы часто соединяетесь с вашим рабочим компьютером из дома, то Вы можете контролировать ваши значения TTL и ожидать пакеты с их определенным максимальным значением. Это можно использовать для блокирования пакетов с более Высокими значениями TTL, так как это может означать возможную атаку man-in-the-middle кто-то получает ваши пакеты, изменяет их и отправляет далее адресату. Конечно, есть методы, когда эта макака не изменяет TTL, но, как известно, любая защита не абсолютна, но инкрементна. TTL также используется для отладки сети или для определения машин с некорректными значениями TTL, заданными по умолчанию.
    Как простой пример, давайте будем блокировать все пакеты от определенного IP со значением TTL 40 или меньше:

    -A INPUT -s 1.2.3.4 -m ttl --ttl-lt 40 -j REJECT

    Вы также можете проверить значения TTL, которые имеют TTL c меньшим чем (--ttl-gt) или равняются (--ttl-eq) определенному значению.

    Оригинальную версию статьи на английском языке, не модифицированную моими дополнениями и замечаниями всегда можно найти на www.linuxgazette.org

    (c) Hell Knights Crew // Ru24 Security Team // ShadOS
    Вольный перевод статьи "Advanced Features of netfilter/iptables" by
    Barry O'Donovan с конструктивными замечаниями и дополнениями by
    ShadOS

    Email: ShadOS [at] real [d0t] xakep [d0t] ru
    http://hellknights.void.ru/
     
    1 person likes this.