Сам IPFW уже включен в FreeBSD и нет нужды его устанавливать отдельно.
Есть два варианта запуска IPFW – через запись в файле /etc/rc.conf:
firewall_enable=”YES”
Либо – пересобрать ядро с поддержкой модуля IPFW. как правило, достаточно первого способа, если только не потребуется поддержка NAT.
При запуске можно указать несколько опций IPFW. Первый вариант – использовать настройки, предлагаемые в файле /etc/rc.firewall. Для это – указываем тип нашего фаервола:
open – пропускаем весь траффик
client – будет защищать только эту машину
simple – защита всей сети
closed – полностью выключает весть IP траффик; исключая loopback интерфейс
В таком случае, опция в /etc/rc.conf будет выглядеть, например, так:
firewall_type=”open“
Более правильный вариант – переопределить файл настроек IPFW, и создать собственный набор правил.
Для этого – указываем опцию:
firewall_script=”/etc/ipfw.rules“
Где /etc/ipfw.rules – наш созданный файл с правилами.
Дополнительно – включим опцию, которая позволит вести логи IPFW, например – кол-во отброшенных (DROP или DENY) пакетов из правил в /etc/ipfw.rules:
firewall_logging=”YES”
Итого, в файл /etc/rc.conf добавляем три строки:
firewall_enable=”YES”
firewall_script=”/etc/ipfw.rules”
firewall_logging=”YES”
Перед запуском IPFW – создадим файл с правилами. В примере будет указан файл для фаервола “открытого” типа, т.е. – разрешить все, что не запрещено.
#Сбросить все правила, перед загрузкой новых
ipfw -q -f flush
#Префикс для создания новых правил
cmd=”ipfw -q add”
#Наш интерфейс “в мир”
pif=”eth0″
#Разрешаем весь трафик по loopback
$cmd 00010 allow all from any to any via lo0
#Разрешить SSH-соединение только с определённого IP, тут просто для примера
$cmd 00020 allow tcp from 82.144.220.27 to me 22 in via $pif
#С любых других IP – запрещаем и записываем в лог:
$cmd 00030 deny log tcp from any to me 22 in via $pif
#Закрываем доступ “снаружи” к некоторым сервисам, в этом случае – к MySQL
$cmd 00040 deny log all from any to me 3306 via $pif
#Разрешаем определенный ICMP-трафик из мира к нам
$cmd 0050 allow icmp from any to me in via $pif icmptype 3,8,12
#Разрешаем определенный ICMP-трафик от нас в мир
$cmd 00060 allow icmp from me to any out via $pif icmptype 0,3,4,11,12
#Запрещаем прочий ICMP-трафик
$cmd 00070 deny log icmp from any to me in via $pif icmptype 5,9,10,13,15,17
#Запрещаем фрагментированные ICMP-пакеты
$cmd 00080 add deny log icmp from any to any frag
#Запрещаем трафик с IP-адресами локальных сетей RFC 1918
$cmd 00090 deny log all from 10.0.0.0/8 to any in via $pif
$cmd 001000 deny log all from 172.16.0.0/12 to any in via $pif
$cmd 001100 deny log all from 192.68.0.0/16 to any in via $pif
$cmd 001200 deny log all from 0.0.0.0/8 to any in via $pif
#Запрещаем передачу identd/auth пакетов
$cmd 001300 deny tcp log from any to me 113 in via $pif
#В конце – разрешаем весь остальной трафик
$cmd 10000 allow all from any to any
Собственно, на этом простую настройку IPFW можно считать завершённой. По поводу “определенный ICMP-трафик” можно прочитать тут>>>.
Что бы посмотреть все правила, заданные для фаервола – выполните:
# ipfw list
Обратите внимание, что это команда последним правилом всегда выводит:
65535 deny ip from any to any
Это правило по-умолчанию, даже если оно не задано в /etc/ipfw.rules. Но, т.к. наше правило $cmd 10000 находится “выше” 68535 – то все пакеты, прошедшие проверку, все-равно будут пропущены.
Что бы посмотреть то же самое, но со счетчиком срабатываний (пакеты) – выполните:
# ipfw show
Ну и пример записей из лога о срабатываниях правила DENY:
# cat /var/log/security
Aug 2 15:24:59 akira newsyslog[669]: logfile first created
Aug 7 18:40:31 akira kernel: ipfw: 30 Deny TCP 82.144.220.27:54973 77.120.106.40:22 in via em0
Aug 7 18:40:31 akira kernel: ipfw: 40 Deny TCP 82.144.220.27:57837 77.120.106.40:3306 in via em0
Aug 7 18:40:32 akira kernel: ipfw: 40 Deny TCP 82.144.220.27:53055 77.120.106.40:3306 in via em0