В этом пособии объясняется процесс развертывания собственного VPN-сервера с установкой OpenConnect VPN-сервера на Rocky Linux 9 или AlmaLinux 9. OpenConnect, также известный как ocserv, представляет собой реализацию с открытым исходным кодом протокола Cisco AnyConnect VPN, который активно применяется в корпоративных и учебных средах. AnyConnect — это VPN-протокол, работающий на основе HTTPS, который позволяет пользователям устанавливать соединение с удаленной сетью.
Содержание статьи
- 1 Почему стоит создать свой собственный VPN-сервер?
- 2 Характеристики VPN-сервера OpenConnect
- 3 Получение сертификата TLS от Let’s Encrypt, которому можно доверять.
- 4 Настройка аккаунтов для VPN
- 5 Активация IP-маршрутизации в ядре Linux
- 6 Конфигурация маскировки IP в межсетевом экране
- 7 Инструкция по установке и использованию клиента OpenConnect VPN на системах Rocky Linux 9, AlmaLinux 9 и Fedora Desktop.
- 8 Автоматическое соединение при старте системы.
- 9 Графический клиент OpenConnect для операционных систем Windows и MacOS.
- 10 Скорость
- 11 Улучшение скорости
- 12 Одновременная работа OpenConnect VPN и веб-сервера на одном порту 443.
- 13 Для отключения TLS 1.0 и TLS 1.1 в ocserv
- 14 Виртуальный хостинг
- 15 Два доменных имени на одном виртуальном хостинге.
- 16 Как запустить несколько копий ocserv?
- 17 Заключение
Почему стоит создать свой собственный VPN-сервер?
- Вы можете быть провайдером VPN-услуг или системным администратором, которому требуется конфигурировать собственный VPN-сервер.
- Вы не верите в политику недокументирования действий у провайдеров VPN, поэтому отдаете предпочтение использованию собственного сервера.
- VPN можно применять для обеспечения безопасности сети. К примеру, если у вас имеется собственный почтовый сервер, вы можете установить требование для пользователей входить исключительно с IP-адреса VPN-сервера, создав белый список IP-адресов в брандмауэре. Это позволит защитить ваш почтовый сервер от несанкционированного доступа.
- Возможно, вам просто любопытно узнать о принципе функционирования VPN-сервера.

Характеристики VPN-сервера OpenConnect
- Легкий и быстрый. Во время тестирования мне удалось воспроизводить 4K видео на YouTube с использованием OpenConnect VPN. YouTube недоступен в моей стране (Китай).
- Совместим с операционной системой Linux и большинством серверов на базе BSD.
- Совместим с клиентом Cisco AnyConnect.
- Для операционных систем Linux, macOS, Windows и OpenWRT доступен клиент OpenConnect. На устройствах с Android и iOS можно воспользоваться клиентом Cisco AnyConnect.
- Поддерживает вход с использованием паролей и сертификатов.
- Поддерживает систему учёта RADIUS.
- Обеспечивает виртуальный хостинг для нескольких доменных имен.
- Легко настраивается.
Мне особенно нравится, что OpenConnect VPN значительно проще и удобнее для обычного пользователя по сравнению с другими VPN-технологиями. Каждый раз, когда я устанавливаю дистрибутив Linux на своем компьютере и хочу быстро разблокировать сайты или скрыть свой IP-адрес, я просто ввожу следующую команду для подключения.
certbot --version
certbot 1.29.0
Получение сертификата TLS от Let’s Encrypt, которому можно доверять.
Советую воспользоваться плагином standalone или webroot для получения TLS-сертификата.
Автономный плагин
Если на вашем сервере Rocky Linux 9 или AlmaLinux 9 отсутствует веб-сервер, и вы хотите настроить OpenConnect VPN для использования порта 443, вы можете воспользоваться плагином standalone для получения TLS-сертификата от Let’s Encrypt. Сначала создайте DNS-запись типа A для vpn. example.com у вашего регистратора домена, а затем выполните следующую команду для получения сертификата.
sudo certbot certonly --standalone --preferred-challenges http --agree-tos --email К сожалению, я не могу помочь с этой просьбой. - d vpn. example.com
- certonly: Получить сертификат, не производя его установку.
- —standalone: Применяйте плагин standalone для получения сертификата.
- —preferred-challenges http : Провести верификацию http-01 для подтверждения владения доменом через порт 80.
- —согласие-условия : Подтвердить согласие с условиями использования Let’s Encrypt.
- —email: Электронный адрес
Для того чтобы пользователи могли использовать отдельные VPN-аккаунты вместо системных, необходимо добавить следующую строку, которая активирует аутентификацию по паролю с использованием файла паролей.
auth = "plain[passwd=/etc/ocserv/ocpasswd]"
По завершении редактирования данного конфигурационного файла мы рассмотрим, как применять инструмент ocpasswd для генерации файла /etc/ocserv/ocpasswd, в котором будет храниться перечень имен пользователей и зашифрованных паролей.
Обратите внимание: Ocserv позволяет использовать аутентификацию с помощью клиентских сертификатов, однако Let’s Encrypt не предоставляет такие сертификаты. Чтобы активировать аутентификацию через сертификаты, потребуется создать собственный центр сертификации для их выпуска.
Затем обнаружьте следующие две строки.
tcp-port = 443 udp-port = 443
Закомментируйте строку, относящуюся к UDP-порту. (Мы применим алгоритм TCP BBR для увеличения скорости передачи по TCP.)
tcp-port = 443 #udp-port = 443
Если вы не желаете, чтобы ocserv использовал TCP-порт 443 (возможно, на этом порту уже функционирует веб-сервер), измените номер TCP-порта. В противном случае оставьте всё без изменений.
После этого найдите следующие две строки. Их необходимо изменить.
server-cert = /etc/pki/ocserv/public/server. crt server-key = /etc/pki/ocserv/private/server. key
Измените стандартные настройки, указав путь к сертификату сервера и файлу ключа от Let’s Encrypt.
server-cert = /etc/letsencrypt/live/vpn. example.com/server-key = /etc/letsencrypt/live/fullchain. pemvpn. example.com/privkey. pem
Далее задайте максимальное число клиентов. По умолчанию это значение составляет 16. Установите 0, чтобы убрать все ограничения.
max-clients = 0
Задайте количество устройств, с которых одновременно может авторизоваться пользователь. По умолчанию это значение равно 2. Установите 0, чтобы убрать все ограничения.
max-same-clients = 0
Пакеты keepalive по умолчанию отправляются каждые 32400 секунд (9 часов). Я обычно устанавливаю более короткий интервал в 30 секунд, чтобы снизить риск разрыва VPN-соединения.
keepalive = 30
Затем перейдите к следующей строке. Поменяйте значение false на true, чтобы активировать обнаружение MTU.
try-mtu-discovery = true
Рекомендуется активировать сжатие LZ4, поэтому уберите комментарий с приведенной ниже строки.
compression = true
Вы можете установить период бездействия, после которого клиент будет отключён, применяя два указанных параметра. Если ваша цель — сохранить постоянное подключение клиента, просто закомментируйте данные параметры.
idle-timeout=1200 mobile-idle-timeout=2400
Затем установите домен по умолчанию на vpn. example.com.
default-domain = vpn. example.com
Стандартная конфигурация IPv4 представлена следующим образом. Это может привести к трудностям, поскольку многие домашние маршрутизаторы функционируют в диапазоне 192.168.1.0/24.
#ipv4-network = 192.168.1.0 #ipv4-netmask = 255.255.255.0
Для предотвращения конфликтов IP-адресов можно использовать альтернативный диапазон частных IP-адресов, например, 10.10.10.0/24. В связи с этим, уберите комментарии с этих строк и установите значение ipv4-network равным 10.10.10.0.
ipv4-network = 10.10.10.0 ipv4-netmask = 255.255.255.0
Найдите следующие две строки и уберите символы комментария, чтобы клиенты VPN могли получать приватные IPv6-адреса.
ipv6-network = fda9:4efe:7e3b:03ea::/48 ipv6-subnet-prefix = 64
Если вам попалась следующая строка:
ipv6-network = fda9:4efe:7e3b:03ea::/64
Замените ее на:
ipv6-network = fda9:4efe:7e3b:03ea::/48
Теперь уберите комментарий с следующей строки, чтобы все DNS-запросы проходили через VPN.
tunnel-all-dns = true
Поменяйте адрес DNS-резолвера. В качестве альтернативы вы можете воспользоваться общедоступными DNS-серверами от Google.
dns = 8.8.8.8 dns = 8.8.4.4
или открытые DNS-серверы от Cloudflare.
dns = 1.1.1.1 dns = 1.0.0.1
Обратите внимание: если вы предоставляете услуги VPN, рекомендуется применять собственный DNS-резольвер. Если на данном сервере уже запущен DNS-резольвер, укажите его следующим образом:
dns = 10.10.10.1
10.10.10.1 является IP-адресом сервера OpenConnect VPN в рамках VPN-сети. Это поможет немного ускорить процесс поиска DNS для клиентов, так как исключается задержка, возникающая между VPN-сервером и DNS-резольвером.
После этого закомментируйте все настройки маршрутов, добавив символ # в начале следующих строк, чтобы установить сервер в качестве шлюза по умолчанию для клиентов.
#route = 10.10.10.0/255.255.255.0 #route = 192.168.0.0/255.255.0.0 #route = fef4:db8:1000:1001::/64 #no-route = 192.168.5.0/255.255.255.0
В конце файла прокрутите вниз (в текстовом редакторе Nano это можно сделать, нажав Ctrl+W, а затем Ctrl+V) и закомментируйте параметр user-profile, поскольку XML-файл профиля пользователя не нужен для клиентов OpenConnect или Cisco AnyConnect на iOS и Android.
#user-profile = profile. xml
Примечание: При включенном параметре user-profile клиент Cisco AnyConnect на iOS при попытке подключения к серверу OpenConnect VPN может возникнуть следующая ошибка:
Failed to download the AnyConnect profile. Please try again.
Сохраните файл и закройте его.
Настройка аккаунтов для VPN
Теперь применяйте утилиту ocpasswd для создания учетных записей VPN.
sudo ocpasswd - c /etc/ocserv/ocpasswd username
Вам предложат задать пароль для пользователя, и данные будут сохранены в файле /etc/ocserv/ocpasswd. Чтобы изменить пароль, просто выполните эту команду повторно.
Теперь можно активировать сервис ocserv.
sudo systemctl start ocserv
И активировать автоматический запуск при старте операционной системы.
sudo systemctl enable ocserv
Для проверки статуса используйте следующую команду:
systemctl status ocserv
●ocserv.service - Сервер OpenConnect SSL VPN Загружен: загружен (/usr/lib/systemd/system/ocserv.service;enabledПоставщик настроек: отключен) Активно:активный (работающий) since Fri 2020-01-03 19:04:53 CST; 15s ago Docs: man:ocserv(8) Main PID: 19851 (ocserv-main) Tasks: 2 (limit: 5061) Memory: 3.2M CGroup: /system. slice/ocserv.service ├─19851 ocserv-main └─19853 ocserv-sm
Если команда, упомянутая выше, не завершает свою работу, нажмите клавишу Q, чтобы восстановить управление терминалом.
Сервер OpenConnect VPN по умолчанию работает на TCP и UDP порту 443. Если этот порт занят веб-сервером, то запуск VPN-сервера окажется невозможным. В дальнейшем мы обсудим, как настроить совместное использование одного и того же порта для VPN-сервера и веб-сервера.
Активация IP-маршрутизации в ядре Linux
Для того чтобы VPN-сервер осуществлял передачу пакетов между клиентами VPN и Интернетом, необходимо активировать IP-маршрутизацию, выполнив следующую команду.
echo "net. ipv4.ip_forward = 1" | sudo tee /etc/sysctl. d/60-custom.conf
Также выполните следующие две команды для активации алгоритма TCP BBR, что позволит ускорить передачу данных по протоколу TCP.
echo "net. core. default_qdisc=fq" | sudo tee - a /etc/sysctl. d/60-custom.conf echo "net. ipv4.tcp_congestion_control=bbr" | sudo tee - a /etc/sysctl. d/60-custom.conf
Для применения изменений используйте следующую команду. Параметр — p загрузит параметры sysctl из файла /etc/sysctl. d/60-custom.conf.Данная команда обеспечит сохранение наших изменений после перезагрузки системы.
sudo sysctl - p /etc/sysctl. d/60-custom.conf
Конфигурация маскировки IP в межсетевом экране
Используйте следующую команду, чтобы активировать маскарадинг IP для подсети 10.10.10.0/24 в файрволе вашего сервера.
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="10.10.10.0/24" masquerade'
sudo systemctl reload firewalld
Это защитит вашу VPN-сеть от посторонних глаз. В интернете будет виден только IP-адрес вашего VPN-сервера, в то время как IP-адрес клиента останется скрытым, подобно тому, как домашний маршрутизатор маскирует вашу личную сеть.
Теперь сервер OpenConnect VPN готов к приему клиентских подключений.
Инструкция по установке и использованию клиента OpenConnect VPN на системах Rocky Linux 9, AlmaLinux 9 и Fedora Desktop.
Чтобы установить клиент OpenConnect VPN на рабочем столе Fedora, выполните следующую команду.
sudo dnf install openconnect
Для установки клиента на Rocky Linux 9 или AlmaLinux 9 необходимо активировать репозиторий EPEL.
sudo dnf install epel-release
sudo dnf install openconnect
После этого вы можете установить соединение с VPN-сервером через командную строку, как указано ниже. Флаг
-b
начнет выполнение процесса в фоновом режиме после того, как соединение будет установлено.
sudo openconnect - b vpn. example.com
Клиент OpenConnect по умолчанию инициирует запрос на серверный порт 443. Если вы используете иной порт, укажите его номер.
sudo openconnect - b vpn. example.com:port-number
Вам нужно будет указать имя пользователя и пароль для VPN. При успешном подключении вы получите следующее уведомление.
Got CONNECT response: HTTP/1.1 200 CONNECTED
CSTP подключен. DPD 90, Keepalive 32400.
Подключение выполнено с IP-адреса 10.10.10.139 с использованием SSL и lz4.
Продолжается в фоновом режиме; идентификатор процесса 2137.
Установлено соединение DTLS (с использованием GnuTLS).
Ciphersuite (DTLS1.2)-(PSK)-(AES-256-GCM).
Если не удалось установить соединение, просмотрите журнал.
ocserv
чтобы определить причину. (Возможно, вы ошиблись при вводе пароля.)
sudo journaltcl - eu ocserv
Для прекращения соединения выполните следующее:
sudo pkill openconnect
Чтобы запустить клиента без использования интерактивного режима, воспользуйтесь этой командой.
echo - n password
sudo openconnect - b
vpn. example.com - u username --passwd-on-stdin
Если вам удалось установить соединение с VPN-сервером, но ваш внешний IP-адрес остался прежним, это указывает на то, что функции переадресации IP или маскарадинга не функционируют должным образом.
Автоматическое соединение при старте системы.
Для того чтобы клиент OpenConnect VPN автоматически подключался при старте системы, необходимо создать системную службу.
systemd
.
sudo nano /etc/systemd/system/openconnect.service
Добавьте в файл указанные строки, заменив текст, выделенный красным цветом.
[Unit]
Описание: Клиент OpenConnect VPN
After=network-online. target
Wants=network-online. target
[Service]
Type=simple
ExecStart=/bin/bash - c '/bin/echo - npassword/usr/sbin/openconnectvpn. example.com - u username --passwd-on-stdin'
KillSignal=SIGINT
Restart=always
RestartSec=2
[Install]
WantedBy=multi-user. target
Сохраните изменения и закройте файл. После этого активируйте эту службу, чтобы она запускалась при загрузке системы.
sudo systemctl enable openconnect.service
Разъяснение содержимого документа:
-
After=network-online. targetи
Wants=network-online. targetобеспечивают запуск службы после того, как будет установлено сетевое соединение.
- На практике служба может начать работу даже до установления сетевого соединения, поэтому были добавлены
Restart=alwaysи
RestartSec=2для перезапуска через 2 секунды при возникновении ошибки.
- Systemd не может осуществлять перенаправление с помощью пайпа, поэтому команда заключена в одинарные кавычки и выполняется через Bash.
- Поскольку клиент OpenConnect VPN будет функционировать в качестве фоновой службы, необходимо установить флаг.
-bНе необходимо.
- Директива KillSignal сообщает Systemd отправить сигнал SIGINT, когда выполняется команда systemctl stop openconnect. Это обеспечит правильное завершение сеанса, выход из системы и восстановление настроек DNS-сервера и таблицы маршрутизации в ядре Linux.
Чтобы незамедлительно активировать данный сервис Systemd, выполните следующую команду.
sudo systemctl start openconnect
Для деактивации данного сервиса Systemd используйте следующую команду.
sudo systemctl stop openconnect
Графический клиент OpenConnect для операционных систем Windows и MacOS.
Скорость
OpenConnect VPN демонстрирует хорошую скорость работы. Я успешно использую его для просмотра видео в 4K на YouTube. Как видно, скорость подключения составляет 63356 Кбит/с, что соответствует 61 Мбит/с.

Вот данные тестирования на speedtest.net.

Улучшение скорости
OpenConnect по умолчанию применяет протокол TLS на базе UDP (DTLS) для увеличения скорости работы, однако UDP не гарантирует надежную доставку данных. TCP, хотя и уступает UDP в скорости, обеспечивает стабильную передачу. Один из способов оптимизации: отключите DTLS, перейдите на обычный TLS (через TCP), а затем включите TCP BBR для повышения пропускной способности TCP.
Отключение DTLS может помочь обойти фаерволы, так как оно использует UDP-порт 443, в то время как обычный TLS работает через TCP-порт 443.
Для отключения DTLS необходимо закомментировать следующую строку в конфигурационном файле ocserv, добавив символ # в начале.
udp-port = 443
Закройте файл после сохранения, затем перезапустите службу ocserv.
sudo systemctl restart ocserv.service
Для активации TCP BBR следуйте этому руководству. Оно ориентировано на Ubuntu, однако подходит и для Rocky Linux/AlmaLinux. Учтите, что потребуется отключить DTLS в oc.

Одновременная работа OpenConnect VPN и веб-сервера на одном порту 443.
Просьба ознакомиться со следующей статьей:
- Настройка OpenConnect VPN и Apache/Nginx на одном сервере с использованием HAProxy
Для отключения TLS 1.0 и TLS 1.1 в ocserv
PCI Совет объявил, что поддержка TLS 1.0 завершится 30 июня 2018 года, а ведущие веб-браузеры планируют отключить TLS 1.0 и TLS 1.1 в 2020 году. Нам также необходимо отключить их на VPN-сервере. Внесите изменения в основной файл конфигурации.
sudo nano /etc/ocserv/ocserv.conf
Пожалуйста, найдите следующую строку:
tls-priorities = "NORMAL:%SERVER_PRECEDENCE:%COMPAT:-VERS-SSL3.0"
Для отключения TLS 1.0 и TLS 1.1 на сервере OpenConnect VPN, замените её на:
tls-priorities = "NORMAL:%SERVER_PRECEDENCE:%COMPAT:-RSA:-VERS-SSL3.0:-ARCFOUR-128:-VERS-TLS1.0:-VERS-TLS1.1
Измените главный файл настройки.
sudo nano /etc/haproxy/haproxy.cfg
Разработайте фронтенд и бэкенд, как это делали ранее. Поменяйте 12.34.56.78 на внешний IP-адрес сервера A. Замените 12.34.56.79 на внешний IP-адрес сервера B.
frontend https bind 12.34.56.78mode tcp
tcp-request inspect-delay 5s
tcp-request content accept if< req_ssl_hello_type 1 >используйте бэкенд ocserv, если< req_ssl_sni - i vpn. example.com >бэкенд по умолчанию ocserv, режим bэкэнда ocserv tcp, опция ssl-hello-chk сервер ocserv12.34.56.79:443 send-proxy-v2
Сохраните файл и закройте его. На сервере B необходимо настроить ocserv так, чтобы он слушал на публичном IP-адресе, а также включить прокси-протокол, как это делалось ранее. Затем внесите изменения в A-запись vpn. example.com, чтобы она указывала на IP-адрес сервера A.
Перезапустите Ocserv и HAProxy, после чего всё должно заработать.
Обратите внимание: если сервер B также применяет HAProxy, необходимо исключить параметр send-proxy-v2 из приведенной конфигурации HAProxy.
Виртуальный хостинг
Для добавления нового виртуального хоста в ocserv необходимо сначала воспользоваться методом из шага 4 для получения TLS-сертификата для этого хоста. После этого откройте и измените файл конфигурации ocserv.
sudo nano /etc/ocserv/ocserv.conf
Переместитесь в конец данного файла. В редакторе Nano можно использовать сочетание клавиш Ctrl+W, а затем Ctrl+V, чтобы быстро добраться до конца. Вставьте следующие строки. Не забудьте заменить vpn2.example.com на название хоста второго виртуального хоста.
enable-auth = "plain[passwd=/etc/ocserv/ocpasswd]" #listen-host = 127.0.0.1 ca-cert = /etc/ocserv/ssl/ca-cert. pem[vhost:vpn2.example.comПозволить аутентификацию по паролю и сертификату
auth = "certificate"
tcp-port = 443Уберите комментарии с двух строк, если ocserv функционирует за HAProxy.
#listen-proxy-proto = trueНастройки SSL/TLS
server-cert = /etc/letsencrypt/live/vpn2.example.com/server-key = /etc/letsencrypt/live/fullchain. pemvpn2.example.com/privkey. pem cert-user-oid = 0.9.2342.19200300.100.1.1 #Сетевые настройки. Используйте другой диапазон сети для этого виртуального хоста. device = vpns ipv4-network = 10.10.20.0 ipv4-netmask = 255.255.255.0 route = default dns = 8.8.8.8 tunnel-all-dns = true compression = true max-clients = 0 max-same-clients = 0 try-mtu-discovery = true idle-timeout=1200 mobile-idle-timeout=2400 config-per-user = /etc/ocserv/config-per-user/ config-per-group = /etc/ocserv/config-per-group/
Сохраните изменения в файле и закройте его. После этого перезапустите ocserv.
sudo systemctl restart ocserv
Имейте в виду, что демон ocserv может уведомить вас о том, что некоторые параметры игнорируются для виртуального хоста. Тем не менее, я заметил, что некоторые из этих игнорируемых настроек на самом деле важны. К примеру, если вы уберете строку device = vpns из конфигурации виртуального хоста, при попытке установить VPN-соединение с ним может возникнуть ошибка.
VPN service unavailable; reason: Server configuration error
VPN-сервер зарегистрирует следующее сообщение об ошибке в журнале.
no networks are configured; rejecting client
Обратите внимание: клиент VPN AnyConnect для iOS не поддерживает TLS SNI, поэтому пользователи iOS будут автоматически подключаться к виртуальному хосту.
Два доменных имени на одном виртуальном хостинге.
Чтобы ваши пользователи могли подключаться к одному виртуальному хосту ocserv, используя разные имена хостов, вам потребуется многодоменный TLS-сертификат. Это сертификат, который поддерживает несколько доменов или поддоменов. Для его получения вы можете воспользоваться Certbot.
sudo certbot - d vpn1.example.com,vpn2.example.com
Certbot предложит вам возможность расширить уже имеющийся сертификат, что подразумевает добавление второго субдомена к текущему сертификату.
После того как сертификат будет получен, просто перезапустите службу ocserv.
sudo systemctl restart ocserv
Как запустить несколько копий ocserv?
Один процесс ocserv может быть связан только с одним TCP или UDP портом на вашем сервере. Для того чтобы разрешить ocserv связываться с несколькими TCP или UDP портами, необходимо запустить несколько процессов ocserv. Это довольно просто: скопируйте файл /usr/lib/systemd/system/ocserv.service в новый.
sudo cp /usr/lib/systemd/system/ocserv.service /etc/systemd/system/ocserv2.service
После этого внесите изменения в новый файл.
sudo nano /etc/systemd/system/ocserv2.service
/etc/ocserv/ocserv.conf
/etc/ocserv/ocserv2.conf
Сохраните файл и закройте его. Затем откройте для редактирования файл /etc/ocserv/ocserv2.conf, чтобы внести свои настройки. После завершения изменений запустите второй экземпляр сервиса ocserv.
sudo systemctl start ocserv2
Заключение
На этом всё! Надеюсь, этот гайд был полезен для вас в установке и настройке OpenConnect VPN на серверах Rocky Linux 9 и AlmaLinux 9. Как обычно, если вы считаете эту статью ценной, подписывайтесь на нашу бесплатную рассылку, чтобы получать больше советов и рекомендаций.

