Linux: IPTABLES – руководство: часть 4 – цели для правил

Автор: | 21/10/2014
 

netfilter_logo

IPTABLES – руководство: часть 1 – основы IPTABLES

IPTABLES – руководство: часть 2 – управление IPTABLES

IPTABLES – руководство: часть 3 – параметры правил

Общий обзор действий был дан в первом посте – IPTABLES – руководство: часть 1 – основы IPTABLES.

Содержание:

Действие над попавшим под правило пакетом выполняется с помощью опий -j (--jump) или -g (--goto).

-j, --jump цель – цель (или действие) для пакетов, попадающих по действие правила; целью может быть цепочка, определённая пользователем (отличная от цепочки правила), одна из встроенных целей, определяющая окончательное действие над пакетом; если опция не задана в правиле (и ключ -g не использован), то сработает только счётчик количества правила;

-g, --goto цепочка – продолжить обработку в цепочке, определённой пользователем; в отличие от опции –jump, после действия RETURN из вызванной цепочки, применение правил будет продолжено не в текущей цепочке, а в той цепочке, которая вызвала текущую через --jump.

Для использования -j chain или -g chain – цепочка должна быть уже создана.

Пример:

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- tcp или -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 – лучше ознакомится с информацией на домашней странице проекта.