← Back to notes

Цепочки (Chains) и
таблицы в iptables


iptables — userspace-фронтенд к netfilter в ядре Linux. Структура: таблицы → цепочки → правила. Цепочка привязана к одному из netfilter-хуков: PREROUTING, INPUT, FORWARD, OUTPUT, POSTROUTING.

С 2014 года рекомендуемая замена — nftables (nft). iptables всё ещё широко используется, но в дистрибутивах часто реализован через iptables-nft shim поверх nftables.


Таблицы и встроенные цепочки

ТаблицаЦепочкиНазначение
filterINPUT, OUTPUT, FORWARDAccept/Drop/Reject пакетов (default)
natPREROUTING, INPUT, OUTPUT, POSTROUTINGDNAT/SNAT/MASQUERADE
manglePREROUTING, INPUT, FORWARD, OUTPUT, POSTROUTINGTOS/DSCP, TTL, MARK
rawPREROUTING, OUTPUTОбход conntrack (NOTRACK)
securityINPUT, OUTPUT, FORWARDSECMARK для SELinux/MAC

nat применяется только к первому пакету соединения (NEW); последующие обрабатываются через conntrack автоматически.


filter

Основная таблица. Используется по умолчанию, если не указан -t.

iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -j DROP
ЦепочкаКогда срабатывает
INPUTПакет адресован локальному процессу
OUTPUTПакет создан локальным процессом
FORWARDПакет проходит через хост (требует net.ipv4.ip_forward=1)

nat

# SNAT через MASQUERADE (выходной интерфейс)
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

# DNAT (port forwarding)
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 8080 \
  -j DNAT --to-destination 192.168.1.10:80
ЦепочкаЧто меняет
PREROUTINGdst (DNAT) — до решения о маршрутизации
POSTROUTINGsrc (SNAT/MASQUERADE) — после маршрутизации
OUTPUTdst для локально-сгенерированных пакетов

mangle

Изменение полей заголовка и связанных метаданных:

  • TOS/DSCP (RFC 2474) — приоритет QoS;
  • TTL (с осторожностью);
  • MARK / CONNMARK — метка для policy routing (ip rule fwmark).
iptables -t mangle -A PREROUTING -p tcp --dport 22 -j MARK --set-mark 1

raw

Применяется до conntrack. Используется для исключения трафика из tracking:

iptables -t raw -A PREROUTING -p tcp --dport 22 -j NOTRACK

Снижает нагрузку CPU/память conntrack-таблицы, но ломает stateful-правила и NAT для этого потока.


security

SECMARK — метки для SELinux/MAC. Применяется после filter.

iptables -t security -A INPUT -p tcp --dport 22 \
  -j SECMARK --selctx system_u:object_r:ssh_port_t:s0

Порядок прохождения пакета

Входящий:
  PREROUTING (raw  mangle  nat)
      
  routing decision
      ├─ для нас   INPUT  (mangle  filter  security  nat)  local process
      └─ транзит  FORWARD (mangle  filter  security)  POSTROUTING (mangle  nat)

Исходящий (local):
  local process  OUTPUT (raw  mangle  nat  filter  security)
                 POSTROUTING (mangle  nat)

Более полная схема — в Netfilter packet flow.


Источники

Цепочки (Chains) и таблицы в iptables | Aleksandr Suprun