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 вам необходимо разрешить прохождение трафика через машину, для этого в файле `/etc/sysctl.conf` расскоментировать или добавить следующую строчку: net.ipv4.ip_forward=1

Кратко о самом приципе работы:
Все пакеты делятся на три типа: входящие, исходящие и проходящие. Входящие - это те, которые были отправлены на этот компьютер, исходящие - отправленные из этого компьютера в сеть. А проходящие - это пакеты, которые просто должны быть пересланы дальше, например, если ваш компьютер выступает в качестве маршрутизатора. Соответственно в фильтре 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:

Посмотреть текущие правила (в основной таблице - filter)

iptables -L

Посмотреть текущие правила в таблице nat

iptables -t nat -L

Посмотреть текущие правила в таблице по умолчанию (filter) для цепочки INPUT

iptables -L INPUT

Очистить текущие правила:

iptables -F

Очистить текущие правила для цепочки INPUT

iptables -F INPUT

Блокировать все входящие пакеты с хоста 10.10.10.10

iptables -A INPUT -s 10.10.10.10 -j DROP

Блокировать все исходящие пакеты на адреса из сети 10.10.10.0/24

iptables -A OUTPUT -d 10.10.10.0/24 -j DROP

Блокировать все входящие соединения на 22 порт по протоколу tcp (ssh по умолчанию) с ip адреса 10.10.10.10

iptables -A INPUT -p tcp --dport 22 -s 10.10.10.10 -j DROP

Удали правило запрещающее исходящие пакеты на ip адрес 10.10.10.10, если оно есть, если такого правила нет, то увидим ошибку - удалять можно только те правила, что у нас присуствтуют

sudo iptables -D OUTPUT -d 10.10.10.10 -j DROP

Добавим правило для трансляции трафика из сети 10.0.0.0/24, проходящий через интерефейс eth0, при этом замена исходящего адреса будет произведена на тот, что стоит на интерфейсе eth0 (MASQUERADE):

iptables -t nat -A POSTROUTING -s 10.0.0.0/24 -o eth0 -j MASQUERADE

Добавим правило для трансляции трафика с хоста 192.168.40.1, в сеть 192.168.0.0/24, при этом ip адрес источника заменим на 192.168.0.72 :

iptables -t nat -A POSTROUTING -s 192.168.40.1/32 -d 192.168.0.0/24 -j SNAT --to-source 192.168.0.72

Проброс порта, для трафика, который приходит на интерфейс eth0 с портом назначения 80, на сервер с адресом 192.168.1.2:

iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to-destination 192.168.1.2

Проброс порта, для трафика, который приходит на ip адрес 1.2.3.4 с портом назначения 80, на сервер с адресом 192.168.1.2:

iptables -t nat -A PREROUTING --dst 1.2.3.4 -p tcp --dport 80 -j DNAT --to-destination 192.168.1.2

Обращаю внимание, что описанные выше два примера меняют только адрес назначения при прохождении через наш шлюз, обратная замена требует при прохождении трафика обратной заменя - т.е. правила по примеру первых с POSTROUTING
Также не забываем про добавление правил для прохождения трафика через нас, если мы поставили правило на дроп всего, что не разрешали

Разрешить проходить через нас трафику, приходящему с интерфейса eth0 и уходящему от нас из интерфейса eth1

iptables -A FORWARD -i eth0 -o eth1 -j ACCEPT

Запретить проходить через нас трафику, приходящему из сети 192.168.0.0/24 и уходящему в сеть 10.0.0.0/24

iptables -A FORWARD -s 192.168.0.0/24 -d 10.0.0.0/24 -j DROP

# Разрешаем входящий трафик для установленных соединений и их производных:
iptables -A INPUT -p all -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -p all -m state --state ESTABLISHED,RELATED -j ACCEPT

-A - добавляем правила для цепочек INPUT & OUTPUT
-p - указываем правилу что оно будет работать со всеми протоколами (all)
-m - явно указываем на определение состояния state
--state - указываем критерий для состояний ESTABLISHED и RELATED
-j - указываем действие ACCEPT (принимать все)

Все рассмотренные выше примеры будут присуствовать в системе только до перезагрузки, чтобы они применялись и после нам надо их сохранить. В случае Debian необходимо поставить пакет iptables-persistent

apt install iptables-persistent

При первой установке будет предложено сохранить все имеющиеся правила, в дальнейшем их можно добавлять в файл /etc/iptables/rule.v4 - для ipv4 и /etc/iptables/rule.v6 - для ipv6 Без этого пакета также доступны команды для сохранения и восстановления правил из файлов:

iptables-save
iptables-restore