Ipfw и управление трафиком во FreeBSD



Несколько дополнительных слов во введении
Трафик, проходящий через маршуртизатор не должен быть бесконтрольным. Абсолютно естественно, когда хочется:

Выполнять фильтрацию трафика, то есть пропускать только то что можно, фиксировать то что нужно и уничтожать все остальное.

Выполнять трансляцию адресов, для того чтобы скрыть несколько хостов одним, когда нужно дать доступ к Интернету целой сети, а есть только один IP-адрес; или перенаправить различные входящие соединения на различные компьютеры скрытые за брандмауэром.

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

Выполнять учет трафика, дабы знать, каков объем тех или иных данных прошедших через шлюз за определенный промежуток веремени.

ОС FreeBSD предлагает хороший инструментарий для решения названых задач. Центральным элементом этого инструментария является подсистема ядра ipfw, предназначеная для пакетной фильтрации и решения других родственных задач; и одноименная утилита ipfw, которая нужна для настройки этой подсистемы.

Здесь рассматривается, как пользоваться утилитой ipfw для настройки фильтрации/учета/регулировки трафика; конфигурировать демон natd для выполнения трансляции адресов, а также указывается, с какими опциями должно быть собрано ядро системы для того чтобы все это работало. В завершение рассказывается, как ipfw и natd автоматически настраивать при загрузке системы.

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

Брандмауэр представляет собой программно-аппаратный комплекс, выполняющий разграничение сетей и ограничивающий доступ из одной сети в другую. Термин брандмауэр (firewall) берет свое начало в строительной отрасли, где он означает сооружение, препятствующее распространению огня при пожаре из одной части здания в другую. Аналогичным образом, в компьютерных сетях брандмауэр ограничивает распространение вредного сетевого воздействия.

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

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

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

ОС FreeBSD может выполнять пакетную фильтрацию с помощью подсистемы ядра ipfw.

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

Ярким примером такого рода брандмауэра может служить кэширующий прокси-сервер, который обрабатывает клиентские HTTP-запросы. Клиенты не могут соединиться напрямую с web-сервером и отправляют запрос прокси-серверу, который в свою очередь обращается уже к web-серверу.

Обычно обе технологии построения брандмауэров комбинируют.

Утилита ipfw
Утилита ipfw используется в FreeBSD для управления пакетным фильтром ipfw [1] и регулировщиком трафика dummynet, встроенными в ядро.

Каждый пакет, обрабатываемый ядром, проходит через цепочку правил (ruleset). Цепочка представляет собой набор правил, на соответствие каждому из которых последовательно проверяются пакеты. Если соотвествие найдено, выполняется заданное действие, иначе проверяется следующее правило. И так до тех пор, пока не будет найдено соответствие или не проверятся все правила цепочки. В последнем случае срабатывает правило-по-умолчанию, которое определяет, как нужно поступить с теми пакетами, о которых никто не побеспокоился.

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

Например, в этом случае цепочка фильтрации содержит два правила.

# ipfw list
00100 deny ip from 10.0.0.2 to any
65535 allow ip from any to any

Первое правило отклоняет (deny) все пакеты, которые приходят от хоста с адресом 10.0.0.2. Второе правило, которое является правилом-по-умолчанию, разрешает проходить всем остальным.

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

# ipfw действие [ число ] [ правило ]

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

# ipfw add deny ip from 10.0.0.3 to any

добавит правило deny ip from 10.0.0.3 to any в цепочку фильтрации. Номер правила будет выбран автоматически: он будет равен максимальному номеру правила (не считая правила-по-умолчанию) плюс шаг.

Команда

# ipfw add 100 deny ip from 10.0.0.3 to any

будет работать точно также, но если правило с номером 100 уже существует, оно будет перезаписано.

Таблица 1. Действия с цепочками правил

Название
Смысл

add
Добавить правило

delete
Удалить правило

flush
Очистить цепочку

show или list
Показать содержимое цепочки правил

zero или resetlog
Обнулить счетчики правил


Правила ipfw
Общая структура правила такова:

[ число ] [ set число ] [ prob вероятность ] действие [ log ] тело

Обычно, большинство полей в правиле не указывают, и оно имеет более простую структуру:

[ число ] действие тело


Каждое правило содержит условие (тело), при котором оно будет срабатывать, и действие (действие), которое говорит о том, как именно правило будет себя вести.

Например, правило

allow from any to any

содержит действие allow, которое применяется ко всем пакетам (при условии, что пакет дошел до правила). Выбор пакетов определяется телом правила: from any to any.

Таблица 2. Элементы правила ipfw

Элемент
Назначение

номер
Номер правила. Если не указан, вычисляется автоматически.

set число
Номер набора. Наборы помогают управлять группами правил. Например, можно удалить множество правил одной командой, если они приналежат одному набору. Есть смысл объединять правила в наборы, если эти правила семантически как-то связаны между собой

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

log [ logamount число ]
При совпадении с правилом занести информацию о пакете в журнал (при net.inet.ip.fw.verbose = 1 ). Количество записей касающихся этого правила, занесенных в журнал, не должно превышать величину logamount (или net.inet.ip.fw.verbose_limit, если logamount не указано )


Простейшими действиями ipfw являются allow и deny. Действие allow разрешает прохождение пакета, и он больше не проверяется на соответствие ни одному условию, а deny, наоборот, приводит к тому, что пакет отбрасывается. При этом отправитель не получает никакой информации о судьбе пакета -- пакет считается просто потерявшимся. Если нужно чтобы отправитель знал о том, что пакет был уничтожен, следует использовать действие unreach host.

Другие действия ipfw, такие как divert, fwd, pipe, queue, используются для организации трансляции адресов и регулирования полосы пропускания.

Таблица 3. Действия в правилах ipfw

Обозначение
Действие

allow | accept | pass | permit
Разрешить прохождение пакета, которое соответствует правилу. Прекратить поиск.

count
Посчитать пакет, который соответствует правилу и продолжить проверку.

deny | drop
Уничтожить пакет, не извещая отправителя.

divert порт
Передать пакет на указанный порт хоста и не выполнять дальнейшую проверку. Используется, например, для выполнения трансляции адресов с помощью natd.

unreach код
Уничтожить пакет и направить его отправителю ICMP-извещение с указанным кодом. В качестве кода может использоваться либо число от 0 до 255, либо соответствующее ему слово. Например, host означает ICMP сообщение "Хост недоступен" (Host unreachable), а port -- сообщение "Порт недоступен".

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

В частном случае нужно выполнить маскарадинг, то есть скрытие множества хостов, работающих с разными IP-адресами, одним.

Из-за ограничености адресного пространства IP, каждый хост, который пользуется услугами Интернета не может получить собственного IP-адреса. В этом случае используются адреса из диапазонов 10.x.x.x, 192.168.x.x., 172.16.x.x.-172.31.x.x. Эти адреса зарезервированы для внутреннего использования и не могут встретиться в Интернете. Компьютеры, имеющие такие адреса, могут общаться друг с другом в пределах одной сети, но не могут выходить за ее пределы: пакеты, имеющие такие адреса будут попросту уничтожаться.

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

При маскарадинге, адрес отправителя пакета автоматически подменяется внешним адресом сетевого интерфейса хоста, на котором он осуществляется.

Трансляция адресов в FreeBSD
В FreeBSD трансляцию адресов пакетов можно выполнить двумя способами:

natd
Демон natd является процессом, то есть он работает не в пространстве ядра, а в пространстве пользователя. Поэтому, для обработки демоном трафик должен копироваться из ядра в пространство пользователя и обратно. Это несколько уменьшает производительность.

ipnat
Трансляция адресов выполняется ядром системы.

Каждый из этих механизмов имеет собственные способы настройки. Здесь рассматривается только первый вариант, то есть обеспечение маскарадинга с помощью natd.


Настройка natd
Демон natd является процессом, работающим в пространстве пользователя (то есть не в пространстве ядра). Следовательно, пакеты, которые он обрабатывает, должны как-то к нему попасть. Действие divert пакетного фильтра может справиться с такой задачей.

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

Например, для того, чтобы все пакеты, которые отправлены из сети 192.168.15.0 и проходят через интерфейс ${natd_interface} передавались демону natd, нужно так модифицировать правила:

# ipfw add divert 8868 tcp from 192.168.15.0/24 to any via ${natd_interface}

Здесь ${natd_interface} -- интерфейс, через который пакеты уходят из сети во внешний мир, а 8868 -- номер сокета, на котором ведет прослушивание natd. Вместо 8868 можно написать символическое имя порта: natd.

Для того чтобы трансляция адресов работала, необходимо чтобы natd получал и все пакеты, которые возвращаются обтратно. Можно пойти еще дальше и передавать демону natd вообще все пакеты, которые проходят через ${natd_interface}:

# ipfw add divert 8868 tcp from any to any via ${natd_interface}

Собственно настройка ipfw дает только то, что пакеты будут переданы демону natd. Основная работа выполняется самим демоном, так что, нужно сконфигурировать и его.

Конфигурация natd задается либо аргументами его командной строки, либо конфигурационным файлом /etc/natd.conf (имя конфигурационного файла должно быть указано при вызове natd с ключом -f). Параметры конфигурационного файла и аргументы командной строки natd в точности повторяют друг друга, с той разницей, что когда параметр указывается в командной строке, перед ним нужно поставить минус. Например, сказать

# natd -interface xl0

значит то же самое, что и просто

# natd -f /etc/natd.conf

когда в конфигурационном файле /etc/natd.conf находится

interface xl0

Таблица 4. Опции natd

-redirect_port протокол targetIP:targetPORT[-targetPORT] [aliasIP:]aliasPORT[-aliasPORT] [remoteIP[:remotePORT[-remotePORT]]]
Перенавправить входящее соединение. Теперь natd отвечает за правильную передачу входящих и исходящих пакетов в рамках этого соединения.

протокол -- протокол, пакеты которого должны перенаправляться. Допустимые значения: tcp и udp

targetIP и targetPORT -- куда должно перенаправляться соединение;

aliasIP и aliasPORT -- откуда должно перенаправляться соединение;

remoteIP и remotePORT -- чье соединение будет перенаправляться.


-redirect_address localIP[,localIP,...] publicIP
Перенаправить входящие соединения, направленные на адрес publicIP на внутренний адрес localIP. Если указано несколько адресов localIP нагрузка распределяется между ними, то есть различные соединения перенаправляются на различные localIP по очереди.

-config файл или -f файл
Использовать указаный файл в качестве конфигурационного.

-dynamic
Используется в сочетании с -n или -interface. Периодически проверять адрес интерфейса и смотреть, не изменился ли он. Если адрес изменился, то нужно учесть это изменение при маскарадинге.

-a адрес или -alias_address адрес
При маскарадинге указывать заданный адрес в качестве адреса отправителя.

-interface интерфейс или -n интерфейс
Считать этот интерфейс внешним при маскарадинге. При изменение IP-адреса следует использовать вместе с опцией -dynamic.

-proxy_rule port порт server адрес:порт
Перехватывать все исходящие соединения, по указаному порту и направлять их на заданый сервер (адрес:порт). Опция используется для обеспечения работа прозрачного прокси.

-proxy-only
Не делать ничего, кроме обеспечения прозрачного прокси.


Регулировка величины трафика
Что такое регулировка трафика и зачем она нужна
В простейшем случае задача регулировки трафика формулируется так: через наш шлюз проходит информационный поток A величной V(A). Мы хотим ограничить этот поток каким-нибудь значением Vmax. То есть, грубо говоря, сделать так, чтобы все, что выходит за пределы зачения Vmax попросту уничтожалось [2].

Каждому потоку назначается специальный буфер, работающий по принципу очереди. Буфер наполняется с той скоростью, с какой в него поступают данные (Vin), а опустошается со скоростью, не превышающей заданную (Vout). В том случае, если Vin находится в допустимых пределах, поток проходит через буфер в полном объеме. Если же буфер наполняется быстрее чем опустошается, может наступить такой момент, когда он будет полностью заполнен и вновь поступающие данные будут попросту уничтожаться.

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

Средства, которые управляют трафиком подобным образом, называют трафик-шейперами (traffic-shaper), формирователями или регулировщиками трафика.

Трафик-шейпер в FreeBSD
В состав ядра FreeBSD входит модуль dummynet, который позволяет эмулировать канал связи, обладающий

ограниченой полосой пропускания;

задержкой распространения;

вероятностью потери пакета;

очередью пакетов заданного размера.

Этот модуль можно использовать в качестве трафик-шейпера.

Настройка трафик-шейпера
Настройка трафик-шейпера на основе dummynet производится с помощью утилиты ipfw. Для того, чтобы направить какой-либо трафик через канал dummynet, нужно

Создать канал;

Указать, какой именно трафик должен быть в канал направлен;

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

Два первых шага совмещаются в одном и выполняются командой ipfw add pipe. Например, команда

# ipfw add pipe 1 tcp from any to 192.168.15.1 out

создает канал 1 (pipe 1) и направляет через него весь tcp-трафик, отправленный не важно кем (from any) хосту 192.168.15.1 (to 192.168.15.1); при этом трафик должен быть исходящим (out).

Для того чтобы, настроить сам канал pipe, нужно дать команду ipfw pipe ... . Например, команда

# ipfw pipe 1 bw 10KB

ограничивает полосу пропускания канала pipe 1 значением 10 КБайт/с. Канал мог бы иметь и другие параметры, которые в этом случае должны были бы быть указаны как дополнительные аргументы команды парами параметр значение.

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

В том случае, когда нужно ограничить скорость передачи информации из Интернета на хост, находящийся в локальной сети, следует изменять скорость исходящего потока. То есть скорость того потока, который уходит со шлюза на хост. Нельзя уменьшить скорость, с которой данные передаются из Интернета. Это вызывает вопрос: зачем унчитожать информацию, после того, как она уже попала в нашу сеть? Ведь она уже прошла по входящему каналу и уже заняла там какое-то место? Все действительно так, но в этом случае в силу вступают механизмы регулирования потока TCP, которые не позволят в следующий раз отправлять хосту информации больше, чем он способен принять.

Таблица 5. Параметры канала dummynet

bw
Максимальная полоса пропускания канала. Может быть указана дополнительная единица измерения: MByte, KByte, Kbit, Mbit. По умолчанию, подразумевается, что полоса пропускания указана в Кбитах/с.

delay
Задержка распространения в мс.

Просмотреть информацию о канале, можно с помощью команды

# ipfw pipe 1 list
00001: 80.000 Kbit/s 0 ms 50 sl. 1 queues (1 buckets) droptail
mask: 0x00 0x00000000/0x0000 -> 0x00000000/0x0000
BKT Prot ___Source IP/port____ ____Dest. IP/port____ Tot_pkt/bytes Pkt/Byte Drp
0 tcp 192.168.15.199/80 192.168.15.254/52995 12365 15440683 0 0 1

Она выдает не только сведения о канале, но и о соединениях, которые проходят через этот канал.


Учет трафика
Учет трафика выполняется с помощью системы фильтрации пакетов ipfw. Собственно, подсчитывать трафик - это еще одна задача этой подсистемы.

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

# ipfw -a list
65535 4386 844198 allow ip from any to any

Ключ -a команды заставляет ее показывать не только список правил, но и счетчики каждого из них. Строка содержит три числа: номер правила (65535), количество пакетов (4386) и байтов (844198), которые совпали с правилом.

Если все, что нужно сделать с трафиком это подсчитать его (то есть к нему не нужно применять никаких други действий, для данного типа трафика у фильтра нет специального правила), следует использовать действие count.

Например, для того чтобы подсчитать весь трафик, который направляется из подсети 192.168.15.0 и который проходит через даный хост, нужно добавить правило:

# ipfw add count ip from 192.168.15.0/24 to any

Это правило не затронет никаких остальных правил фильтрации, которые идут за ним. Напимер, если далее явным образом явным образом разрешается прохождение трафика с 192.168.15.1 и запрщается с 192.68.15.2, они будут работать как и до этого.


Работа с ipfw
Настройка ядра для поддержки ipfw
Для того, чтобы ядро выполняло фильтрацию пакетов, нужно чтобы в его состав были включены соответствующие модули.

Для этого необходимо поправить файл конфигурации ядра и пересобрать ядро системы. В файле /usr/src/sys/i386/conf/ВАШЕ_ЯДРО нужно добавить такие строки:

options IPFIREWALL
options IPFIREWALL_VERBOSE
options IPFIREWALL_VERBOSE_LIMIT=10
options IPFIREWALL_DEFAULT_TO_ACCEPT

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

Для поддержки модуля dummynet нужно добавить опцию DUMMYNET в конфигурационый файл ядра:

options DUMMYNET

Дополнительные параметры, которые могут быть полезны при тонкой настройке dummynet, это NMBCLUSTERS и HZ. Первый позволяет указать объемы сетевых буферов, а второй -- точность (granularity) таймера.

Если шлюз выполняется трансляцию адресов с помощью демона natd, нужно чтобы ядро могло обеспечить передачу ему пакетов в с помощью так называемых divert-сокетов. Поддержка divert-советов в ядре включается с помощью опции IPDIVERT:

options IPDIVERT

Таблица 6. Опции конфигурации ядра, относящиеся к фильтру пакетов

Опция
Назначение

IPFIREWALL
Включить в ядро код, который выполняет фильтрацию пакетов

IPFIREWALL_VERBOSE
Разрешить заносить информацию о пакетах в syslog. Если эта опция не включена, опция log в правилах ipfw ничего не даст.

IPFIREWALL_VERBOSE_LIMIT=10
Если количество записей занесенных в журнал одним правилом превышает указазнный предел (в данном случае, 10), записи прекращают заноситься. Для того, чтобы начать заносить их вновь, нужно сброси счетчик с помощью команды zero.

IPFIREWALL_DEFAULT_TO_ACCEPT
Превратить правило-по-умолчанию в allow. Если эта опция не указана, правило-по-умолчанию установлено в deny.

IPDIVERT
Поддержка divert-сокетов. Необходима для работы natd (точнее для того, чтобы natd могло работать правильно).

DUMMYNET
Встравивать в ядро модуля dummynet. Модуль используется для ограничения величины информационных потоков

HZ
Точность таймера

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

# /usr/sbin/config ВАШЕ_ЯДРО
# cd ../compile/ВАШЕ_ЯДРО
# cd ../../compile/ВАШЕ_ЯДРО
# make depend
# make
# make install


Настройка ipfw и natd при загрузке
Настройки пакетного фильтра, которые выполняются при помощи утлиты ipfw действительны только до перезагрузки. Для того, чтобы сделать их постоянными, необходимо чтобы фильтрация настраивалась каждый раз при загрузке системы.

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

При запуске машины главный загрузочный скрипт /etc/rc.conf вызывает скрипт настройки сети /etc/rc.network [3]; он в свою очередь вызывает /etc/rc.firewall. Скрипт /etc/rc.firewall выполняет настройку брандмауэра.

В FreeBSD описано несколько типовых конфигураций брандмауэра. Типовая конфигурация выбирается с помощью переменной firewall_type.

OPEN
Брандмауэр пропускает все пакеты.

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

Брандмауэр

пропускает пакеты, которые отправляются хостом ${ip} в локальную сеть {net}:{mask};

разрешает все исходящие соединения с хоста;

разрешает все входящие соединения на 25 порт

запрещает все остальные входящие TCP соединения;

разрешает прохождение UDP пакетов по портам DNS (53) и NNTP (123).

все остальные пакеты рассматриваются правилом-по-умолчанию, которое определяется конфигурацией ядра

SIMPLE
Простеший брандмаэур, защищающий локальную сеть от проникновения из Интернета. Правила фильтрации точно такие же, как и в CLIENT, но

Есть поддержка natd. Выполняться передача IP-пакетов на divert-сокет демона natd, при условии что natd_enable=YES;

Выполняется защита от IP-спуфинга. Пакеты, которые имеют адреса предназначеные для использования внутри локальных сетей 10.x.x.x, 172.16.x.x-172.31.x.x, 192.168.x.x. (RFC 1918) не пропускаются по внешнему интерфейсу. Также удаляются пакеты из внешней сети, которые имеют адрес возврата из сети внутренней.


Адреса внутренней {inet}:{imask} и внешней {onet}:{omask} сети, а также адреса внутреннего ${iif} и внешнего ${oif} интерфейсов указываются в файле /etc/rc.firewall.

Значения ${ip}, ${net} и ${mask} следует вручную устанавливать в файле /etc/rc.firewall.

CLOSED
Разрешает только трафик через локальный интерфейс lo0. Прохождение остального трафика определяется правилом-по-умолчанию.


Брандмауэр в режиме CLOSED закрыт только в том случае, если правило-по-умолчанию установелно ядром в deny


UNKNOWN
Брандмауэр никак не настраивается. Будет он пропускать трафик или нет определяется конфигурацией ядра системы. Используется по умолчанию.

файл
Правила брандмауэра загружаются из внешнего файла. Имя файла определяется значением переменной firewall_type. Дополнительные аргументы ipfw могут быть переданы с помощью firewall_flags.

Файл должен содержать команды ipfw в том виде, в каком они указываются в его командной строке. Например:

add deny icmp from any to any
add deny ip from 1.2.3.4 to any
allow tcp from any to any established


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

Если нужно чтобы шлюз выполнял трансляцию адресов, в /etc/rc.conf следует указать natd_enable=YES. Это приведет к тому, что при загрузке автоматически будет запускаться демон natd. Нужно указать еще natd_interface, для того чтобы natd знал, какой интерфейс является внешним, и natd_flags="-f /etc/natd.conf", чтобы natd знал, откуда ему брать свою конфигурацию. Можно описать конфигурацию natd прямо в этой строке и не выносить ее во внешний файл.

natd_enable="YES"
natd_inteface="lnc0"
natd_flags="-f /etc/natd.conf"

Изменеия конфигурации фильтра пакетов вступят в силу после перезагрузки компьютера. Чтобы они стали действительными прямо сейчас можно выполнить [4]:

# sh /etc/rc.conf /etc/rc.firewall

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

Таблица 7. Некоторые параметры /etc/rc.conf

firewall_enable (YES|NO)
Запускать или нет скрипт настройки брандмауэра /etc/rc.firewall

firewall_script (/etc/rc.firewall)
Скрипт, который запускается для настройки брандмаэра

firewall_type (OPEN| CLIENT| SIMPLE| CLOSED| UNKNOWN| файл )
Типа брандмауэра. Определяет, как будет выглядеть таблица фильтрации пакетов.

firewall_quiet (YES|NO)
Нужно ли выполнять все операции в молчаливом режиме. При указании YES ipfw вызывается с ключом -q.

firewall_logging (YES|NO)
Разрешить журнализирование. Включает значение net.inet.ip.fw.verbose в 1.

firewall_flags
Список флагов, которые передаются ipfw при вызове

natd_program (/sbin/natd)
Программа, которая используется в качестве natd. По умолчанию: /sbin/natd

natd_enable (YES|NO)
Включить поддержку natd. Это приводит к тому, что запускается демон natd и для брандмауэра типа SIMPLE и OPEN автоматически настраивается divert на natd для всех пакетов, проходящих через внешний интерфейс (natd_interface).

natd_interface
Интерфейс, адресом которого маскируются исходящие пакеты. Все пакеты, проходящие через этот интерфейс автоматически пеередаются natd если брандмауэр настроен как SIMPLE или OPEN.

natd_flags
Дополнительные флаги, которые передаются natd. Есть смысл задавать здесь -f /etc/natd.conf и описывать конфигурацию демона в файле /etc/natd.conf.

Обновлено: 12.03.2015