Ipfw изменить правило


«ipfw — удалить правило»


«ipfw — удалить правило»

Сообщение от ЕйСи emailИскать по авторуВ закладки on

30-Окт-03, 11:02  (MSK)

Есть куча правил с ОДИНАКОВЫМ номером. Как из этой кучи удалить одно?

Понятно, что «ipfw d номер» не подойдет т.к. удалит все.

Первое, что приходит на ум, записать все эти правила в файл, (выводим «ipfw -a list | grep номер» , и записываем в файл)

Дальше удаляем нужную строку. Во всех оставшихся надо будет заменить начало строки (001  … и до deny……)на (ipfw add 1 deny….)

Пока не знаю как это сделать, может кто подскажет???

И далее остается загрузить эти правила из полученного файла.

Может есть более простой способ?

 

Рекомендовать в FAQ |
Cообщить модератору | Наверх

  • ipfw — удалить правило,
    YuryD, 11:40 , 30-Окт-03, (1)

    • ipfw — удалить правило,
      Nikolaev_D, 13:18 , 30-Окт-03, (2)

      • ipfw — удалить правило,
        ЕйСи, 13:59 , 30-Окт-03, (3)


1. «ipfw — удалить правило»

Сообщение от YuryD Искать по авторуВ закладки on

30-Окт-03, 11:40  (MSK)

>Есть куча правил с ОДИНАКОВЫМ номером. Как из этой кучи удалить одно?

>

>Понятно, что «ipfw d номер» не подойдет т.к. удалит все.

>

>Первое, что приходит на ум, записать все эти правила в файл, (выводим

>»ipfw -a list | grep номер» , и записываем в файл)

>ipfw show |awk ‘{print «/sbin/ipfw add «,$i+1,$4,$5,$6,$7,$8,$9}’

 

Рекомендовать в FAQ |
Cообщить модератору | Наверх


3. «ipfw — удалить правило»

Сообщение от ЕйСи emailИскать по авторуВ закладки on

30-Окт-03, 13:59  (MSK)

>>>Есть куча правил с ОДИНАКОВЫМ номером. Как из этой кучи удалить одно?

>

>чтоб таких проблем не было нужно всегда присваивать уникальные номера. Их можно

>65535 штук сделать.

Правила добавляются програмно через portsentry, и похоже там порядок нумерации изменить нельзя, к тому же 65535 не такое уж большое число как оказывается

to:YuryD

Спасибо за идею с awk, удобная штука, сделал немного по другому, все работает.

 

Рекомендовать в FAQ |
Cообщить модератору | Наверх

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

2004 г

Руководство FreeBSD
(FreeBSD Handbook)

Проект Русской Документации FreeBSD

содержание

14.8. Межсетевые экраны

Предоставили Gary Palmer, Alex
Nash.

Интерес к межсетевым экранам (брандмауэр, firewall) со стороны людей, подключенных к
интернет, все возрастает и появились даже приложения для локальной сети, предоставляющие
повышенный уровень безопасности. В этом разделе мы надеемся изложить что такое межсетевые
экраны, как их использовать, и как использовать возможности, предоставляемые ядром
FreeBSD для их реализации.

Замечание: Люди часто думают, что наличие межсетевого экрана между внутренней
сетью и «Большим плохим интернетом» решит все их проблемы безопасности. Это может
помочь, но плохо настроенный межсетевой экран представляет более серьезную угрозу
безопасности, чем его полное отсутствие. Межсетевой экран добавляет еще один уровень
безопасности вашим системам, но не может остановить проникновение решительно настроенного
взломщика в вашу сеть. Если вы снижаете внутреннюю безопасность системы, поскольку верите
в надежность межсетевого экрана, это существенно упрощает работу взломщика.

14.8.1. Что такое межсетевой
экран?

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

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

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

14.8.1.1. Маршрутизаторы с фильтрацией пакетов

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

Для определения того, должен ли быть пропущен пакет, межсетевой экран ищет в наборе
правило, совпадающее с содержимым заголовков пакета. Как только совпадение найдено,
выполняется действие, присвоенное данному правилу. Действие может заключаться в
отбрасывании пакета, пересылке пакета, или даже в отправлении ICMP сообщения в адрес
источника. Учитывается только первое совпадение, поскольку правила просматриваются в
определенном порядке. Следовательно, список правил можно назвать «цепочкой правил».

Критерий отбора пакетов зависит от используемого программного обеспечения, но обычно
вы можете определять правила, зависящие от IP адреса источника пакета, IP адреса
назначения, номера порта источника пакета, номера порта назначения (для протоколов,
поддерживающих порты), или даже от типа пакета (UDP, TCP, ICMP, и т.д.).

14.8.1.2. Прокси серверы

Прокси серверы это компьютеры, где обычные системные даемоны (telnetd, ftpd, и т.д.) заменены
специальными серверами. Эти серверы называются прокси серверами, поскольку они обычно работают только с
входящими соединениями. Это позволяет запускать (например) telnet прокси сервер на межсетевом экране, и делать возможным
вход по telnet на межсетевой экран, прохождение механизма
аутентификации, и получение доступа к внутренней сети (аналогично, прокси серверы могут
быть использованы для выхода во внешнюю сеть).

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

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

14.8.2. Что позволяет делать
IPFW?

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

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

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

14.8.3. Включение IPFW в
FreeBSD

Поскольку основная часть системы IPFW находится в ядре, вам потребуется добавить один
или несколько параметров в файл настройки ядра, в зависимости от требуемых возможностей,
и пересобрать ядро. Обратитесь к главе о пересборке ядра (Гл.
8) за подробным описанием этой процедуры.

Внимание: Правилом IPFW по умолчанию является deny ip from
any to any
. Если вы не добавите других правил во время загрузки для разрешения
доступа, то заблокируете доступ к
серверу с включенным в ядро межсетевым экраном после перезагрузки. Мы предлагаем указать
firewall_type=open в файле /etc/rc.conf при первоначальном добавлении межсетевого экрана, а
затем, после тестирования его работоспособности, отредактировать правила в файле /etc/rc.firewall. Дополнительной предосторожностью может быть
первоначальная настройка межсетевого экрана с локальной консоли, вместо входа через ssh. Кроме того, возможна сборка ядра с параметрами IPFIREWALL и IPFIREWALL_DEFAULT_TO_ACCEPT. В этом случае правило IPFW по
умолчанию будет изменено на allow ip from any to any, что
предотвратит возможную блокировку.

Существует четыре параметра настройки ядра, относящихся к IPFW:

options IPFIREWALL

Включает в ядро код для фильтрации пакетов.

options IPFIREWALL_VERBOSE

Включает протоколирование пакетов через syslogd(8). Без этого
параметра, даже если вы укажете в правилах фильтрации протоколировать пакеты, это не
сработает.

options IPFIREWALL_VERBOSE_LIMIT=10

Ограничивает число пакетов, протоколируемых каждым правилом через syslogd(8). Вы можете
использовать этот параметр если хотите протоколировать работу межсетевого экрана, но не
хотите делать возможной DoS атаку путем переполнения syslog.

Когда для одного из правил в цепочке достигается определенный параметром предел,
протоколирование для этого правила выключается. Для включения протоколирования, вам
потребуется сбросить соответствующий счетчик с помощью утилиты ipfw(8):

# ipfw zero 4500

где 4500 это номер правила, для которого вы хотите возобновить протоколирование.

options IPFIREWALL_DEFAULT_TO_ACCEPT

Изменяет правило по умолчанию с «deny» на «allow». Это предотвращает возможное
блокирование, если ядро загружено с поддержкой IPFIREWALL, но
межсетевой экран еще не настроен. Этот параметр также полезен, если вы используете ipfw(8) в качестве
средства от определенных проблем по мере их возникновения. Тем не менее, используйте
параметр с осторожностью, поскольку он открывает межсетевой экран и изменяет его
поведение.

Замечание: Предыдущие версии FreeBSD содержали параметр IPFIREWALL_ACCT. Этот параметр устарел, поскольку код автоматически
включает возможность учета.

14.8.4. Настройка IPFW

Настройка программного обеспечения IPFW выполняется с помощью утилиты ipfw(8). Синтаксис
этой команды выглядит очень сложным, но он становится относительно прост как только вы
поймете его структуру.

В настоящее время утилита использует четыре различных категории команд:
добавление/удаление (addition/deletion), просмотр (listing), сброс (flushing) и очистка
(clearing). Добавление/удаление используется для создания правил, определяющих как пакеты
принимаются, отбрасываются и протоколируются. Просмотр используется для определения
содержимого набора правил (называемого еще цепочкой) и счетчиков пакетов (учет). Сброс
используется для удаления всех правил цепочки. Очистка используется для обнуления одного
или нескольких счетчиков.

14.8.4.1. Изменение правил
IPFW

Синтаксис этой формы команды такой:

ipfw [-N] команда [номер] действие [log] протокол адреса
[параметры]

При использовании этой формы команды доступен один флаг:

-N

Разрешение адресов и имен сервисов при отображении.

Задаваемая команда может быть
сокращена до более короткой уникальной формы. Существующие команды:

add

Добавление правила к списку фильтрации/учета

delete

Удаление правила из списка фильтрации/учета

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

Если указано значение номер, оно
используется для помещения правила на определенную позицию в цепочке. Иначе правило
помещается в конец цепочки с номером на 100 больше, чем у предыдущего правила (сюда не
включается правило по умолчанию с номером 65535).

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

Существующие действия:

reject

Отбросить пакет и отправить в адрес источникаICMP пакет, сообщающий о недостижимости
хоста или порта.

allow

Пропустить пакет как обычно. (синонимы: pass, permit, и accept)

deny

Отбросить пакет. Источнику не выдается ICMP сообщение (как если бы пакет вообще не
достиг цели).

count

Обновить счетчик пакета, но не применять по отношению к нему правила allow/deny. Поиск
продолжится со следующего правила в цепочке.

Каждое действие может быть
записано в виде более короткого уникального префикса.

Могут быть определены следующие протоколы:

all

Соответствует всем IP пакетам

icmp

Соответствует ICMP пакетам

tcp

Соответствует TCP пакетам

udp

Соответствует UDP пакетам

Поле адреса формируется так:

источник адрес/маска [порт] цель адрес/маска [порт] [via интерфейс]

Вы можете указать port только вместе с протоколами, поддерживающими порты (UDP и
TCP).

Параметр via опционален и может содержать IP адрес или имя
домена локального IP интерфейса, или имя интерфейса (например ed0), он настраивает правило на соответствие только тем пакетам,
которые проходят через этот интерфейс. Номера интерфейсов могут быть заменены на
опциональную маску. Например, ppp* будет соответствовать PPP
интерфейсам ядра.

Синтаксис, используемый для указания адреса/маски:

адрес

или

адрес/маска-биты

или

адрес:маска-шаблон

Вместо IP адреса возможно указание существующего имени хоста. маска-биты это десятичный номер, указывающий количество
бит, которые должны быть установлены в маске адреса. Например, 192.216.222.1/24 создаст маску, соответствующую всем адресам подсети
класса C (в данном случае, 192.216.222). A valid hostname may be
specified in place of the IP address. маска-шаблон это IP, который будет логически перемножен с
заданным адресом. Ключевое слово any может использоваться для
обозначения «любого IP адреса».

Номера портов указываются в следующем формате:

порт [,порт [,порт […]]]

для указания одного порта или списка портов, или

портпорт

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

Доступные параметры:

frag

Срабатывает, если пакет не является первым пакетом дейтаграммы.

in

Соответствует входящим пакетам.

out

Соответствует исходящим пакетам.

ipoptions spec

Срабатывает, если заголовок IP содержит перечисленный через запятую список параметров,
указанных в spec. Поддерживаемые параметры IP: ssrr (strict source route), lsrr (loose
source route), rr (record packet route), и ts (time stamp). Действие отдельных параметров может быть изменено
путем указания префикса !.

established

Срабатывает, если пакет является частью уже установленного TCP соединения (т.е. если
установлены биты RST или ACK). Вы можете поднять производительность межсетевого экрана,
поместив правило с established
близко к началу цепочки.

setup

Соответствует, если пакет является попыткой установки TCP соединения (установлен бит
SYN, а бит ACK не установлен).

tcpflags флаги

Срабатывает, если заголовок TCP содержит список перечисленных через запятую флагов. Поддерживаемые флаги: fin,
syn, rst, psh, ack, и urg. Действие правил по отдельным флагам может быть изменено
указанием префикса !.

icmptypes типы

Срабатывает, если тип пакета ICMP находится в списке типы. Список может быть указан в виде любой комбинации
диапазонов и/или отдельных типов, разделенных запятыми. Обычно используемые типы ICMP:
0 echo reply (ping reply), 3
destination unreachable, 5 redirect, 8 echo request (ping request), и 11 time
exceeded (используется для обозначения истечения TTL, как с traceroute(8)).

14.8.4.2. Просмотр правил
IPFW

Синтаксис этой формы команды такой:

ipfw [-a] [-c] [-d] [-e] [-t] [-N] [-S] list

Для этой формы команды существует семь флагов:

-a

Показывать значения счетчиков. Этот параметр — единственный путь для просмотра
значений счетчиков.

-c

Просмотр правил в компактной форме.

-d

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

-e

Если определен параметр -d, показывать также динамические
правила с истекшим сроком действия.

-t

Отображать последнее время срабатывание для каждого правила в цепочке. Этот список
несовместим с синтаксисом, принимаемым ipfw(8).

-N

Попытаться разрешить заданные адреса и имена сервисов.

-S

Отображать набор, к которому принадлежит каждое правило. Если этот флаг не указан,
заблокированные правила не будут отображены.

14.8.4.3. Сброс правил IPFW

Синтаксис для сброса правил:

ipfw flush

Все правила в цепочке будут удалены, за исключением правила по умолчанию,
устанавливаемого ядром (номер 65535). Будьте осторожны при сбросе правил; правило,
отбрасывающее пакеты по по умолчанию отключит систему от сети, пока разрешающие правила
не будут добавлены в цепочку.

14.8.4.4. Очистка счетчиков пакетов
IPFW

Синтаксис для очистки одного или нескольких счетчиков пакетов:

ipfw zero [index]

При использовании без аргумента номер будут очищены все
счетчики пакетов. Если index указан, операция очистки
применяется только к указанному правилу цепочки.

14.8.5. Примеры команд для ipfw

Следующая команда запретит все пакеты с хоста evil.crackers.org на telnet порт хоста nice.people.org:

# ipfw add deny tcp from evil.crackers.org to nice.people.org 23

Следующий пример запрещает и протоколирует весь TCP трафик из сети crackers.org (класса C) к компьютеру nice.people.org (на любой порт).

# ipfw add deny log tcp from evil.crackers.org/24 to nice.people.org

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

# ipfw add deny tcp from any to my.org/28 6000 setup

Для просмотра записей учета:

# ipfw -a list

или в краткой форме

# ipfw -a l

Вы можете также просмотреть время последнего срабатывания правил с помощью
команды:

# ipfw -at l

14.8.6. Создание межсетевого экрана с
фильтрацией пакетов

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

При первоначальной настройке межсетевого экрана, до тестирования производительности и
введения сервера в строй, настоятельно рекомендуется использовать версии команд с
протоколированием и включить протоколирование в ядре. Это позволит вам быстро выявить
проблемные области и исправить настройку без больших усилий. Даже после завершения
первоначальной настройки рекомендуется использовать протоколирование для `deny’,
поскольку это позволяет отслеживать возможные атаки и изменять правила межсетевого
экрана, если требования к нему изменятся.

Замечание: Если вы используете версию команды accept с
протоколированием, будьте осторожны, поскольку она может создать большой объем протокольных данных. Будет
произведено протоколирование каждого пакета, проходящего через межсетевой экран, поэтому
большие объемы FTP/http и другого трафика существенно замедлят систему. Это также
увеличит задержку таких пакетов, поскольку ядру требуется выполнить дополнительную работу
перед тем, как пропустить пакет. syslogd также будет
использовать гораздо больше времени процессора, поскольку он отправит все дополнительные
данные на диск, и раздел /var/log может быть быстро
заполнен.

Вам потребуется включить межсетевой экран в /etc/rc.conf.local или /etc/rc.conf.
Соответствующая страница справочника разъясняет что именно необходимо сделать и содержит
примеры готовых настроек. Если вы не используете предустановленную настройку, команда ipfw list может поместить текущий набор правил в файл, откуда он
может быть помещен в стартовые файлы системы. Если вы не используете /etc/rc.conf.local или /etc/rc.conf для
включения межсетевого экрана, важно убедиться в том, что он включается после настройки
интерфейсов.

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

  • Заблокируйте доступ снаружи к портам TCP с номерами ниже 1024. Здесь расположена
    большая часть критичных для безопасности сервисов, таких как finger, SMTP (почта) и
    telnet.

  • Заблокируйте весь входящий
    трафик UDP. Есть очень немного полезных сервисов, работающих через UDP, но они обычно
    представляют угрозу безопасности (например, Sun RPC и NFS протоколы). У этого способа
    есть и недостатки, поскольку протокол UDP не поддерживает соединения, и запрещение
    входящих пактов заблокирует также ответы на исходящий UDP трафик. Это может стать
    проблемой для тех, кто использует внешние серверы, работающие с UDP. Если вы хотите
    открыть доступ к этим сервисам, потребуется разрешить входящие пакеты с соответствующих
    портов. К примеру, для ntp вам может потребоваться разрешить
    пакеты, приходящие с порта 123.

  • Заблокировать весь трафик снаружи к порту 6000. Порт 6000 используется для доступа к
    серверам X11, и может быть угрозой безопасности (особенно если у пользователей есть
    привычка выполнять на своих рабочих станциях команду xhost +).
    X11 может использовать диапазон портов, начинающийся с 6000, верхний предел определяется
    количеством X дисплеев, которые могут быть запущены на машине. Верхний предел,
    определенный RFC 1700 (Assigned Numbers), равен 6063.

  • Проверьте порты, используемые внутренними сервисами (например, SQL серверами и т.п.).
    Возможно хорошей идеей является блокирование и этих портов, поскольку они обычно не
    попадают в диапазон 1-1024, указанный выше.

Еще один список для проверки настроек межсетевого экрана доступен на CERT по адресу http://www.cert.org/tech_tips/packet_filtering.html

Как сказано выше, все эти правила всего лишь руководство. Вы сами сможете решить, какие правила фильтрации
будут использованы в межсетевом экране. Мы не можем нести НИКАКОЙ ответственности в
случае взлома вашей сети, даже если вы следовали советам, представленным выше.

14.8.7. Накладные расходы и
оптимизация IPFW

Многие пользователи хотят знать, как сильно IPFW нагружает систему. Ответ в основном
зависит от набора правил и скорости процессора. При небольшом наборе правил для
большинства приложений, работающих в Ethernet ответ «незначительно». Для тех, кому
нужен более точный ответ, и предназначен этот раздел.

Последующие измерения были выполнены с 2.2.5-STABLE на 486-66. (Хотя IPFW немного
изменился в последующих релизах FreeBSD, скорость осталась приблизительно той же.) IPFW
был модифицирован для измерения времени, затраченного ip_fw_chk, с выводом на консоль результата после каждого 1000-го
пакета.

Были протестированы два набора из 1000 правил. Первый был составлен для демонстрации
плохого набора правил путем повторения правила:

# ipfw add deny tcp from any to any 55555

Этот набор правил плох, поскольку большая часть правил IPFW не соответствует
проверяемым пакетам (из-за номера порта). После 999-й итерации этого правила следует
правило allow ip from any to any.

Второй набор правил был разработан для быстрейшей проверки каждого правила:

# ipfw add deny ip from 1.2.3.4 to 1.2.3.4

Не совпадающий IP адрес источника в правиле выше приведет к очень быстрой проверке
этих правил. Как и прежде, 1000-е правило allow ip from any to
any
.

Затраты на проверку пакета в первом случае приблизительно 2.703 мс/пакет, или
приблизительно 2.7 микросекунд на правило. Теоретический предел скорости проверки
около 370 пакетов в секунду. Предполагая подключение через 10 Mbps Ethernet и
размер пакета приблизительно 1500 байт, получаем только 55.5% использования
пропускной способности.

Во втором случае каждый пакет был проверен приблизительно за 1.172 мс, или
приблизительно 1.2 микросекунд на правило. Теоретический предел скорости проверки
около 853 пакетов в секунду, что делает возможным полное использование пропускной
способности 10 Mbps Ethernet.

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

  • Поместите правило established как можно раньше для
    обработки большей части TCP трафика. Не помещайте перед ним правила allow tcp.

  • Помещайте часто используемые правила ближе к началу набора чем редко используемые
    (конечно же, без изменения действия всего
    набора
    ). Вы можете определить наиболее часто используемые правила путем
    проверки счетчиков пакетов командой ipfw -a l.

Ipfw изменить правилоВ статье FreeBSD: борьба с bruteforce — IPFW+Sshit  уже упоминалось о добавлении динамической таблицы правил для IPFW.

Т.к. там все описано довольно кратко – в этой статье более подробно будет описана работа с таблицами в IPFW.

Добавим в файл конфигурации IPFW правило блокировки по данным из таблицы:

$cmd 00020 deny all from “table(1)” to any via $pif

где:

#префикс для команд
cmd=”ipfw -q add”

#задаем карту интернет-сети
pif=”em0″

И перезагружаем фаервол для применения новых правил:

# /etc/rc.d/ipfw restart
net.inet.ip.fw.enable: 1 -> 0
net.inet6.ip6.fw.enable: 1 -> 0
Firewall rules loaded.
Firewall logging enabled.

Добавить определенный адрес можно командой:

# ipfw table 1 add 194.0.200.1

Можно заблокировать целую подсеть:

# ipfw table 1 add 194.0.200.0/24

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

# ipfw table 1 list
194.0.200.0/24 0
194.0.200.1/32 0

Для удаления IP из таблицы IPFW:

# ipfw table 1 delete 194.0.200.0/24

И проверим:

# ipfw table 1 list
194.0.200.1/32 0

Подсеть из блока убрали, уберем 1 IP такой же командой:

# ipfw table 1 delete 194.0.200.1

Что бы не удалять адреса по одному, а сразу очистить всю таблицу – выполняем:

# ipfw table 1 flush

И напоследок – удобный скрипт для добавления целого списка IP-адресов из файла blockip.txt:

# cat blockip.sh
#!/bin/sh
ipfw table 1 flush
cat /home/setevoy/blockip.txt | while read ip; do
ipfw table 1 add $ip
done

Файл создавался под root, что бы выполнять его от другого пользователя – сменим владельца:

# chgrp setevoy blockip.sh

Не забудем установить права на выполнение скрипта:

# chmod ug+x blockip.sh

ug значит “добавить права для User и Group – только пользователю root и пользователям группы setevoy, т.е. себе.

Теперь имеем:

-rwxr-xr–  1 root     wheel          107 Jul 21 10:11 blockip.sh

IP адреса в файл blockip.txt добавляем каждый с новой строки, можно использовать подсети:

# cat blockip.txt
194.0.200.1
194.0.200.2
194.0.200.0/24

# ipfw table 1 list
194.0.200.0/24 0
194.0.200.1/32 0
194.0.200.2/32 0

Итак, у нас поставлена система FreeBSD и на ней собрано ядро с файрволлом ipfw. Теперь начинаем настраивать этот файрволл, заодно и разберемся, как он работает.

Подключение файрволла ipfw.

Открываем файл /etc/rc.conf

#ee /etc/rc.conf

Дописываем туда строки:

firwall_enable="yes"
firewall_script="/etc/firewall.conf"

Закрываем файл /etc/rc.conf

Создаем файл /etc/firewall.conf:

#ee /etc/firewall.conf

Пишем туда:

#!/bin/sh
ipfw="/sbin/ipfw" #объявили переменную ipfw, которая содержит путь до исполняемого файла файрволла.

${ipfw} -f flush #очищаем список всех старых правил
${ipfw} -f queue flush #очищаем список очередей
${ipfw} -f pipe flush #очищаем список каналов

Сохраняем и делаем файл исполняемым:

#chmod +x /etc/firewall.conf

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

Ipfw изменить правило

У нас две виртуальные машины, которые друг друга прекрасно пингуют. ОС Windows XP (192.168.0.10) и ОС FreeBSD 8.2, описанная в самом начале статьи, с файрволлом ipfw.

Запрещающее правило для ipfw (deny)

${ipfw} add 00010 deny icmp from any to me via em1

Итак, начинаем разбор полётов.

Структура правила очень проста. Вначале идёт использование переменной ipfw, которая у нас в начале скрипта. Можно в тексте скрипта объявить любую переменную NAME=”VALUE” и использовать её в скрипте как ${NAME}. Весьма удобно, если нужно изменить в разных местах одно и то же значение.

Итак, add 00010 – это добавление правила с номером 10. Нумерация правил идет с 1 до 65535, причем последнее правило – разрешающее по-умолчанию (определяется опцией ядра IPFIREWALL_DEFAULT_TO_ACCEPT), либо запрещающее по-умолчанию.

Следующим идёт действие. В данном случае – deny (запретить), могут быть allow, deny, divert и т.д, мы их будем касаться по мере изучения.

Следующим идет протокол. Можно запретить any (все), только tcp или ip (соответствующей директивой).

from <откуда> to <куда> via <интерфейс>

Я думаю, здесь тоже проблем не возникает. В качестве параметров откуда и куда можно использовать либо указывающие слова any (любой), me – адрес самого сервера с файрволлом, или переменная, в которой хранится IP узла.

В данном примере правило:

${ipfw} add 00010 deny icmp from any to me via em1

Создает запрет на прохождение icmp пакетов с любого узла через интерфейс em1 на адрес шлюза. Правило будет иметь номер 10.

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

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

Применяются правила простым вызовом этого файла:

#/etc/firewall.conf

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

Ipfw изменить правило

Зелёным подчеркнул до применения правила файрволла, а красным – после.

Ограничение скорости на передачу данных.

Сейчас мы будем заниматься ограничением пропускной способности сети. Я примерно нарисовал схемку, как работает пайп (pipe).

Ipfw изменить правило

Мы видим два направления передачи данных. Коричневое и зеленое. Коричневое из винды в freebsd, зеленое – обратно. Так вот, ещё важное уточнение, что у каждого направления есть in и out. Т.е. Передается из Windows (это out) но в FreeBSD (in), наоборот, для FreeBSD в качестве out будет начало канала, а для нас он входящий, значит in. По рисунку, я думаю, понятно.

Так вот, Pipe – труба – ставится на любое направление. И как бы “сужает” канал до нужного значения. Тестировать скорость сети мы будем утилитой Iperf. Я замеряю скорость изначально:

Ipfw изменить правило

Устанавливаем пайп. Для этого в список правил файрволла добавляем:

${ipfw} pipe 1 config bw 2048Kbit/s

Это правило определяет пайп с номером 1, шириной 2048 Кбит/сек., т.е. примерно 2 Мбит/с. bw – bandwidth – ширина канала.

Теперь пропустим канал в трубу. Так как для тестирования утилитой Iperf FreeBSD у нас будет сервером, а Windows XP – клиентом, то резать скорость будем в месте “in” у FreeBSD, т.е. на вход.

HOST="192.168.0.10/32"
${ipfw} add pipe 1 tcp from ${HOST} to me via em1

Как видите, здесь мы создали переменную HOST, в которую внесли адрес узла.

Просмотреть список правил можно командой:

#ipfw show — покажет список правил и количество пакетов (байт) пропущеных по этим правилам

или

#ipfw list — покажет только список правил

Применяем новые правила:

#/etc/firewall.conf

И наслаждаемся:

Ipfw изменить правило

Скорость порезана на ~2 Мбит/с.

ПРОДОЛЖЕНИЕ СЛЕДУЕТ

Правило по умолчанию: «запретить все, что не разрешено»:

65535 deny ip from any to any

За поведение по умолчанию отвечает системная переменная net.inet.ip.fw.default_to_accept

0 — запретить все
1 — разрешить все

Изменить переменную на лету нельзя, но можно установить ее значение в файле /boot/loader.conf

root@srv: # cat /boot/loader.conf
# SET DEFAULT IPFW’S RULE TO «ALLOW ANY TO ANY»:
net.inet.ip.fw.default_to_accept=1

Потребуется перезагрузка для применения изменений.