→ Часть 1. Kali Linux: политика безопасности, защита компьютеров и сетевых служб
Представляем вашему вниманию продолжение перевода главы 7 книги «Kali Linux Revealed». В прошлый раз речь шла о политиках безопасности и о защите компьютеров и сетевых служб. Этот материал включает в себя перевод раздела 7.4, который посвящён файрволу и фильтрации пакетов.
7.4. Файрвол или фильтрация пакетов
Файрвол — это компьютерное оборудование, которое может быть представлено в виде программного, аппаратного, или программно-аппаратного комплекса. Файрвол обрабатывает входящие и исходящие сетевые пакеты (поступающие в локальную сеть или покидающие её) и пропускает лишь те из них, которые соответствуют неким предопределённым правилам.
Фильтрующий сетевой шлюз — это разновидность файрвола, который защищает всю сеть. Обычно его устанавливают на выделенном компьютере, настроенном как шлюз для сети. В результате этот компьютер может обрабатывать все пакеты, которые пересекают границу между сетью и внешним миром. Как вариант, локальный файрвол — это программная служба, которая работает на конкретной машине для того, чтобы ограничивать доступ к неким службам на этой машине, или, возможно, для предотвращения исходящих соединений, инициируемых нежелательным программным обеспечением, которое пользователь компьютера может, намеренно или случайно, установить.
В ядре Linux имеется встроенный файрвол netfilter
. Требования различных сетей и пользователей неодинаковы, поэтому не существует стандартного подхода к настройке файрвола, позволяющего получить готовое решение на все случаи жизни. Управлять файрволом netfilter
можно из пространства пользователя с помощью команд iptables
и ip6tables
. Разница между этими двумя командами заключается в том, что первая предназначена для сетей IPv4, вторая — для сетей IPv6. Так как оба стека протоколов, вероятно, будут в ходу ещё многие годы, оба инструмента следует использовать совместно. Кроме того, тут можно применить отличную программу fwbuilder
, которая даёт графические инструменты для построения и представления правил фильтрации трафика.
Как бы вы ни решили настраивать netfilter —
это стандартный файрвол Linux, поэтому взглянем поближе на то, как он работает.
7.4.1. Как работает netfilter
Netfilter использует четыре таблицы, которые хранят правила, регулирующие три вида операций над пакетами:
filter
: касается правил фильтрации (принять, отклонить, или проигнорировать пакет);nat
(Network Address Translation): касается трансляции адресов источника, получателя, или портов пакета;mangle
: касается других изменений IP-пакетов (включая поля и параметры ToS — Type of Service);raw
: позволяет выполнять ручные модификации пакетов до того, как они дошли до системы отслеживания соединения.
Каждая таблица содержит списки правил, называемые цепочками. Файрвол использует стандартные цепочки для обработки пакетов, основываясь на предопределённых условиях. Администратор может создавать другие цепочки, которые будут использованы только в случаях, когда на них, прямо или косвенно, ссылается одна из стандартных цепочек.
Таблица filter
содержит три стандартные цепочки:
INPUT
: касается пакетов, пунктом назначения которых является сам файрвол;OUTPUT
: касается пакетов, которые отправляет файрвол;FORWARD
: касается пакетов, которые проходят через файрвол (который не является ни их источником, ни пунктом их назначения).
Таблица nat
тоже содержит три стандартные цепочки:
PREROUTING
: для модификации прибывающих пакетов;POSTROUTING
: для модификации пакетов, когда они готовы отправиться к пункту назначения;OUTPUT
: для модификации пакетов, генерируемых самим файрволом.
Вышеописанные цепочки показаны на рисунке ниже.
Рис. 7.1. Цепочки netfilter
Каждая цепочка представляет собой список правил. Каждое правило — это набор условий и действий, которые должны быть выполнены при соблюдении соответствующих условий. В процессе обработки пакета файрвол просматривает подходящую цепочку, правило за правилом, и, когда условия для некоего правила выполняются, он «перепрыгивает» (отсюда и опция -j —
от слова «jump») к заданному действию для продолжения обработки пакета.
Наиболее распространённые шаблоны поведения стандартизированы, для них существуют выделенные действия. Выполнение одного из этих стандартных действий прерывает проход по цепочке, так как судьба пакета уже предопределена (это не касается упомянутых ниже исключений). Вот список действий netfilter
:
ACCEPT
: позволяет пакету следовать своим путём.REJECT
: отклоняет пакет, генерируя пакет-ошибку ICMP (Internet Control Message Protocol). Опцияiptables --reject-with type
позволяет задать тип выдаваемой ошибки.DROP
: удалить (проигнорировать) пакет.LOG
: записать в системный журнал сообщение (черезsyslogd
) с описанием пакета. Обратите внимание на то, что это действие не прерывает обработку пакета, выполнение цепочки продолжается со следующего правила. Именно поэтому логирование отклонённых пакетов требует наличия правилLOG
иREJECT/DROP
. Среди часто используемых параметров, касающихся логирования, можно отметить следующие:ULOG
: логирует сообщения с использованиемulogd
. Такой подход может оказаться эффективнее чемsyslogd
при обработке большого количества сообщений. Обратите внимание на то, что это действие, как иLOG
, не прерывает обработку пакета.chain_name
: переход к заданной цепочке и обработка её правил.RETURN
: прерывание обработки текущей цепочки и возврат к вызывающей цепочке. В том случае, если текущей цепочкой является одна из стандартных, вызывающей цепочки нет, поэтому вместо этого выполняется действие по умолчанию (заданное с помощью опции-P
командыiptables
).SNAT
(только в таблицеnat
): применяет Source Network Address Translation (SNAT). Дополнительные опции описывают то, какие именно изменения нужно выполнить, включая опцию --to-source address:port
, которая позволяет задать новый IP-адрес источника пакета, и, при необходимости, порт.DNAT
(только в таблицеnat
): применяет Destination Network Address Translation (DNAT). Дополнительные опции описывают то, какие именно изменения нужно выполнить, включая опцию--to-destination address:port
, которая позволяет задать новый IP-адрес назначения, и, при необходимости, порт.MASQUERADE
(только в таблицеnat
): выполняет так называемый маскарадинг (особый случай Source NAT).REDIRECT
(только в таблицеnat
): прозрачно перенаправляет пакет на заданный порт самого файрвола. Это действие можно использовать для установки прозрачного веб-прокси, который работает без дополнительных настроек на стороне клиента, так как клиент полагает, что он подключён к получателю, в то время как обмен данными, на самом деле, идёт через прокси. Опция--to-ports port(s)
позволяет указать порт или диапазон портов, на которые должны быть перенаправлены пакеты.
Описание других действий, в частности тех, которые относятся к таблице mangle
, выходит за пределы этого материала. Справку по ним можно посмотреть на страницах man
iptables(8)
и ip6tables(8)
.
▍Что такое ICMP?
ICMP (Internet Control Message Protocol, протокол межсетевых управляющих сообщений) используется для передачи дополнительной информации о сетевых соединениях. Он позволяет проверять сетевые соединения с помощью команды
ping
, которая отправляет эхо-запросы ICMP, на которые ожидается ответ получателя в виде эхо-ответов ICMP. Этот протокол используется для выдачи сообщений о пакетах, отклонённых файрволом, для указания на переполнение буфера приёма, для предложения лучшего маршрута для следующих пакетов в соединении, и так далее. Этот протокол определён несколькими документами RFC. Первыми были RFC777 и RFC792, однако, многие другие документы расширяют или пересматривают протокол.Например, буфер приёма — это небольшая область памяти, предназначенная для хранения данных после приёма их из сети и до обработки ядром. Если эта память полностью заполнена, новые данные принять невозможно и ICMP сигнализирует о проблеме. В результате источник может снизить скорость передачи данных (которая, через некоторое время, в идеале, должна достигнуть уровня, обеспечивающего баланс между источником и приёмником).
Обратите внимание на то, что хотя сеть IPv4 может работать и без ICMP, поддержка протокола ICMP v6 совершенно необходима для сетей IPv6, так как этот протокол совмещает несколько функций, которые, в сетях IPv4, были распределены между ICMPv4, Internet Group Membership Protocol (IGMP), и Address Resolution Protocol (ARP). ICMPv6 посвящён стандарт RFC4443.
7.4.2. Синтаксис команд iptables и ip6tables
Команды iptables
и ip6tables
используются для работы с таблицами, цепочками и правилами. Их опция -t table
позволяет указать таблицу, с которой планируется работать (по умолчанию это таблица filter
).
▍7.4.2.1. Команды
Вот основные опции, предназначенные для работы с цепочками:
-L chain
: выводит правила в цепочке. Обычно эту опцию используют с опцией-n
для отключения разрешения имён (например, командаiptables -n -L INPUT
выведет правила, относящиеся ко входящим пакетам).-N chain
: создаёт новую цепочку. Новые цепочки создают, преследуя множество целей, в том числе — для тестирования новых сетевых служб и для предотвращения сетевых атак.-X chain
: удаляет пустую или неиспользуемую цепочку (например —iptables -X ddos-attack
).-A chain rule
: добавляет правило в заданную цепочку. Помните о том, что правила обрабатываются, начиная с головы цепочки, учитывайте это, добавляя к цепочкам новые правила.-I chain rule_num rule
: вставляет правило перед правилом, заданным с помощью аргументаrule_num
. Как и в случае с опцией-A
, помните о порядке обработке правил, добавляя в цепочку новое правило.-D chain rule_num
(или-D chain rule
): удаляет правило из цепочки. Первый вариант использования идентифицирует удаляемое правило по номеру (командаiptables -L --line-numbers
позволяет вывести эти номера). Второй вариант позволяет идентифицировать правило по его содержимому.-F chain
: сбрасывает цепочку (удаляет из неё все правила). Например, для того, чтобы удалить все правила, связанные с исходящими пакетами, можно воспользоваться командойiptables -F OUTPUT
. Если при использовании этой опции не указаны конкретные цепочки, будут удалены все правила в таблице.-P chain action
: позволяет задать действие по умолчанию, или «политику» для заданной цепочки. Обратите внимание на то, что только стандартные цепочки могут иметь политику. Например, для того, чтобы по умолчанию отбрасывать весь входящий трафик, можно воспользоваться командойiptables -P INPUT DROP
.
▍7.4.2.2. Правила
Каждое правило выражается в виде conditions -j action action_options
. Если в одном и том же правиле описаны несколько условий, тогда итоговым критерием является объединение этих условий (по правилам логического И). Результат объединения, как минимум, налагает на правило те же ограничения, что и каждое отдельное условие.
Условие -p protocol
соответствует полю протокола IP-пакета. Наиболее часто используемые значения для этого условия — tcp
, udp
, icmp
, и icmpv6
. Это условие может быть дополнено условиями, касающимися TCP-портов, с помощью выражений вида --source-port port
и --destination-port port
.
▍Логическое отрицание условий
Если поставить перед условием восклицательный знак, это приведёт к трансформации его в обратное условие. Например, восклицательный знак в условии опции
-p
позволяет построить выражение следующего вида: «любой пакет с протоколом, отличающимся от заданного». Этот механизм логического отрицания можно применить и к любым другим условиям.
Условие вида -s address
или -s network/mask
позволяет фильтровать пакеты по адресу их источника. Соответственно, условия -d address
или -d network/mask
позволяют системе реагировать на адреса пунктов назначения пакетов.
Условие вида -i interface
реагирует на пакеты, которые приходят с указанного сетевого интерфейса. Условие -o interface
позволяет отбирать пакеты, которые уходят на заданный интерфейс.
Условие --state state
фильтрует пакеты по их состоянию в соединении (применение этого условия требует наличия модуля ядра ipt_conntrack
для отслеживания соединений). Так, состояние NEW
описывает пакет, запрашивающий новое соединение, ESTABLISHED —
пакет, принадлежащий существующему соединению, RELATED
— описывает пакет, инициирующий новое соединение, являющееся частью уже существующего соединения (анализ этого состояния полезен для соединений ftp-data
в «активном» режиме протокола FTP).
У команд iptables
и ip6tables
есть множество опций, овладение ими требует серьёзного подхода к их изучению и опыта. Однако, одна из опций, которую вы будете использовать чаще всего — та, которая предназначена для блокировки нежелательного сетевого трафика от некоего хоста или диапазона хостов. Например, для того, чтобы «бесшумно» заблокировать входящий трафик с IP-адреса 10.0.1.5 и подсети класса C 31.13.74.0/24, нужно сделать следующее:
# iptables -A INPUT -s 10.0.1.5 -j DROP
# iptables -A INPUT -s 31.13.74.0/24 -j DROP
# iptables -n -L INPUT
Chain INPUT (policy ACCEPT)
target prot opt source destination
DROP all -- 10.0.1.5 0.0.0.0/0
DROP all -- 31.13.74.0/24 0.0.0.0/0
Ещё одна часто используемая команда iptables
предназначена для разрешения сетевого трафика от некоей службы или порта. Например, для того, чтобы позволить пользователям подключаться по SSH, HTTP и IMAP, можно воспользоваться следующими командами:
# iptables -A INPUT -m state --state NEW -p tcp --dport 22 -j ACCEPT
# iptables -A INPUT -m state --state NEW -p tcp --dport 80 -j ACCEPT
# iptables -A INPUT -m state --state NEW -p tcp --dport 143 -j ACCEPT
# iptables -n -L INPUT
Chain INPUT (policy ACCEPT)
target prot opt source destination
DROP all -- 10.0.1.5 0.0.0.0/0
DROP all -- 31.13.74.0/24 0.0.0.0/0
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:80
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:143
Считается полезным, для поддержания здоровой атмосферы в системе, убирать старые или неиспользуемые правила. Самый простой способ удаления правил iptables
заключается в обращении к правилам по номеру строки, который можно получить с помощью опции --line-numbers
. Однако, тут стоит проявлять осторожность, так как удаление правила приведёт к изменению номеров всех правил, расположенных ниже его в цепочке:
# iptables -n -L INPUT --line-numbers
Chain INPUT (policy ACCEPT)
num target prot opt source destination
1 DROP all -- 10.0.1.5 0.0.0.0/0
2 DROP all -- 31.13.74.0/24 0.0.0.0/0
3 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22
4 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:80
5 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:143
# iptables -D INPUT 2
# iptables -D INPUT 1
# iptables -n -L INPUT --line-numbers
Chain INPUT (policy ACCEPT)
num target prot opt source destination
1 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22
2 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:80
3 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:143
Существуют и более специфические условия, зависящие от общих условий, описанных выше. Подробнее об этом можно посмотреть в man
(iptables(8)
и ip6tables(8)
).
7.4.3. Создание правил
Каждая операция создания правила требует одного вызова команды iptables
или ip6tables
. Ввод этих команд вручную может оказаться трудоёмкой задачей, поэтому обычно эти команды оформляют в виде скриптов, которые позволяют автоматически настраивать систему так, как это нужно, каждый раз при загрузке компьютера. Подобные скрипты можно писать вручную, но есть и более продвинутый способ, который заключается в использовании программы fwbuilder
. Для её установки воспользуйтесь такой командой:
# apt install fwbuilder
Принципы создания правил в программе просты. Сначала опишите все элементы системы, на которые будут распространены правила, которые вы хотите создать. Среди этих элементов можно отметить следующие:
- Сам файрвол с его сетевыми интерфейсами.
- Сеть и соответствующие ей диапазоны IP-адресов.
- Серверы.
- Порты, принадлежащие службам, работающим на серверах.
Далее, создайте правила, используя графический интерфейс и перетаскивая мышью соответствующие элементы. Контекстные меню можно использовать для изменения условий (например, для формирования условий, обратных заданным). Затем нужно выбрать и настроить действия.
Поскольку во внимание принимается и IPv6, можно либо создать два самостоятельных набора правил, для IPv4 и IPv6, либо создать лишь один набор и позволить fwbuilder
преобразовать правила в соответствии с адресами, назначенными объектам.
Рис. 7.2. Главное окно fwbuilder
Итогом работы с fwbuilder
станет сгенерированный программой скрипт настройки файрвола в соответствии с заданными правилами. Модульная архитектура программы даёт возможность создавать скрипты, рассчитанные на различные системы, в том числе — iptables
для Linux, ipf
для FreeBSD и pf
для OpenBSD.
7.4.4. Применение правил при каждой загрузке системы
Для того, чтобы применять правила файрвола каждый раз, когда система загружается, нужно зарегистрировать конфигурационный скрипт в директиве up
файла /etc/network/interfaces
. В следующем примере скрипт хранится по адресу /usr/local/etc/arrakis.fw
.
auto eth0
iface eth0 inet static
address 192.168.0.1
network 192.168.0.0
netmask 255.255.255.0
broadcast 192.168.0.255
up /usr/local/etc/arrakis.fw
В этом примере предполагается, что вы используете для настройки сетевых интерфейсов ifupdown
. Если вы используете другие инструменты (вроде NetworkManager
или systemd-networkd
), обратитесь к их документации для того, чтобы выяснить способы выполнения скрипта после включения интерфейса.
Итоги
Сегодня мы поговорили о работе со встроенным в ядро Linux файрволом netfilter
, обсудили особенности управления трафиком IPv4 и IPv6 с использованием команд iptables
и ip6tables
. Мы рассмотрели графическое средство для создания правил fwbuilder
и показали, как автоматически задавать правила при загрузке системы. В следующий раз мы поделимся с вами переводом раздела 7.5, который посвящён мониторингу Kali Linux.
Уважаемые читатели! Как вы решаете проблемы фильтрации трафика в Linux?
Автор: ru_vds