Сравнение 3 Пакетных фильтров FreeBSD (IPFW, PF, IPFILTER)

Автор: Станислав Китанин
Введение


В этом реферате я хочу рассмотреть 3 пакетных фильтра самых популярных в мире UNIX систем IPFW,IP-FILTER,PF(openbsd) на операционной системе FreeBSD 5.3.Сразу хочу оговорить полное описание и сравнение этих пакетных фильтров выходит далеко за рамки этого реферата по этой причине я не буду детально рассматривать каждый из них, а лишь их особенности, плюсы и минусы.

В сегодняшнем мире для защиты компьютерных сетей одним из главных средств защиты является пакетный фильтр или как его еще называют FIREWALL огненная стена.

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

В отличие от разнообразных систем firewall для операционных систем семейства Windows, во FreeBSD firewall является частью самой операционной системы, поэтому работает значительно быстрее и надежнее своих не-UNIX конкурентов (исключая, конечно, системы, созданные специально для обработки сетевого трафика, такие как Cisco IOS). Но т.к. firewall нужен далеко не на каждом компьютере с FreeBSD (ведь FreeBSD - это еще и высокопроизводительный файл-сервер, быстрый и надежный сервер приложений, мощная рабочая станция), то поддержка firewall не включена в ядро FreeBSD по умолчанию.

Если затронуть 7 уровневую модель OSI то современные FIREWALL умеют работать уже с уровня прикладного(для IPTABLES есть дополнения которые могут анализировать заголовки пакетов прикладного уровня например HTTP) до Канального(фильтрация по MAC адресам)

По этой причине точно сказать сложно на каком уровне OSI работают FIREWALL наверно изначально ориентированы на Транспортный, и Сетевой, но чьё-то бурное воображение захотело от FIREWALL большего, и расширили этот диапазон от Прикладного до Канального. Так чего же требуется от современного FIREWALL можно продолжить и дальше философствовать но перейдем к задачам которые требуется от современных FIREWALL или чем должен обладать современный FIREWALL.

Далее по тексту мы будем рассматривать работу FIREWALL только на уровнях Транспортном, Сетевом.

Конечно, как и видно, из названия пакетный фильтр, он должен фильтровать только что фильтровать и что делать???

Фильтровать пакеты на Сетевом уровне, допустим для IP была возможность фильтрации по IP-адресу (источника, получателя), IP-опциям установленным в пакете, по Флагу (Фрагментирован пакет или нет)
Фильтровать пакеты на Транспортном уровне, допустим для TCP была возможность фильтрации по портам (источника, получателя), По флагам установленным в TCP заголовке не маловажно, так как с помощью флагов можно создавать сложные правила
Фильтровать пакеты на Транспортном уровне, допустим для UDP была возможность фильтрации по портам (источника, получателя)
Фильтрация на определенном сетевом интерфейсе
Создание динамических правил
лимитирование подключений с определенных IP или для определенных портов
подсчёт пакетов или объема информации
возврат ответа на сработавшее правило
Ведение Лог файлов

Это основные задачи современного FIREWALL, но плюс к этому FIREWALL дополняют такие вещи как Ретрансляция адресов(NAT), Трафик шей пер, и удобный интерфейс работы с правилами.

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

Трафик шейпер
разграничение скорости как входной, так и выходной для определенного IP-адреса или группы адресов (подсети)
создание очереди для пакетов для последующего разграничения скорости
выставление приоритетов в очереди для соединений или пакетов.

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

Теперь рассмотрим более конкретно каждый и 3 пакетных фильтров IPFW,IP-FILTER,PF

При этом не затрагивай синтаксиса правил FIREWALL, так как синтаксис будет дальше в примерах для более наглядного рассмотрения сразу 3 Firewall

Для начало я хочу рассмотреть какой из файрволов IPFW,IP-FILTER,PF чем обладает


IPFW

Родной Firewall для FreeBSD появился самым первым в FreeBSD.

Каждый пакет можно фильтровать на основе следующей, связанной с ним

информации:
Интерфейс передачи и приема (по имени или адресу)
Направление (входящий или исходящий)
Исходный и целевой IP-адреса (возможно, замаскированные)
Протокол (TCP, UDP, ICMP и т.п.)
Исходный и целевой порт (можно указывать списки, диапазоны или маски)
Флаги TCP
Флаг IP-фрагмента
Опции IP
Типы ICMP
Идентификатор пользователя/группы для сокета, связанного с пакетом

Ретрансляция адресов(NAT)

Пере направляет пакеты, соответствующие правилу, на сокет divert(4), связанный с указанным портом. Дальнейший поиск прекращается.

Трафик шейпер

Утилита ipfw также обеспечивает пользовательский интерфейс для формирователя трафика dummynet(4). Формирователь работает путем деления пакетов на потоки в соответствии с заданной пользователем маской по различным полям заголовка IP. Пакеты, принадлежащие к одному потоку, затем передаются двум различным объектам - каналу или очереди.
Канал эмулирует связь с заданными пропускной способностью, задержкой при передаче, размером очереди и процентом потери пакетов. Пакеты проходят по каналу в соответствии с его параметрами.

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

Если ядро было скомпилировано с опцией IPFIREWALL_VERBOSE, то когда пакет соответствует правилу с ключевым словом log в журнал с помощью демона syslogd(8) записывается сообщение от источника LOG_SECURITY. Примечание: по умолчанию, сообщения добавляются в файл /var/log/security (см. syslog.conf(5)). Если ядро было скомпилировано с опцией IPFIREWALL_VERBOSE_LIMIT, то по умолчанию журналирование прекратится после того, как заданное в этой опции количество пакетов будет получено соответствующим правилом в цепочке, и параметр net.inet.ip.fw.verbose_limit будет установлен равным указанному количеству. Однако, если используется опция logamount количество, именно это количество будет ограничивать записываемые в журнал пакеты, а не net.inet.ip.fw.verbose_limit, причем, значение "0" снимает ограничение на количество записей в журнал. Затем журналирование можно включить повторно путем сброса ограничения или счетчика пакетов для соответствующей записи.

Журнализация на консоль и ограничение количества записей в журнал настраивается динамически с помощью интерфейса sysctl(8) в базе MIB net.inet.ip.fw.

Удобный интерфейс работы с правилами

sbin/ipfw [-q] add правило - добавляет правило в список. Если в теле правила не указан его номер, то он будет вычислен как номер последнего правила в списке + 100. Флаг -q отключает вывод на экран подтверждающего сообщения, что весьма полезно при задании большого количества правил из скрипта (например, при старте системы).
/sbin/ipfw delete номер правила - удалить правило с заданным номером. Если в списке существует несколько правил с данным номером - будут удалены все.
/sbin/ipfw [-q] zero [номер правила] - обнуляет счетчики статистики для выбранного правила, или для всех правил, если номер не указан.
/sbin/ipfw [-i] resetlog [номер правила] - обнуляет счетчик попавших в журнал записей о срабатывании правила (если включена опция IPFIREWALL_VERBOSE_LIMIT=XXX). Если журнал ведется для мониторинга попыток хакерских атак, то полезно периодически выполнять эту команду для продолжения ведения журнала.
/sbin/ipfw [-f | -q] flush - полная очистка списка правил. Опция -f избавляет от вопроса "Действительно ли Вы хотите все удалить", и опция -q, кроме того, подавляет и вывод на экран подтверждающего сообщения.
/sbin/ipfw { pipe | queue } номер config опции - конфигурирование канала или очереди dummynet. О конфигурировании dummynet - попозже.

главное правило ipfw -f flush при каждом запуске Firewall надо вычищать остатки правил перед загрузкой новых

При разработке правил надо учитывать следующие существенные моменты:
Помните, что фильтруются как входящие, так и исходящие пакеты. Для большинства подключений необходим двунаправленный обмен пакетами.
Помните о необходимости очень внимательно тестировать набор правил. При этом крайне желателен доступ к консоли. Если консоль недоступна, используйте сценарий автоматического восстановления типа /usr/share/examples/ipfw/change_rules.sh.
Не забывайте про интерфейс закольцовывания (loopback interface).

Установка В FreeBSD

Файл GENERIC - это та конфигурация ядра, которая была сделанная при инсталляции системы
Для того, чтобы включить в ядро поддержку ipfw и natd надо добавить в GENERIC вот
такие строки:

options IPFIREWALL
options IPFIREWALL_VERBOSE
options IPFIREWALL_VERBOSE_LIMIT=10
options IPDIVERT
options IPFIREWALL_DEFAULT_TO_ACCEPT
options DUMMYNET

Здесь IPFIREWALL означает включение программы файервола ipfw, IPFIREWALL_VERBOSE
означает ведение логов ipfw, IPFIREWALL_VERBOSE_LIMIT=10 ограничивает максимальное число записей, которые могут быть сделаны в секунду. Учитывайте то, что если вы поставите большое число для
IPFIREWALL_VERBOSE_LIMIT, то ваш винчестер может засорится от быстрорастущих логов.
IPDIVERT означает включение демона маскарадинга natd, IPFIREWALL_DEFAULT_TO_ACCEPT
означает, что ваш файервол по дефолту будет открытым. Если вы не указываете этой
опции, то при старте файервола любой доступ из сети к компьютеру будет закрыт.
Я советую включить опцию IPFIREWALL_DEFAULT_TO_ACCEPT


IP-FILTER

Ip-filter не является родным Firewall для FreeBSD появился с версии FreeBSD 4.3 Работает полностью на уровне ядра, что обеспечивает высокую скорость.

Возможна установка на операционные системы:
Solaris/Solaris-x86 2.3 - 9
SunOS 4.1.3 - 4.1.4
NetBSD 1.0 - 1.4
FreeBSD 2.0.0 - 2.2.8
BSD/OS-1.1 - 4
IRIX 6.2, 6.5
OpenBSD 2.0 - 3.5
Linux(*) 2.4 - 2.6
HP-UX 11.00 (IPFilter 4.0alpha*)
Tru64 5.1a (IPFilter 4.0alpha*)
QNX 6 Port
Каждый пакет можно фильтровать на основе следующей, связанной с ним информации:

Интерфейс передачи и приема (по имени или адресу)
Направление (входящий или исходящий)
Исходный и целевой IP-адреса (возможно, замаскированные)
Протокол (TCP, UDP, ICMP и т.п.)
Исходный и целевой порт (можно указывать списки, диапазоны или маски)
Флаги TCP
Флаг IP-фрагмента
Опции IP
Типы ICMP
Идентификатор пользователя/группы для сокета, связанного с пакетом

Ретрансляция адресов(NAT)

ipnat -CF -f /etc/fire/ipnat.rules файл ipnat.rules содержит информацию о ретрансляции и переброса IP-адресов

Трафик шейпер-отсутствует введение лог файлов

В ip-filter'e на мой взгляд очень удачно реализована идея ведение логов так как можно для каждого правила задать свой источник ведение логов в Syslog для этого необходимо запустить ipmon -sD демон ip-filter для ведения логов и в каждом правиле которое необходимо для ведения логов надо указать log level local3.info для разных правил это может быть разный источник SYSLOG.

Удобный интерфейс работы с правилами

ipf - читает список правил FIREWALL и заносит в ядро. Может использоваться для вычистки всех правил или удаление индивидуального правила на лету.
ipf -Fa -f /etc/fire/ipf.rules файл ipf.rules содержит правила FIREWALL перед загрузкой опциями -Fa вычищаем оставшиеся правила.
ipfstat - служит для статистики и вывода всех загруженных правил в ядро
ipftest - служит для тестирования набора правил в файле путем применения простого пакета к набору правил.
ipmon - демон для логирования информации читает буферизированые данные из устройства логирования /dev/ipl и может выводит на
экран
в файл
SYSLOG
ipsend - генерирует арбитный IP пакет для присоединенных машин
ipresend - читает данные файла сохраненного пакета и шлёт их обратно через сеть
iptest - содержит настройки для тестирования программ которые посылают серию IP пакетов нацеленных на испытания TCP/IP стека на который нацелен. Может разрушить тестируемую машину.
Установка В FreeBSD


Файл GENERIC - это та конфигурация ядра, которая была сделанная при инсталляции системы. Для того, чтобы включить в ядро поддержку ipf надо добавить в GENERIC вот
такие строки:
options IPFILTER включает сам файрволл в ядро системы
options IPFILTER_LOG для ведения логов в ip-filter
options IPFILTER_DEFAULT_BLOCK для начинающих не рекомендуется, блокирует все пакеты по умолчанию
options RANDOM_IP_ID используется только в FREEBSD 4 версии для случайного генератора ID в IP заголовке.

PF-FILTER(packet filter for openbsd)

Firewall разработанный вначале специально для OpenBSD появился в FreeBSD только начиная с версии FreeBSD 5.3 как подгружаемый модуль ядра. Разработанный относительно недавно и признанный в 2003 году лучшим Firewall года имеет ряд новшеств которые не имеют другие более поздние в разработке файрволы. В принципе он не идёт в сравнение не с какими другими пакетными фильтрами. В документациях указано, что правила фильтрации для IP-FILTRA 100% совместимы с правилами PF-FILTRA, но это, к сожалению не так да синтаксис обоих пакетных фильтров на первый взгляд идентичен, но есть небольшие расхождения, в результате которых это не так. По этой причине я его рассмотрю более детально

Каждый пакет можно фильтровать на основе следующей, связанной с ним информации:
Интерфейс передачи и приема (по имени или адресу)
Направление (входящий или исходящий)
Исходный и целевой IP-адреса (возможно, замаскированные)
Протокол (TCP, UDP, ICMP и т.п.)
Исходный и целевой порт (можно указывать списки, диапазоны или маски)
Флаги TCP
Флаг IP-фрагмента
Опции IP
Типы ICMP
Идентификатор пользователя/группы для сокета, связанного с пакетом новшества:

Списки:

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

Когда pfctl(8) доходит до списка при загрузке наборов правил, он раскладывает их на отдельные правила, для каждого элемента списка. Для примера:

block out on fxp0 from { 192.168.0.1, 10.5.32.6 } to any

Будет преобразован в:

block out on fxp0 from 192.168.0.1 to any
block out on fxp0 from 10.5.32.6 to any

Таблицы

Таблицы используются для хранения группы адресов IPv6 и/или IPv4.
Поиски в таблице занимают гораздо меньше времени и потребляют меньше ресурсов, чем списки. По этой причине, таблица идеальна чтобы хранить большую группу адресов, поскольку время поиска в таблице, содержащей 50 000 адресов - не намного больше чем для 50 адресов. Таблицы могут использоваться следующими способами:

* источник и/или адрес назначения для filter, scrub, NAT, и

redirection rules

* адрес трансляции для правил NAT
* адрес переназначения для правил редиректа
* адрес назначения для правил фильтрации route-to, reply-to, и

dup-to
table <goodguys> { 192.0.2.0/24 }
pass in on fxp0 from <goodguys> to any

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

адресов IP и сетей:
table persist file "/etc/spammers"

Файл/etc/spammers содержал бы список IP адресов или сетей CIDR. Любая строка начинающаяся с #, будет обработана как комментарий и проигнорирована.

Ретрансляция адресов(NAT)

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

Когда клиент из внутренней сети посылает запрос в Internet, создаются IP пакеты, которые шлются к месту назначения. Эти пакеты содержат всю информацию об обратном адресе, необходимую для получения ответа. NAT заинтересован этими частями информации:

Исходный адрес IP (например, 192.168.1.35)
Исходный TCP или UDP порт (например, 2132)

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

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

Например, могут произойти следующие изменения:
Исходный IP: будет заменен внешним адресом шлюза (например, 24.5.0.5)
Исходный порт: будет заменен беспорядочно выбранным, неиспользованным портом на шлюзе (например, 53136)
Ни внутренняя машина, ни главный компьютер Internet не знают об этих шагах трансляции. Для внутренней машины NAT система - просто шлюз Internet. Для ресурса, расположенного в Internet пакеты прибывают непосредственно от NAT системы; он не догадывается о существовании клиентской машины. Когда ресурс отвечает на запрос внутренней машины он будет обращаться к внешнему IP адресу NAT шлюза (24.5.0.5) и порту (53136). NAT шлюз будет искать соответствующую запись в таблице ,
чтобы определить, соответствуют ли пакеты ответа уже установленному подключению. Уникальное соответствие будет найдено на основании комбинации IP/порта, которая говорит PF, что пакеты принадлежат подключению, инициализированному внутренней машиной 192.168.1.35. PF будет тогда делать обратные изменения для приходящих пакетов и отправлять пакеты внутренней машине.

pfctl -N -f /root/pf-filter/pfnat.rules в файле pfnat.rules хранятся правила ретрансляции адресов и переброска(перенаправление)

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

введение лог файлов

/sbin/pflogd -f /var/log/pflog для запуска системы введения лог файлов в формате TCPDUMP
tcpdump -r /var/log/pflog для просмотра залогированых записей

- log

Определяет, что пакет должен быть зарегистрирован через pflogd(8). Если правило определено как keep state, modulate state, или synproxystate, то будет зарегистрирован только первый пакет, создавший правило. Чтобы регистрировать все пакеты, используйте log-all.

Удобный интерфейс работы с правилами

После начальной загрузки управление pf может осуществляться через программу pfctl(8). Вот несколько примеров:

pfctl -F all очистить все правила
pfctl -f /etc/pf.conf загрузить pf.conf
pfctl -nf /etc/pf.conf анализировать файл, но не загружать
pfctl -Nf /etc/pf.conf загрузить только правила NAT из файла
pfctl -Rf /etc/pf.conf загрузить только правила фильтрации
pfctl -sn показать текущие правила NAT
pfctl -sr показать текущие правила фильтрации
pfctl -ss показать текущее состояние таблиц
pfctl -si показать статистику правил и состояние счетчиков
pfctl -sa показать все


Установка В FreeBSD

Файл GENERIC - это та конфигурация ядра, которая была сделанная при инсталляции системы. Для того чтобы включить в ядро поддержку ipf надо добавить в GENERIC вот
такие строки:
device pf
device pflog
device pfsync

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

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

Для наглядности будет указываться 1 правило для 3 фильтров имеющий один и тот же смысл. Правила в Firewall создаются по последовательным номерам, то есть 5 правил в файле и при загрузки правил они будут пронумерованы в той последовательности, в которой они идут, через эти номера, и производится управление правилами (удаление, перемещение), в IPFW по умолчанию правила нумеруются с приращением 100, в IP-FILTER и в PF-FILTER с приращением.

1.Правило разрешающее любые соединения любых протоколов на сетевом интерфейсе rl0

IP-filter start command(ipf -Fa -f <имя файла содержащие нижние строчки>)

pass in on rl0 from any to any

PF-filter start command(pfctl -R -f <имя файла содержащие нижние строчки>)

pass in on rl0 from any to any

IPFW

/sbin/ipfw add pass all from any to any via rl0


2.Правило запрещающее любые соединения для любых протоколов на сетевом интерфейсе rl0

IP-filter start command(ipf -Fa -f <имя файла содержащие нижние строчки>)

block in on rl0 from any to any

PF-filter start command(pfctl -R -f <имя файла содержащие нижние строчки>)

block in on rl0 from any to any

IPFW

/sbin/ipfw add deny all from any to any via rl0

блокирует любые соединения без ответа


3.Усложним задачу правило разрешающее любые соединения по протоколу TCP, но запрещающее любые соединения для протокола UDP на сетевом интерфейсе rl0

IP-filter start command(ipf -Fa -f <имя файла содержащие нижние строчки>)

pass in on rl0 proto tcp from any to any
block in on rl0 proto udp from any to any
PF-filter start command(pfctl -R -f <имя файла содержащие нижние строчки>)
pass in on rl0 proto tcp from any to any
block in on rl0 proto udp from any to any

IPFW

/sbin/ipfw add pass tcp from any to any via rl0
/sbin/ipfw add deny udp from any to any via rl0

Наверни-ка вы так напишите да для IPFW задача будет выполнена, но для IP-FILTRA,

PF-FILTRA это будет не корректно в данном примере это не проглядывается но допустим такой пример

pass in on rl0 proto tcp from any to any
block in on rl0 proto tcp from any to any

вы сразу скажете, что tcp соединение будет разрешено, так как первое правило, на которое наткнется пакет, будет разрешение, но вот тут сразу вылазит ошибка, так как пакет в этом случае проследует до конца всех правил и только в самом конце к нему будет применено последнее попавшее под действие пакета правило block. Для того чтобы к пакету было применено первое сработавшее правило надо ставить слово quick

pass in quick on rl0 proto tcp from any to any
block in quick on rl0 proto tcp from any to any


4.Надо заблокировать TCP пакеты на порт 136-139 а всё остальное разрешить

IP-filter start command(ipf -Fa -f <имя файла содержащие нижние строчки>)

block in quick on rl0 proto tcp from any to any port 136><139
pass in quick on rl0 from any to any

PF-filter start command(pfctl -R -f <имя файла содержащие нижние строчки>)

block in quick on rl0 proto tcp from any to any port 136><139
pass in quick on rl0 from any to any

IPFW

/sbin/ipfw add deny tcp from any to any 136-139 via rl0
/sbin/ipfw add pass all from any to any via rl0
В этом случае все пришедшие tcp пакеты на порт с 136 по 139 будут заблокированы А все другие пакеты пропущены


5.Надо заблокировать TCP пакеты на порт 136-139 с адреса 195.195.195.195, а всё остальное разрешить

IP-filter start command(ipf -Fa -f <имя файла содержащие нижние строчки>)

block in quick on rl0 proto tcp from 195.195.195.195 to any port 136><139
pass in quick on rl0 from any to any

PF-filter start command(pfctl -R -f <имя файла содержащие нижние строчки>)

block in quick on rl0 proto tcp from 195.195.195.195 to any port 136><139

pass in quick on rl0 from any to any

IPFW

/sbin/ipfw add deny tcp from 195.195.195.195 to any 136-139 in via rl0

/sbin/ipfw add pass all from any to any via rl0


6.А теперь надо сделать так чтобы заблокировать TCP пакеты на порт 136-139 с адреса 195.195.195.195, но чтобы при попытке этого IP установить соединение ему отсылался ответ в виде tcp пакета с RST установленным флагом, а всё остальное разрешить

IP-filter start command(ipf -Fa -f <имя файла содержащие нижние строчки>)

block return-rst in quick on rl0 proto tcp from 195.195.195.195 to any port 136><139

pass in quick on rl0 from any to any

PF-filter start command(pfctl -R -f <имя файла содержащие нижние строчки>)

block return-rst in quick on rl0 proto tcp from 195.195.195.195 to any port 136><139

pass in quick on rl0 from any to any

IPFW

/sbin/ipfw add reset tcp from 195.195.195.195 to any 136-139 in via rl0

/sbin/ipfw add pass all from any to any via rl0

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

Можно также возвращать icmp ответы для udp пакетов

IP-filter start command(ipf -Fa -f <имя файла содержащие нижние строчки>)

block return-icmp(host-unr) in quick on rl0 proto udp from any to any

PF-filter start command(pfctl -R -f <имя файла содержащие нижние строчки>)

block return-icmp(host-unr) in quick on rl0 proto udp from any to any

IPFW

/sbin/ipfw add reject udp from any to any in via rl0

В этом случае при попытке соединится по udp протоколу немедленно будет получен icmp пакет с кодом 1 Host Unreachable и ему не придется выдерживать таймаут..

Не всегда надо использовать RST и ICMP ответы на закрытие соединения, так как это сильно ускоряет сканирование портов, сканирующему не придётся выдерживать таймаут.

7.Работа с TCP флагами для начало надо разобраться с установкой соединения и со значением каждого флага.

Установка любого TCP-соединения происходит в три этапа. Клиент передает серверу пакет с установленным битом SYN (synchronize) и полем ISS (initial sequence number) содержащим начальный номер счётчика (обозначим как Cnt1), этот пакет - запрос на соединение. В ответ сервер высылает подтверждение - пакет с установленными битами SYN, ACK (acknowledgement), собственным значением поля ISS (обозначим как Cnt2) и полем ACK содержащим значение Cnt1, увеличенное на единицу. Получив его, клиент высылает ещё один пакет, с установленным битом ACK, полем счётчика ISS, равным Cnt1+1, и полем ACK, равным Cnt2+1. После этого соединение считается установленным. При обмене данными пакеты клиента в своих заголовках содержат поля с установленными битами ACK, постоянно увеличивающимся значением счётчика ISS (начиная с Cnt1) и поля ACK (начиная с Cnt2).

F - FIN используется для завершения соединения или при обрыве связи чтоб восстановить соединение

S - SYN флаг синхронизации используется при установке соединения

R - RST флаг разрыв соединения

P - PUSH выталкивает содержимое буфера

A - ACK

U - URG указатель важности

И так что мы можем с помощью флагов сделать это будет рассмотрено в полной мере ниже.

Но использование рассмотрим сейчас.

IP-filter start command(ipf -Fa -f <имя файла содержащие нижние строчки>)

block in quick on rl0 proto tcp from any to any flags S

PF-filter start command(pfctl -R -f <имя файла содержащие нижние строчки>)

block in quick on rl0 proto tcp from any to any flags S/SAFURP

IPFW

Ipfw add deny tcp from any to any in tcpflags syn

В данном примере показано как можно работать с TCP флагами любое соединение будет невозможно, так как первый пакет с флагом SYN на установку будет отброшен. Также тут можно видеть разницу между IP-FILTR и PF-FILTR в том, что IP-FILTER при указание

flags S автоматически подставляет flag S/SAFRPU а PF-FILTR надо обязательно указывать всё.

8.Ретрансляция IP адресов(NAT)

На данной схеме показано что роутер имеет два интерфейса rl0 и rl1. rl0 смотрит в интернет с ip - 195.195.195.100. rl1 смотрит в локальную внутреннюю сеть(192.168.0.0/24) с ip-адресом 192.168.0.1

Ретрансляция адресов это когда вся внутренняя сеть 192.168.0.0/24 выходит в интернет по средством одного IP. Для чего это нужно, а очень просто для локальной сети доступен весь интернет, а для интернета доступен только один ip-адрес 195.195.195.100 трудно не заметить плюсы безопасности данной модели.

Реализация

IPFW
/sbin/natd -p 8668 -u -n rl0
/sbin/ipfw add divert 8668 all from any to 195.195.195.100 recv rl0
/sbin/ipfw add divert 8668 all from 192.168.0.0/24 to any out via rl0
-p указывает на порт диверт сокета
-d не передавать входные пакеты, которые не имеют записей в таблице NAT
-n на каком сетевом интерфейсе работает нат

IP-FILTER

Command(ipnat -CF -f <имя файла содержащая нижнюю строчку>)

map rl0 192.168.0.0/24 -> 195.195.195.100/32

PF-FILTER

Command(pfctl -N -f <имя файла содержащая нижнюю строчку>)

nat on rl0 from 192.168.0.0/24 to any -> 195.195.195.100/32


Как же работает NAT а очень просто когда кто-нибудь из внутренней сетки 192.168.0.0.24

Отправляет пакет в интернет то NAT фиксирует в таблице состояний адрес назначения, порт назначения, адрес источника, порт источника и в самом пакете подменяет ip-адрес источника(192.168.0.10) на свой адрес 195.195.195.100 при получении ответа он делает обратную операцию на основе информации хранящийся в NAT таблице

9.Динамические правила Keep-state

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

IP-filter start command(ipf -Fa -f <имя файла содержащие нижние строчки>)

Block in quick on rl0 proto all from any to any

pass in quick on rl0 proto tcp from 195.195.195.195 to any port = 22 keep state

PF-filter start command(pfctl -R -f <имя файла содержащие нижние строчки>)

Block in quick on rl0 proto all from any to any

pass in quick on rl0 proto tcp from 195.195.195.195 to any port = 22 keep state

IPFW

Ipfw add check-state

Ipfw add deny tcp from any to any via rl0

Ipfw add pass tcp from 195.195.195.195 to any 22 keep state

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

Поведением динамических правил можно управлять через sysctl переменные. Можно реализовывать сложные конструкции правил, можно защищаться от некоторых видов DOS атак и улучшать доступ к некоторым из портов. Отличие IPFW от IP-FILTRA и PF-FILTRA в том что у IPFW можно выставить место в правилах FIREWALL в каком месте будет вход в динамические правила, то есть можно выставить метку CHECK-STATE не в начале как это принято делать а где-нибудь по середине, тогда с начало прогоняются те правила, которые идут до метки а только потом динамически созданные правила.Вообще говоря NAT и Keep-state почти одно и тоже.Nat как и keep-state создает запись в таблице состояний соединений только при этом еще подменяет IP адрес.

Для более хитрого использования KEEP-STATE рассмотрим такой пример

IP-FILTER

Запускаем ретрансляцию адресов

Command(ipnat -CF -f <имя файла содержащая нижнюю строчку>)

map rl0 192.168.0.0/24 -> 195.195.195.100/32

block in quick on xl0 all

pass out quick on xl0 from 195.195.195.1 to any keep state

pass out quick on xl0 from 192.168.0.1/24 to any keep state

PF-filter

Запускаем ретрансляцию адресов

Command(pfctl -N -f <имя файла содержащая нижнюю строчку>)

nat on rl0 from 192.168.0.0/24 to any -> 195.195.195.100/32

block in quick on xl0 all

pass out quick on xl0 from 195.195.195.1 to any keep state

pass out quick on xl0 from 192.168.0.1/24 to any keep state

И что же это нам даст а то, что роутер будет не достижим для пакетов из интернета а сам роутер и его внутренняя ретрансляционная(NAT) сетка, которая имеет IP 192.168.0.0.24 сможет без всяких проблем выходить в интернет, В этом случае от интернета мы полностью огорожены абсолютная защита, нет как сказал КАМИКАДЗЕ абсолютной защиты не бывает. К сожалению, для IPFW этого сделать не удалось по ряду причин.

Но к сожалению я не очень люблю динамические правила по этой причине я дальше рассматривать их не буду.

Разработка структуры правил FIREWALL

Так как мы познакомились немного с синтаксисом давайте разберёмся с порядком написания правил для FIREWALL

IPFW

Тут есть одно и очень простое правило: располагать правила для

IPFW в следующем порядке:
сначала идут инструкции deny и reject (если есть)
потом divert
потом allow на внутреннюю сетку(и)
потом allow все остальное
потом deny все, что осталось.

IP-FILTER
сначала идут инструкции Block
потом pass на внутреннюю сетку
потом pass на все остальное
потом Block на всё что осталось

PF-FILTER
сначала идут инструкции Block
потом pass на внутреннюю сетку
потом pass на все остальное
потом Block на всё что осталось

Не сложно заметить, что в указанных порядках PF-FILTER,PF-FILTER отсутствует запись о ретрансляции адресов (NAT), это связано с тем, что у этих FIREWALL ретрансляционий блок(NAT) вынесен в отдельное приложение для FIREWALL а у IPFW это загружается в месте с правилами FIREWALL. У PF и IP блок NAT не играет роли в следовании правил файрволла и применяется к пакетам в после правил файрвола в самом конце.

У IPFW наоборот пакеты попадают к NAT в том порядке как вы указали в правилах FIREWALL но после.

Теперь давайте разберём действительно сложную конфигурацию правил FIREWALL для IPFW и IP-FILTRA набор правил будет идентичен разница только в написании синтаксиса правил. В конце мы разберем, чего же тут было написано. Для PF-Filtr рассмотрим отдельно, так как у него присутствует другие более продвинутые возможности для решения задач.


Сервер, выполняющий функцию ретранслятора адресов и фильтрацию пакетов
195.195.195.1(xl0)-IP адрес внешней сетевушки сервера
192.168.0.1(xl1) - IP Адрес внутренней сетевушки сервера
80.80.80.53-IP Адрес вторичного доменного сервера и к нему направляются запросы по преобразованию domain name -> ip

На сервере работают такие сервисы
apache 2.x порт tcp 80,443
самба порты tcp 136-139 udp 136-139
Proftpd tcp порты 21, и 20
BIND 9.x порты tcp/udp 53 (tcp 53 только для обновления зоны на вторичном сервере)
SENDMAIL 8.13. порты tcp 25
STUNNEL порты tcp 465,995
TEAPOP порты tcp 110
Mysqld порты tcp 3306
SSHD2 порты tcp 22

IPFW
#!/bin/sh
#ochistitj vse ostaljnije pravila firewall'a
ipfw -f flush
/sbin/ipfw check-state
##################### DENY UNUSEFULL TRAFIC ##########################################
#1.1 Fragmented packet
/sbin/ipfw add deny log all from any to 195.195.195.1 in via xl0 frag
#1.2 Strict Source Route zhostkaja privjazka shljuzov cherez kotorije paket dolzhen projti shljuzi v ip-header'e(max9)
/sbin/ipfw add deny log all from any to 195.195.195.1 in via xl0 ipoptions ssrr
#1.3 Loose Source Route ne zhostkaja privjazka shljuzov cherez kotorije paket dolzhen projti shljuzi v ip-header'e(max9)
/sbin/ipfw add deny log all from any to 195.195.195.1 in via xl0 ipoptions lsrr
#1.4 Record Packet Route dlja tracerroute fiksiruet v ip-header'e adressa proidenih shljuzov
/sbin/ipfw add deny log all from any to 195.195.195.1 in via xl0 ipoptions rr
#1.5 Timestamp
/sbin/ipfw add deny log all from any to 195.195.195.1 in via xl0 ipoptions ts
#2 FOR SCANNERS OF OS DETECTING
/sbin/ipfw add deny log tcp from any to 195.195.195.1 in via xl0 tcpflags syn,fin,!ack,
/sbin/ipfw add deny log tcp from any to 195.195.195.1 in via xl0 tcpflags syn,fin,urg,psh,!ack
/sbin/ipfw add deny log tcp from any to 195.195.195.1 in via xl0 tcpflags fin,urg,psh,!ack
/sbin/ipfw add deny log tcp from any to 195.195.195.1 in via xl0 tcpflags fin,!ack
/sbin/ipfw add deny log tcp from any to 195.195.195.1 in via xl0 tcpflags urg,!ack
/sbin/ipfw add deny log tcp from any to 195.195.195.1 in via xl0 tcpflags psh,!ack
# FOR SYN FLOOD THAT HAVE NOT MSS
#с помощью этой строчки мы можем предотвратить часть атак DOS так как флаг syn в TCP заголовке
# посылается для установки соединения то некоторые пакетные генераторы при генерации пакета
#TCP с установленым флагом SYN не расчитывают Maximum segment size то таким образом мы
#блокируем ложные соединения
/sbin/ipfw add deny log tcp from any to any tcpoptions !mss tcpflags syn,!ack
#3 NON ROUTING IP ADRESS
/sbin/ipfw add deny log all from 127.0.0.0/8 to 195.195.195.1 in via xl0
/sbin/ipfw add deny log all from 192.168.0.0/16 to 195.195.195.1 in via xl0
/sbin/ipfw add deny log all from 172.16.0.0/12 to 195.195.195.1 in via xl0
/sbin/ipfw add deny log all from 10.0.0.0/8 to 195.195.195.1 in via xl0
/sbin/ipfw add deny log all from 0.0.0.0/8 to 195.195.195.1 in via xl0
/sbin/ipfw add deny log all from 169.254.0.0/16 to 195.195.195.1 in via xl0
/sbin/ipfw add deny log all from 192.0.2.0/24 to 195.195.195.1 in via xl0
/sbin/ipfw add deny log all from 204.152.64.0/23 to 195.195.195.1 in via xl0
/sbin/ipfw add deny log all from 224.0.0.0/3 to 195.195.195.1 in via xl0
/sbin/ipfw add deny log all from 20.20.20.0/24 to 195.195.195.1 in via xl0
#4 zapreshjajem vihod lokaljogo trafika za predeli servera
/sbin/ipfw add deny log all from 192.168.0.0/24 to 192.168.0.0/24 via xl0
/sbin/ipfw add allow all from 192.168.0.0/24 to 192.168.0.0/24 via xl1
#5 zapreshajem rabotu po portam
#5.1
/sbin/ipfw add deny log udp from any to 195.195.195.1 514 in via xl0
#5.2
/sbin/ipfw add deny log udp from any to 195.195.195.1 137-139 in via xl0
#5.3
/sbin/ipfw add deny log tcp from any to 195.195.195.1 137-139 in via xl0
#5.4
/sbin/ipfw add deny log tcp from any to 195.195.195.1 901 in via xl0
#5.5
/sbin/ipfw add deny log tcp from any to 195.195.195.1 587 in via xl0
#5.6
/sbin/ipfw add deny log tcp from any to 195.195.195.1 953 in via xl0
#5.7
/sbin/ipfw add deny log tcp from any to 195.195.195.1 3306 in via xl0
#5.8
/sbin/ipfw add deny log tcp from any to 195.195.195.1 3000 in via xl0
#5.9
/sbin/ipfw add deny log tcp from any to 195.195.195.1 3001 in via xl0
#5.10
/sbin/ipfw add deny log tcp from any to 195.195.195.1 110 in via xl0
######################################################################################
######### RAZRESHENIJE ######
######################################################################################
#6
/sbin/ipfw add allow icmp from any to 195.195.195.1 icmptypes 8 via xl0
/sbin/ipfw add allow icmp from any to 195.195.195.1 icmptypes 0 via xl0
/sbin/ipfw add deny log icmp from any to any via xl0
#7
/sbin/ipfw add pass all from any to any via lo0
#8
#propuskatj 2 ip na 22 port na vhod a vse ostoljnoje zakrivatj
#na vihod otkrit tak kak inache ne smog bi s servera conectitesja k 22 portu drugih tachek
/sbin/ipfw add pass tcp from 195.216.172.0/24 to 195.195.195.1 22 in via xl0
/sbin/ipfw add pass tcp from 195.195.195.1 22 to 195.216.172.0/24 out via xl0
/sbin/ipfw add deny log tcp from any to any 22 in via xl0
## DNS SERVER ALLOW 80.80.80.53 - SECONDARY DNS SERVER UPDATE
#9
/sbin/ipfw add pass tcp from 80.80.80.53 to 195.195.195.1 53 in via xl0
/sbin/ipfw add pass tcp from 195.195.195.1 53 to 80.80.80.53 out via xl0
/sbin/ipfw add deny log tcp from any to 195.195.195.1 53 in via xl0
## DNS QUERY
#10
/sbin/ipfw add pass udp from any to 195.195.195.1 53 in via xl0
/sbin/ipfw add pass udp from 195.195.195.1 53 to any out via xl0
## WEB SERVER AND SOME LITLE DDOS DEFENCE
#11
/sbin/ipfw add pass tcp from any to 195.195.195.1 80 in via xl0 tcpflags syn,!psh,!ack,!fin,!urg,!rst
/sbin/ipfw add pass tcp from any to 195.195.195.1 443 in via xl0 tcpflags syn,!psh,!ack,!fin,!urg,!rst
/sbin/ipfw add pass tcp from any to 195.195.195.1 80 in via xl0 tcpflags ack,!syn,!psh,!fin,!urg,!rst
/sbin/ipfw add pass tcp from any to 195.195.195.1 443 in via xl0 tcpflags ack,!syn,!psh,!fin,!urg,!rst
/sbin/ipfw add pass tcp from any to 195.195.195.1 80 in via xl0 tcpflags ack,psh,!syn,!fin,!urg,!rst
/sbin/ipfw add pass tcp from any to 195.195.195.1 443 in via xl0 tcpflags ack,psh,!syn,!fin,!urg,!rst
/sbin/ipfw add pass tcp from any to 195.195.195.1 80 in via xl0 tcpflags ack,fin,!syn,!psh,!urg,!rst
/sbin/ipfw add pass tcp from any to 195.195.195.1 443 in via xl0 tcpflags ack,fin,!syn,!psh,!urg,!rst
/sbin/ipfw add pass tcp from any to 195.195.195.1 80 in via xl0 tcpflags ack,syn,!psh,!fin,!urg,!rst
/sbin/ipfw add pass tcp from any to 195.195.195.1 443 in via xl0 tcpflags ack,syn,!psh,!fin,!urg,!rst
/sbin/ipfw add pass tcp from any to 195.195.195.1 80 in via xl0 tcpflags rst,!ack,!syn,!psh,!fin,!urg
/sbin/ipfw add pass tcp from any to 195.195.195.1 443 in via xl0 tcpflags rst,!ack,!syn,!psh,!fin,!urg
## FTP SERVER AND SOME LITLE DDOS DEFENCE
# 12
/sbin/ipfw add pass tcp from any to 195.195.195.1 20 in via xl0 tcpflags ack,!syn,!psh,!fin,!urg,!rst
/sbin/ipfw add pass tcp from any to 195.195.195.1 20 in via xl0 tcpflags ack,syn,!psh,!fin,!urg,!rst
/sbin/ipfw add pass tcp from any to 195.195.195.1 20 in via xl0 tcpflags ack,fin,!syn,!psh,!urg,!rst
/sbin/ipfw add pass tcp from any to 195.195.195.1 20 in via xl0 tcpflags rst,!ack,!syn,!psh,!fin,!urg
/sbin/ipfw add pass tcp from any to 195.195.195.1 21 in via xl0 tcpflags ack,!syn,!psh,!fin,!urg,!rst
/sbin/ipfw add pass tcp from any to 195.195.195.1 21 in via xl0 tcpflags syn,!psh,!ack,!fin,!urg,!rst
/sbin/ipfw add pass tcp from any to 195.195.195.1 21 in via xl0 tcpflags ack,fin,!syn,!psh,!urg,!rst
/sbin/ipfw add pass tcp from any to 195.195.195.1 21 in via xl0 tcpflags ack,psh,!syn,!fin,!urg,!rst
/sbin/ipfw add pass tcp from any to 195.195.195.1 21 in via xl0 tcpflags rst,!ack,!syn,!psh,!fin,!urg
## MAIL SERVER AND SOME LITLE DDOS DEFENCE
# SMTP SERVER 25 PORT
#13
#13.1
/sbin/ipfw add pass tcp from any to 195.195.195.1 25 in via xl0 tcpflags syn,!ack,!psh,!fin,!urg,!rst
/sbin/ipfw add pass tcp from any to 195.195.195.1 25 in via xl0 tcpflags ack,!syn,!psh,!fin,!urg,!rst
/sbin/ipfw add pass tcp from any to 195.195.195.1 25 in via xl0 tcpflags ack,psh,!syn,!fin,!urg,!rst
/sbin/ipfw add pass tcp from any to 195.195.195.1 25 in via xl0 tcpflags ack,fin,!syn,!psh,!urg,!rst
# SMTP OVER SSL
#13.2
/sbin/ipfw add pass tcp from any to 195.195.195.1 465 in via xl0 tcpflags syn,!ack,!psh,!fin,!urg,!rst
/sbin/ipfw add pass tcp from any to 195.195.195.1 465 in via xl0 tcpflags ack,!syn,!psh,!fin,!urg,!rst
/sbin/ipfw add pass tcp from any to 195.195.195.1 465 in via xl0 tcpflags ack,psh,!syn,!fin,!urg,!rst
/sbin/ipfw add pass tcp from any to 195.195.195.1 465 in via xl0 tcpflags ack,fin,!syn,!psh,!urg,!rst
# POP3 OVER SSL
#13.3
/sbin/ipfw add pass tcp from any to 195.195.195.1 995 in via xl0 tcpflags syn,!ack,!psh,!fin,!urg,!rst
/sbin/ipfw add pass tcp from any to 195.195.195.1 995 in via xl0 tcpflags ack,!syn,!psh,!fin,!urg,!rst
/sbin/ipfw add pass tcp from any to 195.195.195.1 995 in via xl0 tcpflags ack,psh,!syn,!fin,!urg,!rst
/sbin/ipfw add pass tcp from any to 195.195.195.1 995 in via xl0 tcpflags ack,fin,!syn,!psh,!urg,!rst
#sbin/ipfw add deny all from any to any via xl0
#sam nat s zavarotom na nat
#-p 8668 port divert soketa, -d neperedovatj vhodjashije paketi
#kotorije ne imejut zapisej sootvetsvija v NAT tablice no tagda ne pashet SSH no zakrivaet serve dlja vnutrenego dostupa
#-u imenjatj ip toljko s chastnimi adressami istochnika
#-n xl0 na kakom interface vesit NAT
#nevazhno gde idet eta strochka tak kak ona zapuskaetsja vmeste so skriptom tobish pervaja
/sbin/natd -p 8668 -u -n xl0
#/sbin/natd
/sbin/ipfw add divert 8668 all from any to 195.195.195.1 recv xl0
/sbin/ipfw add divert 8668 all from 192.168.0.0/24 to any out via xl0
#razreshenije na vihod nata cherez xl1
#14
/sbin/ipfw add pass all from any to any via xl1 keep-state
#15
/sbin/ipfw add pass all from any to any out via xl0
#iz UDP trafika razreshaem prihoditj toljko DNS'u
#16
/sbin/ipfw add pass udp from 80.80.80.53 53 to 195.195.195.1 in via xl0
/sbin/ipfw add pass tcp from any to 195.195.195.1 in via xl0 established
#vhodjashije pervij paket na soedinenije imeet toljko bit syn poetomu mi ego nahren otrubaem shtobi vhodjashije ne konektilisj k portam
#17
/sbin/ipfw add deny log tcp from any to 195.195.195.1 in via xl0 setup
#18
/sbin/ipfw add deny log udp from any to 195.195.195.1 in via xl0


IP-FILTR
###############################################################################
############# XL0- internet interface 195.195.195.1 ###############
############# DENY TRAFIC ###############
###############################################################################
######### DENY UNUSEFULL TRAFIC
#1.1
block in log level local3.info quick on xl0 from any to 195.195.195.1 with frags
#1.2
block in log level local3.info quick on xl0 from any to 195.195.195.1 with opt ssrr
#1.3
block in log level local3.info quick on xl0 from any to 195.195.195.1 with opt lsrr
#1.4
block in log level local3.info quick on xl0 from any to 195.195.195.1 with opt rr
#1.5
block in log level local3.info quick on xl0 from any to 195.195.195.1 with opt ts
# PORT SCANNERS OF OS DETECTING
#2
block in log level local3.info quick proto tcp from any to 195.195.195.1 flags SF/SF
block in log level local3.info quick proto tcp from any to 195.195.195.1 flags SFUP/SFUP
block in log level local3.info quick proto tcp from any to 195.195.195.1 flags FPU/FPU
block in log level local3.info quick proto tcp from any to 195.195.195.1 flags F/F
block in log level local3.info quick proto tcp from any to 195.195.195.1 flags U/U
block in log level local3.info quick proto tcp from any to 195.195.195.1 flags P/P
# don't allow anyone to spoof non-routeble adresses
# 3 IN
block in log level local3.info quick on xl0 from 127.0.0.0/8 to 195.195.195.1
block in log level local3.info quick on xl0 from 192.168.0.0/16 to 195.195.195.1
block in log level local3.info quick on xl0 from 172.16.0.0/12 to 195.195.195.1
block in log level local3.info quick on xl0 from 10.0.0.0/8 to 195.195.195.1
block in log level local3.info quick on xl0 from 0.0.0.0/8 to 195.195.195.1
block in log level local3.info quick on xl0 from 169.254.0.0/16 to 195.195.195.1
block in log level local3.info quick on xl0 from 192.0.2.0/24 to 195.195.195.1
block in log level local3.info quick on xl0 from 204.152.64.0/23 to 195.195.195.1
block in log level local3.info quick on xl0 from 224.0.0.0/3 to 195.195.195.1
block in log level local3.info quick on xl0 from 20.20.20.0/24 to 195.195.195.1
# zapreshajem vihod lokaljnogo trafika za predeli servera
# 4
block in log level local3.info quick on xl0 from 192.168.0.0/24 to 192.168.0.0/24
block out log level local3.info quick on xl0 from 192.168.0.0/24 to 192.168.0.0/24
# Zapreshenije raboti po portam
# 5
###############################################################################
##### DENY SYSLOG
# 5.1
block in log level local3.info quick on xl0 proto udp from any to 195.195.195.1 port = 514
##### DENY SAMBA
#5.2
block in log level local3.info quick on xl0 proto udp from any to 195.195.195.1 port 136 >< 140
#5.3
block in log level local3.info quick on xl0 proto tcp from any to 195.195.195.1 port 136 >< 140
##### DENY SWAT
#5.4
block in log level local3.info quick on xl0 proto tcp from any to 195.195.195.1 port = 901
##### DENY SENDMAIL
#5.5
block in log level local3.info quick on xl0 proto tcp from any to 195.195.195.1 port = 587
##### DENY BIND CONTROL PORT
#5.6
block in log level local3.info quick on xl0 proto tcp from any to 127.0.0.1 port = 953
##### DENY MYSQL
#5.7
block in log level local3.info quick on xl0 proto tcp from any to 195.195.195.1 port = 3306
##### DRWEB
#5.8
block in log level local3.info quick on xl0 proto tcp from any to 195.195.195.1 port = 3000
##### DRWEB-SMF
#5.9
block in log level local3.info quick on xl0 proto tcp from any to 195.195.195.1 port = 3001
##### POP3
#5.10
block in log level local3.info quick on xl0 proto tcp from any to 195.195.195.1 port = 110
###############################################################################
############# XL0- internet interface 80.249.194.125 ###############
############# ALLOW ###############
###############################################################################
##### ICMP TRAFIC
#6
pass in quick on xl0 proto icmp from any to any icmp-type echo
pass in quick on xl0 proto icmp from any to any icmp-type echorep
pass out quick on xl0 proto icmp from any to any icmp-type echorep
pass out quick on xl0 proto icmp from any to any icmp-type echo
block in log level local3.info quick on xl0 proto icmp from any to any
block out log level local3.info quick on xl0 proto icmp from any to any
#### ALLOW LOCALHOST
#7
pass in log quick on lo
pass out log quick on lo
##### SSH 6
#8
pass in quick on xl0 proto tcp from 195.216.172.0/24 to 195.195.195.1 port = 22
pass out quick on xl0 proto tcp from 195.195.195.1 port = 22 to 195.216.172.0/24
block in log level local3.info quick on xl0 proto tcp from any to 195.195.195.1 port = 22
### DNS SERVER ALLOW 80.80.80.53 - SECONDARY DNS SERVER UPDATE
#9
pass in quick on xl0 proto tcp from 80.80.80.53 to 195.195.195.1 port = 53
pass out quick on xl0 proto tcp from 195.195.195.1 port = 53 to 80.80.80.53
block in log level local3.info quick on xl0 proto tcp from any to 195.195.195.1 port = 53
### DNS QUERY
#10
pass in quick on xl0 proto udp from any to 195.195.195.1 port = 53
pass out quick on xl0 proto udp from 195.195.195.1 port = 53 to any
### WEB SERVER
# 11
pass in quick on xl0 proto tcp from any to 195.195.195.1 port = 80 flags S/S
pass in quick on xl0 proto tcp from any to 195.195.195.1 port = 443 flags S/S
pass in quick on xl0 proto tcp from any to 195.195.195.1 port = 80 flags A/A
pass in quick on xl0 proto tcp from any to 195.195.195.1 port = 443 flags A/A
pass in quick on xl0 proto tcp from any to 195.195.195.1 port = 80 flags AP/AP
pass in quick on xl0 proto tcp from any to 195.195.195.1 port = 443 flags AP/AP
pass in quick on xl0 proto tcp from any to 195.195.195.1 port = 80 flags AF/AF
pass in quick on xl0 proto tcp from any to 195.195.195.1 port = 443 flags AF/AF
pass in quick on xl0 proto tcp from any to 195.195.195.1 port = 80 flags AS/AS
pass in quick on xl0 proto tcp from any to 195.195.195.1 port = 443 flags AS/AS
pass in quick on xl0 proto tcp from any to 195.195.195.1 port = 80 flags R/R
pass in quick on xl0 proto tcp from any to 195.195.195.1 port = 443 flags R/R
### FTP SERVER
# DATA PORT
#12
pass in quick on xl0 proto tcp from any to 195.195.195.1 port = 20 flags A/A
pass in quick on xl0 proto tcp from any to 195.195.195.1 port = 20 flags AS/AS
pass in quick on xl0 proto tcp from any to 195.195.195.1 port = 20 flags AF/AF
pass in quick on xl0 proto tcp from any to 195.195.195.1 port = 20 flags R/R
# COMMAND PORT
pass in quick on xl0 proto tcp from any to 195.195.195.1 port = 21 flags A/A
pass in quick on xl0 proto tcp from any to 195.195.195.1 port = 21 flags S/S
pass in quick on xl0 proto tcp from any to 195.195.195.1 port = 21 flags AF/AF
pass in quick on xl0 proto tcp from any to 195.195.195.1 port = 21 flags AP/AP
pass in quick on xl0 proto tcp from any to 195.195.195.1 port = 21 flags R/R
### MAIL SERVER
# SMTP SERVER 25 PORT
# 13.1
pass in quick on xl0 proto tcp from any to 195.195.195.1 port = 25 flags S/S
pass in quick on xl0 proto tcp from any to 195.195.195.1 port = 25 flags A/A
pass in quick on xl0 proto tcp from any to 195.195.195.1 port = 25 flags AP/AP
pass in quick on xl0 proto tcp from any to 195.195.195.1 port = 25 flags AF/AF
# SMTP OVER SSL
#13.2
pass in quick on xl0 proto tcp from any to 195.195.195.1 port = 465 flags S/S
pass in quick on xl0 proto tcp from any to 195.195.195.1 port = 465 flags A/A
pass in quick on xl0 proto tcp from any to 195.195.195.1 port = 465 flags AP/AP
pass in quick on xl0 proto tcp from any to 195.195.195.1 port = 465 flags AF/AF
# POP3 OVER SLL
#13.3
pass in quick on xl0 proto tcp from any to 195.195.195.1 port = 995 flags S/S
pass in quick on xl0 proto tcp from any to 195.195.195.1 port = 995 flags A/A
pass in quick on xl0 proto tcp from any to 195.195.195.1 port = 995 flags AP/AP
pass in quick on xl0 proto tcp from any to 195.195.195.1 port = 995 flags AF/AF
# RAZRESHENIJE LOKALJNOGO TRAFIKA
#14
pass in quick on xl1 from any to any keep state
pass out quick on xl1 from any to any keep state
#15
pass out quick on xl0 from any to any
## DNS TRAFIK
#16
pass in quick on xl0 proto udp from 80.80.80.53 port = 53 to 195.195.195.1
###### BLOCK ALL #######
#17
block in log level local3.info quick on xl0 proto tcp from any to 195.195.195.1 flags S
#18
block in log level local3.info quick on xl0 proto udp from any to 195.195.195.1


Описание

Не для кого не секрет что протокол TCP/IP разработан уже давно и в принципе кардинальных изменений в него уже не вносили тоже давно по этой причине в нем присутствуют проблемы безопасности. В данных правилах с начало идёт шапка для устранения проблем с безопасностью протокола.


1.1Запрещение фрагментированных пакетов. Есть вид атаки, который нацелен именно на фрагментацию пакетов. Но давайте разберём с начало, что такое фрагментированные пакеты и когда они образуются.

И. Сказал Аллах да' будет сеть и возникла сеть', и сказал Аллах тогда, ' пусть будет много сетей и возникло много сетей'

В мире существуют множество разных технологий компьютерных сетей(Token Ring.Fast Ethernet.Frame Relay и.т. д) отличие и сходство мы описывать не будем, но кое что все таки опишем. Известно, что у технологии Ethernet максимальный размер пакета 1500 байт включая заголовок, а у технологии Token Ring этот размер составляет 4500 байт.

Рассмотрим такой пример: эти две сети соединены по средством моста и обе работают на протоколе TCP/IP когда мы передаем пакет из сети Ethernet в сеть Token Ring даже при максимальном пакете 1500 байт не превысит лимит в 4500 байт тут всё гладко, но если на оборот мы передаем из сети Token Ring в сеть Ethernet, то максимальный пакет 4500 больше предела 1500, в этом случае и поможет фрагментация. Мост, который связывает две сети при получении пакета из Token Ring с размером 4500 фрагментирует его на 3 пакета по 1500 байт и в IP заголовке Получившихся пакетов укажет смещение в байтах, принимающая сторона с начало примет все три пакета, а потом по смещению последовательно соберет в один пакет. В современном мире существуют множество технологий сетей, так что данный пример далеко не редкость. Как это может повлиять на фильтр. Атака состоит из запроса TCP соединения, фрагментированного на два IP-пакета. Первый IP-пакет состоит из 68 байт и содержит лишь первые восемь байт заголовка TCP (порты источника, назначения, и порядковый номер). Данные второго IP-пакета содержат запрос на TCP соединение (Флаг SYN установлен, ACK снят). Пакетные фильтры применяют одно и то же правило ко всем фрагментам пакета. По первому фрагменту (смещение = 0) выбирается правило, в соответствии с которым обрабатываются все остальные фрагменты пакета безо всякого дополнительного контроля. А во втором пакете содержится кусок не законченного TCP заголовка первого пакета. Таким образом, при сборке фрагментов на целевой машине формируется пакет с запросом на соединение. В результате устанавливается соединение, несмотря на то, что пакетный фильтр должен был предотвратить такую ситуацию.

1.2.Strict source route record - опция IP заголовка пакета, которая жестка задает до 8 IP-адресов маршрутизаторов через которые должен пройти пакет проблема безопасности в этом случае понятна

1.3.Loose source route record - почти тоже самое, что и Strict source route record только задает, не жестка прохождение пакета. Достигается это при достижении указанного в заголовке адреса маршрутизатора происходит замещения адреса доставки на следующий адрес маршрутизатора.

1.4.Router Record - используется для сбора IP-адресов маршрутизаторов через которые прошел пакет к пункту назначения. Используется такими программами как TRACEROUTE и TRACERT.

1.5. Timestamp - не помню точно но тоже что-то связанное с количеством ячеек под адреса маршрутизаторов.

2.Блок использующейся для запрещения определения операционной системы сканерами NMAP и.т.д. А также для запрещения атаки типа FIN flood. Правило запрещает вхождение TCP пакетов с неправильно установленными флагами.

3.Блок, запрещающий атаку типа Router-Spoofing при которой в источника IP-адресе указывается IP-адрес из внутренней сети в нашем случае это могло бы быть 192.168.0.0/24

при этом можно получить весь доступ, который доступен для внутренней сети.

4.Запрещаем случайный выход внутреннего трафика за пределы внутренней сети
5.Запрещаем для интернета соединение с некоторыми портами
5.1. Порт UDP 514 для удалённого приема событий программой журналом событий SYSLOG
5.2. Порты UDP 136 - 140 для протокола SMB который использует файловый сервер SAMBA(nmbd)
5.3. Порты TCP 136 - 140 для протокола SMB который использует файловый сервер SAMBA(smbd)
5.4. Порт TCP 901 используется для SWAT(Веб интерфейс для настройки SAMBA)
5.5. Порт TCP 587 Использующийся для почтового сервера SENDMAIL для балансировки нагрузки и ускорения работы сервера.
5.6.Порт TCP 953 порт для управления действиями DNS сервера BIND
5.7. Порт TCP 3306 порт, на котором работает по умолчанию MYSQL сервер баз данных
5.8. Порт TCP 3000 порт на котором работает по умолчанию DRWEB MONITOR
5.9. Порт TCP 3000 порт на котором работает по умолчанию DRWEB MAIL CHECKER
5.10. Порт TCP 110 порт для протокола POP3 принятие почты клиентами, Делаем его доступным только для внутренней сети.
6. Разрешаем из протокола ICMP только пинговать и получать ответы на пинги.
7. Разрешаем хождение трафика по локальному интерфейсу (lo0)
8. Разрешаем доступ к SSH серверу только из сети 195.216.172.0/24 для всех остальных запрещаем
9. TCP порт 53 используется для DNS серверов при передачи зоны с PRIMRY DNS SERVER SECONDARY DNS SERVER для всех остальных запрещаем.
10. UDP порт 53 для запросов на преобразования доменного имени в IP-адрес DNS сервером
11. Следующий блок правил относится к WEB-Server который работает по протоколам HTTP(порт 80) и HTTPS(порт 443) а также с последующей защитой его от разного рода атак путем разрешений определенного набора флагов в TCP заголовке которые в свою очередь допускают только правильную установку связи с сервером последующем этапом передачи данных и конечной фазой раз соединение.

В последующем описании PF-Filtra эти наборы будут заменены на более рациональное решение.

12.Как известно у FTP есть два режима работы пассивный и активный, в пассивном режиме связь устанавливается по 21 порту, а потом переводится на порт выше чем 1024,в активном режиме авторизация и команды для сервера идут по порту 21, но как только начинается передача данных то, сразу открывается порт 20. Тут также присутствует набор допустимых TCP флагов для большей безопасности.
13. Порты Почтовой системы
13.1. 25 Порт главный порт почтового сервера, через который осуществляется пере ссылка писем между серверами. Также защищен комбинацией флагов TCP заголовка.
13.2. 465 Порт на нем работает программа STUNNEL обеспечивающая перевод соединения на порт 25(SMTP) локально с шифрованием от внешнего клиента до сервера с портом 465. Также установлена допустимая конфигурация флагов в TCP заголовке
13.3. 995 Порт на нем работает программа STUNNEL обеспечивающая перевод соединения на порт 110(POP3) локально с шифрованием от внешнего клиента до сервера с портом 465. Также установлена допустимая конфигурация флагов в TCP заголовке.
14.Создает Динамическое правило, разрешающее хождению трафика во внутренней сети на интерфейсе xl1. Динамическое правило применено, для того чтобы внутренний трафик сети не проходил проверку всех правил FIREWALL и за счёт этого выигрываем во времени.
15.Разрешает выход любого трафика в интернет через внешний интерфейс (xl0).
16. Разрешаем вход UDP пакетов для DNS запросов с DNS сервера 80.80.80.53 порта 53 на наш внутренний интерфейс. Зачем нам запросы на внешний DNS ведь у нас есть свой собственный, Не хорошо загружать наш DNS сервер, когда это мог бы сделать DNS сервер провайдера тем более это входит в предоставляемые услуги нашим провайдером.
17. Последние строчки особенно важны, потому что с их помощью мы закрываем все что не нужно. По протоколу TCP не пропускаем любые пакеты с флагом SYN которые служат для установки соединения но если б мы не поставили этого флага то любые ответы пришедшие обратно не попавшие под вышестоящие правила были бы заблокированы, касается это в первую очередь ретрансляции ведь тогда все ответы которые должны были бы пройти через ретранслятор для внутренней сети были бы заблокированы. Хотя почтовый и веб и ftp сервера были бы доступны из интернета.
18. Так как udp только используется для DNS который мы разрешили выше мы закрываем весь доступ по протоколу udp.


Итог только что были рассмотрены сложные наборы правил FIREWALL для IPFW и IP-FILTER я специально сгруппировал эти 2 FIREWALL в месте так как приблизительно одного ранга, в свою очередь PF-FILTER он был разработан сравнительно не давно и обладает более прогрессируемыми средствами, чем IPFW,IP-FILTER. По этой причине я его буду рассматривать отдельно.


PF-FILTER

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

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

Приступим во первых у многих может сложиться мнение что описание правил PF будет идентичным с IP-FILTR да по синтаксису они будут близки но вот по идее, в прочем всё будет видно дальше.

#!/bin/sh

###############################################################################

############# BEGIN RULES ###############

############# NORMALIZACIJA ###############

###############################################################################


#1.1Vhodjashjie fragmenti nakaplivajutsja i peredajutsja daljshe filjtru

scrub in on xl0 all fragment reassemble min-ttl 20 max-mss 1440

#1.2Ubiraet opciju don't fragment iz ip-zagalovka

scrub in on xl0 all no-df

#1.3 Ni odnoj iz storon ne pozvoljaetsja umenjshitj IP TTL TTL dlja vseh paketov ustanavlivaetsja v maksimum

scrub on xl0 all reassemble tcp

#2.1 PORT SCANNERS FOR OS DETECTING

block in quick proto tcp from any to 195.195.195.1 flags SF/SFRA
block in quick proto tcp from any to 195.195.195.1 flags SFUP/SFRAU
block in quick proto tcp from any to 195.195.195.1 flags FPU/SFRAUP
block in quick proto tcp from any to 195.195.195.1 flags F/SFRA
block in quick proto tcp from any to 195.195.195.1 flags U/SFRAU
block in quick proto tcp from any to 195.195.195.1 flags P/P

#3.1 don't allow anyone to spoof non-routeble adresses

# IN

block in log-all quick on xl0 from { 127.0.0.0/8, 192.168.0.0/16, 172.16.0.0/12, 10.0.0.0/8, 0.0.0.0/8, 169.254.0.0/16, 192.0.2.0/24, 204.152.64.0/23, 224.0.0.0/3, 20.20.20.0/24 } to 195.195.195.1

#3.2 OUT

block out log-all quick on xl0 from any to { 127.0.0.0/8, 192.168.0.0/16, 172.16.0.0/12, 10.0.0.0/8, 0.0.0.0/8, 169.254.0.0/16, 192.0.2.0/24, 204.152.64.0/23, 224.0.0.0/3, 20.20.20.0/24 }

#4 Zapreshenije raboti po portam

###############################################################################

#####4.1 DENY SYSlog-all

block in log-all quick on xl0 proto udp from any to 195.195.195.1 port = 514

#####4.2 DENY SAMBA

block in log-all quick on xl0 proto udp from any to 195.195.195.1 port 136 >< 140

block in log-all quick on xl0 proto tcp from any to 195.195.195.1 port 136 >< 140

#####4.3 DENY SWAT

block in log-all quick on xl0 proto tcp from any to 195.195.195.1 port = 901

#####4.4 DENY SENDMAIL

block in log-all quick on xl0 proto tcp from any to 195.195.195.1 port = 587

#####4.5 DENY MYSQL

block in log-all quick on xl0 proto tcp from any to 195.195.195.1 port = 3306

#####4.6 DRWEB

block in log-all quick on xl0 proto tcp from any to 195.195.195.1 port = 3000

#####4.7 DRWEB-SMF

block in log-all quick on xl0 proto tcp from any to 195.195.195.1 port = 3001

#####4.8 POP3

block in log-all quick on xl0 proto tcp from any to 195.195.195.1 port = 110

###############################################################################

############# XL0- internet interface 80.249.194.125 ###############

############# ALLOW ###############

###############################################################################

#####5 ICMP TRAFIC

pass in quick on xl0 proto icmp from any to 195.195.195.1 icmp-type echoreq
pass in quick on xl0 proto icmp from any to 195.195.195.1 icmp-type echorep
pass out quick on xl0 proto icmp from 195.195.195.1 to any icmp-type echoreq
pass out quick on xl0 proto icmp from 195.195.195.1 to any icmp-type echorep
block in log-all quick on xl0 proto icmp from any to any
block out log-all quick on xl0 proto icmp from any to any

####6 ALLOW LOCALHOST

pass in log-all quick on lo
pass out log-all quick on lo

#####7 SSH 6

pass in quick on xl0 proto tcp from 195.216.172.0/24 to 195.195.195.1 port = 22
block in log-all quick on xl0 proto tcp from any to 195.195.195.1 port = 22

###8 DNS

pass in quick on xl0 proto tcp from 80.80.80.53 to 195.195.195.1 port = 53
pass out quick on xl0 proto tcp from 195.195.195.1 port = 53 to 80.80.80.53
pass in quick on xl0 proto udp from any to 195.195.195.1 port = 53
pass out quick on xl0 proto udp from 195.195.195.1 port = 53 to any

###9 WEB SERVER

pass in quick on xl0 proto tcp from any to 195.195.195.1 port = 80 synproxy state (max 10 tcp.finwait 5 tcp.opening 10 tcp.established 30 tcp.closing 20)
pass in quick on xl0 proto tcp from any to 195.195.195.1 port = 443 synproxy state (max 10 tcp.finwait 5 tcp.opening 10 tcp.established 30 tcp.closing 20)

###10 FTP SERVER
pass in quick on xl0 proto tcp from any to 195.195.195.1 port = 20 flags S/SA synproxy state
pass in quick on xl0 proto tcp from any to 195.195.195.1 port = 21 flags S/SA synproxy state

###11 EMULE

pass in quick on xl0 proto tcp from any to 195.195.195.1 port = 4661
pass out quick on xl0 proto tcp from 195.195.195.1 port = 4661 to any

###12 MAIL SERVER

pass in quick on xl0 proto tcp from any to 195.195.195.1 port = 25 flags S/SA synproxy state
pass in quick on xl0 proto tcp from any to 195.195.195.1 port = 465 flags S/SA synproxy state
pass in quick on xl0 proto tcp from any to 195.195.195.1 port = 995 flags S/SA synproxy state

##13 DNS

pass in quick on xl0 proto udp from 80.80.80.53 port = 53 to 195.195.195.1
pass in quick on xl0 proto udp from 217.199.96.2 port = 53 to 195.195.195.1

###14.1 BLOCK ALL

pass out quick on xl0 proto tcp from 195.195.195.1 to any
pass out quick on xl0 proto udp from 195.195.195.1 to any

###14.2

block in log quick on xl0 proto tcp from any to 195.195.195.1 flags S/SAFRP
block in log quick on xl0 proto udp from any to 195.195.195.1

###############################################################################

############# XL1- internel interface 192.168.0.1 ###############

############# ###############

###############################################################################

### 15

pass in quick on xl1 from any to any keep state
pass out quick on xl1 from any to any keep state

Описание

Не для кого не секрет что протокол TCP/IP разработан уже давно и в принципе кардинальных изменений в него уже не вносили тоже давно по этой причине в нем присутствуют проблемы безопасности. В данных правилах с начало идёт шапка для устранения проблем с безопасностью протокола.


1.1 "Scrubbing" - это нормализация пакета таким образом, чтобы не осталось

двусмысленности в определении адресата пакета. Директива scrub также

таким образом, осуществляя защиту некоторых операционных систем от определенного вида атак и отбрасывает пакеты с недопустимыми флагами. Самая простая форма: scrub in all

После прохождения правила Scrubbing и нормализации пакета пакет передается дальше правилам фильтра.

Scrub может принимать следующие опции:

fragment reassemble

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

max-mss num

Устанавливает Maximum Segment Size (MSS) в заголовке TCP пакета. Расчёт делается исходя из MTU(Maximum Transfer Unit)-Maximum IP Header length.

min-ttl num

Устанавливает минимальное значение Time To Live (TTL) в заголовке пакета.

1.2 no-df

Убирает бит "don't fragment" из заголовка IP пакета. Как уже

говорилось, некоторые операционные системы генерируют

фрагментированные пакеты с флагом "не фрагментировать", особенно

это характерно для NFS. Такие пакеты будут отброшены, если не

использовать no-df. Поскольку некоторые ОС генерируют "don't

fragment" пакеты с нулевым идентификатором IP в заголовке,

использование no-df лучше сочетать с опцией random-id.


1.3 reassemble tcp

Постоянно нормализует TCP пакеты. При использовании scrub пере собирает пакет, может быть не определено направление (in/out). Может быть выполнена следующая нормализация:
Ни одной из сторон не позволяется уменьшить IP TTL. Это сделано для того, чтобы защититься от посылок пакетов, запрашивающих соединение, но исчезающих до достижения адресата. TTL всех пакетов устанавливается в максимум.
Модуляция временных меток RFC1323 в заголовке TCP пакета со случайным числом. Это препятствует определению uptime хоста или определению количества хостов за маршрутизатором, использующем NAT.

2.1 Блок использующейся для запрещения определения операционной системы сканерами NMAP и.т.д. А также для запрещения атаки типа FIN flood. Правило запрещает вхождение TCP пакетов с неправильно установленными флагами.
3.Блок, запрещающий атаку типа Router-Spoofing при которой в источника IP-адресе указывается IP-адрес из внутренней сети или адреса зарезервированные в нашем случае это могло бы быть 192.168.0.0/24 при этом можно получить весь доступ, который доступен для внутренней сети.

В данном примере можно видеть использование таблиц

Когда pfctl(8) доходит до списка при загрузке наборов правил, он раскладывает их на отдельные правила, для каждого элемента списка. Для примера:

block out on fxp0 from { 192.168.0.1, 10.5.32.6 } to any

Будет преобразован в:

block out on fxp0 from 192.168.0.1 to any

block out on fxp0 from 10.5.32.6 to any


4.Запрещаем для интернета соединение с некоторыми портами

4.1. Порт UDP 514 для удалённого приема событий программой журналом событий SYSLOG

4.2. Порты UDP 136 - 140 для протокола SMB который использует файловый сервер SAMBA(nmbd)

Порты TCP 136 - 140 для протокола SMB который использует файловый сервер SAMBA(smbd)

4.3. Порт TCP 901 используется для SWAT(Веб интерфейс для настройки SAMBA)

4.4. Порт TCP 587 Использующийся для почтового сервера SENDMAIL для балансировки нагрузки и ускорения работы сервера.

4.5. Порт TCP 3306 порт на котором работает по умолчанию MYSQL сервер баз данных

4.6. Порт TCP 3000 порт на котором работает по умолчанию DRWEB MONITOR

4.7. Порт TCP 3000 порт на котором работает по умолчанию DRWEB MAIL CHECKER

4.8. Порт TCP 110 порт для протокола POP3 принятие почты клиентами, Делаем его доступным только для внутренней сети.

5. Разрешаем из протокола ICMP только пинговать и получать ответы на пинги.

6. Разрешаем хождение трафика по локальному интерфейсу (lo0)

7. Разрешаем доступ к SSH серверу только из сети 195.216.172.0/24 для всех остальных запрещаем

8. TCP порт 53 используется для DNS серверов при передачи зоны с PRIMRY DNS SERVER SECONDARY DNS SERVER для всех остальных запрещаем.

UDP порт 53 для запросов на преобразования доменного имени в IP-адрес DNS сервером

9. Следующий блок правил относится к WEB-Server который работает по протоколам HTTP(порт 80) и HTTPS(порт 443) а также с последующей защитой его от разного рода атак путем разрешений определенного набора флагов в TCP заголовке которые в свою очередь допускают только правильную установку связи с сервером последующем этапом передачи данных и конечной фазой раз соединение.
В последующем описании PF-Filtra эти наборы будут заменены на более рациональное решение. TCP SYN Proxy: Обычно, когда клиент устанавливает соединение с сервером вне сети, pf передает пакеты [22]установления связи между клиентом и сервером по
мере их поступления. PF также имеет способность проксировать процесс создания соединения. При этом PF установит связь с клиентом, инициирует установление связи с сервером и затем соединит клиента и сервер. Преимущества этого процесса в том, что никакие пакеты не посылаются серверу прежде, чем клиент завершит установление связи. Это устраняет угрозу spoofed TCP SYN флуда, та как клиентское подключение будет неспособно завершить установление связи и спуфить сервер.

pass in on $ext_if proto tcp from any to $web_server port www flags S/SA synproxy state

Теперь соединение с сервером будет проксировано пакетным фильтром. Так как при работе synproxy state образуются динамические правила, то SYN прокси включает в себя функциональность keep state и modulate state.


10.Как известно у FTP есть два режима работы пассивный и активный, в пассивном режиме связь устанавливается по 21 порту а потом переводится на порт выше чем 1024,в активном режиме авторизация и команды для сервера идут по порту 21 но как только начинается передача данных то сразу открывается порт 20. Тут также присутствует набор допустимых TCP флагов для большей безопасности.

11. Для пиринговой системы под названием E-Mule открываем порт и потом перекидываем его во внутреннюю сеть.

12. Порты Почтовой системы

25 Порт главный порт почтового сервера через который осуществляется пере ссылка писем между серверами. Также защищен комбинацией флагов TCP заголовка.

465 Порт на нем работает программа STUNNEL обеспечивающая перевод соединения на порт 25(SMTP) локально с шифрованием от внешнего клиента до сервера с портом 465. Также установлена допустимая конфигурация флагов в TCP заголовке

995 Порт на нем работает программа STUNNEL обеспечивающая перевод соединения на порт 110(POP3) локально с шифрованием от внешнего клиента до сервера с портом 465. Также установлена допустимая конфигурация флагов в TCP заголовке.

13. Разрешаем вход UDP пакетов для DNS запросов с DNS сервера 80.80.80.53 порта 53 на наш внутренний интерфейс. Зачем нам запросы на внешний DNS ведь у нас есть свой собственный, Не хорошо загружать наш DNS сервер когда это мог бы сделать DNS сервер провайдера тем более это входит в предоставляемые услуги нашим провайдером.

14

14.1.Разрешает выход любого трафика в интернет через внешний интерфейс (xl0).

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

Так как udp только используется для DNS который мы разрешили выше мы закрываем весь доступ по протоколу udp.

15.Создает Динамическое правило разрешающее хождению трафика в внутренней сети на интерфейсе xl1. Динамическое правило применено для того чтобы внутренний трафик сети не проходил проверку всех правил FIREWALL и за счёт этого выигрываем во времени.

http://www.opennet.ru/docs/RUS/ipfw_pf_ipfilter/

Обновлено: 12.03.2015