aboutsummaryrefslogtreecommitdiff
path: root/ru_RU.KOI8-R/books/handbook/firewalls/chapter.sgml
diff options
context:
space:
mode:
Diffstat (limited to 'ru_RU.KOI8-R/books/handbook/firewalls/chapter.sgml')
-rw-r--r--ru_RU.KOI8-R/books/handbook/firewalls/chapter.sgml2494
1 files changed, 2494 insertions, 0 deletions
diff --git a/ru_RU.KOI8-R/books/handbook/firewalls/chapter.sgml b/ru_RU.KOI8-R/books/handbook/firewalls/chapter.sgml
new file mode 100644
index 0000000000..a263055ffa
--- /dev/null
+++ b/ru_RU.KOI8-R/books/handbook/firewalls/chapter.sgml
@@ -0,0 +1,2494 @@
+<!--
+ The FreeBSD Documentation Project
+
+ $FreeBSD$
+ $FreeBSDru: frdp/doc/ru_RU.KOI8-R/books/handbook/firewalls/chapter.sgml,v 1.16 2006/06/20 18:02:32 marck Exp $
+
+ Original revision: 1.95
+
+ XXX: contains non-translated sections! XXX
+-->
+
+<chapter id="firewalls">
+ <chapterinfo>
+ <authorgroup>
+ <author>
+ <firstname>Joseph J.</firstname>
+ <surname>Barbish</surname>
+ <contrib>Предоставил </contrib>
+ </author>
+ </authorgroup>
+ <authorgroup>
+ <author>
+ <firstname>Brad</firstname>
+ <surname>Davis</surname>
+ <contrib>Преобразовал в SGML и обновил </contrib>
+ </author>
+ </authorgroup>
+ </chapterinfo>
+
+ <title>Межсетевые экраны</title>
+
+ <indexterm><primary>межсетевой экран</primary></indexterm>
+ <indexterm>
+ <primary>безопасность</primary>
+ <secondary>межсетевой экран</secondary>
+ </indexterm>
+
+ <!-- только в переводе -->
+ <indexterm>
+ <primary>брандмауэр</primary>
+ <see>межсетевой экран</see>
+ </indexterm>
+
+ <sect1 id="firewalls-intro">
+
+ <title>Введение</title>
+
+ <para>Межсетевые экраны (firewall, брандмауэр)
+ делают возможной фильтрацию входящего и исходящего
+ трафика, идущего через вашу систему. Межсетевой экран использует один
+ или более наборов <quote>правил</quote> для проверки сетевых
+ пакетов при их входе или выходе через сетевое соединение, он
+ или позволяет прохождение трафика или блокирует его. Правила
+ межсетевого экрана могут проверять одну или более характеристик пакетов,
+ включая но не ограничиваясь типом протокола, адресом хоста источника
+ или назначения и портом источника или назначения.</para>
+
+ <para>Межсетевые экраны могут серьезно повысить уровень безопасности хоста
+ или сети. Они могут быть использованы для
+ выполнения одной или более нижеперечисленных задач:</para>
+
+ <itemizedlist>
+ <listitem>
+ <para>Для защиты и изоляции приложений, сервисов и машин во
+ внутренней сети от нежелательного трафика, приходящего
+ из внешней сети интернет.</para>
+ </listitem>
+
+ <listitem>
+ <para>Для ограничения или запрещения доступа хостов внутренней
+ сети к сервисам внешней сети интернет.</para>
+ </listitem>
+
+ <listitem>
+ <para>Для поддержки преобразования сетевых адресов (network
+ address translation, <acronym>NAT</acronym>), что дает возможность
+ задействовать во внутренней сети приватные <acronym>IP</acronym>
+ адреса и совместно использовать одно подключение к сети Интернет
+ (либо через один выделенный
+ <acronym>IP</acronym> адрес, либо через адрес из пула
+ автоматически присваиваемых публичных адресов).</para>
+ </listitem>
+ </itemizedlist>
+
+ <para>После прочтения этой главы вы узнаете:</para>
+
+ <itemizedlist>
+ <listitem>
+ <para>Как правильно задать правила фильтрации
+ пакетов.</para>
+ </listitem>
+
+ <listitem>
+ <para>Разницу между межсетевыми экранами,
+ встроенными в &os;</para>
+ </listitem>
+
+ <listitem>
+ <para>Как использовать и настраивать межсетевой экран
+ OpenBSD <application>PF</application>.</para>
+ </listitem>
+
+ <listitem>
+ <para>Как использовать и настраивать
+ <application>IPFILTER</application>.</para>
+ </listitem>
+
+ <listitem>
+ <para>Как использовать и настраивать
+ <application>IPFW</application>.</para>
+ </listitem>
+ </itemizedlist>
+
+ <para>Перед прочтением этой главы вам потребуется:</para>
+
+ <itemizedlist>
+ <listitem>
+ <para>Ознакомиться с основами &os; и интернет.</para>
+ </listitem>
+ </itemizedlist>
+ </sect1>
+
+ <sect1 id="firewalls-concepts">
+ <title>Принципы работы межсетевых экранов</title>
+
+ <indexterm>
+ <primary>межсетевой экран</primary>
+ <secondary>наборы правил</secondary>
+ </indexterm>
+
+ <para>Существует два основных способа создания наборов правил
+ межсетевого экрана: <quote>включающий</quote> и <quote>исключающий</quote>.
+ Исключающий межсетевой экран позволяет прохождение всего трафика,
+ за исключением трафика, соответствующего набору правил.
+ Включающий межсетевой экран действует прямо противоположным образом.
+ Он пропускает только трафик, соответствующий правилам и
+ блокирует все остальное.</para>
+
+ <para>Включающий межсетевой экран обеспечивает гораздо большую степень
+ контроля исходящего трафика. Поэтому включающий межсетевой экран
+ является лучшим выбором для систем, предоставляющих сервисы в сети
+ Интернет. Он также контролирует тип трафика, порождаемого вне
+ и направляющегося в вашу приватную сеть. Трафик, не попавший в правила,
+ блокируется, а в файл протокола вносятся соответствующие записи.
+ Включающие межсетевые экраны обычно более безопасны, чем
+ исключающие, поскольку они существенно уменьшают риск
+ пропуска межсетевым экраном нежелательного трафика.</para>
+
+ <note>
+ <para>Если не указано иначе, то все приведенные в этом разделе примеры
+ наборов правил и конфигураций относятся к типу включающего межсетевого
+ экрана.</para>
+ </note>
+
+ <para>Безопасность может быть дополнительно повышена с
+ использованием <quote>межсетевого экрана с сохранением
+ состояния</quote>. Такой межсетевой экран сохраняет информацию
+ об открытых соединениях и разрешает только трафик через
+ открытые соединения или открытие новых соединений.
+ Недостаток межсетевого экрана с сохранением состояния в том, что
+ он может быть уязвим для атак <acronym>DoS</acronym>
+ (Denial of Service, отказ в обслуживании), если множество
+ новых соединений открывается очень быстро. Большинство
+ межсетевых экранов позволяют комбинировать поведение с сохранением
+ состояния и без сохранения состояния, что позволяет создавать
+ оптимальную конфигурацию для каждой конкретной системы.</para>
+ </sect1>
+
+ <sect1 id="firewalls-apps">
+
+ <title>Пакеты межсетевых экранов</title>
+
+ <para>В базовую систему &os; встроено три программных межсетевых экрана.
+ Это <emphasis>IPFILTER</emphasis> (известный также как
+ <acronym>IPF</acronym>), <emphasis>IPFIREWALL</emphasis> (известный также
+ как <acronym>IPFW</acronym>) и <emphasis>OpenBSD PacketFilter</emphasis>
+ (также известный как <acronym>PF</acronym>).
+ Помимо этого, &os; содержит два пакета ограничения трафика
+ (по существу, предназначенных для контроля пропускной способности
+ сетевого соединения): &man.altq.4; и &man.dummynet.4;. Dummynet
+ традиционно сильно связан с <acronym>IPFW</acronym>, а
+ <acronym>ALTQ</acronym> с <acronym>PF</acronym>.
+ В настоящее время IPFILTER не поддерживает ограничение пропускной
+ способности сетевого соединения. Для реализации этой функции
+ предлагается использовать IPFILTER совместно с одним из двух существующих
+ пакетов ограничения трафика. Конфигурация следующая: IPFILTER
+ задействуется для фильтрации и трансляции трафика, а
+ <acronym>IPFW</acronym> с &man.dummynet.4; <emphasis>или</emphasis>
+ <acronym>PF</acronym> с <acronym>ALTQ</acronym>
+ &mdash; для контроля пропускной способности сетевого соединения.
+ IPFW и PF для контроля исходящих и входящих пакетов
+ используют наборы правил, хотя и разными способами с разным
+ синтаксисом правил.</para>
+
+ <para>Причина, по которой в &os; включено более одного пакета
+ межсетевых экранов, заключается в том, что разные пользователи выдвигают
+ к ним различные требования и используют разные предпочтения.
+ Нет одного пакета, который был бы очевидно лучше других.</para>
+
+ <para>Автор предпочитает IPFILTER, поскольку его
+ правила с сохранением состояния гораздо проще использовать
+ совместно с <acronym>NAT</acronym>; кроме того, в него встроен
+ ftp прокси, что упрощает правила для фильтрации исходящих FTP
+ соединений.</para>
+
+ <para>Поскольку все межсетевые экраны основаны на анализе значений выбранных
+ полей заголовка пакета, для создания правил межсетевого экрана необходимо
+ понимание принципов <acronym>TCP</acronym>/IP, того, что означают
+ различные поля заголовка пакета, и как эти поля используются в
+ обычной сессии. Хорошим примером является:
+ <ulink url="http://www.ipprimer.com/overview.cfm"></ulink>.</para>
+ </sect1>
+
+ <sect1 id="firewalls-pf">
+ <sect1info>
+ <authorgroup>
+ <author>
+ <firstname>John</firstname>
+ <surname>Ferrell</surname>
+ <contrib>Пересмотрел и обновил </contrib>
+ <!-- 24 March 2008 -->
+ </author>
+ </authorgroup>
+ </sect1info>
+
+ <title>Packet Filter (PF, межсетевой экран OpenBSD) и
+ <acronym>ALTQ</acronym></title>
+
+ <indexterm>
+ <primary>межсетевой экран</primary>
+ <secondary>PF</secondary>
+ </indexterm>
+
+ <para>В июле 2003 программный межсетевой экран OpenBSD, известный как
+ <acronym>PF</acronym>, был портирован в &os; и стал доступен
+ из коллекции портов &os;; первым релизом, где
+ <acronym>PF</acronym> был интегрирован в основную систему,
+ стала &os;&nbsp;5.3 в ноябре 2004.
+ <acronym>PF</acronym> это полноценный межсетевой экран с широким набором
+ возможностей, в котором есть опциональная поддержка
+ <acronym>ALTQ</acronym> (Alternate Queuing).
+ <acronym>ALTQ</acronym> предоставляет управление пропускной способностью
+ Quality of Service (<acronym>QoS</acronym>).</para>
+
+ <para>Проект OpenBSD осуществляет замечательную работу по поддержке
+ <ulink url="http://www.openbsd.org/faq/pf/">PF FAQ</ulink>. Этот раздел
+ руководства фокусируется на взаимосвязи <acronym>PF</acronym> и
+ &os;, предоставляя лишь общую информацию по его использованию.
+ За более подробной информацией по использованию <acronym>PF</acronym>
+ обратитесь к <ulink
+ url="http://www.openbsd.org/faq/pf/">PF FAQ</ulink>.</para>
+
+ <para>Дополнительные сведения о PF для &os; можно получить с веб сайта:
+ <ulink url="http://pf4freebsd.love2party.net/"></ulink>.</para>
+
+ <sect2>
+ <title>Использование модуля ядра PF</title>
+
+ <para>Чтобы загрузить PF как модуль ядра, добавьте следующую строку
+ в <filename>/etc/rc.conf</filename>:</para>
+
+ <programlisting>pf_enable="YES"</programlisting>
+
+ <para>Далее, выполните стартовый скрипт:</para>
+
+ <screen>&prompt.root; <userinput>/etc/rc.d/pf start</userinput></screen>
+
+ <para>Учтите, модуль PF не загрузится, если он не сможет найти
+ конфигурационный файл с набором правил. По умолчанию размещение
+ файла с правилами следующее: <filename>/etc/pf.conf</filename>.
+ Если путь к файлу отличается от вышеприведённого, то внесите в
+ <filename>/etc/rc.conf</filename> строку вида:</para>
+
+ <programlisting>pf_rules="<replaceable>/path/to/pf.conf</replaceable>"</programlisting>
+
+ <para>Файл с примерами конфигураций <filename>pf.conf</filename>
+ находится в каталоге <filename
+ class="directory">/usr/share/examples/pf/</filename>.</para>
+
+ <para>Модуль <acronym>PF</acronym> можно также загрузить вручную:</para>
+
+ <screen>&prompt.root; <userinput>kldload pf.ko</userinput></screen>
+
+ <para>Поддержка ведения логов для <acronym>PF</acronym> обеспечивается
+ модулем <literal>pflog.ko</literal>, для загрузки которого добавьте
+ следующую строку в <filename>/etc/rc.conf</filename>:</para>
+
+ <programlisting>pflog_enable="YES"</programlisting>
+
+ <para>и запустите на выполнение скрипт:</para>
+
+ <screen>&prompt.root; <userinput>/etc/rc.d/pflog start</userinput></screen>
+
+ <para>Если вам необходимы другие функциональные возможности
+ <acronym>PF</acronym>, то придется добавить поддержку
+ <acronym>PF</acronym> в ядро.</para>
+ </sect2>
+
+ <sect2>
+ <title>Параметры ядра</title>
+
+ <indexterm>
+ <primary>параметры ядра</primary>
+ <secondary>device pf</secondary>
+ </indexterm>
+
+ <indexterm>
+ <primary>параметры ядра</primary>
+ <secondary>device pflog</secondary>
+ </indexterm>
+
+ <indexterm>
+ <primary>параметры ядра</primary>
+ <secondary>device pfsync</secondary>
+ </indexterm>
+
+ <para>Включение <acronym>PF</acronym> путем компиляции с ядром &os; не является обязательным
+ требованием,
+ однако вам может понадобиться
+ одна из функциональных возможностей, которая не включена в загружаемый
+ модуль. Например, &man.pfsync.4; являет собой псевдоустройство,
+ которое вносит определенные изменения в таблицу состояний, используемую
+ <acronym>PF</acronym>. В дальнейшем, это псевдоустройство может быть
+ скомпоновано с &man.carp.4; чтобы создать отказоустойчивую систему
+ межсетевых экранов на основе <acronym>PF</acronym>.
+<!-- XXX: "carp" chapter translation is missing (it breaks the build) XXX
+ Дополнительная информация о протоколе <acronym>CARP</acronym>
+ находится в <xref linkend="carp"> руководства. --></para>
+
+ <para>Пример параметров конфигурации ядра для включения PF находится в
+ <filename>/usr/src/sys/conf/NOTES</filename> и показан здесь:</para>
+
+ <programlisting>device pf
+device pflog
+device pfsync</programlisting>
+
+ <para><literal>device pf</literal> включает поддержку межсетевого экрана
+ <quote>Packet Filter</quote> (&man.pf.4;).</para>
+
+ <para><literal>device pflog</literal> включает необязательное сетевое
+ псевдоустройство &man.pflog.4;, которое может использоваться для
+ протоколирования трафика через &man.bpf.4;. Даемон &man.pflogd.8;
+ может использоваться для сохранения протоколируемой информации
+ на диск.</para>
+
+ <para><literal>device pfsync</literal> включает необязательное
+ сетевое псевдоустройство &man.pfsync.4;, используемое для
+ отслеживания <quote>изменений состояния</quote>.</para>
+ </sect2>
+
+ <sect2>
+ <title>Доступные параметры rc.conf</title>
+
+ <para>Для активации <acronym>PF</acronym> и &man.pflog.4; во время
+ загрузки в &man.rc.conf.5; должны быть включены следующие
+ переменные:</para>
+
+ <programlisting>pf_enable="YES" # Включить PF (загрузить модуль если необходимо)
+pf_rules="/etc/pf.conf" # определение правил для pf
+pf_flags="" # дополнительные флаги для запуска pfctl
+pflog_enable="YES" # запустить pflogd(8)
+pflog_logfile="/var/log/pflog" # где pflogd должен сохранять протокол
+pflog_flags="" # дополнительные флаги для запуска pflogd</programlisting>
+
+ <para>Если за межсетевым экраном находится локальная сеть и необходимо передавать
+ пакеты для компьютеров этой сети, или использовать NAT, включите также
+ следующий параметр:</para>
+
+ <programlisting>gateway_enable="YES" # Включить сетевой шлюз</programlisting>
+
+ </sect2>
+
+ <sect2>
+ <title>Создание правил фильтрации</title>
+
+ <para>Пакет <acronym>PF</acronym> читает конфигурацию из файла
+ &man.pf.conf.5; (полный путь: <filename>/etc/pf.conf</filename>);
+ пакеты отвергаются, пропускаются или модифицируются в соответствии с
+ правилами и определениями из этого файла. В стандартную поставку
+ &os; входят несколько файлов с примерами конфигураций, которые
+ находятся в каталоге <filename
+ class="directory">/usr/share/examples/pf/</filename>.
+ За исчерпывающим описанием правил <acronym>PF</acronym> обратитесь
+ к <ulink url="http://www.openbsd.org/faq/pf/">PF FAQ</ulink>.</para>
+
+ <warning>
+ <para>Изучая <ulink url="http://www.openbsd.org/faq/pf/">PF
+ FAQ</ulink>, имейте в виду, что различные версии &os; могут
+ содержать разные версии pf. В настоящий момент &os;
+ использует ту же версию <acronym>PF</acronym>, которая включена
+ в OpenBSD&nbsp;4.1.</para>
+ </warning>
+
+ <para>&a.pf; является хорошим местом, чтобы задавать вопросы по
+ конфигурации и использованию пакета <acronym>PF</acronym>.
+ Не забудьте проверить архивы списка рассылки перед тем, как
+ задавать вопрос.</para>
+ </sect2>
+
+ <sect2>
+ <title>Работа с PF</title>
+
+ <para>Для управления <acronym>PF</acronym> используйте утилиту
+ &man.pfctl.8;. Ниже приведено несколько полезных команд (все
+ возможные команды и опции приведены на странице справочника
+ &man.pfctl.8;):</para>
+
+ <informaltable frame="none" pgwide="1">
+ <tgroup cols="2">
+ <thead>
+ <row>
+ <entry>Команда</entry>
+
+ <entry>Действие</entry>
+ </row>
+ </thead>
+
+ <tbody>
+ <row>
+ <entry><command>pfctl <option>-e</option></command></entry>
+
+ <entry>Включить PF</entry>
+ </row>
+
+ <row>
+ <entry><command>pfctl <option>-d</option></command></entry>
+
+ <entry>Выключить PF</entry>
+ </row>
+
+ <row>
+ <entry><command>pfctl <option>-F</option> all <option>-f</option> /etc/pf.conf</command></entry>
+
+ <entry>Сбросить все правила (NAT, правила фильтрации, состояния
+ соединений, таблицы и т.д.) и загрузить новые с файла
+ <filename>/etc/pf.conf</filename></entry>
+ </row>
+
+ <row>
+ <entry><command>pfctl <option>-s</option> [ rules | nat | state ]</command></entry>
+
+ <entry>Отобразить правила фильтрации, правила NAT или
+ таблицу состояний соединений</entry>
+ </row>
+
+ <row>
+ <entry><command>pfctl <option>-vnf</option> /etc/pf.conf</command></entry>
+
+ <entry>Проверить <filename>/etc/pf.conf</filename> на наличие
+ ошибок, но сами наборы правил не загружать</entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+ </sect2>
+
+ <sect2>
+ <title>Включение <acronym>ALTQ</acronym></title>
+
+ <para><acronym>ALTQ</acronym> может быть включен только путем
+ компилирования ядра &os; с соответствующими параметрами.
+ <acronym>ALTQ</acronym> поддерживается не всеми существующими
+ драйверами сетевых карт. Для просмотра списка поддерживаемых
+ устройств в вашем релизе &os; обратитесь к странице справочника
+ &man.altq.4;.</para>
+
+ <para>Следующие параметры включат <acronym>ALTQ</acronym>
+ и добавят дополнительную функциональность.</para>
+
+ <programlisting>options ALTQ
+options ALTQ_CBQ # Class Bases Queuing (CBQ)
+options ALTQ_RED # Random Early Detection (RED)
+options ALTQ_RIO # RED In/Out
+options ALTQ_HFSC # Hierarchical Packet Scheduler (HFSC)
+options ALTQ_PRIQ # Priority Queuing (PRIQ)
+options ALTQ_NOPCC # Required for SMP build</programlisting>
+
+ <para><literal>options ALTQ</literal> включает подсистему
+ <acronym>ALTQ</acronym>.</para>
+
+ <para><literal>options ALTQ_CBQ</literal> включает <emphasis>Class Based
+ Queuing</emphasis> (<acronym>CBQ</acronym>). <acronym>CBQ</acronym>
+ позволяет распределять пропускную способность соединений
+ по классам или очередям для выставления приоритетов трафика
+ на основе правил фильтрации.</para>
+
+ <para><literal>options ALTQ_RED</literal> включает <emphasis>Random Early
+ Detection</emphasis> (<acronym>RED</acronym>). <acronym>RED</acronym>
+ используется для предотвращения перегрузки сети.
+ <acronym>RED</acronym> вычисляет длину очереди и сравнивает ее
+ с минимальным и максимальным значением длины очереди. Если
+ очередь превышает максимум, все новые пакеты будут отброшены.
+ В соответствии со своим названием, <acronym>RED</acronym>
+ отбрасывает пакеты из различных соединений в произвольном
+ порядке.</para>
+
+ <para><literal>options ALTQ_RIO</literal> включает <emphasis>Random Early
+ Detection In and Out</emphasis>.</para>
+
+ <para><literal>options ALTQ_HFSC</literal> включает
+ <emphasis>Hierarchical Fair Service Curve Packet Scheduler</emphasis>.
+ Дополнительная
+ информация о <acronym>HFSC</acronym> находится по адресу: <ulink
+ url="http://www-2.cs.cmu.edu/~hzhang/HFSC/main.html"></ulink>.
+ </para>
+
+ <para><literal>options ALTQ_PRIQ</literal> включает <emphasis>Priority
+ Queuing</emphasis> (<acronym>PRIQ</acronym>). <acronym>PRIQ</acronym>
+ всегда первым пропускает трафик из очереди c более высоким
+ приоритетом.</para>
+
+ <para><literal>options ALTQ_NOPCC</literal> включает
+ поддержку <acronym>SMP</acronym> для <acronym>ALTQ</acronym>.
+ Эта опция необходима для <acronym>SMP</acronym>
+ систем.</para>
+ </sect2>
+ </sect1>
+
+ <sect1 id="firewalls-ipf">
+ <title>* IPFILTER (IPF)</title>
+
+ <indexterm>
+ <primary>межсетевой экран</primary>
+ <secondary>IPFILTER</secondary>
+ </indexterm>
+
+ <warning><para>Перевод раздела не завершен.</para></warning>
+ <note>
+ <para>Этот раздел находится в процессе написания; содержание
+ может не вполне соответствовать действительности.</para>
+ </note>
+
+ <para>Автором IPFILTER является Darren Reed. IPFILTER не
+ зависит от операционной системы: это приложение с открытыми
+ исходными текстами, которое было портировано на операционные
+ системы &os;, NetBSD, OpenBSD, &sunos;, HP/UX, и &solaris;.
+ IPFILTER активно разрабатывается и поддерживается, регулярно
+ выпускаются обновленные версии.</para>
+
+ <para>IPFILTER основан на межсетевом экране и механизме
+ <acronym>NAT</acronym> уровня ядра, которые управляются и контролируются
+ утилитами уровня пользовательских процессов. Правила межсетевого экрана
+ могут устанавливаться или удаляться утилитой &man.ipf.8;.
+ Правила <acronym>NAT</acronym> могут устанавливаться или
+ удаляться утилитой &man.ipnat.1;. Утилита &man.ipfstat.8;
+ выводит статистику IPFILTER для ядра. Программа
+ &man.ipmon.8; может заносить действия IPFILTER в файлы системных
+ протоколов.</para>
+
+ <para>IPF был первоначально написан с использованием правила
+ <quote>последнее совпадение применяется</quote> и только
+ с правилами без сохранения состояния. Со временем IPF
+ был расширен и включает параметры <quote>quick</quote> и
+ <quote>keep state</quote> (сохранение состояния), которые
+ кардинальным образом изменяют логику обработки пакетов.
+ Официальная документация IPF включает традиционные параметры
+ правил с традиционной последовательностью обработки пакетов.
+ Измененные функции включены в виде дополнительных параметров,
+ они необходимы для создания эффективного межсетевого экрана.</para>
+
+ <para>Инструкции этого раздела подразумевают использование
+ параметра <quote>quick</quote> и параметра сохранения
+ состояния <quote>keep state</quote>. Это основа для создания
+ включающего межсетевого экрана.</para>
+
+ <para>Детальное описание традиционных методов обработки правил:
+ <ulink url="http://www.obfuscation.org/ipf/ipf-howto.html#TOC_1"></ulink>
+ и
+ <ulink url="http://coombs.anu.edu.au/~avalon/ip-filter.html"></ulink>.</para>
+
+ <para>IPF FAQ находится по адресу
+ <ulink url="http://www.phildev.net/ipf/index.html"></ulink>.</para>
+
+ <para>Архив списка рассылки по IPFilter с возможностью поиска доступен
+ по адресу <ulink
+ url="http://marc.theaimsgroup.com/?l=ipfilter"></ulink>.</para>
+
+ <sect2>
+ <title>Включение IPF</title>
+
+ <indexterm>
+ <primary>IPFILTER</primary>
+ <secondary>включение</secondary>
+ </indexterm>
+
+ <para>IPF включен в базовую систему &os; в качестве отдельного
+ загружаемого модуля. Система динамически загрузит модуль IPF,
+ если в <filename>rc.conf</filename> указана переменная
+ <literal>ipfilter_enable="YES"</literal>. Модуль создается
+ с включенным протоколированием и правилом по умолчанию
+ <literal>pass all</literal> (пропускать все). Для изменения
+ правила по умолчанию не обязательно собирать ядро с новыми
+ параметрами. Просто добавьте в конец набора правило,
+ блокирующее все пакеты.</para>
+ </sect2>
+
+ <sect2>
+ <title>Параметры ядра</title>
+
+ <indexterm>
+ <primary>параметры ядра</primary>
+ <secondary>IPFILTER</secondary>
+ </indexterm>
+
+ <indexterm>
+ <primary>параметры ядра</primary>
+ <secondary>IPFILTER_LOG</secondary>
+ </indexterm>
+
+ <indexterm>
+ <primary>параметры ядра</primary>
+ <secondary>IPFILTER_DEFAULT_BLOCK</secondary>
+ </indexterm>
+
+ <indexterm>
+ <primary>IPFILTER</primary>
+ <secondary>параметры ядра</secondary>
+ </indexterm>
+
+ <para>Включение IPF в ядро &os; не является обязательным требованием.
+ Эта процедура представлена здесь в качестве дополнительной
+ информации. При включении IPF в ядро загружаемый модуль
+ не используется.</para>
+
+ <para>Пример параметров настройки ядра для IPF находится в
+ <filename>/usr/src/sys/conf/NOTES</filename>
+ и воспроизведен здесь:</para>
+
+ <programlisting>options IPFILTER
+options IPFILTER_LOG
+options IPFILTER_DEFAULT_BLOCK</programlisting>
+
+ <para><literal>options IPFILTER</literal> включает поддержку
+ межсетевого экрана <quote>IPFILTER</quote>.</para>
+
+ <para><literal>options IPFILTER_LOG</literal> включает
+ протоколирование трафика через IPF путем записи его в
+ псевдо-устройство протоколирования пакетов
+ <devicename>ipl</devicename> для каждого
+ правила, содержащего ключевое слово
+ <literal>log</literal>.</para>
+
+ <para><literal>options IPFILTER_DEFAULT_BLOCK</literal>
+ изменяет поведение по умолчанию так, что блокируется каждый
+ пакет, не соответствующий правилу
+ <literal>pass</literal>.</para>
+
+ <para>Эти настройки будут работать только после сборки и установки
+ нового ядра.</para>
+ </sect2>
+
+ <sect2>
+ <title>Доступные параметры rc.conf</title>
+
+ <para>Для активации IPF во время загрузки в
+ <filename>/etc/rc.conf</filename> потребуется добавить
+ следующие переменные:</para>
+
+ <programlisting>ipfilter_enable="YES" # Запуск межсетевого экрана ipf
+ipfilter_rules="/etc/ipf.rules" # Загрузка файла с правилами
+ipmon_enable="YES" # Включение протоколирования IP monitor
+ipmon_flags="-Ds" # D = запуск в виде даемона
+ # s = протоколирование в syslog
+ # v = протоколирование tcp window, ack, seq
+ # n = отображение имен IP и портов</programlisting>
+
+ <para>Если за межсетевым экраном находится локальная сеть, использующая
+ приватные IP адреса, для включения <acronym>NAT</acronym>
+ потребуется добавить следующие переменные:</para>
+
+ <programlisting>gateway_enable="YES" # Включение шлюза для локальной сети
+ipnat_enable="YES" # Запуск функции ipnat
+ipnat_rules="/etc/ipnat.rules" # Определение файла правил для ipnat</programlisting>
+
+ </sect2>
+
+ <sect2>
+ <title>IPF</title>
+
+ <indexterm>
+ <primary><command>ipf</command></primary>
+ </indexterm>
+
+ <para>Команда &man.ipf.8; используется для загрузки файла с правилами.
+ Обычно создается файл, содержащий подготовленный набор
+ правил, который полностью замещает набор, используемый
+ на данный момент:</para>
+
+ <screen>&prompt.root; <userinput>ipf -Fa -f /etc/ipf.rules</userinput></screen>
+
+ <para><option>-Fa</option> означает сброс всех внутренних таблиц правил.</para>
+
+ <para><option>-f</option> указывает файл с правилами, который необходимо загрузить.</para>
+
+ <para>Это дает вам возможность отредактировать файл с правилами,
+ запустить вышеприведенную команду IPF, тем самым обновить набор правил
+ работающего межсетевого экрана без перезагрузки системы. Для
+ обновления правил
+ такой подход очень удобен, поскольку команду можно выполнять
+ столько раз, сколько нужно.</para>
+
+ <para>На странице справочной системы &man.ipf.8; находится
+ подробная информация по всем флагам этой команды.</para>
+
+ <para>Набор правил для команды &man.ipf.8; должен быть в виде
+ стандартного текстового файла. Правила, написанные в виде
+ скрипта с символами подстановки, не принимаются.</para>
+
+ <para>Есть способ составления правил IPF, использующих
+ символы подстановки. Обратитесь к <xref
+ linkend="firewalls-ipf-rules-script">.</para>
+
+ </sect2>
+
+ <sect2>
+ <title>IPFSTAT</title>
+
+ <indexterm>
+ <primary><command>ipfstat</command></primary>
+ </indexterm>
+
+ <indexterm>
+ <primary>IPFILTER</primary>
+ <secondary>статистика</secondary>
+ </indexterm>
+
+ <para>По умолчанию &man.ipfstat.8; получает и отображает суммарную
+ статистику, полученную в результате применения действующих правил
+ к пакетам, проходящим через межсетевой экран с момента его последнего
+ запуска, или с того момента, когда статистика была последний раз
+ обнулена командой <command>ipf -Z</command>.</para>
+
+ <para>Детальная информация приводится на странице справочника
+ &man.ipfstat.8;.</para>
+
+ <para>Вывод команды &man.ipfstat.8; по умолчанию выглядит
+ примерно так:</para>
+
+ <screen>input packets: blocked 99286 passed 1255609 nomatch 14686 counted 0
+ output packets: blocked 4200 passed 1284345 nomatch 14687 counted 0
+ input packets logged: blocked 99286 passed 0
+ output packets logged: blocked 0 passed 0
+ packets logged: input 0 output 0
+ log failures: input 3898 output 0
+ fragment state(in): kept 0 lost 0
+ fragment state(out): kept 0 lost 0
+ packet state(in): kept 169364 lost 0
+ packet state(out): kept 431395 lost 0
+ ICMP replies: 0 <acronym>TCP</acronym> RSTs sent: 0
+ Result cache hits(in): 1215208 (out): 1098963
+ IN Pullups succeeded: 2 failed: 0
+ OUT Pullups succeeded: 0 failed: 0
+ Fastroute successes: 0 failures: 0
+ <acronym>TCP</acronym> cksum fails(in): 0 (out): 0
+ Packet log flags set: (0)</screen>
+
+ <para>При задании флага <option>-i</option> или <option>-o</option>
+ соответственно для входящих или
+ исходящих пакетов, команда извлечет и отобразит соответствующий
+ список правил, установленных и
+ используемых на данный момент.</para>
+
+ <para><command>ipfstat -in</command> отображает правила, применяемые
+ к входящим пакетам, вместе с номерами этих правил.</para>
+
+ <para><command>ipfstat -on</command> отображает правила, применяемые
+ к исходящим пакетам, вместе с номерами этих правил.</para>
+
+ <para>Вывод команды будет выглядеть примерно так:</para>
+
+ <screen>@1 pass out on xl0 from any to any
+@2 block out on dc0 from any to any
+@3 pass out quick on dc0 proto tcp/udp from any to any keep state</screen>
+
+ <para><command>ipfstat -ih</command> отображает правила, применяемые
+ к входящим пакетам, со счетчиком количества совпадений для
+ каждого правила.</para>
+
+ <para><command>ipfstat -oh</command> отображает правила, применяемые
+ к исходящим пакетам, со счетчиком количества совпадений для
+ каждого правила.</para>
+
+ <para>Вывод команды будет выглядеть примерно так:</para>
+
+ <screen>2451423 pass out on xl0 from any to any
+354727 block out on dc0 from any to any
+430918 pass out quick on dc0 proto tcp/udp from any to any keep state</screen>
+
+ <para>Одна из наиболее важных функций команды
+ <command>ipfstat</command> активируется флагом <option>-t</option>,
+ правила отображаются подобно тому, как &man.top.1;
+ показывает таблицу запущенных процессов &os;. Когда межсетевой экран
+ подвергается атаке, эта функция позволяет обнаружить соответствующие
+ пакеты. Дополнительные флаги дают возможность выбирать IP
+ адрес назначения или источника, порт или протокол, которые
+ будут отслеживаться в реальном времени. Подробная информация
+ приведена на странице &man.ipfstat.8;.</para>
+ </sect2>
+
+ <sect2>
+ <title>IPMON</title>
+
+ <indexterm>
+ <primary><command>ipmon</command></primary>
+ </indexterm>
+
+ <indexterm>
+ <primary>IPFILTER</primary>
+ <secondary>logging</secondary>
+ </indexterm>
+
+ <para>Для того, чтобы стало возможно использование команды
+ <command>ipmon</command>, необходимо включить параметр ядра
+ <literal>IPFILTER_LOG</literal>. Эта команда может использоваться в двух различных
+ режимах. В основном режиме, который используется по умолчанию,
+ она используется без флага <option>-D</option>.</para>
+
+ <para>В режиме даемона создается непрерывный протокол, и возможен
+ просмотр предыдущих событий. В этом режиме IPFILTER работает
+ в &os;. Поскольку в &os; встроена функция ротации файлов
+ протокола, лучше использовать &man.syslogd.8;, чем используемый по
+ умолчанию вывод в обычный файл. В <filename>rc.conf</filename>
+ по умолчанию <literal>ipmon_flags</literal> имеет значение <option>-Ds</option>:</para>
+
+ <programlisting>ipmon_flags="-Ds" # D = start as daemon
+ # s = log to syslog
+ # v = log tcp window, ack, seq
+ # n = map IP &amp; port to names</programlisting>
+
+ <para>Описывать преимущества протоколирования излишне. Например,
+ оно дает возможность отложенного просмотра информации об отброшенных
+ пакетах, откуда они пришли и куда направлялись.
+ Эта информация существенно помогает при отслеживании атак.</para>
+
+ <para>Даже с включенным протоколированием, IPF не ведет протокол
+ для каждого правила. Администратор межсетевого экран должен решить,
+ по каким правилам набора нужно вести протокол и добавить ключевое
+ слово log к этим правилам. Обычно протоколируются только правила,
+ отбрасывающие пакеты.</para>
+
+ <para>Включение в набор последнего правила, запрещающего прохождение
+ пакетов, в сочетании с ключевым словом <literal>log</literal> является
+ довольно распространённой практикой. Так вы можете увидеть все пакеты,
+ не
+ попадающие ни под одно правило набора.</para>
+ </sect2>
+
+ <sect2>
+ <title>Протоколирование IPMON</title>
+
+ <para>Для разделения собираемых данных
+ <application>syslogd</application> использует свой собственный
+ специальный метод. Он использует группировку по категории
+ (<quote>facility</quote>) и уровню (<quote>level</quote>).
+ IPMON в режиме <option>-Ds</option> использует
+ <literal>local0</literal>
+ в качестве имени <quote>категории</quote>.
+ Для дальнейшего разделения
+ протоколируемых данных, если такое необходимо, могут быть использованы следующие
+ уровни:</para>
+
+ <screen>LOG_INFO - packets logged using the "log" keyword as the action rather than pass or block.
+LOG_NOTICE - packets logged which are also passed
+LOG_WARNING - packets logged which are also blocked
+LOG_ERR - packets which have been logged and which can be considered short</screen>
+ <!-- XXX: "can be considered short" == "with incomplete header" -->
+
+ <para>Для указания IPFILTER протоколировать все данные в
+ <filename>/var/log/ipfilter.log</filename>, создайте этот
+ файл заранее, выполнив следующую команду:</para>
+
+ <screen>&prompt.root; <userinput>touch /var/log/ipfilter.log</userinput></screen>
+
+ <para>Функционирование &man.syslogd.8; управляется настройками в файле
+ <filename>/etc/syslog.conf</filename>. Файл
+ <filename>syslog.conf</filename> позволяет достаточно гибко
+ настроить обработку системных сообщений, выдаваемых программами,
+ такими как IPF.</para>
+
+ <para>Добавьте в <filename>/etc/syslog.conf</filename>
+ следующую запись:</para>
+
+ <programlisting>local0.* /var/log/ipfilter.log</programlisting>
+
+ <para><literal>local0.*</literal> означает запись всех
+ протоколируемых сообщений в указанный файл.</para>
+
+ <para>Для применения внесенных в
+ <filename>/etc/syslog.conf</filename> изменений вы можете
+ перезагрузиться или заставить &man.syslogd.8; перечитать
+ <filename>/etc/syslog.conf</filename>, выполнив команду
+ <command>/etc/rc.d/syslogd reload</command>.</para>
+
+ <para>Не забудьте отредактировать
+ <filename>/etc/newsyslog.conf</filename> для ротации только
+ что созданного лог файла.</para>
+ </sect2>
+
+ <sect2>
+ <title>Формат протоколируемых сообщений</title>
+
+ <para>Сообщения, генерируемые <command>ipmon</command>, состоят
+ из полей данных, разделенных пробелами. Поля, общие для всех
+ сообщений:</para>
+
+ <orderedlist>
+ <listitem>
+ <para>Дата получения пакета.</para>
+ </listitem>
+
+ <listitem>
+ <para>Время получения пакета. Формат времени
+ HH:MM:SS.F для часов, минут, секунд и долей секунд
+ (последнее поле может состоять из нескольких цифр).</para>
+ </listitem>
+
+ <listitem>
+ <para>Имя интерфейса, через который прошел пакет,
+ например <devicename>dc0</devicename>.</para>
+ </listitem>
+
+ <listitem>
+ <para>Группа и номер правила, например
+ <literal>@0:17</literal>.</para>
+ </listitem>
+ </orderedlist>
+
+ <para>Эти сообщения могут быть просмотрены командой
+ <command>ipfstat -in</command>.</para>
+
+ <orderedlist>
+ <listitem>
+ <para>Действие: p для пропущенных, b для заблокированных, S
+ для пакетов с неполным заголовком (short packet),
+ n для пакетов, не соответствующих какому-либо правилу,
+ L для соответствующих правилу протоколирования.
+ Порядок следования по флагам: S, p, b, n, L. Знаки
+ P или B в верхнем регистре означают, что пакет был
+ протоколирован в соответствии с общими настройками,
+ а не каким-то конкретным правилом.</para>
+ </listitem>
+
+ <listitem>
+ <para>Адреса. Всего три поля: адрес и порт источника
+ (разделенные запятой), -&gt;, адрес и порт
+ назначения.
+ 209.53.17.22,80 -&gt; 198.73.220.17,1722.</para>
+ </listitem>
+
+ <listitem>
+ <para><literal>PR</literal>, с последующим именем или
+ номером протокола, например <literal>PR tcp</literal>.</para>
+ </listitem>
+
+ <listitem>
+ <para><literal>len</literal>, с последующей длиной заголовка
+ и общей длиной пакета, например <literal>len 20 40</literal>.</para>
+ </listitem>
+ </orderedlist>
+
+ <para>Для <acronym>TCP</acronym> пакетов добавляется дополнительное
+ поле, начинающееся с дефиса, за которым следуют буквы,
+ соответствующие установленным флагам. На странице справочника
+ &man.ipf.5; находится список букв и флагов.</para>
+
+ <para>Для пакетов ICMP, в конце находятся два поля,
+ одно всегда <quote>ICMP</quote>, а второе содержит тип и подтип
+ ICMP сообщения (message и sub-message), разделенные символом косой черты,
+ например ICMP 3/3 для сообщения <quote>port
+ unreachable</quote>.</para>
+ </sect2>
+
+ <sect2 id="firewalls-ipf-rules-script">
+ <title>Создание набора правил с использованием символьной подстановки</title>
+
+ <para>Некоторые опытные пользователи IPF создают файл правил,
+ поддерживающий использование символьной подстановки. Основное
+ преимущество использования такого подхода заключается в
+ возможности изменения значения, присваиваемого символьному
+ имени, в результате чего во всех правилах, содержащих эту
+ символьную подстановку, будет использоваться новое значение.
+ В начале скрипта вы можете поместить часто используемые
+ переменные, а затем использовать их сразу в нескольких
+ правилах. Ниже дан пример такого использования.</para>
+
+ <para>Синтаксис скрипта совместим с &man.sh.1;, &man.csh.1;, и
+ &man.tcsh.1;.</para>
+
+ <para>Символьная подстановка предваряется знаком доллара:
+ <literal>&dollar;</literal>.</para>
+
+ <para>Для присвоения значения символьным переменным знак
+ &dollar; не используется.</para>
+
+ <para>Присваиваемое символической переменной значение должно
+ быть заключено в двойные кавычки (<literal>"</literal>).</para>
+
+ <para>Начните файл правил примерно так:</para>
+
+<programlisting>############# Start of IPF rules script ########################
+
+oif="dc0" # name of the outbound interface
+odns="192.0.2.11" # ISP's DNS server IP address
+myip="192.0.2.7" # my static IP address from ISP
+ks="keep state"
+fks="flags S keep state"
+
+# You can choose between building /etc/ipf.rules file
+# from this script or running this script "as is".
+#
+# Uncomment only one line and comment out another.
+#
+# 1) This can be used for building /etc/ipf.rules:
+#cat &gt; /etc/ipf.rules &lt;&lt; EOF
+#
+# 2) This can be used to run script "as is":
+/sbin/ipf -Fa -f - &lt;&lt; EOF
+
+# Allow out access to my ISP's Domain name server.
+pass out quick on &dollar;oif proto tcp from any to &dollar;odns port = 53 &dollar;fks
+pass out quick on &dollar;oif proto udp from any to &dollar;odns port = 53 &dollar;ks
+
+# Allow out non-secure standard www function
+pass out quick on &dollar;oif proto tcp from &dollar;myip to any port = 80 &dollar;fks
+
+# Allow out secure www function https over TLS SSL
+pass out quick on &dollar;oif proto tcp from &dollar;myip to any port = 443 &dollar;fks
+EOF
+################## End of IPF rules script ########################</programlisting>
+
+ <para>Это все, что требовалось сделать. В данном примере сами
+ правила не важны; важно то, как используется символьная подстановка.
+ Если вышеприведенный пример помещен в файл
+ <filename>/etc/ipf.rules.script</filename>, то набор правил можно
+ перезагрузить, введя следующую команду:</para>
+
+ <screen>&prompt.root; <userinput>sh /etc/ipf.rules.script</userinput></screen>
+
+ <para>С использованием в правилах символьной подстановки связана одна
+ проблема: IPF не понимает символьную подстановку и не может обработать
+ такой скрипт непосредственно.</para>
+
+ <para>Скрипт может использоваться одним из следующих двух
+ способов:</para>
+
+ <itemizedlist>
+ <listitem>
+ <para>Уберите комментарий перед строкой, начинающейся с
+ <literal>cat</literal>, и закомментируйте строку,
+ начинающуюся с <literal>/sbin/ipf</literal>. Поместите
+ строку <literal>ipfilter_enable="YES"</literal> в файл
+ <filename>/etc/rc.conf</filename> как обычно, и запускайте
+ скрипт после каждого его обновления для создания или обновления
+ файла <filename>/etc/ipf.rules</filename>.</para>
+ </listitem>
+
+ <listitem>
+ <para>Отключите IPFILTER в стартовых скриптах системы, поместив
+ строку <literal>ipfilter_enable="NO"</literal> (это значение
+ по умолчанию) в файл <filename>/etc/rc.conf</filename>.</para>
+
+ <para>Поместите скрипт, подобный нижеприведенному, в каталог
+ <filename class="directory">/usr/local/etc/rc.d/</filename>. У него должно
+ быть однозначно говорящее о его назначении имя, например
+ <filename>ipf.loadrules.sh</filename>. Расширение
+ <filename>.sh</filename> обязательно.</para>
+
+ <programlisting>#!/bin/sh
+sh /etc/ipf.rules.script</programlisting>
+
+ <para>Права, установленные на этот файл, должны разрешать чтение, запись и
+ выполнение владельцу <username>root</username>.</para>
+
+ <screen>&prompt.root; <userinput>chmod 700 /usr/local/etc/rc.d/ipf.loadrules.sh</userinput></screen>
+ </listitem>
+ </itemizedlist>
+
+ <para>Теперь, правила IPF будут загружаться при загрузке
+ системы.</para>
+ </sect2>
+
+ <sect2>
+ <title>Наборы правил IPF</title>
+
+ <para>Набор правил ipf это группа правил, составленных для
+ пропускания или блокирования пакетов на основе их содержимого.
+ Двусторонний обмен пакетами между хостами составляет сессию.
+ Межсетевой экран обрабатывает как входящие из Интернет пакеты,
+ так и исходящие пакеты, которые сгенерированы самой системой в ответ
+ на входящий трафик. Для каждой службы <acronym>TCP/IP</acronym>
+ (например, telnet, www, mail, и т.п.) назначен протокол и номер
+ привилегированного (прослушиваемого) порта. Пакеты, предназначенные
+ для определенного сервиса, порождаются с некоторым исходящим адресом
+ и портом из непривилегированного диапазона и направляются
+ на определенный адрес и определенный порт назначения. Все
+ упомянутые параметры (номера портов и адреса) могут использоваться
+ как критерии выбора в правилах, пропускающих или блокирующих доступ
+ к службам <acronym>TCP/IP</acronym>.</para>
+
+
+ <indexterm>
+ <primary>IPFILTER</primary>
+ <secondary>порядок обработки правил</secondary>
+ </indexterm>
+
+ <para>IPF был первоначально написан с использованием логики
+ <quote>последнее совпадающее правило побеждает</quote> и
+ только с правилами без сохранения состояния. Со временем
+ в IPF был включен параметр <quote>quick</quote> и параметр
+ сохранения состояния <quote>keep state</quote>, что
+ существенно улучшило логику обработки правил.</para>
+
+ <para>Инструкции, помещенные в эту главу, созданы с использованием
+ параметров <quote>quick</quote> и <quote>keep state</quote>.
+ Это основа для создания набора правил включающего межсетевого
+ экрана.</para>
+
+ <warning>
+ <para>При работе с правилами межсетевого экрана, будьте
+ <emphasis>очень осторожны</emphasis>. Некоторые
+ конфигурации <emphasis>могут заблокировать вам
+ доступ</emphasis> к серверу. В целях предосторожности,
+ первоначальную настройку межсетевого экрана вы можете
+ выполнить с локальной консоли, а не через удаленное
+ подключение, такое как
+ <application>ssh</application>.</para>
+ </warning>
+ </sect2>
+
+ <!-- Перевод остальной части раздела IPF отложен ... -->
+ </sect1>
+
+ <sect1 id="firewalls-ipfw">
+ <!-- Original revision: 1.100 -->
+ <title>IPFW</title>
+
+ <indexterm>
+ <primary>межсетевой экран</primary>
+
+ <secondary>IPFW</secondary>
+ </indexterm>
+
+ <para>IPFIREWALL (<acronym>IPFW</acronym>) &mdash; представляет
+ собой межсетевой экран, написанный и поддерживаемый добровольными
+ участниками проекта &os;. Он использует stateless правила, т.е.
+ правила без учета состояния, и наследование техники кодирования
+ правил для получения того, что называется простой логикой с
+ сохранением состояния (stateful).</para>
+
+ <para>Пример простейшего набора правил IPFW (находится в
+ <filename>/etc/rc.firewall</filename> и
+ <filename>/etc/rc.firewall6</filename>) в стандартной установке
+ &os; достаточно прост и не рассчитан на непосредственное
+ использование без изменений. В нём не используется фильтрация с
+ сохранением состояния, которая даёт преимущества во многих
+ конфигурациях, поэтому он не может быть взят за основу для этого
+ раздела.</para>
+
+ <para>Синтаксис правил IPFW без сохранения состояния обеспечивает
+ расширенные возможности фильтрации, которые намного превосходят
+ уровень знаний обычного пользователя межсетевого экрана. IPFW
+ рассчитан на профессиональных пользователей или технически
+ продвинутых любителей, которые предъявляют повышенные требования
+ к фильтрации пакетов. Чтобы использовать возможности IPFW в
+ полную силу, необходимы углубленные знания того, как в различных
+ протоколах формируются и используются заголовки пакетов.
+ Углубленное изучение работы протоколов выходит за рамки этого
+ раздела Руководства.</para>
+
+ <para>IPFW состоит из семи компонентов, главный из которых &mdash;
+ процессор правил фильтрации уровня ядра и интегрированный в него
+ механизм учета пакетов, а также средства протоколирования пакетов,
+ правило <literal>divert</literal>, посредством которых вызывается
+ функция <acronym>NAT</acronym> и другие возможности специального
+ назначения, средства для ограничения скорости (шейпинга) трафика
+ (dummynet), средства перенаправления <literal>fwd</literal>,
+ средства организации сетевого моста bridge и механизм ipstealth.
+ IPFW поддерживает протоколы IPv4 и IPv6.</para>
+
+ <sect2 id="firewalls-ipfw-enable">
+ <title>Включение IPFW</title>
+
+ <indexterm>
+ <primary>IPFW</primary>
+
+ <secondary>включение</secondary>
+ </indexterm>
+
+ <para>IPFW включён в базовую установку &os; в виде отдельного
+ подгружаемого модуля. Система динамически загружает модуль
+ ядра, когда в <filename>rc.conf</filename> присутствует строка
+ <literal>firewall_enable="YES"</literal>. Если использовать
+ функциональность <acronym>NAT</acronym> не планируется, то в
+ этом случае дополнительно компилировать IPFW в состав ядра
+ &os; не требуется.</para>
+
+ <para>После перезагрузки системы с
+ <literal>firewall_enable="YES"</literal> в
+ <filename>rc.conf</filename> на экране в процессе загрузки
+ отобразится выделенное белым сообщение:</para>
+
+ <screen>ipfw2 initialized, divert disabled, rule-based forwarding disabled, default to deny, logging disabled</screen>
+
+ <para>Загружаемый модуль скомпилирован с возможностью
+ протоколирования информации о трафике. Для включения
+ протоколирования и установки уровня его детализации имеется
+ переключатель, значение которого можно установить в
+ конфигурационном файле <filename>/etc/sysctl.conf</filename>.
+ При добавлении следующих двух строк протоколирование будет
+ включено при следующей загрузке системы:</para>
+
+ <programlisting>net.inet.ip.fw.verbose=1
+net.inet.ip.fw.verbose_limit=5</programlisting>
+ </sect2>
+
+ <sect2 id="firewalls-ipfw-kernel">
+ <title>Параметры ядра</title>
+
+ <indexterm>
+ <primary>параметры ядра</primary>
+
+ <secondary>IPFIREWALL</secondary>
+ </indexterm>
+
+ <indexterm>
+ <primary>параметры ядра</primary>
+
+ <secondary>IPFIREWALL_VERBOSE</secondary>
+ </indexterm>
+
+ <indexterm>
+ <primary>параметры ядра</primary>
+
+ <secondary>IPFIREWALL_VERBOSE_LIMIT</secondary>
+ </indexterm>
+
+ <indexterm>
+ <primary>IPFW</primary>
+
+ <secondary>параметры ядра</secondary>
+ </indexterm>
+
+ <para>Включение следующих параметров в ядро &os; не является
+ обязательным, если дополнительно не требуется функциональность
+ <acronym>NAT</acronym>. Эти параметры представлены здесь в
+ качестве справочной информации для дальнейших примеров.</para>
+
+ <programlisting>options IPFIREWALL</programlisting>
+
+ <para>Этот параметр включает IPFW в состав ядра.</para>
+
+ <programlisting>options IPFIREWALL_VERBOSE</programlisting>
+
+ <para>Этот параметр включает протоколирование пакетов, которые
+ проходят через IPFW по правилам с ключевым словом
+ <literal>log</literal>.</para>
+
+ <programlisting>options IPFIREWALL_VERBOSE_LIMIT=5</programlisting>
+
+ <para>Ограничение числа пакетов, прошедших через &man.syslogd.8;,
+ отдельно для каждого правила. Этот параметр имеет смысл
+ использовать в недружественной среде, когда необходимо
+ отслеживать активность межсетевого экрана. Это закрывает
+ возможность атак типа <quote>отказ в обслуживании</quote>
+ через флуд сообщениями syslog.</para>
+
+ <indexterm>
+ <primary>параметры ядра</primary>
+
+ <secondary>IPFIREWALL_DEFAULT_TO_ACCEPT</secondary>
+ </indexterm>
+
+ <programlisting>options IPFIREWALL_DEFAULT_TO_ACCEPT</programlisting>
+
+ <para>Этот параметр включает для IPFW разрешающую политику по
+ умолчанию. Это удобно на первых этапах настройки IPFW.</para>
+
+ <indexterm>
+ <primary>параметры ядра</primary>
+
+ <secondary>IPDIVERT</secondary>
+ </indexterm>
+
+ <programlisting>options IPDIVERT</programlisting>
+
+ <para>Включение функциональности <acronym>NAT</acronym>.</para>
+
+ <note>
+ <para>Межсетевой экран будет блокировать все входящие и
+ исходящие пакеты, если отсутствует параметр ядра
+ <literal>IPFIREWALL_DEFAULT_TO_ACCEPT</literal> или правило,
+ явно разрешающее эти соединения.</para>
+ </note>
+ </sect2>
+
+ <sect2 id="firewalls-ipfw-rc">
+ <title>Параметры <filename>/etc/rc.conf</filename></title>
+
+ <para>Включение межсетевого экрана:</para>
+
+ <programlisting>firewall_enable="YES"</programlisting>
+
+ <para>Для выбора одного из стандартных режимов работы
+ межсетевого экрана, предоставляемых &os;, выберите наиболее
+ подходящий в файле <filename>/etc/rc.firewall</filename> и
+ разместите так, как указано ниже:</para>
+
+ <programlisting>firewall_type="open"</programlisting>
+
+ <para>Возможны следующие значения для этого параметра:</para>
+
+ <itemizedlist>
+ <listitem>
+ <para><literal>open</literal> &mdash; пропускать весь
+ трафик.</para>
+ </listitem>
+ <listitem>
+ <para><literal>client</literal> &mdash; защищать только эту
+ машину.</para>
+ </listitem>
+ <listitem>
+ <para><literal>simple</literal> &mdash; защищать всю
+ сеть.</para>
+ </listitem>
+ <listitem>
+ <para><literal>closed</literal> &mdash; полностью запретить
+ IP трафик, за исключением loopback интерфейса.</para>
+ </listitem>
+ <listitem>
+ <para><literal>UNKNOWN</literal> &mdash; отключить загрузку
+ правил межсетевого экрана.</para>
+ </listitem>
+ <listitem>
+ <para><filename><replaceable>filename</replaceable></filename>
+ &mdash; абсолютный путь к файлу, содержащему правила
+ межсетевого экрана.</para>
+ </listitem>
+ </itemizedlist>
+
+ <para>Есть два варианта загрузки собственных правил в
+ межсетевой экран <application>ipfw</application>. Первый
+ способ &mdash; задать переменную <literal>firewall_type</literal>
+ в виде абсолютного пути файла, содержащего <emphasis>правила
+ межсетевого экрана</emphasis> без каких-либо параметров
+ командной строки для самого &man.ipfw.8;. Ниже приведён
+ простой пример набора правил, который блокирует весь входящий
+ и исходящий трафик:</para>
+
+ <programlisting>add deny in
+add deny out</programlisting>
+
+ <para>Второй способ &mdash; установить значение переменной
+ <literal>firewall_script</literal> в виде абсолютного пути
+ исполняемого скрипта, содержащего команды <command>ipfw</command>,
+ которые будут выполнены во время загрузки операционной системы.
+ Правильный формат правил исполняемого скрипта должен
+ соответствовать формату файла, приведённому ниже:</para>
+
+ <programlisting>#!/bin/sh
+
+ipfw -q flush
+
+ipfw add deny in
+ipfw add deny out</programlisting>
+
+ <note>
+ <para>Если переменной <literal>firewall_type</literal> присвоено
+ значение <literal>client</literal> или <literal>simple</literal>,
+ то правила, расположенные по умолчанию в
+ <filename>/etc/rc.firewall</filename>, должны быть приведены
+ в соответствие с конфигурацией данной машины. Также заметим,
+ что для используемых в этой главе примеров в качестве значения
+ переменной <literal>firewall_script</literal> используется
+ <filename>/etc/ipfw.rules</filename>.</para>
+ </note>
+
+ <para>Включение протоколирования:</para>
+
+ <programlisting>firewall_logging="YES"</programlisting>
+
+ <warning>
+ <para>Единственное, что делает параметр
+ <varname>firewall_logging</varname>, &mdash; присвоение
+ логической единицы (<literal>1</literal>) переменной sysctl
+ <varname>net.inet.ip.fw.verbose</varname> (смотрите <xref
+ linkend="firewalls-ipfw-enable">). В <filename>rc.conf</filename>
+ нет переменной для ограничения протоколирования, но это можно
+ сделать через переменную sysctl вручную либо используя файл
+ <filename>/etc/sysctl.conf</filename>:</para>
+
+ <programlisting>net.inet.ip.fw.verbose_limit=5</programlisting>
+ </warning>
+
+ <para>Если ваша машина выполняет роль шлюза, т.е. обеспечивает
+ трансляцию сетевых адресов (NAT) с помощью &man.natd.8;, имеет
+ смысл сразу перейти к чтению <xref linkend="network-natd">
+ для уточнения информации относительно параметров
+ <filename>/etc/rc.conf</filename>.</para>
+ </sect2>
+
+ <sect2 id="firewalls-ipfw-cmd">
+ <title>Команда IPFW</title>
+
+ <indexterm><primary><command>ipfw</command></primary></indexterm>
+
+ <para>Команда <command>ipfw</command> &mdash; это стандартный
+ механизм для ручного добавления/удаления отдельных правил в
+ активной цепочке правил межсетевого экрана. Основная проблема
+ при использовании этого метода состоит в том, что при перезагрузке
+ операционной системы все изменения, сделанные с помощью данной
+ команды, будут утеряны. Вместо этого рекомендуется записать
+ все правила в файл, из которого они будут считываться во время
+ загрузки операционной системы, а также для полной замены текущего
+ набора правил на содержимое из файла.</para>
+
+ <para>Тем не менее, команду <command>ipfw</command> удобно
+ использовать для отображения текущей конфигурации правил на
+ экране консоли. Учетный модуль IPFW динамически создаёт счётчики
+ для каждого правила, которые подсчитывают количество пакетов,
+ соответствующих условиям срабатывания правила. В процессе
+ тестирования отображение правила со своим счётчиком является
+ одним из способов проверки, срабатывает ли правило при прохождении
+ через него пакета или нет.</para>
+
+ <para>Вывод полного списка правил:</para>
+
+ <screen>&prompt.root; <userinput>ipfw list</userinput></screen>
+
+ <para>Вывод полного списка правил с маркером времени последнего
+ срабатывания правила:</para>
+
+ <screen>&prompt.root; <userinput>ipfw -t list</userinput></screen>
+
+ <para>Следующий пример выводит учетную информацию, количество
+ совпавших пакетов и сами правила. Первым столбцом идет номер
+ правила, за ним следует число совпавших исходящих пакетов,
+ третий столбец &mdash; число соответствующих входящих пакетов,
+ и затем само правило.</para>
+
+ <screen>&prompt.root; <userinput>ipfw -a list</userinput></screen>
+
+ <para>Вывод динамических правил вместе со статическими:</para>
+
+ <screen>&prompt.root; <userinput>ipfw -d list</userinput></screen>
+
+ <para>Отобразить статические и динамические правила, в т.ч.
+ с истекшим временем действия:</para>
+
+ <screen>&prompt.root; <userinput>ipfw -d -e list</userinput></screen>
+
+ <para>Обнуление счетчиков:</para>
+
+ <screen>&prompt.root; <userinput>ipfw zero</userinput></screen>
+
+ <para>Обнулить счетчики для правила под номером
+ <replaceable>NUM</replaceable>:</para>
+
+ <screen>&prompt.root; <userinput>ipfw zero <replaceable>NUM</replaceable></userinput></screen>
+ </sect2>
+
+ <sect2 id="firewalls-ipfw-rules">
+ <title>Набор правил IPFW</title>
+
+ <para>Набор правил (ruleset) представляет собой группу правил
+ IPFW, которые разрешают или запрещают прохождение пакета через
+ межсетевой экран на основании значений, содержащихся в пакете.
+ Двунаправленный обмен пакетов между машинами является сессией.
+ Набор правил межсетевого экрана анализирует как пакеты,
+ приходящие из глобальной сети, так и ответные пакеты, исходящие
+ из системы. Каждый <acronym>TCP/IP</acronym> сервис (такой как
+ telnet, www, mail, и т.д.) принадлежит определенному протоколу
+ и привилегированному (прослушиваемому) порту. Пакеты,
+ предназначенные для конкретного сервиса, передаются с
+ непривилегированного (с высоким значением) порта по адресу
+ назначения на указанный порт сервиса. Все эти параметры (т.е.
+ порты и адреса) могут быть использованы в качестве критериев
+ фильтрации при создании правил, которые пропускают или блокируют
+ сервисы.</para>
+
+ <indexterm>
+ <primary>IPFW</primary>
+
+ <secondary>порядок обработки правил</secondary>
+ </indexterm>
+
+ <para>Когда пакет попадает в межсетевой экран, он сравнивается
+ с каждым правилом, начиная с первого, двигаясь по множеству
+ правил верху вниз в порядке увеличения номера правил. Когда
+ пакет совпадает с критерием выбора правила, выполняется действие,
+ указанное в правиле, и на этом поиск правил прекращается.
+ Такой метод поиска известен как <quote>выигрыш первого
+ совпадения</quote>, т.е. после срабатывания правила оставшиеся
+ не просматриваются. Если содержимое пакета не соответствует
+ ни одному из правил, он принудительно попадает на встроенное
+ правило по умолчанию, заданное под номером 65535, которое
+ запрещает и отбрасывает все пакеты без какого-либо отклика
+ в сторону отправителя.</para>
+
+ <note>
+ <para>Поиск продолжается после правил <literal>count</literal>,
+ <literal>skipto</literal> и <literal>tee</literal>.</para>
+ </note>
+
+ <para>Упомянутые здесь инструкции основаны на использовании
+ правил, содержащих параметры с сохранением состояния
+ <literal>keep state</literal>, <literal>limit</literal>,
+ <literal>in</literal>, <literal>out</literal> и
+ <literal>via</literal>. Это основной механизм для кодирования
+ набора правил межсетевого экрана закрытого типа.</para>
+
+ <warning>
+ <para>Будьте осторожны, когда работаете с правилами
+ межсетевого экрана, так как вы можете легко заблокировать
+ самого себя.</para>
+ </warning>
+
+ <sect3 id="firewalls-ipfw-rules-syntax">
+ <title>Синтаксис правил</title>
+
+ <indexterm>
+ <primary>IPFW</primary>
+
+ <secondary>синтаксис правил</secondary>
+ </indexterm>
+
+ <para>Представленный здесь синтаксис правил был упрощен для
+ создания стандартного набора правил межсетевого экрана
+ закрытого типа. Для полного описания синтаксиса правил
+ смотрите страницу Справочника &man.ipfw.8;.</para>
+
+ <para>Правила содержат ключевые слова: эти ключевые слова
+ записываются в строке в определенном порядке слева направо.
+ Ключевые слова выделены полужирным шрифтом. Некоторые
+ ключевые слова имеют дополнительные параметры, которые могут
+ являться ключевыми словами для них самих и также содержать
+ вложенные дополнительные параметры.</para>
+
+ <para>Символ <literal>#</literal> используется для обозначения
+ начала комментария и может быть расположен в конце строки с
+ правилом или в начале строки над правилом. Пустые строки
+ игнорируются.</para>
+
+ <para><replaceable>CMD RULE_NUMBER ACTION LOGGING SELECTION
+ STATEFUL</replaceable></para>
+
+ <sect4>
+ <title>CMD</title>
+
+ <para>Каждое новое правило должно начинаться с префикса
+ <parameter>add</parameter> для добавления во внутреннюю
+ таблицу.</para>
+ </sect4>
+
+ <sect4>
+ <title>RULE_NUMBER</title>
+
+ <para>Каждое правило обозначено номером в диапазоне
+ 1..65535.</para>
+ </sect4>
+
+ <sect4>
+ <title>ACTION</title>
+
+ <para>При соответствии пакета описанным в правиле критериям
+ фильтрации будет выполнено одно из следующих действий.</para>
+
+ <para><parameter>allow | accept | pass |
+ permit</parameter></para>
+
+ <para>Все эти действия означают одно и то же &mdash; пакеты,
+ совпадающие с правилом, могут покинуть обработку правил
+ межсетевого экрана. На этом поиск прекращается.</para>
+
+ <para><parameter>check-state</parameter></para>
+
+ <para>Проверяет пакет на соответствие динамической таблице
+ правил. Если совпадение найдено, выполняется действие,
+ содержащееся в правиле, породившем данное динамическое
+ правило, иначе выполняется переход к следующему правилу.
+ Правило check-state не имеет критериев фильтрации. При
+ отсутствии правила check-state в наборе правил проверка
+ по динамической таблице происходит на первом правиле
+ keep-state или limit.</para>
+
+ <para><parameter>deny | drop</parameter></para>
+
+ <para>Оба слова означают отбрасывание пакетов, совпавших с
+ правилом. Поиск прекращается.</para>
+ </sect4>
+
+ <sect4>
+ <title>Протоколирование</title>
+
+ <para><parameter>log</parameter> или
+ <parameter>logamount</parameter></para>
+
+ <para>Когда пакет совпадает с правилом, содержащим ключевое
+ слово <literal>log</literal>, информация об этом событии
+ записывается в &man.syslogd.8; с пометкой SECURITY. Запись
+ в журнал происходит только в том случае, если число
+ срабатываний для данного правила не превышает значения
+ параметра <literal>logamount</literal>. Если значение
+ <literal>logamount</literal> не объявлено, то ограничение
+ берется из значения переменной sysctl
+ <literal>net.inet.ip.fw.verbose_limit</literal>. В обоих
+ случаях обнуление значения отменяет ограничение. По
+ достижению установленного лимита запись в журнал может быть
+ повторно включена путем сброса счетчика срабатываний или
+ счетчика пакетов для этого правила; смотрите описание
+ команды <command>ipfw reset log</command>.</para>
+
+ <note>
+ <para>Протоколирование осуществляется после проверки на
+ соответствие всем условиям в правиле и перед выполнением
+ окончательного действия (accept, deny) над пакетом. Вы
+ должны выбрать сами, какие действия правил вы хотите
+ включить в журнал.</para>
+ </note>
+ </sect4>
+
+ <sect4>
+ <title>Условия отбора</title>
+
+ <para>Ключевые слова, представленные в этом разделе,
+ используются для описания атрибутов пакета, по которым
+ проверяется условие срабатывания того или иного правила.
+ Для совпадения используется следующая последовательность
+ атрибутов общего назначения:</para>
+
+ <para><parameter>udp | tcp | icmp</parameter></para>
+
+ <para>Также могут быть использованы имена протоколов, описанные
+ в <filename>/etc/protocols</filename>. Указанное значение
+ обозначает протокол для совпадения. Это является обязательным
+ требованием.</para>
+
+ <para><parameter>from src to dst</parameter></para>
+
+ <para>Ключевые слова <literal>from</literal> и <literal>to</literal>
+ служат для фильтрации по IP адресам. Обязательно должны
+ быть указаны и источник, и получатель. <literal>any</literal>
+ &mdash; это специальное ключевое слово, которое соответствует
+ любому IP адресу. <literal>me</literal> &mdash; это
+ специальное ключевое слово, которое соответствует любому из
+ IP адресов, сконфигурированных на интерфейсе вашей системы
+ &os;, и служит для указания компьютера, на котором работает
+ межсетевой экран (т.е. этот компьютер), как показано на
+ примерах <literal>from me to any</literal>,
+ <literal>from any to me</literal>,
+ <literal>from 0.0.0.0/0 to any</literal>,
+ <literal>from any to 0.0.0.0/0</literal>,
+ <literal>from 0.0.0.0 to any</literal>,
+ <literal>from any to 0.0.0.0</literal> и
+ <literal>from me to 0.0.0.0</literal>. IP адрес указывается
+ в виде четырёх чисел, разделённых точками, или дополнительно
+ с префиксом сети (нотация CIDR). Это является обязательным
+ требованием. Для упрощения вычислений, связанных с IP
+ адресами, используйте порт <filename
+ role="package">net-mgmt/ipcalc</filename>. Более подробную
+ информацию можно посмотреть на странице программы: <ulink
+ url="http://jodies.de/ipcalc"></ulink>.</para>
+
+ <para><parameter>port number</parameter></para>
+
+ <para>Для протоколов, работающих с портами (такие как
+ <acronym>TCP</acronym> и <acronym>UDP</acronym>), обязательным
+ требованием является указание номера порта соответствующего
+ сервиса. Вместо номера порта можно использовать имя сервиса
+ (из <filename>/etc/services</filename>).</para>
+
+ <para><parameter>in | out</parameter></para>
+
+ <para>Отбор соответственно по входящим и исходящим пакетам.
+ Присутствие одного из этих ключевым слов в правиле обязательно
+ для формирования критерия фильтрации.</para>
+
+ <para><parameter>via IF</parameter></para>
+
+ <para>Совпадает с пакетами, проходящими через указанный
+ интерфейс. Ключевое слово <literal>via</literal> включает
+ обязательную проверку на указанном интерфейсе в общий
+ процесс поиска совпадений.</para>
+
+ <para><parameter>setup</parameter></para>
+
+ <para>Это обязательное ключевое слово определяет начало
+ запроса сессии для <acronym>TCP</acronym> пакетов.</para>
+
+ <para><parameter>keep-state</parameter></para>
+
+ <para>Это обязательное ключевое слово. При совпадении
+ межсетевой экран создает динамическое правило, которое по
+ умолчанию будет совпадать с двунаправленным трафиком между
+ отправителем и получателем для данной пары IP/порт по
+ указанному протоколу.</para>
+
+ <para><parameter>limit {src-addr | src-port | dst-addr |
+ dst-port}</parameter></para>
+
+ <para>Межсетевой экран разрешит только <replaceable>N</replaceable>
+ соединений с одинаковым набором параметров, указанных в
+ правиле. Можно задавать один или несколько адресов и
+ портов отправителя и получателя. В одном и том же правиле
+ использование <literal>limit</literal> и
+ <literal>keep-state</literal> не допускается. Параметр
+ <literal>limit</literal> предоставляет такую же функцию с
+ сохранением состояний, что и <literal>keep-state</literal>,
+ плюс свои собственные.</para>
+ </sect4>
+ </sect3>
+
+ <sect3>
+ <title>Параметры для правил с сохранением состояния</title>
+
+ <indexterm>
+ <primary>IPFW</primary>
+
+ <secondary>динамическая фильтрация</secondary>
+ </indexterm>
+
+ <para>С точки зрения фильтрации по правилам с сохранением
+ состояния весь трафик выглядит как двусторонний обмен
+ пакетами, включая данные о сессиях. При такой фильтрации
+ у нас есть средства сопоставления и определения корректности
+ процедуры двустороннего обмена пакетами между стороной,
+ породившей пакет, и стороной-получателем. Любые пакеты,
+ которые не подходят под шаблон сессии, автоматически
+ отбрасываются как злонамеренные.</para>
+
+ <para>Параметр <literal>check-state</literal> служит для
+ указания места в наборе правил IPFW, в котором пакет будет
+ передан на поиск соответствий динамическим правилам. В
+ случае совпадения пакет пропускается, при этом создается
+ новое динамическое правило для следующего пакета,
+ принадлежащего данной двусторонней сессии. В противном
+ случае пакет движется по обычным правилам, начиная со
+ следующей позиции.</para>
+
+ <para>Динамические правила уязвимы к атаке SYN-пакетами, которые
+ могут породить гигантское количество динамических правил.
+ Для предотвращения такого рода атак во &os; предусмотрен
+ еще один параметр &mdash; <literal>limit</literal>. Этот
+ параметр служит для ограничения количества одновременно
+ установленных сессий путём проверки полей отправителя и
+ получателя, в зависимости от параметра <literal>limit</literal>,
+ с использованием IP адреса пакета для поиска открытых
+ динамических правил, которые представляют собой счетчик
+ количества совпадений для данного IP адреса и этого правила.
+ Если это количество превышает значение, указанное в параметре
+ <literal>limit</literal>, то такой пакет отбрасывается.</para>
+ </sect3>
+
+ <sect3>
+ <title>Протоколирование сообщений межсетевого экрана</title>
+
+ <indexterm>
+ <primary>IPFW</primary>
+
+ <secondary>протоколирование</secondary>
+ </indexterm>
+
+ <para>Преимущества протоколирования очевидны: это предоставляет
+ возможность отслеживать постфактум, прохождение каких пакетов
+ было отклонено, откуда эти пакеты пришли и куда они назначались
+ для тех правил, в которых включена функция записи в журнал.
+ Это замечательный инструмент для отслеживания атак на вашу
+ систему.</para>
+
+ <para>Даже при включенной функции ведения журнала само по себе
+ оно производиться не будет. Администратор межсетевого экрана
+ определяет, для каких правил будет включена функция ведения
+ журнала, и добавляет к этим правилам <literal>log</literal>.
+ Обычно в журнал пишутся только запрещающие правила, такие как
+ правила deny для входящего <acronym>ICMP</acronym> ping.
+ Довольно часто конец списка добавляют дублирующее правило
+ вида <quote>ipfw default deny everything</quote> с приставкой
+ <literal>log</literal>. Это позволяет отслеживать все пакеты,
+ не совпадающие ни с одним из правил в вашем наборе.</para>
+
+ <para>Будьте крайне осмотрительны при использовании функции
+ ведения журнала, так как это чревато несоразмерным разрастанием
+ файла журнала, вплоть до полного заполнения им места на жестком
+ диске. DoS атаки, направленные на переполнение свободного
+ пространства жесткого диска, являются одними из самых старейших.
+ Помимо заполнения жесткого диска это неприятно еще и тем,
+ что сообщения журнала пишутся не только в
+ <application>syslogd</application>, но также отображаются
+ на экране системной консоли, и это вскоре начинает сильно
+ раздражать.</para>
+
+ <para>Параметр ядра <literal>IPFIREWALL_VERBOSE_LIMIT=5</literal>
+ ограничивает число идущих подряд сообщений в системный
+ регистратор &man.syslogd.8;, касающихся пакетов, совпавших
+ с правилом. Когда этот параметр включен в ядро, число
+ последовательно идущих сообщений для определенного правила
+ обрезается указанным числом. От записи 200 идентичных
+ сообщений особого прока нет. В данном случае для сработавшего
+ правила в журнале <application>syslogd</application> будут
+ зафиксированы 5 сообщений подряд, остальные идентичные сообщения
+ будут подсчитаны и отправлены в <application>syslogd</application>
+ как одно сообщение такого вида:</para>
+
+ <programlisting>last message repeated 45 times</programlisting>
+
+ <para>Путь к файлу, в который пишутся сообщения, задается в
+ файле <filename>/etc/syslog.conf</filename>. По умолчанию
+ это файл <filename>/var/log/security</filename>.</para>
+ </sect3>
+
+ <sect3 id="firewalls-ipfw-rules-script">
+ <title>Написание скрипта правил</title>
+
+ <para>Наиболее опытные пользователи IPFW создают скрипт,
+ содержащий в себе правила, оформленные таким образом, что
+ они могут быть исполнены как обыкновенный sh-скрипт.
+ Основное преимущество такого подхода в том, что правила
+ можно полностью заменить на новые без необходимости в
+ перезагрузке системы для их активации. Это крайне удобно
+ на этапе разработки и тестирования набора правил, т.к.
+ перезагружать весь список правил можно сколь угодно часто.
+ Помимо того, поскольку это скрипт, то здесь можно объявить
+ некие часто используемые значения в виде переменной, и
+ использовать её во множестве правил, как показано в примере
+ ниже.</para>
+
+ <para>Синтаксис примера, приведенного ниже, совместим с тремя
+ командными оболочками: &man.sh.1;, &man.csh.1;, &man.tcsh.1;.
+ Для использования значения ранее объявленной переменной имя
+ переменной предваряется символом &dollar;. Во время
+ присвоения имя переменной не имеет префикса &dollar;,
+ присваиваемое значение должно быть заключено в "двойные
+ кавычки".</para>
+
+ <para>Так выглядит файл с правилами, с которого вы можете
+ начать:</para>
+
+ <programlisting>############### начало примера скрипта с правилами ipfw #############
+#
+ipfw -q -f flush # Сброс всех правил.
+# Установки по умолчанию
+oif="tun0" # наш интерфейс
+odns="192.0.2.11" # IP DNS сервера провайдера
+cmd="ipfw -q add " # префикс для создания правил
+ks="keep-state" # просто лень вводить каждый раз
+&dollar;cmd 00500 check-state
+&dollar;cmd 00502 deny all from any to any frag
+&dollar;cmd 00501 deny tcp from any to any established
+&dollar;cmd 00600 allow tcp from any to any 80 out via &dollar;oif setup &dollar;ks
+&dollar;cmd 00610 allow tcp from any to &dollar;odns 53 out via &dollar;oif setup &dollar;ks
+&dollar;cmd 00611 allow udp from any to &dollar;odns 53 out via &dollar;oif &dollar;ks
+################### конец примера скрипта с правилами ipfw ############</programlisting>
+
+ <para>Вот и все, что нужно сделать. Сами правила в этом примере
+ не столь важны, они написаны ради того, чтобы продемонстрировать
+ использование подстановки значения переменной по ее имени.</para>
+
+ <para>Если бы этот скрипт находился в файле
+ <filename>/etc/ipfw.rules</filename>, то правила можно было
+ бы перезагрузить следующей командой.</para>
+
+ <screen>&prompt.root; <userinput>sh /etc/ipfw.rules</userinput></screen>
+
+ <para>Имя и расположение файла <filename>/etc/ipfw.rules</filename>
+ могут быть какими угодно.</para>
+
+ <para>Такой же результат можно получить, выполнив вручную
+ следующие команды:</para>
+
+ <screen>&prompt.root; <userinput>ipfw -q -f flush</userinput>
+&prompt.root; <userinput>ipfw -q add check-state</userinput>
+&prompt.root; <userinput>ipfw -q add deny all from any to any frag</userinput>
+&prompt.root; <userinput>ipfw -q add deny tcp from any to any established</userinput>
+&prompt.root; <userinput>ipfw -q add allow tcp from any to any 80 out via tun0 setup keep-state</userinput>
+&prompt.root; <userinput>ipfw -q add allow tcp from any to 192.0.2.11 53 out via tun0 setup keep-state</userinput>
+&prompt.root; <userinput>ipfw -q add 00611 allow udp from any to 192.0.2.11 53 out via tun0 keep-state</userinput></screen>
+ </sect3>
+
+ <sect3>
+ <title>Набор правил с сохранением состояния</title>
+
+ <para>Следующий набор правил, не включающий в себя правила
+ трансляции адресов <acronym>NAT</acronym>, является примером
+ того, как создавать правила для межсетевого экрана закрытого
+ типа высокого уровня защиты. Закрытый межсетевой экран
+ разрешает трафик, описанный в разрешающих правилах, и по
+ умолчанию блокирует всё остальное. Межсетевой экран,
+ предназначенный для защиты сегментов сети, имеет как минимум
+ два интерфейса, для которых должны быть написаны правила для
+ работы межсетевого экрана.</para>
+
+ <para>Все разновидности операционных систем &unix;, включая &os;,
+ используют интерфейс <devicename>lo0</devicename> и IP адрес
+ <hostid role="ipaddr">127.0.0.1</hostid> для передачи данных
+ внутри операционной системы. Правила межсетевого экрана должны
+ содержать в своем составе правила, разрешающие беспрепятственное
+ прохождение трафика по этому интерфейсу.</para>
+
+ <para>Интерфейс, подключенный к Интернет, является местом для
+ размещения правил авторизации и контроля доступа исходящих
+ и входящих соединений. Это может быть туннельный интерфейс
+ <acronym>PPP</acronym> <devicename>tun0</devicename> или
+ сетевой адаптер, подключенный к DSL или кабельному модему.</para>
+
+ <para>В случае, когда за межсетевым экраном один и более интерфейсов
+ подсоединён к локальной сети, должны присутствовать правила
+ для беспрепятственного прохождения исходящих пакетов с этих
+ интерфейсов LAN.</para>
+
+ <para>Правила изначально разделяются на три основных раздела:
+ интерфейсы, не ограниченные правилами, правила для исходящего
+ трафика на внешнем интерфейсе и правила для входящего
+ трафика на внешнем интерфейсе.</para>
+
+ <para>В каждом из разделов, относящихся к внешнему интерфейсу,
+ правила должны быть упорядоченны по следующему принципу:
+ наиболее используемые расположены в начале, наименее
+ используемые &mdash; в конце. Последним должно идти правило
+ блокирования и занесения в журнал информации о пакетах на
+ этом интерфейсе, не попавших под предыдущие правила.</para>
+
+ <para>Раздел, описывающий правила для исходящего трафика на
+ внешнем интерфейсе, содержит только разрешающие правила
+ <literal>allow</literal>, состоящие из значений фильтрации,
+ которые однозначно определяют сервис, которому разрешен
+ доступ в Интернет. Все правила включают в себя поля
+ <literal>proto</literal>, <literal>port</literal>,
+ <literal>in/out</literal>, <literal>via</literal> и
+ <literal>keep state</literal>. Правила, содержащие
+ <literal>proto tcp</literal>, имеют также параметр
+ <literal>setup</literal>, который служит для определения
+ начала сессии, которое в дальнейшем передается как условие
+ срабатывания в динамическую таблицу.</para>
+
+ <para>В разделе, описывающем правила для входящего трафика на
+ внешнем интерфейсе, в самом начале должны стоять правила,
+ блокирующие нежелательные пакеты. Так должно быть по двум
+ причинам. Первая состоит в том, что пакеты, сформированные
+ злоумышленником, могут частично или полностью соответствовать
+ разрешающим правилам <literal>allow</literal>. Вторая причина
+ состоит в том, что заведомо не интересующие нас пакеты могут
+ быть просто отклонены, вместо того, чтобы быть перехваченными
+ и записанными в файл журнала по последнему правилу. Последнее
+ правило в каждом разделе блокирует и регистрирует в журнале
+ все пакеты и может быть использовано для юридических
+ обоснований в ходе разбирательств против злоумышленников,
+ атаковавших вашу систему.</para>
+
+ <para>Также следует убедиться в том, что ваш сервер не отвечает
+ ни на какие другие формы непредусмотренного трафика.
+ Некорректные пакеты должны быть просто отброшены. В
+ результате атакующие не получат информацию о том, достиг ли
+ его пакет вашего сервера. Чем меньше атакующие будут знать
+ о вашей системе, тем более она защищена. Назначение
+ нераспознанного номера порта можно посмотреть в файле
+ <filename>/etc/services/</filename> или по адресу <ulink
+ url="http://en.wikipedia.org/wiki/List_of_TCP_and_UDP_port_numbers"></ulink>.
+ Рекомендуем ознакомиться с содержимым ссылки относительно
+ номеров портов, используемых троянами: <ulink
+ url="http://www.sans.org/security-resources/idfaq/oddports.php"></ulink>.</para>
+ </sect3>
+
+ <sect3>
+ <title>Пример правил для межсетевого экрана закрытого типа.</title>
+
+ <para>Следующие правила, не включающие поддержку
+ <acronym>NAT</acronym>, являются логически полным набором
+ правил для межсетевого экрана закрытого типа. При использовании
+ этого набора правил вы вполне можете быть уверены в безопасности
+ вашей системы. Просто закомментируйте некоторые из правил
+ <literal>pass</literal> для тех служб, которые вам не требуются.
+ Чтобы избежать занесения в журнал нежелательных сообщений,
+ добавьте правило <literal>deny</literal> в раздел, описывающий
+ входящий трафик на интерфейсе. Замените название интерфейса
+ <devicename>dc0</devicename>, упоминающегося в правилах ниже,
+ на название интерфейса (NIC), который соединяет вашу систему
+ с глобальной сетью. Для <acronym>PPP</acronym> соединений
+ это будет <devicename>tun0</devicename>.</para>
+
+ <para>Примечание по использованию этих правил.</para>
+
+ <itemizedlist>
+ <listitem>
+ <para>Все запросы начала сессии с внешней сетью используют
+ параметр <literal>keep-state</literal>.</para>
+ </listitem>
+
+ <listitem>
+ <para>Все разрешенные сервисы внешней сети имеют параметр
+ <literal>limit</literal> для защиты от флуда.</para>
+ </listitem>
+
+ <listitem>
+ <para>Все правила используют параметры <literal>in</literal>
+ или <literal>out</literal> для указания направления
+ трафика.</para>
+ </listitem>
+
+ <listitem>
+ <para>Все правила используют параметр <literal>via</literal>
+ <replaceable>имя-интерфейса</replaceable> для уточнения
+ интерфейса, через который проходит пакет.</para>
+ </listitem>
+ </itemizedlist>
+
+ <para>Следующие правила записываются в
+ <filename>/etc/ipfw.rules</filename>.</para>
+
+ <programlisting>################ Начало файла с правилами IPFW ###############################
+# Сброс всех правил перед началом работы скрипта.
+ipfw -q -f flush
+
+# Префикс для создания правил
+cmd="ipfw -q add"
+pif="dc0" # название внешнего интерфейса,
+ # принадлежащего глобальной сети
+
+#################################################################
+# Нет ограничений на внутреннем интерфейсе локальной сети
+# Нет необходимости в этом, если у вас нет локальной сети.
+# Замените xl0 на название интерфейса вашей локальной сети
+#################################################################
+#&dollar;cmd 00005 allow all from any to any via xl0
+
+#################################################################
+# Нет ограничений на интерфейсе Loopback
+#################################################################
+&dollar;cmd 00010 allow all from any to any via lo0
+
+#################################################################
+# Разрешить пакет, если он был ранее добавлен в "динамическую"
+# таблицу при помощи выражения allow keep-state
+#################################################################
+&dollar;cmd 00015 check-state
+
+#################################################################
+# Раздел правил для исходящего трафика на внешнем интерфейсе
+# Анализ запросов начала сессии, идущих из-за межсетевого экрана
+# в локальную сеть или от этого шлюза в интернет.
+#################################################################
+
+# Разрешить исходящий трафик к DNS серверу провайдера
+# x.x.x.x должен быть IP адресом DNS сервера вашего провайдера
+# Продублируйте эти строки, если у вас больше одного DNS сервера
+# Эти IP адреса можно взять из файла /etc/resolv.conf
+&dollar;cmd 00110 allow tcp from any to x.x.x.x 53 out via &dollar;pif setup keep-state
+&dollar;cmd 00111 allow udp from any to x.x.x.x 53 out via &dollar;pif keep-state
+
+# Разрешить исходящий трафик к DHCP серверу провайдера для cable/DSL конфигураций.
+# Это правило не нужно для .user ppp. соединений с глобальной сетью
+# в этом случае вы можете удалить эти правила.
+# Используйте это правило для записи необходимого нам IP адреса в лог-файл.
+# Затем укажите IP адрес в закомментированном правиле и удалите первое правило.
+&dollar;cmd 00120 allow log udp from any to any 67 out via &dollar;pif keep-state
+#&dollar;cmd 00120 allow udp from any to x.x.x.x 67 out via &dollar;pif keep-state
+
+# Разрешить исходящий трафик для незащищенного www соединения
+&dollar;cmd 00200 allow tcp from any to any 80 out via &dollar;pif setup keep-state
+
+# Разрешить исходящий трафик для защищенного www соединения
+# https с поддержкой TLS и SSL
+&dollar;cmd 00220 allow tcp from any to any 443 out via &dollar;pif setup keep-state
+
+# Разрешить исходящий POP/SMTP
+&dollar;cmd 00230 allow tcp from any to any 25 out via &dollar;pif setup keep-state
+&dollar;cmd 00231 allow tcp from any to any 110 out via &dollar;pif setup keep-state
+
+# Разрешить исходящий трафик для FreeBSD (make install &amp; CVSUP)
+# По сути назначаем пользователю root полные привилегии.
+&dollar;cmd 00240 allow tcp from me to any out via &dollar;pif setup keep-state uid root
+
+# Разрешаем исходящий icmp ping
+&dollar;cmd 00250 allow icmp from any to any out via &dollar;pif keep-state
+
+# Разрешаем исходящий трафик Time
+&dollar;cmd 00260 allow tcp from any to any 37 out via &dollar;pif setup keep-state
+
+# Разрешаем исходящий трафик nntp news
+&dollar;cmd 00270 allow tcp from any to any 119 out via &dollar;pif setup keep-state
+
+# Разрешаем исходящий защищённый трафик FTP, Telnet и SCP
+# Эта функция использует SSH (secure shell)
+&dollar;cmd 00280 allow tcp from any to any 22 out via &dollar;pif setup keep-state
+
+# Разрешаем исходящий трафик whois
+&dollar;cmd 00290 allow tcp from any to any 43 out via &dollar;pif setup keep-state
+
+# Запрещаем и заносим в журнал остальной исходящий трафик.
+# Обеспечивает политику межсетевого экрана закрытого типа
+&dollar;cmd 00299 deny log all from any to any out via &dollar;pif
+
+#################################################################
+# Раздел правил для входящего трафика на внешнем интерфейсе
+# Анализ пакетов, приходящих из глобальной сети,
+# предназначенных для этого шлюза или локальной сети
+########################################################################
+
+# Запрещаем весь входящий трафик с немаршрутизируемых сетей
+&dollar;cmd 00300 deny all from 192.168.0.0/16 to any in via &dollar;pif #RFC 1918 private IP
+&dollar;cmd 00301 deny all from 172.16.0.0/12 to any in via &dollar;pif #RFC 1918 private IP
+&dollar;cmd 00302 deny all from 10.0.0.0/8 to any in via &dollar;pif #RFC 1918 private IP
+&dollar;cmd 00303 deny all from 127.0.0.0/8 to any in via &dollar;pif #loopback
+&dollar;cmd 00304 deny all from 0.0.0.0/8 to any in via &dollar;pif #loopback
+&dollar;cmd 00305 deny all from 169.254.0.0/16 to any in via &dollar;pif #DHCP auto-config
+&dollar;cmd 00306 deny all from 192.0.2.0/24 to any in via &dollar;pif #reserved for docs
+&dollar;cmd 00307 deny all from 204.152.64.0/23 to any in via &dollar;pif #Sun cluster interconnect
+&dollar;cmd 00308 deny all from 224.0.0.0/3 to any in via &dollar;pif #Class D &amp; E multicast
+
+# Запрещаем пинг извне
+&dollar;cmd 00310 deny icmp from any to any in via &dollar;pif
+
+# Запрещаем ident
+&dollar;cmd 00315 deny tcp from any to any 113 in via &dollar;pif
+
+# Запрещаем все Netbios службы. 137=name, 138=datagram, 139=session
+# Netbios это MS/Windows сервис обмена.
+# Блокируем MS/Windows hosts2 запросы сервера имен на порту 81
+&dollar;cmd 00320 deny tcp from any to any 137 in via &dollar;pif
+&dollar;cmd 00321 deny tcp from any to any 138 in via &dollar;pif
+&dollar;cmd 00322 deny tcp from any to any 139 in via &dollar;pif
+&dollar;cmd 00323 deny tcp from any to any 81 in via &dollar;pif
+
+# Запрещаем любые опоздавшие пакеты
+&dollar;cmd 00330 deny all from any to any frag in via &dollar;pif
+
+# Запрещаем ACK пакеты, которые не соответствуют динамической таблице правил.
+&dollar;cmd 00332 deny tcp from any to any established in via &dollar;pif
+
+# Разрешаем входящий трафик с DHCP сервера провайдера. Это правило
+# должно содержать IP адрес DHCP сервера вашего провайдера, поскольку
+# только ему разрешено отправлять пакеты данного типа. Необходимо только
+# для проводных и DSL соединений. Для 'user ppp' соединений с глобальной
+# сетью использовать это правило нет необходимости. Это тот же IP адрес,
+# выбранный и используемый вами в разделе правил для исходящего трафика.
+#&dollar;cmd 00360 allow udp from any to x.x.x.x 67 in via &dollar;pif keep-state
+
+# Разрешить входящий трафик для www, так как я использую сервер apache
+&dollar;cmd 00400 allow tcp from any to me 80 in via &dollar;pif setup limit src-addr 2
+
+# Разрешить входящий трафик безопасных FTP, Telnet и SCP из глобальной сети
+&dollar;cmd 00410 allow tcp from any to me 22 in via &dollar;pif setup limit src-addr 2
+
+# Разрешить входящий нешифрованный трафик Telnet из глобальной сети
+# считается небезопасным, потому что ID и PW передаются через глобальную
+# сеть в открытом виде.
+# Удалите этот шаблон, если вы не используете telnet.
+&dollar;cmd 00420 allow tcp from any to me 23 in via &dollar;pif setup limit src-addr 2
+
+# Отбрасываем и заносим в журнал все входящие соединения снаружи
+&dollar;cmd 00499 deny log all from any to any in via &dollar;pif
+
+# Всё остальное запрещено по умолчанию
+# Запрещаем и заносим в журнал все пакеты для дальнейшего анализа
+&dollar;cmd 00999 deny log all from any to any
+################ Конец файла правил IPFW ###############################</programlisting>
+ </sect3>
+
+ <sect3>
+ <title>Пример правил с сохранением состояний и поддержкой
+ <acronym>NAT</acronym></title>
+
+ <indexterm>
+ <primary>NAT</primary>
+
+ <secondary>и IPFW</secondary>
+ </indexterm>
+
+ <para>Здесь перечислены некоторые дополнительные конфигурационные
+ параметры, которые нужно включить, чтобы активировать
+ функцию <acronym>NAT</acronym> в IPFW. В файл конфигурации
+ ядра к остальным параметрам IPFIREWALL нужно добавить строку
+ <literal>option IPDIVERT</literal>.</para>
+
+ <para>В дополнение к обычным параметрам IPFW в
+ <filename>/etc/rc.conf</filename> добавим следующее:</para>
+
+ <programlisting>natd_enable="YES" # Включить функцию <acronym>NAT</acronym>D
+natd_interface="rl0" # Название внешнего сетевого интерфейса
+natd_flags="-dynamic -m" # -m = по возможности сохранить номера портов</programlisting>
+
+ <para>Использование динамических правил с правилом
+ <literal>divert natd</literal> (Network Address Translation)
+ значительно затрудняет логику составления правил. Расположение
+ <literal>check-state</literal> и <literal>divert natd</literal>
+ в таблице правил влияет на поведение межсетевого экрана.
+ Это уже не просто последовательный логический поток. При
+ применении вышеозначенных параметров становится доступным
+ новый тип действия <literal>skipto</literal>. При использовании
+ <literal>skipto</literal> нумерация правил становится
+ обязательной. В качестве аргумента <literal>skipto</literal>
+ используется номер правила, к которому нужно перейти.</para>
+
+ <para>Ниже последует пример метода кодирования, не снабженный
+ комментариями, приведенный здесь для внесения ясности
+ относительно последовательности прохождения пакетов через
+ набор правил.</para>
+
+ <para>Обработка правил начинается с первого по счету и идет
+ последовательно, по правилу за раз, до достижения конца файла,
+ либо если проверяемый пакет соответствует критериям фильтрации;
+ в последнем случае пакет покидает межсетевой экран. Для правил
+ под номерами 100, 101, 450, 500 и 510 важен порядок их
+ расположения. Эти правила управляют трансляцией исходящих и
+ входящих пакетов, таким образом в таблицу keep-state заносятся
+ только приватные IP адреса локальной сети. Обратите внимание,
+ что все правила allow и deny указывают направление, по которому
+ передается пакет (исходящее или входящее) и сетевой интерфейс.
+ Также стоит отметить, что все запросы начала исходящей сессии
+ передаются с использованием <literal>skipto rule 500</literal>
+ для трансляции адресов.</para>
+
+ <para>Предположим, что пользователь локальной сети запрашивает
+ страницу через браузер. Веб-страницы передаются по порту 80.
+ Пакет входит в межсетевой экран. Этот пакет не попадает под
+ правило 100, потому что в критериях фильтрации этого правила
+ указан параметр <literal>in</literal>. Этот пакет не попадает
+ под правило 101, потому что это первый пакет сессии и он еще
+ не был занесен в динамическую таблицу keep-state. Достигнув,
+ наконец, правила 125, пакет удовлетворяет всем критериям
+ фильтрации. Этот пакет является выходящим из интерфейса,
+ взаимодействующим с глобальной сетью. На данном этапе у
+ пакета в качестве исходящего адреса всё еще указан приватный
+ IP адрес локальной сети. По условию этого правила к пакету
+ применяются два действия. Параметр <literal>keep-state</literal>
+ создаст новую запись в динамической таблице keep-state, и
+ выполнится действие, указанное в правиле. Указанное действие
+ является частью информации, заносимой в динамическую таблицу.
+ В данном случае это <literal>skipto rule 500</literal>.
+ Правило 500 транслирует (<acronym>NAT</acronym>) адреса пакета
+ и отпускает его наружу. Данное замечание очень важно. Этот
+ пакет идет к цели, где генерируется ответный пакет и отправляется
+ обратно. Этот новый пакет входит в начало списка правил.
+ На этот раз пакет соответствует правилу 100 и его IP адрес
+ назначения транслируется обратно на соответствующий IP адрес
+ локальной сети. Затем он обрабатывается правилом
+ <literal>check-state</literal>, и поскольку для него уже
+ присутствует в динамической таблице правило, соответствующее
+ данной сессии, пакет пропускается в локальную сеть. Дальше
+ пакет приходит к отправившему его компьютеру локальной сети,
+ и генерируется новый пакет, запрашивающий новую порцию данных
+ с удаленного сервера. На этот раз пакет сразу проверяется
+ правилом <literal>check-state</literal>, и в случае присутствия
+ исходящей записи данного пакета выполняется действие
+ <literal>skipto 500</literal>. Пакет переходит к правилу
+ 500, транслируется и пропускается во внешнюю сеть.</para>
+
+ <para>Для входящего трафика все пакеты, являющиеся частью уже
+ установленной сессии, автоматически разбираются правилом
+ <literal>check-state</literal> и правильно расположенными
+ правилами <literal>divert natd</literal>. Всё, что нам
+ остается сделать, это запретить все плохие пакеты и разрешить
+ прохождение внутрь сети пакетов только для разрешенных сервисов.
+ Допустим, на сервере с межсетевым экраном запущен apache, и
+ мы хотим разрешить людям из глобальной сети доступ на локальный
+ веб-сайт. Новый входящий пакет, запрашивающий начало сессии,
+ соответствует правилу 100, и его IP адрес транслируется как
+ локальный IP системы с межсетевым экраном. Далее пакет
+ проверяется на соответствие вредоносному трафику и в случае
+ отсутствия соответствия попадает на правило 425. В случае
+ соответствия данному правилу происходят две вещи. Пакет
+ правил помещается в динамическую таблицу keep-state, но в
+ этот раз любая новая сессия запросов, порожденных с этого IP,
+ ограничена 2 одновременными соединениями. Это защищает от
+ перегрузки сервис, работающей по указанному номеру порта.
+ В качестве действия в правиле указан <literal>allow</literal>,
+ следовательно пакет пропускается в локальную сеть. Пакет,
+ сформированный в качестве ответа, попадает под
+ <literal>check-state</literal> и распознается им как
+ принадлежащий существующей сессии. Далее он передаётся на
+ правило 500, где происходит обратная трансляция, после чего
+ пакет пропускается на внешний интерфейс.</para>
+
+ <para>Пример файла правил #1:</para>
+
+ <programlisting>#!/bin/sh
+cmd="ipfw -q add"
+skip="skipto 500"
+pif=rl0
+ks="keep-state"
+good_tcpo="22,25,37,43,53,80,443,110,119"
+
+ipfw -q -f flush
+
+&dollar;cmd 002 allow all from any to any via xl0 # разрешаем трафик на локальном интерфейсе
+&dollar;cmd 003 allow all from any to any via lo0 # разрешаем трафик на интерфейсе loopback
+
+&dollar;cmd 100 divert natd ip from any to any in via &dollar;pif
+&dollar;cmd 101 check-state
+
+# Разрешенные исходящие пакеты
+&dollar;cmd 120 &dollar;skip udp from any to xx.168.240.2 53 out via &dollar;pif &dollar;ks
+&dollar;cmd 121 &dollar;skip udp from any to xx.168.240.5 53 out via &dollar;pif &dollar;ks
+&dollar;cmd 125 &dollar;skip tcp from any to any &dollar;good_tcpo out via &dollar;pif setup &dollar;ks
+&dollar;cmd 130 &dollar;skip icmp from any to any out via &dollar;pif &dollar;ks
+&dollar;cmd 135 &dollar;skip udp from any to any 123 out via &dollar;pif &dollar;ks
+
+
+# Запрещаем весь входящий трафик с немаршрутизируемых адресных пространств
+&dollar;cmd 300 deny all from 192.168.0.0/16 to any in via &dollar;pif #RFC 1918 для локальных IP
+&dollar;cmd 301 deny all from 172.16.0.0/12 to any in via &dollar;pif #RFC 1918 для локальных IP
+&dollar;cmd 302 deny all from 10.0.0.0/8 to any in via &dollar;pif #RFC 1918 для локальных IP
+&dollar;cmd 303 deny all from 127.0.0.0/8 to any in via &dollar;pif #loopback
+&dollar;cmd 304 deny all from 0.0.0.0/8 to any in via &dollar;pif #loopback
+&dollar;cmd 305 deny all from 169.254.0.0/16 to any in via &dollar;pif #DHCP авто-конфигурации
+&dollar;cmd 306 deny all from 192.0.2.0/24 to any in via &dollar;pif #Зарезервировано для документации
+&dollar;cmd 307 deny all from 204.152.64.0/23 to any in via &dollar;pif #Sun cluster
+&dollar;cmd 308 deny all from 224.0.0.0/3 to any in via &dollar;pif #Class D &amp; E multicast
+
+# Разрешаем входящие пакеты
+&dollar;cmd 400 allow udp from xx.70.207.54 to any 68 in &dollar;ks
+&dollar;cmd 420 allow tcp from any to me 80 in via &dollar;pif setup limit src-addr 1
+
+
+&dollar;cmd 450 deny log ip from any to any
+
+# Раздел skipto для правил с сохранением состояния для исходящих пакетов
+&dollar;cmd 500 divert natd ip from any to any out via &dollar;pif
+&dollar;cmd 510 allow ip from any to any
+
+######################## Окончание файла правил ##################</programlisting>
+
+ <para>Следующий пример во многом повторяет то, что приведено
+ выше, но использует самодокументирующий стиль записи с
+ исчерпывающими комментариями для того, чтобы помочь начинающему
+ составителю правил IPFW лучше понимать, для чего предназначено
+ то или иное правило.</para>
+
+ <para>Пример файла правил #2:</para>
+
+ <programlisting>#!/bin/sh
+################ Начало файла правил IPFW ###############################
+# Сброс всех правил перед началом работы скрипта.
+ipfw -q -f flush
+
+# Задание стандартных переменных
+cmd="ipfw -q add"
+skip="skipto 800"
+pif="rl0" # название внешнего интерфейса,
+ # принадлежащего глобальной сети
+
+#################################################################
+# Нет ограничений на внутреннем интерфейсе локальной сети
+# Замените xl0 на название интерфейса вашей локальной сети
+#################################################################
+&dollar;cmd 005 allow all from any to any via xl0
+
+#################################################################
+# Нет ограничений на интерфейсе Loopback
+#################################################################
+&dollar;cmd 010 allow all from any to any via lo0
+
+#################################################################
+# Трансляция адреса, если пакет является входящим
+#################################################################
+&dollar;cmd 014 divert natd ip from any to any in via &dollar;pif
+
+#################################################################
+# Разрешить пакет, если он был ранее добавлен в динамическую
+# таблицу при помощи выражения allow keep-state
+#################################################################
+&dollar;cmd 015 check-state
+
+#################################################################
+# Раздел правил для исходящего трафика на внешнем интерфейсе
+# Анализ запросов начала сессии, идущих из-за межсетевого экрана
+# в локальную сеть или от этого шлюза в интернет.
+#################################################################
+
+# Разрешить исходящий трафик к DNS серверу провайдера
+# x.x.x.x должен быть IP адресом DNS сервера вашего провайдера
+# Продублируйте эти строки, если у вас больше одного DNS сервер
+# Эти IP адреса можно взять из файла /etc/resolv.conf
+&dollar;cmd 020 &dollar;skip tcp from any to x.x.x.x 53 out via &dollar;pif setup keep-state
+
+
+# Разрешить исходящий трафик к DHCP серверу провайдера для cable/DSL конфигураций.
+&dollar;cmd 030 &dollar;skip udp from any to x.x.x.x 67 out via &dollar;pif keep-state
+
+# Разрешить исходящий трафик для незащищенного www соединения
+&dollar;cmd 040 &dollar;skip tcp from any to any 80 out via &dollar;pif setup keep-state
+
+# Разрешить исходящий трафик для защищенного www соединения
+# https с поддержкой TLS и SSL
+&dollar;cmd 050 &dollar;skip tcp from any to any 443 out via &dollar;pif setup keep-state
+
+# Разрешить исходящий POP/SMTP
+&dollar;cmd 060 &dollar;skip tcp from any to any 25 out via &dollar;pif setup keep-state
+&dollar;cmd 061 &dollar;skip tcp from any to any 110 out via &dollar;pif setup keep-state
+
+# Разрешить исходящий трафик для FreeBSD (make install &amp; CVSUP)
+# По сути назначаем пользователю root полные привилегии.
+&dollar;cmd 070 &dollar;skip tcp from me to any out via &dollar;pif setup keep-state uid root
+
+# Разрешаем исходящий icmp ping
+&dollar;cmd 080 &dollar;skip icmp from any to any out via &dollar;pif keep-state
+
+# Разрешаем исходящий трафик Time
+&dollar;cmd 090 &dollar;skip tcp from any to any 37 out via &dollar;pif setup keep-state
+
+# Разрешаем исходящий трафик nntp news (т.е. news groups)
+&dollar;cmd 100 &dollar;skip tcp from any to any 119 out via &dollar;pif setup keep-state
+
+# Разрешаем исходящий защищённый трафик FTP, Telnet и SCP
+# Эта функция использует SSH (secure shell)
+&dollar;cmd 110 &dollar;skip tcp from any to any 22 out via &dollar;pif setup keep-state
+
+# Разрешаем исходящий трафик whois
+&dollar;cmd 120 &dollar;skip tcp from any to any 43 out via &dollar;pif setup keep-state
+
+# Разрешаем исходящий трафик ntp
+&dollar;cmd 130 &dollar;skip udp from any to any 123 out via &dollar;pif keep-state
+
+#################################################################
+# Раздел правил для входящего трафика на внешнем интерфейсе
+# Анализ пакетов, приходящих из глобальной сети,
+# предназначенных для этого шлюза или локальной сети
+#################################################################
+
+# Запрещаем весь входящий трафик с немаршрутизируемых сетей
+&dollar;cmd 300 deny all from 192.168.0.0/16 to any in via &dollar;pif #RFC 1918 private IP
+&dollar;cmd 301 deny all from 172.16.0.0/12 to any in via &dollar;pif #RFC 1918 private IP
+&dollar;cmd 302 deny all from 10.0.0.0/8 to any in via &dollar;pif #RFC 1918 private IP
+&dollar;cmd 303 deny all from 127.0.0.0/8 to any in via &dollar;pif #loopback
+&dollar;cmd 304 deny all from 0.0.0.0/8 to any in via &dollar;pif #loopback
+&dollar;cmd 305 deny all from 169.254.0.0/16 to any in via &dollar;pif #DHCP auto-config
+&dollar;cmd 306 deny all from 192.0.2.0/24 to any in via &dollar;pif #reserved for docs
+&dollar;cmd 307 deny all from 204.152.64.0/23 to any in via &dollar;pif #Sun cluster
+&dollar;cmd 308 deny all from 224.0.0.0/3 to any in via &dollar;pif #Class D &amp; E multicast
+
+# Запрещаем ident
+&dollar;cmd 315 deny tcp from any to any 113 in via &dollar;pif
+
+# Запрещаем все Netbios службы. 137=name, 138=datagram, 139=session
+# Netbios это MS/Windows сервис обмена.
+# Блокируем MS/Windows hosts2 запросы сервера имен на порту 81
+&dollar;cmd 320 deny tcp from any to any 137 in via &dollar;pif
+&dollar;cmd 321 deny tcp from any to any 138 in via &dollar;pif
+&dollar;cmd 322 deny tcp from any to any 139 in via &dollar;pif
+&dollar;cmd 323 deny tcp from any to any 81 in via &dollar;pif
+
+# Запрещаем любые опоздавшие пакеты
+&dollar;cmd 330 deny all from any to any frag in via &dollar;pif
+
+# Запрещаем ACK пакеты, которые не соответствуют динамической таблице правил.
+&dollar;cmd 332 deny tcp from any to any established in via &dollar;pif
+
+# Разрешаем входящий трафик с DHCP сервера провайдера. Это правило
+# должно содержать IP адрес DHCP сервера вашего провайдера, поскольку
+# только ему разрешено отправлять пакеты данного типа. Необходимо только
+# для проводных и DSL соединений. Для 'user ppp' соединений с глобальной
+# сетью использовать это правило нет необходимости. Это тот же IP адрес,
+# выбранный и используемый вами в разделе правил для исходящего трафика.
+&dollar;cmd 360 allow udp from x.x.x.x to any 68 in via &dollar;pif keep-state
+
+# Разрешить входящий трафик для www, т.к. я использую Apache сервер.
+&dollar;cmd 370 allow tcp from any to me 80 in via &dollar;pif setup limit src-addr 2
+
+# Разрешить входящий трафик безопасных FTP, Telnet и SCP из глобальной сети
+&dollar;cmd 380 allow tcp from any to me 22 in via &dollar;pif setup limit src-addr 2
+
+# Разрешить входящий нешифрованный трафик Telnet из глобальной сети
+# считается небезопасным, потому что ID и PW передаются через глобальную
+# сеть в открытом виде.
+# Удалите этот шаблон, если вы не используете telnet.
+&dollar;cmd 390 allow tcp from any to me 23 in via &dollar;pif setup limit src-addr 2
+
+# Отбрасываем и заносим в журнал все неразрешенные входящие соединения из глобальной сети
+&dollar;cmd 400 deny log all from any to any in via &dollar;pif
+
+# Отбрасываем и заносим в журнал все неразрешенные исходящие соединения в глобальную сеть
+&dollar;cmd 450 deny log all from any to any out via &dollar;pif
+
+# Место для skipto в правилах с сохранением состояния для исходящих соединений
+&dollar;cmd 800 divert natd ip from any to any out via &dollar;pif
+&dollar;cmd 801 allow ip from any to any
+
+# Всё остальное запрещено по умолчанию
+# Запрещаем и заносим в журнал все пакеты для дальнейшего анализа
+&dollar;cmd 999 deny log all from any to any
+################ Окончание файла правил IPFW ###############################</programlisting>
+ </sect3>
+ </sect2>
+ </sect1>
+</chapter>
+
+<!--
+ Local Variables:
+ mode: sgml
+ sgml-declaration: "../chapter.decl"
+ sgml-indent-data: t
+ sgml-omittag: nil
+ sgml-always-quote-attributes: t
+ sgml-parent-document: ("../book.sgml" "part" "chapter")
+ End:
+-->