Перейти к содержанию книги Kali Linux Revealed
7.4 Брандмауэр или фильтрация пакетов
Брандмауэр является частью компьютерного оборудования с аппаратным обеспечением, программным обеспечением или и тем, и другим, которое анализирует входящие или исходящие сетевые пакеты (приходящие или исходящие из локальной сети) и пропускает только те, которые соответствуют конкретным предопределенным условиям.
Фильтрующий сетевой шлюз является типом брандмауэра, который защищает всю сеть. Обычно он устанавливается на выделенный компьютер, сконфигурированный как шлюз для сети, таким образом, что он может анализировать все пакеты, которые проходят и выходят из сети. В качестве альтернативы существует локальный брандмауэр, выступающий службой программного обеспечения, которая работает на одной конкретной машине, чтобы фильтровать или ограничивать доступ к некоторым службам на этом компьютере или, возможно, предотвращать исходящие соединения от различного шпионского программного обеспечения, которое пользователь мог установить случайно или специально.
Ядро Linux встраивает брандмауэр netfilter. Не существует окончательного решения по настройке любого брандмауэра т.к. требования пользователя и сети довольно разнятся. Тем не менее, вы можете контролировать netfilter из пользовательского пространства с помощью команд iptabtes и ip6tabtes. Разница между этими двумя командами заключается в том, что первая работает для сетей IPv4, тогда как последняя работает на IPv6. Поскольку оба стека сетевых протоколов, вероятно, будут работать в течение многих лет, оба инструмента необходимо будет использовать параллельно. Вы также можете использовать отличный инструмент fwbuitder на основе графического интерфейса пользователя, который обеспечивает графическое представление правил фильтрации.
Однако, вы все же решили настроить его, netfilter является реализацией брандмауэра Linux, поэтому давайте подробнее рассмотрим, как он работает.
7.4.1 Поведение Netfilter
Netfilter использует четыре различные таблицы, в которых хранятся правила, регулирующие три типа операций проводимых над пакетами:
- filter касается правил фильтрации
(принятия, отказа или игнорирования пакета); - nat (Трансляция сетевых адресов (Network Address Translation)) касается перевода исходных или целевых адресов и портов пакетов;
- mangle относится к другим изменениям в IP-пакетах (включая ToS (поле типа обслуживания) Type of Service-field и опции));
- raw позволяет другие изменения, проводимые вручную, над пакетом пока они не достигнут системы отслеживания соединения.
Каждая таблица содержит списки правил, называемых цепями (chains). Брандмауэр использует стандартные цепи для обработки пакетов на основе предопределенных обстоятельств. Администратор может создавать другие цепочки, которые будут использоваться только при передаче одной из стандартных цепочек (будь то прямо или косвенно).
Таблица filter обладает тремя стандартными цепями:
- INPUT (ВХОДЯЩИМИ): касается пакетов, назначением которых является сам брандмауэр;
- OUTPUT (ИСХОДЯЩИМИ): касается пакетов, выпускаемых брандмауэром;
- FORWARD (ПРЯМЫМИ): касается пакетов, проходящих через брандмауэр (который не является ни их источником, ни местом назначения).
Таблица nat также обладает тремя стандартными цепями:
- PREROUTING: для изменения пакетов сразу после их поступления;
- POSTROUTING: для изменения пакетов, когда они готовы начать свой путь;
- OUTPUT (ИСХОДЯЩИМИ): для изменения пакетов, сгенерированных самим брандмуэром.
Эти цепи изображены на рисунке 7.1, «Как называются цепи Netfilter«.
Каждая цепочка представляет собой список правил; каждое правило представляет собой набор условий и действие, которые предпринимаются при выполнении условий. При обработке пакета брандмауэр сканирует соответствующую цепочку, одно правило за другим, и когда условия для одного правила выполняются, он перескакивает (отсюда параметр -j в командах) к указанному действию для продолжения обработки. Наиболее распространенные типы поведения стандартизированы, и для них существуют специальные действия. Принятие одного из этих стандартных действий прерывает обработку цепочки, поскольку дальнейшая судьба пакетов уже предрешена (не принимая во внимание исключение, упомянутое ниже). Ниже перечислены действия Netfilter.
- ACCEPT (ПРИНЯТЬ): позволить пакетам двигаться далее своей дорогой.
- REJECT (ОТКЛОНИТЬ): отклонить пакет с помощью пакета ошибок протокола управляющих сообщений в интернете (Internet control message protocol (ICMP)) (опция -reject-with type опция iptables определяет тип отправляемой ошибки).
- DROP (СБРОСИТЬ): удалить (игнорировать) пакет.
- LOG (ЗАРЕГИСТРИРОВАТЬ): зарегистрировать (через syslogd) сообщения с описанием пакета. Обратите внимание, что это действие не прерывает обработку, а выполнение цепочки продолжается по следующему правилу, поэтому регистрация отклоненных пакетов требует как правила LOG, так и правила REJECT/DROP. Общие параметры, связанные с регистрацией, включают в себя:
- -log-level, с предупреждением по умолчанию, указывает уровень серьезности syslog.
- -log-prefix позволяет указать префикс текста для различения зарегистрированных сообщений.
- -log-tcp-sequence, -log-tcp-options, и —log-ip-options обозначают дополнительные данные, которые должны быть помещены в сообщение: соответственно, порядковый номер TCP, параметры TCP и параметры IP.
- 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, не вошли в данный раздел. Не смотря на это, на страницах руководства iptables и ip6tables имеется исчерпывающий объем информации.
Что такое ICMP?
Межсетевой протокол управления сообщениями (Internet Control Message Protocol (ICMP)) является протоколом, используемым для передачи вспомогательной информации по сообщениям. Он проверяет сетевое соединение с помощью команды ping, которая отправляет сообщение запроса отклика ICMP, на которое получатель должен отвечать с соответствующим ICMP сообщением. Он сигнализирует о том, что брандмауэр отклоняет пакет, указывает на переполнение в буфере приема, предлагает лучший маршрут для следующих пакетов в соединении и т. д. Этот протокол определяется несколькими документами RFC. RFC777 и RFC792 были первыми, но многие другие расширили и/или пересмотрели протокол.
http://www.faqs.org/rfcs/rfc777.html
http://www.faqs.org/rfcs/rfc792.html
Для справки, приемный буфер представляет собой небольшую зону памяти, в которой хранятся данные между тем временем, когда они приходят из сети, и временем, когда ядро обработает их. Если эта зона заполнена, то соответственно, новые данные не могут быть получены, и ICMP будет сигнализировать о проблеме, чтобы источник мог замедлить скорость их передачи (которая в идеале должно должна быть отрегулирована через некоторое время).
Обратите внимание, что несмотря на то, что сеть IPv4 может работать без ICMP, ICMPv6 строго требуется для сети IPv6, поскольку он объединяет в себе несколько функций, которые были в мире IPv4, распространяются через ICMPv4, Internet Croup Membership Protocol (IGMP), и Address Resolution Protocol (ARP). ICMPv6 характеризуется в RFC4443.
http://www.faqs.org/rfcs/rfc4443.html
7.4.2 Синтаксис iptables и ip6tables
Команды 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 port и -destination-portporf.
Отрицательные условия
Добавление к условию восклицательного знака, отрицает условие. Например, отрицание условия на опции -p соответствует «любой пакет с протоколом отличным от того, который указан». Этот механизм отрицания может быть применен ко всем другим условиям.
Условия -s address или -s network/mask соответствует исходному адресу пакета. Аналогично, -d address or -d network/mask соответствует адресу назначения.
Условие -i interface выбирает пакеты, исходящие из заданного сетевого интерфейса. -o interface выбирает пакеты, выходящие на определенный интерфейс.
Условие —state state (состояние) condition соответствует состоянию пакета в соединении (это требует модуль ipt_ conntrack kernel для отслеживания соединения). Состояние NEW описывает пакет запускающий новое соединение, ESTABLISHED соответствует пакетам, принадлежащим к уже существующему соединению, и RELATED соответствует пакетам, инициирующим новое соединение, которое связано с существующим (что полезно для соединений ftp-данных в активном режиме протокола FTP).
Существует множество доступных опций для iptables и ip6tables, и их освоение требует глубокого изучения и длительного процесса набора опыта. Однако одна из опций, которую вы будете использовать чаще всего, — это та, которая блокирует вредоносный сетевой трафик с хоста или диапазона хостов. Например, чтобы незаметно блокировать входящий трафик с IP-адреса 10.0.1.5 и 31.13.74.0/24 класса C подсети:
Другая часто используемая команда iptables — это разрешить сетевой трафик для определенной службы или порта. Чтобы пользователи могли подключаться к SSH, HTTP и IMAP, вы можете запускать следующие команды:
Правилом хорошей компьютерной гигиены является очистка старых и ненужных правил. Самый простой способ удаления правил iptables — ссылаться на правила по номеру строки, который вы можете получить с помощью опции -line-numbers. Тем не менее, будьте очень осторожны: при сбросе правила будут перенумерованы все правила, появляющиеся дальше в цепочке.
Существуют более конкретные условия, в зависимости от общих условий, описанных выше. Для получения дополнительной информации рекомендуем ознакомиться с Iptables и ip6tables
7.4.3 Создание правил в Kali Linux
Для создания каждого правила требуется один вызов iptables или ip6tables. Ввод этих команд вручную может быть очень утомительным процессом, поэтому вызовы обычно хранятся в сценарии, таким образом, что система автоматически настраивается одинаково каждый раз, когда машина загружается. Этот скрипт может быть написан вручную, но также может быть довольно интересно подготовить его с помощью инструмента высокого уровня, такого как fwbuilder.
Принцип прост. На первом этапе опишите все элементы, которые будут задействованы в действительных правилах:
- Сам брандмауэр с сетевыми интерфейсами;
- Сети, с их соответственными диапазонами IP ranges;
- Сервера;
- Порты, принадлежащие к службам, размещенным на данном сервере.
Затем создайте правила с помощью простых действий перетаскивания объектов, как показано на рисунке 7.2, «Главное окно Fwbuilder» . Несколько контекстных меню могут изменить условие (например, отрицая его). Затем нужно выбрать и настроить действие.
Что касается IPv6, вы можете либо создать два разных набора правил для IPv4 и IPv6, либо создать только одно, и позволить fwbuilder переводить правила в соответствии с адресами, назначенными объектам.
fwbuilder создаст скрипт, настраивающий брандмауэр в соответствии с правилами, которые вы определили. Его модульная архитектура дает возможность генерировать сценарии, предназначенные для разных систем, включая iptables для Linux, ipf для FreeBSD и pf для OpenBSD.
7.4.4 Установка правил для каждой загрузки
Для того чтобы внедрять правила брандмауэра каждый раз, когда машина загружается, вам необходимо зарегистрировать скрипт конфигурации в соответствующей директиве файла /etc/network/interfaces file . В следующем примере скрипт хранится в /usr/tocat/etc/arrakis.fw .
Данный пример предполагает, что вы используете ifupdown для настройки сетевых интерфейсов. Если вы используете что-то другое (вроде NetworkManager или systemd-networkd), тогда ознакомьтесь с их соответствующей документацией для того, чтобы определить способ, каким образом выполнить скрипт после того, как интерфейс был запущен.
Перейти к содержанию книги Kali Linux Revealed
Это интересно: