Конфигурирование ipfilter в FreeBSD


Начальная настройка

Для использования ipf в FreeBSD серьезной модификации требуют только два файла - rc.conf и rc.network:

Изменения, вносимые в rc.conf:

ipfilter=YES; # NO для выключения
ipfilter_rules=/etc/ipf.rc # файл с правилами
ipmon_flags=-Ds # NO для отключения логирования
ipnat=YES
ipnat_rules=/etc/ipnat.rc

Изменения, вносимые в rc.network:

В файле rc.network я добавил следующий код в подпрограмме network_pass_1 () перед конфигурацией интерфейсов:

# Configure the IP filter before configuring network interfaces
if [ X"${ipfilter}" = X"YES" -a -f "${ipfilter_rules}" ]; then
echo ``configuring IP filter''
echo ``ipf -Fa -f ${ipfilter_rules} -E''
ipf -Fa -f ${ipfilter_rules} -E
else
ipfilter=NO
fi
...

В подпрограмме network_pass_2 () я добавил этот код:
...
# insert after named
if [ X"${ipfilter}" = X"YES" -a X"${ipmon_flags}" != X"NO" ]; then
echo 'starting ipmon';
ipmon ${ipmon_flags}
fi

Я также добавил код для ipnat в network_pass_3 () после оригинального natd-кода:

# CHG-BEGIN: ipnat out of the ipfilter package
# Configure NAT after configuring network interfaces
if [ "X${ipnat}" = X"YES" -a "X${ipfilter}" = X"YES" ]; then
if [ -f "${ipnat_rules}" ]; then
echo 'configuring NAT'
ipnat -CF -f ${ipnat_rules}
else
echo 'ipnat: file ${ipnat_rules} not found.'
fi
else
echo 'no network adress translation.'
ipnat=NO
fi
# CHG-END: ipnat out of the ipfilter package

Чтобы получить основные правила фильтрации, я выполнил:

# mkfilters > /etc/ipf.rc

В результате мы получаем следующие правила:

#
block in log quick from any with ipopts
block in log quick proto tcp from any to any with short
pass out on ed1 all head 150
block out from 127.0.0.0/8 to any group 150
block out from any to 127.0.0.0/8 group 150
block out from any to 192.168.1.110/32 group 150
pass in on ed1 all head 100
block in from 127.0.0.0/8 to any group 100
block in from 192.168.1.110/32 to any group 100
block in from 192.168.0.1/0xffffff00 to any group 100
pass out on fxp0 all head 250
block out from 127.0.0.0/8 to any group 250
block out from any to 127.0.0.0/8 group 250
block out from any to 192.168.0.1/32 group 250
pass in on fxp0 all head 200
block in from 127.0.0.0/8 to any group 200
block in from 192.168.0.1 to any group 200
block in from 192.168.1.110/0xffffff00 to any group 200

Создаем правила фильтрации

Исходные данные:

На моей машине я использую интерфейс fxp0 для внутренней сети. Внутренняя сеть - сеть класса C в диапазоне 192.168.0.x с сетевой маской 255.255.255.0. Внешняя сеть - Интернет - подключен через ISDN - роутер с вызовом по требованию. Так же на него возложены функции nat. Мой сервер FreeBSD подключен к этому ISDN - роутеру через интерфейс ed1 с ip-адресом 192.168.1.110. ISDN - роутер имеет внутренний ip-адрес 192.168.1.111, который будет оттранслирован в адрес, динамически назначаемый провайдером в течение сеанса связи. Я использую ipnat, входящий в состав ipfilter, для переадресации пакетов, предназначенный для Интернета к внешнему интерфейсу. В этой конфигурации трансляция сетевого адреса происходит дважды; сначала на сервере и затем в ISDN - роутере.

Как конфигурировать ipnat?

Сперва надо определиться, какую политику безопасности мы выберем:

Разрешено все, что не запрещено
Запрещено все, что не разрешено

Разрешающая позиция легко осуществима. Если Вы не даете никаких правил ipfilter, все у вас так и будет. Правила, сгенерированные сценарием mkfilters основаны на немного расширенной разрешающей позиции. Разрешающая позиция крайне небезопасна.

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

Вот несколько полезных советов по генерации правил:

Группируйте правила
Не добавляйте правила для нескольких сервисов одновременно.
Ведите журнал добавляемых правил.
После добавления правила, действительно проверьте!
Проверьте что трафик приходит и уходит.
Проверите, что пакет действительно обрабатывается тем правилом, которое Вы добавили а не другим.
Сделайте список обслуживания, которое Вы разрешаете, включающий порт,протокол и тип сервиса; например уходящий трафик http, порт 80/tcp.

Правила фильтрации для разрешающей политики:

Основные правила были добавлены при вызове mkfilters. Также можно добавить несколько правил, предотвращающих спуфинг.

Итак, окончательный набор правил выглядит так:

# сгенерировано mkfilters
block in log quick from any with ipopts
block in log quick proto tcp from any to any with short
block in log quick all with opt lsrr
block in log quick all with opt ssrr
#-------------------------------------------------------
# разрешаем loopback
pass in quick on lo0 all
pass out quick on lo0 all
#-------------------------------------------------------
pass out on ed1 all head 150
block out from 127.0.0.0/8 to any group 150
block out from any to 127.0.0.0/8 group 150
block out from any to 192.168.1.110/32 group 150
#-------------------------------------------------------
pass in on ed1 all head 100
block in from 127.0.0.0/8 to any group 100
block in from 192.168.1.110/32 to any group 100
block in from 192.168.0.1/24 to any group 100
#-------------------------------------------------------
pass out on fxp0 all head 250
block out from 127.0.0.0/8 to any group 250
block out from any to 127.0.0.0/8 group 250
block out from any to 192.168.0.1/32 group 250
#-------------------------------------------------------
pass in on fxp0 all head 200
block in from 127.0.0.0/8 to any group 200
block in from 192.168.0.1/32 to any group 200
block in from 192.168.1.110/24 to any group 200

Правила фильтрации для запрещающей политики:

Разрешаемые сервисы:

Сначала мы полностью доверяем внутренним пользователям, ограничивать их будем "на лету".

Составим список сервисов, которые сразу разрешаем:

DNS:
Исходящий DNS на порту 53/udp первичного DNS-сервера от провайдера
Исходящий DNS на порту 53/tcp вторичного DNS-сервера от провайдера

http:
Принимаем исходящие http-запросы на порт 80/tcp

smtp:
Исходящий smtp на порту 25/tcp для возможности отсылки писем sendmail или postfix2

pop3:
Исходящий pop3 на порту 110/tcp для возможности получения писем через fetchmail

ftp:
Исходящий ftp на портах 20/tcp/udp
Входящий ftp-данных на портах 21/tcp/udp

Пишем правила:

#--------------------------------------------------------------------------
# ed1 - external interface
# fxp0 - internal interface
#--------------------------------------------------------------------------
# First, nasty pakets which we don't want near us at all
# pakets which are too short to be real except echo replies on lo0
pass in log quick on lo0 proto icmp from 127.0.0.1/8 to 127.0.0.1/8 with short
block in log quick all with short
block in log quick all with opt lsrr
block in log quick all with opt ssrr
#--------------------------------------------------------------------------
# loopback packets left unmolested
pass in log quick on lo0 all
pass out log quick on lo0 all
#--------------------------------------------------------------------------
# Group setup:
# 100 incoming ed1
# 150 outgoing ed1
# 200 incoming fxp0
# 250 outgoing fxp0
#--------------------------------------------------------------------------
block in log body on ed1 all head 100
block out log body on ed1 all head 150
#--------------------------------------------------------------------------
block in log on fxp0 all head 200
block out log on fxp0 all head 250
#--------------------------------------------------------------------------
# incoming ed1 traffic - group 100
# 1) prevent localhost spoofing
block in log quick from 127.0.0.1/32 to 192.168.0.0/24 group 100
block in log quick from 127.0.0.1/32 to 192.168.1.0/24 group 100
block in log quick from any to 127.0.0.1/8 group 100
#--------------------------------------------------------------------------
# 2) deny pakets which should not be seen on th internet (paranoid)
block in log quick from 10.0.0.0/8 to any group 100
block in log quick from any to 10.0.0.0/8 group 100
block in log quick from 172.16.0.0/16 to any group 100
block in log quick from any to 172.16.0.0/16 group 100
block in log quick from 192.168.0.0/16 to any group 100
block in log from any to 192.168.0.0/16 group 100
# 3) implement policy
# allow incoming ftp-data
pass in log quick proto tcp/udp from any to 192.168.1.1/24 keep state group 100
# if nothing applies, block and return icmp-replies (unreachable and rst)
block return-icmp(net-unr) in proto udp from any to any group 100
block return-rst in log proto tcp from any to any group 100
#--------------------------------------------------------------------------
# outgoing ed1 traffic - group 150
# Setup outgoing DNS
pass out log quick proto tcp/udp from any to 212.40.0.10 port = 53 keep state group 150
pass out log quick proto tcp/udp from any to 212.40.5.50 port = 53 keep state group 150
# allow outgoing http-service
pass out log quick proto tcp from any to any port = 80 flags S/SA keep state keep frags group 150
# allow outgoing smtp traffic
pass out log quick proto tcp from 192.168.1.1/24 to any port = 25 flags S/SA keep state group 150
# allow outgoing pop3 traffic
pass out log quick proto tcp from 192.168.1.1/24 to any port = 110 flags S/SA keep state group 150
# allow outgoing ftp traffic
pass out log quick proto tcp/udp from 192.168.1.1/24 to any port = ftp keep state group 150
pass out log quick proto icmp from any to any keep state keep frags group 150
#--------------------------------------------------------------------------
# incoming traffic on fxp0 - group 200
#--------------------------------------------------------------------------
# 1) prevent localhost spoofing
block in log quick from 127.0.0.0/8 to any group 200
block in log quick from 192.168.0.1/32 to any group 200
block in log quick from 192.168.1.110/24 to any group 200
pass in log quick from any to any group 200
#--------------------------------------------------------------------------
# outgoing traffic on fxp0 - group 250
#--------------------------------------------------------------------------
block out log quick from 127.0.0.0/8 to any group 250
block out quick from any to 127.0.0.0/8 group 250
block out log quick from any to 192.168.0.1/32 group 250
pass out log quick from any to nay group 250
#--------------------------------------------------------------------------

Эти правила могут служить отправной точкой для дополнительных и более разработанных правил.

Оригинал статьи:http://www.free-x.ch/pub/ipf-conf-en.html Перевод: Irish

Обновлено: 12.03.2015