Memento Mori iptables

Date March 30th, 2010 Author Vitaly Agapov

Look around just people, can you hear their voice
Find the one who’ll guide to the limits of your choice
The experience of survival
Try to think about it…
That’s the chance to live your life and discover
Try to think about it
The experience of survival
— Enigma // The Screen Behind The Mirror



Вынужден признать, что настраивать межсетевой экран netfilter в Линуксе приходится чрезвычайно редко, отчего каждый раз многое приходится вспоминать и нагугливать заново. В связи с этим решил написать себе ещё одну памятку, к которой по мере надобности можно обращаться. Катарсиса не будет, так что за подробной документацией и руководствами можно пойти по ссылкам, перечисленным в конце статьи.
Итак, что мы имеем. В состав ядра Linux версии 2.4 и выше входит компонент netfilter, выполняющий функции фильтрации и преобразования трафика, то бишь брандмауэр (он же файрволл). Напомню, что в более старых версиях ядра был ipchains. Так вот. Для управления этим брандмауэром используется утилита iptables, позволяющая создавать цепочки, указывать правила, критерии и действия по умолчанию, добавлять счётчики, проверять корректность параметров и кое-что ещё.
Смотрим…

В настоящее время у меня стоит версия iptables 1.4.4 (на самом деле последняя версия сейчас – это 1.4.7, но в репозиториях пакет ещё не обновился), но есть же вещи, которые в этом мире не меняются, так что общие правила работают и будут работать всегда.

Основы

Основой iptables являются цепочки (неспроста предшественник так и назывался – ipchains). С ними возможна главная запутка, так что мимо этих классических табличек из официальной документации не пройти. Итак, возможны три пути следования пакетов на нашей машине: транзитно (например, если сервер выполняет функции шлюза… Не забываем про /proc/sys/net/ipv4/ip_forward), извне к локальному приложению и наружу от локального приложения в сеть.
Таблица 1. Порядок движения транзитных пакетов

Шаг Таблица Цепочка Примечание
1 Кабель (т.е. Интернет)
2 Сетевой интерфейс (например, eth0)
3 mangle PREROUTING Обычно эта цепочка используется для
внесения изменений в заголовок пакета, например для
изменения битов TOS и пр..
4 nat PREROUTING Эта цепочка используется для трансляции
сетевых адресов (Destination Network Address
Translation). Source Network Address
Translation выполняется позднее, в другой
цепочке. Любого рода фильтрация в этой цепочке может
производиться только в исключительных случаях
5 Принятие решения о дальнейшей маршрутизации, т.е. в этой точке решается куда пойдет пакет — локальному приложению или на другой узел сети.
6 mangle FORWARD Далее пакет попадает в цепочку FORWARD таблицы mangle, которая должна использоваться только в исключительных случаях, когда необходимо внести некоторые изменения в заголовок пакета между двумя точками принятия решения о маршрутизации.
7 Filter FORWARD В цепочку FORWARD попадают только те пакеты, которые идут на другой хост Вся фильтрация транзитного трафика должна выполняться здесь. Не забывайте, что через эту цепочку проходит траффик в обоих направлениях, обязательно учитывайте это обстоятельство при написании правил фильтрации.
8 mangle POSTROUTING Эта цепочка предназначена для внесения изменений в заголовок пакета уже после того как принято последнее решение о маршрутизации.
9 nat POSTROUTING Эта цепочка предназначена в первую очередь для Source Network Address Translation. Не используйте ее для фильтрации без особой на то необходимости. Здесь же выполняется и маскарадинг (Masquerading).
10 Выходной сетевой интерфейс (например, eth1).
11 Кабель (пусть будет LAN).

Таблица 2. Порядок движения для локального приложения

Шаг Таблица Цепочка Примечание
1 Кабель (т.е. Интернет)
2 Входной сетевой интерфейс (например, eth0)
3 mangle PREROUTING Обычно используется для внесения изменений в заголовок пакета, например для установки
битов TOS и пр.
4 nat PREROUTING Преобразование адресов (Destination Network Address Translation). Фильтрация пакетов здесь допускается только в исключительных случаях.
5 Принятие решения о маршрутизации.
6 mangle INPUT Пакет попадает в цепочку INPUT таблицы mangle. Здесь
внесятся изменения в заголовок пакета перед тем как
он будет передан локальному приложению.
7 filter INPUT Здесь производится фильтрация входящего трафика. Помните, что все входящие пакеты, адресованные нам, проходят через эту цепочку, независимо от того с какого интерфейса они
поступили.
8 Локальный процесс/приложение (т.е., программа-сервер или программа-клиент)

Таблица 3. Порядок движения от локального приложения в сеть

Шаг Таблица Цепочка Примечание
1 Локальный процесс (т.е., программа-сервер или программа-клиент).
2 Принятие решения о маршрутизации. Здесь решается куда пойдет пакет дальше — на какой адрес, через какой сетевой интерфейс и пр.
3 mangle OUTPUT Здесь производится внесение изменений в заголовок пакета. Выполнение фильтрации в этой цепочке может иметь негативные последствия.
4 nat OUTPUT Эта цепочка используется для трансляции сетевых адресов (NAT) в пакетах, исходящих от локальных процессов брандмауэра.
5 Filter OUTPUT Здесь фильтруется исходящий траффик.
6 mangle POSTROUTING Цепочка POSTROUTING таблицы mangle в основном используется для правил, которые должны вносить изменения в заголовок пакета перед тем, как он покинет брандмауэр, но уже после принятия решения о маршрутизации. В эту цепочку попадают все пакеты, как транзитные, так и созданные локальными процессами брандмауэра.
7 nat POSTROUTING Здесь выполняется Source Network Address Translation. Не следует в этой цепочке производить фильтрацию пакетов во избежание нежелательных побочных эффектов. Однако и здесь можно останавливать пакеты, применяя политику по-умолчанию DROP.
8 Сетевой интерфейс (например, eth0)
9 Кабель (т.е., Internet)

Как видно, iptables использует несколько таблиц (логично предположить, что отсюда и пошло название утилиты).

Таблица Mangle предназначена для внесения изменений в заголовки пакетов. В ней допускаются действия TOS, TTL и MARK.
Таблица NAT предназначена для преобразования сетевых адресов. В ней используются действия DNAT, SNAT, MASQUERADE.
Таблица Filter предназначена для фильтрации пакетов. В ней используются действия ACCEPT и DROP.

Состояния

Пакеты при обработке могут иметь одно из четырёх значений. И это состояние можно использовать в правилах с помощью критерия –state. В таблице 4 эти состояния перечислены.

Таблица 4. Перечень состояний в пространстве пользователя.

Состояние Описание
NEW Признак NEW сообщает о том, что пакет является первым для данного соединения. Это означает, что это первый пакет в данном соединении, который увидел модуль трассировщика. Например если получен SYN пакет являющийся первым пакетом для данного соединения, то он получит статус NEW. Однако, пакет может и не быть SYN пакетом и тем не менее
получить статус NEW. Это может породить определенные проблемы в отдельных случаях, но может оказаться и весьма полезным, например когда желательно "подхватить" соединения, "потерянные" другими брандмауэрами или в
случаях, когда таймаут соединения уже истек, но само соединение не было закрыто.
RELATED Состояние RELATED одно из самых "хитрых". Соединение получает статус RELATED если оно связано с другим соединением, имеющим признак ESTABLISHED. Это означает, что соединение получает признак RELATED тогда, когда оно инициировано из уже установленного соединения, имеющего признак ESTABLISHED. Хорошим примером соединения, которое может рассматриваться как RELATED, является
соединение FTP-data, которое является связанным с портом FTP control, а так же DCC соединение, запущенное из IRC. Обратите внимание на то, что большинство протоколов TCP и некоторые из протоколов
UDP весьма сложны и передают
информацию о соединении через область данных TCP или UDP пакетов и поэтому требуют
наличия специальных вспомогательных модулей для
корректной работы.
ESTABLISHED Состояние ESTABLISHED говорит о том, что это не первый пакет в соединении. Схема установки
состояния ESTABLISHED достаточна проста для понимания. Единственное требование, предъявляемое к соединению, заключается в том, что для перехода в состояние ESTABLISHED необходимо чтобы узел сети передал пакет и получил на него ответ
от другого узла (хоста). После получения ответа состояние соединения NEW или RELATEDбудет изаменено на ESTABLISHED.
INVALID Признак INVALID говорит о том, что пакет не может быть идентифицирован и поэтому не может иметь определенного статуса. Это может происходить по разным причинам, например при нехватке
памяти или при получении ICMP-сообщения об ошибке, которое не соответствует какому либо известному соединению. Наверное наилучшим вариантом было бы применение действия DROP к таким пакетам.

Ключи, команды и критерии

Ключи и команды можно легко посмотреть в iptables –help, поэтому приводить их здесь не вижу смысла. А основные команды (-A, -D, -L и -F) всё равно держатся в памяти.
А вот критерии можно кратко рассмотреть:

Общие критерии:

  • -p, –protocol – протокол (tcp, udp, icmp)
  • -s, –src, –source – ip-адрес или подсеть/маска источника пакета
  • -d, –dst, –destination – ip-адрес или подсеть/маска получателя
  • -i, –in-interface – имя интерфейса, с которого получен пакет
  • -o, –out-interface – имя выходного интерфейса
  • -f, –fragment – правило распространяется на все фрагменты фрагментированного пакета кроме первого

UDP-, ICMP- и TCP-критерии:

Здесь может понадобиться явное указание -m tcp.

  • –sport, –source-port – исходный порт или диапазон портов службы
  • –dport, –destination-port – порт или диапазон портов, на который адресован пакет
  • –tcp-flags – маска и флаги tcp-пакета. Первый список задаёт проверяемые флаги, а второй список – те флаги, которые должны быть установлены. Возможные значения: SYN, ACK, FIN, RST, URG, PSH, ALL, NONE
  • –tcp-option – значение заголовка tcp option
  • –icmp-type – тип icmp (iptables –protocol icmp –help)

Явные критерии:

Эти критерии требуют явной подгрузки ключом -m (-m limit, -m mac, -m mark, -m multiport, -m owner, -m state, -m tos, -m ttl).

  • –limit – скорость освобождения счётчика (/second /minute /hour /day). Значение по умолчанию: 3/hour
  • –limit-burst – максимальное значение счетчика
  • –mac-source – MAC источника
  • –mark – проверка помеченных пакетов действием MARK
  • –source-port – список входящих портов (с включенным -m multiport)
  • –destination-port – список исходящих портов (с включенным -m multiport)
  • –port – список входящих и исходящих портов (с включенным -m multiport)
  • –uid-owner – UID владельца
  • –gid-owner – GID владельца
  • –pid-owner – PID процесса
  • –sid-owner – Session ID пакета
  • –state – состояние соединения (INVALID, ESTABLISHED, NEW и RELATED)
  • –tos – проверка установленных битов TOS
  • –ttl – значение в поле TTL

Примечания: Символ ! позволяет указывать инвертирование условия. Символ + используется как шаблон, заменяющий любое количество символов. Символ : позволяет задавать диапазон (например, 22:80).

Действия

Действие в команде задаётся с помощью ключа -j. Это может быть как одно из стандартных действий, так и переход на другую цепочку.

  • ACCEPT – принять пакет
  • DROP – отбросить пакет
  • DNAT – изменить ip-адрес места назначения
  • LOG – произвести журналирование пакетов и событий в системный журнал
  • ULOG – произвести журналирование пакетов и событий в пользовательское пространство
  • MARK – установить метку на пакет
  • SNAT – заменить ip-адрес источника, при этом сам адрес указывается статически
  • MASQUERADE – заменить ip-адрес источника, при этом сам адрес назначается динамически
  • QUEUE – поставить пакет в очередь на обработку
  • REDIRECT – перенаправить пакет на другой порт
  • REJECT – передать сообщение об ошибке отправителю
  • RETURN – выход из цепочки
  • TOS – установить биты в поле TOS
  • TTL – изменить содержимое поля TTL

Сохранение и восстановление настроек iptables

Если мы хотим сохранить текущую конфигурацию iptables в текстовый файл с возможностью её восстановления на этом же или на другом сервере, то в этом нам помогут команды iptables-save и iptables-restore:

iptables-save > /path/to/file
cat /path/to/file | iptables-restore

Если команду iptables-restore вполнить с ключом -n (–noflush), то правила накатятся без удаления имеющихся. А в команде iptables-save можно с помощью ключа -t указать конкретную таблицу для сохранения (mangle, nat или filter).

Модуль recent

Модуль recent позволяет создавать динамические списки IP-адресов. Подключить модуль можно как обычно – с помощью ключа -m recent.
Поддерживает он следующие опции:

  • –name – имя списка, с которым работает команда. По умолчанию – DEFAULT
  • –rcheck – проверка наличия ip-адреса отправителя в списке
  • –update – проверка наличия ip-адреса отправителя в списке. Если такой адрес присутствует, то запись обновляется
  • –hitcount – счетчик, возвращает true при наличии адреса в списке, когда число принятых пакетов с адреса больше или равно заданного значения. Используется совместно с rcheck или update
  • –seconds – определяет период (от момента занесения адреса в список), в течение которого адрес может находиться в списке
  • –set – добавление ip-адреса в список. Если такой адрес уже есть в списке, запись будет обновлена
  • –remove – удаление адреса из списка. Если адрес не обнаружен вернет false.

Модуль hashlimit

Модуль hashlimit позволяет реализовать защиту по методу “дырявого ведра” с учётом выбранной пользователем комбинации параметров. Он поддерживате хэш-таблицы и может сохранять их для каждого набора параметров независимо. С помощью него можно вводить ограничения на скорость и число попыток установление TCP-соединения с каждым адресом.
Подключить модуль можно с помощью ключа -m hashlimit.
Поддерживаются следующие опции:

  • –hashlimit – задает среднее значение потока трафика. В качестве суффикса могут использоваться значения /second, /minute, /hour, /day
  • –hashlimit-burst – задает среднюю частоту событий (скорость оттока) и указывается в формате значение/суффикс. По умолчанию равен 5
  • –hashlimit-mode <режим> – задает режим хеширования – по адресам, портам или их комбинациям. Параметр может содержать разделенный запятыми список значений dstip, dstport, srcip, srcport. Эта опция является обязательной в команде
  • –hashlimit-name foo – задает имя для файла /proc/net/ipt_hashlimit/foo. Данная опция является обязательной. Имя файла может выбираться произвольно
  • –hashlimit-htable-size – задает число элементов (bucket) в хэш-таблице
  • –hashlimit-htable-max – задает максимальное количество записей в хэше
  • –hashlimit-htable-expire – задает время (в миллисекундах) жизни записи в хэш-таблице. По умолчанию время жизни составляет 10000 мс
  • –hashlimit-htable-gcinterval – задает интервал “сборки мусора” в хэш-таблице. По умолчанию интервал сборки составляет 1000 мс

Действие TARPIT

TARPIT – это цель, позволяющая создать ловушку для вражеских tcp-соединений. При срабатывании правила TARPIT отправитель получает ответ SYN-ACK с принудительным установлением размера tcp-окна, равным нулю. Отправитель при этом не может отправлять никаких данных, а попытки разорвать соединение игнорируются. То есть соединение подвисает до истечения таймаута (2-24 минут) и отъедает часть ресурсов у атакующего.
Стандартная поставка iptables не содержит модуля TARPIT, а его установка предполагает накатывание патча POM (patch-o-matic) на ядро Linux. Но это порочная практика, так как патч всё-таки устаревает, и с новыми версиями ядра экспериментировать не хочется, да к тому же совершенно не круто повторять процедуру каждый раз после обновления ядра из репозитория. К счастью, в Ubuntu вопрос решается простой установкой пакета xtables-addons-common. Про другие дистрибутивы надо этот вопрос уточнять. Останется только проверить, что опция ядра CONFIG_NETFILTER_XTABLES включена.

# grep CONFIG_NETFILTER_XTABLES /boot/config-*
/boot/config-2.6.31-19-generic:CONFIG_NETFILTER_XTABLES=m

Правда, в моей Кармической Коале (Ubuntu 9.10) TARPIT-таки не заработал после этого. Не помогла даже попытка собрать дополнения xtables из исходников xtables-addons-source. При компиляции модуля xt_DELUDE вылезают сообщения об ошибках:

/usr/src/modules/xtables-addons/extensions/xt_DELUDE.c: In function ‘delude_send_reset’:
/usr/src/modules/xtables-addons/extensions/xt_DELUDE.c:122: error:
‘struct sk_buff’ has no member named ‘dst’
/usr/src/modules/xtables-addons/extensions/xt_DELUDE.c:123: error:
‘struct sk_buff’ has no member named ‘dst’

Решение проблемы нашлось:
1. Устанавливаем quilt и module-assistant, если они не установлены:

sudo apt-get install quilt module-assistant

2. Качаем исходники xtables-addons для (пока ещё грядущеей) Ясной Рыси (Ubuntu 10.04 Lucid Lynx):

wget http://archive.ubuntu.com/ubuntu/pool/universe/x/xtables-addons/xtables-addons-source_1.21-1_all.deb
wget http://archive.ubuntu.com/ubuntu/pool/universe/x/xtables-addons/xtables-addons-common_1.21-1_i386.deb
# For 64bit:
wget http://archive.ubuntu.com/ubuntu/pool/universe/x/xtables-addons/xtables-addons-common_1.21-1_amd64.deb

3. Устанавливаем пакет с сорцами, компилим его и устанавливаем через сборку нового deb:

# gdebi xtables-addons-source_1.21-1_all.deb
# gdebi xtables-addons-common_1.21-1_i386.deb
# m-a --verbose --text-mode a-i xtables-addons

4. Вуаля.

Другие расширения из xtables-addons

TARPIT – это очень здорово. Неплохой способ напакостить злоумышленникам. Но в пакете xtables-addons есть ещё и другие интересные расширения. Рассмотрим некоторые из них:

  • DELUDE – отправляет ответ SYN-ACK на SYN на все остальные. Таким образом, сканер атакующей машины (например, nmap) при SYN-сканировании показывает, что целевой порт открыт, в то время как на самом деле порт закрыт
  • CHAOS – создает запутывающий эффект для входящих соединений. Он рандомно может отвечать на соединения как REJECT, TARPIT или DELUDE
  • IPMARK – позволяет помечать пакеты на основе их ip-адреса. Здесь используется параметр –addr
  • STEAL – действует как DROP, но не вызывает ошибок, свойственных DROP в цепочке OUTPUT
  • SYSRQ – вызывает сигнал sysrq. Это полезно, если на машине, доступной только по сети, повисли жизненно важные части системы. В xtables для этого правила предусмотрена специальная защита по mac/ip или по паролю
  • TEE – клонирует пакет и перенаправляет его клон на другую машину сегмента локальной сети. Используется параметр –gateway

Ещё расширений из Patch-o-matic?

Это ещё не все вкусности iptables. В Patch-o-matic можно найти ещё много расширений. А самое приятное, что всё перечисленное ниже по умолчанию вкомпилено в iptables в дистрибутивах Debian и Ubuntu:

1. string
Позволяет фильтровать пакеты по наличию в них требуемой последовательности символов. HEX-коды должны разделяться символами “|”. Ключом –string задаётся строка для поиска, ключом –algo – алгоритм поиска (bm = Boyer-Moore, kmp = Knuth-Pratt-Morris).

2. time
Позволяет строить логику на основе текущего времени, даты или дня недели.

3. statistic
Позволяет строить логику критериев на основе заданных вероятностей.

Что дальше?

Тут я хотел сделать подборку самых интересных и полезных примеров использования iptables. Как, говорится, Cookbook. Но и так многовато писать пришлось. Так что всё это будет в следующем посте.

Ссылки

Домашняя страница проекта

Перевод документации по iptables 1.1.19

Wiki

Пошаговое конфигурирование iptables 1.1.14

Tags: , ,
Category: Linux, Security | 4 Comments »

Comments

4 комментариев на “Memento Mori iptables”

  1. Tappman

    Здравствуйте.
    По вашей статье установил xtables-addons, прописал правила для TARPIT в iptables. iptables-save выдаёт:
    -A INPUT -p tcp -m tcp –dport 22 -j TARPIT
    А вот iptables -L TARPIT говорит, что ничего не работает:
    iptables: No chain/target/match by that name.
    Не подскажите, в каком направлении смотреть, где ошибки сделаны?
    З.Ы. Система Ubuntu-server 10.04.1

  2. Вася

    > А вот iptables -L TARPIT говорит, что ничего не работает:
    > iptables: No chain/target/match by that name.

    Если верно понял:
    iptables -L | grep ‘TARPIT’

    А если эта ругань при добавлении – нет нужных модулей (не установлены или не загружены).

    PS: Некрофилизм, но может кто-то задастся таким же вопросом…

  3. agapoff.name | IT блог » Blog Archive » Рецепты iptables

    […] недавно была статья по главным концепциям iptables – Memento iptables. Буду считать, что это её логическое продолжение. Тем […]

  4. agapoff.name | IT блог » Blog Archive » Traffic Control. Шейпинг трафика в Linux

    […] Memento iptables […]

Leave a comment

 Comment Form