====== Netfilter ====== Наиболее полная статья: [[https://ru.wikibooks.org/wiki/Iptables]] **Netfilter** - межсетевой экран (брандмауэр), встроенный в ядро Linux с версии 2.4.\\ Разделение функциональности с помощью **таблиц**, позволило обрабатывать пакеты не только исходя из информации в самом пакете, но и учитывать данные о соединении в целом (**stateful - фильтрация**), контекст передачи.\\ Это одно из превосходств над своим предшественником - **ipchains** (в настоящее время устарел и не используется).\\ ===== Архитектура ===== {{ :linux:kernel:firewall:firewall.png?direct&400|}} **Правило** - состоит из критерия, действия и счетчика (критерий и действие можно пропускать, останется только счетчик).\\ **Цепочка** - последовательность правил, есть **пользовательские** (нижний регистр, только для своей таблицы) и **базовые** (стандартные, верхний регистр).\\ **Таблица** - совокупность цепочек, объединенных функциональным назначением (имена в нижнем регистре). Существует 5 типов **стандартных цепочек:** * **PREROUTING** - позволяет модифицировать пакеты до принятия решения о маршрутизации. * **INPUT** - пакеты, предназначенные самому хосту. * **FORWARD** - транзитные пакеты (они проходят: **PREROUTING**, **FORWARD** и **POSTROUTING**) * **OUTPUT** - пакеты, исходящие от самого хоста. * **POSTROUTING** - все исходящие пакеты в т.ч. транзитные. Цепочки организованы в **таблицы:** 4 стандартных (**raw**, **mangle**, **nat** и **filter**) и бывают 2 дополнительных (**security**, **rawpost**), цепочки с одинаковым названием, но в разных таблицах - независимые объекты. ===== Принцип работы ===== Все пакеты пропускаются через цепочки правил.\\ При прохождении к нему последовательно применяются правила этой цепочки, если он соответствует указанному **критерию**, применяется **действие** (в т.ч. переход к другой цепочке, например пользовательской).\\ Действие может быть **терминальным** (заканчивающее обработку в данной цепочке (ACCEPT, REJECT)) или **нетерминальным** (MARK, TOS).\\ Действие по умолчанию обязательно **терминальное**. ===== Таблицы ===== ==== raw ==== Выполнение действий с пакетами до их обработки в [[:linux:firewall:conntrack|conntrack]]. __Цепочки__: **PREROUTING**, **OUTPUT**.\\ __Действия__: * **NOTRACK** - предотвратить обработку в [[:linux:firewall:conntrack|conntrack]]. * **CT** - позволяет задать различные настройки для [[:linux:firewall:conntrack|conntrack]]. * **RAWDNAT** - позволяет выполнить проброс адресов и портов "сырым" методом, на уровне пакетов а не соединения, без conntrack и учета состояния соединения. ==== rawpost ==== Является следствием реализации **RAWDNAT** в таблице **raw** т.е. для обратной пересылки проброшенных адресов (портов) на уровне пакетов. __Цепочки__: **POSTROUTING**.\\ __Действия__: **RAWSNAT** - обратный, "сырой" проброс адресов (портов). ==== mangle ==== Классификация и маркировка пакетов и соединений, а также модификация заголовков пакетов (TTL и TOS). __Цепочки__: все 5 стандартных цепочек.\\ __Действия__: * **TOS** - Type of Service, тип облуживания, позволяет приоритизировать IP-трафик на сетевых маршрутизаторах. * **DSCP** - относится к TOS. * **TTL** - время жизни пакета (**--ttl-**(**set|inc|dec**)).\\ **Пример:** Делает наш шлюз невидимым для большинства трассировщиков (автоматическое уменьшение поля системой происходит после prerouting но до forward => поместив этот код в forward, сделаем невидимым следующий на нами шлюз): # iptables -t mangle -I PREROUTING -j TTL --ttl-inc 1 * **HL** - аналог TTL в IPv6. * **MARK** - маркировка пакета. * **CONNMARK** - маркировка соединения. * **CLASSIFY** - устанавливает CBQ-класс для обработки шейпером. * **TCPMSS** - устанавливает максимальный размер TCP-сегмента (MTU). * **TCPOPTSTRIP** - удаление заданных TCP-опций из заголовка * **TPROXY** - реализует механизм полностью прозрачного проксирования. Заголовки пакетов никак не модифицируются, в т.ч. никак не меняются IP-адреса (с обеих сторон). ==== nat ==== Stateful-преобразование сетевых адресов и портов. __Цепочки__: **PREROUTING**, **OUTPUT** и **POSTROUTING**.\\ __Действия__: * **MASQUERADE** - подменяет адрес источника исходящих пакетов (например внешним IP адресом шлюза). * **SNAT** - Source Network Address Translation, аналогично MASQUERADE, но позволяет указать внешний адрес статически, что бы он не определялся каждый раз заново. * **DNAT** - Destination Network Address Translation, подменяет адрес назначения для входящих пакетов, позволяя пробрасывать адреса (порты) внутрь локальной сети. * **REDIRECT** - подменяет номер порта в (TCP/UDP)-пакете, и адрес назначения на свой собственный. * **SAME** - аналогично DNAT (SNAT), только IP адрес для подмены остается постоянным для клиентов. * **NETMAP** - позволяет пробросить целую сеть. * **MIRROR** - меняет местами адреса источника и получателя и отправляет пакеты). Создано исключительно для демонстрационных целей. ==== filter ==== Фильтрация трафика, т.е. запрет/разрешение пакетов (соединений). __Цепочки__: **INPUT**, **FORWARD** и **OUTPUT**.\\ __Действия__: * **ACCEPT** - пропуск пакета. * **REJECT** - заблокировать и сообщить источнику об отказе (можно указать вариант сообщения). * **DROP** - заблокировать без сообщений. += Модуль **xtables-addons:** * **STEAL** - аналогично DROP, но в случае с исходящим пакетом, не сообщает приложению об ошибке. * **TARPIT** - "Подвесить" TCP соединение, используется например при борьбе с DoS-атаками. * **DELUDE** - создает видимость открытого TCP-порта (отвечает SYN/ACK и больше ничего). * **CHAOS** - случайно выбирает REJECT/TARPIT либо REJECT/DELUDE. ==== security ==== Предназначена для изменения маркировки (SELinux).\\ Все цепочки проходят после одноименных в таблице **filter**. __Цепочки__: **INPUT**, **FORWARD** и **OUTPUT**.\\ __Действия__: **SECMARK**, **CONNSECMARK**.