Обзор и практическое использование Iptables
Для управления сетевым экраном в дистрибутивах 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
Если в ответе отобразилась версия, то 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 описан ниже:
- Сетевые пакеты проходят через последовательность(и) цепочек;
- Когда сетевой пакет проходит через цепочку, к нему применяются все правила содержащиеся в текущей цепочки. В процессе прохождения сетевого пакета, происходит его сверка на соответствие ранее заданным критериям. Если пакет не соответствует критерию, то к нему применяется определенное действие. Под действием подразумевают какую-нибудь операцию, например, на запрет или разрешение трафика.
Терминология Iptables
При работе с Iptables можно столкнуться со следующими терминами:
- Цепочка — последовательность или набор правил, которые определяют как будет обработан трафик;
- Правила — определенные действия. Содержат критерии и цель;
- Модуль — дополнительный функционал который добавляет новые опции в Iptables. Благодаря чему можно создавать более обширные и сложные правила для фильтрации трафика;
- Таблица — это абстракция в Iptables, в которой хранятся цепочки правил. В Iptables присутствуют следующие таблицы: Security, Raw, NAT, Filter, Mangle. Описание каждой таблицы приведено ниже.
Описание таблиц Iptables
-
Таблица
Filter
— таблица по умолчанию. Использует 3 цепочки:OUTPUT
,FORWARD
,INPUT
:
|
Управляет входящими соединениями. В качестве примера можно привести использование протокола SSH. |
|
Управляет входящими соединениями, которые не поступают локально. Например, такая ситуация обычно происходит на маршрутизаторе. |
|
Управляет исходящими соединений. В качестве примера можно привести переход к какому-либо сайту при помощи браузера. |
-
Таблица
NAT
. Использует 3 цепочки:PREROUTING
,POSTROUTING
,OUTPUT
:
|
Определяет IP-адрес назначения пакета. |
|
Изменяет IP-адрес источника. |
|
Цепочка изменяет целевой адрес пакетов. |
- Таблица
Mangle
предназначена для изменения IP-заголовков пакета. -
Таблица
Raw
предназначена для предоставления механизма для маркировки пакетов, с целью отказа от отслеживания соединений. -
Таблица
Security
предназначена для взаимодействия с различными механизмами безопасностями ОС, например с SELinux.
Правила
Правила, используемые в Iptables, предназначены для контроля входящего и исходящего сетевого трафика. Также с помощью правил можно настраивать проброс портов и создавать правила для разных протоколов.
Правила состоят из критериев и цели. Критерии правил сопоставляются, а действия применяются к целевому объекту. Если критерий не удается сопоставить, то происходит обработка следующего правила. Решения, которые принимает Iptables, называют действиями. В таблице ниже приведен список основных действий с соединениями:
|
Открывает (разрешает) соединение. |
|
Закрывает соединение без отправки ответа клиенту. |
|
Отправляет пакет в очередь для дальнейшего взаимодействия со сторонним приложением. |
|
Возвращает пакет на одно правило назад, прерывая обработку текущего правила. |
|
Блокирует соединение. В ответ будет отправлено сообщение об ошибке. |
|
Отбрасывает входящее соединение. Отправка ответа не предусмотрена. |
|
Соединение установлено так как поступил уже не первый пакет в рамках данного сеанса. |
Практическое применение Iptables
Рассмотрим использование Iptables на практике. Все перечисленные ниже команды будут работать на любом Linux-дистрибутиве. Все команды Iptables необходимо выполнить от имени пользователя root
или от имени обычного пользователя, но с правами sudo
.
Для того чтобы вывести текущую конфигурацию (включая все доступные правила) Iptables, достаточно выполнить одну команду:
iptables --list
Дополнительно доступен более расширенный формат вывода, в котором отображается количество и размер обработанных пакетов в цепочках INPUT
, FORWARD
, OUTPUT
, а также вывод IP-адреса и номеров портов в числовом формате:
iptables --line-numbers -L -v -n
Также можно указать конкретную цепочку, чтобы отобразить правила только для данной цепочки. Например:
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
При запуске команды 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
В процессе установки появится два диалоговых окна, в которых система предложит сохранить текущие правила в файл /etc/iptables/rules.v4
для IPv4
:
и в файл /etc/iptables/rules.v6
для IPv6
:
Чтобы сохранить все правила для протокола 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
Как можно увидеть, в цепочке INPUT
у нас есть 2 правила, которые открывают порты 80 и 443 по протоколу TCP для адресов 10.0.36.126 (правило под номером 1 ) и для 10.0.36.127 (правило под номером 2). Удалим правило под номером 2 с помощью команды:
iptables -D INPUT 2
Повторно выведем список всех правил в системе:
iptables -L --line-numbers
Правило под номером 2 было успешно удалено.
Удаление всех правил одной цепочки
Также существует еще один способ который заключается в удалении сразу всех правил для конкретной цепочки. Например, для цепочки OUTPUT
команда будет следующей:
iptables -F OUTPUT
Удаление всех правил
Существует также способ, позволяющий удалить правила из всех цепочек сразу. Для этого достаточно выполнить:
iptables -F
При выполнении данной команды необходимо проявлять повышенную осторожность, так как можно удалить необходимые вам правила.
Заключение
Подводя итог, можно уверенно сказать что Iptables идеально подходит для управления встроенным firewall в ОС семейства Linux. Благодаря обширному функционалу и встроенным модулям, можно гибко настраивать правила для контролирования трафика в вашей сети.
Ознакомиться более подробно с Iptables можно на официальном сайте программы, а также при помощи команды man iptables
в операционных системах на основе Linux.