Реклама

Pfsense – шлюз за пять минут

В этой статье я хочу рассказать вам о замечательном, с моей точки зрения, продукте – программном маршрутизаторе pfsense.
Основанный на платформе FreeBSD, славящийся своей надежностью, и хорошо отлаженном, интуитивно понятном веб интерфейсе, позволяющем в буквальном смысле настроить маршрутизатор за пять минут.
Кроме того, у нас есть возможность с помощью встроенного менеджера пакетов расширять функционал маршрутизатора, установив например squid в качестве прокси, или suricata в качестве IDS/IPS защиты. Кроме этого мы можем легко сделать удалённый доступ настроив OpenVPN сервер.

Давайте начнём установку, скачав установочный файл с официального сайта www.pfsense.org
Минимальные заявленные требования для версии 2.4.4:
CPU 600 MHz или быстрее
RAM 512 MB или больше
4 GB на HDD

Установка сложностей не вызывает, pfsense автоматически определит WAN и LAN интерфейсы. Если это не так, можно воспользоваться пунктом 1 из меню – assign interfaces, или назначить нужные IP адреса используя пункт 2.

Следующим этапом переходим в веб интерфейс. В моём примере это адрес WAN интерфейса, полученный по DHCP – https://192.168.1.202/. Что бы зайти через WAN интерфейс временно отключим через консоль firewall командой pfctl -d. Через LAN доступ есть по умолчанию. Используем дефолтные учетные данные – Логин admin пароль pfsense.

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

В принципе, мы уже получили рабочую систему с двумя интерфейсами. У нас в примере есть еще третий сетевой интерфейс – по умолчанию он выключен. Если вы хотите задействовать и его например в качестве третьей подсети – переходите на вкладку interfaces, Assignments. Тут мы можем добавить и сконфигурировать настройки для нового интерфейса, нажав сначала кнопку add, а затем кликнув по названию интерфейса и поставив галочку “Enable interface”.

Теперь давайте добавим правила для интерфейсов. Я хочу получать доступ к нашему маршрутизатору через WAN (в работающий среде такого делать не стоит, по умолчанию извне запрещены все подключения)

Добавим правило разрешающее подключение извне с любого IP и порта на 443 порт нашего маршрутизатора.

Block private network и block bogon networks означает, что по умолчанию блокируются диапазоны приватных частных сетей, и адреса из диапазонов еще не распределенных или зарезервированных.

Не забывайте, что правила обрабатываются по очереди, и если первое правило у вас разрешающее, а идущее за ним такое же правило запрещающее (или просто попадающее под такие же условия) то сработает первое правило и обработка остановится.

Теперь представим, что во внутренней сети у нас есть сервис, к которому нужно предоставить доступ извне. Представим что это почтовый сервер, и он должен принимать почту на 25-м порту. Нам нужно сделать проброс порта во внутреннюю сеть. Здесь нам поможет пункт firewall – NAT, port forward.

Выбираем интерфейс на который будет приходить запрос, выбираем протокол – в нашем случае это TCP, Destinantion port range – порт, или диапазон портов, при обращении на который произойдёт переадресация на Redirect target port, в нашем случае это SMTP, он же 25-й порт. Filter rule association выбираем add aassociation rule – в firewall автоматически добавится разрешающее правило привязанное к правилу проброса порта. Нажимаем save и apply – и теперь при обращению извне к 25-му порту произойдёт переадресация во внутреннюю сеть на 25-ё порт.

И так, теперь мы имеем: WAN интерфейс, смотрящий в интернет, и LAN интерфейс, смотрящий в локальную сеть. Достаточно указать всем компьютерам локальной сети в качестве шлюза LAN интерфейс – и у пользователей появится доступ в интернет, а снаружи периметр надежно защищен брандмауэром нашего маршрутизатора – работает он на основе packet filter, встроенного в FreeBSD.

Представим теперь, что у нас довольно много различных сервисов, проброшенных внутрь сети, надо их тоже как то обезопасить. Фаервол спасет нас только на уровне IP и TCP, то есть 4-го и 3-его уровня модели OSI. А нам нужно защищать пользователей внутри сети и наши внешние сервисы. В этом нам поможет suricata – анализатор сетевых пакетов. Установить его можно через package manager.

Теперь в меню services нам доступна наша IDS.

В меню interfaces нажимаем add, и добавляет WAN интерфейс, настройки можем оставить по умолчанию.

Важная вкладка Global Settings. Здесь мы выбираем какие правила скачивать. Правила – это предопределенные паттерны событий, списки IP адресов которые представляют угрозу. Они будут всё время обновляться. Есть платная и бесплатная версия этих обновлений. Для бесплатной нужно зарегестрироваться по ссылке, которая будет там же на странице – Sign Up for a free Registered User Rules Account. Поставить галочки, после регистрации получить Snort Oinkmaster Code и вставить его в соответсвующее поле.

Чуть ниже на странице выставляем интервал обновления правил, а еще ниже время удаления заблокированных IP адресов из списка.

Проверяем – переходим на вкладку update, и пробуем обновить наши правила.

Если правила у нас удачно загрузились, переходим на вкладку wan categories. Данная секция позволяет выбрать уровень срабатывания правил – IPS Policy Selection и действие при срабатывании правила – только предупреждение или заданное в правиле действие (например drop connection)

На вкладке interfaces – wan settings есть поле Alert and Block Settings, если поставить галочку Block Offenders хосты на которых сработали правила будут блокироваться.

Если suricata ошибочно заблокировал хост или сайт, переходим на вкладку blocks, и удаляем IP из таблицы.

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


Теперь представим, что мы хотим исключить какой-нибудь IP из проверки. Для этого идём в меню firewall – aliases, и создаём новый список с типом hosts.

Далее идём в suricata – passlists и добавляем созданный список алиасов. Теперь все адреса добавленные в этот список никогда не заблокируются. Не забываем после добавления перезапустить сервис.

Отлично, мы создали и защитили наш шлюз в интернет. Настало время подумать об удаленном доступе внутрь сети для пользователей. В этом нам поможет сервер OpenVPN.

На вкладке VPN OpenVPN создаём новый сервер. Server mode выбираем Remote access (SSL/TLS+User Auth) то есть удаленный доступ с аутентификацией по сертификату и паролю.
Протокол UDP v4, режим работы туннельный интерфейс WAN и порт – по умолчанию 1194.

Далее идём в System – Certificate Manager и создаём центр сертификации.

Теперь можно выбрать его в настройках

Далее раздел tunnel network. Сначала указываем подсеть для клиентов OpenVPN – IPv4 Tunnel Network. Теперь указываем к какой сети разрешаем доступ – IPv4 Local network(s).
Inter-client communication – разрешить взаимодействие между клиентами, Duplicate Connection – разрешить одновременные подключения с одного аккаунта.

Раздел Advanced Client Settings. Опция DNS Default Domain отдаёт суффикс домена для односложных имён. DNS Server 1 – указываем внутренний DNS. Force DNS cache update – обновляем кеш DNS в клиенте.

 

В Advanced Configuration есть возможность прописать маршрут. Например мы хотим, что бы при запросе какого-то адреса мы заворачивали трафик на него в туннель. Это можно сделать с помощью команды push route, как на скриншоте.

Теперь сохраняем наш сервер, и устанавливаем через менеджер пакетов openvpn-client-export

Идём в user manage и создаём нового пользователя. Не забываем поставить галочку Click to create a user certificate. Следующий шаг перейти в OpenVPN – client export. Здесь мы увидим выбор установочных файлов для пользователя. Если выбрать windows vista and later, мы получим установочный файл для windows, который содержит сам клиент и сертификат. Можно так же скачать конфигурационный файл под android или под mac. После установки, клиент нужно запускать от имени администратора, что бы сработала очистка кеша и добавились маршруты. Не забываем, что в качестве шлюза у машин в локальной сети должен быть указан pfsense.

Отлично. Теперь у нас есть маршрутизатор, выход в интернет, опубликованы сервисы, настроена безопасность, и есть удалённый доступ. Уже неплохо.

Давайте теперь настроим прокси сервер squid с антивирусом. Так мы сможем контролировать трафик пользователей и проверять его на шлюзе антивирусом.
Для начала установим пакет squid.

Перейдём в раздел настроек general. Что бы squid заработал, нужно поставить галочку Enable Squid Proxy. Выбираем интерфейс, на котором будем перехватывать запросы – Proxy Interface(s). Выбираем порт – по умолчанию 3128. Если мы не включим transparent mode, то есть прозрачный режим, то для доступа к интернету нам понадобится прописать адрес прокси сервера и порт в браузерах пользователей. Важный пункт Allow Users on Interface. Он означает, что пользователям на этом интерфейсе автоматически предоставляется доступ к прокси серверу, в противном случае будет запрошена аутентификация.

Далее идёт раздел Transparent Proxy Settings. Если мы хотим что бы для пользователей было всё прозрачно, и нигде ничего прописывать им было не нужно – включаем этот режим. Запросы будут перехватываться и автоматически проходить через прокси. Пункт Bypass Proxy for Private Address Destination говорит о том, что адреса назначения из внутренних сетей проксироваться не будут.
Bypass Proxy for These Source IPs и Bypass Proxy for These Source IPs указывают соответственно адреса источников и назначения, а также подсети или хосты которые не проксируются.

Следующий пункт SSL Man In the Middle Filtering является важным. Зашифрованный SSL трафик не может быть расшифрован шлюзом, поэтому блокировки сайтов а также проверка антивирусом работать не будет. Включаем enable ssl filtering, выбираем режим Splice Whitelist, Bump Otherwise. Это означает, что все сессии, которые не находятся в бело листе будут перехватываться. Для этого режима должен быть указан центр сертификации шлюза – CA, мы создали его раньше. Как это работает. Клиент посылает запрос на соединение с сайтом SSL через шлюз. Далее шлюз устанавливает от СВОЕГО имени соединение с сайтом SSL обратный трафик расшифровывается на шлюзе, шифруется сертификатом ШЛЮЗА и отправляется клиенту. Что бы это работало, на ВСЕХ компьютерах локальной сети сертификат сервера доложен быть установлен в Доверенные корневые сертификаты.

Наконец последний раздел – Headers Handling, Language and Other Customizations. Здесь важным пунктом будет Visible Hostname. Именно это это будет отображаться в сообщениях об ошибках.

Теперь включим антивирус на вкладке ClamAV Anti-Virus Integration Using C-ICAP, укажем периодичность обновления баз ClamAV Database Update, включим проверку Google Safe Browsing и исключим из проверки видео и аудио – Exclude Audio/Video Streams.

На вкладке ACLs мы можем задавать разрешения для IP адресов и подсетей, а на вкладке Traffic Mgmt устанавливать ограничения на полосу пропускания. Вкладка Authentication отвечает за выбор способов аутентификации пользователей.

Также есть функционал reverse proxy, который находится в разделе services reverse proxy. Суть его в том, что бы перехватывать запросы извне, и принимать только те из них, которые соответствуют определенным паттернам. Уже настроенный функционал есть для серверов exchange.
Для exchange сервера настройки будут следующие.
Reverse HTTPS Port 443, через него работает OWA, active sync и outlook anywhere. Reverse HTTPS Default Site тут нужно указать имя внешнего сайта, DNS котрого указывает на ваш шлюз. Reverse SSL Certificate – сертификат, в котором должны быть указаны ваши внешние имена.

На 443 порт вам нужно создать правило разрешающее доступ, проброс портов настраивать на 443 порт не нужно.Сервер, на который будут перенаправляться запросы будет указан ниже. А также сервисы, которые вы хотите что бы работали через reverse proxy.

В качестве примера, рассмотрим еще reverse proxy для сервере обновлений NOD32. Работает он на порту 2221.

На вкладке web servers укажем порт и IP внутри сети сервера обновлений.

А на вкладке mappings укажем созданного пира, и самое главное регулярные выражения, с которым будет работать reverse proxy. Например ^http://site.ru:2221/nod.*$ Означает что начало строки может быть только такое: http://site.ru:2221/nod а дальше любой символ и конец строки. Например nod6C47.nup, то есть файл обновления.

Можно посмотреть и конфиг для exchange. Для этого нужно зайти в Diagnostocts – Edit file – Browse. Перейти в папку usr/local/etc/squid/squid.conf.

Здесь мы увидим паттерны:

cl OWA_URI_pfs url_regex -i ^https://my_domain/owa.*$
acl OWA_URI_pfs url_regex -i ^https://my_domain/exchange.*$
acl OWA_URI_pfs url_regex -i ^https://my_domain/public.*$
acl OWA_URI_pfs url_regex -i ^https://my_domain/exchweb.*$
acl OWA_URI_pfs url_regex -i ^https://my_domain/ecp.*$
acl OWA_URI_pfs url_regex -i ^https://my_domain/OAB.*$
acl OWA_URI_pfs url_regex -i ^https://my_domain/Microsoft-Server-ActiveSync.*$
acl OWA_URI_pfs url_regex -i ^https://my_domain/mapi.*$
acl OWA_URI_pfs url_regex -i ^https://my_domain/EWS.*$
acl OWA_URI_pfs url_regex -i ^http://my_domain/AutoDiscover/AutoDiscover.xml
acl OWA_URI_pfs url_regex -i ^https://my_domain/AutoDiscover/AutoDiscover.xml

Вот сколько всего можно сделать при помощи pfsense, причём довольно быстро и эффективно. Охвачена лишь небольшая часть функционала, и очень неглубоко.

Если у Вас есть вопросы, задавайте их на форуме, или ниже в комментариях.

 

Пока нет комментариев

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *