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