Настройка шлюза на базе Pfsense. Часть 1

Что всегда заметит каждый пользователь? Правильно, отсутствие интернета. Но как? «Вконтакте» не грузится — значит, интернета нет. Но ведь бывает, что директор или бравые богатыри из отдела ИБ хотят что-то запретить, что-то собрать, где-то проконтролировать. И тут администратор начинает танцевать вокруг шлюза в интернет. Если в компании много денег, то танцы могут быть длительными и с галантными кавалерами (мар Checkpoint, мистер PaloAlto, господин SonicWall). А вот что делать, если денег только на железо, функционала хотят много, а делать надо быстро? Бежать. На помощь приходит Mr Proper Pfsense, активно поддерживаемый сообществом бесплатный, гибкий и несложный в настройке межсетевой экран на базе FreeBSD.

В первой части рассмотрим классику жанра — межсетевой экран с прокси (аутентификация по учетным данным Active Directory) и фильтрацией контента, а также какой-никакой антивирусной проверкой трафика налету. Отдельно рассмотрим вопрос настройки удаленного доступа пользователей к сети предприятия.

Если будет интерес, могу написать вторую часть инструкции по развертыванию, где рассмотрю вопросы балансировки между несколькими провайдерами, создания и одновременной работы двух шлюзов, а также добавления фич безопасности типа IPS/IDS, фильтр спама, более кошерной фильтрации средствами Dansguardian, сниффинга IM и HTTPS контента и много чего еще интересного.

Для уменьшения возможного холивара: «Да, это можно сделать на %yourdistrname%» и «Да, все можно настроить из командной строки». Так, все формальности соблюдены — можно начинать.

Установку сделаем с флешки. Для этого используем образ pfSense-memstick-2.2.2-RELEASE-i386.img.gz, скачанный с одного из зеркал, указанных на официальном сайте. Очень удобно, что сначала мы выбираем архитектуру, функционал, а потом уже нам предлагают список зеркал. Процесс установки детально расписывать не буду, там все элементарно, никаких дополнительных настроек не нужно. По окончанию установки вам предложат назначить VLAN и определить интерфейсы, а также их назначение. Выглядит это примерно так:



После настройки интерфейсов мы попадаем в меню с ограниченным числом пунктов, однако есть возможность выйти в шелл. На мой взгляд, самым полезным пуктом меню является возможность сброса пароля на веб-морду. Разработчики pfsense настоятельно рекомендуют проводить всю настройку только через графический интерфейс. А выглядит он достаточно симпатично, набор виджетов широк, можно кастомизировать их набор под себя.



Первым делом создаем свой внутренний CA на pfsense или используем уже имеющийся. Для этого в меню System выбираем Cert Manager и в разделе CA проводим необходимые настройки: нужно указать длину ключа, алгоритм хэширования, время жизни и полное имя CA. Настроенный CA будет нам нужен для создания OpenVPN-сервера и для работы по LDAPS.



Теперь интегрируем наш шлюз с Active Directory. В разделе Servers блока User Manager из меню System были проведены настройки на использование контроллера домена. Все до безобразия просто — указал адрес, транспорт, область поиска, контейнеры с учетками, креды для создания привязки и шаблон для заполнения Microsoft AD — можно выпускать кракена пользователей в интернет.



Перейдем к настройке правил фильтрации трафика. Во-первых, если требуется любая группировка адресов, портов, URL, тогда добро пожаловать на вкладку Aliases. Во-вторых, вы можете настроить временные промежутки, которые можно использовать для работы правил. По умолчанию создано правило «всем везде все можно», а также правило, которое не дает заблочить доступ к веб-морде. Создание правил выглядит довольно буднично:



Однако есть ряд дополнительных возможностей, например, разрешенные ОС, какие могут быть выставлены TCP-флаги, график работы правила, а также инспектор протоколов прикладного уровня.



Настройка удаленного доступа OpenVPN с аутентификацией по паролю в локальной базе и сертификату можно посмотреть тут — www.youtube.com/watch?v=VdAHVSTl1ys. Выбор протоколов удаленного доступа невелик — IPSec, L2TP, PPTP и OpenVPN. При выборе PPTP сам pfsense напишет Вам, что протокол небезопасен и лучше выбрать другой.



Аутентификация в локальной базе была выбрана с целью сохранения возможности удаленного подключения в случае каких-либо неполадок с серверами каталогов.

Для экспорта настроек OpenVPN для устройств на разных платформах нужно установить пакет OpenVPN Client Export Utility, который есть в списке доступных для установки пакетов. Теперь возвращаемся к истокам – во вкладку Cert Manager, там создаем сертификат для сервера VPN и каждого клиента. Разница только в типе сертификата.



Переходим к настройке сервера OpenVPN. Выбираем режим работы сервера – в моем случае «Remote Access (SSL/TLS + User Auth)», сервер аутентификации, протокол, порт, нужный сертификат сервера VPN и выставляем нужные параметры шифрования. То, что предлагается по умолчанию — не лучший выбор.



Дальше настраиваем VPN-сеть и выставляем настройки для клиентов. Тут мы можем определить, стоит ли выдавать клиенту DNS-сервера, весь ли трафик клиента гнать в туннель и т.д. После этого сохраняемся и отправляемся на вкладку client export. Отсюда мы экспортируем нужные для подключения настройки и сертификат пользователя.



Кстати, при настройке сервера можно было воспользоваться Wizardом, который провел бы Вас через все “печали и невзгоды” настройки OpenVPN. Некий аналог кнопки “Сделать хорошо”.

Конечно, если у вас многим пользователям нужен удаленный доступ, то работа по выдаче и отзову сертификатов, экспорту настроек, заведению пользователей в локальную базу превратиться в очень скучное, но ответственное задание. Считаю, что при подобных требованиях к масштабированию необходимо наличие отдельного CA с CRL и единой базы аутентификации, типа Active Directory. Но если пользователей мало, то предложенный выше вариант вполне работоспособен.

Нам осталось настроить прокси, фильтрацию контента и антивирусную проверку. Устанавливаем HAVP-пакет – это прокси с ClamAV сканером. Для настройки указываем режим работы ClamAV и прокси, порт, интерфейс, настройки проверки проходящего трафика. Поскольку планируется использование squid, то наш режим работы — «Parent for Squid». Отдельно настраиваем параметры обновления антивирусной базы и ее зеркала.



Переходим к настройке Squid. После установки пакета выбираем режим работы прокси и порт, затем на вкладке «Auth Settings» указываем используемый метод аутентификации. Поскольку у нас стоит задача использования Active Directory в качестве базы пользователей, то используем протокол LDAP. Настройки для интеграции с контроллером домена представлены ниже.



При необходимости настраиваем параметры вышестоящего прокси, управления кэшем и трафиком, а также ACL. Я, например, в whitelist вносил *microsoft.com/* для нормальной работы обновлений и активации ОС, и то не сканало. Но об этом чуть ниже.

Теперь фильтрация – настраиваем squidGuardian. По подходам к фильтрации в принципе есть хорошая статья – «To-do: Фильтруем вся и всё». После установки squidGuardian через пункт «Proxy filter» меню «Services» переходим к его настройке. На вкладке «Blacklist» указываем откуда качать сами блэклисты в формате tar или tar.gz, а также на вкладке «General settings» ставим галочку для включения использования блэклистов. Я использовал бесплатные блэклисты отсюда. В случае необходимости работы контентного фильтра по времени, промежутки можно задать на вкладке Times. Дальше уже настраиваете общие или групповые ACL, главное не забыть поставить галочку напротив запрета использования IP-адресов в URL. Для настройки правил фильтрации нужно нажать «Target Rules List» и выбрать действия для нужных категорий, а также действие по умолчанию.



Если у вас есть необходимость в создании собственных категорий, то можно воспользоваться страничкой «Target Categories». После сохранения ваша категория появится в общем перечне правил. Я создавал свою категорию для разрешения доступа к ресурсам по IP-адресам, у которых нет DNS-имени.

А теперь ложка дегтя. Вполне допускаю, что проблемы вызваны собственной кривизной рук, но все же. Если кто-то из сообщества сможет подсказать какие-то решения, то я буду крайне признателен.

1. Разработчики давно обещают, но пока так и не сделали поддержку L2TP over IPSec.
2. Проблемы при попытке срастить pfsense для использования сертификатов AD CS. Я читал обсуждение отсюда, но так и не смог победить мелкомягкого дракона.
3. Проблемы работы клиент-банков в случае, если у вас есть балансировка между провайдерами.
4. Если у вас указана аутентификация пользователей через AD, а контроллер домена недоступен, то ваш встроенный(!!!) админ pfsense также откажется работать. Есть обсуждение на форуме, люди пишут скрипты на php для решения вопроса, но это не является рекомендуемым решением.
5. Видимо тут мои личные проблемы с кириллицей. Во-первых, не работает аутентификация в случае использования пароля в кириллической раскладке. Во-вторых, проблемы в отображении имен контейнеров AD на кириллице.
6. Несмотря на все усилия, время от времени возникают проблемы с сервисами от Microsoft. Чаще всего не работает активация ОС. Думаю, тут все же необходимо будет поправить конфиг squid вручную.

В заключении хотел бы отметить, что данный дистрибутив импонирует мне широким функционалом и гибкостью, очень легко клонировать настройки на несколько шлюзов, есть возможность сделать embedded решения. Конечно, полная настройка через веб ИМХО не есть хорошо, но может именно таким образом разработчики огораживают начинающих админов от болезненных ударов граблей разной высоты.
Поделиться публикацией

Комментарии 32

    +1
    Проблема с клиент-банками решается с помощью опции Stickly Connections — смысл в том, что поддерживается установленное соединение через один из каналов, в отличии от балансировки по разным каналам для других правил.
    Кириллические логины/пароли — это не проблема pfSense как таковой, а проблема используемого для аутентификации демона.
    И да, pfSense заточен именно на конфигурацию через Web интерфейс для использования его широким кругом людей, в т.ч. не желающих умеющих работать с командной строкой. Разбирающиеся в настройке из консоли осилят (возможно и предпочтут) и настройку роутера на чистой FreeBSD.
      +1
      Да, еще по поводу HAVP — дважды подумайте, нужен ли Вам такой тормоз в системе? Наверное лучше посмотреть в сторону Squid + ICAP+CLAM.
        0
        Про данную связку слышал и при написании статьи думал о ней, но я старался использовать доступные пакеты «из коробки», а там возможности подобную связочку собрать я не нашел.
          0
          Она есть в пакетах, но пока только тестовая. При наличии умелых рук заставить работать «как надо» вполне реально.
            0
            Спасибо, проверю. При работе с тестовыми версиями пакетов пока вообще на проблемы не натыкался.
        0
        Спасибо за совет по клиент-банкам, завтра попробую.
          0
          Поищите еще на форуме поддержки тему, там она уже поднималась. Возможно я написал не все, и что-то упустил.
            0
            Если Stickly Connections не помогут — можно в настройках фаервола (LAN --> Advanced --> Gateway) прибить гвоздями клиент-банк к выбранному провайдеру.
        • НЛО прилетело и опубликовало эту надпись здесь
            –2
            i386 — не желателен, если есть возможность всегда нужно брать amd64.

            Можете обосновать свою позицию?
            И да, лучше брать образ для i386 системы, так как AMD в pfSense пасынок.
              +1
              Я так понимаю, что под «amd64» — подразумевается x86_64, поэтому не стоит проводить параллель с вендором AMD ;)

              А нежелательно потому, что в дальнейшем у Вас возникнут проблемы с масштабированием системы, когда ей понадобиться больше ресурсов.
                0
                Здесь согласен (и действительно путаю). Правда есть еще один вариант — использовать виртуальную машину. Из плюсов — возможность гибко управлять ресурсами и использовать «излишки» ресурсов для других задач.
              • НЛО прилетело и опубликовало эту надпись здесь
              0
              Привет, Коллега =)

              Прекрасная статья!
              Буду ждать воторой части.
                0
                Привет, спасибо на добром слове! Вторая часть будет обязательно.
                  0
                  Я так понимаю, у вас не было необходимости решать вопрос PPTP passthrough? Суть в том, что подключиться к внешнему PPTP серверу находясь за pfSense почти невозможно, если у вас нет «лишних» IP адресов. Официальная информация из документации: раз, два и тема на форуме. Мне пришлось отказаться от pfSense из за отсутствия данной возможности.
                    0
                    Нет, такой задачи не было. По возможности стараюсь не связываться с PPTP, но если с той стороны только он и без удаленки никак, то это печальная история.
                      0
                      Мы же просто отказались от PPTP в пользу L2TP.
                      При сильной необходимости можно с самого pfSense поднять необходимое число туннелей и маршрутить в них людей.
                        0
                        Дак вроде L2TP в pfsense не умеет работать с поддержкой IPSec. Или Вам нужно было только туннелирование?
                          0
                          Верно, нужны были только туннели.
                      0
                      Что-то я не очень понял: а без использования прокси разве нельзя юзверям запретить одноклассников с ютубом?
                        0
                        Надо было запретить не всем, а только части. Некоторые, типа отдела кадров и маркетинга, ходили туда, чтобы группы вести и прочее. Прокси дарует аутентификацию, по ней и отсеиваем юзеров. Я может не очень Вас понял, какое решение Вы предлагаете?
                          0
                          Да я просто спросил. Решения не предлагаю. Просто сейчас я в поиске некого подобия pfSense (а может и на нём остановлюсь), чтобы были хотелки как минимум:
                          1) Поддержка VPN сервера
                          2) Возможность фильтрации траффика
                          3) Наличие GUI для непрофессионалов

                          Касательно фильтрации было б классно (как по мне)
                          1) Предварительно в DHCP сервере сделать «перепись населения» и каждому присвоить свой IP на основе MAC'a
                          2) Разбить пользователей по группам, чтоб допустим как вы говорили отдел маркетинга всегда имел доступ к соцсетям
                          3) Настроить фильтрацию на основе групп пользователей и времени. Т.е. например
                          — группа «администраторы + директора» = полный доступ в инет всегда
                          — группа «обычные пользователи» = без доступа в инет, кроме обеденного перерыва со стольки до стольки
                          — возможно какие-то исключения
                          + шейпер, чтоб какой-то умный Вася, запустив uTorrent не мешал работать VPN клиентам, которые сидят на сервере по RDP.
                            0
                            А вот pfsense как раз решит все Ваши задачи. VPN умеет разный, кроме L2TP/IPSec. Фильтрации трафика -легко, это же FreeBSD, шейпер «из коробки». Группы создаете или в AD или прям так перечислением диапазонов адресов, адресов, логинов. Контроль времени также есть. Все просто и удобно.
                              0
                              Спасибо, потренируюсь пока в виртуалке, а потом и на реальном железе.
                        0
                        Отличная статья, огромнае спасибо, а будут ли продолжения?
                          0
                          Подскажите пожалуйста.
                          Проброшен 80-й порт. Сайт с наружи открівается, а из локальной сети показівает веб-морду pfsense.
                          Говорят надо смотреть в сторону локального DNS?
                            0
                            Самое простое — это настроить в DNS разрешение имени сайта в его локальный IP адрес.
                            Не самое простое — нужно на шлюзе донастроить NAT/
                              0
                              Простите за археологию, но не увидел тут корректного ответа, а вопрос этот новичками задаётся довольно часто.

                              Идём в System / Advanced
                              находишь пункт WebGUI redirect и ставишь галочку. Вообще-то там прямо так и написано что это
                              Disable webConfigurator redirect rule

                              И не забудьте в разделе:
                              Firewall / NAT / Port Forward / внизу в NAT reflection

                              Перевести в режим NAT+Proxy

                              Всем лучики добра и читать мануалы ;-)
                                0
                                Спасибо. Но я для решения перевел WebGUI на 81-й порт.
                                  0
                                  Ну это понятно, однако даже если переведёте вебгуй на др. порт, то от редиректа в морду нужно всё же ставить такую галку.
                              0
                              То есть при простом пробросе портов появляется проблема с доступом из локалки к локальным ресурсам по внешнему адресу.

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