OpenBSD PF Глава 1: Создаем такую сеть, которая нужна нам [Оглавление]



PF, подсистема пакетного фильтра (Packet Filter subsystem) OpenBSD - один из лучших доступных инструментов для надёжного контроля вашей сети. Прежде чем погрузиться в особенности того, как настроить сеть на пределе ваших мечтаний, ознакомьтесь с этой главой. Тут объясняются основные сетевые термины и понятия, коротко рассказывается о истории развития PF, а так же даётся краткий обзор того, что вы можете найти в этой книге.

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

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

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

Результат оказался вполне предсказуем. Ещё до того, как персональные компьютеры стали сетевыми, они были целью для вирусов (полуавтоматическим программам, которые могут заражать другие файлы, а так же копировать себя) и трояны (первоначально троянские кони - программы, заставляющие компьютер жертвы выполнять определённые действия). Подключившись к сети, компьютеры подверглись ещё одному типу вирусов - worms или сетевым червям, использующим сеть как среду для самокопирования и распространения. 1 Попутно, на горизонте сетевой безопасности появились различные варианты сетевого мошенничества и сегодня значительная часть активной компьютерной безопасности сконцентрирована на управлении угрозами, с упором на борьбу и каталогизацию вредоносного ПО или так называемого malware.

Бесполезно перечислять всё зло — это было прекрасно сделано в другом месте (смотрите приложение A, например отличное эссе Марка Ранума - «Шесть самых тупых идей в компьютерной безопасности»). Подход OpenBSD заключается, в первую очередь, в способе разработки дизайна и кода. Если в дальнейшем, вы обнаруживаете ошибки и эти ошибки оказываются эксплуатируемыми, после их исправления код возвращается в дерево, даже если это может означать радикальный пересмотр дизайна, и в худшем случае привести к потере совместимости.

В PF, а так же в этой книге, основное внимание концентрируется на сетевом трафике сетевого уровня. Введение divert(4) сокетов в OpenBSD 4.7. сделало проще настройку системы, где PF используется для глубокой инспекции пакетов. Тем не менее, не всё свободное ПО имеет специфический интерфейс пользователя, поэтому мы сфокусируемся на некоторых методах основаных на поведении присущем сетевому уровню (наиболее очевидно это показано в примере конфигурации главы 6) что поможет снизить нагрузку на программы контроля контекста, если они у вас имеются. В следующих главах вы увидите, что сетевой уровень предлагает множество возможностей кроме блокирования и разрешения пакетов.

Сильные стороны PF

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

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

Пакетный фильтр может сдерживать нежелательный сетевой трафик. Кроме того, он может помочь контролировать внутри сетевой трафик вашей собственной внутренней сети. Обе эти функции очень важны в концепции брандмауэра, однако блокирование трафика далеко не единственная полезная и интересная функциональная особенность пакетного фильтра.

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

Развитие PF

Если вас интересует история, вероятно вы знаете, что OpenBSD и другие BSD 3 ОС являются прямыми потомками системы BSD (иногда говорят о BSD Unix), операционной системы включающей эталонную реализацию протоколов стека TCP/IP начала 80-х годов.

Как исследовательский проект BSD был свёрнут в начале 90-х годов и его код был освобождён для дальнейшего развития небольшими группами энтузиастов по всему миру. некоторые из этих энтузиастов были ответственны за сохранение жизненно важных частей инфраструктуры Интернет и развитие BSD продолжалось несколькими параллельными направлениями под эгидой различных групп. OpenBSD стала известна как наиболее безопасная ОС основанная на BSD. в качестве системы фильтрации пакетов, данная система использовала подсистему названную IPFilter, написанную Дарреном Ридом (Darren Reed).

В начале 2001 года, сообщество OpenBSD было шокировано заявлением Рида который объявил, что IPFilter, который на тот момент был тесно интегрирован с OpenBSD, не попадает под лицензию BSD. Вместо этого, он использует практически аналогичную лицензию, исключая право внесения изменений в код и распространение результата изменений. Проблема заключалась в том, что версия IPFilter OpenBSD включала несколько изменений и настроек, которые, как оказалось, не попадали под действие лицензии. В результате, 29 мая 2001 года, IPFilter был удалён из дерева исходных кодов OpenBSD и в течении нескольких недель, OpenBSD (-current) не включала никакого ПО бранмауэра.

К счастью, в это время, в Швейцарии, Даниэль Хартмейер (Daniel Hartmeier) производил некоторые эксперименты с сетевой частью кода ядра. Он начал с подключения собственной небольшой функции к сетевому стэку, а затем пропустил через неё сетевые пакеты. Затем он задумался о фильтрации. Когда наступил описанный ранее кризис с лицензией, PF уже находился в стадии разработки. Первый коммит кода PF пришёлся на воскресенье 24 июня 2001 года в 19:48:58 UTC. Через несколько месяцев интенсивной работы результирующая версия PF была выдвинута в качестве основной части базовой системы OpenBSD 3.0 в декабре 2001 года. 4 Эта версия включала достаточно полную реализацию пакетного фильтра, в том числе включая NAT, который был достаточно похожим на IPFilter, т.ч. переход на новую версию OpenBSD не составил особых проблем.

PF оказался хорошо разработанным ПО. В 2002 году Хартмейер получил подтверждение USENIX, доказывающее что тесты производительности OpenBSD 3.1 PF выполняются одинаково хорошо или даже лучше чем IPFilter на OpenBSD 3.1 или IPTables на Linux. Кроме того, тесты выполненные на PF OpenBSD 3.0 показали, что код повышает эффективность с версии 3.0 до версии 3.1. 6

Код OpenBSD PF, написаный с помощью нового движка фильтрации пакетов, опытными разработчиками, естетственно вызвал интерес других групп BSD. Проект FreeBSD постепенно принял PF, сначала в качестве пакета, а затем, начиная с версии 5.3 в качестве одного из трёх компонентов фильтрации пакетов базовой системы. Кроме того, PF был включён в NetBSD и DragonFlyBSD.

Эта книга посвящена PF доступном в OpenBSD 4.8, и, в случае необходимости, я буду отмечать значительные различия между этой версией и теми, которые интегрированы в другие системы. Если вы гготовы погрузиться в конфигурирование PF, вы можете перейти к Главе 2, чтобы сразу начать работу.

Если вы хотите потратить немного времени и прокатиться по незнакомой территории BSD, можете продолжить чтение этой главы.

Врезка: Новые версии PF работают лучше!
Как и всё в мире компьютеров, OpenBSD и PF были затронуты быстрыми изменениями аппаратных средств с
сетей связи. Я не видел тестов сопоставимости USENIX, однако пользователи PF находят, что накладные
расходы при использовании PF весьма скромные. В качестве примера (в основном, чтобы показать, что даже
слабые конфигурации оборудования вполне применимы), одна из фирм использовала в качестве сетевых
шлюзов машины в конфигурации Pentium III 450МГц c 384Мб памяти. При этом я не могу припомнить, чтобы
простой машины составлял менее 96%!
Стоит отметить, что текущие разработчики PF, в основном Хеннинг Брауэр (Henning Brauer) и Райан Мак'Брид
(Ryan McBride), при участии ряда других, внесли ряд оптимизаций в код OpenBSD PF в нескольких последних
релизах, что делало каждый последующий релиз с 4.4 по 4.8 заметно лучше предыдущего.

Миграция на PF

Если вы читаете это по той причине, что планируете переместить настройки PF из другой системы - этот раздел для вас.

Если вы хотите использовать PF, необходимо установить и запустить системы такие как OpenBSD, FreeBSD, NetBSD или DragonFly BSD. Всё это - прекрасные ОС, но лично мне больше нравится OpenBSD, в основном по той причине, что это та операционная система в которой, по существу, происходит развитие PF, и мне нравится деловой подход к её разработке. Иногда, небольшие изменения и исправления ошибок присходят в реализациях PF на других системах, но новый и самый современный код PF всегда можно найти в OpenBSD.

Некоторые из особенностей описанные в этой книге доступны только в последних версиях OpenBSD. Другие BSD системы, как правило портируют последние релизы PF OpenBSD в свой базовый код, однако синхронизация обновлений далеко не гарантирована и отставание может быть значительным.

Если вы планируете использовать PF на FreeBSD, NetBSD, DragonFly BSD или других системах, вы должны проверить замечания к релизу для вашей системы и прочую документацию, в целях получения подробной информации о включённой версии PF.

Информация для Linux пользователей

Сходство и различие между Linux и BSD - тема потенциально большая, если копать достаточно глубоко, но если вы имеете базовые навыки эта проблема не займёт у вас слишком много времени. В остальной части книги, я буду считать, что вы можете найти свой путь базовой конфигурации сети BSD. Т.ч., если вы больше знакомы с настройкой Linux или прочих систем, стоит отметить несколько моментов присущих конфигурированию BSD: Если вам требуются более широкие и тщательные сведения о вашей BSD системе, обратитесь к документации по системе, в том числе FAQ, спискам рассылки и официальным сайтам проектов. Некоторые рекомендации для прочтения вы можете найти в Приложение А.

Часто задаваемые вопросы о PF

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

Могу ли я запустить PF на своей Linux машине?

Если отвечать одним словом - нет. На протяжении многих лет в списках рассылки появлялись заявления, что начато портирование PF на Linux, но на момент написания этой книги, всё ещё нет утверждения что задача решена. Основная причина этого, вероятно, состоит в том, что PF разработан, прежде всего, как неотъемлемая часть сетевого стека OpenBSD. Даже после более чем десятилетнего параллельного развития код OpenBSD содержит достаточно много общего с другими BSD системами, что позволяет осуществить перенос, но портирование PF на не-BSD системы потребует переписывания значительных кусков кода PF, и частей интеграции на целевой системе.

Несколько простых советов ориентирующих пользователей Linux в BSD представлены в на странице 6 "Указания для пользователей Linux".

Можете ли вы порекомендовать графический интерфейс для управления набором правил PF?

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

Общая проблема в том, что конфигурационные файлы PF легко читаемы, т.ч. графический интерфейс, на самом деле, не является крайне необходимым. В любом случае, существует несколько графических инструментов, которые позволяют редактировать и/или генерировать конфигурацию PF, в том числе и специализированный дистрибутив FreeBSD называемый pfSense (http://pfsense.org), включающий в себя достаточно комплексный GUI редактор.

Я рекомендую изучить эту книгу, особенно части относящие к вашей ситуации, а затем решить вопрос о необходимости использования GUI.

Имеется ли инструментарий, позволяющий преобразовать мои настройки другого брандмауэра в конфигурацию PF?

Лучшая стратегия переноса настроек сети, в том числе и настроек брандмауэра, с одного ПО на другое - собрать спецификации и политики конфигурации вашей сети или брандмауэра, а затем реализовать политики используя новый инструмент.

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

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

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

Некоторые из инструментов обладающих адинистративным интерфейсом имеют возможность формирования файлов конфигурации для нескольких различных типов брандмауэров и, вполне очевидно, могут использоваться в качестве инструментов преобразования настроек. Однако, при этом возникает эффект создания нового уровня абстракции между вами и вашим набором правил, что ставит вас в зависимость от понимания автора инструмента о том, как работает набор правил PF. Я рекомендую ознакомиться с соответствующими частями этой книги, прежде чем начинать тратить время на серьёзное рассмотрение проблемы автоматизированного преобразования настроек.

Почему вдруг изменился синтаксис правил PF?

Мир меняется, а вместе с ним меняется и PF. В частности, разработчики OpenBSD очень активно и весьма критично относятся к своему коду, и соответственно как и все части OpenBSD, код PF находится под постоянным контролем.

Уроки извлечённые в течение почти десяти лет развития и использования PF привели к внутренним изменениям кода, который в конечном счёте ясно дал понять разработчикам, что незначительное изменение синтаксиса имело бы смысл. Для пользователей, результатом стало то, что PF стал проще в использовании и работает лучше чем в более ранних версиях. Если вы обновите свою систему до OpenBSD 4.7 или выше, вы почувствуете реальное удовольствие от работы.

Где я могу узнать больше?

Существует несколько хороших источников информации о PF и системах на которых он работает. Один из них вы найдёте в этой книге. Ссылки на печатные издания вы можете обнаружить в Приложении А.

Если у вас есть BSD системы с установленным PF, обратитесь к man страницам руководства для получения информации о особенностях текущей версии PF. Если не указано иное, информация этой книги относится к системе OpenBSD 4.8.

Маленькое восхваление: Хайку о PF

Если вы всё таки не совсем уверены - предложим небольшую долю восхваления. За прошедшие годы многие люди много говорили и писали о PF - иногда странное, иногда прекрасное, а иногда совершенно странное.

Стихотворение приведённое здесь, является хорошим показателем того чувства, которое PF вызывает у своих пользователей. Это стихотворение (поэма) появилась в списке рассылки PF, в потоке начинавшемся с сообщения "Вещи которое не может PF?" в мае 2004 года. Сообщение было написано кем- то, кто имел совсем мало опыта работы с брандмауэром и не мог добиться желаемого результата.

Конечно, это привело к некоторой дискуссии среди участников, обсуждающей трудность освоения PF новичками, возможные альтернативы типа Bitdefender и пр. Поток закончился следующей восхвалительной хайку, написанной Джейсоном Диксоном (Jason Dixon), 20 мая 2004 года.

Сравнение работы iptables и PF подобно этому хайку
Некоторые из концепций которые Диксон использует здесь могут звучать незнакомо, но если вы продолжите читать книгу, они скоро обретут смысл.