Многофункциональный программный маршрутизатор-брандмауэр pfSense разработан компанией Netgate на базе ОС FreeBSD.
pfSense распространяется в нескольких редакциях: программный Community Edition (CE), в виде аппаратного appliance NetGate. Для Community Edition доступна коммерческая поддержка по цене от $400 до $800 в год. В 2021 году запущен pfSense Plus Software, в пользу которого предполагается сфокусировать основные усилия по разработке новых функций.
pfSense имеет модульную архитектуру и свой пакетный менеджер. Основные функции: маршрутизация, в т.ч. динамическая, межсетевое экранирование, NAT, DHCP-сервер, балансировка нагрузки, VPN (включая OpenVPN и L2TP), dDNS, PPPoE, IDS, проксирование и другое. Поддерживается построение отказоустойчивого кластера. Есть встроенный мониторинг, журналирование и построение отчетов.
Многие организации и домашние офисы используют pfSense для подключения к интернет-ресурсам. При этом часто используется бесплатная редакция Community Edition без техподдержки.
Продукт развивается с 2004 года, на текущий момент достиг высокой зрелости и стабильности. Во многих случаях это позволяет использовать его бесплатную редакцию Community Edition без техподдержки.
Аппаратные требования
CE можно установить как на bare metal, так и в виртуальной машине. Аппаратные требования диктуются необходимыми скоростями сетевых интерфейсов — от минимальных 500 МГц/512 МиБ для 10 Мб/с. до многоядерного 2+ ГГц/2 ГиБ для 1 Гб/с.
Использование дополнительных функций и модулей требует увеличения количества ядер ЦПУ и объема ОЗУ. Для часто используемого подключения со скоростью 100 Мб/с. рекомендуется 1 ГГц/1 ГБ. Для более высоких скоростей также необходима шина PCIe, т.к. в противном случае ее предшественница будет узким местом.
Установка pfSense CE
Продемонстрируем установку, настройку и работу pfSense на примере виртуальной машины в облаке Selectel. В качестве стенда создадим лабораторию из двух машин: на одной (с двумя интерфейсами — внешним и внутренним) будет работать pfSense, на другой (с одним внутренним) — десктопный клиент.
pfSense является кастомным решением для облачной платформы Selectel, поэтому есть ряд неочевидных нюансов.
По состоянию на август 2021 года:
- В настройках установочного образа необходимо указывать Linux вместо «Другая» (в противном случае получим ошибку Internal error Invalid image metadata. Error: Field value other is invalid).
- Дистрибутив работает только с сетевыми дисками и не может установиться на сервер с локальным диском.
- Другой нюанс заключается в том, что невозможно совместить установку через образ в панели управления и выбор сразу двух сетевых интерфейсов.
Обходные пути — создание машины с двумя интерфейсами и подключение установочного ISO-образа через OpenStack CLI, либо установка с одним сетевым интерфейсом с последующим добавлением 2-го. Последний путь проще, им и пойдем.
Загрузка образа
На странице загрузки pfSense CE выбираем архитектуру AMD64 (64-bit) и тип образа DVD Image (ISO).

Выполняем проверку целостности загруженного архива и распаковываем его:

Значение контрольной суммы sha256 0266a16aa070cbea073fd4189a5a376d89c2d3e1dacc172c31f7e4e75b1db6bd смотрим на странице загрузки. В примере указана для актуальной на момент написания версии 2.5.2.
После этого создаем и загружаем образ в хранилище в панели управления, указав ОС Linux:

Установка и первоначальная настройка pfSense
В разделе серверы «Облачной платформы» нажимаем кнопку «Создать сервер» вверху справа (или в центре, если это 1-й). Выбираем минимальную произвольную конфигурацию — в тестовых целях этого достаточно, для остальных случаев системные требования указаны выше.

Сеть на данном этапе оставляем как «Новая приватная сеть» — она будет у нас внутренней, адрес 192.168.1.0/24. Присвоим имя int_net, DHCP — выключим. Настройка шлюза в данном случае ни на что не влияет, но убрать его невозможно.

После указания необходимых параметров нажимаем кнопку «Создать». Сервер конфигурируется и будет доступен через 30 секунд. Если вы случайно закрыли вкладку, где создавалась машина — не проблема, теперь сервер доступен в глобальном разделе «Серверы». Для взаимодействия с консолью сервера мы переходим в его карточку на вкладке «Серверы», далее открываем пункт «Консоль».

Читаем и соглашаемся с авторскими правами.

Выбор режима установки. На этом же этапе работы установщика можно задействовать и встроенный режим восстановления.

Консоль системы не будет видна рядовым пользователям, нет смысла менять локализацию — оставляем по умолчанию.

В зависимости от аппаратной архитектуры выбираем метод загрузки и разметки накопителя, для ВМ — BIOS.

Наблюдаем за процессом установки.

По окончании установки появится следующее окно.

Нажав кнопку Yes, мы попадем в оболочку (Shell). Здесь можно выполнить любые настройки системы вручную. После окончания настроек вернуться в программу установку можно, выполнив команду exit. Обычно на этом этапе ничего менять не требуется, нажимаем No.
Настройка сетей
Для нашей лаборатории понадобится одна внешняя и одна внутренняя сети — для этого нужно добавить второй интерфейс. Запускаем оболочку, нажав Shell.

И даем команду на выключение:
# poweroff
В реальной жизни при установке на своем сервере этот этап не потребуется.
На глобальной вкладке «Серверы» у виртуальной машины будет статус SHUTOFF.
Далее рассмотрим сценарий подключения к провайдеру по IP, где нам выдана сеть по маске /29 (минимально возможная на облачной платформе Selectel).
Переходим в глобальную панель «Сеть»->«Публичные подсети» и нажимаем «Создать подсеть».
В панели управления можно выбрать маски от /29 до /27. Если ваш провайдер предоставил сеть с маской /30, сценарий подключения и настройки будет аналогичным.
На этом этапе система выделит сеть (в примере — 94.26.250.176/29) и назначит шлюз по умолчанию (94.26.250.177). Он понадобится дальше при настройке WAN-интерфейса. В реальной жизни это будет адрес шлюза провайдера.
Добавим новую сеть к нашему серверу, «Серверы» -> «Порты» -> «Добавить порт» -> «Выберите сеть» -> «Добавить порт».

Система выделила адрес нашему серверу (94.26.250.178) — теперь у него, как и полагается настоящему интернет-шлюзу, два интерфейса — внешний, включенный в глобальную, и внутренний, включенный в нашу локальную сеть.

Поддержки VLAN в «Облачной платформе» Selectel нет, отказываемся и переходим к настройке интерфейсов.
Интерфейсом vtnet0 наш сервер смотрит внутрь сети, vtnet1 — наружу.

Для применения настроек и продолжения установки нажимаем клавишу y.

В консоли pfSense присвоим выданный ранее внешний адрес (WAN-интерфейс).

Пункт 2-Set Iface IP -> 1-WAN -> DHCP -> N -> Enter IP-Address -> Enter mask -> Enter gateway.

Следом система предложит изменить настройки IPv6. В нашем сценарии это не требуется, настройки не меняем.
Утвердительно отвечаем на вопрос «Do you want to revert to HTTP as the webConfigurator protocol?» и 3–4 секунды ожидаем применения конфигурации.

Проверяем доступность шлюза провайдера (эта возможность доступна в пункте 7).

После выбора пункта Ping host указываем адрес шлюза провайдера или, в нашей лаборатории, платформы.
Тестовый клиент
Следующим этапом добавим в нашу лабораторию тестовую машину (Ubuntu 18/1 vCPU/2 ГиБ RAM/8 ГиБ Storage). Она будет имитировать нашего пользователя и подключаться к интернет-ресурсам через pfSense. С нее же будем продолжать настройку pfSense.
От этой машины нам нужен только браузер. Возьмем готовый образ Ubuntu 18 и добавим туда графическую оболочку. Для доступа к репозиториям потребуется временно подключить машину ко внешней сети напрямую.

Нажимаем кнопку «Создать», секунд 15–20 ожидаем рождения сервера и подключаемся к его консоли.
Если при создании машины была использована внутренняя сеть (int_net), можно либо пересоздать машину полностью, либо удалить этот сетевой интерфейс и добавить внешний, после чего выполнить на машине.
Дополнительные функции
Функциональность pfSense расширяется большим количеством пакетов, доступных через пакетный менеджер, их несколько десятков, вот лишь некоторые:
- apcupsd — демон для связи с ИБП APC (ныне Schneider);
- arpwatch — мониторинг активности MAC/IP-адресов;
- cron — планировщик;
- filer — файловый менеджер;
- squid/lightsquid/squidGuard — прокси, генератор отчетов и фильтр;
- lldpd — предоставляет поддержку обнаружения по Link Layer Discovery Protocol, кроме того поддерживает проприетарные CDP, EDP, FDP, NDP;
- mailreport — рассылка отчета по почте;
- net-snmp — GUI для SNMP;
- nmap — nmap, классика сканирования сетей;
- snort/suricata/zeek — решения класса IDS/IPS.
Необходимо понимать, что за использование этих функций нужно заплатить повышением производительности оборудования. Интенсивное использование VPN может потребовать дополнительно одно или более ядер ЦПУ, а IDS/IPS также потребует дополнительно 1–2 ГиБ ОЗУ.
Проведем демонстрацию расширения функциональности на популярном сканере nmap. В меню System заходим в пункт Package Manager, вкладка Available Packages, рядом с пакетом NMap нажимаем на кнопку Install, ждем и получаем встроенный сканер:

В меню Diagnostics добавился пункт NMap, запускаем:

Во внутреннем сегменте нашей лаборатории только один хост, он был успешно обнаружен и просканирован:
