pfSense: COVID VPN

Подготовка

Имеется 3 маршрутизатора каждый с двумя WAN (ТТК и РТК). Все маршрутизаторы соединены между собой OpenVPN подключением типа Site to Site. Примерная конфигурация маршрутизаторов:
CPU: i5-4570
RAM: 16GB
AES-NI CPU Crypto: Yes
Kernel PTI: Disabled
WAN: 1Gb/s

Ремарка: да, памяти очень много, но что поделать только такие конфигурации были доступны. В реальности хватит и 8GB. Если у вас процессор AMD или Intel, но девятой серии или вовсе серверный процессор, то Kernel PTI может показывать Enabled и это нормально и потери в производительности не будет. Если оставите включенным на старых процессорах Intel, то VPN туннель будет работать ощутимо медленнее как и при отключенном AES-NI. Потому, если у вас процессор AMD серии FX, то лучше либо поменять на Intel серии i или поменять на процессор с архитектурой Zen поскольку в процессорах FX отсутствуют инструкции AES-NI, а шифровать туннель будем именно на AES.

При изучении документации OpenVPN обнаружилась директива remote-random, что позволяет клиентам выбирать сервер слачайным образом при подключении. Это во-первых, позволит распределить нагрузку между тремя маршрутизаторами, что хорошо скажется на системных ресурсах и пропускной способности интерфейсов,а во-вторых, будет какой никакой failover, на случай если у какого-то маршрутизатора возникнут проблемы последней мили. Далее было решено понизить уровень шифрования до AES-128-GCM, чтобы точно быть уверенным, что памяти хватит на обслуживание такого количества клиентов (к примеру, если потеряется связь с 2/3 маршрутизаторов) да и показалось, что GCM работает быстрее CBC.

Работать будет следующим образом: создается инструкция по работе с VPN, где будет указана ссылка на клиенты. Клиенты экспортируем из pfSense и загружаем в Google Drive. Сотрудники скачивают клиент, устанавливают, нажимают подключиться, вводят логин и пароль от Active Directory и подключаются к офисной сети. Времени на сборку MSI пакетов с готовой конфигурацией и установкой по GPO с запуском в виде службы не хватило да и не знаю как вытащить пароли из базы данных Active Directory. Потому просто раздали всем административные права по GPO за день до переездов.

Настройка сервера

Поскольку в работе будут участвовать все 3 маршрутизатора, то надо зарегистрировать на внешнем днс 6 доменных адресов. Скажем пусть будут такие:
office1-ttk.kontora.ru
office2-ttk.kontora.ru
office3-ttk.kontora.ru
office1-rtk.kontora.ru
office2-rtk.kontora.ru
office3-rtk.kontora.ru

Надо сгенерировать сертификат сервера в System -> Certificate Manager -> CAs. Затем сертификат клиентский в System -> Certificate Manager -> Certificates.

Далее настройка сервера аутентификации в System -> User Manager -> Authentication Servers:

Поскольку мы обращаемся к серверу, который находится в изолированной VLAN, то мы обращаемся по открытому порту 389. Если у вас трафик идет через публичную сеть, где сидят все пользователи, то лучше направить трафик по транспорту SSL на порт 636. Если вы незнаете, то Base DN формируется из доменного имени контроллера домена (DC означает Domain Controller). Жмем win+pause и в открывшемся окне смотрим значение параметра "Домен". Например, если домен контроллера dc.kontora.ru, то Base DN будет dc=dc, dc=kontora, dc=ru. В Authentication Containers задаем группу и пользователи которые будут входить в нее смогут пройти аутентификацию. Поскольку 500+ народу добавлять в группу руки отвалятся, то решили просто указать ту группу, в которую все пользователи входят по умолчанию (доступ все равно нужен всем).

Теперь настраиваем VPN сервер:

В опции IPv4 Local Networks указываем локальные сети к которым нужен доступ через VPN через запятую. Скажем если публичная сеть у маршрутизаторов:
192.168.0.0/23
192.168.1.0/23
192.168.2.0/23
И если туннельные сети скажем:
10.214.0.0/23
10.214.1.0/23
10.214.2.0/23
То надо их всех перечислить в IPv4 Local Networks, чтобы все могли взаимодействовать друг с другом.

В DNS Default Domain указываем DNS-prefix т.е. домен второго уровня (например, kontora.ru) и указываем IP-адрес DNS сервера. Также ставим галочку Block Outside DNS, чтобы вместо клиентских настроек DNS использовался DNS офисного сервера для корректного резолва IP-адресов внутренних ресурсов по доменным именам.

Похожим образом настраиваем и остальные маршрутизаторы.

Настройка клиента

Экспортируем клиент с VPN -> OpenVPN -> Client Export и распаковываем архив используя архиватор 7-Zip. Подправляем конфиг следующим образом:

dev tun
persist-tun
persist-key
cipher AES-128-GCM
ncp-ciphers AES-128-GCM
auth SHA256
tls-client
client
resolv-retry infinite
remote office1-ttk.kontora.ru 1197 udp
remote office2-ttk.kontora.ru 1197 udp
remote office3-ttk.kontora.ru 1197 udp
remote-random
auth-user-pass
remote-cert-tls server

<ca>
-----BEGIN CERTIFICATE-----
Тут содержимое CA сертификата
-----END CERTIFICATE-----
</ca>
setenv CLIENT_CERT 0
<tls-crypt>
#
# 2048 bit OpenVPN static key
#
-----BEGIN OpenVPN Static key V1-----
Тут содержимое TLS ключа
-----END OpenVPN Static key V1-----
</tls-crypt>

Сохраняем конфиг. Ставим 7-Zip SFX Builder или 7-Zip SFX Maker и упаковываем все обратно с последующим запуском инсталлятора клиента после распаковки. Задаем имя что-то в духе vpn-office-ttk.exe и создаем аналогичным образом второй пакет изменив адреса remote на адреса RTK.

Показать комментарии