Рассмотрим следующие проблемы:
Существует два основных способа создания набора правил
Исключающий
Включающие
Дальнейшее усиление безопасности может достигаться использованием stateful firewall. Применение stateful firewall’а означает, что
FreeBSD имеет три различных пакета ПО firewall’а, встроенных в базовую систему. Это
Причина, по которой FreeBSD имеет несколько встроенных пакетов ПО для
Отчасти предпочтительным можно называть
Так как все
В 2003 году ПО
До версий 4.Х PF не доступен.
Во всех версиях, начиная с 4.Х, PF доступен как часть проекта KAME.
5.Х до 5.3 RELEASE – может использоваться порт security/pf для инсталляции PF.
5.3 RELEASE и более позднее – PF является частью базовой системы. Начиная с этих версий FreeBSD, не следует использовать порт security/pf. Вместо этого следует использовать PF базовой системы.
PF включен в базовую инсталляцию FreeBSD во все версии позднее 5.3 в качестве отдельного загружаемого модуля времени выполнения. Система будет динамически загружать модуль ядра PF, если в rc.conf указано утверждение pf_enable="YES". Загружаемый модуль будет иметь возможность создавать логи pflog.
Замечание. Модуль предполагает наличие опций INET и device bpf.
После того как модуль загружен или ядро статически осуществляет поддержку PF, существует возможность разрешить или запретить pf с помощью команды pfctl:
# pfctl –e
Команда pfctl предоставляет способ работы с
Не существует требования, что запуск PF должен выполняться обязательно из ядра FreeBSD. Компилирование PF в ядро приведет к тому, что загружаемый модуль никогда не будет использоваться.
Пример конфигурирования ядра можно найти в /usr/src/sys/ conf/NOTES:
device pf device pflog device pfsync
device pf обеспечивает поддержку
device pflog обеспечивает дополнительную поддержку псевдосетевого устройства pflog, которое может быть использовано для создания логов трафика, используя bpf дескриптор. Демон pflog может использоваться для хранения информации логов на диске.
device pfsync обеспечивает дополнительную поддержку псевдосетевого устройства pfsync, которое используется для мониторинга изменений состояния. Так как оно не является частью загружаемого модуля, оно встраивается в ядро.
Для активации PF следует установить следующие опции в /etc/rc.conf:
pf_enable="YES" # необходимость PF
pf_rules="/etc/pf.conf" # файл с определениями правил
# для PF
pf_flags="" # дополнительные флаги для
# запуска pfctl
pflog_enable="YES" # start pflogd
pflog_logfile="/var/log/pflog" # где pflogd должен хранить
#logfile
pflog_flags="" # дополнительные флаги для
# запуска pflogd
Если за данным
gateway_enable="YES" # возможность функционирования
# в качестве шлюза
ALTQ доступен только в компилированном в ядро FreeBSD виде. Следует иметь в виду, что ALTQ не поддерживает все существующие драйверы сетевых карт. Для включения возможностей ALTQ следует указать следующие опции:
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
options ALTQ обеспечивает возможность функционирования ALTQ.
options ALTQ_CBQ дает возможность делить ширину пропускания соединения на различные классы или очереди для создания приоритетов трафика на основе правил фильтрации.
options ALTQ_RED используется для предотвращения перегрузки сети. RED делает это посредством измерения длины очереди и сравнением ее с минимальным и максимальным порогами для очереди. Если очередь больше максимальной, то все новые пакеты отбрасываются. В соответствии со своим названием RED отбрасывает пакеты из различных соединений случайно.
options ALTQ_RIO передает в первую очередь трафик, который находится в самой верхней очереди.
pf.conf файла и модифицирует, отбрасывает или пропускает пакеты в соответствии с правилами, указанными там. Файл /etc/pf.conf также содержит полезные примеры и объяснения.
Синтаксис точно такой же, как и в
ipf. Правила ipnat. Утилита ipfstat может показывать в реальном времени статистику, относящуюся к той части ipmon создает в системных файлах логи действий, выполненных
IPF был написан сперва с использованием логики обработки правил "используется последнее правило, которому соответствует пакет". Первоначально имелись только правила без поддержки состояния. Со временем IPF был усилен включением опции quick и опции поддержки состояния keep state, в результате чего изменилась логика обработки правил. Модернизированные функции включены только в виде дополнительных опций, они дают возможность создавать
Рассмотрим использование правил, которые содержат опцию quick и опцию поддержки состояния keep state. Это является основой для создания набора правил включающего
Включающий
IPF включен в базовую инсталляцию FreeBSD в качестве отдельного модуля, загружаемого во время выполнения. Система динамически загружает модуль ядра IPF, если в rc.conf указано утверждение ipfilter_enable="YES". Загружаемый модуль создается с возможностью создания логов и опцией default pass all. Нет необходимости компилировать IPF в ядро FreeBSD только для того, чтобы изменить умолчание на block all. Это можно сделать, указав блокировку всего трафика в конце набора правил.
Не существует обязательного требования компилировать IPF в ядро FreeBSD. Компилирование IPF в ядро приведет к тому, что загружаемый модуль никогда не будет использоваться.
Для активации IPF во время загрузки следует указать следующие утверждения в /etc/rc.conf:
ipfilter_enable="YES" # Start ipf firewall
ipfilter_rules="/etc/ipf.rules"
# загрузка текстового файла с определением правил
ipmon_enable="YES" # Start IP monitor log
ipmon_flags="-Ds" # D = запуск в качестве демона
# s = создание логов с использованием syslog
# v = занесение в лог tcp window, ack, seq
# n = отображение IP и port по именам
Если позади
gateway_enable="YES" # Enable as LAN gateway
ipnat_enable="YES" # Start ipnat function
ipnat_rules="/etc/ipnat.rules" # файл с определением правил
# для ipnat
Команда ipf используется для загрузки файла с правилами. Обычно создается файл с требуемыми правилами и используется данная команда для замены выполняющихся в текущей момент правил:
# ipf –Fa –f /etc/ipf.rules
-Fa означает очистку всех внутренних таблиц правил.
-f означает, что новые правила будут загружены из данного файла.
Это дает возможность сделать изменения в файле правил, выполнить указанную выше команду ipf и тем самым изменить функционирование
Команда ipf предполагает, что файл с правилами является стандартным текстовым файлом. Она не понимает файл с правилами, написанный в виде скрипта и с использованием символьных подстановок.
Существует способ построения правил IPF с возможностью использовать символьные подстановки.
По умолчанию ipfstat показывает общую статистику, полученную в результате применения правил к входящим и исходящим пакетам.
Для того чтобы ipmon работал корректно, в ядре должна быть установлена опция IPFILTER_LOG. Для этой команды определены два режима.В первом режиме команда вызывается из командной строки.
Режим демона используется тогда, когда необходимо сделать файл системного лога доступным для просмотра в более позднее время. Этим способом можно сконфигурировать IPMON и syslogd лучше, чем в обычный файл. По умолчанию в файле rc.conf используется утверждение ipmon_flags с –Ds флагами:
ipmon_flags="-Ds" # D = start as daemon
# s = log to syslog
# v = log tcp window, ack, seq
# n = map IP port to names
Можно создать файл, содержащий правила, таким образом, чтобы выполнять его в качестве скрипта с использованием символьных подстановок. Главное преимущество заключается в том, что в случае необходимости можно отредактировать только значение символьного имени, и при выполнении скрипта все правила, содержащие символьное имя, будут иметь новое значение. Тем самым можно использовать символьные подстановки для значений, которые могут когда-либо измениться.
Синтаксис скрипта совместим с sh, csh и tcsh.
Поле символьной подстановки начинается с символа $.
Определение символьного поля не имеет в качестве префикса символ $.
Значение, которое принимает символьное поле, должно быть заключено в двойные кавычки.
Файл правил должен начинаться аналогичным образом:
############# 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 ##################
В данном примере правила не важны. Здесь показано, как символьные подстановки обозначаются и как используются. Если приведенный выше пример поместить в файл /etc/ipf.rules.script, можно загрузить эти правила, введя команду
# sh /etc/ipf.rules.script
Данный скрипт можно использовать и другим способом:
Раскомментировать строку, начинающуюся с cat, и закомментировать строку, начинающиюся с /sbin/ipf. Указать, как обычно, ipfilter_enable="YES" в /etc/rc.conf и выполнять скрипт после каждой модификации /etc/ipf.rules.
IPF был первоначально написан с использованием логики обработки правил "используется последнее правило, которому соответствует пакет". Правила не поддерживали состояния. Со временем IPF был усилен включением опции quick и опции поддержки состояния keep state, что существенно изменило логику обработки правил.
Далее мы будем рассматривать использование правил, которые включают опцию quick и опцию поддержки состояний keep state. Это общая основа для набора во включающем
Включающий
Синтаксис использует логику "используется первое правило, которому соответствует пакет".
Символ # используется для обозначения начала комментария и может появиться в конце строки правила или в начале всей строки.
Правила содержат ключевые слова. Эти слова должны быть написаны в указанном порядке слева направо в строке. Некоторые ключевые слова имеют подопции, которые сами могут быть ключевыми словами и также включать подопции.
Общий синтаксис правила следующий:
ACTION IN-OUT OPTIONS PROTO SRC_ADDR,DST_ADDR TCP_FLAG STATEFUL
Где:
ACTION = block | pass
IN-OUT = in | out
OPTIONS = log [body | first] | quick | on
PROTO = proto <Value;>
Value = tcp/udp | udp | tcp | icmp
SRC_ADDR,DST_ADDR = all | from <Object > to <Object>
Object = <IP-address > [<PORT_NUM >] | any [<PORT_NUM >]
PORT_NUM = port <number >
TCP_FLAG = flags <flag-value <
flag-value = S
STATEFUL = keep state
Действие определяет, что будет сделано с пакетом, если он соответствует оставшейся части данного правила. Могут быть определены следующие действия:
block указывает, что пакет должен быть отброшен, если он соответствует параметру выбора.
pass указывает, что пакет должен быть пропущен
Обязательное требование состоит в том, что в каждом правиле фильтра должно быть явно указано, пакеты какого направления оно анализирует. Ключевым словом может быть либо in, либо out. Если указано что-либо еще, то правило не пройдет синтаксическую проверку.
in означает, что данное правило применяется для входящего пакета на указанном интерфейсе.
out означает, что данное правило применяется для исходящего пакета на указанном интерфейсе.
Опции должны использоваться в указанном ниже порядке.
log означает, что заголовок пакета будет записан в лог, если пакет соответствует параметрам выбора.
quick означает, что, если пакет соответствует параметрам выбора, то данное правило будет последним проверяемым правилом, обеспечивая "короткий путь", чтобы избежать обработку данного пакета всеми следующими правилами. Данная опция является обязательной для модернизированной логики обработки правил.
on определяет название интерфейса, на котором анализируются пакеты. Имена интерфейсов можно определить с помощью утилиты ifconfig. При использовании данной опции пакет будет соответствовать правилу только в том случае, если он использует указанный интерфейс в указанном направлении. Данная опция является обязательной для модернизированной логики обработки правил.
Когда пакет записывается в лог, заголовки пакета используются пакетом log могут использоваться следующие квалификаторы (в указанном порядке):
body означает, что после заголовков будут записаны первые 128 бит содержимого пакета.
first – если ключевое слово log используется вместе с опцией keep state, рекомендуется, чтобы данная опция также применялась, так как в этом случае только начальный пакет заносится в лог, но не пакеты, которые в дальнейшем соответствуют информации keep state.
Ключевые слова, описанные в данном разделе, используются для описания атрибутов пакета, которые анализируются для определения, соответствует ли он правилу или нет. Существует ключевое слово subject, для которого определены ключевые слова в качестве подопций, одно из которых выбирается. Для определения соответствия могут использоваться в указанном порядке следующие атрибуты общего назначения:
proto является ключевым словом и должно указываться с одним из соответствующих значений. Значение определяет конкретный протокол, для которого ищется соответствие. Данная опция является обязательной для модернизированной логики обработки правил.
tcp/udp | udp | tcp | icmp или название любого другого протокола, которое находится в /etc/protocols. Ключевое слово tcp/udp может использоваться для указания соответствия пакета либо ТСР, либо UDP, и добавлено для удобства.
Ключевое слово all является синонимом для from any to any без каких-либо других параметров.
from src to : ключевые слова from и to используются для указания соответствующих IP-адресов. В правилах должны быть указаны оба параметра, и источник, и получатель. any является специальным ключевым словом, которое соответствует любому IP-адресу. Примеры использования: from any to any, from 0.0.0.0/0 to any, from 0.0.0.0 to any.
IP-адреса должны быть указаны как в форме dot-нотации с указанием длины маски, так и в форме единственного IP-адреса в dot-нотации.
Когда проверяется соответствие порта, то может использоваться либо целое число номера порта, либо название сервиса из /etc/services. Когда порт указывается как часть объекта from, он соответствует номеру порта источника; когда он появляется как часть объекта to, он соответствует номеру порта получателя. Использование опции port с объектом to является обязательным требованием для модернизированной логики обработки правил. Пример использования: from any to any port=80.
Сравнение портов может быть указано в виде числа или в виде операторов сравнения, могут быть также указаны диапазоны портов.
port "=" | "!=" | ">" | ";<" | ";<=" | ">=" | "eq" | "ne" | "lt" | "gt" | "le" | "ge"
Для того чтобы указать диапазон портов, следует использовать
port "<>" | "><"
Флаги устанавливаются только для ТСР-фильтрации. Буквы указывают один из возможных флагов, который может быть установлен в заголовке ТСР-пакета. В модернизированной логике обработки пакетов используется параметр flags S для идентификации запроса начала сессии.
keep state указывает, что в правиле pass любые пакеты, которые соответствуют параметрам выбора в правиле, должны активизировать stateful возможность фильтрации.
Замечание. Данная опция является обязательной для модернизированной логики обработки правил.
Stateful фильтрация обрабатывает трафик как двунаправленный обмен пакетами, при котором выполняется установление сессии. Во время активизации keep state динамически создаются внутренние правила для каждого ожидаемого пакета, которыми обмениваются исходные отправитель и получатель. Любые пакеты, которые не соответствуют образцу установления сессии, автоматически отвергаются как ложные.
Поддержка состояния допускает наличие ICMP-пакетов, относящихся к ТСР- или UDP-сессии. Также пакет, который IPF может рассматривать как часть активной сессии, даже если это другой протокол, будет пропущен.
Рассмотрим, что происходит при установлении сессии.
Исходящий пакет на интерфейсе, во-первых, проверяется в динамической таблице состояний. Если пакет соответствует очередному ожидаемому пакету при установлении сессии, то он пропускается
Пакеты, пришедшие на тот же самый интерфейс, во-первых, проверяются в динамической
Когда установление сессии выполнено, информация удаляется из динамической таблицы состояния.
Фильтрация с учетом состояния дает возможность сфокусироваться на блокировании или разрешении новых сессий. Если новая сессия разрешена, всем последующим пакетам будет автоматически разрешено прохождение, и любой ложный пакет будет автоматически отвергаться. Если новая сессия блокирована, ни один из ее следующих пакетов не будет разрешен. Фильтрация с учетом состояния обеспечивает возможность защиты от различных атак наводнения (flooding).
Следующий pass, и по умолчанию блокирует все остальные. Предполагается, что
Все UNIX системы, включая FreeBSD, разработаны с возможностью использования интерфейса lo0 и IP-адреса 127.0.0.1 для внутреннего взаимодействия с ОС.
Предположим, что один интерфейс соединен с Интернетом. Это может быть PPP tun0 интерфейс или сетевая карта, которая соединена с сетью, имеющей доступ в Интернет. Для этого интерфейса должны быть определены правила управления доступом для исходящего трафика в Интернет и правила запросов доступа, полученных из Интернета.
Предположим также, что одна или более сетевых карт соединены с локальной сетью позади
Во-первых, правила должны быть разбиты на три основных раздела:
Правила, для которых более часто выполняется соответствие, должны быть написаны выше правил, для которых соответствие выполняется реже. Последнее правило в разделе должно блокировать и заносить в лог все пакеты для данного интерфейса и направления.
Раздел для исходящего трафика в приведенном ниже наборе правил содержит только pass правила, имеющие значения выбора и определяющие сервисы, которым разрешен доступ в Интернет. Все правила имеют опции quick, on, proto, port, keep state. Правила proto tcp имеют опцию flag, установленную для определения стартового пакета запроса сессии для активизации возможности поддержки состояния (stateful).
Раздел для входящего трафика блокирует все нежелательные пакеты. Последнее правило в разделе, которое блокирует и заносит в логи все прошедшие остальные правила пакеты, является также способом создания доказательства наличия атаки, которое может рассматриваться и как юридическое доказательство. Это дает возможность преследования атакующих в законодательном порядке.
Следует иметь в виду, что отправителю не возвращается ответ, пакеты просто отбрасываются. Данный способ означает, что атакующий не знает, достигли ли его пакеты целевой системы.
Если в правиле указано log first, то сообщение в лог записывается только один раз, независимо от того, сколько раз выполнялось соответствие. Чтобы определить, сколько раз для данного правила выполнялось соответствие, надо выполнить команду ipfstat –hio.
Следует закрыть все номера портов Троянских программ, список которых можно найти по адресу http://www.simovits.com/trojans/trojans.html.
Следующий
После этого следует просмотреть сообщения в логах и добавить правило block в раздел для входящего трафика.
Необходимо также изменить название интерфейса dc0 в каждом правиле на название интерфейса в вашей системе, который соединяется с Интернетом. Для использования РРР следует указать tun0.
Пример списка правил в /etc/ipf.rules.
#################################################################
# No restrictions on Inside LAN Interface for private network
# Not needed unless you have LAN
#################################################################
#pass out quick on xl0 all
#pass in quick on xl0 all
#################################################################
# No restrictions on Loopback Interface
#################################################################
pass in quick on lo0 all
pass out quick on lo0 all
#################################################################
# Interface facing Public Internet (Outbound Section)
# Interrogate session start requests originating from behind the
# firewall on the private network
# or from this gateway server destine for the public Internet.
#################################################################
# Allow out access to my ISP's Domain name server.
# xxx must be the IP address of your ISP's DNS.
# Dup these lines if your ISP has more than one DNS server
# Get the IP addresses from /etc/resolv.conf file
pass out quick on dc0 proto tcp from any to xxx port = 53 flags S keep state
pass out quick on dc0 proto udp from any to xxx port = 53 keep state
# Allow out non-secure standard www function
pass out quick on dc0 proto tcp from any to any port = 80 flags S keep state
# Allow out secure www function https over TLS/SSL
pass out quick on dc0 proto tcp from any to any port = 443 flags S keep state
# Allow out send get email function
pass out quick on dc0 proto tcp from any to any port = 110 flags S keep state
pass out quick on dc0 proto tcp from any to any port = 25 flags S keep state
# Allow out Time
pass out quick on dc0 proto tcp from any to any port = 37 flags S keep state
# Allow out gateway LAN users non-secure FTP ( both passive
# active modes)
# This function uses the IPNAT built in FTP proxy function coded in
# the nat rules file to make this single rule function correctly.
# If you want to use the pkg_add command to install application
# packages
# on your gateway system you need this rule.
pass out quick on dc0 proto tcp from any to any port = 21 flags S keep state
# Allow out secure FTP, Telnet, and SCP
# This function is using SSH (secure shell)
pass out quick on dc0 proto tcp from any to any port = 22 flags S keep state
# Allow out non-secure Telnet
pass out quick on dc0 proto tcp from any to any port = 23 flags S keep state
# Allow out ping to public Internet
pass out quick on dc0 proto icmp from any to any icmp-type 8 keep state
# Block and log only the first occurrence of everything
# else that's trying to get out.
# This rule enforces the block all by default logic.
block out log first quick on dc0 all
#################################################################
# Interface facing Public Internet (Inbound Section)
# Interrogate packets originating from the public Internet
# destine for this gateway server or the private network.
#################################################################
# Block all inbound traffic from non-routable or reserved address
# spaces
block in quick on dc0 from 192.168.0.0/16 to any #RFC 1918
#private IP
block in quick on dc0 from 172.16.0.0/12 to any #RFC 1918
#private IP
block in quick on dc0 from 10.0.0.0/8 to any #RFC 1918
#private IP
block in quick on dc0 from 127.0.0.0/8 to any #loopback
block in quick on dc0 from 0.0.0.0/8 to any #loopback
block in quick on dc0 from 169.254.0.0/16 to any #DHCP auto-
#config
block in quick on dc0 from 192.0.2.0/24 to any #reserved
#for docs
############ Block a bunch of different nasty things. ###########
# That I do not want to see in the log
# Block frags
block in quick on dc0 all with frags
# Block short tcp packets
block in quick on dc0 proto tcp all with short
# block source routed packets
block in quick on dc0 all with opt lsrr
block in quick on dc0 all with opt ssrr
# Block nmap OS fingerprint attempts
# Log first occurrence of these so I can get their IP address
block in log first quick on dc0 proto tcp from any to any flags FUP
# Block anything with special options
block in quick on dc0 all with ipopts
# Block public pings
block in quick on dc0 proto icmp all icmp-type 8
# Block ident
block in quick on dc0 proto tcp from any to any port = 113
# Block all Netbios service. 137=name, 138=datagram, 139=session
# Netbios is MS/Windows sharing services.
# Block MS/Windows hosts2 name server requests 81
block in log first quick on dc0 proto tcp/udp from any to any port = 137
block in log first quick on dc0 proto tcp/udp from any to any port = 138
block in log first quick on dc0 proto tcp/udp from any to any port = 139
block in log first quick on dc0 proto tcp/udp from any to any port = 81
# Allow in standard www function because I have apache server
pass in quick on dc0 proto tcp from any to any port = 80 flags S keep state
# Allow in non-secure Telnet session from public Internet
#labeled non-secure because ID/PW passed over public Internet as #clear text.
# Delete this sample group if you do not have telnet server #enabled.
pass in quick on dc0 proto tcp from any to any port = 23 flags S keep state
# Allow in secure FTP, Telnet, and SCP from public Internet
# This function is using SSH (secure shell)
pass in quick on dc0 proto tcp from any to any port = 22 flags S keep state
# Block and log only first occurrence of all remaining traffic
# coming into the firewall. The logging of only the first
# occurrence stops a .denial of service. attack targeted
# at filling up your log file space.
# This rule enforces the block all by default logic.
block in log first quick on dc0 all
################### End of rules file #######################
С помощью
Существует специальный диапазон адресов, зарезервированный для NAT-адресов. В соответствии с RFC 1918, для частных сетей можно использовать следующие диапазоны IP-адресов, для которых никогда не будет выполняться роутинг в Интернете:
10.0.0.0 – 10.255.255.255
172.16.0.0 – 172.31.255.255
192.168.0.0 – 192.168.255.255
Правила ipnat. Обычно правила /etc/ipnat.rules.
При внесении изменений в правила ipnat с флагами –CF для удаления существующих правил
Для перезагрузки правил
# ipnat -CF -f /etc/ipnat.rules
Чтобы посмотреть статистику
# ipnat -s
Чтобы посмотреть список текущих отображений в таблице
# ipnat -l
Для включения режима, который показывает большое количество информации, относящейся к обработке правил и записям в таблице, следует выполнить:
# ipnat –v
Правила
Синтаксис, представленный здесь, — упрощенный. Полный синтаксис следует искать в соответствующей man странице.
Синтаксис правила
map IF LAN_IP_RANGE -> PUBLIC_ADDRESS
Правило начинается с ключевого слова map.
Следует заменить IF на внешний интерфейс.
LAN_IP_RANGE – это те IP-адреса, которыми пользуются внутренние клиенты.
PUBLIC_ADDRESS может быть либо внешним IP-адресом, либо специальным значением 0/32, которое означает использование IP-адреса, связанного с IF.
Пакет поступает в
Чтобы указать необходимость /etc/rc.conf.
Для запуска роутинга трафика между интерфейсами:
gateway_enable="YES"
Для автоматического запуска IPNAT:
ipnat_enable="YES"
Для указания файла, в котором определены правила:
ipnat_rules="/etc/ipnat.rules"
В сетях, которые имеют большое число рабочих станций или подсетей, отображение всех локальных IP-адресов в единственный публичный IP-адрес вызывает проблемы, связанные с тем, что одни и те же номера портов могут использоваться одновременно на разных рабочих станциях, расположенных за
Обычное правило
map dc0 192.168.1.0/24 -> 0/32
В приведенном выше правиле порт источника в пакете не изменяется при прохождении пакета через IPNAT. Добавление ключевого слова portmap означает, что IPNAT будет использовать порты источника в указанном диапазоне. Например, следующее правило требует, чтобы IPNAT модифицировал порт источника в указанном диапазоне:
map dc0 192.168.1.0/24 -> 0/32 portmap tcp/udp 20000:60000
Также существует возможность упростить использование этого отображения, указав ключевое слово auto. Это будет означать, что IPNAT сам определит, какие порты доступны для использования:
map dc0 192.168.1.0/24 -> 0/32 portmap tcp/udp auto
В очень больших локальных сетях существует очень большое количество локальных адресов, которые отображаются в единственный публичный адрес. Мы имеем правило
map dc0 192.168.1.0/24 -> 204.134.75.1
Данное правило отображает все соединения в 204.134.75.1. Это может быть изменено указанием диапазона
map dc0 192.168.1.0/24 -> 204.134.75.1-10
Или можно указать подсеть, используя
map dc0 192.168.1.0/24 -> 204.134.75.0/24
Очень распространенной практикой является иметь web-сервер, e-mail сервер, сервер баз данных и DNS-сервер, каждый из которых расположен на отдельной машине в локальной сети. В этом случае трафик от этих серверов также может использовать 10.0.10.25 и существует единственный публичный IP-адрес, который равен 20.20.20.5. Следует использовать правило
rdr dc0 20.20.20.5/32 port 80 -> 10.0.10.25 port 80
или
rdr dc0 0/32 port 80 -> 10.0.10.25 port 80
или, для DNS-сервера, расположенного в локальной сети с адресом 10.0.10.33, которому необходимо получать публичные DNS-запросы,
rdr dc0 20.20.20.5/32 port 53 -> 10.0.10.33 port 53 udp
FTP имеет следующую особенность: он может выполняться в активном и пассивном режиме. Различие состоит в том, как создается канал данных. Пассивный режим является более безопасным, так как канал данных создается тем, кто запрашивает ftp-сессию.
IPNAT имеет специальную встроенную опцию FTP proxy, посредством которой можно указать правило отображения
Данное правило будет управлять всем трафиком для внутренней локальной сети:
map dc0 10.0.10.0/29 -> 0/32 proxy port 21 ftp/tcp
Данное правило обрабатывает FTP-трафик от шлюза:
map dc0 0.0.0.0/0 -> 0/32 proxy port 21 ftp/tcp
Данное правило обрабатывает весь не-FTP-трафик от внутренней локальной сети:
map dc0 10.0.10.0/29 -> 0/32
Правило отображения FTP расположено выше обычного правила отображения. Все пакеты проверяются на соответствие первому сверху правилу. Проверяется соответствие имени интерфейса, затем IP-адресу источника локальной сети и затем — является ли этот пакет FTP. Если все соответствия выполнены, то специальный FTP-прокси создает временные правила фильтрации, разрешающие проходить пакетам FTP-сессии в обоих направлениях, и, дополнительно, выполнять
Необходимо только одно правило фильтрации для FTP, если используется
Без FTP-прокси необходимы следующие три правила:
# Allow out LAN PC client FTP to public Internet
# Active and passive modes
pass out quick on rl0 proto tcp from any to any port = 21 flags S keep state
# Allow out passive mode data channel high order port numbers
pass out quick on rl0 proto tcp from any to any port > 1024 flags S keep state
# Active mode let data channel in from FTP server
pass in quick on rl0 proto tcp from any to any port = 20 flags S keep state
IPFIREWALL (
Множество правил /etc/rc.firewall ) в стандартной инсталляции FreeBSD является скорее примером, и не предполагается, что оно будет непосредственно применяться без модификации. Пример не использует фильтрование с поддержкой состояния, поэтому он рассматривается как базовый в данном разделе.
Синтаксис правил
rc.conf используется утверждение firewall_enable="YES". Нет необходимости компилировать
После перезапуска системы с firewall_enable="YES" в rc.conf, на экране высветится следующее сообщение как часть процесса запуска:
ipfw2 initialized, divert disabled, rule-based forwarding disabled,
default to deny, logging disabled
Загружаемый модуль не имеет встроенной возможности создания логов. Чтобы включить возможности их создания и установить для них ограничения, следует добавить утверждения в /etc/sysctl.conf:
net.inet.ip.fw.verbose=1
net.inet.ip.fw.verbose_limit=5
Не существует требования компилировать
options IPFIREWALL
Данная опция дает возможность
options IPFIREWALL_VERBOSE
Следующая опция дает возможность создавать логи пакетов, которые проходят через log в наборе правил.
options IPFIREWALL_VERBOSE_LIMIT=5
Количество пакетов, для которых создаются логи с помощью syslogd в каждой записи, ограничено. Данная опция предотвращает возможность осуществления DoS-атак посредством переполнения syslog.
options IPFIREWALL_DEFAULT_TO_ACCEPT
Данная опция позволяет по умолчанию всем пакетам, которые не соответствуют ни одному правилу, проходить
options IPV6FIREWALL options IPV6FIREWALL_VERBOSE options IPV6FIREWALL_VERBOSE_LIMIT options IPV6FIREWALL_DEFAULT_TO_ACCEPT
Данные опции аналогичны опциям IPv4, но они предназначены для IPv6. Если IPv6 не используется,
options IPDIVERT
Это дает возможность использовать функциональность
Замечание. Если не включено IPFIREWALL_DEFAULT_TO_ACCEPT и не установлены правила, разрешающие входящие пакеты, все пакеты к компьютеру и от него будут блокированы.
Если /etc/rc.conf:
firewall_enable="YES"
Установка скриптов для активации правил:
firewall_script="/etc/ipfw.rules"
Необходимость создания логов:
firewall_logging="YES"
Замечание. Переменная firewall_logging устанавливает переменную sysctl net.inet.ip.fw.verbose в значение 1. Не существует в rc.conf переменной для установки ограничений логов, но ограничение может быть установлено посредством переменной sysctl вручную или из файла /etc/sysctl.conf.
net.inet.ip.fw.verbose_limit=5
Если компьютер функционирует в качестве шлюза и, в частности, предоставляет сервис /etc/rc.conf.
Команда является стандартным способом добавления или удаления единственного правила вручную во время функционирования
Для того чтобы получить список всех правил, следует выполнить
# ipfw list
Для того чтобы получить список всех правил с отметкой времени, когда последний раз правило срабатывало, следует выполнить
# ipfw –t list
Для того чтобы получить список информации счетчиков, следует выполнить команду с параметром –a. В первом столбце будет указан номер правила, далее следует количество исходящих пакетов, соответствующих правилу, и количество входящих пакетов, соответствующих правилу, а затем само правило.
# ipfw –a list
Показать последние динамические правила, добавленные к статическим правилам:
# ipfw –d list
Показать истекшие динамические правила:
# ipfw –d –e list
Обнулить счетчики:
# ipfw zero
Обнулить счетчики только для правила с номером NUM:
# ipfw zero NUM
С помощью правил можно разрешить или запретить прохождение пакета, основываясь на значениях, содержащихся в его заголовках. Понятие сессии означает двунаправленный обмен пакетами между хостами. С точки зрения сессии можно считать, что
Когда пакет поступает в
Замечание. Поиск продолжается после count, skipto и tee правил.
Инструкции, указанные здесь, являются основой при использовании правил, которые содержат опции поддержки состояния keep state, limit, in или out. Это является основой для создания включающего (
Включающий
Правила содержат ключевые слова. Эти слова указываются в определенном порядке слева направо в строке. Некоторые ключевые слова имеют дополнительные опции, которые сами могут быть ключевыми словами и также содержать дополнительные опции:
CMD RULE_NUMBER ACTION LOGGING SELECTION STATEFUL
Каждое новое правило должно начинаться с префикса add для добавления правила во внутреннюю таблицу.
Каждое правило имеет номер, с помощью которого можно перейти на данное правило.
Правило может быть связано с одним из следующих действий, которые могут быть выполнены, когда пакет соответствует критерию выбора данного правила.
allow | accept | pass | permit
Все эти значения являются аналогичными и означают, что пакеты, которые соответствуют правилу, разрешаются. При этом поиск прекращается.
check-state
Выполняется проверка пакета в таблице динамических правил. Если соответствие найдено, выполняется действие, связанное с правилом, которое создается данным динамическим правилом, в противном случае осуществляется переход к следующему правилу. Правило check-state не имеет критерия выбора. Если правило check-state присутствует в наборе правил, таблица динамических правил проверяется на соответствие правилу поддержки состояния или правилу ограничения.
deny | drop
Оба ключевых слова означают, что пакеты, соответствующие правилу, будут отброшены. Поиск завершается.
log [ logamount ]
Когда пакет соответствует правилу с ключевым словом log, сообщение будет записано посредством syslogd с названием SECURITY. Создание лога происходит только тогда, когда номер пакета, для которого создается лог, не превышает значения параметра logamount. Если logamount не указан, ограничение берется из переменной sysctl net.inet.ip.fw.verbose_limit. В обоих случаях значение "нуль" не считается ограничением создания логов. После того как ограничение достигнуто, создание логов может быть возобновлено чисткой счетчика логов или счетчика пакетов для данного правила, с помощью команды reset log для .
Замечание. Создание лога выполняется после того, как весь остальной пакет, соответствующий условию, будет успешно проверен, и перед выполнением заключительного действия ( accept, deny ) для пакета.
Ключевые слова данного раздела применяются для описания атрибутов пакета, которые будут анализироваться, чтобы определить, соответствует ли пакет правилу или нет. Следующие атрибуты общего назначения предназначены для поиска соответствия и должны использоваться в указанном порядке:
udp | tcp | icmp
Также может быть использовано любое другое название протокола, которое указано в /etc/protocols. Это значение является протоколом, соответствие с которым будет проверяться.
from src to dst
Ключевые слова from и to используются для поиска соответствия с IP-адресами. Правила должны указывать ОБА параметра как источника, так и назначения. any является специальным ключевым словом, которое соответствует любому IP-адресу. me является специальным ключевым словом, которое соответствует любому IP-адресу, сконфигурированному на интерфейсе системы, на которой выполняется from me to any или from any to me ). IP-адреса указываются в dot-нотации IP-адреса со "/" и длиной маски. Это — обязательное требование.
port <number>
Используется для протоколов, которые поддерживают номера портов (таких как ТСР и UDP). Вместо значения номера порта может быть указано имя сервиса из /etc/services.
in | out
Используется для указания входящих или исходящих пакетов, соответственно. Одно из этих ключевых слов должно быть указано обязательно в качестве части критерия при поиске соответствия.
via IF
Используется для пакетов, которые проходят через интерфейс, указанный по имени. Ключевое слово via, определяющее интерфейс, всегда проверяется в качестве части процесса поиска соответствия.
setup
Это является обязательным ключевым словом, которое идентифицирует запрос начала установки сессии для ТСР-пакетов.
keep-state
При наличии соответствия в других параметрах поиска
limit { src-addr | src-port | dst-addr | dst-port }
Указывается, что limit и keep-state не могут быть одновременно указаны в одном и том же правиле. Limit предоставляет определенную возможность поддержки состояния, как и keep-state, но также имеет и дополнительные возможности.
Фильтрование трафика с учетом состояния осуществляется как двунаправленный обмен пакетами с анализом переговоров о создании сессии. Существует возможность определить, что переговоры о сессии между отправителем и получателем соответствуют корректной процедуре двунаправленного обмена пакетами. Любые пакеты, которые не соответствуют правильному образцу создания сессии, автоматически отвергаются как фальшивые.
check-state используется для указания того, что правила
Динамические правила уязвимы для исчерпания ресурсов с помощью SYN-flood атаки, при которой создается большое число динамических правил. Для отражения данной атаки во FreeBSD версии 4.5 добавлена новая опция, называемая limit. Эта опция используется для ограничения количества одновременно устанавливаемых сессий с помощью просмотра полей источника или получателя в правиле, которое выполняется, если установлена опция limit. Если значение счетчика больше, чем значение, указанное в опции limit, пакет отбрасывается.
Преимущества создания логов очевидны: они обеспечивают возможность просмотра разного рода информации после того, как правило было активизировано. Это информация о том, какой пакет был отброшен, с какого адреса он пришел, куда он направлялся. Это дает важные сведения для отслеживания атакующего.
Даже при установленной возможности создания логов log в эти правила. Обычно это добавляется только для правил deny, например, для правила deny для входящих ICMP-пакетов. Также признак log добавляется в самое последнее правило. Это позволяет отследить все пакеты, которые не соответствовали ни одному из правил.
С созданием логов связано две опасности: можно потеряться в огромном количестве данных и переполнить дисковое пространство. DoS-атака, которая переполняет диск, является одной из старейших DoS-атак. Эти сообщения логов не только пишутся с использованием утилиты syslogd, но также показываются на консоли администратора, что скоро начинает раздражать.
Опция ядра IPFIREWALL_VERBOSE_LIMIT=5 ограничивает количество последовательных сообщений, посылаемых в syslogd, которые касаются пакета, соответствующего данному правилу. Когда данная опция установлена в ядре, количество последовательных сообщений, относящихся к конкретному правилу, не превышает указанного количества. Никогда не будет создано 200 сообщений лога, говорящих об одном и том же. Например, пять последовательных сообщений, касающихся конкретного правила, будут занесены в syslogd, оставшиеся сообщения будут подсчитаны и занесены в syslogd с помощью примерно такой фразы:
last message repeated 45 times
Все сообщения по умолчанию записываются в файл /etc/log/security, который определяется в файле /etc/syslog.conf.
Опытные администраторы sh, csh и tcsh shell’ами. Поля символьной подстановки должны начинаться со знака $. Символьные поля не имеют префикса $. Значение, которое принимает символьное поле, должно быть заключено в двойные кавычки.
Файл правил должен начинаться примерно так:
############### start of example ipfw rules script #############
#
ipfw -q -f flush # Delete all rules
# Set defaults
oif="tun0" # out interface
odns="192.0.2.11" # ISP's DNS server IP address
cmd="ipfw -q add " # build rule prefix
ks="keep-state" # just too lazy to key this each time
$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
################### End of example ipfw rules script ############
В данном примере правила не важны здесь показано, как поле символьной ссылки обозначается и как используется.
Если приведенный выше пример находится в файле /etc/, то эти правила могут быть загружены с помощью следующего ввода в командной строке:
# sh /etc/ipfw.rules
То же самое можно сделать, выполнив вручную следующие команды:
# ipfw -q -f flush
# ipfw -q add check-state
# ipfw -q add deny all from any to any frag
# ipfw -q add deny tcp from any to any established
# ipfw -q add allow tcp from any to any 80 out via tun0 setup keep-state
# ipfw -q add allow tcp from any to 192.0.2.11 53 out via tun0 setup keep-state
# ipfw -q add 00611 allow udp from any to 192.0.2.11 53 out via tun0 keep-state
В следующем наборе правил без
Как и все UNIX-системы, FreeBSD разработана с использованием интерфейса lo0 и IP-адреса 127.0.0.1 для внутреннего взаимодействия с ОС. Правила
Будем предполагать, что один интерфейс соединен с Интернетом. Для этого интерфейса должны быть определены правила управления доступом в Интернет и из Интернета. Это может быть РРР tun0 интерфейс или сетевая карта, которая соединяется с Интернетом.
В случае наличия более одной сетевой карточки, которые соединены с локальными сетями, расположенными позади
Первым делом правила должны быть разбиты на три основных раздела:
Порядок, в котором правила указываются для конкретного интерфейса, должен быть такой, чтобы более часто используемое правило было бы размещено выше, чем редко используемое. Последнее правило должно блокировать все пакеты на данном интерфейсе.
Раздел для исходящего трафика в следующем наборе правил содержит только правила allow, определяющие значения выбора, которые уникально идентифицируют сервис, разрешенный в Интернете. Все правила имеют proto, port, in/out, via и keep state опции. proto tcp правила имеют опцию setup, определяющую начальный пакет запроса установления сессии для передачи этой информации в таблицу поддержки состояния.
Раздел для входящего трафика первым делом блокирует все нежелательные пакеты. Должно иметься правило, которое явно блокирует пакеты, получаемые редко, и информацию о которых нет необходимости заносить в лог. В результате они не будут обработаны последним правилом в разделе, которое блокирует и заносит в лог все пакеты, не соответствовавшие ни одному правилу.
В данном случае отправителю не возвращается ответ, эти пакеты просто удаляются. При таком подходе у атакующего нет информации о том, что его пакеты достигли системы.
Следующий не содержащий dc0 в каждом правиле на название интерфейса сетевой карточки, который используется в системе для соединения с Интернетом. Например, для РРР пользователей следует указать tun0.
Рассмотрим пример, используемый в данных правилах:
keep-state ).limit для предотвращения наводнения ( flooding ).in или out для указания направления пересылки пакета.via для указания интерфейса, через который проходит пакет.Следующие правила указываются в /etc/.
################ Start of IPFW rules file ######################
# Flush out the list before we begin.
ipfw -q -f flush
# Set rules command prefix
cmd="ipfw -q add"
pif="dc0" # public interface name of NIC
# facing the public Internet
#################################################################
# No restrictions on Inside LAN Interface for private network
# Not needed unless you have LAN.
# Change xl0 to your LAN NIC interface name
#################################################################
#$cmd 00005 allow all from any to any via xl0
#################################################################
# No restrictions on Loopback Interface
#################################################################
$cmd 00010 allow all from any to any via lo0
#################################################################
# Allow the packet through if it has previous been added to the
# the "dynamic" rules table by a allow keep-state statement.
#################################################################
$cmd 00015 check-state
#################################################################
# Interface facing Public Internet (Outbound Section)
# Interrogate session start requests originating from behind the
# firewall on the private network or from this gateway server
# destine for the public Internet.
#################################################################
# Allow out access to my ISP's Domain name server.
# x.x.x.x must be the IP address of your ISP.s DNS
# Dup these lines if your ISP has more than one DNS server
# Get the IP addresses from /etc/resolv.conf file
$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
# Allow out non-secure standard www function
$cmd 00200 allow tcp from any to any 80 out via $pif setup keep-state
# Allow out secure www function https over TLS SSL
$cmd 00220 allow tcp from any to any 443 out via $pif setup keep-state
# Allow out send get email function
$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
# Allow out ping
$cmd 00250 allow icmp from any to any out via $pif keep-state
# Allow out Time
$cmd 00260 allow tcp from any to any 37 out via $pif setup keep-state
# Allow out secure FTP, Telnet, and SCP
# This function is using SSH (secure shell)
$cmd 00280 allow tcp from any to any 22 out via $pif setup keep-state
# deny and log everything else that.s trying to get out.
# This rule enforces the block all by default logic.
$cmd 00299 deny log all from any to any out via $pif
#################################################################
# Interface facing Public Internet (Inbound Section)
# Interrogate packets originating from the public Internet
# destine for this gateway server or the private network.
#################################################################
# Deny all inbound traffic from non-routable reserved address spaces
#RFC1918 private IP
$cmd 00300 deny all from 192.168.0.0/16 to any in via $pif $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
$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
# Deny public pings
$cmd 00310 deny icmp from any to any in via $pif
# Deny ident
$cmd 00315 deny tcp from any to any 113 in via $pif
# Deny all Netbios service. 137=name, 138=datagram, 139=session
# Netbios is MS/Windows sharing services.
# Block MS/Windows hosts2 name server requests 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
# Deny any late arriving packets
$cmd 00330 deny all from any to any frag in via $pif
# Deny ACK packets that did not match the dynamic rule table
$cmd 00332 deny tcp from any to any established in via $pif
# Allow in standard www function because I have apache server
$cmd 00400 allow tcp from any to me 80 in via $pif setup limit src-addr 2
# Allow in secure FTP, Telnet, and SCP from public Internet
$cmd 00410 allow tcp from any to me 22 in via $pif setup limit src-addr 2
# Allow in non-secure Telnet session from public Internet
# labeled non-secure because ID PW are passed over public
# Internet as clear text.
# Delete this sample group if you do not have telnet server
# enabled.
$cmd 00420 allow tcp from any to me 23 in via $pif setup limit src-addr 2
# Reject Log all incoming connections from the outside
$cmd 00499 deny log all from any to any in via $pif
# Everything else is denied by default
# deny and log all packets that fell through to see what they are
$cmd 00999 deny log all from any to any
################ End of IPFW rules file ########################
Существуют некоторые дополнительные конфигурационные утверждения, которые дают возможность активизировать функцию option divert.
В дополнение к обычным опциям /etc/rc.conf необходимо добавить следующее:
natd_enable="YES" # Enable NATD function natd_interface="rl0" # interface name of public Internet NIC natd_flags="-dynamic -m" # -m = preserve port numbers if possible
Использование правил поддержки состояния вместе с правилом divert natd для трансляции сетевых адресов существенно усложняет логику правил. Взаимное расположение правил проверки состояния и divert natd становится очень критичным. Уже не используется простая логика последовательного прохождения правил. Определено новое действие, называемое skipto. При использовании skipto необходимо знать номер каждого правила, чтобы точно указать номер того правила, на которое следует перейти.
Рассмотрим пример использования
Анализ пакета на соответствие правилам начинается с первого правила в файле правил и продолжается по одному правилу вниз по файлу до тех пор, пока не будет достигнут конец или не будет найдено соответствие пакета критериям выбора. После этого пакет покидает
Пусть локальный пользователь использует браузер для получения web-страницы. Web-сервер для взаимодействия использует порт 80 (см. пример набора правил №1). Когда пакет поступает в out, а не in. Он передается правилу 101. Этому правилу пакет также не соответствует, потому что это первый пакет и он еще не передается в динамическую таблицу поддержки состояния. Наконец, пакет поступает в правило 125, которому он соответствует. Пакет выходит через сетевую карточку, которая подключена к Интернету. Пакет все еще имеет IP-адрес локальной сети в качестве IP-адреса источника. При обнаружении соответствия данному правилу выполняются два действия. Опция keep-state передает информацию в таблицу динамических правил поддержки состояния. После этого выполняется действие skipto rule 500. Правило 500 применяет skipto 500 выполняется. Пакет переходит на правило 500, выполняется
Для входящего потока все пакеты рассматриваются как часть открытия существующей сессии, автоматически обрабатываются правилом проверки состояния и применяют правила
Рассмотрим другой пример. Пусть существует сервер Apache, выполняющийся на том же хосте, что и
Пример набора правил № 1:
#!/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 # exclude LAN traffic $cmd 003 allow all from any to any via lo0 #exclude loopback traffic $cmd 100 divert natd ip from any to any in via $pif $cmd 101 check-state # Authorized outbound packets $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 # Deny all inbound traffic from non-routable reserved address spaces $cmd 300 deny all from 192.168.0.0/16 to any in via $pif #RFC1918private 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 #loop-back $cmd 304 deny all from 0.0.0.0/8 to any in via $pif #loop-back $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 # Authorized inbound packets $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 # This is skipto location for outbound stateful rules $cmd 500 divert natd ip from any to any out via $pif $cmd 510 allow ip from any to any ######################## end of rules ##################
Следующий пример аналогичен предыдущему, но содержит большее количество комментариев.
Пример набора правил № 2:
#!/bin/sh
################ Start of IPFW rules file #######################
# Flush out the list before we begin.
ipfw -q -f flush
# Set rules command prefix
cmd="ipfw -q add"
skip="skipto 800"
pif="rl0" # public interface name of NIC
# facing the public Internet
#################################################################
# No restrictions on Inside LAN Interface for private network
# Change xl0 to your LAN NIC interface name
#################################################################
$cmd 005 allow all from any to any via xl0
#################################################################
# No restrictions on Loopback Interface
#################################################################
$cmd 010 allow all from any to any via lo0
#################################################################
# check if packet is inbound and nat address if it is
#################################################################
$cmd 014 divert natd ip from any to any in via $pif
#################################################################
# Allow the packet through if it has previous been added to the
# the "dynamic" rules table by a allow keep-state statement.
#################################################################
$cmd 015 check-state
#################################################################
# Interface facing Public Internet (Outbound Section)
# Interrogate session start requests originating from behind the
# firewall on the private network or from this gateway server
# destine for the public Internet.
#################################################################
# Allow out access to my ISP's Domain name server.
# x.x.x.x must be the IP address of your ISP's DNS
# Dup these lines if your ISP has more than one DNS server
# Get the IP addresses from /etc/resolv.conf file
$cmd 020 $skip tcp from any to x.x.x.x 53 out via $pif setup keep-state
# Allow out secure www function https over TLS SSL
$cmd 050 $skip tcp from any to any 443 out via $pif setup keep-state
# Allow out send get email function
$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
# Allow out ping
$cmd 080 $skip icmp from any to any out via $pif keep-state
# Allow out Time
$cmd 090 $skip tcp from any to any 37 out via $pif setup keep-state
# Allow out secure FTP, Telnet, and SCP
# This function is using SSH (secure shell)
$cmd 110 $skip tcp from any to any 22 out via $pif setup keep-state
# Allow ntp time server
$cmd 130 $skip udp from any to any 123 out via $pif keep-state
#################################################################
# Interface facing Public Internet (Inbound Section)
# Interrogate packets originating from the public Internet
# destine for this gateway server or the private network.
#################################################################
# Deny all inbound traffic from non-routable reserved address
# spaces
#RFC
$cmd 300 deny all from 192.168.0.0/16 to any in via $pif
1918 private IP
$cmd 301 deny all from 172.16.0.0/12 to any in via $pif
$cmd 302 deny all from 10.0.0.0/8 to any in via $pif
$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
# Deny ident
$cmd 315 deny tcp from any to any 113 in via $pif
# Deny all Netbios service. 137=name, 138=datagram, 139=session
# Netbios is MS/Windows sharing services.
# Block MS/Windows hosts2 name server requests 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
# Deny any late arriving packets
$cmd 330 deny all from any to any frag in via $pif
# Deny ACK packets that did not match the dynamic rule table
$cmd 332 deny tcp from any to any established in via $pif
# Allow in standard www function because I have Apache server
$cmd 370 allow tcp from any to me 80 in via $pif setup limit src-addr 2
# Allow in secure FTP, Telnet, and SCP from public Internet
$cmd 380 allow tcp from any to me 22 in via $pif setup limit src-addr 2
# Allow in non-secure Telnet session from public Internet
# labeled non-secure because ID PW are passed over public
# Internet as clear text.
# Delete this sample group if you do not have telnet server
# enabled.
$cmd 390 allow tcp from any to me 23 in via $pif setup limit src-addr 2
# Reject Log all unauthorized incoming connections from the
# public Internet
$cmd 400 deny log all from any to any in via $pif
# Reject Log all unauthorized out going connections to the
# public Internet
$cmd 450 deny log all from any to any out via $pif
# This is skipto location for outbound stateful rules
$cmd 800 divert natd ip from any to any out via $pif
$cmd 801 allow ip from any to any
# Everything else is denied by default
# deny and log all packets that fell through to see what they are
$cmd 999 deny log all from any to any
################ End of IPFW rules file #######################
Рассмотрим следующие проблемы:
Существует два основных способа создания набора правил
Исключающий
Включающие
Дальнейшее усиление безопасности может достигаться использованием stateful firewall. Применение stateful firewall’а означает, что
FreeBSD имеет три различных пакета ПО firewall’а, встроенных в базовую систему. Это
Причина, по которой FreeBSD имеет несколько встроенных пакетов ПО для
Отчасти предпочтительным можно называть
Так как все
В 2003 году ПО
До версий 4.Х PF не доступен.
Во всех версиях, начиная с 4.Х, PF доступен как часть проекта KAME.
5.Х до 5.3 RELEASE – может использоваться порт security/pf для инсталляции PF.
5.3 RELEASE и более позднее – PF является частью базовой системы. Начиная с этих версий FreeBSD, не следует использовать порт security/pf. Вместо этого следует использовать PF базовой системы.
PF включен в базовую инсталляцию FreeBSD во все версии позднее 5.3 в качестве отдельного загружаемого модуля времени выполнения. Система будет динамически загружать модуль ядра PF, если в rc.conf указано утверждение pf_enable="YES". Загружаемый модуль будет иметь возможность создавать логи pflog.
Замечание. Модуль предполагает наличие опций INET и device bpf.
После того как модуль загружен или ядро статически осуществляет поддержку PF, существует возможность разрешить или запретить pf с помощью команды pfctl:
# pfctl –e
Команда pfctl предоставляет способ работы с
Не существует требования, что запуск PF должен выполняться обязательно из ядра FreeBSD. Компилирование PF в ядро приведет к тому, что загружаемый модуль никогда не будет использоваться.
Пример конфигурирования ядра можно найти в /usr/src/sys/ conf/NOTES:
device pf device pflog device pfsync
device pf обеспечивает поддержку
device pflog обеспечивает дополнительную поддержку псевдосетевого устройства pflog, которое может быть использовано для создания логов трафика, используя bpf дескриптор. Демон pflog может использоваться для хранения информации логов на диске.
device pfsync обеспечивает дополнительную поддержку псевдосетевого устройства pfsync, которое используется для мониторинга изменений состояния. Так как оно не является частью загружаемого модуля, оно встраивается в ядро.
Для активации PF следует установить следующие опции в /etc/rc.conf:
pf_enable="YES" # необходимость PF
pf_rules="/etc/pf.conf" # файл с определениями правил
# для PF
pf_flags="" # дополнительные флаги для
# запуска pfctl
pflog_enable="YES" # start pflogd
pflog_logfile="/var/log/pflog" # где pflogd должен хранить
#logfile
pflog_flags="" # дополнительные флаги для
# запуска pflogd
Если за данным
gateway_enable="YES" # возможность функционирования
# в качестве шлюза
ALTQ доступен только в компилированном в ядро FreeBSD виде. Следует иметь в виду, что ALTQ не поддерживает все существующие драйверы сетевых карт. Для включения возможностей ALTQ следует указать следующие опции:
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
options ALTQ обеспечивает возможность функционирования ALTQ.
options ALTQ_CBQ дает возможность делить ширину пропускания соединения на различные классы или очереди для создания приоритетов трафика на основе правил фильтрации.
options ALTQ_RED используется для предотвращения перегрузки сети. RED делает это посредством измерения длины очереди и сравнением ее с минимальным и максимальным порогами для очереди. Если очередь больше максимальной, то все новые пакеты отбрасываются. В соответствии со своим названием RED отбрасывает пакеты из различных соединений случайно.
options ALTQ_RIO передает в первую очередь трафик, который находится в самой верхней очереди.
pf.conf файла и модифицирует, отбрасывает или пропускает пакеты в соответствии с правилами, указанными там. Файл /etc/pf.conf также содержит полезные примеры и объяснения.
Синтаксис точно такой же, как и в
ipf. Правила ipnat. Утилита ipfstat может показывать в реальном времени статистику, относящуюся к той части ipmon создает в системных файлах логи действий, выполненных
IPF был написан сперва с использованием логики обработки правил "используется последнее правило, которому соответствует пакет". Первоначально имелись только правила без поддержки состояния. Со временем IPF был усилен включением опции quick и опции поддержки состояния keep state, в результате чего изменилась логика обработки правил. Модернизированные функции включены только в виде дополнительных опций, они дают возможность создавать
Рассмотрим использование правил, которые содержат опцию quick и опцию поддержки состояния keep state. Это является основой для создания набора правил включающего
Включающий
IPF включен в базовую инсталляцию FreeBSD в качестве отдельного модуля, загружаемого во время выполнения. Система динамически загружает модуль ядра IPF, если в rc.conf указано утверждение ipfilter_enable="YES". Загружаемый модуль создается с возможностью создания логов и опцией default pass all. Нет необходимости компилировать IPF в ядро FreeBSD только для того, чтобы изменить умолчание на block all. Это можно сделать, указав блокировку всего трафика в конце набора правил.
Не существует обязательного требования компилировать IPF в ядро FreeBSD. Компилирование IPF в ядро приведет к тому, что загружаемый модуль никогда не будет использоваться.
Для активации IPF во время загрузки следует указать следующие утверждения в /etc/rc.conf:
ipfilter_enable="YES" # Start ipf firewall
ipfilter_rules="/etc/ipf.rules"
# загрузка текстового файла с определением правил
ipmon_enable="YES" # Start IP monitor log
ipmon_flags="-Ds" # D = запуск в качестве демона
# s = создание логов с использованием syslog
# v = занесение в лог tcp window, ack, seq
# n = отображение IP и port по именам
Если позади
gateway_enable="YES" # Enable as LAN gateway
ipnat_enable="YES" # Start ipnat function
ipnat_rules="/etc/ipnat.rules" # файл с определением правил
# для ipnat
Команда ipf используется для загрузки файла с правилами. Обычно создается файл с требуемыми правилами и используется данная команда для замены выполняющихся в текущей момент правил:
# ipf –Fa –f /etc/ipf.rules
-Fa означает очистку всех внутренних таблиц правил.
-f означает, что новые правила будут загружены из данного файла.
Это дает возможность сделать изменения в файле правил, выполнить указанную выше команду ipf и тем самым изменить функционирование
Команда ipf предполагает, что файл с правилами является стандартным текстовым файлом. Она не понимает файл с правилами, написанный в виде скрипта и с использованием символьных подстановок.
Существует способ построения правил IPF с возможностью использовать символьные подстановки.
По умолчанию ipfstat показывает общую статистику, полученную в результате применения правил к входящим и исходящим пакетам.
Для того чтобы ipmon работал корректно, в ядре должна быть установлена опция IPFILTER_LOG. Для этой команды определены два режима.В первом режиме команда вызывается из командной строки.
Режим демона используется тогда, когда необходимо сделать файл системного лога доступным для просмотра в более позднее время. Этим способом можно сконфигурировать IPMON и syslogd лучше, чем в обычный файл. По умолчанию в файле rc.conf используется утверждение ipmon_flags с –Ds флагами:
ipmon_flags="-Ds" # D = start as daemon
# s = log to syslog
# v = log tcp window, ack, seq
# n = map IP port to names
Можно создать файл, содержащий правила, таким образом, чтобы выполнять его в качестве скрипта с использованием символьных подстановок. Главное преимущество заключается в том, что в случае необходимости можно отредактировать только значение символьного имени, и при выполнении скрипта все правила, содержащие символьное имя, будут иметь новое значение. Тем самым можно использовать символьные подстановки для значений, которые могут когда-либо измениться.
Синтаксис скрипта совместим с sh, csh и tcsh.
Поле символьной подстановки начинается с символа $.
Определение символьного поля не имеет в качестве префикса символ $.
Значение, которое принимает символьное поле, должно быть заключено в двойные кавычки.
Файл правил должен начинаться аналогичным образом:
############# 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 ##################
В данном примере правила не важны. Здесь показано, как символьные подстановки обозначаются и как используются. Если приведенный выше пример поместить в файл /etc/ipf.rules.script, можно загрузить эти правила, введя команду
# sh /etc/ipf.rules.script
Данный скрипт можно использовать и другим способом:
Раскомментировать строку, начинающуюся с cat, и закомментировать строку, начинающиюся с /sbin/ipf. Указать, как обычно, ipfilter_enable="YES" в /etc/rc.conf и выполнять скрипт после каждой модификации /etc/ipf.rules.
IPF был первоначально написан с использованием логики обработки правил "используется последнее правило, которому соответствует пакет". Правила не поддерживали состояния. Со временем IPF был усилен включением опции quick и опции поддержки состояния keep state, что существенно изменило логику обработки правил.
Далее мы будем рассматривать использование правил, которые включают опцию quick и опцию поддержки состояний keep state. Это общая основа для набора во включающем
Включающий
Синтаксис использует логику "используется первое правило, которому соответствует пакет".
Символ # используется для обозначения начала комментария и может появиться в конце строки правила или в начале всей строки.
Правила содержат ключевые слова. Эти слова должны быть написаны в указанном порядке слева направо в строке. Некоторые ключевые слова имеют подопции, которые сами могут быть ключевыми словами и также включать подопции.
Общий синтаксис правила следующий:
ACTION IN-OUT OPTIONS PROTO SRC_ADDR,DST_ADDR TCP_FLAG STATEFUL
Где:
ACTION = block | pass
IN-OUT = in | out
OPTIONS = log [body | first] | quick | on
PROTO = proto <Value;>
Value = tcp/udp | udp | tcp | icmp
SRC_ADDR,DST_ADDR = all | from <Object > to <Object>
Object = <IP-address > [<PORT_NUM >] | any [<PORT_NUM >]
PORT_NUM = port <number >
TCP_FLAG = flags <flag-value <
flag-value = S
STATEFUL = keep state
Действие определяет, что будет сделано с пакетом, если он соответствует оставшейся части данного правила. Могут быть определены следующие действия:
block указывает, что пакет должен быть отброшен, если он соответствует параметру выбора.
pass указывает, что пакет должен быть пропущен
Обязательное требование состоит в том, что в каждом правиле фильтра должно быть явно указано, пакеты какого направления оно анализирует. Ключевым словом может быть либо in, либо out. Если указано что-либо еще, то правило не пройдет синтаксическую проверку.
in означает, что данное правило применяется для входящего пакета на указанном интерфейсе.
out означает, что данное правило применяется для исходящего пакета на указанном интерфейсе.
Опции должны использоваться в указанном ниже порядке.
log означает, что заголовок пакета будет записан в лог, если пакет соответствует параметрам выбора.
quick означает, что, если пакет соответствует параметрам выбора, то данное правило будет последним проверяемым правилом, обеспечивая "короткий путь", чтобы избежать обработку данного пакета всеми следующими правилами. Данная опция является обязательной для модернизированной логики обработки правил.
on определяет название интерфейса, на котором анализируются пакеты. Имена интерфейсов можно определить с помощью утилиты ifconfig. При использовании данной опции пакет будет соответствовать правилу только в том случае, если он использует указанный интерфейс в указанном направлении. Данная опция является обязательной для модернизированной логики обработки правил.
Когда пакет записывается в лог, заголовки пакета используются пакетом log могут использоваться следующие квалификаторы (в указанном порядке):
body означает, что после заголовков будут записаны первые 128 бит содержимого пакета.
first – если ключевое слово log используется вместе с опцией keep state, рекомендуется, чтобы данная опция также применялась, так как в этом случае только начальный пакет заносится в лог, но не пакеты, которые в дальнейшем соответствуют информации keep state.
Ключевые слова, описанные в данном разделе, используются для описания атрибутов пакета, которые анализируются для определения, соответствует ли он правилу или нет. Существует ключевое слово subject, для которого определены ключевые слова в качестве подопций, одно из которых выбирается. Для определения соответствия могут использоваться в указанном порядке следующие атрибуты общего назначения:
proto является ключевым словом и должно указываться с одним из соответствующих значений. Значение определяет конкретный протокол, для которого ищется соответствие. Данная опция является обязательной для модернизированной логики обработки правил.
tcp/udp | udp | tcp | icmp или название любого другого протокола, которое находится в /etc/protocols. Ключевое слово tcp/udp может использоваться для указания соответствия пакета либо ТСР, либо UDP, и добавлено для удобства.
Ключевое слово all является синонимом для from any to any без каких-либо других параметров.
from src to : ключевые слова from и to используются для указания соответствующих IP-адресов. В правилах должны быть указаны оба параметра, и источник, и получатель. any является специальным ключевым словом, которое соответствует любому IP-адресу. Примеры использования: from any to any, from 0.0.0.0/0 to any, from 0.0.0.0 to any.
IP-адреса должны быть указаны как в форме dot-нотации с указанием длины маски, так и в форме единственного IP-адреса в dot-нотации.
Когда проверяется соответствие порта, то может использоваться либо целое число номера порта, либо название сервиса из /etc/services. Когда порт указывается как часть объекта from, он соответствует номеру порта источника; когда он появляется как часть объекта to, он соответствует номеру порта получателя. Использование опции port с объектом to является обязательным требованием для модернизированной логики обработки правил. Пример использования: from any to any port=80.
Сравнение портов может быть указано в виде числа или в виде операторов сравнения, могут быть также указаны диапазоны портов.
port "=" | "!=" | ">" | ";<" | ";<=" | ">=" | "eq" | "ne" | "lt" | "gt" | "le" | "ge"
Для того чтобы указать диапазон портов, следует использовать
port "<>" | "><"
Флаги устанавливаются только для ТСР-фильтрации. Буквы указывают один из возможных флагов, который может быть установлен в заголовке ТСР-пакета. В модернизированной логике обработки пакетов используется параметр flags S для идентификации запроса начала сессии.
keep state указывает, что в правиле pass любые пакеты, которые соответствуют параметрам выбора в правиле, должны активизировать stateful возможность фильтрации.
Замечание. Данная опция является обязательной для модернизированной логики обработки правил.
Stateful фильтрация обрабатывает трафик как двунаправленный обмен пакетами, при котором выполняется установление сессии. Во время активизации keep state динамически создаются внутренние правила для каждого ожидаемого пакета, которыми обмениваются исходные отправитель и получатель. Любые пакеты, которые не соответствуют образцу установления сессии, автоматически отвергаются как ложные.
Поддержка состояния допускает наличие ICMP-пакетов, относящихся к ТСР- или UDP-сессии. Также пакет, который IPF может рассматривать как часть активной сессии, даже если это другой протокол, будет пропущен.
Рассмотрим, что происходит при установлении сессии.
Исходящий пакет на интерфейсе, во-первых, проверяется в динамической таблице состояний. Если пакет соответствует очередному ожидаемому пакету при установлении сессии, то он пропускается
Пакеты, пришедшие на тот же самый интерфейс, во-первых, проверяются в динамической
Когда установление сессии выполнено, информация удаляется из динамической таблицы состояния.
Фильтрация с учетом состояния дает возможность сфокусироваться на блокировании или разрешении новых сессий. Если новая сессия разрешена, всем последующим пакетам будет автоматически разрешено прохождение, и любой ложный пакет будет автоматически отвергаться. Если новая сессия блокирована, ни один из ее следующих пакетов не будет разрешен. Фильтрация с учетом состояния обеспечивает возможность защиты от различных атак наводнения (flooding).
Следующий pass, и по умолчанию блокирует все остальные. Предполагается, что
Все UNIX системы, включая FreeBSD, разработаны с возможностью использования интерфейса lo0 и IP-адреса 127.0.0.1 для внутреннего взаимодействия с ОС.
Предположим, что один интерфейс соединен с Интернетом. Это может быть PPP tun0 интерфейс или сетевая карта, которая соединена с сетью, имеющей доступ в Интернет. Для этого интерфейса должны быть определены правила управления доступом для исходящего трафика в Интернет и правила запросов доступа, полученных из Интернета.
Предположим также, что одна или более сетевых карт соединены с локальной сетью позади
Во-первых, правила должны быть разбиты на три основных раздела:
Правила, для которых более часто выполняется соответствие, должны быть написаны выше правил, для которых соответствие выполняется реже. Последнее правило в разделе должно блокировать и заносить в лог все пакеты для данного интерфейса и направления.
Раздел для исходящего трафика в приведенном ниже наборе правил содержит только pass правила, имеющие значения выбора и определяющие сервисы, которым разрешен доступ в Интернет. Все правила имеют опции quick, on, proto, port, keep state. Правила proto tcp имеют опцию flag, установленную для определения стартового пакета запроса сессии для активизации возможности поддержки состояния (stateful).
Раздел для входящего трафика блокирует все нежелательные пакеты. Последнее правило в разделе, которое блокирует и заносит в логи все прошедшие остальные правила пакеты, является также способом создания доказательства наличия атаки, которое может рассматриваться и как юридическое доказательство. Это дает возможность преследования атакующих в законодательном порядке.
Следует иметь в виду, что отправителю не возвращается ответ, пакеты просто отбрасываются. Данный способ означает, что атакующий не знает, достигли ли его пакеты целевой системы.
Если в правиле указано log first, то сообщение в лог записывается только один раз, независимо от того, сколько раз выполнялось соответствие. Чтобы определить, сколько раз для данного правила выполнялось соответствие, надо выполнить команду ipfstat –hio.
Следует закрыть все номера портов Троянских программ, список которых можно найти по адресу http://www.simovits.com/trojans/trojans.html.
Следующий
После этого следует просмотреть сообщения в логах и добавить правило block в раздел для входящего трафика.
Необходимо также изменить название интерфейса dc0 в каждом правиле на название интерфейса в вашей системе, который соединяется с Интернетом. Для использования РРР следует указать tun0.
Пример списка правил в /etc/ipf.rules.
#################################################################
# No restrictions on Inside LAN Interface for private network
# Not needed unless you have LAN
#################################################################
#pass out quick on xl0 all
#pass in quick on xl0 all
#################################################################
# No restrictions on Loopback Interface
#################################################################
pass in quick on lo0 all
pass out quick on lo0 all
#################################################################
# Interface facing Public Internet (Outbound Section)
# Interrogate session start requests originating from behind the
# firewall on the private network
# or from this gateway server destine for the public Internet.
#################################################################
# Allow out access to my ISP's Domain name server.
# xxx must be the IP address of your ISP's DNS.
# Dup these lines if your ISP has more than one DNS server
# Get the IP addresses from /etc/resolv.conf file
pass out quick on dc0 proto tcp from any to xxx port = 53 flags S keep state
pass out quick on dc0 proto udp from any to xxx port = 53 keep state
# Allow out non-secure standard www function
pass out quick on dc0 proto tcp from any to any port = 80 flags S keep state
# Allow out secure www function https over TLS/SSL
pass out quick on dc0 proto tcp from any to any port = 443 flags S keep state
# Allow out send get email function
pass out quick on dc0 proto tcp from any to any port = 110 flags S keep state
pass out quick on dc0 proto tcp from any to any port = 25 flags S keep state
# Allow out Time
pass out quick on dc0 proto tcp from any to any port = 37 flags S keep state
# Allow out gateway LAN users non-secure FTP ( both passive
# active modes)
# This function uses the IPNAT built in FTP proxy function coded in
# the nat rules file to make this single rule function correctly.
# If you want to use the pkg_add command to install application
# packages
# on your gateway system you need this rule.
pass out quick on dc0 proto tcp from any to any port = 21 flags S keep state
# Allow out secure FTP, Telnet, and SCP
# This function is using SSH (secure shell)
pass out quick on dc0 proto tcp from any to any port = 22 flags S keep state
# Allow out non-secure Telnet
pass out quick on dc0 proto tcp from any to any port = 23 flags S keep state
# Allow out ping to public Internet
pass out quick on dc0 proto icmp from any to any icmp-type 8 keep state
# Block and log only the first occurrence of everything
# else that's trying to get out.
# This rule enforces the block all by default logic.
block out log first quick on dc0 all
#################################################################
# Interface facing Public Internet (Inbound Section)
# Interrogate packets originating from the public Internet
# destine for this gateway server or the private network.
#################################################################
# Block all inbound traffic from non-routable or reserved address
# spaces
block in quick on dc0 from 192.168.0.0/16 to any #RFC 1918
#private IP
block in quick on dc0 from 172.16.0.0/12 to any #RFC 1918
#private IP
block in quick on dc0 from 10.0.0.0/8 to any #RFC 1918
#private IP
block in quick on dc0 from 127.0.0.0/8 to any #loopback
block in quick on dc0 from 0.0.0.0/8 to any #loopback
block in quick on dc0 from 169.254.0.0/16 to any #DHCP auto-
#config
block in quick on dc0 from 192.0.2.0/24 to any #reserved
#for docs
############ Block a bunch of different nasty things. ###########
# That I do not want to see in the log
# Block frags
block in quick on dc0 all with frags
# Block short tcp packets
block in quick on dc0 proto tcp all with short
# block source routed packets
block in quick on dc0 all with opt lsrr
block in quick on dc0 all with opt ssrr
# Block nmap OS fingerprint attempts
# Log first occurrence of these so I can get their IP address
block in log first quick on dc0 proto tcp from any to any flags FUP
# Block anything with special options
block in quick on dc0 all with ipopts
# Block public pings
block in quick on dc0 proto icmp all icmp-type 8
# Block ident
block in quick on dc0 proto tcp from any to any port = 113
# Block all Netbios service. 137=name, 138=datagram, 139=session
# Netbios is MS/Windows sharing services.
# Block MS/Windows hosts2 name server requests 81
block in log first quick on dc0 proto tcp/udp from any to any port = 137
block in log first quick on dc0 proto tcp/udp from any to any port = 138
block in log first quick on dc0 proto tcp/udp from any to any port = 139
block in log first quick on dc0 proto tcp/udp from any to any port = 81
# Allow in standard www function because I have apache server
pass in quick on dc0 proto tcp from any to any port = 80 flags S keep state
# Allow in non-secure Telnet session from public Internet
#labeled non-secure because ID/PW passed over public Internet as #clear text.
# Delete this sample group if you do not have telnet server #enabled.
pass in quick on dc0 proto tcp from any to any port = 23 flags S keep state
# Allow in secure FTP, Telnet, and SCP from public Internet
# This function is using SSH (secure shell)
pass in quick on dc0 proto tcp from any to any port = 22 flags S keep state
# Block and log only first occurrence of all remaining traffic
# coming into the firewall. The logging of only the first
# occurrence stops a .denial of service. attack targeted
# at filling up your log file space.
# This rule enforces the block all by default logic.
block in log first quick on dc0 all
################### End of rules file #######################
С помощью
Существует специальный диапазон адресов, зарезервированный для NAT-адресов. В соответствии с RFC 1918, для частных сетей можно использовать следующие диапазоны IP-адресов, для которых никогда не будет выполняться роутинг в Интернете:
10.0.0.0 – 10.255.255.255
172.16.0.0 – 172.31.255.255
192.168.0.0 – 192.168.255.255
Правила ipnat. Обычно правила /etc/ipnat.rules.
При внесении изменений в правила ipnat с флагами –CF для удаления существующих правил
Для перезагрузки правил
# ipnat -CF -f /etc/ipnat.rules
Чтобы посмотреть статистику
# ipnat -s
Чтобы посмотреть список текущих отображений в таблице
# ipnat -l
Для включения режима, который показывает большое количество информации, относящейся к обработке правил и записям в таблице, следует выполнить:
# ipnat –v
Правила
Синтаксис, представленный здесь, — упрощенный. Полный синтаксис следует искать в соответствующей man странице.
Синтаксис правила
map IF LAN_IP_RANGE -> PUBLIC_ADDRESS
Правило начинается с ключевого слова map.
Следует заменить IF на внешний интерфейс.
LAN_IP_RANGE – это те IP-адреса, которыми пользуются внутренние клиенты.
PUBLIC_ADDRESS может быть либо внешним IP-адресом, либо специальным значением 0/32, которое означает использование IP-адреса, связанного с IF.
Пакет поступает в
Чтобы указать необходимость /etc/rc.conf.
Для запуска роутинга трафика между интерфейсами:
gateway_enable="YES"
Для автоматического запуска IPNAT:
ipnat_enable="YES"
Для указания файла, в котором определены правила:
ipnat_rules="/etc/ipnat.rules"
В сетях, которые имеют большое число рабочих станций или подсетей, отображение всех локальных IP-адресов в единственный публичный IP-адрес вызывает проблемы, связанные с тем, что одни и те же номера портов могут использоваться одновременно на разных рабочих станциях, расположенных за
Обычное правило
map dc0 192.168.1.0/24 -> 0/32
В приведенном выше правиле порт источника в пакете не изменяется при прохождении пакета через IPNAT. Добавление ключевого слова portmap означает, что IPNAT будет использовать порты источника в указанном диапазоне. Например, следующее правило требует, чтобы IPNAT модифицировал порт источника в указанном диапазоне:
map dc0 192.168.1.0/24 -> 0/32 portmap tcp/udp 20000:60000
Также существует возможность упростить использование этого отображения, указав ключевое слово auto. Это будет означать, что IPNAT сам определит, какие порты доступны для использования:
map dc0 192.168.1.0/24 -> 0/32 portmap tcp/udp auto
В очень больших локальных сетях существует очень большое количество локальных адресов, которые отображаются в единственный публичный адрес. Мы имеем правило
map dc0 192.168.1.0/24 -> 204.134.75.1
Данное правило отображает все соединения в 204.134.75.1. Это может быть изменено указанием диапазона
map dc0 192.168.1.0/24 -> 204.134.75.1-10
Или можно указать подсеть, используя
map dc0 192.168.1.0/24 -> 204.134.75.0/24
Очень распространенной практикой является иметь web-сервер, e-mail сервер, сервер баз данных и DNS-сервер, каждый из которых расположен на отдельной машине в локальной сети. В этом случае трафик от этих серверов также может использовать 10.0.10.25 и существует единственный публичный IP-адрес, который равен 20.20.20.5. Следует использовать правило
rdr dc0 20.20.20.5/32 port 80 -> 10.0.10.25 port 80
или
rdr dc0 0/32 port 80 -> 10.0.10.25 port 80
или, для DNS-сервера, расположенного в локальной сети с адресом 10.0.10.33, которому необходимо получать публичные DNS-запросы,
rdr dc0 20.20.20.5/32 port 53 -> 10.0.10.33 port 53 udp
FTP имеет следующую особенность: он может выполняться в активном и пассивном режиме. Различие состоит в том, как создается канал данных. Пассивный режим является более безопасным, так как канал данных создается тем, кто запрашивает ftp-сессию.
IPNAT имеет специальную встроенную опцию FTP proxy, посредством которой можно указать правило отображения
Данное правило будет управлять всем трафиком для внутренней локальной сети:
map dc0 10.0.10.0/29 -> 0/32 proxy port 21 ftp/tcp
Данное правило обрабатывает FTP-трафик от шлюза:
map dc0 0.0.0.0/0 -> 0/32 proxy port 21 ftp/tcp
Данное правило обрабатывает весь не-FTP-трафик от внутренней локальной сети:
map dc0 10.0.10.0/29 -> 0/32
Правило отображения FTP расположено выше обычного правила отображения. Все пакеты проверяются на соответствие первому сверху правилу. Проверяется соответствие имени интерфейса, затем IP-адресу источника локальной сети и затем — является ли этот пакет FTP. Если все соответствия выполнены, то специальный FTP-прокси создает временные правила фильтрации, разрешающие проходить пакетам FTP-сессии в обоих направлениях, и, дополнительно, выполнять
Необходимо только одно правило фильтрации для FTP, если используется
Без FTP-прокси необходимы следующие три правила:
# Allow out LAN PC client FTP to public Internet
# Active and passive modes
pass out quick on rl0 proto tcp from any to any port = 21 flags S keep state
# Allow out passive mode data channel high order port numbers
pass out quick on rl0 proto tcp from any to any port > 1024 flags S keep state
# Active mode let data channel in from FTP server
pass in quick on rl0 proto tcp from any to any port = 20 flags S keep state
IPFIREWALL (
Множество правил /etc/rc.firewall ) в стандартной инсталляции FreeBSD является скорее примером, и не предполагается, что оно будет непосредственно применяться без модификации. Пример не использует фильтрование с поддержкой состояния, поэтому он рассматривается как базовый в данном разделе.
Синтаксис правил
rc.conf используется утверждение firewall_enable="YES". Нет необходимости компилировать
После перезапуска системы с firewall_enable="YES" в rc.conf, на экране высветится следующее сообщение как часть процесса запуска:
ipfw2 initialized, divert disabled, rule-based forwarding disabled,
default to deny, logging disabled
Загружаемый модуль не имеет встроенной возможности создания логов. Чтобы включить возможности их создания и установить для них ограничения, следует добавить утверждения в /etc/sysctl.conf:
net.inet.ip.fw.verbose=1
net.inet.ip.fw.verbose_limit=5
Не существует требования компилировать
options IPFIREWALL
Данная опция дает возможность
options IPFIREWALL_VERBOSE
Следующая опция дает возможность создавать логи пакетов, которые проходят через log в наборе правил.
options IPFIREWALL_VERBOSE_LIMIT=5
Количество пакетов, для которых создаются логи с помощью syslogd в каждой записи, ограничено. Данная опция предотвращает возможность осуществления DoS-атак посредством переполнения syslog.
options IPFIREWALL_DEFAULT_TO_ACCEPT
Данная опция позволяет по умолчанию всем пакетам, которые не соответствуют ни одному правилу, проходить
options IPV6FIREWALL options IPV6FIREWALL_VERBOSE options IPV6FIREWALL_VERBOSE_LIMIT options IPV6FIREWALL_DEFAULT_TO_ACCEPT
Данные опции аналогичны опциям IPv4, но они предназначены для IPv6. Если IPv6 не используется,
options IPDIVERT
Это дает возможность использовать функциональность
Замечание. Если не включено IPFIREWALL_DEFAULT_TO_ACCEPT и не установлены правила, разрешающие входящие пакеты, все пакеты к компьютеру и от него будут блокированы.
Если /etc/rc.conf:
firewall_enable="YES"
Установка скриптов для активации правил:
firewall_script="/etc/ipfw.rules"
Необходимость создания логов:
firewall_logging="YES"
Замечание. Переменная firewall_logging устанавливает переменную sysctl net.inet.ip.fw.verbose в значение 1. Не существует в rc.conf переменной для установки ограничений логов, но ограничение может быть установлено посредством переменной sysctl вручную или из файла /etc/sysctl.conf.
net.inet.ip.fw.verbose_limit=5
Если компьютер функционирует в качестве шлюза и, в частности, предоставляет сервис /etc/rc.conf.
Команда является стандартным способом добавления или удаления единственного правила вручную во время функционирования
Для того чтобы получить список всех правил, следует выполнить
# ipfw list
Для того чтобы получить список всех правил с отметкой времени, когда последний раз правило срабатывало, следует выполнить
# ipfw –t list
Для того чтобы получить список информации счетчиков, следует выполнить команду с параметром –a. В первом столбце будет указан номер правила, далее следует количество исходящих пакетов, соответствующих правилу, и количество входящих пакетов, соответствующих правилу, а затем само правило.
# ipfw –a list
Показать последние динамические правила, добавленные к статическим правилам:
# ipfw –d list
Показать истекшие динамические правила:
# ipfw –d –e list
Обнулить счетчики:
# ipfw zero
Обнулить счетчики только для правила с номером NUM:
# ipfw zero NUM
С помощью правил можно разрешить или запретить прохождение пакета, основываясь на значениях, содержащихся в его заголовках. Понятие сессии означает двунаправленный обмен пакетами между хостами. С точки зрения сессии можно считать, что
Когда пакет поступает в
Замечание. Поиск продолжается после count, skipto и tee правил.
Инструкции, указанные здесь, являются основой при использовании правил, которые содержат опции поддержки состояния keep state, limit, in или out. Это является основой для создания включающего (
Включающий
Правила содержат ключевые слова. Эти слова указываются в определенном порядке слева направо в строке. Некоторые ключевые слова имеют дополнительные опции, которые сами могут быть ключевыми словами и также содержать дополнительные опции:
CMD RULE_NUMBER ACTION LOGGING SELECTION STATEFUL
Каждое новое правило должно начинаться с префикса add для добавления правила во внутреннюю таблицу.
Каждое правило имеет номер, с помощью которого можно перейти на данное правило.
Правило может быть связано с одним из следующих действий, которые могут быть выполнены, когда пакет соответствует критерию выбора данного правила.
allow | accept | pass | permit
Все эти значения являются аналогичными и означают, что пакеты, которые соответствуют правилу, разрешаются. При этом поиск прекращается.
check-state
Выполняется проверка пакета в таблице динамических правил. Если соответствие найдено, выполняется действие, связанное с правилом, которое создается данным динамическим правилом, в противном случае осуществляется переход к следующему правилу. Правило check-state не имеет критерия выбора. Если правило check-state присутствует в наборе правил, таблица динамических правил проверяется на соответствие правилу поддержки состояния или правилу ограничения.
deny | drop
Оба ключевых слова означают, что пакеты, соответствующие правилу, будут отброшены. Поиск завершается.
log [ logamount ]
Когда пакет соответствует правилу с ключевым словом log, сообщение будет записано посредством syslogd с названием SECURITY. Создание лога происходит только тогда, когда номер пакета, для которого создается лог, не превышает значения параметра logamount. Если logamount не указан, ограничение берется из переменной sysctl net.inet.ip.fw.verbose_limit. В обоих случаях значение "нуль" не считается ограничением создания логов. После того как ограничение достигнуто, создание логов может быть возобновлено чисткой счетчика логов или счетчика пакетов для данного правила, с помощью команды reset log для .
Замечание. Создание лога выполняется после того, как весь остальной пакет, соответствующий условию, будет успешно проверен, и перед выполнением заключительного действия ( accept, deny ) для пакета.
Ключевые слова данного раздела применяются для описания атрибутов пакета, которые будут анализироваться, чтобы определить, соответствует ли пакет правилу или нет. Следующие атрибуты общего назначения предназначены для поиска соответствия и должны использоваться в указанном порядке:
udp | tcp | icmp
Также может быть использовано любое другое название протокола, которое указано в /etc/protocols. Это значение является протоколом, соответствие с которым будет проверяться.
from src to dst
Ключевые слова from и to используются для поиска соответствия с IP-адресами. Правила должны указывать ОБА параметра как источника, так и назначения. any является специальным ключевым словом, которое соответствует любому IP-адресу. me является специальным ключевым словом, которое соответствует любому IP-адресу, сконфигурированному на интерфейсе системы, на которой выполняется from me to any или from any to me ). IP-адреса указываются в dot-нотации IP-адреса со "/" и длиной маски. Это — обязательное требование.
port <number>
Используется для протоколов, которые поддерживают номера портов (таких как ТСР и UDP). Вместо значения номера порта может быть указано имя сервиса из /etc/services.
in | out
Используется для указания входящих или исходящих пакетов, соответственно. Одно из этих ключевых слов должно быть указано обязательно в качестве части критерия при поиске соответствия.
via IF
Используется для пакетов, которые проходят через интерфейс, указанный по имени. Ключевое слово via, определяющее интерфейс, всегда проверяется в качестве части процесса поиска соответствия.
setup
Это является обязательным ключевым словом, которое идентифицирует запрос начала установки сессии для ТСР-пакетов.
keep-state
При наличии соответствия в других параметрах поиска
limit { src-addr | src-port | dst-addr | dst-port }
Указывается, что limit и keep-state не могут быть одновременно указаны в одном и том же правиле. Limit предоставляет определенную возможность поддержки состояния, как и keep-state, но также имеет и дополнительные возможности.
Фильтрование трафика с учетом состояния осуществляется как двунаправленный обмен пакетами с анализом переговоров о создании сессии. Существует возможность определить, что переговоры о сессии между отправителем и получателем соответствуют корректной процедуре двунаправленного обмена пакетами. Любые пакеты, которые не соответствуют правильному образцу создания сессии, автоматически отвергаются как фальшивые.
check-state используется для указания того, что правила
Динамические правила уязвимы для исчерпания ресурсов с помощью SYN-flood атаки, при которой создается большое число динамических правил. Для отражения данной атаки во FreeBSD версии 4.5 добавлена новая опция, называемая limit. Эта опция используется для ограничения количества одновременно устанавливаемых сессий с помощью просмотра полей источника или получателя в правиле, которое выполняется, если установлена опция limit. Если значение счетчика больше, чем значение, указанное в опции limit, пакет отбрасывается.
Преимущества создания логов очевидны: они обеспечивают возможность просмотра разного рода информации после того, как правило было активизировано. Это информация о том, какой пакет был отброшен, с какого адреса он пришел, куда он направлялся. Это дает важные сведения для отслеживания атакующего.
Даже при установленной возможности создания логов log в эти правила. Обычно это добавляется только для правил deny, например, для правила deny для входящих ICMP-пакетов. Также признак log добавляется в самое последнее правило. Это позволяет отследить все пакеты, которые не соответствовали ни одному из правил.
С созданием логов связано две опасности: можно потеряться в огромном количестве данных и переполнить дисковое пространство. DoS-атака, которая переполняет диск, является одной из старейших DoS-атак. Эти сообщения логов не только пишутся с использованием утилиты syslogd, но также показываются на консоли администратора, что скоро начинает раздражать.
Опция ядра IPFIREWALL_VERBOSE_LIMIT=5 ограничивает количество последовательных сообщений, посылаемых в syslogd, которые касаются пакета, соответствующего данному правилу. Когда данная опция установлена в ядре, количество последовательных сообщений, относящихся к конкретному правилу, не превышает указанного количества. Никогда не будет создано 200 сообщений лога, говорящих об одном и том же. Например, пять последовательных сообщений, касающихся конкретного правила, будут занесены в syslogd, оставшиеся сообщения будут подсчитаны и занесены в syslogd с помощью примерно такой фразы:
last message repeated 45 times
Все сообщения по умолчанию записываются в файл /etc/log/security, который определяется в файле /etc/syslog.conf.
Опытные администраторы sh, csh и tcsh shell’ами. Поля символьной подстановки должны начинаться со знака $. Символьные поля не имеют префикса $. Значение, которое принимает символьное поле, должно быть заключено в двойные кавычки.
Файл правил должен начинаться примерно так:
############### start of example ipfw rules script #############
#
ipfw -q -f flush # Delete all rules
# Set defaults
oif="tun0" # out interface
odns="192.0.2.11" # ISP's DNS server IP address
cmd="ipfw -q add " # build rule prefix
ks="keep-state" # just too lazy to key this each time
$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
################### End of example ipfw rules script ############
В данном примере правила не важны здесь показано, как поле символьной ссылки обозначается и как используется.
Если приведенный выше пример находится в файле /etc/, то эти правила могут быть загружены с помощью следующего ввода в командной строке:
# sh /etc/ipfw.rules
То же самое можно сделать, выполнив вручную следующие команды:
# ipfw -q -f flush
# ipfw -q add check-state
# ipfw -q add deny all from any to any frag
# ipfw -q add deny tcp from any to any established
# ipfw -q add allow tcp from any to any 80 out via tun0 setup keep-state
# ipfw -q add allow tcp from any to 192.0.2.11 53 out via tun0 setup keep-state
# ipfw -q add 00611 allow udp from any to 192.0.2.11 53 out via tun0 keep-state
В следующем наборе правил без
Как и все UNIX-системы, FreeBSD разработана с использованием интерфейса lo0 и IP-адреса 127.0.0.1 для внутреннего взаимодействия с ОС. Правила
Будем предполагать, что один интерфейс соединен с Интернетом. Для этого интерфейса должны быть определены правила управления доступом в Интернет и из Интернета. Это может быть РРР tun0 интерфейс или сетевая карта, которая соединяется с Интернетом.
В случае наличия более одной сетевой карточки, которые соединены с локальными сетями, расположенными позади
Первым делом правила должны быть разбиты на три основных раздела:
Порядок, в котором правила указываются для конкретного интерфейса, должен быть такой, чтобы более часто используемое правило было бы размещено выше, чем редко используемое. Последнее правило должно блокировать все пакеты на данном интерфейсе.
Раздел для исходящего трафика в следующем наборе правил содержит только правила allow, определяющие значения выбора, которые уникально идентифицируют сервис, разрешенный в Интернете. Все правила имеют proto, port, in/out, via и keep state опции. proto tcp правила имеют опцию setup, определяющую начальный пакет запроса установления сессии для передачи этой информации в таблицу поддержки состояния.
Раздел для входящего трафика первым делом блокирует все нежелательные пакеты. Должно иметься правило, которое явно блокирует пакеты, получаемые редко, и информацию о которых нет необходимости заносить в лог. В результате они не будут обработаны последним правилом в разделе, которое блокирует и заносит в лог все пакеты, не соответствовавшие ни одному правилу.
В данном случае отправителю не возвращается ответ, эти пакеты просто удаляются. При таком подходе у атакующего нет информации о том, что его пакеты достигли системы.
Следующий не содержащий dc0 в каждом правиле на название интерфейса сетевой карточки, который используется в системе для соединения с Интернетом. Например, для РРР пользователей следует указать tun0.
Рассмотрим пример, используемый в данных правилах:
keep-state ).limit для предотвращения наводнения ( flooding ).in или out для указания направления пересылки пакета.via для указания интерфейса, через который проходит пакет.Следующие правила указываются в /etc/.
################ Start of IPFW rules file ######################
# Flush out the list before we begin.
ipfw -q -f flush
# Set rules command prefix
cmd="ipfw -q add"
pif="dc0" # public interface name of NIC
# facing the public Internet
#################################################################
# No restrictions on Inside LAN Interface for private network
# Not needed unless you have LAN.
# Change xl0 to your LAN NIC interface name
#################################################################
#$cmd 00005 allow all from any to any via xl0
#################################################################
# No restrictions on Loopback Interface
#################################################################
$cmd 00010 allow all from any to any via lo0
#################################################################
# Allow the packet through if it has previous been added to the
# the "dynamic" rules table by a allow keep-state statement.
#################################################################
$cmd 00015 check-state
#################################################################
# Interface facing Public Internet (Outbound Section)
# Interrogate session start requests originating from behind the
# firewall on the private network or from this gateway server
# destine for the public Internet.
#################################################################
# Allow out access to my ISP's Domain name server.
# x.x.x.x must be the IP address of your ISP.s DNS
# Dup these lines if your ISP has more than one DNS server
# Get the IP addresses from /etc/resolv.conf file
$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
# Allow out non-secure standard www function
$cmd 00200 allow tcp from any to any 80 out via $pif setup keep-state
# Allow out secure www function https over TLS SSL
$cmd 00220 allow tcp from any to any 443 out via $pif setup keep-state
# Allow out send get email function
$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
# Allow out ping
$cmd 00250 allow icmp from any to any out via $pif keep-state
# Allow out Time
$cmd 00260 allow tcp from any to any 37 out via $pif setup keep-state
# Allow out secure FTP, Telnet, and SCP
# This function is using SSH (secure shell)
$cmd 00280 allow tcp from any to any 22 out via $pif setup keep-state
# deny and log everything else that.s trying to get out.
# This rule enforces the block all by default logic.
$cmd 00299 deny log all from any to any out via $pif
#################################################################
# Interface facing Public Internet (Inbound Section)
# Interrogate packets originating from the public Internet
# destine for this gateway server or the private network.
#################################################################
# Deny all inbound traffic from non-routable reserved address spaces
#RFC1918 private IP
$cmd 00300 deny all from 192.168.0.0/16 to any in via $pif $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
$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
# Deny public pings
$cmd 00310 deny icmp from any to any in via $pif
# Deny ident
$cmd 00315 deny tcp from any to any 113 in via $pif
# Deny all Netbios service. 137=name, 138=datagram, 139=session
# Netbios is MS/Windows sharing services.
# Block MS/Windows hosts2 name server requests 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
# Deny any late arriving packets
$cmd 00330 deny all from any to any frag in via $pif
# Deny ACK packets that did not match the dynamic rule table
$cmd 00332 deny tcp from any to any established in via $pif
# Allow in standard www function because I have apache server
$cmd 00400 allow tcp from any to me 80 in via $pif setup limit src-addr 2
# Allow in secure FTP, Telnet, and SCP from public Internet
$cmd 00410 allow tcp from any to me 22 in via $pif setup limit src-addr 2
# Allow in non-secure Telnet session from public Internet
# labeled non-secure because ID PW are passed over public
# Internet as clear text.
# Delete this sample group if you do not have telnet server
# enabled.
$cmd 00420 allow tcp from any to me 23 in via $pif setup limit src-addr 2
# Reject Log all incoming connections from the outside
$cmd 00499 deny log all from any to any in via $pif
# Everything else is denied by default
# deny and log all packets that fell through to see what they are
$cmd 00999 deny log all from any to any
################ End of IPFW rules file ########################
Существуют некоторые дополнительные конфигурационные утверждения, которые дают возможность активизировать функцию option divert.
В дополнение к обычным опциям /etc/rc.conf необходимо добавить следующее:
natd_enable="YES" # Enable NATD function natd_interface="rl0" # interface name of public Internet NIC natd_flags="-dynamic -m" # -m = preserve port numbers if possible
Использование правил поддержки состояния вместе с правилом divert natd для трансляции сетевых адресов существенно усложняет логику правил. Взаимное расположение правил проверки состояния и divert natd становится очень критичным. Уже не используется простая логика последовательного прохождения правил. Определено новое действие, называемое skipto. При использовании skipto необходимо знать номер каждого правила, чтобы точно указать номер того правила, на которое следует перейти.
Рассмотрим пример использования
Анализ пакета на соответствие правилам начинается с первого правила в файле правил и продолжается по одному правилу вниз по файлу до тех пор, пока не будет достигнут конец или не будет найдено соответствие пакета критериям выбора. После этого пакет покидает
Пусть локальный пользователь использует браузер для получения web-страницы. Web-сервер для взаимодействия использует порт 80 (см. пример набора правил №1). Когда пакет поступает в out, а не in. Он передается правилу 101. Этому правилу пакет также не соответствует, потому что это первый пакет и он еще не передается в динамическую таблицу поддержки состояния. Наконец, пакет поступает в правило 125, которому он соответствует. Пакет выходит через сетевую карточку, которая подключена к Интернету. Пакет все еще имеет IP-адрес локальной сети в качестве IP-адреса источника. При обнаружении соответствия данному правилу выполняются два действия. Опция keep-state передает информацию в таблицу динамических правил поддержки состояния. После этого выполняется действие skipto rule 500. Правило 500 применяет skipto 500 выполняется. Пакет переходит на правило 500, выполняется
Для входящего потока все пакеты рассматриваются как часть открытия существующей сессии, автоматически обрабатываются правилом проверки состояния и применяют правила
Рассмотрим другой пример. Пусть существует сервер Apache, выполняющийся на том же хосте, что и
Пример набора правил № 1:
#!/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 # exclude LAN traffic $cmd 003 allow all from any to any via lo0 #exclude loopback traffic $cmd 100 divert natd ip from any to any in via $pif $cmd 101 check-state # Authorized outbound packets $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 # Deny all inbound traffic from non-routable reserved address spaces $cmd 300 deny all from 192.168.0.0/16 to any in via $pif #RFC1918private 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 #loop-back $cmd 304 deny all from 0.0.0.0/8 to any in via $pif #loop-back $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 # Authorized inbound packets $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 # This is skipto location for outbound stateful rules $cmd 500 divert natd ip from any to any out via $pif $cmd 510 allow ip from any to any ######################## end of rules ##################
Следующий пример аналогичен предыдущему, но содержит большее количество комментариев.
Пример набора правил № 2:
#!/bin/sh
################ Start of IPFW rules file #######################
# Flush out the list before we begin.
ipfw -q -f flush
# Set rules command prefix
cmd="ipfw -q add"
skip="skipto 800"
pif="rl0" # public interface name of NIC
# facing the public Internet
#################################################################
# No restrictions on Inside LAN Interface for private network
# Change xl0 to your LAN NIC interface name
#################################################################
$cmd 005 allow all from any to any via xl0
#################################################################
# No restrictions on Loopback Interface
#################################################################
$cmd 010 allow all from any to any via lo0
#################################################################
# check if packet is inbound and nat address if it is
#################################################################
$cmd 014 divert natd ip from any to any in via $pif
#################################################################
# Allow the packet through if it has previous been added to the
# the "dynamic" rules table by a allow keep-state statement.
#################################################################
$cmd 015 check-state
#################################################################
# Interface facing Public Internet (Outbound Section)
# Interrogate session start requests originating from behind the
# firewall on the private network or from this gateway server
# destine for the public Internet.
#################################################################
# Allow out access to my ISP's Domain name server.
# x.x.x.x must be the IP address of your ISP's DNS
# Dup these lines if your ISP has more than one DNS server
# Get the IP addresses from /etc/resolv.conf file
$cmd 020 $skip tcp from any to x.x.x.x 53 out via $pif setup keep-state
# Allow out secure www function https over TLS SSL
$cmd 050 $skip tcp from any to any 443 out via $pif setup keep-state
# Allow out send get email function
$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
# Allow out ping
$cmd 080 $skip icmp from any to any out via $pif keep-state
# Allow out Time
$cmd 090 $skip tcp from any to any 37 out via $pif setup keep-state
# Allow out secure FTP, Telnet, and SCP
# This function is using SSH (secure shell)
$cmd 110 $skip tcp from any to any 22 out via $pif setup keep-state
# Allow ntp time server
$cmd 130 $skip udp from any to any 123 out via $pif keep-state
#################################################################
# Interface facing Public Internet (Inbound Section)
# Interrogate packets originating from the public Internet
# destine for this gateway server or the private network.
#################################################################
# Deny all inbound traffic from non-routable reserved address
# spaces
#RFC
$cmd 300 deny all from 192.168.0.0/16 to any in via $pif
1918 private IP
$cmd 301 deny all from 172.16.0.0/12 to any in via $pif
$cmd 302 deny all from 10.0.0.0/8 to any in via $pif
$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
# Deny ident
$cmd 315 deny tcp from any to any 113 in via $pif
# Deny all Netbios service. 137=name, 138=datagram, 139=session
# Netbios is MS/Windows sharing services.
# Block MS/Windows hosts2 name server requests 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
# Deny any late arriving packets
$cmd 330 deny all from any to any frag in via $pif
# Deny ACK packets that did not match the dynamic rule table
$cmd 332 deny tcp from any to any established in via $pif
# Allow in standard www function because I have Apache server
$cmd 370 allow tcp from any to me 80 in via $pif setup limit src-addr 2
# Allow in secure FTP, Telnet, and SCP from public Internet
$cmd 380 allow tcp from any to me 22 in via $pif setup limit src-addr 2
# Allow in non-secure Telnet session from public Internet
# labeled non-secure because ID PW are passed over public
# Internet as clear text.
# Delete this sample group if you do not have telnet server
# enabled.
$cmd 390 allow tcp from any to me 23 in via $pif setup limit src-addr 2
# Reject Log all unauthorized incoming connections from the
# public Internet
$cmd 400 deny log all from any to any in via $pif
# Reject Log all unauthorized out going connections to the
# public Internet
$cmd 450 deny log all from any to any out via $pif
# This is skipto location for outbound stateful rules
$cmd 800 divert natd ip from any to any out via $pif
$cmd 801 allow ip from any to any
# Everything else is denied by default
# deny and log all packets that fell through to see what they are
$cmd 999 deny log all from any to any
################ End of IPFW rules file #######################
Для получения официальных документов о завершении программы дополнительного профессионального образования (удостоверения о повышении квалификации, дипломов о профессиональной переподготовке и MBA) необходимо предоставить:
Внимание! Вы можете не заказывать доставку бумажной версии официального документы, а скачать его в электронном виде и распечатать самостоятельно. Информация о выданном документе в течение 1 месяца загружается в Федеральную информационную систему «Федеральный реестр сведений о документах об образовании и (или) о квалификации, документах об обучении» - ФИС ФРДО.
Доступ на новый сайт осуществляется с использованием адреса электронной почты, который был указан вами при регистрации на "старом". Мы постарались перенести все ваши данные с прежнего ресурса, однако не исключена вероятность потери части информации.
При возникновении проблемы со входом, воспользуйтесь функцией сброса пароля
Если вы обнаружите несоответствия, пожалуйста, сообщите нам.