Linux: IPTABLES — руководство: часть 4 — цели для правил
IPTABLES — руководство: часть 1 — основы IPTABLES
IPTABLES — руководство: часть 2 — управление IPTABLES
IPTABLES — руководство: часть 3 — параметры правил
Общий обзор действий был дан в первом посте — IPTABLES — руководство: часть 1 — основы IPTABLES.
Содержание:
Действие над попавшим под правило пакетом выполняется с помощью опий -j (--jump)
или-g (--goto
).
-j, --jump <i>цель</i>
— цель (или действие) для пакетов, попадающих по действие правила; целью может быть цепочка, определённая пользователем (отличная от цепочки правила), одна из встроенных целей, определяющая окончательное действие над пакетом; если опция не задана в правиле (и ключ -g
не использован), то сработает только счётчик количества правила;
-g, --goto <i>цепочка</i>
— продолжить обработку в цепочке, определённой пользователем; в отличие от опции —jump, после действия RETURN из вызванной цепочки, применение правил будет продолжено не в текущей цепочке, а в той цепочке, которая вызвала текущую через --jump
.
Для использования -j <em>chain</em>
или -g <em>chain</em>
— цепочка должна быть уже создана.
Пример:
iptables -A INPUT -p tcp -j tcp_packet
Цели IPTABLES
ACCEPT – принять пакет, и передать следующей цепочке (или приложению, или передать для дальнейшего роутинга);
У данного действия нет дополнительных опций. После выполнения ACCEPT пакет не будет более отслеживаться никаким правилом этой цепочки (но может попасть под правило в другой, например вPOSTROUTING
).
Пример:
iptables -A INPUT -s SOME_IP_HERE -j ACCEPT
CONNMARK — схожа с MARK. Позволяет установить метку на пакеты одной сессии или соединения. Можно использовать в любой цепочке, но при этом учтите, что в таблице nat
проверяется только первый пакет, а потому метки на всех пакетах будут бесполезны.
--set-mark
— устанавливает метку на паккет; значение может быть long int (от 0 до 4294967295l); можно установить метку на каждый бит пакета, например --set-mark 12/8
;
Пример:
iptables -t nat -A PREROUTING -p tcp --dport 80 -j CONNMARK --set-mark 4
--save-mark
— используется для сохранения метки пакета на всё соединение; например, если вы установили метку на пакет с помощью цели MARK — с помощью --save-mark
вы можете переместить её на всё подключение целиком;
Пример:
iptables -t mangle -A PREROUTING --dport 80 -j CONNMARK --save-mark
--restore-mark
— восстановить метку пакета из метки всего соединения, заданного CONNMARK; допустимо использование только в таблице mangle
;
Пример:
iptables -t mangle -A PREROUTING --dport 80 -j CONNMARK --restore-mark
--mask
— используется вместе с --save-mark
и --restore-mark
;
Пример:
iptables -t mangle -A PREROUTING --dport 80 -j CONNMARK --restore-mark --mask 12
DNAT — используется для Destination Network Address Translation, перезаписывает Destination IP addressпакета. Допустимо использование только в цепочках PREROUTING
и OUTPUT
таблицы nat
.
--to-destination
— указывает механизму DNAT какой IP задать в IP-заголовке пакета, и куда его пересылать; в примере ниже все пакеты на адрес 15.45.23.67 будут перенаправляться на диапазон локальных адресов 192.168.1.1 — 192.168.1.10; можно указать порт назначения, например 192.168.1.1:80, или диапазон портов — 192.168.1.1:80-100; обязательно указание протокола (-p tcp
или -p udp
):
Пример:
iptables -t nat -A PREROUTING -p tcp -d 15.45.23.67 --dport 80 -j DNAT --to-destination 192.168.1.1-192.168.1.10
DROP — просто «сбрасывает» пакет и IPTABLES «забывает» о его существовании; «сброшенные» пакеты прекращают свое движение полностью, т.е. они не передаются в другие таблицы, как это происходит в случае с действием ACCEPT. Следует помнить, что данное действие может иметь негативные последствия, поскольку может оставлять незакрытые «мертвые» сокеты как на стороне сервера, так и на стороне клиента. Наилучшим способом защиты будет использование действия REJECT, особенно при защите от сканирования портов.
LOG — действие, которое служит для журналирования отдельных пакетов и событий. В журнал могут заноситься заголовки IP пакетов и другая полезная информация. Информация из журнала может быть затем прочитана с помощью dmesg
или syslogd
, либо с помощью других программ. Обратите ваше внимание так же на цель ULOG, которое позволяет выполнять запись информации не в системный журнал, а в базу данных MySQL и т.п.
--log-level
— указание log-level при логировании события;
Пример:
iptables -A FORWARD -p tcp -j LOG --log-level debug
--log-prefix
— добавляет префикс к сообщениям в лог-файле; допустимо максимум 29 символов,включая пробелы и другие специальные символы;
Пример:
iptables -A INPUT -p tcp -j LOG --log-prefix "INPUT packets"
--log-tcp-sequence
— записывать в лог номер TCP Sequence;
Пример:
iptables -A INPUT -p tcp -j LOG --log-tcp-sequence
--log-tcp-options
— записывать влог различные опции из заголовка TCP-пакета;
Пример:
iptables -A FORWARD -p tcp -j LOG --log-tcp-options
MARK — устанавливает метку Netfilter, которая ассоциирована с определённым пакетом. Допустимо использование только в таблице mangle
. Учтите — «метка» устанавливается не на сам пакет, а является неким значением для ядра, которое ассоциируется с пакетом. Т.е., если вы ожидаете увидеть данную метку на это пакете на другом хосте — у вас это не выйдет. Для таких целей лучше использовать TOS (в данном посте не описано, смотрите тут>>>), который устанавливает значение в IP-заголовок пакета.
--set-mark
— устанавливается в виде int (целого числа), например для дальнейшей расширенной маршрутизации;
Пример:
iptables -t mangle -A PREROUTING -p tcp --dport 22 -j MARK --set-mark 2
MASQUERADE — в целом, сход по назначению с целью SNAT, но без ключа --to-source
, так как в основном используется при динамических соединения — DHCP, DialUp, когда IP присваивается динамически и получает информацию об IP непосредственно с сетевого интерфейса. Использование MASQUERADE допустимо приналичии постоянного IP, но использует больше системных ресурсов, потому в таком случае предпочтительнее использование SNAT. Допускается использование только в цепочке POSTROUTING
таблицы nat.
--to-ports
— может быть использована для указания исходных порта или портов для исходящих пакетов; обязательно указание протокола (p- tc
p или -p udp
);
Пример:
iptables -t nat -A POSTROUTING -p TCP -j MASQUERADE --to-ports 1024-31000
NOTRACK — установка метки NOTRACK на пакеты. Не имете дополнительных опций. Подробнее смотрите тут>>>.
REDIRECT — выполняет перенаправление пакетов и потоков на другой порт той же самой машины. Можно пакеты, поступающие на HTTP порт, перенаправить на порт HTTP-proxy. Удобен для выполнения «прозрачного» проксирования (transparent proxy), когда машины в локальной сети даже не подозревают о существовании прокси. Может использоваться только в цепочках PREROUTING
и OUTPUT
таблицы nat.
--to-ports
— указывает порт или диапазон портов назначения; что бы указать диапазон — укажите их через тире; обязательно указание протокола (-p tcp
или -p udp
);
Пример:
iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080
iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080-9090
REJECT — используется, как правило, в тех же самых ситуациях, что и DROP, но в отличие от DROP, цель REJECT выдает сообщение об ошибке на хост, передавший пакет. Допустимо использование в цепочках INPUT, FORWARD
и OUTPUT
, и их под-цепочках.
--reject-with
— выполняет REJECT с указанным ответом; сначала будет выполнен REJECT, отправлен ответ, после чего — DROP пакета; допустимые значения:icmp-net-unreachable, icmp-host-unreachable, icmp-port-unreachable,
icmp-proto-unreachable, icmp-net-prohibited and icmp-host-prohibited
Пример:
iptables -A FORWARD -p TCP --dport 22 -j REJECT --reject-with tcp-reset
RETURN — прекращает премещение пакета далее по правилам в текущей цепочке. Если это вложенная цепочка другой, вышестоящей, цепочки — пакет будет перемещён в неё, если это главная цепочка — он будет обработан согласно действия по-умолчанию для данной цепочки. Не имеет дополнительных опций.
SNAT — используется для преобразования сетевых адресов (Source Network Address Translation), т.е. изменение исходящего IP адреса в IP в заголовке пакета. SNAT допускается выполнять только в таблицеnat
, в цепочке POSTROUTING
. Если первый пакет в соединении подвергся преобразованию исходящего адреса, то все последующие пакеты, из этого же соединения, будут преобразованы автоматически и не пойдут через эту цепочку правил.
--to-source
— используется для указания исходного адреса пакета; допустимо указать диапазон адресов, разделённые тире — 194.236.50.155-194.236.50.160, в таком случае конкретный IP адрес будет выбираться случайным образом для каждого нового потока;
Пример:
iptables -t nat -A POSTROUTING -p tcp -o eth0 -j SNAT --to-source 194.236.50.155-194.236.50.160:1024-32000
ULOG — лучше ознакомится с информацией на домашней странице проекта.