FreeBSD: начальная настройка IPFW

Автор: | 07/08/2012

Сам 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