Для управления сетевым экраном в дистрибутивах Linux присутствует утилита Iptables.
Iptables — популярная утилита командной строки для взаимодействия со встроенным в ядро Linux брандмауэром (он же firewall) под названием Netfilter, который включен в ядро Linux начиная с версии 2.4. Утилита была выпущена в 1998 году и на текущий момент присутствует практически в любом дистрибутиве Linux.
В данной статье мы рассмотрим принцип работы Iptables и разберем практические примеры использования.
VDS и VPS
биллингом по всему миру: Россия, Азия и Европа.
Установка Iptables
Как уже было упомянуто ранее, Iptables присутствует практически в любом дистрибутиве Linux, как в самых распространенных (Ubuntu, Debian, RHEL), так и в таких дистрибутивах, как openSUSE, Arch Linux, Gentoo и т.д. Для начала проверим, присутствует ли Iptables на сервере. Для этого необходимо вывести версию утилиты, выполнив команду:
Если в ответе отобразилась версия, то Iptables уже присутствует в системе. Если же в ответ вернулось сообщение iptables: command not found, то утилиту необходимо установить вручную. Ниже описана установка Iptables с помощью пакетных менеджеров в различных дистрибутивах семейства Linux. Также Iptables можно скомпилировать и установить из исходного кода.
Для дистрибутивов на основе APT (Ubuntu/Debian/Linux Mint/Kali Linux) необходимо выполнить команду:
Все команды необходимо выполнить от имени пользователя 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, достаточно выполнить одну команду:
Дополнительно доступен более расширенный формат вывода, в котором отображается количество и размер обработанных пакетов в цепочках INPUT, FORWARD, OUTPUT, а также вывод IP-адреса и номеров портов в числовом формате:
Также можно указать конкретную цепочку, чтобы отобразить правила только для данной цепочки. Например:
При первом использование Iptables не создает и не хранит какие-либо цепочки правил, поэтому вывод команд выше будет пустым.
Блокировка IP-адресов
Чтобы заблокировать требуемый IP-адрес, нужно добавить правило в цепочку INPUT. Также необходимо указать таблицу. В команде ниже имя таблицы задано явно. Если ключ t не используется, то правило попадает в таблицу по умолчанию — Filter. В качестве примера заблокируем IP-адрес 10.0.36.126:
При блокировке конкретного IP-адреса были использованы такие опции, как:
t— указывает таблицу, для которой будет применимо правило;A— указывает, в какую цепочку необходимо добавить правило. В данном примере указана цепочкаINPUT;s— указывает целевой объект (источник), к которому необходимо применить действие;j— указывает действие, которое должно быть выполнено. В данном примере трафик будет отклонен (действиеREJECT).
Чтобы заблокировать всю подсеть сразу, ее необходимо указать в опции s:
Также маску подсети можно задать в полном формате:
При необходимости блокировки исходящего трафика на конкретный IP-адрес, используется цепочка OUTPUT и опция d:
Блокировка портов
Производить блокировку можно по портам. Для этого используется опция dport, в которой указывается порт необходимой службы. Также вместо порта можно задать имя службы. Обязательным условием является указание конкретного протокола. В качестве примера заблокируем SSH-соединения с хоста 10.0.36.126 для протокола TCP:
Для протокола UDP команда следующая:
Команда ниже также заблокирует SSH-соединения с хоста 10.0.36.126, но вместо имени используется порт сервиса SSH:
Для блокировки SSH-соединения с любого IP-адреса для протокола TCP необходимо выполнить команду:
Разрешение IP-адреса
Для того чтобы открыть (разрешить) трафик для определенного IP-адреса, необходимо использовать действие ACCEPT. В примере ниже разрешаем весь трафик к серверу для клиента с IP-адресом 10.0.36.126:
Чтобы разрешить трафик с определенного диапазона IP-адресов, например с 10.0.36.126 до 10.0.36.156, необходимо воспользоваться модулем iprange и опцией --src-range:
iprange— модуль, предназначенный для работы с диапазоном IP-адресов.--src-range— опция, которая задает диапазон IP-адресов отправителя.
Для того чтобы выполнить обратную операцию (разрешить весь трафик от сервера к определенным диапазонам IP-адресов — с 10.0.36.126 до 10.0.36.156), необходимо воспользоваться опцией --dst-range:
--dst-range— опция, которая задает диапазон IP-адресов получателя.
Открытие портов
Для того чтобы открыть порт, необходимо задать протокол через опцию p. В качестве протокола поддерживаются такие значения, как tcp, udp и т.д. С полным списком поддерживаемых протоколов можно ознакомиться в файле /etc/protocols:
Порт задается в опции dport. Как и при блокировке портов, можно использовать как числовые значения, так и имена сервисов. Для открытия используется действие ACCEPT.
Откроем 22 порт по протоколу TCP для адреса 10.0.36.126:
Для того чтобы открыть сразу несколько портов, используется модуль multiport и опция dports, где через запятую перечислены порты, которые должны быть открыты. Откроем порты 22, 80, 443 по протоколу TCP для адреса 10.0.36.126:
multiport— модуль, предназначенный для работы с несколькими портами одновременно.dports— опция для работы с несколькими портами. Не путать с опциейdport, которая поддерживает работу только с одним портом.
Запрет ICMP-трафика
Одна из популярных функций в Iptables — запрет на прохождение ICMP-трафика, который генерирует утилита ping. Для того чтобы запретить входящий ICMP-трафик, необходимо выполнить следующую команду:
При запуске команды ping команда выше не будет отображать ошибку. Если необходимо добавить сообщение об ошибке «Destination Port Unreachable», то в команде необходимо заменить действие DROP на REJECT:
Разрешение ICMP-трафика
Чтобы разрешить ранее заблокированный трафик ICMP, необходимо выполнить команду:
Также стоит отметить следующее: если ICMP-трафик ранее был заблокирован при помощи команды:
а затем разрешен с помощью команды:
то он всё равно будет заблокирован, так как правило блокировки ICMP трафика будет первым в цепочке INPUT.
Запрет трафика по MAC-адресу
Помимо использования IP-адресов, трафик можно заблокировать, используя MAC-адрес устройства. Ниже предоставлен пример блокировки трафика для устройства с MAC-адресом 00:0c:29:ed:a9:60:
mac— модуль, предназначенный для работы с MAC-адресами устройств.mac-source— опция, в которой задается MAC-адрес устройства.
Разрешение трафика по MAC-адресу
Чтобы разрешить трафик с определенного MAC-адреса, необходимо выполнить следующую команду:
Блокировка по MAC-адресу с помощью Iptables будет работать только в том случае, если MAC-адреса расположены в одном и том же сегменте сети. Для этих целей лучше всего подойдет блокировка по IP-адресу.
Разрешение трафика на интерфейсе обратной петли (Loopback)
Трафик на интерфейсе обратной петли тоже можно контролировать. Чтобы разрешить входящий трафик, к интерфейсу Loopback необходимо выполнить команду:
Для исходящего трафика команда выглядит следующим образом:
Ограничение сетевого доступа по расписанию
Одной из интересных функций которые присутствуют в Iptables, является временное ограничение или разрешение трафика до необходимых сервисов или портов. По сути, это означает использование расписания. Предположим, мы хотим разрешить входящий доступ по протоколу SSH, который будет доступен только с понедельника по пятницу с 9 утра до 6 вечера. Команда будет выглядеть следующим образом:
time— модуль для работы с временем;timestart— время, когда правило начнет работу;timestop— время завершения работы правила;weekdays— указываются дни недели, перечисленные через запятую. в которых будет работать заданное правило. Поддерживаются следующие значения: Mon, Tue, Wed, Thu, Fri, Sat, Sun. Также можно использовать цифры от 1 до 7.
Сохранение правил в Iptables
По умолчанию, правила, создаваемые пользователем не сохраняются автоматически. Это означает, что после перезагрузки или выключения сервера правила удаляются. Чтобы сохранять правила, необходимо установить пакет iptables-persistent. Для этого воспользуемся командой:
В процессе установки появится два диалоговых окна, в которых система предложит сохранить текущие правила в файл /etc/iptables/rules.v4 для IPv4:
и в файл /etc/iptables/rules.v6 для IPv6:
Чтобы сохранить все правила для протокола IPv4, необходимо выполнить команду:
Для протокола IPv6-правил команда будет следующей:
Данный метод обладает существенным преимуществом — сохраненные правила можно восстановить из файла. Это может пригодиться, например, при переносе правил на другой хост. Для того чтобы восстановить ранее сохраненные правила, необходимо выполнить команду:
/etc/iptables/rules.v4— путь до файла с ранее сохраненными правилами.
При выполнении данной команды на другом хосте необходимо также заранее перенести файл с правилами и только потом выполнять команду.
Удаление правил в Iptables
Ранее созданные правила в Iptables можно удалять. Для этого можно воспользоваться несколькими способами.
Удаление конкретного правила
Первый способ основан на удалении конкретного правила из одной цепочки с использованием порядкового номера этого правила. Для отображения нумерации правил воспользуемся командой:
Как можно увидеть, в цепочке INPUT у нас есть 2 правила, которые открывают порты 80 и 443 по протоколу TCP для адресов 10.0.36.126 (правило под номером 1 ) и для 10.0.36.127 (правило под номером 2). Удалим правило под номером 2 с помощью команды:
Повторно выведем список всех правил в системе:
Правило под номером 2 было успешно удалено.
Удаление всех правил одной цепочки
Также существует еще один способ который заключается в удалении сразу всех правил для конкретной цепочки. Например, для цепочки OUTPUT команда будет следующей:
Удаление всех правил
Существует также способ, позволяющий удалить правила из всех цепочек сразу. Для этого достаточно выполнить:
При выполнении данной команды необходимо проявлять повышенную осторожность, так как можно удалить необходимые вам правила.
Подготовили для вас выгодные тарифы на облачные серверы
477 ₽/мес
657 ₽/мес
Заключение
Подводя итог, можно уверенно сказать что Iptables идеально подходит для управления встроенным firewall в ОС семейства Linux. Благодаря обширному функционалу и встроенным модулям, можно гибко настраивать правила для контролирования трафика в вашей сети.
Ознакомиться более подробно с Iptables можно на официальном сайте программы, а также при помощи команды man iptables в операционных системах на основе Linux.
