Личный блог Suvan`a.

Работая и играя с Linux... И что из этого иногда получается.

Цели правил IPTables.

Рубрика: Безопасность -> Брандмауэр
Метки: | | |
Пятница, 20 февраля 2009 г.
Просмотров: 38397

Целью правил IPTables называется действие, которое выполняется над пакетом, если его заголовок соответствует совпадению правила. Обычно используются 15 стандар­тных целей. Также можно указать в качестве цели пользовательскую це­почку, которой передается управление. Если ни одно из правил в пользовательской цепочке не совпало, выполнение передается назад в вызывающую цепочку.

     Опция -j используется для задания цели. Стандартные цели пишутся прописными буквами.


     Пользовательские цепочки создаются следующим образом:

# iptables -N my_packets

     Чтобы перейти в пользовательскую цепочку выполняется следующая команда:

# iptables -A INPUT -p tcp -j my_packets

     На движение по такой цепочке накладывается ряд ограничений. Первое, это цепочка должна быть создана до того как на нее будет выполнен переход. Второе, цепочка должна находиться в той же таблице, как и цепочка с которой на нее будет выполнен переход.

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

ACCEPT (-j ACCEPT)

     Пакет должен быть принят. Обработка пакета в этой цепочке прекращается и он передается следующей цепочке, где над ним может быть произведена дополнительная обработка.

DROP (-j DROP)

     Пакет будет отброшен. Больше над пакетом никакой обработки не произво­дится, так как после этого действия пакет отбрасывается. Ни в какие другие цепочки после этого действия пакет не передается. Поэтому, если вы хотите протоколировать такие пакеты, то это нужно делать до этой обработки. Данная обработка может оставлять незакрытые сокеты на стороне сервера, поэтому его нужно применять с осторожностью.

     Обработки ACCEPT и DROP не имеют дополнительных ключей.

REJECT (-j REJECT)

     Пакет отклоняется. В отличие от цели DROP, где пакет просто отбрасывается, в данном случае отправителю будет отправлено IСМР-сообщение "Port unreachable" («Порт недоступен»). С помощью опции --reject-with можно изменить тип ICMP-сообщения:

# iptables -A INPUT -s 1.2.3.4 -j REJECT --reject-with icmp-net-unreachable

     У опции --reject-with есть следующие аргументы:

  • icmp-net-unreachable — сеть недоступна;

  • icmp-host-unreachable — узел недоступен;
  • icmp-port-unreachable — порт недоступен;
  • icmp-proto-unreahable — неподдерживаемый протокол;
  • icmp-net-prohibited — сеть запрещена;
  • icmp-host-prohibited — узел запрещен.
     По умолчанию будет передано сообщение port-unreachable.

     Вышеперечисленные аргументы являются ICMP error messages.В дополнение к опции --reject-with TCP-пакеты можно отклонить с помощью аргумента tcp-reset, который отправляет RST-сообщения отправителю. Это наилучший с точки зрения безопасности способ, нужно обязательно использовать именно его. TCP RST пакеты используются для закрытия TCP соединений.

     Цель REJECT может быть использована только с цепочками INPUT, OUTPUT и FORWARD.

LOG (-j LOG [опции])

     Пакеты протоколируются с помощью демона syslogd (демон протоко­лирования ядра). Кроме журналирования, никаких действий над пакетом больше не выполняется. Действие LOG хорошо для отладки правил. Можно применить его вместо DROP, чтобы проследить ошибки в правилах.

     Протоколирование обычно нужно для анализа DoS-атак и сетевых червей. Пример правила, отслеживающего попытки соединения Windows-трояна Sub7 на порт ТСР/27374:

# iptables -A INPUT -p tcp --dport 27374 -m state --state NEW -j LOG

     У цели LOG есть несколько дополнительных опций, которые дают возможность управлять протоколированием.

--log-level <уровень>

     Устанавливает уровень протоколирования. Список уровней протоколиро­вания и их описание находится в справочном руководстве по демону syslogd (man syslogd). Можно задать следующие уровни: debug, info, notice, warning, warn, err, error, crit, alert, emerg и panic.

     Пример:

iptables -A INPUT -p tcp --dport 8080 -m state --state NEW -j LOG --log-level debug

iptables -A INPUT -p tcp --dport 8080 -m state --state NEW -j LOG --log-level warn

--log-prefix <строка>

     Используется в качестве префикса при внесении ин­формации в протокол. Максимальная длина строки - 29 символов. Эта оп­ция крайне полезна: файлы протоколов просто огромные. Для того, чтобы можно было легко найти нужные пакеты, используется эта строка. Потом, с помощью программы grep, можно будет просматривать отдельные записи журнала.

# iptables -A INPUT -p icmp -m limit ! --limit 100/minute -j LOG --log-prefix "ICMP flood"

# iptables -A INPUT -p icmp -m multiport --dport 13,59,89 -j LOG --log-prefix "exploit hak"

--log-tcp-sequences

     Журналирование ISN, встречающихся в TCP-пакетах. Потенцально опасен для безопасности системы, если кто-то прочтет журнал записи этого ключа.

# iptables -A OUTPUT -p tcp -j LOG --log-tcp-sequence

--log-tcp-options

     Используется при отладке. Протоколирует TCP-опции, попадающихся в заголовке ТСР-пакетов.

# iptables -A INPUT -p tcp -j LOG --log-tcp-options

--log-ip-options

     Журналирование IP-опций, работает только с IP заголовком.

# iptables -A FORWARD -p tcp -j LOG --log-ip-options

MARK (-j MARK)

     Специальная цель, можно использовать только с таблицей mangle. Служит для установки меток на некоторые пакеты. Эта метка не передается по сети. Установив метку, можно выполнять с этими пакетами некоторые действия, в частности принимать решение о маршрутизации по разным маршрутам, дать пакетам с меткой высший приоритет или ограничить трафик для определенного пользователя. Пример использования этой цели:

# iptables -t mangle -A PREROUTING -p tcp --dport 22 -j MARK --set-mark 5

SNAT (-j SNAT), DNAT (-j DNAT), MASQUERADE (-j MASQUERADE)

     Про NAT можно прочитать немного здесь и здесь. Синтаксис у них у всех одинаковый. Отличаются только действием.

     SNAT имеет одну опцию --to-source, которая служит для указания адреса, присваемового пакету. Пример:

# iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to-source 171.26.34.251

     DNAT также имеет одну опцию --to-destination, она задает IP адрес, который будет подставлен в заголовок пакета в качестве адреса места назначения. Более подробно можно прочитать в IPTables Tutorial 1.1.19. Пример:

# iptables -t nat -A PREROUTING -d 65.45.73.17 -j DNAT --to-destination 192.168.1.1

     MASQUERADE имеет одну опцию --to-ports. Этот ключ служит для указания порта источника или диапазона портов исходящего пакета. Используется для динамических подлючений. Пример:

# iptables -t nat -A POSTROUTING -p TCP -j MASQUERADE --to-ports 1024-10000

RETURN (-j RETURN)

     Остановка обработки пакета. Если эта цель будет в пользовательской цепочке, обработка правил этой цепочки остановится и управление пе­редастся вспять - цепочке, которая вызвала пользовательскую цепочку.

Такой принцип встречается в подпрограммах: оператор return отдает управление из подпрограммы в основную программу. Если же return встречается в центральной цепочке, для пакета будет выполнено действие по умолчанию (default policy) - ACCEPT, DROP или REJECT.

QUEUE (-j QUEUE)

     Цель QUEUE (очередь) служит для отправки пакетов пользова­тельскому приложению для дальнейшей обработки. Более конкретно об ис­пользовании этой цели можно прочитать в Netfilter Hacking HOWTO.

MIRROR (-j MIRROR)

     Цель MIRROR экспериментальная, она инвертирует адреса от­правителя и получателя, что позволяет эффективно зеркалировать соединения. Может использоваться, в частности, для перенаправления DoS-атаки на машину крекера. Данную опцию лучше не использовать.

TOS (-j tos --set-tos <значение>)

     Дает изменить поле ToS заголовка пакета. Рассмотрим правило, изменяющее приоритет SSH-трафика на minimize-delay (минимальная задержка):

# iptables -A OUTPUT -p tcp --dport 22 -j TOS --set-tos 0x10

TTL(-j ttl --ttl-set --ttl-dec --ttl-inc <значение>)

     Дает возможность менять TTL пакета: установить определенное значение TTL (--ttl-set), уменьшить TTL на определенное значение (--ttl-dec) или увели­чить на определенное значение (--ttl-inc). Пример:

# iptables -t mangle -A OUTPUT -p tcp --sport 80 -s 192.168.1.4 -j TTL --ttl-set 128