Ipfw (Ipfw)

Перейти к навигации Перейти к поиску
ipfw
Скриншот программы ipfw
Тип Межсетевой экран
Разработчик Команда добровольцев-разработчиков FreeBSD
Операционные системы FreeBSD, DragonFly BSD, Mac OS X
Репозиторий svn.freebsd.org/base/head
Лицензия BSD
Сайт freebsd.org

ipfirewall — межсетевой экран, который поставляется с FreeBSD начиная с версии 2.0. С его помощью можно, например, подсчитывать трафик по любым разумным правилам, основывающимся на данных заголовков пакетов протоколов стека TCP/IP, обрабатывать пакеты внешними программами, прятать за одним компьютером целую сеть и т. п.[1]

Используется во многих ОС для встраиваемых систем, основанных на FreeBSD, таких как m0n0wall.

Имеется портированная версия — Wipfw для Windows 2000, Windows XP, и Windows Server 2003.

ipfw — название пользовательской утилиты (запускаемой из командной строки) предназначенной для управления системой IPFW. С её помощью администраторы создают и изменяют правила, управляющие фильтрацией и перенаправлением пакетов.

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

Ipfirewall состоит из следующих компонентов:

  • обработчик правил на уровне ядра, включающий систему учёта пакетов
  • механизм логирования
  • механизм форвардинга
  • ipstealth (механизм редактирования TTL полей, защита от traceroute)
  • основанные на ALTQ средства управления QoS
  • средства для управления множеством правил
  • механизмы управления пропускной способностью
  • основанная на таблице маршрутов система анти-спуффинга
  • счетчики пакетов
  • встроенный NAT, PAT и LSNAT (начиная с FreeBSD 7)
  • поддержка IPv6 (с некоторыми ограничениями)

Утилита ipfw впервые появилась во FreeBSD 2.0. Поддержка dummynet была добавлена позже, начиная с версии 2.2.8. Поддержка divert socket вместе с natd была добавлена начиная с версии 3.x (уточнить). Поддержка NAT на уровне ядра была добавлена начиная с версии 7.0.

  • Ugen JS Antsilevich
  • Poul-Henning Kamp
  • Alex Nash
  • Archie Cobbs
  • Luigi Rizzo

Поддержка NAT на уровне ядра была написана Paolo Pisati и впервые появилась в FreeBSD 4.0. До этого преобразование NAT осуществлялось демоном natd, пакеты которому передавались действием divert.

Настроенный брандмауэр представлен упорядоченным списком правил с номерами из диапазона 1-65535. Каждый пакет приходит с различных уровней стека протоколов, и попадая на брандмауэр поочередно сравнивается с критерием каждого правила в списке. Если совпадение найдено, то выполняется действие, закрепленное за данным правилом.

ipfw всегда содержит правило по умолчанию (с номером 65535) которое не может быть ни изменено, ни удалено. Это правило является терминальным, т.е оно применяется к пакетам, не попавшим во все предыдущие. В зависимости от конфигурации ядра это правило может выполнять действия «запретить» или «разрешить»(по умолчанию оно deny ip from any to any, чтобы изменить это, в ядро нужно добавить options IPFIREWALL_DEFAULT_TO_ACCEPT). Все остальные правила могут редактироваться администратором системы.

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

  • allow (син. — pass, accept, permit) — разрешить прохождение пакета. После этого действия другие правила не рассматриваются.
  • deny (син. drop) — запретить (сбросить) пакет. Пакет прекращает движение по списку правил и система полностью про него забывает.
  • unreach — запретить пакет. В отличие от deny, отправителю отправляется сообщение об ошибке по протоколу ICMP. После этого действия другие правила не рассматриваются.
  • reject — запретить пакет, и послать отправителю «Заданный узел не найден»
  • skipto — перейти к правилу с заданным номером, минуя все промежуточные (используется для того, чтобы избежать просмотра списка правил, условия которых заведомо не выполняются).
  • fwd (син. forward) — перенаправление пакета (используется для организации «transparent-proxy»; а также для маршрутизации пакетов по IP-адресу источника или любым другим признакам, не обрабатываемым обычной маршрутизацией).
  • divert — передать пакет на анализ пользовательскому приложению, которое может изменить пакет и вернуть его в firewall (возвращённый пакет будет передан следующему правилу) либо уничтожить пакет.
  • tee — аналогичен divert, за исключением того, что на анализ передается копия пакета (чаще всего используют для подсчета трафика).
  • pipe, queue — прохождение пакета через «канал» или «очередь» dummynet (shaping). Используется для ограничения пропускной способности и внесения задержек в прохождение пакетов.

Включение во FreeBSD

[править | править код]

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

Если вы хотите использовать IPFW, то вам необходимо пересобрать ядро с опцией:

options	IPFIREWALL

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

options	IPFIREWALL_DEFAULT_TO_ACCEPT

Если вы хотите использовать NAT (посредством демона natd), то вам необходимо добавить опцию:

options	IPDIVERT

Если вы хотите использовать NAT уровня ядра, то вам необходимо добавить опции:

options	LIBALIAS
options	IPFIREWALL_NAT

Если вы хотите использовать pipe/queue, то вам необходимо добавить опцию:

options	DUMMYNET

Включение ipfw через загрузку модулей ядра выполняется (суперпользователем) командами

kldload ipfw
kldload ipdivert
kldload dummynet

соответственно.

Как строить правила

[править | править код]

Общий формат для построения правил:

ipfw [prob match_probability] action [log logamount number] proto from src to dst [options]
ipfw add 00001 allow icmp from any to any
разрешить(allow) любой трафик по протоколу ICMP(icmp) в любом направлении.(any to any) первым (00001) правилом
ipfw add deny all from 192.168.0.0/24, 10.0.0.0/8 to 192.168.1.0/24
запретить (deny) любой трафик по любому протоколу (all) в направлении от 192.168.0.0-192.168.0.255 или от 10.0.0.0-10.255.255.255 к подсети 192.168.1.0/24 (192.168.1.0-192.168.1.255). Номер правила в таком случае берется от последнего использованного +100, за исключением последнего правила по умолчанию (№ 65535);
ipfw add deny all from 192.168.0.1 to me
Запрещает весь трафик от адреса 192.168.0.1 ко всем сетевым интерефейсам устройства, на котором работает конфигурируемый ipfw;
ipfw add allow all from table(1) to any
Разрешает весь трафик от адресов в таблице № 1 к любым адресам;
ipfw add allow all from table(1) to any out
Разрешает весь исходящий (out)

трафик от адресов в таблице № 1 к любом адресам;

ipfw add allow all from table(1) to any out via em0
Разрешает весь исходящий (out) трафик от адресов в таблице № 1 к любом адресам через интерфейс em0;
ipfw add skipto 1700 ip from table(8) to any
Начинает проверять запрос соответствию с правила 1701 (то есть все правила начиная с данного и до 1700 игнорируются при проверки данного пакета) для ip адресов из таблицы 8;
ipfw add set 31 prob 0.95 allow tcp from me to any out dst-port 80
Разрешает весь исходящий (out) трафик от данного устройства к любому адресу по порту 80 tcp(dst-port 80, tcp) с вероятностью 95 % (prob 0.95). Правило добавляется в специальный набор правил № 31, см.ниже (ipfw flush);
ipfw table 1 add 192.168.1.2
ipfw table 1 add 192.168.1.128/25
Добавить в таблицу 1 соответственно адрес 192.168.1.2 (маска /32 — по умолчанию) и подсеть 192.168.1.128/25
ipfw table 1 list
Показать содержимое таблицы 1;
ipfw delete 00001
удалить ранее созданное правило № 1. Описание необязательно — в случае, если под данным номером не одно правило, удаляются все.
ipfw flush
удалить все правила, не входящие в набор № 31;правило № 65535 входит в него по умолчанию;

Примечания

[править | править код]
  1. Kuzmich Настройка FireWall (ipfw) в FreeBSD. Дата обращения: 16 декабря 2008. Архивировано из оригинала 8 мая 2012 года.