iptables — userspace-фронтенд к netfilter в ядре Linux. Структура: таблицы → цепочки → правила. Цепочка привязана к одному из netfilter-хуков: PREROUTING, INPUT, FORWARD, OUTPUT, POSTROUTING.
С 2014 года рекомендуемая замена —
nftables(nft).iptablesвсё ещё широко используется, но в дистрибутивах часто реализован черезiptables-nftshim поверх nftables.
Таблицы и встроенные цепочки
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
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
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) → local process
└─ транзит → FORWARD (mangle → filter → security) → POSTROUTING (mangle → nat)
Исходящий (local):
local process → OUTPUT (raw → mangle → nat → filter → security)
→ POSTROUTING (mangle → nat)
Более полная схема — в Netfilter packet flow.