October 11, 2021

Настройка pfBlockerNG на pfSense

Основные фичи:

  • Блокировка IP по географическому признаку используя MaxMind GeoIP
  • Блокировка доменов по категориям использую списки Shallalist и UT1
  • Поддержка IP/DNSBL фидов в разных форматах - TXT, CSV, JSON, ASN, WHOIS, Regexp
  • Блокировка великого и ужасного DNS-over-HTTPS
  • Поддержка SafeSearch - переадресация поисковых запросов Google/Youtube/Yandex/Bing/DuckDuckGo на "безопасную" версию для фильтрации контента не предназначенного для детей
  • Детальное ведение лога, ведение статистики и построение отчётов/диаграмм

Для удобства будем считать что у нас уже установлен последний pfSense (2.5.2 на данный момент) и настроены два сетевых интерфейса - LAN и WAN. Задача - установить и настроить pfBlockerNG для защиты от всего плохого и ужасного.

Установка и первоначальная настройка

Заходим на System > Package Manager > Available Packages и выбираем (внимание!) pfBlockerNG-devel. Дело в том что т.н. стабильная версия практически не обновляется уже долгое время и если у вас свежая установка - смело ставим именно -devel. Последняя на момент статьи версия - 3.1.0.

Переходим на Firewall > pfBlockerNG и попадаем в визард начальной настройки. Делаем два next'а и выбираем WAN в качестве inbound интерфейса и LAN в качестве outbound. Оставляем значение VIP адреса и порты как есть.

После этого запуститься первоначальная синхронизация pfBlockerNG в процессе которой он скачает некоторые дефолтные фиды и перезапустит DNS Resolver.

Обратите внимание открывшуюся страницу Update - в дальнейшем для применения изменений или обновления фидов на данной странице нужно запускать Force Reload + All/IP/DNSBL для применения/обновления соответствующих настроек и скачивания свежих фидов. Рекомендуется делать это именно через "Force", т.к. вы не всегда можете знать требуют ли определённые опции перезапуска DNS и перегенерации фидов или нет.

На основной странице Firewall > pfBlockerNG > General убедимся что стоит галочка Enable и оставим остальные параметры как есть.

Основные опции блокировки по IP

Страница Firewall > pfBlockerNG > IP. Смело включаем De-Duplication и CIDR Aggregation - обработка больших IP фидом будет чутка дольше, но итоговые алиасы в правилах файрволла будут короче - соответственно будут потреблять меньше памяти и CPU. Включаем Suppression - чтобы скачанные фиды не заблокировали ненароком loopback и ваши внутренние RFC1918 адреса. Force Global IP Logging можно также включить (особенно на первое время) для ведения логов всего что будет заблокировано вашими IP фидами. В дальнейшем эту опцию можно выключить и активировать логгирование только для тех фидов что вам интересны. Оставляем Placeholder IP Address как есть (это просто аварийный IP, на тот случай если неожиданно скачается пустой фид). Красоты ради можно включить и ASN Reporting - в репортах будет отображаться номер ASN.

В настройках MaxMind GeoIP вводим ключ (если его у вас ещё нет, то бесплатно регистрируемся на https://www.maxmind.com/en/geolite2/signup). Остальные опции оставляем как есть.

IPv4 Suppression - белый список IPv4 адресов (/32 маска) и сетей (только /24 маска!) Добавляем если нужно чтобы что-то случайно не заблочилось фидами.

IP Interface/Rules Configuration - настройка параметров Auto-rule для IP блокировок. Честно говоря я предпочитаю создавать с помощью pfBlockerNG просто IP алиас и уже вручную создавать правило файрвола там где мне необходимо - получается всегда можно видеть в каком порядке обрабатываются пакеты и править/перемещать правила при необходимости. Поэтому оставляем эти опции как есть, единственно на что хочу заострить внимание,так это опция Kill States - включив её, pfBlockerNG грохнет уже установленные сквозь ваш pfSense соединения, если их IP вдруг обнаружились в обновлённом фиде. Это может замедлить процесс обновления, особенно если у вас много фидов и много одновременных сессий, но и повышает безопасность, когда вдруг оказывается что часть хостов в локалке соединены с C&C серверами.

IP фиды

Это одна из основных, наравне с DNSBL фидами фишка для которой и устанавливают pfBlockerNG. Тут всё просто - переходим на Firewall > pfBlockerNG > Feeds и видим огромный список как IPv4/IPv6, так и DNSBL фидов. Но пока вкратце по наиболее важным категориям первого типа:

  • PRI1/PRI2/PRI3/PRI4 - основные фиды со злодейскими IPшниками - вирусы, malware, C&C сервера и пр. Цифра означает качество фидов, т.е. выборка PRI1 более тщательная чем PRI4, где количество false-positive срабатываний может быть намного чаще.
  • SCANNERS - IP адреса "легальных" сканеров сети, вроде Shodan. Пригодится для фильтрации inbound трафика в случае когда за pfSense стоят другие сервера.
  • SFS - Stop Forum Spam. Обычно используется для фильтрации входящего трафика для web-серверов, не имеет особого смысла для трафика исходящего из вашей локалки.
  • TOR - тут думаю всё понятно
  • MAIL - антиспам-фиды, на случай если за pfSense стоит ваш почтовик
  • DNS - IP адреса всех известных DNS серверов. Можно использовать для доп. блокировки исходящих DNS запросов на внешние сервера. Но осторожно, могут быть и false-positive срабатывания
  • Proxy, Torrent, VPN - IPшки известных прокси серверов, торрент-трекеров и VPN. Последний использовать аккуратно, могут быть заблокированы и вполне легитимные VPNы (например DrWeb Security Space)

Нажимаем на плюсик в правой колонке и попадаем на страницу добавления IP фида. Выставляем State в положение ON, чтобы активировать скачивание фида и смотрим Settings. В Action выбираем собственно действие - Inbound/Oubound Deny/Permit понятно, match просто логирует трафик, c Alias интереснее - я обычно использую Alias Deny для блокировки и Alias Permit для разрешающих фидов (бывает и такое, см. дальше). Enable Logging и States Removal аналогичны Force Global IP Logging и Kill States что рассматривались выше. Оставляем остальные опции как есть (периодичность обновления известных фидов прописывается автоматически), разве что стоит обратить внимание на IPv4 Custom_List - там можно прописать дополнительные IP или домены/ASN которые преобразуются в IP и будут добавлены к фиду.

Нажимаем Save и переходим на вкладку Update чтобы запустить процесс обновления. Но лучше добавить ещё фидов, и вообще добить всю конфигурацию и тогда уже сделать это.

Иногда нужный фид отсутствует в списке и вы можете просто добавить его вручную - Firewall > pfBlockerNG > IP > IPv4 > кнопка Add. Основные опции мы разобрали, стоит остановиться на форматах:

  • Auto - это может быть txt, csv или json файл по указанному URL
  • GeoIP - при настроенном GeoIP можно просто указать двухбуквенный код страны
  • Whois - преобразует указанное доменное имя в IP адрес(а)
  • ASN - можно указать номер или имя ASN (при наборе отобразятся варианты / автодополнение)

В поле State также может быть полезен вариант HOLD - в этом случает фид скачивается только один раз.

Кстати, а в когда это может понадобится IP фид для разрешающего правила? Например чтобы используя фиды роскомсвободы логировать нужный трафик. Корпоративный пример - это bypass правило для адресов Office365.

Важное про IP фиды - если те стали слишком уж большие, вы можете увидеть в логах pfSense "Cannot allocate memory" ошибку, вроде:

There were error(s) loading the rules: /tmp/rules.debug:37: cannot define table pfB_Europe_v6: 
Cannot allocate memory - The line in question reads [37]: table <pfB_Europe_v6> persist file "/var/db/aliastables/pfB_Europe_v6.txt" @ 2016-09-24 18:01:48

Значит под таблицы файрвола (т.е. алиасы) выделено недостаточно памяти. Лечится увеличением Firewall Maximum Table Entries (лучше сразу раза в 2-3) на странице System > Advanced > Firewall & NAT.

Основные опции DNS блокировки

pfBlockerNG использует DNS Resolver (unbound) для фильтрации DNS имён, TLD, IDN и.. обо всё по порядку.

Заходим на Firewall > pfBlockerNG > DNSBL, включаем и выбираем DNSBL Mode - Unbound python mode. Данный режим появился не так давно, но достаточно стабилен и обладает куда большим количеством опций (те что с молнией) и работает пошустрее. Wildcard Blocking (TLD) - позволяет блокировать целые TLD домены. Следует аккуратно включать эту опцию. Python Control - с помощью DNS TXT отправляемых с локалхоста pfBlockerNG может выполнять некоторые простые действия. Вроде мини-API. Можно сделать скрипт который будет подключаться к pfSense по SSH и добавлять/удалять IP в DNSBL bypass список. DNSBL Blocking - включаем. HSTS mode - исключает отображение ошибок сертификата для многих популярных доменов если те заблокированы через DNSBL. Просто и безопасно. Включаем. TLD Allow - блокирует все TLD домены что не выбраны в списке. Если пользователи сети должны работать только с определённым набором TLD доменов (например только клиенты определённых стран + основные домены), то может пригодится. IDN blocking - блокирует любые IDN домены. Следует подумать прежде чем активировать, иначе стопкоронавирус.рф не откроется. Regex Blocking - блокировка доменов по регулярным выражениям в поле Python Regex List. Если будете их писать - включаем. CNAME Validation - проверка через DNSBL всех CNAME, лучше включить. no AAAA - если нужно запретить для выбранных доменов IPv6 (AAAA) запросы. Python Group Policy - позволяет указать список IP адресов локальных хостов на которые не распространяется DNSBL. Boss/God mode.

DNSBL Webserver Configuration - если в локальной сети используется IPv6 то активируем IPv6 DNSBL. Web Server Interface - убеждаемся что выбран Localhost, иначе могут быть проблемы с другими сервисами, в частности с OSPF на том же интерфейсе.

DNSBL Configuration - Включаем Permit Firewall Rules и выбираем нужные локальные интерфейсы если хотим фильтровать для нескольких локальных подсеток (напр. LAN, IoT, Guest). Можно сбацать собственную страницу блокировки и выбрать в Blocked Webpage. Global Logging/Blocking Mode - для лучшего логирования выбираем Enabled, если хотите меньше сообщений о ошибках сертификата в браузерах пользователей - то Disabled. Resolver cache - включаем, скорость ресолвинга имён будет только лучше.

DNSBL Whitelist - тут думаю всё понятно. Стоит отметить что как здесь, так и в остальных полях где нужно вводить домены, можно вводить кириллические домены (в смысле IDN).

TOP1M Whitelist - позволяет отфильтровать популярные домены из фидов, дабы не заблокировать те ненароком. Лучше включить и потюнить Domain count по ходу дела если будет нужно. Не забудьте выбрать те TLD домены что нужно фильтровать.

TLD Exclusion List / Blacklist / Whitelist - используются опцией Wildcard Blocking (TLD).

DNSBL IPs - предпочитаю выставлять List Action в Alias Deny, так, если в DNSBL фидах обнаруживаются чистые IP адреса, то все они будут находиться в алиасе pfB_DNSBLIP_v4, который уже можно ставить куда угодно.

DNSBL фиды

Основной принцип работы с DNSBL фидами тот же что и с IPшными, с небольшими отличиями. Но сначала посмотрим основные виды DNSBL фидов:

  • EasyList, ADs, ADs_Basic - рекламные домены. Must have.
  • Email - почтовые сервера, может заблочить (без предварительной фильтрации) полезные домены
  • Malicious, Phishing - тут всё понятно
  • Cryptojackers - домены для скрытого майнинга. лучше добавить
  • Compilation - по сути агрегаторы более мелких фидов, могут быть довольно большие и неаккуратные (просто активируйте Top 1M на них)
  • STUN - список STUN доменов используемых (в основном) IP телефонами за NAT'ом
  • Firebog - самые разные фиды с firebog.net. Много полезного.

Нажимаем на плюсик в правой колонке и видим страницу очень похожую на ту что мы видели при добавлении IP фида. Но есть некоторые отличия:

  • В качестве Action выбираем Unbound
  • Group Order - если выставить Primary, то данный фид будет обрабатываться первым в группе. Другими словами если вам нужно чтобы домены из данного фида обрабатывались немного по-другому (напр. иной Logging / Blocking mode) и эти же самые домены могут находиться другом фиде группы.
  • DNSBL Custom_List - можно вручную добавить ещё доменов. Как было сказано ранее можно напрямую вводить IDN домены.

Думаю по DNSBL фидам всё понятно. Но остались ещё две вкладки - DNSBL Category и DNSBL SafeSearch

DNSBL Category

В двух словах это блокировка по категориям сайтов наподобие Firepower Security Intelligence. Включаем Blacklist Category, выбираем понравившийся нам блэклист (или оба!), частоту обновлений, логирование и вперёд!

DNSBL SafeSearch

На этой странице можно настроить две вещи - собственно SafeSearch, или как его ещё называют "Семейный поиск" и блокировку DoH серверов.

Просто выбираем SafeSearch Redirection - Enable и теперь наши поисковые запросы перенаправляются на "безопасные" поисковые домены, например поиск через www.duckduckgo.com будет перенаправлен на safe.duckduckgo.com. Но это касается только поиска через Google, Yandex, DuckDuckGo, Bing и поисковик по картинкам Pixabay. Причём только Google поддерживает такой безопасный поиск для IPv6. YouTube Restrictions работает аналогично (в т.ч. через IPv6), но только для поиска через youtube. Можно даже выбрать "силу" семейного поиска - Moderate (фильтровать мрачную жесть) и Strict (фильтровать любую жесть).

DNS over HTTPS/TLS Blocking говорит само за себя и позволяет заблокировать известные DoH сервера. Делаем Enable + выбираем все сервера через Ctrl+A. Готово.

А что если наши хитрые пользователи просто пропишут любимый DNS сервер в настройках компа? На такой этот случай нужно не забыть заблокировать DNS-over-TLS порт (853) наружу, а также настроить форвардинг портов, так, чтобы любые DNS запросы наружу заворачивались на DNS Resolver pfSense. Не буду копировать сюда текст а просто дам ссылку на то как сделать это: https://docs.netgate.com/pfsense/en/latest/recipes/dns-redirect.html. Не забудьте сделать тоже самое для IPv6 если этот протокол используется в вашей сети.

Пожалуй всё - и если тут было рассказано про возможности и настройку pfBlockerNG в целом, то в последующем будут step-by-step туториалы под конкретные случаи.

Полезные статьи по pfSense:

Источник:https://habr.com/ru/post/580978/