Iptables basics/основы
Netfilter
Here is a packet flow diagram for iptables, omitting the Prerouting and Postrouting chains for simplicity. It also assumes all traffic through the OUTPUT chain leaves the host, but packets addressed to loopback may circulate back to the "packet in" point.
Iptables
Here is a packet flow diagram for iptables, omitting the Prerouting and Postrouting chains for simplicity. It also assumes all traffic through the OUTPUT chain leaves the host, but packets addressed to loopback may circulate back to the "packet in" point.
Packet rules can be added with the form
iptables --add chain_name packet-description --jump [ACCEPT | DROP]
Here are a few examples for the packet-description part. You can select by source/destination address, protocol (TCP/UDP/etc), src/dest port, input or output interface, Ethernet address (no examples here), or any other header bits. You can mix and match.
--destination lamp.cslabs.luc.edu
--source 10.2.3.0/24
--protocol tcp --source-port 80 # must have --protocol tcp before you can have any tcp-specific match
--protocol tcp --destination-port 25 --out-interface eth2
--protocol icmp --icmp-type echo-request --in-interface eth0
--protocol udp
--match state --state ESTABLISHED,RELATED # --match has several modules; here we use state
--match state --state NEW
--protocol tcp --syn # for TCP, same as --state NEW: first TCP SYN packet
When iptables is used to mark packets for iproute2 or tc, usually the prerouting chain / mangle table is used. Iptables also has a classify option for tagging packets for a given tc-htb queue.
Целью правил 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 соединений.