Бесплатная миграция IT-инфраструктуры в облако

Обзор и практическое использование Iptables

Александр Бархатов
Александр Бархатов
Технический писатель
31 января 2024 г.
3030
13 минут чтения
Средний рейтинг статьи: 5

Для управления сетевым экраном в дистрибутивах Linux присутствует утилита Iptables.

Iptables — популярная утилита командной строки для взаимодействия со встроенным в ядро Linux брандмауэром (он же firewall) под названием Netfilter, который включен в ядро Linux начиная с версии 2.4. Утилита была выпущена в 1998 году и на текущий момент присутствует практически в любом дистрибутиве Linux.

В данной статье мы рассмотрим принцип работы Iptables и разберем практические примеры использования.

cloud

Установка Iptables

Как уже было упомянуто ранее, Iptables присутствует практически в любом дистрибутиве Linux, как в самых распространенных (Ubuntu, Debian, RHEL), так и в таких дистрибутивах, как openSUSE, Arch Linux, Gentoo и т.д. Для начала проверим, присутствует ли Iptables на сервере. Для этого необходимо вывести версию утилиты, выполнив команду:

iptables --version

Image3

Если в ответе отобразилась версия, то Iptables уже присутствует в системе. Если же в ответ вернулось сообщение iptables: command not found, то утилиту необходимо установить вручную. Ниже описана установка Iptables с помощью пакетных менеджеров в различных дистрибутивах семейства Linux. Также Iptables можно скомпилировать и установить из исходного кода.

APT

Для дистрибутивов на основе APT (Ubuntu/Debian/Linux Mint/Kali Linux) необходимо выполнить команду:

apt -y install iptables

RPM

Для дистрибутивов на основе RPM (CentOS, Fedora, Red Hat Enterprise Linux, ALT Linux) необходимо выполнить одну из команд ниже:

Для пакетного менеджера YUM:

yum -y install iptables

Для пакетного менеджера DNF:

dnf -y install iptables

Pacman

Для дистрибутивов на основе Pacman (Arch Linux, ArchLabs, Manjaro) необходимо выполнить команду:

pacman -S iptables

Все команды необходимо выполнить от имени пользователя root или от обычного пользователя, но с правами sudo.

Принцип работы Iptables

В своей работе Iptables использует механизм правил (rules). Правила контролируют входящий и исходящий трафики и состоят из цепочек, которые разрешают или блокируют трафик.

Более подробный алгоритм работы Iptables описан ниже:

  1. Сетевые пакеты проходят через последовательность(и) цепочек;
  2. Когда сетевой пакет проходит через цепочку, к нему применяются все правила содержащиеся в текущей цепочки. В процессе прохождения сетевого пакета, происходит его сверка на соответствие ранее заданным критериям. Если пакет не соответствует критерию, то к нему применяется определенное действие. Под действием подразумевают какую-нибудь операцию, например, на запрет или разрешение трафика.

Терминология Iptables

При работе с Iptables можно столкнуться со следующими терминами:

  • Цепочка — последовательность или набор правил, которые определяют как будет обработан трафик;
  • Правила — определенные действия. Содержат критерии и цель;
  • Модуль — дополнительный функционал который добавляет новые опции в Iptables. Благодаря чему можно создавать более обширные и сложные правила для фильтрации трафика;
  • Таблица — это абстракция в Iptables, в которой хранятся цепочки правил. В Iptables присутствуют следующие таблицы: Security, Raw, NAT, Filter, Mangle. Описание каждой таблицы приведено ниже.

Описание таблиц Iptables

  • Таблица Filter — таблица по умолчанию. Использует 3 цепочки: OUTPUT, FORWARD, INPUT:

INPUT

Управляет входящими соединениями. В качестве примера можно привести использование протокола SSH.

FORWARD

Управляет входящими соединениями, которые не поступают локально. Например, такая ситуация обычно происходит на маршрутизаторе.

OUTPUT

Управляет исходящими соединений. В качестве примера можно привести переход к какому-либо сайту при помощи браузера.

  • Таблица NAT. Использует 3 цепочки: PREROUTING, POSTROUTING, OUTPUT:

PREROUTING

Определяет IP-адрес назначения пакета.

POSTROUTING

Изменяет IP-адрес источника.

OUTPUT

Цепочка изменяет целевой адрес пакетов.

  • Таблица Mangle предназначена для изменения IP-заголовков пакета.
  • Таблица Raw предназначена для предоставления механизма для маркировки пакетов, с целью отказа от отслеживания соединений.

  • Таблица Security предназначена для взаимодействия с различными механизмами безопасностями ОС, например с SELinux.

Правила

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

Правила состоят из критериев и цели. Критерии правил сопоставляются, а действия применяются к целевому объекту. Если критерий не удается сопоставить, то происходит обработка следующего правила. Решения, которые принимает Iptables, называют действиями. В таблице ниже приведен список основных действий с соединениями:

ACCEPT

Открывает (разрешает) соединение.

DROP

Закрывает соединение без отправки ответа клиенту.

QUEUE

Отправляет пакет в очередь для дальнейшего взаимодействия со сторонним приложением.

RETURN

Возвращает пакет на одно правило назад, прерывая обработку текущего правила.

REJECT

Блокирует соединение. В ответ будет отправлено сообщение об ошибке.

DENY

Отбрасывает входящее соединение. Отправка ответа не предусмотрена.

ESTABLISHED

Соединение установлено так как поступил уже не первый пакет в рамках данного сеанса.

Практическое применение Iptables

Рассмотрим использование Iptables на практике. Все перечисленные ниже команды будут работать на любом Linux-дистрибутиве. Все команды Iptables необходимо выполнить от имени пользователя root или от имени обычного пользователя, но с правами sudo.

Для того чтобы вывести текущую конфигурацию (включая все доступные правила) Iptables, достаточно выполнить одну команду:

iptables --list

85c00f9e 64b3 4cea 9647 13304c7bb8c6

Дополнительно доступен более расширенный формат вывода, в котором отображается количество и размер обработанных пакетов в цепочках INPUT, FORWARD, OUTPUT, а также вывод IP-адреса и номеров портов в числовом формате:

iptables --line-numbers -L -v -n

Ee0b2682 A15a 4737 Ad14 F4f1ebefd20e

Также можно указать конкретную цепочку, чтобы отобразить правила только для данной цепочки. Например:

iptables -L INPUT
iptables -L FORWARD
iptables -L OUTPUT

При первом использование Iptables не создает и не хранит какие-либо цепочки правил, поэтому вывод команд выше будет пустым.

Блокировка IP-адресов

Чтобы заблокировать требуемый IP-адрес, нужно добавить правило в цепочку INPUT. Также необходимо указать таблицу. В команде ниже имя таблицы задано явно. Если ключ t не используется, то правило попадает в таблицу по умолчанию — Filter. В качестве примера заблокируем IP-адрес 10.0.36.126:

iptables -t filter -A INPUT -s 10.0.36.126 -j REJECT

При блокировке конкретного IP-адреса были использованы такие опции, как:

  • t — указывает таблицу, для которой будет применимо правило;
  • A — указывает, в какую цепочку необходимо добавить правило. В данном примере указана цепочка INPUT;
  • s — указывает целевой объект (источник), к которому необходимо применить действие;
  • j — указывает действие, которое должно быть выполнено. В данном примере трафик будет отклонен (действие REJECT).

Чтобы заблокировать всю подсеть сразу, ее необходимо указать в опции s:

iptables -A INPUT -s 10.0.36.0/24 -j REJECT

 Также маску подсети можно задать в полном формате:

iptables -A INPUT -s 10.0.36.0/255.255.255.0 -j REJECT

При необходимости блокировки исходящего трафика на конкретный IP-адрес, используется цепочка OUTPUT и опция d:

iptables -A OUTPUT -d 10.0.36.126 -j REJECT

Блокировка портов

Производить блокировку можно по портам. Для этого используется опция dport, в которой указывается порт необходимой службы. Также вместо порта можно задать имя службы. Обязательным условием является указание конкретного протокола. В качестве примера заблокируем SSH-соединения с хоста 10.0.36.126 для протокола TCP:

iptables -A INPUT -p tcp --dport ssh -s 10.0.36.126 -j REJECT

Для протокола UDP команда следующая:

iptables -A INPUT -p udp --dport ssh -s 10.0.36.126 -j REJECT

Команда ниже также заблокирует SSH-соединения с хоста 10.0.36.126, но вместо имени используется порт сервиса SSH:

iptables -A INPUT -p tcp --dport 22 -s 10.0.36.126 -j REJECT

Для блокировки SSH-соединения с любого IP-адреса для протокола TCP необходимо выполнить команду:

iptables -A INPUT -p tcp --dport ssh -j DROP

Разрешение IP-адреса

Для того чтобы открыть (разрешить) трафик для определенного IP-адреса, необходимо использовать действие ACCEPT. В примере ниже разрешаем весь трафик к серверу для клиента с IP-адресом 10.0.36.126:

iptables -A INPUT -s 10.0.36.126 -j ACCEPT

Чтобы разрешить трафик с определенного диапазона IP-адресов, например с 10.0.36.126 до 10.0.36.156, необходимо воспользоваться модулем iprange и опцией --src-range:

iptables -A INPUT -m iprange --src-range 10.0.36.126-10.0.36.156 -j ACCEPT
  • iprange — модуль, предназначенный для работы с диапазоном IP-адресов.
  • --src-range — опция, которая задает диапазон IP-адресов отправителя.

Для того чтобы выполнить обратную операцию (разрешить весь трафик от сервера к определенным диапазонам IP-адресов — с 10.0.36.126 до 10.0.36.156), необходимо воспользоваться опцией --dst-range:

iptables -A OUTPUT -m iprange --dst-range 10.0.36.126-10.0.36.156 -j ACCEPT
  • --dst-range — опция, которая задает диапазон IP-адресов получателя.

Открытие портов

Для того чтобы открыть порт, необходимо задать протокол через опцию p. В качестве протокола поддерживаются такие значения, как tcp, udp и т.д. С полным списком поддерживаемых протоколов можно ознакомиться в файле /etc/protocols:

cat /etc/protocols

Порт задается в опции dport. Как и при блокировке портов, можно использовать как числовые значения, так и имена сервисов. Для открытия используется действие ACCEPT

Откроем 22 порт по протоколу TCP для адреса 10.0.36.126:

iptables -A INPUT -p tcp --dport 22 -s 10.0.36.126 -j ACCEPT

Для того чтобы открыть сразу несколько портов, используется модуль multiport и опция dports, где через запятую перечислены порты, которые должны быть открыты. Откроем порты 22, 80, 443 по протоколу TCP для адреса 10.0.36.126:

iptables -A INPUT -p tcp -m multiport --dports 22,80,443 -s 10.0.36.126 -j ACCEPT
  • multiport — модуль, предназначенный для работы с несколькими портами одновременно.
  • dports — опция для работы с несколькими портами. Не путать с опцией dport, которая поддерживает работу только с одним портом.

Запрет ICMP-трафика

Одна из популярных функций в Iptables — запрет на прохождение ICMP-трафика, который генерирует утилита ping. Для того чтобы запретить входящий ICMP-трафик, необходимо выполнить следующую команду: 

iptables -A INPUT -j DROP -p icmp --icmp-type echo-request

Image7

 При запуске команды ping команда выше не будет отображать ошибку. Если необходимо добавить сообщение об ошибке «Destination Port Unreachable», то в команде необходимо заменить действие DROP на REJECT:

iptables -A INPUT -j REJECT -p icmp --icmp-type echo-request

Без Названия

Разрешение ICMP-трафика

Чтобы разрешить ранее заблокированный трафик ICMP, необходимо выполнить команду:

iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT

Также стоит отметить следующее: если ICMP-трафик ранее был заблокирован при помощи команды:

iptables -A INPUT -j DROP -p icmp --icmp-type echo-request

а затем разрешен с помощью команды:

iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT

то он всё равно будет заблокирован, так как правило блокировки ICMP трафика будет первым в цепочке INPUT.

Запрет трафика по MAC-адресу

Помимо использования IP-адресов, трафик можно заблокировать, используя MAC-адрес устройства. Ниже предоставлен пример блокировки трафика для устройства с MAC-адресом 00:0c:29:ed:a9:60:

iptables -A INPUT -m mac --mac-source 00:0c:29:ed:a9:60 -j DROP
  • mac — модуль, предназначенный для работы с MAC-адресами устройств.
  • mac-source — опция, в которой задается MAC-адрес устройства.

Разрешение трафика по MAC-адресу

Чтобы разрешить трафик с определенного MAC-адреса, необходимо выполнить следующую команду:

iptables -A INPUT -m mac --mac-source 00:0c:29:ed:a9:60 -j ACCEPT

Блокировка по MAC-адресу с помощью Iptables будет работать только в том случае, если MAC-адреса расположены в одном и том же сегменте сети. Для этих целей лучше всего подойдет блокировка по IP-адресу.

Разрешение трафика на интерфейсе обратной петли (Loopback)

Трафик на интерфейсе обратной петли тоже можно контролировать. Чтобы разрешить входящий трафик, к интерфейсу Loopback необходимо выполнить команду:

iptables -A INPUT -i lo -j ACCEPT

Для исходящего трафика команда выглядит следующим образом:

iptables -A OUTPUT -o lo -j ACCEPT

Ограничение сетевого доступа по расписанию

Одной из интересных функций которые присутствуют в Iptables, является временное ограничение или разрешение трафика до необходимых сервисов или портов. По сути, это означает использование расписания. Предположим, мы хотим разрешить входящий доступ по протоколу SSH, который будет доступен только с понедельника по пятницу с 9 утра до 6 вечера. Команда будет выглядеть следующим образом:

iptables -A INPUT -p tcp --dport 22 -m time --timestart 09:00 --timestop 18:00 --weekdays Mon,Tue,Wed,Thu,Fri -j ACCEPT
  • time — модуль для работы с временем;
  • timestart — время, когда правило начнет работу;
  • timestop — время завершения работы правила;
  • weekdays — указываются дни недели, перечисленные через запятую. в которых будет работать заданное правило. Поддерживаются следующие значения: Mon, Tue, Wed, Thu, Fri, Sat, Sun. Также можно использовать цифры от 1 до 7. 

Сохранение правил в Iptables

По умолчанию, правила, создаваемые пользователем не сохраняются автоматически. Это означает, что после перезагрузки или выключения сервера правила удаляются. Чтобы сохранять правила, необходимо установить пакет iptables-persistent. Для этого воспользуемся командой:

apt -y install iptables-persistent

Image9

В процессе установки появится два диалоговых окна, в которых система предложит сохранить текущие правила в файл /etc/iptables/rules.v4 для IPv4:

Image2

и в файл /etc/iptables/rules.v6 для IPv6:

Image5

Чтобы сохранить все правила для протокола IPv4, необходимо выполнить команду:

iptables-save > /etc/iptables/rules.v4

Для протокола IPv6-правил команда будет следующей:

ip6tables-save > /etc/iptables/rules.v6

Данный метод обладает существенным преимуществом — сохраненные правила можно восстановить из файла. Это может пригодиться, например, при переносе правил на другой хост. Для того чтобы восстановить ранее сохраненные правила, необходимо выполнить команду:

iptables-restore < /etc/iptables/rules.v4
  • /etc/iptables/rules.v4 — путь до файла с ранее сохраненными правилами.

При выполнении данной команды на другом хосте необходимо также заранее перенести файл с правилами и только потом выполнять команду.

Удаление правил в Iptables

Ранее созданные правила в Iptables можно удалять. Для этого можно воспользоваться несколькими способами.

Удаление конкретного правила

Первый способ основан на удалении конкретного правила из одной цепочки с использованием порядкового номера этого правила. Для отображения нумерации правил воспользуемся командой:

iptables -L --line-numbers

Image10

Как можно увидеть, в цепочке INPUT у нас есть 2 правила, которые открывают порты 80 и 443 по протоколу TCP для адресов 10.0.36.126  (правило под номером 1 ) и для 10.0.36.127 (правило под номером 2). Удалим правило под номером 2 с помощью команды:

iptables -D INPUT 2

Повторно выведем список всех правил в системе:

iptables -L --line-numbers

Image1

Правило под номером 2 было успешно удалено.

Удаление всех правил одной цепочки

Также существует еще один способ который заключается в удалении сразу всех правил для конкретной цепочки. Например, для цепочки OUTPUT команда будет следующей:

iptables -F OUTPUT

Удаление всех правил

Существует также способ, позволяющий удалить правила из всех цепочек сразу. Для этого достаточно выполнить:

iptables -F

При выполнении данной команды необходимо проявлять повышенную осторожность, так как можно удалить необходимые вам правила.

Подготовили для вас выгодные тарифы на облачные серверы

Заключение

Подводя итог, можно уверенно сказать что Iptables идеально подходит для управления встроенным firewall в ОС семейства Linux. Благодаря обширному функционалу и встроенным модулям, можно гибко настраивать правила для контролирования трафика в вашей сети.

Ознакомиться более подробно с Iptables можно на официальном сайте программы, а также при помощи команды man iptables в операционных системах на основе Linux.

Хотите внести свой вклад?
Участвуйте в нашей контент-программе за
вознаграждение или запросите нужную вам инструкцию
img-server
31 января 2024 г.
3030
13 минут чтения
Средний рейтинг статьи: 5
Пока нет комментариев