Межсетевое экранирование

         

ACTION


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

allow | accept | pass | permit

Все эти значения являются аналогичными и означают, что пакеты, которые соответствуют правилу, разрешаются. При этом поиск прекращается.

check-state

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

deny | drop

Оба ключевых слова означают, что пакеты, соответствующие правилу, будут отброшены. Поиск завершается.



CMD


Каждое новое правило должно начинаться с префикса add для добавления правила во внутреннюю таблицу.



Действие (action)


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

block указывает, что пакет должен быть отброшен, если он соответствует параметру выбора.

pass указывает, что пакет должен быть пропущен пакетным фильтром, если он соответствует параметру выбора.



No restrictions on Inside LAN


################################################################# # 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 #######################
Пример 3.1.
Закрыть окно





################ 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 ########################
Пример 3.2.
Закрыть окно





#!/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 ##################
Пример 3.3.
Закрыть окно





#!/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 #######################
Пример 3.4.
Закрыть окно




FTP и NAT


FTP имеет следующую особенность: он может выполняться в активном и пассивном режиме. Различие состоит в том, как создается канал данных. Пассивный режим является более безопасным, так как канал данных создается тем, кто запрашивает ftp-сессию.



IN-OUT


Обязательное требование состоит в том, что в каждом правиле фильтра должно быть явно указано, пакеты какого направления оно анализирует. Ключевым словом может быть либо in, либо out. Если указано что-либо еще, то правило не пройдет синтаксическую проверку.

in означает, что данное правило применяется для входящего пакета на указанном интерфейсе.

out означает, что данное правило применяется для исходящего пакета на указанном интерфейсе.



IPF


Команда ipf используется для загрузки файла с правилами. Обычно создается файл с требуемыми правилами и используется данная команда для замены выполняющихся в текущей момент правил:

# ipf –Fa –f /etc/ipf.rules

-Fa означает очистку всех внутренних таблиц правил.

-f означает, что новые правила будут загружены из данного файла.

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

Команда ipf предполагает, что файл с правилами является стандартным текстовым файлом. Она не понимает файл с правилами, написанный в виде скрипта и с использованием символьных подстановок.

Существует способ построения правил IPF с возможностью использовать символьные подстановки.



IPFILTER (IPF) firewall


IPFILTER не зависит от ОС, он является open source приложением, которое портировано на FreeBSD, NetBSD, OpenBSD, SunOS, HP/UX и Solaris. IPFILTER активно развивается, регулярно выходят новые версии.

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

IPF был написан сперва с использованием логики обработки правил "используется последнее правило, которому соответствует пакет". Первоначально имелись только правила без поддержки состояния. Со временем IPF был усилен включением опции quick и опции поддержки состояния keep state, в результате чего изменилась логика обработки правил. Модернизированные функции включены только в виде дополнительных опций, они дают возможность создавать пакетный фильтр, обеспечивающий большую безопасность.

Рассмотрим использование правил, которые содержат опцию quick и опцию поддержки состояния keep state. Это является основой для создания набора правил включающего пакетного фильтра.

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



IPFSTAT


По умолчанию ipfstat показывает общую статистику, полученную в результате применения правил к входящим и исходящим пакетам.



IPFW


IPFIREWALL (IPFW) является пакетным фильтром, изначально существовавшем во FreeBSD. Он использует наследуемые правила без поддержки состояния и наследуемую технологию представления правил для получения так называемой Simple Stateful логики.

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

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

IPFW состоит из семи компонент. Исходной компонентой является процессор правил фильтрования из ядра firewall’а и интегрированная с ним возможность подсчета пакетов, возможность создания логов, правило divert, которое запускает NAT и некоторые дополнительные возможности, возможности шейпинга трафика, возможность перенаправления fwd rule, возможность моста и возможность невидимого ip.



IPMON


Для того чтобы ipmon работал корректно, в ядре должна быть установлена опция IPFILTER_LOG. Для этой команды определены два режима.В первом режиме команда вызывается из командной строки.

Режим демона используется тогда, когда необходимо сделать файл системного лога доступным для просмотра в более позднее время. Этим способом можно сконфигурировать IPMON и IPFILTER для совместной работы. Во FreeBSD есть встроенная возможность автоматической ротации системных логов. Поэтому выводить информацию с использованием в 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



IPNAT


Правила NAT загружаются с помощью команды ipnat. Обычно правила NAT хранятся в /etc/ipnat.rules.

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

Для перезагрузки правил NAT следует выполнить команду

# ipnat -CF -f /etc/ipnat.rules

Чтобы посмотреть статистику NAT, следует выполнить

# ipnat -s

Чтобы посмотреть список текущих отображений в таблице NAT, следует выполнить

# ipnat -l

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

# ipnat –v



Использование пула публичных адресов


В очень больших локальных сетях существует очень большое количество локальных адресов, которые отображаются в единственный публичный адрес. Мы имеем правило

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

Или можно указать подсеть, используя CIDR-нотацию:

map dc0 192.168.1.0/24 -> 204.134.75.0/24



Как работает NAT


Пакет поступает в пакетный фильтр из локальной сети с адресом получателя, расположенным в Интернете. Он пропускается через правила фильтрации для исходящего трафика. Затем получает пакет NAT и просматривает свои правила сверху вниз; применяется первое правило, которому соответствует пакет. NAT проверяет каждое свое правило на соответствие имени интерфейса и IP-адресу источника в пакете. Когда имя интерфейса пакета соответствует правилу NAT, то IP-адрес источника (т.е. в данном случае IP-адрес локальной сети) в пакете проверяется, чтобы выяснить, не попал ли он в диапазон IP-адресов, указанный слева от символа стрелки в правиле NAT. Если это так, то его IP-адрес источника заменяется IP-адресом, указанным справа от стрелки в правиле NAT. При этом NAT создает запись в своей внутренней таблице. Поэтому, когда пакет возвращается из Интернет, он может быть отображен обратно в свой исходный IP-адрес в локальной сети и затем передан правилам фильтрации для дальнейшей обработки.



Команды IPFW


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

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

Для того чтобы получить список всех правил, следует выполнить

# ipfw list

Для того чтобы получить список всех правил с отметкой времени, когда последний раз правило срабатывало, следует выполнить

# ipfw –t list

Для того чтобы получить список информации счетчиков, следует выполнить команду с параметром –a. В первом столбце будет указан номер правила, далее следует количество исходящих пакетов, соответствующих правилу, и количество входящих пакетов, соответствующих правилу, а затем само правило.

# ipfw –a list

Показать последние динамические правила, добавленные к статическим правилам:

# ipfw –d list

Показать истекшие динамические правила:

# ipfw –d –e list

Обнулить счетчики:

# ipfw zero

Обнулить счетчики только для правила с номером NUM:

# ipfw zero NUM



Набор правил IPF


Набор правил определяет прохождение или блокировку пакетов, основываясь на значениях, содержащихся в пакете. Установление сессии включает в себя двунаправленный обмен пакетами между хостами. Набор правил firewall’а обрабатывает пакет два раза: один раз — когда он поступает из Интернета и второй — когда он возвращается обратно в Интернет. Каждый TCP/IP-сервис (http, smtp, telnet и т.п.) определяется своим протоколом, IP-адресами источника и получателя, номерами портов источника и получателя. Эти значения являются основными критериями, на основе которых разрешаются или блокируют сервисы.

IPF был первоначально написан с использованием логики обработки правил "используется последнее правило, которому соответствует пакет". Правила не поддерживали состояния. Со временем IPF был усилен включением опции quick и опции поддержки состояния keep state, что существенно изменило логику обработки правил.

Далее мы будем рассматривать использование правил, которые включают опцию quick и опцию поддержки состояний keep state. Это общая основа для набора во включающем пакетном фильтре.

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



Набор правил IPFW


С помощью правил можно разрешить или запретить прохождение пакета, основываясь на значениях, содержащихся в его заголовках. Понятие сессии означает двунаправленный обмен пакетами между хостами. С точки зрения сессии можно считать, что набор правил пакетного фильтра обрабатывает пакет дважды: один раз — когда тот поступает на внешний интерфейс, и второй — когда покидает хост через данный интерфейс. Каждый tcp/ip сервис (например, telnet, www, mail и т.п.) определяется своим протоколом и номером порта. Это является базовым критерием при создании правил, которые разрешают или запрещают сервис.

Когда пакет поступает в пакетный фильтр, он сравнивается с первым правилом в наборе правил и затем продвигается сверху вниз по набору в порядке возрастания номеров правил. Если пакет соответствует параметрам правила, выполняется действие, указанное в правиле, и для данного пакета обработка завершается. Это называется методом поиска "первое найденное соответствие". Если пакет не соответствует никакому из правил, он обрабатывается правилом по умолчанию, обязательным для IPFW, с номером 65535, которое запрещает все пакеты, т.е. отбрасывает этот пакет без какого-либо ответа отправителю.

Замечание. Поиск продолжается после count, skipto и tee правил.

Инструкции, указанные здесь, являются основой при использовании правил, которые содержат опции поддержки состояния keep state, limit, in или out. Это является основой для создания включающего (inclusive) типа набора правил пакетного фильтра.

Включающий пакетный фильтр разрешает только те сервисы, которые соответствуют правилам.



Набор правил Stateful


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

Как и все UNIX-системы, FreeBSD разработана с использованием интерфейса lo0 и IP-адреса 127.0.0.1 для внутреннего взаимодействия с ОС. Правила пакетного фильтра должны разрешать свободную пересылку этих внутренних пакетов.

Будем предполагать, что один интерфейс соединен с Интернетом. Для этого интерфейса должны быть определены правила управления доступом в Интернет и из Интернета. Это может быть РРР tun0 интерфейс или сетевая карта, которая соединяется с Интернетом.

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

Первым делом правила должны быть разбиты на три основных раздела:

Правила для интерфейсов, на которых не определено управление доступом.Правила для интерфейсов, на которых определено управление доступом для исходящего трафика.Правила для интерфейсов, на которых определено управление доступом для входящего трафика.

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

Раздел для исходящего трафика в следующем наборе правил содержит только правила allow, определяющие значения выбора, которые уникально идентифицируют сервис, разрешенный в Интернете. Все правила имеют proto, port, in/out, via и keep state опции. proto tcp правила имеют опцию setup, определяющую начальный пакет запроса установления сессии для передачи этой информации в таблицу поддержки состояния.

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

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



NAT


С помощью NAT осуществляется трансляция сетевых адресов. Это аналогично Linux, понятию IP Masquerading; NAT и IP Masquerading являются синонимами. Одной из многих функций, которую обеспечивает NAT, является возможность иметь частные адреса в локальной сети, расположенной за пакетным фильтром.

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

Существует специальный диапазон адресов, зарезервированный для 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



NAT для очень больших LAN


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



Опции


Опции должны использоваться в указанном ниже порядке.

log означает, что заголовок пакета будет записан в ipl лог, если пакет соответствует параметрам выбора.

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

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

Когда пакет записывается в лог, заголовки пакета используются пакетом IPL, который создает логи на псевдо-устройстве. Непосредственно за ключевым словом log могут использоваться следующие квалификаторы (в указанном порядке):

body означает, что после заголовков будут записаны первые 128 бит содержимого пакета.

first – если ключевое слово log используется вместе с опцией keep state, рекомендуется, чтобы данная опция также применялась, так как в этом случае только начальный пакет заносится в лог, но не пакеты, которые в дальнейшем соответствуют информации keep state.



Опции, доступные в rc.conf


Для активации 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 по именам

Если позади пакетного фильтра имеется локальная сеть, которая использует частный диапазон IP-адресов, необходимо добавить следующие утверждения для поддержки функциональности NAT:

gateway_enable="YES" # Enable as LAN gateway ipnat_enable="YES" # Start ipnat function ipnat_rules="/etc/ipnat.rules" # файл с определением правил # для ipnat



Опции /etc/rc.conf


Если IPFW скомпилирован в ядро, то необходимо загрузить его с помощью следующего утверждения в /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

Если компьютер функционирует в качестве шлюза и, в частности, предоставляет сервис NAT, следует использовать дополнительные опции в /etc/rc.conf.



Опции ядра


Не существует требования, что запуск PF должен выполняться обязательно из ядра FreeBSD. Компилирование PF в ядро приведет к тому, что загружаемый модуль никогда не будет использоваться.

Пример конфигурирования ядра можно найти в /usr/src/sys/ conf/NOTES:

device pf device pflog device pfsync

device pf обеспечивает поддержку пакетного фильтра PF.

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

device pfsync обеспечивает дополнительную поддержку псевдосетевого устройства pfsync, которое используется для мониторинга изменений состояния. Так как оно не является частью загружаемого модуля, оно встраивается в ядро.


Не существует требования компилировать IPFW в ядро, если нет необходимости в функции NAT.

options IPFIREWALL

Данная опция дает возможность IPFW функционировать как часть ядра.

options IPFIREWALL_VERBOSE

Следующая опция дает возможность создавать логи пакетов, которые проходят через IPFW, и указывать ключевое слово 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 не используется, IPFW можно использовать без правил для IPv6.

options IPDIVERT

Это дает возможность использовать функциональность NAT.

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




Не существует обязательного требования компилировать IPF в ядро FreeBSD. Компилирование IPF в ядро приведет к тому, что загружаемый модуль никогда не будет использоваться.



Опции правила Stateful


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

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

Динамические правила уязвимы для исчерпания ресурсов с помощью SYN-flood атаки, при которой создается большое число динамических правил. Для отражения данной атаки во FreeBSD версии 4.5 добавлена новая опция, называемая limit. Эта опция используется для ограничения количества одновременно устанавливаемых сессий с помощью просмотра полей источника или получателя в правиле, которое выполняется, если установлена опция limit. Если значение счетчика больше, чем значение, указанное в опции limit, пакет отбрасывается.



Опции rc.conf


Для активации 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" # возможность функционирования # в качестве шлюза



OpenBSD Packet Filter (PF) и ALTQ


В 2003 году ПО пакетного фильтра из OpenBSD, известное как PF, было портировано на FreeBSD и доступно во FreeBSD Ports Collections; первой версией, которая содержала PF в качестве составной части базовой системы, была FreeBSD 5.3, выпущенная в ноябре 2004 года. PF является полнофункциональным пакетным фильтром, который имеет дополнительную поддержку для ALTQ (Alternate Queuing). ALTQ обеспечивает качество сервиса (QoS), что позволяет гарантировать ширину пропускания для различных сервисов, указанную в правилах фильтрования.

До версий 4.Х PF не доступен.

Во всех версиях, начиная с 4.Х, PF доступен как часть проекта KAME.

5.Х до 5.3 RELEASE – может использоваться порт security/pf для инсталляции PF.

5.3 RELEASE и более позднее – PF является частью базовой системы. Начиная с этих версий FreeBSD, не следует использовать порт security/pf. Вместо этого следует использовать PF базовой системы.



Основные характеристики пакетных фильтров в ОС FreeBSD


Существует два основных способа создания набора правил пакетного фильтра: "inclusive" — включающий и "exclusive" — исключающий. Основное различие состоит в том, какое правило применяется по умолчанию к пакетам, не соответствующим всем остальным правилам.

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

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

Дальнейшее усиление безопасности может достигаться использованием stateful firewall. Применение stateful firewall’а означает, что пакетный фильтр отслеживает открытые соединения и разрешает прохождение только того трафика, который либо соответствует существующему соединению, либо открывает новое соединение. Недостатком stateful firewall’а является то, что он уязвим для DoS-атак, если большое количество новых соединений открывается очень быстро. В большинстве случаев можно использовать комбинацию stateful и не-stateful свойств, создавая оптимальный firewall для защиты локальной сети.



ПО пакетных фильтров


FreeBSD имеет три различных пакета ПО firewall’а, встроенных в базовую систему. Это IPFILTER (также известный как IPF), IPFIREWALL (также известный как IPFW) и PacketFilter из OpenBSD (также известный как PF). FreeBSD также имеет два встроенных пакета ПО для шейпинга ("отслеживания" — "shaping") трафика, обычно используемых для управления используемой шириной пропускания: altq и dummynet. Dummynet традиционно используется с IPFW, а ALTQ — с IPF и PF. IPF, IPFW и PF применяют правила для управления доступом пакетов в систему и из системы, но при этом они делают это разными способами и имеют разный синтаксис правил.

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

Отчасти предпочтительным можно называть IPFILTER, потому что его stateful правила являются менее сложными при использовании в окружении NAT и он имеет встроенный ftp-прокси, что упрощает правила, разрешающие использование безопасного исходящего FTP.

Так как все пакетные фильтры основаны на анализе значений определенных полей пакета, при написании набора правил пакетного фильтра следует понимать, как работает TCP/IP, что означают различные значения полей в пакете и как эти значения используются в обычном случае.



PORT


Когда проверяется соответствие порта, то может использоваться либо целое число номера порта, либо название сервиса из /etc/services. Когда порт указывается как часть объекта from, он соответствует номеру порта источника; когда он появляется как часть объекта to, он соответствует номеру порта получателя. Использование опции port с объектом to является обязательным требованием для модернизированной логики обработки правил. Пример использования: from any to any port=80.

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

port "=" | "!=" | ">" | ";<" | ";<=" | ">=" | "eq" | "ne" | "lt" | "gt" | "le" | "ge"

Для того чтобы указать диапазон портов, следует использовать

port "<>" | "><"



Port Redirection


Очень распространенной практикой является иметь web-сервер, e-mail сервер, сервер баз данных и DNS-сервер, каждый из которых расположен на отдельной машине в локальной сети. В этом случае трафик от этих серверов также может использовать NAT, но должен существовать способ перенаправить входящий трафик к нужным компьютерам в локальной сети. IPNAT имеет такую возможность перенаправления и может решить данную проблему. Пусть имеется web-сервер в локальной сети с адресом 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



Построение скрипта правил с использованием символьных подстановок


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

Синтаксис скрипта совместим с 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.



Построение скрипта правила


Опытные администраторы IPFW создают файл, содержащий правила и код, который затем выполняется в виде скрипта. Основное преимущество состоит в том, что правила пакетного фильтра могут быть изменены без необходимости перезапуска системы. Этот метод очень удобен при тестировании новых правил, так как данная процедура может быть выполнена много раз. При написании скрипта можно создавать символьные подстановки для обозначения часто используемых значений и затем указывать их в нескольких правилах. Синтаксис скрипта совместим с 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/ipfw.rules, то эти правила могут быть загружены с помощью следующего ввода в командной строке:

# 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



Правила фильтрации IPNAT FTP


Необходимо только одно правило фильтрации для FTP, если используется NAT FTP-proxy.

Без 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



Правила IPNAT


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

Синтаксис, представленный здесь, — упрощенный. Полный синтаксис следует искать в соответствующей man странице.

Синтаксис правила NAT выглядит аналогичным образом:

map IF LAN_IP_RANGE -> PUBLIC_ADDRESS

Правило начинается с ключевого слова map.

Следует заменить IF на внешний интерфейс.

LAN_IP_RANGE – это те IP-адреса, которыми пользуются внутренние клиенты.

PUBLIC_ADDRESS может быть либо внешним IP-адресом, либо специальным значением 0/32, которое означает использование IP-адреса, связанного с IF.


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

Синтаксис, представленный здесь, — упрощенный. Полный синтаксис следует искать в соответствующей man странице.

Синтаксис правила NAT выглядит аналогичным образом:

map IF LAN_IP_RANGE -> PUBLIC_ADDRESS

Правило начинается с ключевого слова map.

Следует заменить IF на внешний интерфейс.

LAN_IP_RANGE – это те IP-адреса, которыми пользуются внутренние клиенты.

PUBLIC_ADDRESS может быть либо внешним IP-адресом, либо специальным значением 0/32, которое означает использование IP-адреса, связанного с IF.



Пример совместного использования NAT и Stateful


Существуют некоторые дополнительные конфигурационные утверждения, которые дают возможность активизировать функцию NAT в IPFW. В ядро должно быть добавлено утверждение option divert.

В дополнение к обычным опциям IPFW в /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 необходимо знать номер каждого правила, чтобы точно указать номер того правила, на которое следует перейти.

Рассмотрим пример использования NAT и поддержки состояния, чтобы понять последовательность прохождения пакета через наборы правил.

Анализ пакета на соответствие правилам начинается с первого правила в файле правил и продолжается по одному правилу вниз по файлу до тех пор, пока не будет достигнут конец или не будет найдено соответствие пакета критериям выбора. После этого пакет покидает пакетный фильтр. Важно помнить о расположении правил с номерами 100, 101, 450, 500 и 510. Они управляют преобразованием исходящих и входящих пакетов, а именно эти записи в динамической таблице поддержки состояния всегда регистрируют частные IP-адреса локальной сети. Далее, важно помнить, что во всех разрешающих и запрещающих правилах указывается направление прохождения пакета (входящий или исходящий) и интерфейс. Также следует помнить, что все запросы начала исходящей сессии всегда переходят на правило 500 для выполнения трансляции сетевого адреса.

Пусть локальный пользователь использует браузер для получения web-страницы. Web-сервер для взаимодействия использует порт 80 (см.
пример набора правил №1). Когда пакет поступает в пакетный фильтр, он не соответствует правилу 100, потому что снабжен заголовком out, а не in. Он передается правилу 101. Этому правилу пакет также не соответствует, потому что это первый пакет и он еще не передается в динамическую таблицу поддержки состояния. Наконец, пакет поступает в правило 125, которому он соответствует. Пакет выходит через сетевую карточку, которая подключена к Интернету. Пакет все еще имеет IP-адрес локальной сети в качестве IP-адреса источника. При обнаружении соответствия данному правилу выполняются два действия. Опция keep-state передает информацию в таблицу динамических правил поддержки состояния. После этого выполняется действие skipto rule 500. Правило 500 применяет NAT для IP-адреса пакета и отправляет его в Интернет. Данный пакет поступает к получателю и возвращается обратно для завершения установления ТСР-соединения. При этом пакет попадает в первое правило из набора правил. В этот момент он соответствует правилу 100, и его IP-адрес получателя преобразуется обратно в IP-адрес локальной сети. Затем он будет передан правилу проверки состояния. При этом он будет найден в таблице как соответствующий открытой сессии и передан в локальную сеть. Пакет передается на рабочую станцию в локальной сети, которая его посылала. Новый пакет посылается для запроса данных от удаленного сервера. В тот момент, когда он получен, он проверяется правилом проверки состояния, и если запись для данного исходящего пакета существует, указанное действие skipto 500 выполняется. Пакет переходит на правило 500, выполняется NAT, и пакет покидает пакетный фильтр.
Для входящего потока все пакеты рассматриваются как часть открытия существующей сессии, автоматически обрабатываются правилом проверки состояния и применяют правила NAT. В результате этого все плохие пакеты отбрасываются и пропускаются только пакеты для разрешенных сервисов.
Рассмотрим другой пример. Пусть существует сервер Apache, выполняющийся на том же хосте, что и пакетный фильтр, и мы хотим, чтобы имелся доступ из Интернета к web-сайту.

Пример включающего набора правил


Следующий набор правил является примером того, как задать включающий тип пакетного фильтра. Включающий пакетный фильтр разрешает только те сервисы, которые соответствуют правилам 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.
Следующий набор правил определяет включающий тип пакетного фильтра. В реальной системе достаточно раскомментировать правила pass для сервисов, которые необходимо аутентифицировать.
После этого следует просмотреть сообщения в логах и добавить правило block в раздел для входящего трафика.
Необходимо также изменить название интерфейса dc0 в каждом правиле на название интерфейса в вашей системе, который соединяется с Интернетом. Для использования РРР следует указать tun0.
Пример списка правил в /etc/ipf.rules.
Пример 3.1.
(html, txt)


# 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 #######################
Пример 3.1.

PROTO


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

tcp/udp | udp | tcp | icmp или название любого другого протокола, которое находится в /etc/protocols. Ключевое слово tcp/udp может использоваться для указания соответствия пакета либо ТСР, либо UDP, и добавлено для удобства.



RULE_NUMBER


Каждое правило имеет номер, с помощью которого можно перейти на данное правило.



SELECTION


Ключевые слова, описанные в данном разделе, используются для описания атрибутов пакета, которые анализируются для определения, соответствует ли он правилу или нет. Существует ключевое слово subject, для которого определены ключевые слова в качестве подопций, одно из которых выбирается. Для определения соответствия могут использоваться в указанном порядке следующие атрибуты общего назначения:


Ключевые слова, описанные в данном разделе, используются для описания атрибутов пакета, которые анализируются для определения, соответствует ли он правилу или нет. Существует ключевое слово subject, для которого определены ключевые слова в качестве подопций, одно из которых выбирается. Для определения соответствия могут использоваться в указанном порядке следующие атрибуты общего назначения:



Синтаксис правил


Правила содержат ключевые слова. Эти слова указываются в определенном порядке слева направо в строке. Некоторые ключевые слова имеют дополнительные опции, которые сами могут быть ключевыми словами и также содержать дополнительные опции:

CMD RULE_NUMBER ACTION LOGGING SELECTION STATEFUL



Синтаксис правила


Синтаксис использует логику "используется первое правило, которому соответствует пакет".

Символ # используется для обозначения начала комментария и может появиться в конце строки правила или в начале всей строки.

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

Общий синтаксис правила следующий:

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



Создание логов


log [ logamount ]

Когда пакет соответствует правилу с ключевым словом log, сообщение будет записано посредством syslogd с названием SECURITY. Создание лога происходит только тогда, когда номер пакета, для которого создается лог, не превышает значения параметра logamount. Если logamount не указан, ограничение берется из переменной sysctl net.inet.ip.fw.verbose_limit. В обоих случаях значение "нуль" не считается ограничением создания логов. После того как ограничение достигнуто, создание логов может быть возобновлено чисткой счетчика логов или счетчика пакетов для данного правила, с помощью команды reset log для ipfw.

Замечание. Создание лога выполняется после того, как весь остальной пакет, соответствующий условию, будет успешно проверен, и перед выполнением заключительного действия (accept, deny) для пакета.


log [ logamount ]

Когда пакет соответствует правилу с ключевым словом log, сообщение будет записано посредством syslogd с названием SECURITY. Создание лога происходит только тогда, когда номер пакета, для которого создается лог, не превышает значения параметра logamount. Если logamount не указан, ограничение берется из переменной sysctl net.inet.ip.fw.verbose_limit. В обоих случаях значение "нуль" не считается ограничением создания логов. После того как ограничение достигнуто, создание логов может быть возобновлено чисткой счетчика логов или счетчика пакетов для данного правила, с помощью команды reset log для ipfw.

Замечание. Создание лога выполняется после того, как весь остальной пакет, соответствующий условию, будет успешно проверен, и перед выполнением заключительного действия (accept, deny) для пакета.



Создание правил фильтрации


Пакетный фильтр читает правила конфигурации из pf.conf файла и модифицирует, отбрасывает или пропускает пакеты в соответствии с правилами, указанными там. Файл /etc/pf.conf также содержит полезные примеры и объяснения.

Синтаксис точно такой же, как и в OpenBSD.



SRC_ADDR / DST_ADDR


Ключевое слово all является синонимом для from any to any без каких-либо других параметров.

from src to dst: ключевые слова 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-нотации.



STATEFUL


keep state указывает, что в правиле pass любые пакеты, которые соответствуют параметрам выбора в правиле, должны активизировать stateful возможность фильтрации.

Замечание. Данная опция является обязательной для модернизированной логики обработки правил.



Stateful-фильтрация


Stateful фильтрация обрабатывает трафик как двунаправленный обмен пакетами, при котором выполняется установление сессии. Во время активизации keep state динамически создаются внутренние правила для каждого ожидаемого пакета, которыми обмениваются исходные отправитель и получатель. Любые пакеты, которые не соответствуют образцу установления сессии, автоматически отвергаются как ложные.

Поддержка состояния допускает наличие ICMP-пакетов, относящихся к ТСР- или UDP-сессии. Также пакет, который IPF может рассматривать как часть активной сессии, даже если это другой протокол, будет пропущен.

Рассмотрим, что происходит при установлении сессии.

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

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

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

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



TCP_FLAG


Флаги устанавливаются только для ТСР-фильтрации. Буквы указывают один из возможных флагов, который может быть установлен в заголовке ТСР-пакета. В модернизированной логике обработки пакетов используется параметр flags S для идентификации запроса начала сессии.



Указание необходимости использования ALTQ


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 передает в первую очередь трафик, который находится в самой верхней очереди.



Указание необходимости использования IPF


IPF включен в базовую инсталляцию FreeBSD в качестве отдельного модуля, загружаемого во время выполнения. Система динамически загружает модуль ядра IPF, если в rc.conf указано утверждение ipfilter_enable="YES". Загружаемый модуль создается с возможностью создания логов и опцией default pass all. Нет необходимости компилировать IPF в ядро FreeBSD только для того, чтобы изменить умолчание на block all. Это можно сделать, указав блокировку всего трафика в конце набора правил.



Указание необходимости использования IPFW


IPFW включен в базовую инсталляцию FreeBSD в качестве отдельного загружаемого модуля времени выполнения. Система динамически загружает модуль ядра, если в rc.conf используется утверждение firewall_enable="YES". Нет необходимости компилировать IPFW в ядро FreeBSD, если нет необходимости в функции NAT.

После перезапуска системы с 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



Указание необходимости использования PF


PF включен в базовую инсталляцию FreeBSD во все версии позднее 5.3 в качестве отдельного загружаемого модуля времени выполнения. Система будет динамически загружать модуль ядра PF, если в rc.conf указано утверждение pf_enable="YES". Загружаемый модуль будет иметь возможность создавать логи pflog.

Замечание. Модуль предполагает наличие опций INET и device bpf.

После того как модуль загружен или ядро статически осуществляет поддержку PF, существует возможность разрешить или запретить pf с помощью команды pfctl:

# pfctl –e

Команда pfctl предоставляет способ работы с пакетным фильтром PF.



Указание порта


Обычное правило NAT выглядит таким образом:

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



и исходящий трафик, который проходит


Пакетные фильтры анализируют входящий и исходящий трафик, который проходит через систему. Такой фильтр может использовать один или более набор правил для анализа сетевых пакетов, которые поступают по входящим сетевым соединениям или покидают систему по исходящим сетевым соединениям. При этом либо трафику разрешается проходить через firewall, либо трафик блокируется. Правила пакетного фильтра могут анализировать несколько характеристик пакета, таких как тип протокола, адреса источника и назначения, порты источника и назначения.
Пакетные фильтры могут использоваться следующим образом:
Защищать и изолировать приложения, сервисы и компьютеры во внутренней сети от нежелательного входящего трафика из Интернета.Ограничивать или запрещать доступ с хостов внутренней сети к сервисам в Интернете.Выполнять трансляцию сетевых адресов (NAT), что позволит внутренней сети использовать частные IP-адреса и разделять единственное соединение с Интернетом (либо с одним IP-адресом, либо с разделяемым пулом автоматически назначаемых публичных адресов).
Рассмотрим следующие проблемы:
Корректное определение правил фильтрования пакетов.Различия между firewall’ами, встроенными во FreeBSD.Использование и конфигурирование OpenBSD PF пакетного фильтра.Использование и конфигурирование IPFILTER.Использование и конфигурирование IPFW.

Запуск NAT


Чтобы указать необходимость NAT, следует добавить определенные утверждения в /etc/rc.conf.

Для запуска роутинга трафика между интерфейсами:

gateway_enable="YES"

Для автоматического запуска IPNAT:

ipnat_enable="YES"

Для указания файла, в котором определены правила:

ipnat_rules="/etc/ipnat.rules"