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 (которое все запрещает) не будет работать (до этого правила даже не дойдет, т.к. первое сработало).