Kali Linux: фильтрация трафика с помощью netfilter

https://kali.training/chapter-7/defining-a-security-policy/
  • Перевод
→ Часть 1. Kali Linux: политика безопасности, защита компьютеров и сетевых служб
→ Часть 2. Kali Linux: фильтрация трафика с помощью netfilter
→ Часть 3. Kali Linux: мониторинг и логирование
→ Часть 4. Kali Linux: упражнения по защите и мониторингу системы

Представляем вашему вниманию продолжение перевода главы 7 книги «Kali Linux Revealed». В прошлый раз речь шла о политиках безопасности и о защите компьютеров и сетевых служб. Этот материал включает в себя перевод раздела 7.4, который посвящён файрволу и фильтрации пакетов.

image

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?
  • +25
  • 11,6k
  • 6
RUVDS.com 553,38
RUVDS – хостинг VDS/VPS серверов
Поделиться публикацией
Комментарии 6
  • +2
    Несколько похоже на выдержку из учебника с налетом академичности.
    К примеру:
    INPUT: касается пакетов, пунктом назначения которых является сам файрвол;
    OUTPUT: касается пакетов, которые отправляет файрвол;

    Чуть ниже картинка, которая объясняет все намного лучше, чем эти две строчки.
    У меня сразу вопросы: зачем кто-то извне будет отправлять пакеты моему файрволу? Правильный ответ: никто не будет.
    На самом деле INPUT и OUTPUT рулят трафиком, который предназначен внутренним сервисам — тем сервисам, которые крутятся непосредственно на шлюзе, как то: ssh, http, ftp и т.д.
    Хочу ограничить доступ извне к ssh на шлюзе? Добро пожаловать в INPUT. Какой-то PHP-скрипт на моем веб-сервере отправляет статистику своему разработчику? Добро пожаловать в OUTPUT.

    А FORWARD рулит трафиком, который проходит транзитом через шлюз. Кто-то спамит в моей сети через внешний сервис? Добро пожаловать в FORWARD.

    Далее: после описания цепочек ВНЕЗАПНО идет выдержка из какой-то документации по ICMP. Зачем? Если описывается в контексте REJECT, то вместо выдержки с абсолютно ненужной информацией было бы неплохо указать перечень кодов ICMP, которые может отдавать REJECT.

    Всюду используется опция '-n', но нигде не объясняется ее смысл. Мне, к примеру, более понятен вывод без нее: вижу не магические числа, а осмысленные имена портов.

    Также логично то, что большее количество правил приводит к большему количеству проверок, а значит к большей нагрузке на шлюз в случае большого количества трафика.
    # 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 -A INPUT -m multiport -m state --state NEW -p tcp --dport 22,80,143 -j ACCEPT


    Еще можно сократить до одной строки:
    # iptables -A INPUT -s 10.0.1.5 -j DROP
    # iptables -A INPUT -s 31.13.74.0/24 -j DROP

    # iptables -A INPUT -s 10.0.1.5, 31.13.74.0/24 -j DROP

    Впрочем, эта строка все равно разобьется на два правила, но файлик с перечнем правил станет компактнее и понятнее.

    Еще бы имело смысл добавить описание простых утилит: iptables-save/iptables-restore/iptables-apply. К примеру первая из них показывает правила в том виде, в котором они добавляются через iptables.

    В целом же, для того, чтобы понять iptables, достаточно посмотреть на картинку типа этой:
    Netfilter scheme


    И дальше лазить в ман просто для того, чтобы вспомнить какой-нибудь ключик.
    • +1
      Про conntrack одно предложение, а собственно это один из самых важных компонентов iptables, без понимания которого тяжело понять как работает например nat.
      • +2

        Я так понимаю, что астрологи объявили что-то там связанное с Kali Linux, и теперь недели две ни единой статьи про азы линукса без упоминания Kali Linux?

        • 0
          Переводят книжку, Kali Linux-что-то там.
          Почему в книжке про Kali Linux азы администрирования мне тоже непонятно.
          Все жду, когда там про особенности конкретного дистрибутива появится.
        • 0
          Однажды столкнулся с тем, что не весь трафик можно заблокировать с помощью iptables. Например, DHCP, потому что используются raw sockets. Чуть подробнее можно почитать тут и тут.
          • 0
            Не весь. Тот, что нельзя заблокировать через iptables, можно через ebtables.

          Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

          Самое читаемое