The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

Каталог документации / Раздел "Безопасность" / Оглавление документа

IPFW

IPFW - это IP-firewall и программа для управления формирования трафика в сети.

КРАТКОЕ ОПИСАНИЕ

ipfw [-q] [-p preproc [-D macro[=value]] [-U macro]] pathname

ipfw [-f | -q] flush

ipfw [-q] {zero | presetlog | delete} [number ...]

ipfw [-s [field]] [-adeftN] {list | show} [number ... ]

ipfw [-q] add [number] rule-body [number ...]

ipfw pipe number config pipe-config-options

ipfw pipe {delete | list | show} [number ...]

ipfw queue number config queue-config-options

ipfw queue {delete | list | show} [number ...]

ОПИСАНИЕ

ipfw - это пользовательский интерфейс для управления брандмауэром (ipfirewall) и dummynet (фиктивная сеть) - формирования трафика под FreeBSD.

Конфигурация брандмауэра выполняется при помощи списка нумерованных правил. Брандмауэр проверяет по этим правилам каждых входящий и исходящий IP-пакет, пока не будет найдено соответствующее правило. После того, как соответствующее правило найдено, пакеты могут быть введены в брандмауэр в соответствии с правилом повторно в зависимости от характера дейстия, определяемого этим правилом, а также системных установок. Все правила применимы для всех сетевых интерфейсов, так что ответственность системного администратора - записать установки правила так, чтобы пусть проверки был минимальным. Конфигурация всегда включает правило по умолчанию (DEFAULT rule, номер 65535) которое не может быть изменено и которое применяется для всех пакетов. Это правило может либо разрешать все, либо запрещать все в зависимости от конфигурации системного ядра. Если установки включают в себя одно или более правил с сохранением состояния или ограничением опций, то поведение поведение ipfwстановится статичным, т.е. ipfwбудет создавать динамические правила, соответствующие точным параметрам (адреса, порты), соответствующиего пакета до тех пор, пока это соответствие не будет найдено. Эти динамические правила, имеющие ограниченное время жизни проверяются при первом вхождении правила chech-stateили keep-state и обычно используются для открытия брандмауэра по требованию и только для желаемого трафика. Подробнее смотри разделы RULE FORMAT и ПРИМЕРЫ Об инсталляции можно также прочитать здесь.

Все правила, включая и динамические, имеют несколько связанных счетчиков: подсчет пакета, подсчет байт, регистрацию подсчетов, и timestamp - регистрация времени последнего соответствия. Счетчики могут отображаться или сбрасываться командами ipfw.

Правила могут быть добавлены при помощи команды add; удалены индивидуально при помощи команды delete, а также глобально (все сразу) при помощи команды flush (сброс); правила могут быть выведены на экран опционально вместе с содержимым счетчиков, при помощи команд list. В завершение счетчики могут быть обнулены при помощи команд zero или resetlog.

Допускаются следующие команды:

-a - при распечатке показываются значения счетчиков; команда вставки подразумевает эту опцию.

-d - при распечатке в дополнение к статическим выводятся динамические правила.

- при распечатке, если указана опция -d, также показывает просроченные динамические правила.

-f - не запрашивать подтверждения для команд, что может вызвать проблемы, если неверно используется, например, сброс. Заметьте, что если нет никакого tty, cвязанного с процессом, то это подразумевается.

-q - во время добавления, обнуления, очистки журналов или сброса не выводить сообщений (подразумевает -f). Эта опция полезна для корректировки правил при выполнении множества команд ipfw в скриптах (например, в sh /etc/rc.firewall') или при обработке файла, содержащего множество правил ipfw при удаленной сессии. Если выполнен сброс (flush) в нормальном (подробном) режиме, (с конфигурацией ядра по умолчанию), то печатаются сообщения. Поскольку все правила сброшены, сообщения не могут быть доставлены в удаленную сессию. По этой причине удаленный вход будет закрыт, и все остальные правила выполнены не будут. Доступ к консоли должен быть восстановлен.

-t - при распечатке показывать соответствующие timestamp.

-N - проверять соответствие имен и адресов при выводе.

-s [field] - при распечатке каналов сортировать, согласно одному из четырех счетчиков (подсчитывают и текущие пакеты или байты).

С целью упрощения конфигурирования правила могут быть помещены в файл, который может быть обработан ipfw, как показано в первой строке раздела synopsis. При этом должен быть использован абсолютный путь. Файл будет читаться строка за строкой, и применяться как аргументы для ipfw. Опционально препроцессор может быть указан, используя -p preproc, где pathname должен быть сквозным канальным. Полезные препроцессоры включают в себя cpp и m4. Если preproc не запускается с прямым слэшем ("/") как его первым символом, выполняется обычный поиск пути. Необходимо соблюдать осторожность с этим в системах, где не все файловые системы (еще) смонтированы к моменту запуска ipfw или же он расположен на файловой системе NFS. Параметр -p, а также следующие за ним (опционально) -D и -U могут также передаваться препроцессору. Это позволяет создать гибкий конфигурационный файл - подобно конфигурированию локального имени хоста - и использовать макросы для централизованного конфигурирования, подобно IP-адресу.

Команды pipes ipfw используются для конфигурирования регулировщика трафика как показано разделах TRAFFIC SHAPER CONFIGURATING, приведенных ниже.

RULE FORMAT

Формат правил

Общий вид формата правил ipfw следующий:

[prob match_probability] action [log [logamount number]] proto from src to dst [interface-spec] [options]

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

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

Заметьте, что может быть опасным фильтровать пакеты на основании IP-адреса источника или порта TCP/UDP, потому что они могут быть сравнительно легко подделаны.

prob match_probability

Число с плавающей точкой (от 0 до 1) - указание соответствующей вероятности. Это может быть полезно для ряда приложений типа случайного снижения скорости доставки пакета или (в соответствии с концепцией виртуальной сети - dummynet) для моделирования множественных путей интервала, приводящего к повреждению доставленных пакетов.

Action:

allow - разрешить пакетам, соответствующим правилу; завершает проверку; аналогами являются pass (пропустить), permit (разрешить) и accept (принять).

deny - отбрасывать пакеты, соответствующие данному правилу; прекращает поиск; drop - аналог (синоним) deny.

reject - (Deprecated, осуждаемый) - отбросить пакеты, которые соответствуют данному правилу и отправить ICMP-сообщение, что проверяемый хост недоступен. Завершает проверку.

unreach code - отбрасывает пакет, который соответствует данному правилу и отправляет ICMP-сообщение о недоступности хоста с кодом code, где code число от 0 до 255 или один из следующих псевдонимов (кодовых слов); net (сеть), host (хост), protocol (протокол), port (порт), needfrag (необходим фрагмент), scrfail (сбой источника), net-unknown (сеть неизвестна), host-unknown (хост неизвестен), isolated (изолирован), net-prohib, host-prohib, tosnet, toshost, filter-prohib, host-precedence (старшинство хоста) или precedence-cutoff (старшинство останова); завершает проверку.

reset - только для пакетов tcp; отбрасывает пакеты, которые сответствуют данному правилу и посылают TCP reset (RST) сообщение; завершает проверку.

count - модификация счетчиков для всех пакетов, соответствующих правилу; проверка продолжается со следующего правила.

check-state - проверяет пакет на соответсвиес динамическим правилом; если соответствие найдено, проверка прекращается; в противном случае выполняется переход к следующему правилу; если ни одного правила chech-stateнайдено не было, динамические установки проверяются до первого правила keep-state.

divert port - переадресация пакетов, соответствующих данному правилу на divert граничное окно в порт port; проверка завершается.

tee port - отправка копии пакетов, соответствующих данному правилу, на divert граничное окно в порт port ; проверка завершаетсяN; оригинал пакета принимается, но смотри раздел BUGS ниже.

fwd ipaddr [,port] - изменить next-hop (следующий отскок) для соответствующих пактов на IP-адрес ipaddr, который может быть IP-адресом в точечно-десятичной нотации или именем хоста; если IP-адрес ipaddr отсутствует в непосредственно подключенной к хосту сети, то маршрут определяется по локальной таблице маршрутизации соответствующего IP-адреса, использующегося вместо него; если IP-адрес ipaddr локальный, то производится ввод в систему с удаленного хоста и будет перенаправлен в порт port на локальной машине, сохраняя локальный IP-адрес сокета и устанавливая исходный IP-адрес для пакета, который был адресатом; это предназначено для работы с прозрачными прокси-серверами; если IP-адрес ipaddr не является локальным, то номер порта (если указан) игнорируется, и правило применяется к пакетам, уходящим из системы; это также отображает адреса к локальным портам, если пакеты сгенерированы локально; проверка завершается, если есть соответствие этому правилу; если номер порта не задан, то номер порта в пакете используется так, чтобы пакет для порта внешнего хоста Y был отправлен к локальному порту Y; системное ядро должно быть скомпилировано с опцией IPFIREWALL_FORWARD.

pipe pipe_nr - пропустить пакет через dummynet (фиктивную сеть) "pipe" c определенными параметрами - полоса пропускания, задержка и т. д.; cмотри раздел TRAFFIC SHAPER CONFIGURATION; поиск заканчивается, однако если переменная sysctl net.ionet.ip.fw.one_pass не установлена, то пакеты снова проходят через брандмауэр с просмотром следующего правила.

queue queue_nr - пропустить пакет по правилам dummynet "queue" , очередь номер queue_nr (для полосы пропускания, ограниченной с использованием WF2Q).

skipto number - последовательно пропустить все правила с номерами, меньшими, чем number; поиск продолжается с первого правила, номер которого больше, чем number.

log [logamount number]

Если ядро было скомпилировано с IPFIREWALL_VERBOSE, то когда пакет, соответствующий данному правилу с ключевым словом log, сообщение будет записано в журнал syslogd cредством LOG_SECURITY; примечание: по умолчанию, они добавляются в файл /var/log/security; см. syslog.conf; если ядро скомпилировано с опцией IPFIREWALL_VERBOSE_LIMIT, то по умолчанию запись в журнал прекратится после числа пакетов, указанных в опции и полученных для этой конкретной цепочки входа и значения переменной net.inet.ip.fw.verbose_limitбудет установлено это число; однако, если используется опция logamount number , будет установлено значение, меньшее, чем net.inet.ip.fw.verbose_limit , а значение 0 снимает ограничение, очищая при этом счетчик пакетов, после чего можно вновь давать возможность регистрации; регистрация через консоль и установка динамического предела выполнятеся при помощи sysctl и основан на MIB переменной net.inet.ip.fw

proto - IP-протоколы, который определяет именем или номером (полный список приведен в файле /etc/protocols); ip или ключевое слово all указывает на соответствие всем протоколам.

src и dst:

any | me | [not] address/mask [ports]

Ключевое слово any указывает на соответствие любому IP-адресу; ключевое слово me указывает на соответствие любому IP-адресу, который присвоен конфигурируемой системе.

address/mask может быть определен следующим образом:

ipno - IP-адрес в точечно-десятичной нотации (192.168.0.2), указывает на конкретный компьютер в сети;

ipno/bits - IP-адрес с маской (длиной сетевой части) в форме 1.2.3.4/24; в этом случае будут подходить все IP-адреса от 1.2.3.0 до 1.2.3.255.

inno:mask - IP-адрес с маской в форме 1.2.3.4:255.255.240.0; в этой записи указывается на соответствие всем IP-адресам от 1.2.0.0 до 1.2.15.255

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

С протоколами TCP и UDP опционально может следовать порт. Порт указывается следующим образом:

{port | port-port | port:mask} [,port [,...]]

Символ "-" указывает на диапазон портов, включая границы. Символ ":" указывает на порт и маску, объявляя соответствие, если номер порта и пакета соответствует порту в правиле, ограничивая битами, которые регулируются маской.

Имя сервиса (из файла /etc/services) может быть использовано вместо значения номера порта. В диапазоне может быть указано только первое значение и длина списка портов, ограниченная IP_FW_MAX_PORTS (как определено в /usr/src/sys/netibet/ip_fw.h). Обратный слэш ("\") может быть использован для выхода поле символа черточки ("-") в названии сервиса, например:

ipfw add count tcp from any ftp\\-data-ftp to any

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

interface-spec

Допускаются следующие комбинации спецификации интерфейсов:

in - только для входящих пакетов;

out - только для исходящих пакетов;

via ifx - пакет должен быть пропущен через интерфейс ifx;

via if* - пакет должен быть пропущен через интерфейс ifX, где X - любой номер устройства;

via ipno - пакет должен быть пропущен через интерфейс, IP-address которого ipno.

Указание ключевого слова via всегда заставляет проверять интерфейс. Если указаны ключевые слова recv или xmit, то это тоже заставляет всегда проверить интерфейс. Определяя передающий и принимающий интерфейсы, есть возможность выбрать пакеты, основанные как на том, так и на другом интерфейсе, например:

ipfw add 100 deny ip from any to any out recv ed0 xmit ed1

Интерфейс recv может быть проверен или на входящие, или на исходящие пакеты, в то время как интерфейс xmit может быть проверен только на исходящие пакеты. Так out требуется (и в недопустимых случаях) всякий раз, когда используется xmit. Сочетание via вместе с xmit или с recv недопустимо.

ОПЦИИ

keep-state

Соответствующий брандмауэр создает динамическое правило. Поведение по умолчанию этого правила приводит к соответствию двунаправленного трафика между источником и адресатом IP/Port, используя тот же самый протокол. Правило имеет ограниченное время жизни (время жизни управляется набором переменных sysctl) продолжительность жизни обновления, каждый раз на основании пакета соответствия. Как только сообветствие найдено, life-time обновляется.

limit {src-addr | src-port | dst-addr | dst-port} N

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

bridged

Cooтветствует только bridged-пакетам. Может быть полезно для многоадресного и широковещательного трафика, который в противном случае прошел бы через брандмауэр дважды: первый раз в течение соединения, а второй раз - в момент доставки пакета локальному стеку. Кроме того, будут возникать проблемы при использовании средства pipe, так как один и тот же пакет будет доставлен дважды применительно к условиям ширины полосы пропускания, занятия очереди, а также для счетчиков.

frag

Соответствует правилу, если пакет фрагментирован и если это не первый фрагмент датаграммы; fragне может быть использован как в сочетании или с другими tcp-флагами, так и указанием портов TCP/UDP.

ipoptions spec

Соответствует, если заголовок IP-пакета содержит перечисленный через запятую список опций, указанный в spec. Поддерживаются следующие опции: ssrr (strict source route, жесткая маршрутизация от источника), lsrr (loose source route, свободная маршрутизацЁя от источника), rr (record packet route, запись маршрута пакета) и ts (timestamp, отметка о времени). Отсутствие какой-либо опции может быть обозначено знаком '!".

tcpoptions spec

Соответствует, если tcp-заголовок содержит опции, перечисленные в списке и разделенные запятыми. Поддерживаются следующие опции: mss (maximum segment size, максимальный размер сегмента), window (tcp window advertisement, рекламное окно TCP), sack (селективный опрос), ts (rfc1323, отметка о времени) и cc (rfc1644 t/tcp счетчик соединений). Отсутствие какой-либо опции может быть обозначено знаком '!".

established

Только для TCP-пакетов. Соответствует пакетам, которые имеют битовые установки RST и ACK.

setup

Только для TCP-пакетов. Соответствует пакетам, которые имеют битовую установку SYN, но не имеют установки ACK.

tcpflags spec

Только для TCP-пакетов. Соответствует, если заголовок TCP-пакета содержит указанные в списке (разделенные запятыми) флаги spec. Поддерживаются следующие TCP-флаги: fin, syn, rst, psh, ack и urg. Отсутствие какой-либо опции может быть обозначено знаком '!". Правило, содержащее TCP-флаги, может никогда не соответствовать фрагментированным пакетам, которые имеют ненулевое смещение. Смотрите опции фрагментации для детальной информации о соответствии фрагментированных пакетов.

icmptypes types

Только для пакетов ICMP. Соответствует, если тип ICMP-пакета соответствует типу, указанному в списке spec. Список может указывать как на любую комбинацию диапазонов, так и на индивидуальный тип, разделенный запятыми. Поддерживаются следующие ICMP-типы: echo reply (0) - ответное эхо, destination unreachable (3) - адресат недостижим, source quench (4), redirect (5) - перенаправляющий, echo request (8) - запрос эха, router advertisement (11) - реклама (объявление о себе) маршрутизатора, IP header bad (12) - повреждение заголовка IP, timestamp request (15) - запрос о метке времени, information reply (16) - ответная информация, address mask request (17) - запрос адресной маски, address mask reply (18) - ответ на запрос об адресной маске.

uid user

Указывает на соответствие всем пакетам TCP или UDP отправленным или принятым пользователем user. user может указывать на соответсвие имени пользователю или его идентификационному номеру.

gid group

Указывает на соответствие всем пакетам TCP или UDP, посланным или принятым группой group. group может соответствовать имени группы или ее идентификационному номеру.

TRAFFIC SHAPER CONFIGURATION (КОНФИГУРИРОВАНИЕ РЕГУЛИРОВЩИКА ТРАФИКА)

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

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

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

Формат конфигурации pipe следующий:

pipe number config [bw bandwidth | device] [delay ms-delay] [queue {slots | size}] [plr loss_probability] [mask mask_specifier] [buckets hash-table-size] [red | gred w_q/min_th/max_p]

Формат конфигурации очереди ipfw следующий:

queue number config [pipe pipe_nr] [weight weight] [queue {slots | size] [plr loss_probability] [mask mask_specifier> ] [buckets hash-table-size] [red | gred w_q/min_th/max_th/max_p]

Для конфиругирования канала (pipe) могут использоваться следующие параметры:

bw brandwidth | device

bandwidth - ширина полосы пропускания, указанная в {K | M}{bit/s | Bytes/s}.

ВНИМАНИЕ!

Практически и теоретически доказано, что при указании единиц измерения полосы пропускания не имеет значения, что стоит после первых двух букв, важно только "К" и "В"! Причем, если вторая буква строчная, то он считает это битами, если заглавная, то байтами. Следовательно, если указать 100KBit/s, то это будет означать 100 килобайт в секунду!!!

Искренняя благодарность моему коллеге, Юрию Колoдовскому, за указание на этот нюанс.

Значение 0 (по умолчанию) указывает на неограниченную полосц пропускания. Непосредственно после наименования должен следовать номер, как в примере:

ipfw pipe 1 config bw 300KBit/s queue 50Kbytes

Если вместо численного значения ширины полосы пропускания указано имя-устройства (device), то используется таймер, которым снабжено данное устройство. В настоящее время эту возможность поддерживает только интерфейс PPP.

delay ms-delay

Задержка при передаче, выраженная в миллисекундах. Значение округляется до следующего такта системного таймера (типично 10 мс, но это хорошая практика, которую выполняет системное ядро с параметром HZ=1000, но это значение может быть уменьшено до 1 мс или даже меньше). Значение по умолчанию 0, что означает отсутствие задержки.

queue {slots | size Kbytes}

Размер очереди в слотах или килобайтах. Значение по умолчанию 50 слотов, что соответствует типичному значению очереди для сетевой карты Ethernet. Причем для малой скорости соединения необходимо сохранить малый размер очереди, чтобы на трафик можно было воздействовать с существенной задержкой. Так максимальный размер Ethernet-пакета - 1500 байт - среднее 600 Кбит или 20 сек очереди на канале 30 Kбит/с. Даже худший результат получается, если пакеты приходят от интерфейса с большим значением MTU, таким как интерфейс закольцовывания с размером пакета 16 K.

plr packet-loss-rate

Величина потерь пакетов. Аргумент packet-loss-rate это десятичное число от 0 до 1, где 0 обозначает отсутствие потерь, а 1 - 100% потерь; внутреннее представление величины потерь пакетов представлено 31 битом.

mask mask-specifier

dummynet предоставляет возможность создания очередей в потоке. Идентификатор потока создается маскированием IP-адресов, портов и типов протокола при установке параметров канала (pipe). Пакеты с одним и тем же идентификатором после маскирования относятся к той же самой очереди. Маска располагает комбинацией следующих спецификаторов: dst-ip mask, dst-port mask , src-port mask, proto mask, или все вместе, где последние означают все биты во всех полях являются значимыми. Когда используется в рамках конфигурации pipe, то каждому потоку назначается скорость, равная скорости канала. Когда используется в рамках конфигурации очереди (queue), то каждому потоку назначается вес, равный весу очереди и всех потоков, претендующих на ту же самую полосу пропускания, доли канала, пропорционально весу.

buckets hash-table-size

Этот параметр указывает на размер хэш-таблицы, использующейcя для сохранения переменных очереди. По умолчанию 64 управляемых sysctl переменной net.inet.ip.dumynet.hash_size; допускается диапазон от 16 до 1024.

pipe pipe_nr

Подключает очередь с указанным каналом. Множество очередей (как правило, с разными весами) может быть подключены к одному и тому же каналу, который определяется агрегацией нормы для установок очередей.

weight weight

Определяет вес, который нужно использовать для потоков, соответствующих этой очереди. Значение weight должнj быть в диапазоне 1 ... 100, и значения по умолчанию 1.

red | gred w_q/min_th/max_th/max_p

Выполняет алгоритм управления очередью RED. w_q и max_p - десятичное дробное число в диапазоне от 0 до 1 (0 не допускается), в то время как min_th и max_th - целые числа, определяющие пороги для управления очередью, вычисленные в байтах, если очередь была определена в байтах, в противном случае в слотах. dummynet поддерживает также "вежливый" (gentle) вариант - gred. Подробнее смотрите здесь. 3 переменные sysctl могут быть использованы для управлением поведением RED.

net.inet.ip.dummynet.red_lookup_depth - специфицирует точность вычисления среднего значения очереди, когда соединение простаивает (по умолчанию 256, должно быть больше 0);

net.ip.dummynet.red_avg_pkt_size указывает на ожидаемый размер пакета (по умолчанию 512, должно быть больше нуля);

net.inet.ip.dummynet.red_max_pkt_size - специфицирует ожидаемый максимальный размер пакета. Используется только в том случае, если переменные очереди выражены в байтах. По умолчанию 1500, должно быть больше 0.

CHECK-LIST

Здесь приведены некоторые важные моменты, рассматриваемые при составлении правил: