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

Автор: | 08/07/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