ipfirewall
—
межсетевой экран
, который поставляется с
FreeBSD
начиная с версии 2.0. С его помощью можно, например, подсчитывать трафик по любым разумным правилам, основывающимся на данных заголовков пакетов протоколов стека
TCP/IP
, обрабатывать пакеты внешними программами, прятать за одним компьютером целую сеть и т. п.
Используется во многих ОС для
встраиваемых систем
, основанных на FreeBSD, таких как
.
Имеется
портированная
версия —
Wipfw
для
Windows 2000
,
Windows XP
, и
Windows Server 2003
.
ipfw
— название пользовательской
утилиты
(запускаемой из командной строки) предназначенной для управления системой IPFW. С её помощью администраторы создают и изменяют правила, управляющие фильтрацией и
перенаправлением
пакетов.
ipfw может быть подгружен как модуль, а может быть встроен в ядро.
Ipfirewall состоит из следующих компонентов:
-
обработчик правил на уровне ядра, включающий систему учёта пакетов
-
механизм логирования
-
механизм форвардинга
-
(механизм редактирования TTL полей, защита от
traceroute
)
-
основанные на
ALTQ
средства управления QoS
-
средства для управления множеством правил
-
механизмы управления пропускной способностью
-
основанная на таблице маршрутов система анти-спуффинга
-
счетчики пакетов
-
встроенный
NAT
,
PAT
и
(начиная с 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
— прохождение пакета через «канал» или «очередь»
(
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 входит в него по умолчанию;
См. также
Примечания
-
Kuzmich
(рус.)
. Дата обращения: 16 декабря 2008. Архивировано из
8 мая 2012 года.
Ссылки