Это продолжение перевода главы 7 книги «Kali Linux Revealed». В прошлый раз речь шла о политиках безопасности и о защите компьютеров и сетевых служб. Этот материал включает в себя перевод раздела 7.4, который посвящён файрволу и фильтрации пакетов.
netfilter
. Требования различных сетей и пользователей неодинаковы, поэтому не существует стандартного подхода к настройке файрвола, позволяющего получить готовое решение на все случаи жизни. Управлять файрволом netfilter
можно из пространства пользователя с помощью команд iptables
и ip6tables
. Разница между этими двумя командами заключается в том, что первая предназначена для сетей IPv4, вторая — для сетей IPv6. Так как оба стека протоколов, вероятно, будут в ходу ещё многие годы, оба инструмента следует использовать совместно. Кроме того, тут можно применить отличную программу fwbuilder
, которая даёт графические инструменты для построения и представления правил фильтрации трафика.netfilter —
это стандартный файрвол Linux, поэтому взглянем поближе на то, как он работает.filter
: касается правил фильтрации (принять, отклонить, или проигнорировать пакет);nat
(Network Address Translation): касается трансляции адресов источника, получателя, или портов пакета;mangle
: касается других изменений IP-пакетов (включая поля и параметры ToS — Type of Service);raw
: позволяет выполнять ручные модификации пакетов до того, как они дошли до системы отслеживания соединения.filter
содержит три стандартные цепочки:INPUT
: касается пакетов, пунктом назначения которых является сам файрвол;OUTPUT
: касается пакетов, которые отправляет файрвол;FORWARD
: касается пакетов, которые проходят через файрвол (который не является ни их источником, ни пунктом их назначения).nat
тоже содержит три стандартные цепочки:PREROUTING
: для модификации прибывающих пакетов;POSTROUTING
: для модификации пакетов, когда они готовы отправиться к пункту назначения;OUTPUT
: для модификации пакетов, генерируемых самим файрволом.-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.
iptables
и ip6tables
используются для работы с таблицами, цепочками и правилами. Их опция -t table
позволяет указать таблицу, с которой планируется работать (по умолчанию это таблица filter
).-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
.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)
).iptables
или ip6tables
. Ввод этих команд вручную может оказаться трудоёмкой задачей, поэтому обычно эти команды оформляют в виде скриптов, которые позволяют автоматически настраивать систему так, как это нужно, каждый раз при загрузке компьютера. Подобные скрипты можно писать вручную, но есть и более продвинутый способ, который заключается в использовании программы fwbuilder
. Для её установки воспользуйтесь такой командой:# apt install fwbuilder
fwbuilder
преобразовать правила в соответствии с адресами, назначенными объектам.fwbuilder
станет сгенерированный программой скрипт настройки файрвола в соответствии с заданными правилами. Модульная архитектура программы даёт возможность создавать скрипты, рассчитанные на различные системы, в том числе — iptables
для Linux, ipf
для FreeBSD и pf
для OpenBSD.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
), обратитесь к их документации для того, чтобы выяснить способы выполнения скрипта после включения интерфейса.