Для управления сетевым экраном в дистрибутивах Linux присутствует утилита Iptables.
Iptables — популярная утилита командной строки для взаимодействия со встроенным в ядро Linux брандмауэром (он же firewall) под названием Netfilter, который включен в ядро Linux начиная с версии 2.4. Утилита была выпущена в 1998 году и на текущий момент присутствует практически в любом дистрибутиве Linux.
В данной статье мы рассмотрим принцип работы 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 использует механизм правил (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.