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

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

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

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

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

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

Установка 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.

Зарегистрируйтесь и начните пользоваться
сервисами Timeweb Cloud прямо сейчас

15 лет опыта
Сосредоточьтесь на своей работе: об остальном позаботимся мы
165 000 клиентов
Нам доверяют частные лица и компании, от небольших фирм до корпораций
Поддержка 24/7
100+ специалистов поддержки, готовых помочь в чате, тикете и по телефону