Установка и настройка VPN-сервера OpenConnect (ocserv) на Rocky Linux 9 или AlmaLinux 9

В этом пособии объясняется процесс развертывания собственного VPN-сервера с установкой OpenConnect VPN-сервера на Rocky Linux 9 или AlmaLinux 9. OpenConnect, также известный как ocserv, представляет собой реализацию с открытым исходным кодом протокола Cisco AnyConnect VPN, который активно применяется в корпоративных и учебных средах. AnyConnect — это VPN-протокол, работающий на основе HTTPS, который позволяет пользователям устанавливать соединение с удаленной сетью.

Почему стоит создать свой собственный VPN-сервер?

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

Настройка VPN-сервера OpenConnect (ocserv) на Rocky Linux 9 или AlmaLinux 9.

Характеристики 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 Мбит/с.

Тест скорости VPN с сервером в Сингапуре (Ocserv).

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

Тест скорости VPN через Ocserv в Сингапуре

Улучшение скорости

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.
Драйвер TAP для Windows в OpenConnect

Одновременная работа 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 на название хоста второго виртуального хоста.

[vhost:vpn2.example.comПозволить аутентификацию по паролю и сертификату

enable-auth = "plain[passwd=/etc/ocserv/ocpasswd]"
auth = "certificate"
tcp-port = 443

Уберите комментарии с двух строк, если ocserv функционирует за HAProxy.

#listen-host = 127.0.0.1
#listen-proxy-proto = true

Настройки SSL/TLS

ca-cert = /etc/ocserv/ssl/ca-cert. pem
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. Как обычно, если вы считаете эту статью ценной, подписывайтесь на нашу бесплатную рассылку, чтобы получать больше советов и рекомендаций.

Читайте также:  Безопасность в Linux: Управление доступом к команде su