10.8 Межсетевые экраны FreeBSD


Предоставили Gary Palmer and Alex Nash.

Интерес к межсетевым экранам (firewall) со стороны людей, подключенных к интернет, все возрастает и появились даже приложения для локальной сети, предоставляющие повышенный уровень безопасности. В этом разделе мы надеемся изложить что такое межсетевые экраны, как их использовать, и как использовать возможности, предоставляемые ядром FreeBSD для их реализации.

Note: Люди часто думают, что наличие межсетевого экрана между внутренней сетью и ``Большим плохим интернетом'' решит все их проблемы безопасности. Это может помочь, но плохо настроенный межсетевой экран представляет более серьезную угрозу безопасности, чем его полное отсутствие. Межсетевой экран добавляет еще один уровень безопасности вашим системам, но не может остановить проникновение решительно настроенного взломщика в вашу сеть. Если вы снижаете внутреннюю безопасность системы, поскольку верите в надежность межсетевого экрана, это существенно упрощает работу взломщика.
10.8.1 Что такое межсетевой экран?

Есть два четко различающихся типа межсетевых экранов, повседневно используемых в современном интернет. Первый тип правильнее называть маршрутизатор с фильтрацией пакетов. Этот тип межсетевого экрана работает на машине, подключенной к нескольким сетям и применяет к каждому пакету набор правил, определяющий переправлять ли этот пакет или блокировать. Второй тип, известный как прокси сервер, реализован в виде даемонов, выполняющих аутентификацию и пересылку пакетов, возможно на машине с несколькими сетевыми подключениями, где пересылка пакетов в ядре отключена.

Иногда эти два типа межсетевых экранов используются вместе, так что только определенной машине (известной как защитный хост (bastion host)) позволено отправлять пакеты через фильтрующий маршрутизатор во внутреннюю сеть. Прокси сервисы работают на защитном хосте, что обычно более безопасно, чем обычные механизмы аутентификации.

FreeBSD поставляется с встроенным в ядро фильтром пакетом (известным как IPFW), ему будет посвящена оставшаяся часть раздела. Прокси серверы могут быть собраны на FreeBSD из программного обеспечения сторонних разработчиков, но их слишком много и невозможно описать их в этом разделе.
10.8.1.1 Маршрутизаторы с фильтрацией пакетов

Маршрутизатор это машина, пересылающая пакеты между двумя или несколькими сетями. Маршрутизатор с фильтрацией пакетов запрограммирован на сравнение каждого пакета со списком правил перед тем как решить, пересылать его или нет. Большинство современного программного обеспечения маршрутизации имеет возможности фильтрации, и по умолчанию пересылаются все пакеты. Для включения фильтров, вам потребуется определить набор правил.

Для определения того, должен ли быть пропущен пакет, межсетевой экран ищет в наборе правило, совпадающее с содержимым заголовков пакета. Как только совпадение найдено, выполняется действие, присвоенное данному правилу. Действие может заключаться в отбрасывании пакета, пересылке пакета, или даже в отправлении ICMP сообщения в адрес источника. Учитывается только первое совпадение, поскольку правила просматриваются в определенном порядке. Следовательно, список правил можно назвать ``цепочкой правил''.

Критерий отбора пакетов зависит от используемого программного обеспечения, но обычно вы можете определять правила, зависящие от IP адреса источника пакета, IP адреса назначения, номера порта источника пакета, номера порта назначения (для протоколов, поддерживающих порты), или даже от типа пакета (UDP, TCP, ICMP, и т.д.).
10.8.1.2 Прокси серверы

Прокси серверы это компьютеры, где обычные системные даемоны (telnetd, ftpd, и т.д.) заменены специальными серверами. Эти серверы называются прокси серверами, поскольку они обычно работают только с входящими соединениями. Это позволяет запускать (например) telnet прокси сервер на межсетевом экране, и делать возможным вход по telnet на межсетевой экран, прохождение механизма аутентификации, и получение доступа к внутренней сети (аналогично, прокси серверы могут быть использованы для выхода во внешнюю сеть).

Прокси серверы обычно лучше защищены, чем другие серверы, и зачастую имеют более широкий набор механизмов аутентификации, включая системы ``одноразовых'' паролей, так что даже если кто-то узнает, какой пароль вы использовали, он не сможет использовать его для получения доступа к системе, поскольку срок действия пароля истекает немедленно после его первого использования. Поскольку пароль не дает доступа непосредственно к компьютеру, на котором находится прокси-сервер, становится гораздо сложнее установить в систему backdoor.

Прокси серверы обычно имеют способ дополнительного ограничения доступа, так что только определенные хосты могут получить доступ к серверам. Большинство также позволяют администратору указывать, пользователей и компьютеры, к которым они могут обращаться. Опять же доступные возможности в основном зависят от используемого программного обеспечения.
10.8.2 Что позволяет делать IPFW?

Программное обеспечение IPFW, поставляемое с FreeBSD, это система фильтрации и учета пакетов, находящаяся в ядре и снабженная пользовательской утилитой настройки, ipfw(8). Вместе они позволяют определять и просматривать правила, используемые ядром при маршрутизации.

IPFW состоит из двух связанных частей. Межсетевой экран осуществляет фильтрацию пакетов. Часть, занимающаяся учетом IP пакетов, отслеживает использование маршрутизатора на основе правил подобных тем, что используются в части межсетевого экрана. Это позволяет администратору определять, например, объем трафика, полученного маршрутизатором от определенного компьютера, или объем пересылаемого WWW трафика.

Благодаря тому, как реализован IPFW, вы можете использовать его и на компьютерах, не являющихся маршрутизаторами для фильтрации входящих и исходящих соединений. Это особый случай более общего использования IPFW, и в этой ситуации используются те же команды и техника.
10.8.3 Включение IPFW в FreeBSD

Поскольку основная часть системы IPFW находится в ядре, вам потребуется добавить один или несколько параметров в файл настройки ядра, в зависимости от требуемых возможностей, и пересобрать ядро. Обратитесь к главе о пересборке ядра (Chapter 9) за подробным описанием этой процедуры.

Warning: Правилом IPFW по умолчанию является deny ip from any to any. Если вы не добавите других правил во время загрузки для разрешения доступа, то заблокируете доступ к серверу с включенным в ядро межсетевым экраном после перезагрузки. Мы предлагаем указать firewall_type=open в файле /etc/rc.conf при первоначальном добавлении межсетевого экрана, а затем, после тестирования его работоспособности, отредактировать правила в файле /etc/rc.firewall. Дополнительной предосторожностью может быть первоначальная настройка межсетевого экрана с локальной консоли, вместо входа через ssh. Кроме того, возможна сборка ядра с параметрами IPFIREWALL и IPFIREWALL_DEFAULT_TO_ACCEPT. В этом случае правило IPFW по умолчанию будет изменено на allow ip from any to any, что предотвратит возможную блокировку.

Существует четыре параметра настройки ядра, относящихся к IPFW:

options IPFIREWALL

Включает в ядро код для фильтрации пакетов.
options IPFIREWALL_VERBOSE

Включает протоколирование пакетов через syslogd(8). Без этого параметра, даже если вы укажете в правилах фильтрации протоколировать пакеты, это не сработает.
options IPFIREWALL_VERBOSE_LIMIT=10

Ограничивает число пакетов, протоколируемых каждым правилом через syslogd(8). Вы можете использовать этот параметр если хотите протоколировать работу межсетевого экрана, но не хотите делать возможной DoS атаку путем переполнения syslog.

Когда для одного из правил в цепочке достигается определенный параметром предел, протоколирование для этого правила выключается. Для включения протоколирования, вам потребуется сбросить соответствующий счетчик с помощью утилиты ipfw(8):
# ipfw zero 4500

где 4500 это номер правила, для которого вы хотите возобновить протоколирование.
options IPFIREWALL_DEFAULT_TO_ACCEPT

Изменяет правило по умолчанию с ``deny'' на ``allow''. Это предотвращает возможное блокирование, если ядро загружено с поддержкой IPFIREWALL, но межсетевой экран еще не настроен. Этот параметр также полезен, если вы используете ipfw(8) в качестве средства от определенных проблем по мере их возникновения. Тем не менее, используйте параметр с осторожностью, поскольку он открывает межсетевой экран и изменяет его поведение.

Note: Предыдущие версии FreeBSD содержали параметр IPFIREWALL_ACCT. Этот параметр устарел, поскольку код автоматически включает возможность учета.
10.8.4 Настройка IPFW

Настройка программного обеспечения IPFW выполняется с помощью утилиты ipfw(8). Синтаксис этой команды выглядит очень сложным, но он становится относительно прост как только вы поймете его структуру.

В настоящее время утилита использует четыре различных категории команд: добавление/удаление (addition/deletion), просмотр (listing), сброс (flushing) и очистка (clearing). Добавление/удаление используется для создания правил, определяющих как пакеты принимаются, отбрасываются и протоколируются. Просмотр используется для определения содержимого набора правил (называемого еще цепочкой) и счетчиков пакетов (учет). Сброс используется для удаления всех правил цепочки. Очистка используется для обнуления одного или нескольких счетчиков.
10.8.4.1 Изменение правил IPFW

Синтаксис этой формы команды такой:

ipfw [-N] команда [номер] действие [log] протокол адреса [параметры]

При использовании этой формы команды доступен один флаг:

-N

Разрешение адресов и имен сервисов при отображении.

Задаваемая команда может быть сокращена до более короткой уникальной формы. Существующие команды:

add

Добавление правила к списку фильтрации/учета
delete

Удаление правила из списка фильтрации/учета

Предыдущие версии IPFW использовали отдельные записи для фильтрации и учета пакетов. Современные версии учитывают пакеты для каждого правила.

Если указано значение номер, оно используется для помещения правила на определенную позицию в цепочке. Иначе правило помещается в конец цепочки с номером на 100 больше, чем у предыдущего правила (сюда не включается правило по умолчанию с номером 65535).

С параметром log соответствующие правила выводят информацию на системную консоль, если ядро собрано с опцией IPFIREWALL_VERBOSE.

Существующие действия:

reject

Отбросить пакет и отправить в адрес источникаICMP пакет, сообщающий о недостижимости хоста или порта.
allow

Пропустить пакет как обычно. (синонимы: pass, permit, и accept)
deny

Отбросить пакет. Источнику не выдается ICMP сообщение (как если бы пакет вообще не достиг цели).
count

Обновить счетчик пакета, но не применять по отношению к нему правила allow/deny. Поиск продолжится со следующего правила в цепочке.

Каждое действие может быть записано в виде более короткого уникального префикса.

Могут быть определены следующие протоколы:

all

Соответствует всем IP пакетам
icmp

Соответствует ICMP пакетам
tcp

Соответствует TCP пакетам
udp

Соответствует UDP пакетам

Поле адреса формируется так:

источник адрес/маска [порт] цель адрес/маска [порт] [via интерфейс]

Вы можете указать port только вместе с протоколами, поддерживающими порты (UDP и TCP).

Параметр via опционален и может содержать IP адрес или имя домена локального IP интерфейса, или имя интерфейса (например ed0), он настраивает правило на соответствие только тем пакетам, которые проходят через этот интерфейс. Номера интерфейсов могут быть заменены на опциональную маску. Например, ppp* будет соответствовать PPP интерфейсам ядра.

Синтаксис, используемый для указания адреса/маски:
адрес
или
адрес/маска-биты
или
адрес:маска-шаблон

Вместо IP адреса возможно указание существующего имени хоста. маска-биты это десятичный номер, указывающий количество бит, которые должны быть установлены в маске адреса. Например, 192.216.222.1/24 создаст маску, соответствующую всем адресам подсети класса C (в данном случае, 192.216.222). A valid hostname may be specified in place of the IP address. маска-шаблон это IP, который будет логически перемножен с заданным адресом. Ключевое слово any может использоваться для обозначения ``любого IP адреса''.

Номера портов указываются в следующем формате:

порт [,порт [,порт [...]]]
для указания одного порта или списка портов, или

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

Доступные параметры:

frag

Срабатывает, если пакет не является первым пакетом дейтаграммы.
in

Соответствует входящим пакетам.
out

Соответствует исходящим пакетам.
ipoptions spec

Срабатывает, если заголовок IP содержит перечисленный через запятую список параметров, указанных в spec. Поддерживаемые параметры IP: ssrr (strict source route), lsrr (loose source route), rr (record packet route), и ts (time stamp). Действие отдельных параметров может быть изменено путем указания префикса !.
established

Срабатывает, если пакет является частью уже установленного TCP соединения (т.е. если установлены биты RST или ACK). Вы можете поднять производительность межсетевого экрана, поместив правило с established близко к началу цепочки.
setup

Соответствует, если пакет является попыткой установки TCP соединения (установлен бит SYN, а бит ACK не установлен).
tcpflags флаги

Срабатывает, если заголовок TCP содержит список перечисленных через запятую флагов. Поддерживаемые флаги: fin, syn, rst, psh, ack, и urg. Действие правил по отдельным флагам может быть изменено указанием префикса !.
icmptypes типы

Срабатывает, если тип пакета ICMP находится в списке типы. Список может быть указан в виде любой комбинации диапазонов и/или отдельных типов, разделенных запятыми. Обычно используемые типы ICMP: 0 echo reply (ping reply), 3 destination unreachable, 5 redirect, 8 echo request (ping request), и 11 time exceeded (используется для обозначения истечения TTL, как с traceroute(8)).
10.8.4.2 Просмотр правил IPFW

Синтаксис этой формы команды такой:

ipfw [-a] [-c] [-d] [-e] [-t] [-N] [-S] list

Для этой формы команды существует семь флагов:

-a

Показывать значения счетчиков. Этот параметр - единственный путь для просмотра значений счетчиков.
-c

Просмотр правил в компактной форме.
-d

Показывать динамические правила в дополнение к статическим.
-e

Если определен параметр -d, показывать также динамические правила с истекшим сроком действия.
-t

Отображать последнее время срабатывание для каждого правила в цепочке. Этот список несовместим с синтаксисом, принимаемым ipfw(8).
-N

Попытаться разрешить заданные адреса и имена сервисов.
-S

Отображать набор, к которому принадлежит каждое правило. Если этот флаг не указан, заблокированные правила не будут отображены.
10.8.4.3 Сброс правил IPFW

Синтаксис для сброса правил:

ipfw flush

Все правила в цепочке будут удалены, за исключением правила по умолчанию, устанавливаемого ядром (номер 65535). Будьте осторожны при сбросе правил; правило, отбрасывающее пакеты по по умолчанию отключит систему от сети, пока разрешающие правила не будут добавлены в цепочку.
10.8.4.4 Очистка счетчиков пакетов IPFW

Синтаксис для очистки одного или нескольких счетчиков пакетов:

ipfw zero [index]

При использовании без аргумента номер будут очищены все счетчики пакетов. Если index указан, операция очистки применяется только к указанному правилу цепочки.
10.8.5 Примеры команд для ipfw

Следующая команда запретит все пакеты с хоста evil.crackers.org на telnet порт хоста nice.people.org:
# ipfw add deny tcp from evil.crackers.org to nice.people.org 23

Следующий пример запрещает и протоколирует весь TCP трафик из сети crackers.org (класса C) к компьютеру nice.people.org (на любой порт).
# ipfw add deny log tcp from evil.crackers.org/24 to nice.people.org

Если вы хотите запретить организацию X сессий в вашу сеть (часть сети класса C), следующая команда осуществит необходимую фильтрацию:
# ipfw add deny tcp from any to my.org/28 6000 setup

Для просмотра записей учета:
# ipfw -a list
или в краткой форме
# ipfw -a l

Вы можете также просмотреть время последнего срабатывания правил с помощью команды:
# ipfw -at l
10.8.6 Создание межсетевого экрана с фильтрацией пакетов

Note: Следующие рекомендации означают только одно: рекомендации. Требования к каждому межсетевому экрану различаются, и мы не можем рассказать вам, как создать межсетевой экран, отвечающий вашим потребностям.

При первоначальной настройке межсетевого экрана, до тестирования производительности и введения сервера в строй, настоятельно рекомендуется использовать версии команд с протоколированием и включить протоколирование в ядре. Это позволит вам быстро выявить проблемные области и исправить настройку без больших усилий. Даже после завершения первоначальной настройки рекомендуется использовать протоколирование для `deny', поскольку это позволяет отслеживать возможные атаки и изменять правила межсетевого экрана, если требования к нему изменятся.

Note: Если вы используете версию команды accept с протоколированием, будьте осторожны, поскольку она может создать большой объем протокольных данных. Будет произведено протоколирование каждого пакета, проходящего через межсетевой экран, поэтому большие объемы FTP/http и другого трафика существенно замедлят систему. Это также увеличит задержку таких пакетов, поскольку ядру требуется выполнить дополнительную работу перед тем, как пропустить пакет. syslogd также будет использовать гораздо больше времени процессора, поскольку он отправит все дополнительные данные на диск, и раздел /var/log может быть быстро заполнен.

Вам потребуется включить межсетевой экран в /etc/rc.conf.local или /etc/rc.conf. Соответствующая страница справочника разъясняет что именно необходимо сделать и содержит примеры готовых настроек. Если вы не используете предустановленную настройку, команда ipfw list может поместить текущий набор правил в файл, откуда он может быть помещен в стартовые файлы системы. Если вы не используете /etc/rc.conf.local или /etc/rc.conf для включения межсетевого экрана, важно убедиться в том, что он включается после настройки интерфейсов.

Далее необходимо определить, что именно делает ваш межсетевой экран! Это в основном зависит от того, насколько широкий доступ вы хотите открыть снаружи к вашей сети. Вот несколько общих правил:


Заблокируйте доступ снаружи к портам TCP с номерами ниже 1024. Здесь расположена большая часть критичных для безопасности сервисов, таких как finger, SMTP (почта) и telnet.

Заблокируйте весь входящий трафик UDP. Есть очень немного полезных сервисов, работающих через UDP, но они обычно представляют угрозу безопасности (например, Sun RPC и NFS протоколы). У этого способа есть и недостатки, поскольку протокол UDP не поддерживает соединения, и запрещение входящих пактов заблокирует также ответы на исходящий UDP трафик. Это может стать проблемой для тех, кто использует внешние серверы, работающие с UDP. Если вы хотите открыть доступ к этим сервисам, потребуется разрешить входящие пакеты с соответствующих портов. К примеру, для ntp вам может потребоваться разрешить пакеты, приходящие с порта 123.

Заблокировать весь трафик снаружи к порту 6000. Порт 6000 используется для доступа к серверам X11, и может быть угрозой безопасности (особенно если у пользователей есть привычка выполнять на своих рабочих станциях команду xhost +). X11 может использовать диапазон портов, начинающийся с 6000, верхний предел определяется количеством X дисплеев, которые могут быть запущены на машине. Верхний предел, определенный RFC 1700 (Assigned Numbers), равен 6063.

Проверьте порты, используемые внутренними сервисами (например, SQL серверами и т.п.). Возможно хорошей идеей является блокирование и этих портов, поскольку они обычно не попадают в диапазон 1-1024, указанный выше.

Еще один список для проверки настроек межсетевого экрана доступен на CERT по адресу http://www.cert.org/tech_tips/packet_filtering.html

Как сказано выше, все эти правила всего лишь руководство. Вы сами сможете решить, какие правила фильтрации будут использованы в межсетевом экране. Мы не можем нести НИКАКОЙ ответственности в случае взлома вашей сети, даже если вы следовали советам, представленным выше.
10.8.7 Накладные расходы и оптимизация IPFW

Многие пользователи хотят знать, как сильно IPFW нагружает систему. Ответ в основном зависит от набора правил и скорости процессора. При небольшом наборе правил для большинства приложений, работающих в Ethernet ответ ``незначительно''. Для тех, кому нужен более точный ответ, и предназначен этот раздел.

Последующие измерения были выполнены с 2.2.5-STABLE на 486-66. (Хотя IPFW немного изменился в последующих релизах FreeBSD, скорость осталась приблизительно той же.) IPFW был модифицирован для измерения времени, затраченного ip_fw_chk, с выводом на консоль результата после каждого 1000-го пакета.

Были протестированы два набора из 1000 правил. Первый был составлен для демонстрации плохого набора правил путем повторения правила:
# ipfw add deny tcp from any to any 55555

Этот набор правил плох, поскольку большая часть правил IPFW не соответствует проверяемым пакетам (из-за номера порта). После 999-й итерации этого правила следует правило allow ip from any to any.

Второй набор правил был разработан для быстрейшей проверки каждого правила:
# ipfw add deny ip from 1.2.3.4 to 1.2.3.4

Не совпадающий IP адрес источника в правиле выше приведет к очень быстрой проверке этих правил. Как и прежде, 1000-е правило allow ip from any to any.

Затраты на проверку пакета в первом случае приблизительно 2.703 мс/пакет, или приблизительно 2.7 микросекунд на правило. Теоретический предел скорости проверки около 370 пакетов в секунду. Предполагая подключение через 10 Mbps Ethernet и размер пакета приблизительно 1500 байт, получаем только 55.5% использования пропускной способности.

Во втором случае каждый пакет был проверен приблизительно за 1.172 мс, или приблизительно 1.2 микросекунд на правило. Теоретический предел скорости проверки около 853 пакетов в секунду, что делает возможным полное использование пропускной способности 10 Mbps Ethernet.

Чрезмерное количество проверяемых правил и их вид не позволяет составить картину близкую к обычным условиям -- эти правила были использованы только для получения информации о времени проверки. Вот несколько рекомендаций, которые необходимо учесть для создания эффективного набора правил:


Поместите правило established как можно раньше для обработки большей части TCP трафика. Не помещайте перед ним правила allow tcp.

Помещайте часто используемые правила ближе к началу набора чем редко используемые (конечно же, без изменения действия всего набора). Вы можете определить наиболее часто используемые правила путем проверки счетчиков пакетов командой ipfw -a l.

Обновлено: 12.03.2015