Для управления сетевым экраном в дистрибутивах Linux присутствует утилита Iptables.
Iptables — популярная утилита командной строки для взаимодействия со встроенным в ядро Linux брандмауэром (он же firewall) под названием Netfilter, который включен в ядро Linux начиная с версии 2.4. Утилита была выпущена в 1998 году и на текущий момент присутствует практически в любом дистрибутиве Linux.
В данной статье мы рассмотрим принцип работы Iptables и разберем практические примеры использования.
cloud
Как уже было упомянуто ранее, 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 использует механизм правил (rules
). Правила контролируют входящий и исходящий трафики и состоят из цепочек, которые разрешают или блокируют трафик.
Более подробный алгоритм работы Iptables описан ниже:
При работе с Iptables можно столкнуться со следующими терминами:
Таблица Filter
— таблица по умолчанию. Использует 3 цепочки: OUTPUT
, FORWARD
, INPUT
:
|
Управляет входящими соединениями. В качестве примера можно привести использование протокола SSH. |
|
Управляет входящими соединениями, которые не поступают локально. Например, такая ситуация обычно происходит на маршрутизаторе. |
|
Управляет исходящими соединений. В качестве примера можно привести переход к какому-либо сайту при помощи браузера. |
Таблица NAT
. Использует 3 цепочки: PREROUTING
, POSTROUTING
, OUTPUT
:
|
Определяет IP-адрес назначения пакета. |
|
Изменяет IP-адрес источника. |
|
Цепочка изменяет целевой адрес пакетов. |
Mangle
предназначена для изменения IP-заголовков пакета.Таблица Raw
предназначена для предоставления механизма для маркировки пакетов, с целью отказа от отслеживания соединений.
Таблица Security
предназначена для взаимодействия с различными механизмами безопасностями ОС, например с SELinux.
Правила, используемые в 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-адрес, нужно добавить правило в цепочку 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-адреса, необходимо использовать действие 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
, которая поддерживает работу только с одним портом.Одна из популярных функций в 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, необходимо выполнить команду:
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
.
Помимо использования 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-адреса, необходимо выполнить следующую команду:
iptables -A INPUT -m mac --mac-source 00:0c:29:ed:a9:60 -j ACCEPT
Блокировка по MAC-адресу с помощью Iptables будет работать только в том случае, если MAC-адреса расположены в одном и том же сегменте сети. Для этих целей лучше всего подойдет блокировка по IP-адресу.
Трафик на интерфейсе обратной петли тоже можно контролировать. Чтобы разрешить входящий трафик, к интерфейсу 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-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 -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.