Pfsense openvpn server настройка windows клиент

Обновлено: 06.07.2024

В статье я опишу настройку openvpn на pfSense с доступом по учетным записям в домене Active Directory.

Когда возникла необходимость найти альтернативу виндовому vpn, на глаза попался дистрибутив pfSense, который включает в себя несколько вариантов vpn и умеет авторизовывать пользователей домена Active Directory. Выбор пал на openvpn, настройку которого я и опишу. Установку самого pfSense я описывать не буду, там всё довольно просто и понятно.

Настройка openvpn.

Итак, будем считать, что у вас уже есть установленный pfSense с внешним и локальным интерфейсами и настроенными маршрутами. Если нет — настроить маршруты можно на вкладке Система->Маршрутизация. Там же настраиваются и шлюзы.

Для работы openvpn требуются центр сертификации и сертификаты сервера и пользователя. Давайте их создадим.

Переходим в Система->Менеджер сертификатов

На вкладке Центры сертификации жмем Добавить. Заполняем необходимую информацию и сохраняем.

Далее на вкладке Сертификаты добавим сертификат сервера.

Обратите внимание, тип сертификата должен быть Server certificate.

Теперь по аналогии создаем сертификат пользователя.

Теперь тип сертификата должен быть User Certificate.

Настройка аутентификации пользователей.

Давайте настроим аутентификацию наших доменных пользователей Active directory.

Для этого переходим на вкладку Система—Менеджер пользователей. Выбираем Серверы Аутентификации и жмем Добавить. Указываем имя нашей аутентификации, протокол LDAP, адрес контроллера домена. В поле Base DN укажите свой домен.

Далее указываем контейнеры аутентификации, ставим галку Расширенного запроса и указываем группу, членам которой будет разрешено подключаться к впн серверу(эта группа дожна присутствовать в домене). Также снимите галку Привязать анонимно и укажите имя и пароль пользователя домена, от имени которого наш сервер будет подключаться к контроллеру домена. Исходный шаблон укажите Microsoft AD, а атрибут члена группы memberOf.

Сохраните изменения. Проверить правильность настройки можно на вкладке Диагностика—Аутентификация. Если при вводе учетных данных доменного пользователя, состоящего в нужной доменной группе тест пройден успешно, значит всё настроено правильно.

Установка пакета client-export.

Для установки сервера почти всё готово, давайте установим еще пакет для экспорта клиентов openvpn. Для этого переходим на вкладку Система—Менеджер пакетов.

Переходим на вкладку Доступные пакеты.

Находим пакет openvpn-client-export.

Нажимаем install и подтверждаем установку пакета.

Через некоторое время пакет будет установлен.

Создание сервера openvpn.

Пришло время создать наш openvpn сервер. Для этого жмем на VPN и в выпадающем списке выбираем OpenVPN.

В открывшемся окне выберите Мастер установки.

Этот мастер поможет создать openvpn сервер и создаст разрешающее правило в межсетевом экране. На этапе создания пригодятся и созданные нами ранее сертификаты.

При настройке сервера впн укажите сеть для туннеля и локальные сети, которые должны быть доступны подключившимся клиентам.

Можете поставить галки, заставляющие клиентов отправлять весь трафик в туннель, если вам это нужно.

Есть много опций, которые вы можете передать клиентам openvpn. Например, можно сообщить адреса днс-серверов, запретить Windows клиентам использовать внешние ДНС серверы и т.д.

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

Со всеми доступными опциями разбираться можно долго. Сделать это можно на странице сообщества OpenVPN.

Подключение клиентов.

После настройки сервера осталось только передать клиентам настройки сервера. Сделать это можно на вкладке OpenVPN—Client Export.

Выберите пакет для нужной операционной системы и кликните по нему для скачивания. Передайте скачанный файл клиенту. Для ОС семейства Linux выбирайте Archive.

Далее на Windows запустите скачанный файл и следуйте подсказкам установщика. После завершения установки на рабочем столе появится ярлык для запуска. После запуска openvpn, он будет доступен в трее.

На линукс системах разархивируйте скачанный файл и при добавлении VPN-подключения выберите вариант Импортировать из файла.

Введите имя пользователя и пароль и сохраните настройки. Подключение готово к использованию.

Еще пару слов о настройке клиентов на Линукс. Мне не удалось заставить NetworkManager использовать туннель openvpn только для маршрутов в сети, предоставляемые сервером. Он ставит шлюз по умолчанию через туннель с меньшей метрикой, чем дефолтный шлюз на клиенте. Единственное, что помогло оставить дефолтный маршрут на клиенте через его собственный шлюз — это установка в свойствах впн подключения галки Использовать это подключение только для ресурсов в этой сети. На Windows клиентах такой проблемы не было.

Если у вас есть дополнения, исправления, пожелания и т.д. — пишите в комментариях.

Для начал, думаю, стоит объяснить что такое pfSense и Site-to-Site VPN и в чем преимущества. Затем перейдем к реализации.

pfSense - это дистрибутив межсетевого экрана основанный на операционной системе FreeBSD. Дистрибутив позволяет реализовать такие механизмы, как NAT, CARP, VPN (в т.ч. PPTP, IPsec, OpenVPN), Captive portal. Кроме этого выполняет функционал классического файрволла, динамического DNS, DHCP и прокси сервера. Прост в развертывании.

Site-to-Site позволяет сконфигурировать только шлюзы в удаленных подсетях, при этом отпадает необходимость конфигурирования самих узлов сети. Говоря простым языком, способ Site-to-Site соединяет два офиса в единую сеть, а Point-to-Site - удаленных сотрудников с офисом. В статье рассмотрим пример соединения двух уже существующих сетей - физической и виртуальной.

Процесс настройки условно разделим на два этапа:

1. Настройка pfSense и конфигурирование частных сетей;

2. Реализация Site-to-Site.

Виртуальный VPS сервер

Сперва настроим внутреннюю локальную сеть и интерфейс шлюза. Для этого, в браузере, переходим по IP-адресу сервера или доменному имени, если такое имеется. Вводим логин и пароль и попадаем на Главный экран (Dashboard). В меню программы переходим в раздел интерфейсов (Interfaces) -> Назначение (Assignments). В нашем примере только два интерфейса и уже распределены - оставляем как есть. Если у Вас несколько интерфейсов, следует выбрать необходимый интерфейс по mac-адресу и нажать кнопку добавить (Add).

pfsense

Назначаем IP-адрес интерфейсу “смотрящему” в локальную сеть. В меню программы переходим в раздел интерфейсов (Interfaces) -> LAN. По окончании настройки нажимаем кнопку Сохранить (Save).

pfsense

Для всех серверов в локальной сети, в качестве шлюза по умолчанию, устанавливаем IP-адрес, указанный в LAN.

Важно! Если вы используете облачные сервисы, то объединять узлы сети необходимо из панели администрирования облачного сервиса через “Виртуальные сети”.

Настраиваем Firewall для локальных соединений.

В меню программы выбираем Firewall -> Правила (Rules) -> LAN. Наживаем кнопку Добавить (Add).

На новой странице проверяем параметры:

настраиваемый интерфейс (Interface) - LAN;

Протокол (Protocol) - TCP, но можно и Any;

Источник (Source) - Any;

Назначение (Destination)- Any.

Настройки сохраняем кликнув по клавише Сохранить (Save).

pfsense

Следует обратить внимание, что эти же настройки надо сделать на всех удаленных серверах pfSense, соединяемых в единую сеть.

Приступаем к настройке туннеля Site-to-Site.

В начале настраиваем OpenVPN. В главном меню выбираем VPN -> OpenVPN и кликаем по кнопке Добавить (Add).

На новой странице выбираем:

Режим работы сервера (Server mode) - Peer to Peer (Shared Key);

Протокол (Protocol) - UDP on IPv4 only;

Device mode - tun - Layer 3 Tunnel Mode;

Интерфейс (Interface) - WAN;

Порт (Local port) - 1194;

Shared key - Устанавливаем галку напротив Automatically generate a shared key;

Алгоритм шифрования (Encryption algorithm) - оставляем по умолчанию;

Аппаратное шифрование (Hardware Crypto) - No hardware crypto acceleration;

IPv4 Tunnel Network: 10.0.10.0/24 - указываем адреса используемые в туннеле;

IPv4 Remote networks: 10.0.1.0/24 - указываем адрес сети находящийся за удаленным шлюзом pfSense.

Сохраняем настройки и не забываем кликнуть по зеленой кнопке Применить изменения (Apply Changes).

pfsense

Настроим Firewall для нового интерфейса.

В главном меню выбираем Firewall -> Правила (Rules). Выбираем пункт OpenVPN и кликаем по кнопке Добавить (Add).

На обновленной странице проверяем параметры:

Интерфейс (Interface) - OpenVPN;

Протокол - TCP, но лучше Any;

Источник (Source) и назначение (Destination) - Any.

По окончании кликаем по кнопке Сохранить (Save). Не забываем кликнуть по зеленой кнопке Применить изменения (Apply Changes)

pfsense

Настроим Firewall для интерфейса WAN.

В главном меню выбираем Firewall -> Правила (Rules). Выбираем пункт OpenVPN и кликаем по кнопке Добавить (Add).

Интерфейс (Interface) - WAN;

Протокол (Protocol) - UDP;

Диапазон портов назначения (Destination port range) в обоих выпажающих списках (From и To) выбираем OpenVPN (1194).

Сохраняем настройки. Не забываем кликнуть по зеленой кнопке Применить изменения (Apply Changes).

pfsense

Теперь копируем сгенерированный ключ, для передачи его на удаленный маршрутизатор. В главном меню выбираем VPN -> OpenVPN. Кликаем по значку “Карандаш” (редактировать). На обновленной странице из пункта Shared Key копируем всё содержимое поля в текстовый редактор, например, Блокнот.

pfsense

Осталось настроить удаленный pfSense-шлюз в качестве клиента.

В главном меню выбираем VPN -> OpenVPN и кликаем по пункту Clients, затем по кнопке Добавить (Add).

На открывшейся странице проверяем параметры:

Режим работы сервера (Server mode) - Peer to Peer (Shared Key);

Протокол (Protocol) - UDP on IPv4 only;

Device mode - tun - Layer 3 Tunnel Mode;

Интерфейс (Interface) - WAN;

Адрес сервера (Server host address) - указывается именно WAN интерфейс сервера, который настраивали ранее;

Порт (Local port) - 1194;

Shared key - Снимаем галку напротив Automatically generate a shared key;

Алгоритм шифрования (Encryption algorithm) - оставляем по умолчанию;

Аппаратное шифрование (Hardware Crypto) - No hardware crypto acceleration;

IPv4 Tunnel Network: 10.0.10.0/24 - указываем адреса используемые в туннеле;

IPv4 Remote networks: указываем адрес сети находящийся за удаленным сервером - шлюзом pfSense.

Кликаем Сохранить (Save). Затем по зеленой кнопке Применить изменения (Apply Changes).


Пользовательские ПК и Сервер 1С подключаются к маршрутизатору используя UDP OpenVPN. Между подсетями VPN настраивается маршрут посредством которого пользователи на сетевом уровне имеют доступ к серверу.

Реализация

Организация виртуальной машины

Приобретаю виртуальную машину на которую можно установить с образа iso pfSense, именно это приложение потому что

  1. умею его настраивать под свои задачи
  2. наличие удобного web интерфейса администрирования, то что внутри FreeBSD на мою работу не влияет
  3. удобного интерфейса формирования файла настроек OpenVPN


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


Установка

После подключения iso и установки в приоритет загрузки перезагружаю VM (виртуальную машину), подключаюсь через VNC (при ошибке подключения напишите в тех поддержку включат). Устанавливаю, порядок установки скрыл под спойлер, т.к. он сводится к нажатию клавиши Enter на наборе экранов. (


2. Указываю интерфейс для WAN


3. Нажимаю Enter подтверждая что LAN интерфейса нет


4. Подтверждаю настройки


Система пытается получить IP адрес по DHCP, но безуспешно, жду пока тайминги ожидания пройдут.

В результате настройки получаем окно приветствия.


5. Настраиваю IP адрес интерфейса

1. Выбираю пункт настройки (2)

2. Отказываюсь от использования DHCP (n)

3. Указываю IP адрес (беру в админке)

4. указываю подсеть (24)

5. не указываю основной шлюз

Описание настроек маршрутизации (


7. перезагружаю VM командой reboot

8. Создаю маршрут по умолчанию

  • выхожу из оболочки "ctrl + Z"
  • route add -net 10.0.0.1/32 -iface vtnet0
  • route add default 10.0.0.1
  • проверяю ping 77.88.8.8

В результате админ панель доступна по внешнему IP.

Логин/пароль по умолчанию admin/pfsense, изменяю его через меню "System / User Manager / Users".



"Мастер настройки" проходить не обязательно, общие параметры отдельно указать в "System / General Setup" (Hostname, Domain, DNS Servers)

Если перезагрузить VM то маршрут слетит, для решения вопроса нужно

    установить пакет "Shellcmd" через "System / Package Manager / Available Packages" (



Настройка VPN

Сервер и пользовательские ПК подключаются к Remote acces VPN как клиенты.

Для работы VPN используются SSL сертификаты, вся цепочка хранится в рамках сервера.

1. Добавляем корневой сертификат в разделе "System / Certificate Manager / CAs"

  • Descriptive name: internal-ca
  • Method: Create an internal Certificate Authority
  • Common Name: internal-ca

2. Добавляем сертификаты серверов VPN (to-server, to-client) в разделе "System / Certificate Manager / Certificates"

  • Method: Create an internal Certificate
  • Descriptive name: ovpn-ra-to-server (ovpn-ra-to-client)
  • Certificate authority: internal-ca
  • Common Name: ovpn-ra-to-server (ovpn-ra-to-client)
  • Certificate Type: Server Certificate


3. Добавляем сервера VPN через "VPN / OpenVPN / Servers"

  • Server mode: Remote Access ( SSL/TLS )
  • Local port: 1194 (1195 для to-client)
  • Description: ovpn-ra-to-server (ovpn-ra-to-client)
  • Server certificate: ovpn-ra-to-server (ovpn-ra-to-client)
  • IPv4 Tunnel Network: 10.0.8.0/24 (10.0.9.0/24 для to-client)
  • Custom options: для to-client

это маршруты между сетями которые передаются на клиенты OVPN.

4. Добавляем пользователей с клиентскими сертификатами через "System / User Manager / Users", пример для сервера 1С:

  • Disabled: true (This user cannot login)
  • Username: server_1c
  • Password: 123
  • Certificate: true (Click to create a user certificate)
  • Certificate authority: internal-ca
  • Descriptive name: server_1c

5. Добавляем правила доступа к серверу через "Firewall / Rules / WAN"

  • Protocol: UDP
  • Destination: WAN address
  • Destination Port Range: from 1194 to 1195

Поле добавления в форме списка правил применяем правила "Apply Changes"

6. Для удобной генерации конфигурационных файлов клиентов устанавливаем пакет "openvpn-client-export" через "System / Package Manager / Available Packages"

7. Формируем, скачиваем конфигурационные файлы клиентов через "VPN / OpenVPN / Client Export"

Выбираем нужный сервер, напротив имени пользователя скачиваем конфигурационный файл



8. Скачиваем клиент OpenVPN с официального сайта


10. На главной странице админ панели добавляем виджет OpenVPN и убеждаемся что оба клиента подключены



11. Разрешаем доступ по OVPN через "Firewall / Rules / OpenVPN"

Добавляем правило с

12. Проверяем доступ с клиента до сервера через ping 10.0.8.2

Закрытие доступа к админ панели

В разделе "System / Advanced / Admin Access" устанавливаем флаг Anti-lockout: true (Disable webConfigurator anti-lockout rule)

Запуск на сервере как сервис

Для постоянной работы на стороне сервера 1С (без привязки к клиентскому сеансу) имеет смысл запустить OVPN клиент как службу.

1. отключить подключение через GUI

2. Запустить сервис "OpenVPNService" и поставить автоматический запуск


Итак, у нас есть туннель до VPN-провайдера и мы хотим быть уверены что весь трафик, включая DNS запросы, идёт только через этот туннель, а в случае его недоступности пользователи ни в коем случае не должны выходить напрямую через сеть провайдера. Установлена pfSense CE версии 2.5.2, регистрация на CyberGhost пройдена - поехали.

CyberGhost

У вас может быть и другой VPN-провайдер,- CyberGhost выбран ввиду простоты настройки и для демонстрации настройки получения DNS серверов при подключении. Если в вашей стране не заблокирован ExpressVPN, то настройки будут практически идентичны.



Далее на странице VPN > Управление устройствами видим pfSense в списке активных VPN-устройств. Нажимаем на "просмотреть" в новом окне и скачиваем архив с конфигураций. Username и Password нам также пригодятся при настройке клиента.

Сертификаты

Распаковываем скачанный архив pfsense_openvpn.zip и видим там несколько файлов. Для начала нам нужны ca.crt, client.crt и client.key.

Переходим в pfSense на страницу System / Certificate Manager / CAs и жмём кнопку Add.


Называем это дело GyberGhost VPN CA, выбираем в качестве метода Import an existing Certificate Authority и вставляем содержимое файла ca.crt данные в поле Certificate data. CA импортирован.


Теперь переходим на вкладку System / Certificate Manager / Certificates, кнопка Add, выбираем в качестве метода Import an existing Certificate, называем CyberGhost Client Certificate и копируем содержимое файла client.crt в поле Certificate data, а файла client.key - в поле Private key data.



OpenVPN клиент

Настроим OpenVPN клиент. Жмём Add на странице VPN / OpenVPN / Clients, а также открываем содержимое файла openvpn.ovpn из архива. В моём случае это выглядит так:

Начинаем заполнять поля настройки клиента. Если что-то не указано, то оставляем по умолчанию. Поехали:

Server port: порт из строки remote, в моём случае 443

Description: CyberGhost VPN

Username/Password: копируем со страницы предварительного просмотра роутера (см. выше)

TLS Configuration: убираем

Peer Certificate Authority: CyberGhost VPN CA

Client Certificate: CyberGhost VPN Client Certificate

Data Encryption Negotiation: отключаем (строка ncp-disable)

Fallback Data Encryption Algorithm: оставляем AES-256-CBC (строка cipher)

Auth digest algorithm: оставляем SHA256 (строка auth)

Pull DNS: позволяет использовать предоставляемый клиенту DNS, включаем

Сохраняем и на странице Status / OpenVPN проверяем что клиент подключился (Status = up):


Настройка DNS

Нашей задачей является запрет на использование публичных DNS серверов клиентами сети,- мы не хотим показывать куда ходят клиенты через VPN туннель (т.е. исключить DNS Leak).


Для начала назначим OpenVPN интерфейс, это нам пригодится в дальнейшем. На странице Interfaces / Interface Assignments выбираем ovpnc1 и нажимаем Add. Называем CyberGhost_VPN, чекаем Enable и сохраняем.


Переходим на страницу System / General Setup и убираем всё из списка DNS Servers. Ставим галочку DNS Server Override, - это позволит использовать получаемый от OpenVPN сервер DNS в качестве форвардера.


Настроим DNS сервер на Services / DNS Resolver / General Settings. Разрешаем запросы только на LAN и loopback интерфейсах - Network Interfaces = LAN, Localhost. Выбираем в Outgoing Network Interfaces только CyberGhost_VPN и ставим галочку у DNS Query Forwarding.

Исключаем DNS Leak

Вот тут начинаются хитрости. В зависимости от типа подключения к провайдеру нам нужно произвести разные настройки чтобы исключить попадание провайдерских DNS в список форвардеров,- иначе при отвале VPN'а все DNS запросы пойду через следующий по приоритету DNS, т.е. тот что мы автоматически получаем от провайдера.

Создадим Host Entry перечислив полученные адреса через запятую:


Если для подключения к провайдеру используется статический адрес - то по данной части всё готово, никакие другие DNS'ы кроме тех что прилетают при подключении по OpenVPN у нас не появятся.

Если же у нас DHCP подключение то нужно отключить приём настроек DNS через DHCP. В настройках интерфейса нет такой опции, но есть Configuration Override, позволяющая использовать собственный конфигурационный файл. Вот ею и воспользуемся.

Скопируем скрипт запускаемый при подключении по DHCP:

И поменяем там лишь строку `script`:

Указываем путь к нашему конфигу в Configuration File Override:


Вот и всё - теперь настройки DNS получаемые по DHCP будут игнорироваться.

Аналогично, теперь получаемые по PPPoE настройки DNS будут игнорироваться. Но это ещё не всё.

Тут внимательные пользователи pfSense могут спросить - а зачем все эти правки, если получаемый по OpenVPN DNS сервер будет иметь приоритет над теми что прилетают через DHCP/PPPoE? Дело в том, что если по каким-то причинам DNS сервер VPN провайдера не отвечает, то резолвер начнёт пробовать отправлять запрос к следующему по приоритету DNS серверу, и запросы пойдет мимо туннеля.

Настройка Firewall

Нужно исключить возможность использования пользователями/программами нашей локалки каких-либо других DNS серверов кроме того предоставляется VPN провайдером.

Для этого создадим правило блокирующее DNS-over-TLS трафик (853 TCP порт) на вкладке Firewall / Rules / LAN - Add со стрелочкой вверх(!):

Action: Reject

Address Family: IPv4

Protocol: TCP

Source/Destination: Any

И создадим Port Forwarding правило перенаправляющее все DNS запросы наружу на наш pfSense. Вкладка Firewall / NAT / Port Forward -> Add:

Interface: LAN

Address Family: IPv4

Protocol: TCP/UDP

Destination: Invert match - включить, Type: LAN Address

Destination port range: DNS

Redirect target IP: LAN address

Redirect target port: DNS

Filter rule association: Add associated filter rule

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


На странице System / Advanced / Miscellaneous включаем Skip rules when gateway is down, - это нужно для того, чтобы при отвале VPN'а не создавались правила использующие шлюз этого VPN. В этом случае правила как бы "не будет", а следом нет и других правил,- соответственно deny, трафик будет дропаться.

Создадим же само правило (Add со стрелочкой вниз):

Action: Pass

Interface: LAN

Address Family: IPv4

Protocol: Any

Source: LAN net

Destination: Any

Advanced Options / Gateway: CYBERGHOST_VPN_VPNV4

Итого у нас должен получиться следующий порядок правил:


Настроим Outbound NAT для клиентов локальной сети. На Firewall / NAT / Outbound переключаем Mode в "Hybrid Outbound NAT rule generation" и нажимаем Save. Теперь можно добавить следующее правило:

Interface: CYBERGHOST_VPN

Address Family: IPv4

Protocol: any

Source: адрес нашей LAN сети, в моём случае - 192.168.3.0/24

Destination: Any

Address: Interface Address

Теперь IP адреса хостов LAN сети попадая в туннель будут автоматически транслироваться в адрес OpenVPN-интерфейса (маскарадинг).

Настройка pfBlockerNG

Подробнее про настройку этого чудо-блокировщика я уже писал ранее, поэтому пробежимся только по тому что нам от него нужно. Для начала установим пакет pfBlockerNG-devel через System / Package Manager / Available Packages, сделаем дефолтную настройку с помощь визарда на Firewall / pfBlockerNG и перейдём к специфичным для нас вещам.


А именно блокировке DoH серверов. На странице Firewall / pfBlockerNG / DNSBL / DNSBL SafeSearch переводим DoH/DoT Blocking в Enable и выбираем через Ctrl+A все сервера в DoH/DoT Blocking List.

В принципе, это основное что нам нужно от pfBlockerNG - исключить DNS leak через DoH сервера. При желании можно настроить фиды для блокировки IP или DNS адресов, например использовать фиды из категории Firebog_Trackers для блока трек-адресов или блокировать рекламу с помощью Firebog_Advertisement, ADs и Easylist фидов.

Не забываем запустить Force / DNSBL на Firewall / pfBlockerNG / Update для применения изменений.

Готово


Можно дополнительно проверить что трафик не пойдёт мимо VPN'а если тот отвалится,- просто остановите OpenVPN клиент на Status / OpenVPN (иконка с "кирпичиком") и убедитесь что клиенты даже не смогут ничего пинговать по IP адресу.

Как уже говорилось в начале, данная конфигурация применима и к другим VPN провайдерам работающим по OpenVPN, незначительные отличия могут быть лишь в правильной "интерпретации" .ovpn конфига и для настройки OpenVPN клиента в pfSense.

Читайте также: