Брандмауэр на рабочей станции FreeBSD


Продолжение популярной серии статей Дрю Лавинь. В данной статье рассмотрена работа утилиты FwBuilder, которая облегчает написание правил для пакетного фильтра. Для начального круга читателей. Original by Dru Lavigne

Перевод: Сгибнев Михаил

Каждый знает, что находясь в Интернете необходимо использовать пакетный фильтр. Однако, не каждый осведомлен о том, что создать систему фильтрации для FreeBSD (или PC-BSD или DesktopBSD) - весьма простое занятие.


Программное обеспечение
Как все BSD, FreeBSD никогда не дооценивала аспект безопасности. Она предлагает несколько встроенных систем сетевой защиты и мы можем выбрать из: ipfw, ipf и pf. Я использую pf, потому что этот пакетный фильтр встроен во все BSD системы, включая OpenBSD, NetBSD и DragonFly BSD.

Я также рекомендую к использованию GUI утилиту fwbuilder. Мы будем использовать ее для FreeBSD, хотя есть версии для Linux, Mac OS X и Windows XP, она поддерживает пакетные фильтры iptables, ipfilter, pf и ipfw.

pf идет в комплекте поставки FreeBSD, но убедитесь, что он загружен в вашей системе, выполнив следующую команду с привилегиями пользователя root:

# kldload pf.ko

Если вам вернулась командная строка без ошибок, то это значит, что вы только что загрузили модуль вручную. Если вы выключаете свой компьютер, то добавьте к /etc/rc.conf следущую строку:

pf_enable="YES"

Если вы получите ошибку:

kldload: can't load pf.ko: File exists

то ваша система уже сконфигурирована на работу с PF.
Установка
Устанавливаем fwbuilder:

# pkg_add -r fwbuilder
# rehash
# fwbuilder

При первом запуске откроется окно приветствия и будет предложено открыть новый файл проекта или уже существующий. Выберите "Create new project" и введите его имя, при этом к файлу будет добавлено расширение .fwb. Для продолжения нажмите "Next".

Следующий экран предлагает две возможности:
Активировать Revision Control system для этого файла. Впрочем, вы это можете сделать и позже.
Указать открывать этот файл при следующем запуске утилиты. Эту функцию также можно активировать позднее из меню настроек.
Revision control - очень хорошая вещь. Каждый раз после запуска fwbuilder, делается копия существующего проекта (т.е. вашей последней сессии). В результате, мы можем отслеживать хронологию сеансов.Что еще более важно - вы всегда можете откатиться на предыдущую конфигурацию. Я рекомендую выбрать обе опции, затем нажать Finish.
Конфигурирование Firewall Object
Обратимся к интерфейсу программы, который разделен на две основных части. Левая часть содержит дерево обьектов, в правой находятся правила пакетного фильтра (после того, как вы определите объекты). Использование объектов дает возможность с легкостью просматривать сети, хосты и сервисы, позволяя вставлять их в правила пакетного фильтра.

Первым созданным вами объектом должен быть сам брандмауэр. Выберите иконку "New Object" и в выпадающем списке укажите "New Firewall", после чего дайте ему имя (в моем случае - my_firewall). Далее, в качестве типа пакетного фильтра укажите PF и щелкните "Next". В качестве значения по умолчанию установите "Configure interfaces manually" и нажмите "Next".

Обратите внимание на то, что если вы не увидели опций Netmask и MAC, значит вы запустили fwbuilder не с правами root. Только root может создавать объекты и правила.

Убедитесь, что добавлили всю информацию для сетевых карт вашего компьютера, включая loopback. Если вы защищаете свою рабочую станцию, то скорее всего, у вас всего одна сетевая карта. Если же вы хотите NAT-ить другой компьютер или домашнюю сеть, то вам понадобится две сетевые карты.

Если ваш провайдер назначает адрес по DHCP, то выберите опцию "Dynamic address", в противном случае введите свой IP адрес и маску сети.

Для того, чтобы определить имена интерфейсов и их адреса введите следущую команду:

# ifconfig
xl0: flags=8843 mtu 1500
options=9
inet 192.168.2.49 netmask 0xffffff00 broadcast 192.168.2.255
ether 00:04:75:ee:e0:21
media: Ethernet autoselect (100baseTX )
status: active
lo0: flags=8049 mtu 16384
inet 127.0.0.1 netmask 0xff000000

Используя мои данные, в окне "New Firewall" я ввожу:

Name: xl0
Address: (greyed out because I checked Dynamic address)
Netmask: (greyed out because I checked Dynamic address)
MAC: 00:04:75:ee:e0:21
Label: external

Name: lo0
Address: 127.0.0.1
Netmask: 255.0.0.0
MAC: (leave empty)
Label: loopback

Указывая имена сетевых карт, стоит выбрать "external" для внешней и "internal" для карты, смотрящей в локальную сеть. Если вам необходимо указать маску подсети, то ее необходимо преобразовать шестнадцатеричное число (например 0xffffff00) в десятичное. 0x можно проигнорировать, так как это просто признак шестнадцатеричного числа. Для преобразования, разбейте число на четыре пары: ff ff ff 00. ff - самое простое, это 255 в десятичной системе, 00 - соответственно 0. Рекомендую воспользоваться следущей таблицей: Hex Decimal
80 128
c0 192
e0 224
f0 240
f8 248
fc 252
fe 254
Пользователям модемов стоит обратить внимание на то, что их интерфейсы будут называться ppp0 или tun0. Для того, чтобы определить свой адрес, воспользуйтесь утилитой ifconfig, в то время, когда находитесь on-line.

После того, как вы ввели данные о сетевой карте, нажмите "Add" и повторите операцию для всех остальных карт, после чего нажмите "Finish". Если вы сейчас посмотрите на дерево объектов, то обнаружите, что появились записи для брандмауэра и сетевых карт.

Теперь необходимо отметить одну из сетевых карт как интерфейс управления. Для рабочей станции я использую loopback. Вам необходимо дважды щелкнуть на соответствующем значке, после чего установить флаг "Management interface".
Написание простейшего набора правил
Теперь у нас есть все необходимое для создания простейшей системы сетевой защиты, которая блокирует все обращения к нашей машине извне, при этом разрешая исходящие от нас запросы.

Щелкните на меню "Rules" и выберите "Insert Rule" (Рис. 2). Обратите внимание на то, что по умолчанию запрещена передача данных от любого источника к любому адресу назначения используя любой сервис TCP/UDP. Вам необходимо скопировать ваш обьект "firewall" в поле источника, после чего сменить "Deny" в поле Action на "Accept". В поле "Options" укажите Logging Off, если не хотите фиксировать каждый пропущенный пакет.

Я рекомендую всегда указывать комментарий к правилам, что-бы не забыть, для чего оно предназначено. Я указала:

allow my computer to access the internet

Одного этого правила достаточно, чтобы получить рабочую систему пакетной фильтрации. При желании, тем же порядком, можно добавить еще одно правило со следующим комментарием:

deny all other traffic

Если нет такой нужды, отключите логирование пакетов.

Обратите внимание на то, что записывать само правило нет необходимости, так как PF по умолчанию запрещает все, что не разрешено.

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

Сначала, вы должны сконфигурировать sshd, чтобы root мог подключаться и устанавливать правила пакетного фильтра. По умолчанию, FreeBSD не позволяет root заходить в систему по ssh. Исправить это положение можно введя команду:

# echo "PermitRootLogin yes" >> /etc/ssh/sshd_config

Не волнуйтесь, после установки правил никто боьлше не войдет в вашу систему по ssh. Далее, нам необходимо перезапустить sshd:

# /etc/rc.d/sshd reload
Reloading sshd config files.

Если вы увидите ошибку:

sshd not running? (check /var/run/sshd.pid).

Используйте эту команду:

# /etc/rc.d/sshd start
Starting sshd.

Проверим статус sshd:

# /etc/rc.d/sshd status
sshd is running as pid 5467.

Далее, выберем пункт "Install" из меню "Rules". Вы должны увидеть следущее сообщение:

Some objects have been modified since
you compiled the policy last time.
Do you want to recompile it before you install?

После того, как все вышеперечисленные действия будут выполнены, щелкните кнопкой "Compile". Должно открыться текстовое поле и последней строкой в нем, при успешном стечении обстоятельств, будет "Policy compiled successfully." Нажмите кнопку "Install". Когда появится окно с просьбой об аутентификации, введите пароль и логин пользователя root. Далее появится сообщение о новом ключе RSA:

You are connecting to the firewall 'my_firewall'
for the first time. It has provided you its
identification in a form of its host public key. The
fingerprint of the host public key is: "
b6:76:30:aa:01:27:64:48:3b:18:28:18:5b:c9:ae:e4"
You can save the host key to the local database
by pressing YES, or you can cancel connection
by pressing NO. You should press YES only if
you are sure you are really connected to the
firewall 'my_firewall'.

Да, с эим предложением стоит согласиться, поскольку вы соединяетесь с вашим собственным брандмауэром. Для того, чтобы в дальнейшем вы могла проверить отпечаток удаленной FreeBSD системы, выполните команду:

# ssh-keygen -l -f /etc/ssh/ssh_host_dsa_key.pub
1024 b6:76:30:aa:01:27:64:48:3b:18:28:18:5b:c9:ae:e4

После того, как вы согласитесь с предложением системы, откроется текстовое окно (мое было минимизировано). В нем вы увидите предупреждение об отсутствии поддержки ALTQ, если вы не используете его, то можете не беспокоиться и просто закрыть окно. Брандмауэр теперь работает.
Контроль
Для контроля за работой пакетного фильтра используйте команду pfctl. Например, для просмотра текщего набора правил укажите флаг "-s":

# pfctl -s rules
No ALTQ support in kernel
ALTQ related functions disabled
pass out quick inet from (xl0) to any keep state label "RULE 0 -- ACCEPT "
block drop in quick inet all label "RULE 1 -- DROP "
block drop out quick inet all label "RULE 1 -- DROP "
block drop in quick inet all label "RULE 10000 -- DROP "
block drop out quick inet all label "RULE 10000 -- DROP "

Если вы будете сравнивать увиденное с тем, что делали в fwbuilder, то вам необходимо смотреть на правила 0 и 1, RULE 10000 - запрещающее правило, установленное по умолчанию.

Для того, чтобы остановить брандмауэр, используйте команду:

# pfctl -d

Для перезапуска, укажите используемый файл набора правил. Обычно он храниться в каталоге /etc и имеет имя вашего брандмауэра, в моем случае это /etc/my_firewall.conf. Для запуска пакетного фильтра используется команда:

# pfctl -e /etc/my_firewall.conf

Улучшение правил
Для того, чтобы вы могли добавлять другие правила, необходимо разрешить их загрузку в пакетный фильтр. Выделите правило 0, после чего в меню "Rules" выберите "Insert Rule". Поскольку для управления пакетным фильтром необходим доступ по ssh к интерфейсу loopback, то правило будет выглядеть следующим образом:

Source: my_firewall
Destination: my_firewall:lo0:ip (you'll find this if you click the +
by your loopback object)

Service: ssh
Action: Accept
Options: Logging On
Comment: allow firewall to install policy

Нам необходимо добавить обьект "ssh" в пункт "Services". Правой кнопкой мыши надо щелкнуть на "TCP" и выбрать "New TCP Service". Затем добавить имя сервиса и порт, после чего нажать "Apply Changes". После этого ситуация обретет вид, отображенный на Рис. 3:

Перед установкой нового правила необходимо временно остановить работу брандауэра, учите, что в этот момент будут приниматься луюбые подключения извне:

# pfctl -d

Устанавливаем правила, после чего просмотрим текущий список правил:

# pfctl -s rules

В моем случае, новое правило выглядит как:

pass out log quick inet proto tcp from (xl0) to 127.0.0.1 port = ssh keep
state label "RULE 0 -- ACCEPT "

Обновлено: 12.03.2015