1 февр. 2011 г.

Учебник IPFW

IPFW - Является межсетевым экраном (firewall) для FreeBSD и изначально придуман для этой ОС, но при этом был перенесен для Линукс и Виндовс.

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

Существуют два основных режима брендмауэра: включающий и исключающий (открытый\экслюзивный).
Исключающий пропускает все пакеты кроме указанных в правилах запрета. А включающий наоборот пропускает только те пакеты которые разрешены для прохождения.

Правила для бренмауэра можно задавать командами в консоли, но при этом настройки нужно вводить после каждой загрузки системы, или записать правила фильтрования пакетов в файл (firewall_type=«filename»). Третий вариант это создать ссылку на скрипт с помощью параметра firewall_script так же в rc.conf.


Включение

Для включения модуля ipwf в ядро (то есть для вклчения нашего брендмауэра) впишите в rc.conf строку
firewall_enable="YES"

Так же можно на ходу подключить этот модуль ядра командой:
kldload ipfw

Далее при загрузки системы появится сообщение:
ipfw2 initialized, divert disabled, rule-based forwarding disabled, default to deny, logging disabled

Для ведения лог файлов в /etc/sysctl.conf наберите
net.inet.ip.fw.verbose = 1 # 1н означает включить
net.inet.ip.fw.verbose_limit=5 # Цифра в значении задает уровень детализации логов

Для выбора одного из режимов брандмауэра наберите в /etc/rc.conf

firewall_type=«open»

Возможные значения этого параметра:

open - пропускать весь трафик. Режим исключающий (открытый)
client - защищать только эту машину
simple - защищать всю сеть
closed - блокировать любой IP-трафик за исключением lo-интерфейса
UNKNOWN - запретить использование правил фаервола
filename - полный путь к файлу, содержащему правила фаервола. В файл просто вписываются команды каждая на своей строчке

Примечание:
Если firewall_type установлен в client или simple, правила по умолчанию находящиеся в /etc/rc.firewall должны быть пересмотрены для подгонки под конфигурацию данного компьютера.

Команды IPFW

Приведем команды для вызова из командной строки.
ipfw list - Отображение списка всех правил

ipfw –t list - Для отображения списка правил со временными метками, показывающим время последнего применения каждого правила

ipfw –a list - Для вывода полной статистики

ipfw –d list - Отобразить не только статические, но и динамические правила

ipfw –d –e list - Можно также отобразить устаревшие динамические правила

ipfw zero - Стереть счетчики

ipfw show - Показывает правила и счётчики пакетов, которые совпали с этими правилами

ipfw delete - Удаляет правило с указанным номером
 

Синтаксис команды

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

CMD RULE_NUMBER ACTION LOGGING SELECTION STATEFULL

Где группа:

CMD - Команды. add для добавления правила.

RULE_NUMBER - Каждое правило должно иметь порядковый номер. Если номер не задан, то берется последний номер + 100

ACTION: - allow, pass, accept, permit (они синонимы) - Разрешает дальнейшее прохождение пакета. Т.е. обработка
в нашем брендмауре заканчивается. Как понимаете такое правило вкл. в включающем типе брендмауэра

- unreach <тип> - Запрещает движение пакета. Отправитель уведомляется. Уведомление задается в <тип>:
net - сеть адресата не доступна
host - адресат не доступен
needfrag - необходима фрагментация пакета
host-unknown - нет такого адреса

Этот ответ идет по протоколу ICMP

- deny, drop - Пакеты удовлетворяющего правилу запрещаются, без уведомления отправителя

LOGGING - log или logamount

Если пакет удовлетворяет правилу, содержащему ключевое слово log, будет сгенерировано сообщение для syslogd от имени SECURITY. Запись в лог осуществляется только в том случае, если количество пакетов, удовлетворяющих данному правилу, превысит значение параметра logamount. Если значение параметра logamount не задано, он устанавливается равным значению переменной sysct net.inet.fw.verbose_limit. В обоих случаях установление значения 0 соответствует бесконечному значению logamount. В случае достижения предельного значения, ведение логов может быть возобновлено сбросом счетчиков логов и пакетов для этого правила (см. команду ipfw reset log).

Обратите внимание: Занесение данных пакета в лог осуществляется сразу после установления соответствия пакета правилу, до того, как будет исполнено предусмотренное правилом действие (accept, deny). Поэтому пользователю предоставляется полная свобода выбора пакетов, заносимых в лог.

SELECTION

udp | tcp | icmp - Обозначение протокола для которого осуществляется правило.
Например: udp | tcp | icmp - полный список в /etc/protocols. Возможно значение all.

from src to dst (с англ. from - откуда, to - куда) - опции принимаемые к IP адресам. IP адреса как понимаете вписываются вместо слов src и dst. Обязательно задавать как отправителя так и получателя. IP можно заменить спец. словами: any - любой IP, me -соотвествует адресам адресам интерфейсам сетевых интерфейсов.
Так же можно указать порт, для протоколов их поддерживаемых. Он пишет через пробел после этих правил.
Пример:
from any to me
from any to 192.168.0.11
from any to any 80

in | out - in указывает на входящий пакет. out на исходящий. Один из этих опций должна присуствовать.

via - Указывает на пакеты проходящие на интерфейс . Ну вы уже наверное догадались, что нужно заменит на имя интерфейса.

setup - Это обязательное ключевое слово, которое обозначает начало просьбе сессии для пакетов TCP.

keep-state - Обязательное ключевое слово. После совпадения файрволл создаст динамическое правило, чье поведение по умолчанию состоит в том, что бы было совпадение двунаправленного траффика между IP адресом или портом источника и приемника по тому же самому протоколу

limit {src-addr | src-port | dst-addr | dst-port} - Фаервол будет ограничивать количество одновременных соединений с одинаковыми IP-адресами отправителя (src-addr) и получателя (dst-port), использующие одинаковые номера портов отправителя (src-port) и получателя (dst-port). Могут быть заданы одна или более пар адрес-порт. Атрибуты limit и keep-state не могут быть использованы в одном правиле. Атрибут limit вызывает все те же функции, что и keep-state, а также некоторые специфичные.

STATEFUL:

Следующее правило (check-state) проводит анализ при осуществление двунаправленного обмена сообщениями. check-state указывает в какой момент времени нужно проверить для данного пакета сессию которая создается при двунаправленном обмене пакетами, между получателем и отправителем. Проверка осуществляется в таблице динамических правил.
Примечание: Сессия всегда создается между получателем и отправителем при двунаправленном обмене.

Протоколирование: Для включение ведения логов, нужно указывать в правилах о том, что данное правило нужно протоколировать. Все сообщения о протоколируемых пакетах записываются по умолчанию в файл /var/log/security. Для протоколирования пишем слово -log.
 

Примечания

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

Выше писалось, что у правил IPFW есть номера, так вот в зависимости от установленного типа (включающий или исключающий) будет создано постоянное правило под номером 65535 (этот номер максимальный). Под этим номером и будет располагать правило которое будет выполняться в последнею очередь и в нем будет записано - пропускать все пакеты или запрещать все пакеты в зависимости от типа брендмауэра.

Для «включающего» типа нужно разрешать даже пакеты на адрес 127.0.0.1 и т.п.

Если правила вписывают в файл то не нужно писать команду add.

Примеры

Пример файла с правилами для включающего типа фаервола:
00100 allow all from any to any via lo0
00101 deny all from any to 127.0.0.0/8
00102 deny all from 127.0.0.0/8 to any

00400 check-state

00600 allow tcp from any to any 80 out via bge0 setup keep-state
00601 allow tcp from any to any 25 out via bge0 setup keep-state

00605 allow udp from any to any 30 out via bge0 setup keep-state

00610 allow tcp from any to 196.124.43.21 53 out via bge0 setup keep-state
00611 allow udp from any to 196.124.43.21 53 out via bge0 keep-state

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

Правила 600-601 создают виртуальные правила (keep-state), пропускающие (allow) пакеты для соединений, которые инициированы (setup) вами (out via bge0). Они разрешают проход tcp пакетов по портам 80 и 25 (браузер и почта).

Правило 00605 разрешает проход udp пакетам по 30 порту, обратите внимание там нет опции setup.
Ну, а последние два правила позволяют проходить DNS запросам с сервера 196.124.43.21.
Данный пример запрещает все входящие пакеты, в том числе «пингующие» вас. Какие разрешены вы уже наверное поняли.

Приведем пару примеров из официального handbook для включающего типа брендмауэра.

Пример консольных команд:
Примечание:
Опция -q означет не выводить результат в консоль об успешности или нет данной операции.

Пример 2: Пропускание всего трафика:
00100 pass all from any to any

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

Комментариев нет:

Отправить комментарий