diff options
Diffstat (limited to 'ru_RU.KOI8-R/books/handbook/firewalls/chapter.sgml')
-rw-r--r-- | ru_RU.KOI8-R/books/handbook/firewalls/chapter.sgml | 2494 |
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> + — для контроля пропускной способности сетевого соединения. + 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; 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 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 & 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>Адреса. Всего три поля: адрес и порт источника + (разделенные запятой), ->, адрес и порт + назначения. + 209.53.17.22,80 -> 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>$</literal>.</para> + + <para>Для присвоения значения символьным переменным знак + $ не используется.</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 > /etc/ipf.rules << EOF +# +# 2) This can be used to run script "as is": +/sbin/ipf -Fa -f - << EOF + +# Allow out access to my ISP's Domain name server. +pass out quick on $oif proto tcp from any to $odns port = 53 $fks +pass out quick on $oif proto udp from any to $odns port = 53 $ks + +# Allow out non-secure standard www function +pass out quick on $oif proto tcp from $myip to any port = 80 $fks + +# Allow out secure www function https over TLS SSL +pass out quick on $oif proto tcp from $myip to any port = 443 $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>) — представляет + собой межсетевой экран, написанный и поддерживаемый добровольными + участниками проекта &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 состоит из семи компонентов, главный из которых — + процессор правил фильтрации уровня ядра и интегрированный в него + механизм учета пакетов, а также средства протоколирования пакетов, + правило <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> — пропускать весь + трафик.</para> + </listitem> + <listitem> + <para><literal>client</literal> — защищать только эту + машину.</para> + </listitem> + <listitem> + <para><literal>simple</literal> — защищать всю + сеть.</para> + </listitem> + <listitem> + <para><literal>closed</literal> — полностью запретить + IP трафик, за исключением loopback интерфейса.</para> + </listitem> + <listitem> + <para><literal>UNKNOWN</literal> — отключить загрузку + правил межсетевого экрана.</para> + </listitem> + <listitem> + <para><filename><replaceable>filename</replaceable></filename> + — абсолютный путь к файлу, содержащему правила + межсетевого экрана.</para> + </listitem> + </itemizedlist> + + <para>Есть два варианта загрузки собственных правил в + межсетевой экран <application>ipfw</application>. Первый + способ — задать переменную <literal>firewall_type</literal> + в виде абсолютного пути файла, содержащего <emphasis>правила + межсетевого экрана</emphasis> без каких-либо параметров + командной строки для самого &man.ipfw.8;. Ниже приведён + простой пример набора правил, который блокирует весь входящий + и исходящий трафик:</para> + + <programlisting>add deny in +add deny out</programlisting> + + <para>Второй способ — установить значение переменной + <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>, — присвоение + логической единицы (<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> — это стандартный + механизм для ручного добавления/удаления отдельных правил в + активной цепочке правил межсетевого экрана. Основная проблема + при использовании этого метода состоит в том, что при перезагрузке + операционной системы все изменения, сделанные с помощью данной + команды, будут утеряны. Вместо этого рекомендуется записать + все правила в файл, из которого они будут считываться во время + загрузки операционной системы, а также для полной замены текущего + набора правил на содержимое из файла.</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>Следующий пример выводит учетную информацию, количество + совпавших пакетов и сами правила. Первым столбцом идет номер + правила, за ним следует число совпавших исходящих пакетов, + третий столбец — число соответствующих входящих пакетов, + и затем само правило.</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>Все эти действия означают одно и то же — пакеты, + совпадающие с правилом, могут покинуть обработку правил + межсетевого экрана. На этом поиск прекращается.</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> + — это специальное ключевое слово, которое соответствует + любому IP адресу. <literal>me</literal> — это + специальное ключевое слово, которое соответствует любому из + 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; предусмотрен + еще один параметр — <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;. + Для использования значения ранее объявленной переменной имя + переменной предваряется символом $. Во время + присвоения имя переменной не имеет префикса $, + присваиваемое значение должно быть заключено в "двойные + кавычки".</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" # просто лень вводить каждый раз +$cmd 00500 check-state +$cmd 00502 deny all from any to any frag +$cmd 00501 deny tcp from any to any established +$cmd 00600 allow tcp from any to any 80 out via $oif setup $ks +$cmd 00610 allow tcp from any to $odns 53 out via $oif setup $ks +$cmd 00611 allow udp from any to $odns 53 out via $oif $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>В каждом из разделов, относящихся к внешнему интерфейсу, + правила должны быть упорядоченны по следующему принципу: + наиболее используемые расположены в начале, наименее + используемые — в конце. Последним должно идти правило + блокирования и занесения в журнал информации о пакетах на + этом интерфейсе, не попавших под предыдущие правила.</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 на название интерфейса вашей локальной сети +################################################################# +#$cmd 00005 allow all from any to any via xl0 + +################################################################# +# Нет ограничений на интерфейсе Loopback +################################################################# +$cmd 00010 allow all from any to any via lo0 + +################################################################# +# Разрешить пакет, если он был ранее добавлен в "динамическую" +# таблицу при помощи выражения allow keep-state +################################################################# +$cmd 00015 check-state + +################################################################# +# Раздел правил для исходящего трафика на внешнем интерфейсе +# Анализ запросов начала сессии, идущих из-за межсетевого экрана +# в локальную сеть или от этого шлюза в интернет. +################################################################# + +# Разрешить исходящий трафик к DNS серверу провайдера +# x.x.x.x должен быть IP адресом DNS сервера вашего провайдера +# Продублируйте эти строки, если у вас больше одного DNS сервера +# Эти IP адреса можно взять из файла /etc/resolv.conf +$cmd 00110 allow tcp from any to x.x.x.x 53 out via $pif setup keep-state +$cmd 00111 allow udp from any to x.x.x.x 53 out via $pif keep-state + +# Разрешить исходящий трафик к DHCP серверу провайдера для cable/DSL конфигураций. +# Это правило не нужно для .user ppp. соединений с глобальной сетью +# в этом случае вы можете удалить эти правила. +# Используйте это правило для записи необходимого нам IP адреса в лог-файл. +# Затем укажите IP адрес в закомментированном правиле и удалите первое правило. +$cmd 00120 allow log udp from any to any 67 out via $pif keep-state +#$cmd 00120 allow udp from any to x.x.x.x 67 out via $pif keep-state + +# Разрешить исходящий трафик для незащищенного www соединения +$cmd 00200 allow tcp from any to any 80 out via $pif setup keep-state + +# Разрешить исходящий трафик для защищенного www соединения +# https с поддержкой TLS и SSL +$cmd 00220 allow tcp from any to any 443 out via $pif setup keep-state + +# Разрешить исходящий POP/SMTP +$cmd 00230 allow tcp from any to any 25 out via $pif setup keep-state +$cmd 00231 allow tcp from any to any 110 out via $pif setup keep-state + +# Разрешить исходящий трафик для FreeBSD (make install & CVSUP) +# По сути назначаем пользователю root полные привилегии. +$cmd 00240 allow tcp from me to any out via $pif setup keep-state uid root + +# Разрешаем исходящий icmp ping +$cmd 00250 allow icmp from any to any out via $pif keep-state + +# Разрешаем исходящий трафик Time +$cmd 00260 allow tcp from any to any 37 out via $pif setup keep-state + +# Разрешаем исходящий трафик nntp news +$cmd 00270 allow tcp from any to any 119 out via $pif setup keep-state + +# Разрешаем исходящий защищённый трафик FTP, Telnet и SCP +# Эта функция использует SSH (secure shell) +$cmd 00280 allow tcp from any to any 22 out via $pif setup keep-state + +# Разрешаем исходящий трафик whois +$cmd 00290 allow tcp from any to any 43 out via $pif setup keep-state + +# Запрещаем и заносим в журнал остальной исходящий трафик. +# Обеспечивает политику межсетевого экрана закрытого типа +$cmd 00299 deny log all from any to any out via $pif + +################################################################# +# Раздел правил для входящего трафика на внешнем интерфейсе +# Анализ пакетов, приходящих из глобальной сети, +# предназначенных для этого шлюза или локальной сети +######################################################################## + +# Запрещаем весь входящий трафик с немаршрутизируемых сетей +$cmd 00300 deny all from 192.168.0.0/16 to any in via $pif #RFC 1918 private IP +$cmd 00301 deny all from 172.16.0.0/12 to any in via $pif #RFC 1918 private IP +$cmd 00302 deny all from 10.0.0.0/8 to any in via $pif #RFC 1918 private IP +$cmd 00303 deny all from 127.0.0.0/8 to any in via $pif #loopback +$cmd 00304 deny all from 0.0.0.0/8 to any in via $pif #loopback +$cmd 00305 deny all from 169.254.0.0/16 to any in via $pif #DHCP auto-config +$cmd 00306 deny all from 192.0.2.0/24 to any in via $pif #reserved for docs +$cmd 00307 deny all from 204.152.64.0/23 to any in via $pif #Sun cluster interconnect +$cmd 00308 deny all from 224.0.0.0/3 to any in via $pif #Class D & E multicast + +# Запрещаем пинг извне +$cmd 00310 deny icmp from any to any in via $pif + +# Запрещаем ident +$cmd 00315 deny tcp from any to any 113 in via $pif + +# Запрещаем все Netbios службы. 137=name, 138=datagram, 139=session +# Netbios это MS/Windows сервис обмена. +# Блокируем MS/Windows hosts2 запросы сервера имен на порту 81 +$cmd 00320 deny tcp from any to any 137 in via $pif +$cmd 00321 deny tcp from any to any 138 in via $pif +$cmd 00322 deny tcp from any to any 139 in via $pif +$cmd 00323 deny tcp from any to any 81 in via $pif + +# Запрещаем любые опоздавшие пакеты +$cmd 00330 deny all from any to any frag in via $pif + +# Запрещаем ACK пакеты, которые не соответствуют динамической таблице правил. +$cmd 00332 deny tcp from any to any established in via $pif + +# Разрешаем входящий трафик с DHCP сервера провайдера. Это правило +# должно содержать IP адрес DHCP сервера вашего провайдера, поскольку +# только ему разрешено отправлять пакеты данного типа. Необходимо только +# для проводных и DSL соединений. Для 'user ppp' соединений с глобальной +# сетью использовать это правило нет необходимости. Это тот же IP адрес, +# выбранный и используемый вами в разделе правил для исходящего трафика. +#$cmd 00360 allow udp from any to x.x.x.x 67 in via $pif keep-state + +# Разрешить входящий трафик для www, так как я использую сервер apache +$cmd 00400 allow tcp from any to me 80 in via $pif setup limit src-addr 2 + +# Разрешить входящий трафик безопасных FTP, Telnet и SCP из глобальной сети +$cmd 00410 allow tcp from any to me 22 in via $pif setup limit src-addr 2 + +# Разрешить входящий нешифрованный трафик Telnet из глобальной сети +# считается небезопасным, потому что ID и PW передаются через глобальную +# сеть в открытом виде. +# Удалите этот шаблон, если вы не используете telnet. +$cmd 00420 allow tcp from any to me 23 in via $pif setup limit src-addr 2 + +# Отбрасываем и заносим в журнал все входящие соединения снаружи +$cmd 00499 deny log all from any to any in via $pif + +# Всё остальное запрещено по умолчанию +# Запрещаем и заносим в журнал все пакеты для дальнейшего анализа +$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 + +$cmd 002 allow all from any to any via xl0 # разрешаем трафик на локальном интерфейсе +$cmd 003 allow all from any to any via lo0 # разрешаем трафик на интерфейсе loopback + +$cmd 100 divert natd ip from any to any in via $pif +$cmd 101 check-state + +# Разрешенные исходящие пакеты +$cmd 120 $skip udp from any to xx.168.240.2 53 out via $pif $ks +$cmd 121 $skip udp from any to xx.168.240.5 53 out via $pif $ks +$cmd 125 $skip tcp from any to any $good_tcpo out via $pif setup $ks +$cmd 130 $skip icmp from any to any out via $pif $ks +$cmd 135 $skip udp from any to any 123 out via $pif $ks + + +# Запрещаем весь входящий трафик с немаршрутизируемых адресных пространств +$cmd 300 deny all from 192.168.0.0/16 to any in via $pif #RFC 1918 для локальных IP +$cmd 301 deny all from 172.16.0.0/12 to any in via $pif #RFC 1918 для локальных IP +$cmd 302 deny all from 10.0.0.0/8 to any in via $pif #RFC 1918 для локальных IP +$cmd 303 deny all from 127.0.0.0/8 to any in via $pif #loopback +$cmd 304 deny all from 0.0.0.0/8 to any in via $pif #loopback +$cmd 305 deny all from 169.254.0.0/16 to any in via $pif #DHCP авто-конфигурации +$cmd 306 deny all from 192.0.2.0/24 to any in via $pif #Зарезервировано для документации +$cmd 307 deny all from 204.152.64.0/23 to any in via $pif #Sun cluster +$cmd 308 deny all from 224.0.0.0/3 to any in via $pif #Class D & E multicast + +# Разрешаем входящие пакеты +$cmd 400 allow udp from xx.70.207.54 to any 68 in $ks +$cmd 420 allow tcp from any to me 80 in via $pif setup limit src-addr 1 + + +$cmd 450 deny log ip from any to any + +# Раздел skipto для правил с сохранением состояния для исходящих пакетов +$cmd 500 divert natd ip from any to any out via $pif +$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 на название интерфейса вашей локальной сети +################################################################# +$cmd 005 allow all from any to any via xl0 + +################################################################# +# Нет ограничений на интерфейсе Loopback +################################################################# +$cmd 010 allow all from any to any via lo0 + +################################################################# +# Трансляция адреса, если пакет является входящим +################################################################# +$cmd 014 divert natd ip from any to any in via $pif + +################################################################# +# Разрешить пакет, если он был ранее добавлен в динамическую +# таблицу при помощи выражения allow keep-state +################################################################# +$cmd 015 check-state + +################################################################# +# Раздел правил для исходящего трафика на внешнем интерфейсе +# Анализ запросов начала сессии, идущих из-за межсетевого экрана +# в локальную сеть или от этого шлюза в интернет. +################################################################# + +# Разрешить исходящий трафик к DNS серверу провайдера +# x.x.x.x должен быть IP адресом DNS сервера вашего провайдера +# Продублируйте эти строки, если у вас больше одного DNS сервер +# Эти IP адреса можно взять из файла /etc/resolv.conf +$cmd 020 $skip tcp from any to x.x.x.x 53 out via $pif setup keep-state + + +# Разрешить исходящий трафик к DHCP серверу провайдера для cable/DSL конфигураций. +$cmd 030 $skip udp from any to x.x.x.x 67 out via $pif keep-state + +# Разрешить исходящий трафик для незащищенного www соединения +$cmd 040 $skip tcp from any to any 80 out via $pif setup keep-state + +# Разрешить исходящий трафик для защищенного www соединения +# https с поддержкой TLS и SSL +$cmd 050 $skip tcp from any to any 443 out via $pif setup keep-state + +# Разрешить исходящий POP/SMTP +$cmd 060 $skip tcp from any to any 25 out via $pif setup keep-state +$cmd 061 $skip tcp from any to any 110 out via $pif setup keep-state + +# Разрешить исходящий трафик для FreeBSD (make install & CVSUP) +# По сути назначаем пользователю root полные привилегии. +$cmd 070 $skip tcp from me to any out via $pif setup keep-state uid root + +# Разрешаем исходящий icmp ping +$cmd 080 $skip icmp from any to any out via $pif keep-state + +# Разрешаем исходящий трафик Time +$cmd 090 $skip tcp from any to any 37 out via $pif setup keep-state + +# Разрешаем исходящий трафик nntp news (т.е. news groups) +$cmd 100 $skip tcp from any to any 119 out via $pif setup keep-state + +# Разрешаем исходящий защищённый трафик FTP, Telnet и SCP +# Эта функция использует SSH (secure shell) +$cmd 110 $skip tcp from any to any 22 out via $pif setup keep-state + +# Разрешаем исходящий трафик whois +$cmd 120 $skip tcp from any to any 43 out via $pif setup keep-state + +# Разрешаем исходящий трафик ntp +$cmd 130 $skip udp from any to any 123 out via $pif keep-state + +################################################################# +# Раздел правил для входящего трафика на внешнем интерфейсе +# Анализ пакетов, приходящих из глобальной сети, +# предназначенных для этого шлюза или локальной сети +################################################################# + +# Запрещаем весь входящий трафик с немаршрутизируемых сетей +$cmd 300 deny all from 192.168.0.0/16 to any in via $pif #RFC 1918 private IP +$cmd 301 deny all from 172.16.0.0/12 to any in via $pif #RFC 1918 private IP +$cmd 302 deny all from 10.0.0.0/8 to any in via $pif #RFC 1918 private IP +$cmd 303 deny all from 127.0.0.0/8 to any in via $pif #loopback +$cmd 304 deny all from 0.0.0.0/8 to any in via $pif #loopback +$cmd 305 deny all from 169.254.0.0/16 to any in via $pif #DHCP auto-config +$cmd 306 deny all from 192.0.2.0/24 to any in via $pif #reserved for docs +$cmd 307 deny all from 204.152.64.0/23 to any in via $pif #Sun cluster +$cmd 308 deny all from 224.0.0.0/3 to any in via $pif #Class D & E multicast + +# Запрещаем ident +$cmd 315 deny tcp from any to any 113 in via $pif + +# Запрещаем все Netbios службы. 137=name, 138=datagram, 139=session +# Netbios это MS/Windows сервис обмена. +# Блокируем MS/Windows hosts2 запросы сервера имен на порту 81 +$cmd 320 deny tcp from any to any 137 in via $pif +$cmd 321 deny tcp from any to any 138 in via $pif +$cmd 322 deny tcp from any to any 139 in via $pif +$cmd 323 deny tcp from any to any 81 in via $pif + +# Запрещаем любые опоздавшие пакеты +$cmd 330 deny all from any to any frag in via $pif + +# Запрещаем ACK пакеты, которые не соответствуют динамической таблице правил. +$cmd 332 deny tcp from any to any established in via $pif + +# Разрешаем входящий трафик с DHCP сервера провайдера. Это правило +# должно содержать IP адрес DHCP сервера вашего провайдера, поскольку +# только ему разрешено отправлять пакеты данного типа. Необходимо только +# для проводных и DSL соединений. Для 'user ppp' соединений с глобальной +# сетью использовать это правило нет необходимости. Это тот же IP адрес, +# выбранный и используемый вами в разделе правил для исходящего трафика. +$cmd 360 allow udp from x.x.x.x to any 68 in via $pif keep-state + +# Разрешить входящий трафик для www, т.к. я использую Apache сервер. +$cmd 370 allow tcp from any to me 80 in via $pif setup limit src-addr 2 + +# Разрешить входящий трафик безопасных FTP, Telnet и SCP из глобальной сети +$cmd 380 allow tcp from any to me 22 in via $pif setup limit src-addr 2 + +# Разрешить входящий нешифрованный трафик Telnet из глобальной сети +# считается небезопасным, потому что ID и PW передаются через глобальную +# сеть в открытом виде. +# Удалите этот шаблон, если вы не используете telnet. +$cmd 390 allow tcp from any to me 23 in via $pif setup limit src-addr 2 + +# Отбрасываем и заносим в журнал все неразрешенные входящие соединения из глобальной сети +$cmd 400 deny log all from any to any in via $pif + +# Отбрасываем и заносим в журнал все неразрешенные исходящие соединения в глобальную сеть +$cmd 450 deny log all from any to any out via $pif + +# Место для skipto в правилах с сохранением состояния для исходящих соединений +$cmd 800 divert natd ip from any to any out via $pif +$cmd 801 allow ip from any to any + +# Всё остальное запрещено по умолчанию +# Запрещаем и заносим в журнал все пакеты для дальнейшего анализа +$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: +--> |