Каждый знает, что находясь в Интернете необходимо использовать пакетный фильтр. Однако, не каждый осведомлен о том, что создать систему фильтрации для FreeBSD (или PC-BSD или DesktopBSD) - весьма простое занятие.
Программное обеспечение
Как все BSD, FreeBSD никогда не дооценивала аспект безопасности. Она предлагает несколько встроенных систем сетевой защиты и мы можем выбрать из: ipfw, ipf и pf. Я использую pf, потому что этот пакетный фильтр встроен во все BSD системы, включая OpenBSD, NetBSD и DragonFly BSD.
Я также рекомендую к использованию GUI утилиту
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=8843mtu 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"