iptables
iptables является firewall’ом по умолчанию для большого количества дистрибутивов (Debian, Ubuntu т.п.) Для управления используется команда iptables. В случае её отсутствия необходимо установить пакет iptables:
Debian, Astralinux:
apt install iptables
Altlinux:
apt-get install iptables
Ubuntu:
sudo apt install iptables
Перед установкой пакетов следует проверить не установлен ли уже другой вариант firewall (например в CentOS используется firewalld; в Debian 11 используется nfstables, но он по умолчанию выключен - systemctl status nftables)
Кратко о самом приципе работы:
Все пакеты делятся на три типа: входящие, исходящие и проходящие. Входящие - это те, которые были отправлены на этот компьютер, исходящие - отправленные из этого компьютера в сеть. А проходящие - это пакеты, которые просто должны быть пересланы дальше, например, если ваш компьютер выступает в качестве маршрутизатора.
Соответственно в фильтре iptables все пакеты делятся на три аналогичные цепочки:
- INPUT - обрабатывает входящие пакеты и подключения. Например, если какой-либо внешний пользователь пытается подключиться к вашему компьютеру по ssh или любой веб-сайт отправит вам свой контент по запросу браузера. Все эти пакеты попадут в эту цепочку;
- FORWARD - эта цепочка применяется для проходящих соединений. Сюда попадают пакеты, которые отправлены на ваш компьютер, но не предназначены ему, они просто пересылаются по сети к своей цели. Как я уже говорил, такое наблюдается на маршрутизаторах или, например, если ваш компьютер раздает wifi;
- OUTPUT - эта цепочка используется для исходящих пакетов и соединений. Сюда попадают пакеты, которые были созданы при попытке выполнить ping losst.pro или когда вы запускаете браузер и пытаетесь открыть любой сайт.
Кроме перечисленных выше, есть еще две дополнительные цепочки правил:
- PREROUTING - в эту цепочку пакет попадает перед обработкой iptables, система еще не знает куда он будет отправлен, в INPUT, OUTPUT или FORWARD;
- POSTROUTING - сюда попадают все проходящие пакеты, которые уже прошли цепочку FORWARD.
Для каждого типа пакетов можно установить набор правил, которые по очереди будут проверяться на соответствие с пакетом и если пакет соответствует, то применять к нему указанное в правиле действие. Правила образуют цепочку, поэтому input, output и forward называют цепочками, цепочками правил. Действий может быть несколько:
- ACCEPT - разрешить прохождение пакета дальше по цепочке правил;
- DROP - удалить пакет;
- REJECT - отклонить пакет, отправителю будет отправлено сообщение, что пакет был отклонен;
- LOG - сделать запись о пакете в лог файл;
- QUEUE - отправить пакет пользовательскому приложению. Правила могут проверять любые соответствия, например, по ip, по порту получателя или отправителя, заголовкам пакета и многому другому. Если пакет не подходит ни одному из правил, то к нему применяется действие по умолчанию, обычно ACCEPT.
Обращаю ваше внимание, что делать разрешительные или запретительные правила надо с осторожностью. Например если вы закроете весь входящий трафик, то к вам на хост просто ничего не будет попадать, в том числе ответы на ваш исходящий трафик (тот же ping). К разрешительным правилам тоже надо подходить с осторожностью, например для трафика по udp протоколу не предусматривается проверка на получение, поэтому разрешив его на вход вы можете словить трафик от не известно кого на сервисы, работающие по udp и с удивлением увидеть то, чего не ждали (тот же snmp)
Над цепочками правил в iptables есть еще один уровень абстракции, и это таблицы. В системе есть несколько таблиц, и все они имеют стандартный набор цепочек input, forward и output. Таблицы предназначены для выполнения разных действий над пакетами, например для модификации или фильтрации. Сейчас это для вас не так важно и будет достаточно знать что фильтрация пакетов iptables осуществляется в таблице filter. Но мы рассмотрим их все:
- raw - предназначена для работы с сырыми пакетами, пока они еще не прошли обработку;
- mangle - предназначена для модификации пакетов;
- nat - обеспечивает работу nat, если вы хотите использовать компьютер в качестве маршрутизатора;
- filter - основная таблица для фильтрации пакетов, используется по умолчанию
Общий вид команды:
iptables -t таблица действие_над_этим_правилом цепочка дополнительные_параметры действия_над_пакетами
Действия, которые мы может делать над элементами нашей таблицы:
- -A - добавить правило в цепочку;
- -С - проверить все правила;
- -D - удалить правило;
- -I - вставить правило с нужным номером;
- -L - вывести все правила в текущей цепочке;
- -S - вывести все правила;
- -F - очистить все правила;
- -N - создать цепочку;
- -X - удалить цепочку;
- -P - установить действие по умолчанию.
Дополнительные опции для правил:
- -p - указать протокол, один из tcp, udp, udplite, icmp, icmpv6,esp, ah, sctp, mh;
- -s - указать ip адрес устройства-отправителя пакета;
- -d - указать ip адрес получателя;
- -i - входной сетевой интерфейс;
- -o - исходящий сетевой интерфейс;
- -j - выбрать действие, если правило подошло.
Conntrack - механизм определения состояний Механизм определения состояний (state machine, connection tracking, conntrack) отдельная часть netfilter/iptables. Conntrack представляет из себя трассировщик соединений, путем отслеживания которых, conntrack определяет принадлежность сетевых пакетов к тому или иному соединению. После чего информация о принадлежности пакета предоставляется фаерволу.
Пакеты могут не отслеживаться, для этого пакет должен быть помечен действием NOTRACK в таблице raw, в которую входят цепочки правил PREROUTIG & OUTPUT.
Установив принадлежность пакета, происходит определение его дальнейшего пути. Существует четыре вида состояния соединений.
- NEW - Пакет принадлежит новому соединению и является первым для данного соединения.
- ESTABLISHED - Уже установленное соединение, пакет принадлежащий ему не является первым пакетом в соединении. Чтобы соединение стало установленным, требуется чтобы хост передал пакет и получил на него ответ от другого хоста, после получения ответа соединение считается установленным и становится ESTABLISHED. Соединения NEW и RELATED после получения ответа переходят в состояние ESTABLISHED.
- RELATED - Данное соединение и принадлежащие ему пакеты, связаны с соединением ESTABLISHED или являются его производным.
- INVALID - Неопределенное соединение, пакет не идентифицируется и не получает определенного статуса. Механизм conntrack позволяет не фильтровать лишний раз входящий трафик относящийся к уже установленным соединениям. Предоставляет возможность получения ответного трафика при полностью закрытом входе.
Примеры настройки iptables: