Здесь описывается, как использовать команду ipfw для создания фильтров различного назначения.
Поскольку враги имеют тенденцию группироваться, можно закрыть прохождение пакетов со всей вражеской сети:ipfw addb reject all from 1.1.1.1 to 2.2.2.2
Число 24 после символа "/" (слэш) означает длину маски в битах. Длина маски 24 как раз соответствует сети класса C, состоящей из 256 узлов.ipfw addb reject all from 1.1.1.0/24 to 2.2.2.2
Используя символ ":" можно переписать предыдущую команду следующим образом:
Следующая команда завершает этот абзац:ipfw addb reject all from 1.1.1.1:255.255.255.0 to 2.2.2.2
Она полностью блокирует все пакеты из вражеской сети 1.1.1.0 класса C посланные на любой адрес (если, конечно, они будут проходить через данный маршрутизатор).ipfw addb reject all from 1.1.1.0/24 to 0/0
Ключевое слово tcp определяет, что фильтр будет применяться только к TCP пакетам. Сразу за адресом хоста следует номер порта 25, который и определяет сервис smtp.ipfw addb accept tcp from 0/0 to 192.5.42.1 25
Можно использовать список портов для указания сразу нескольких портов в одной команде. Первый элемент списка портов может задавать диапазон номеров от меньшего к большему, разделённый двоеточием. Например, команда
разрешит прохождение TCP пакетов на адрес 1.1.1.1, если целевой порт при этом попадает в диапазонipfw addb accept tcp from 0/0 to 1.1.1.1 900:5000 25 113
Пример сети показан ниже:
Все подсети внутренней сети, включая и адрес хоста innerhost, принадлежат одной сети (или группе сетей). Предположим, во внешней сети нет и не может быть ни одного хоста, принадлежащего диапазону, выделенному для внутренней сети. Следовательно, любые пакеты, которые принимаются через интерфейс rf0 маршрутизатора, на котором запущен firewall, и имеют адрес источника, принадлежащий диапазону адресов внутренней сети, должны блокироваться. Следующая команда позволяет сделать это:
В отличие от предыдущих примеров, этот фильтр будет применяться только к пакетам приходящим через интерфейс rf0. Пакеты, поступающие через любой другой интерфейс, блокироваться не будут.ipfw addb rf0 reject all from innerhost/16 to 0/0
IP spoofing как метод атаки широко использовался в сети Интернет (для дальнейшей информации смотри CERT summary CS-95:01 , а также summaries на сервере CERT WWW site ).ipfw addb rf0 reject all from 127.0.0.0/8 to 0/0
Важно понимать, что злоумышленник может использовать метод IP spoofing для взлома вашей системы даже несмотря на то, что обратные пакеты никогда не вернутся к отправителю. Смотри, например CERT advisory CA-95:01 .
Первый фильтр пропускает все входящие извне пакеты, посылаемые на сервисы с портами в диапазоне от 900 до 5000 (обычно используемые нашими клиентами), а второй фильтр отбрасывает всё остальное.ipfw addb rf0 accept tcp from 0/0 to 0/0 900:5000 ipfw addb rf0 reject tcp from 0/0 to 0/0
К сожалению, этого недостаточно. Некоторые внутренние сервера могут
использовать порты в диапазоне от 900 до 5000. Предыдущая
пара фильтров позволит внешним станциям работать с нашими серверами. Проблема
в том, как закрыть внутренние сервера использующие диапазон портов от 900
до 5000 и в то же время позволить работать нашим клиентам в этом
же диапазоне. Одно из решений - блокировать попытки установления соединения
между внешним клиентом и внутренним сервером.
Модификатор tcp_connection
даёт такую возможность:
Первый фильтр предотвращает попытки установить соединение извне с нашими внутренними серверами в диапазоне портов от 900 до 5000. Второй фильтр разрешает другие входящие TCP пакеты в этом диапазоне, и последний фильтр отбрасывает все прочие TCP пакеты.ipfw addb rf0 reject tcp connection from 0/0 to 0/0 900:5000 ipfw addb rf0 accept tcp from 0/0 to 0/0 900:5000 ipfw addb rf0 reject tcp from 0/0 to 0/0
Поскольку все пакеты независимы, по заголовку пакета невозможно определить,
посылается пакет от сервера клиенту или наоборот (фактически, в протоколе
UDP
, участники действуют как равноправные партнёры и термины
сервер
и клиент явно не определены.
Поэтому лучшее, что мы можем сделать, это возможно более точно определить
диапазон портов UDP, который может использоваться для связи с
внешним миром. да-да-да легко сказать...
Сервер имён (DNS) является примером сервера, использующего протокол
UDP.
Предполагая, что rf0 - это наше соединение с внешним миром,
следующая пара фильтров обеспечит взаимодействие между нашим и внешними
DNS серверами, заблокировав весь остальной UDP трафик:
Хотя это может показаться простым, на самом деле очень трудно реализовать более открытую политику в области UDP обмена, не создав при этом больших дыр в безопасности. Если вы решите разрешить локальным клиентам общаться с внешними UDP серверами, то примите во внимание следующие соображения (это ДАЛЕКО не полный перечень):ipfw addb accept udp from 0/0 53 to 0/0 53 ipfw addb rf0 reject udp from 0/0 to 0/0
Это, безусловно, повышает общий уровень защищённости, хотя следует иметь в виду, что злоумышленник может использовать другие пути для атаки (например, просто забрасывая вас пакетами или просто посылая кучу бесполезной почты:)ipfw addb reject all ip_fragment from 0/0 to 0/0
Кроме того, блокирование всех фрагментированных пакетов может помешать
нормальной работе.
К примеру, в каждом сегменте сети есть понятие максимально возможного
размера пакета (обычно около 1500 байт). Но даже если отправитель посылает
не фрагментированный пакет, нет никакой гарантии, что он дойдёт таковым
до получателя. Вполне вероятно, что где-то по пути встретится участок с
меньшей максимально допустимой длиной пакета, и он будет разбит на
фрагменты. Даже новейшие протоколы определения минимальной длины пакета
на всём пути от источника до получателя не гарантируют успеха, поскольку
каждый IP-пакет доставляется независимо от других и может идти совершенно
различными путями. То есть, блокирование фрагментированных пакетов может
приводить к нарушениям в работе сетевых приложений (временным, либо постоянным)
с определёнными хостами.
Если вы решите разрешить прохождение фрагментированных пакетов, то, вероятно, одним из первых фильтров можно смело поставить:
Разрешение прохождения фрагментов пакета кроме первого не создаёт проблем с безопасностью (за исключением случаев атаки "отказ в обслуживании") поскольку первый фрагмент пакета, который несёт основную информацию о его назначении, будет контролироваться другими фильтрами. Если первый фрагмент пакета будет отвергнут каким-либо фильтром, то оставшиеся фрагменты будут доставлены получателю и уничтожены его программным обеспечением по истечении некоторого интервала времени (обычно 60 секунд).ipfw addb accept all ip_tail_fragment from 0/0 to 0/0
будет регистрировать все принимаемые ICMP пакеты.ipfw addb accept log icmp from 0/0 to 0/0
Заметьте, что большое количество регистрируемых пакетов может привести к переполнению системных журналов (если вы назначили переадресацию сообщений на удалённую машину)