iptables – теория
Netfilter

Сетевые пакеты поступают в сетевой интерфейс, настроенный на стек TCP/IP и после некоторых простых проверок ядром (например, контрольная сумма) проходят последовательность цепочек (chain) (обозначены пунктиром). Пакет обязательно проходит первоначальную цепочку PREROUTING. После цепочки PREROUTING, в соответствии с таблицей маршрутизации, проверяется кому принадлежит пакет и, в зависимости от назначения пакета, определяется куда он дальше попадет (в какую цепочку). Если пакет НЕ адресован (в TCP пакете поле адрес получателя – НЕ локальная система) локальной системе, то он направляется в цепочку FORWARD, если пакет адресован локальной системе, то направляется в цепочку INPUT и после прохождения INPUT отдается локальным демонам/процессам. После обработки локальной программой, при необходимости формируется ответ. Ответный пакет пакет отправляемый локальной системой в соответствии с правилами маршрутизации направляется на соответствующий маршрут (хост из локальной сети или адрес маршрутизатора) и направляется в цепочку OUTPUT. После цепочки OUTPUT (или FORWARD, если пакет был проходящий) пакет снова сверяется с правилами маршрутизации и отправляется в цепочку POSTROUTING. Может возникнуть резонный вопрос: почему несколько раз пакет проходит через таблицу маршрутизации? (об этом – ниже).
Каждая цепочка, которую проходит пакет состоит из набора таблиц (table) (обозначены овалами). Таблицы в разных цепочках имеют одинаковое наименование, но тем не менее никак между собой не связаны. Например таблица nat в цепочке PREROUTING никак не связана с таблицей nat в цепочке POSTROUTING. Каждая таблица состоит из упорядоченного набора (списка) правил. Каждое правило содержит условие, которому должен соответствовать проходящий пакет и действия к пакету, подходящему данному условию.
Проходя через серию цепочек пакет последовательно проходит каждую таблицу (в указанном на иллюстрации порядке) и в каждой таблице последовательно сверяется с каждым правилом (точнее сказать – с каждым набором условий/критериев в правиле), и если пакет соответствует какому-либо критерию, то выполняется заданное действие над пакетом. При этом, в каждой таблице (кроме пользовательских) существует заданная по-умолчанию политика. Данная политика определяет действие над пакетом, в случае, если пакет не соответствует ни одному из правил в таблице. Чаще всего – это действие ACCEPT, чтобы принять пакет и передать в следующую таблицу или DROP – чтобы отбросить пакет. В случае, если пакет не был отброшен, он завершает свое путешествие по ядру системы и отправляется в сетевую карту сетевой интерфейс, которая подходит по правилам маршрутизации.
Компоненты
- xtables
iptables
ip6tables
arp_tables - nf_conntrack
- ebtables
Utils
- iptables/ip6tables/ip(6)tables-(save|restore)
- ipset
- ebtables
- arptables
- firewalld
В основном фильтрация L3-L4 уровней
Пакетный фильтр – это набор правил.
Каждое правило – это набор таблиц и цепочек.
Каждая таблица состоит из цепочек.
Каждая цепочка – упорядоченный набор правил, просматриваемый начиная с первого.
Каждое правило состоит из
- критерий срабатывания
- действие
Каждое правило имеет счетчик срабатываний.
raw – изначальная обработка, до conntrack
mangle – модификация заголовков и маркировка пакетов
nat – трансляция адресов
filter – фильтры
security – работа с SELinux
min запросов в http пакете – 6. SYN –> ACK, ACK-SYN –>, SYN-ACK
Критерии срабатывания L3
-i/–in-interface Входящий интерфейс
-o/–out-interface Исходящий интерфейс
-s/–source Адрес источника
-d/–destination Адрес назначения
-p/–protocol IP-Протокол (tcp, udp, icmp…)
-f/–fragment Является ли фрагментом (2+ в серии)
Критерии срабатывания L4
TCP/UDP
–sport port[:port] порт или диапазон портов
–dport port[:port] порт или диапазон портов
TCP
–tcp-flags mask flags (SYN,ACK,RST,FIN SYN) Флаги TCP
–syn взведен SYN
ICMP
–icmp-type тип icmp-пакета
Действия
ACCEPT – Принять пакет
DROP – Отбросить пакет
REJECT – Отбросить и сообщить источнику icmp-сообщением
RETURN – Вернуться в вішестоящюю цепочку или применить правило поумолчанию
LOG
chain_name – Перейти в цепочку chain_name
DNAT – Destination NAT
SNAT – Source NAT
MASQUARADE – Source NAT для динамически конфигурируемых интерфейсов
SET – Добавление/Удаление адреса в ipset
Дополнительные модули срабатывания
conntrack/state – критерии срабатывания основанные на состоянии соединения
multiport – критерий срабатывания, позволяющий указать список портов, а не диапазон
iprange – критерий срабатывания, который позволяет указать ip-range вместо cidr-префикса
mark/connmark – основан на маркировке пакета/соединения
set – критерий основанный на ipset
u32 – гибкий критерий, позволяющий работать напрямую с заголовками пакетов и отдельными битами
conntract
Подсистема отслеживания состояний соединений. Базово соединения имеют состояния:
NEW – новое соединение. Отбираются пакеты устанавливающие соединения.
ESTABLISHED – установленное соединение. Отбираются пакеты не !syn/syn+ack, !rst/fin, которые относятся к уже отслеживаемым соединениям
RELATED – относятся к другому, уже установленному соединению (passive ftp, icmp-messages)
INVALID – пакеты принадлежность которых к отслеживаемым соединения установить не удалось
Подсистема очень удобна при невысокой нагрузке. При высокой же требует настройки, иначе может приводить к потере пакетов или связности в целом из-за переполнения таблицы conntrack или слишком большого ее размера.
В HL рекомендуется отключать, так как просмотр таблиц добавляет время к обработке пакета повышая latency приложения.
В этой системе, размер таблицы поумолчанию, 15тыс соединений:
# sysctl -a | grep conntrack
net.nf_conntrack_max = 15624
Посмотреть отслеживаемые соединения:
# cat /proc/net/nf_conntrack
ipv4 2 tcp 6 431986 ESTABLISHED src=192.168.1.1 dst=192.168.1.126 sport=50838 dport=179 src=192.168.1.126 dst=192.168.1.1 sport=179 dport=50838 [ASSURED] mark=0 secctx=system_u:object_r:unlabeled_t:s0 zone=0 use=2
ipv4 2 tcp 6 429361 ESTABLISHED src=192.168.113.1 dst=192.168.1.64 sport=58442 dport=22 src=192.168.1.64 dst=192.168.113.1 sport=22 dport=58442 [ASSURED] mark=0 secctx=system_u:object_r:unlabeled_t:s0 zone=0 use=2
ipv4 2 tcp 6 431999 ESTABLISHED src=192.168.113.1 dst=192.168.113.63 sport=38272 dport=22 src=192.168.113.63 dst=192.168.113.1 sport=22 dport=38272 [ASSURED] mark=0 secctx=system_u:object_r:unlabeled_t:s0 zone=0 use=2
ipv4 2 tcp 6 429362 ESTABLISHED src=192.168.113.1 dst=192.168.1.126 sport=53900 dport=22 src=192.168.1.126 dst=192.168.113.1 sport=22 dport=53900 [ASSURED] mark=0 secctx=system_u:object_r:unlabeled_t:s0 zone=0 use=2
ipv4 2 udp 17 20 src=192.168.1.64 dst=195.78.244.34 sport=60897 dport=123 src=195.78.244.34 dst=192.168.113.63 sport=123 dport=60897 mark=0 secctx=system_u:object_r:unlabeled_t:s0 zone=0 use=2
ipv4 2 udp 17 1 src=192.168.113.11 dst=192.168.113.255 sport=64768 dport=1947 [UNREPLIED] src=192.168.113.255 dst=192.168.113.11 sport=1947 dport=64768 mark=0 secctx=system_u:object_r:unlabeled_t:s0 zone=0 use=2
ipv4 2 tcp 6 431998 ESTABLISHED src=192.168.1.64 dst=192.168.1.1 sport=58718 dport=179 src=192.168.1.1 dst=192.168.1.64 sport=179 dport=58718 [ASSURED] mark=0 secctx=system_u:object_r:unlabeled_t:s0 zone=0 use=2
Таблицы
- raw – изначальная обработка, до contrack
- mangle – модификация заголовков и марктровка пакетов
- nat – трансляция адресов
- filter – фильтры
- security – работа с SELinux
Цепочки
- PREROUTING – до принятия решения о маршрутизации
- POSTROUTING – после принятия решения о маршрутизации
- OUTPUT – пакеты сгенерированы локальными приложениями
- INPUT – пакеты предназначены локальной системе
- FORWARD – пакеты проходящие через систему
1. Таблица raw
Предназначена для базовой обработки пакетов до conntrack, в частности для управления conntrack в отношении некоторых пакетов
Цепочки:
- PREROUTING
- OUTPUT
Действия:
- NOTRACK – отключить conntrack для пакетов попадающих в правило
- CT – настроить работу с модулем conntrack, включает NOTRACK через –notrack
- DROP – отбросить пакет
DDOS трафик фильтровать лучше в raw, так как эта таблица ближе всего к сетевому интрефейсу.
2. Таблица mangle
Предназначена для маркировки и классификации пакетов, модификации заголовков (tos, mss, ttl)
Цепочки:
- PREROUTING
- INPUT
- FORWARD
- OUTPUT
- POSTROUTING
Действия:
- TTL – установить ttl
- MARK/CONNMARK – установить метку (fwmark) пакета/соединения
- CLASSIFY – классифицировать пакет для обработки в шейпере
- TCPMSS – установить TCP Maximum Segment Size (если не работает PMTU disco)
3. Таблица nat
Предназначена для манипуляций с адресами источника/назначения
Цепочки:
- PREROUTING
- INPUT
- OUTPUT
- POSTROUTING
Действия:
- SNAT/MASQUERADE – Source NAT
- DNAT – Destination NAT
- REDIRECT – подмена dst_ip:dst_port на свои собственные (частный случай DNAT)
DNAT – transparent ptroxy
4. Таблица filter
Основная таблица где происходит фильтрация пакетов
Цепочки:
- INPUT
- FORWARD
- OUTPUT
Действия:
- ACCEPT
- REJECT
- DROP
5. Таблица securuty
Предназначена для работы совместнос SELinux
Цепочки:
- INPUT
- FORWARD
- OUTPUT
Действия:
- SECMARK/CONNSECMARK – установить SELinux context для пакета/соединения
Еще наглядные схемы работы:

