Цели правил IPTables.
Метки: DNAT | IPTables | SNAT | ToS
Пятница, 20 февраля 2009 г.
Просмотров: 12918
Целью правил 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 — узел запрещен.
Вышеперечисленные аргументы являются 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 (очередь) служит для отправки пакетов пользовательскому приложению для дальнейшей обработки. Более конкретно об использовании этой цели можно прочитать в .
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