Установим и настроим OpenConnect VPN сервер в Linux. Установим VPN клиент в Linux, Windows, MacOS и Android. Протестируем скорость VPN соединения. И улучшим скорость VPN соединения с алгоритмом контроля перегрузки от компании Google.
Требования
Чтобы следовать этому руководству, вам понадобятся:
- Виртуальный сервер VPS/VDS с OC Linux (Debian).
- Доменное имя (например, vpn.yourdomain.com) и SSL/TLS сертификат для доменного имени, чтобы включить HTTPS для OpenConnect VPN.
Если какое-то требование у вас не выполнено, то следуйте инструкции по ссылке: «Перед установкой OpenConnect VPN«.
Установка и настройка OpenConnect VPN сервера
Установка в Linux (ОС Debian)
Установим OpenConnect VPN сервер:
apt install ocserv
Узнать статус OpenConnect VPN сервера можно командой:
systemctl status ocserv
После установки OpenConnect VPN сервер запускается автоматически. Если автоматический запуск прошел успешно, то статус будет active (running):

По умолчанию OpenConnect VPN сервер прослушивает по протоколам TCP и UDP порт 443 (см. рисунок выше).
Ручной запуск, остановка, перезапуск
Чтобы вручную запустить OpenConnect VPN сервер:
systemctl start ocserv
Чтобы вручную остановить OpenConnect VPN сервер:
systemctl stop ocserv
Для перезагрузки:
systemctl restart ocserv
Конфигурационный файл /etc/ocserv/ocserv.conf
Отредактируем конфигурационный файл OpenConnect VPN сервера, который называется /etc/ocserv/ocserv.conf.
Отключим аутентификацию VPN клиентов с использованием пользовательских учетных записей операционной системы. Для этого найдем строку:
auth = "pam[gid-min=1000]"
И закомментируем ее, т.е. добавим символ # в начале строки:
#auth = "pam[gid-min=1000]"
С помощью утилиты ocpasswd мы создадим учетные записи (логин/пароль) VPN клиентов. Эти учетные записи будут храниться в закодированном виде в файле паролей /etc/ocserv/ocpasswd. Займемся этим в следующем разделе статьи, а пока продолжим редактирование конфигурационного файла.
Включим аутентификацию VPN клиентов по паролю и укажем путь к файлу паролей:
auth = "plain[passwd=/etc/ocserv/ocpasswd]"
Не будем использовать протокол UDP, поэтому ищем строку:
udp-port = 443
И закомментируем ее:
#udp-port = 443
Пропишем пути к SSL/TLS сертификату, который будет использовать OpenConnect VPN сервер. Для этого найдем следующие две строки:
server-cert = /etc/ssl/certs/ssl-cert-snakeoil.pem
server-key = /etc/ssl/private/ssl-cert-snakeoil.key
Исправим в этих строках пути к SSL/TLS сертификату:
server-cert = /etc/letsencrypt/live/vpn.yourdomain.com/fullchain.pem
server-key = /etc/letsencrypt/live/vpn.yourdomain.com/privkey.pem
Keepalive пакеты — это специальные сетевые пакеты, которые помогают поддерживать активное соединение и предотвращать автоматический разрыв соединения. По умолчанию keepalive пакеты отправляются каждые 300 секунд (5 минут). Чтобы уменьшить вероятность разрыва VPN соединения, можно уменьшить период отправки keepalive пакетов до 30 секунд:
keepalive = 30
MTU (Maximum Transmission Unit) discovery — это процесс определения максимального размера пакета данных (MTU), который может быть передан через сетевое соединение между двумя устройствами. Включим MTU discovery, поменяв значение false на true:
try-mtu-discovery = true
С помощью двух параметров idle-timeout и mobile-idle-timeout можно задать время в секундах, в течение которого клиенту разрешено бездействовать, прежде, чем он будет отключен. По умолчанию idle-timeout — это 1200 секунд (20 минут), modile-idle-timeout — это 1800 секунд (30 минут). Чтобы клиент оставался на связи ограниченное время, просто закомментируйте эти параметры.
Установим домен по умолчанию vpn.yourdomain.com:
default-domain = vpn.yourdomain.com
Чтобы избежать конфликта IP-адресов VPN сети с другой сетью, находим следующую строку:
ipv4-network = 192.168.1.0
И приводим ее к виду:
ipv4-network = 10.10.10.0
Так, мы сменили очень популярный диапазон IP адресов 192.168.1.0/24 на непопулярный 10.10.10.0/24.
Сервер для клиентов будет шлюз по умолчанию (default gateway). Для этого в конфигурационном файле закомментируем все маршруты (route), чтобы это выглядело так:
#route = 10.0.0.0/8
#route = 172.16.0.0/12
#route = 192.168.0.0/16
#route = fd00::/8
#route = default
#no-route = 192.168.5.0/255.255.255.0
Будем использовать только протокол TLS 1.3. Поэтому предыдущие версии протокола TLS отключим. Для этого находим строку:
tls-priorities = "NORMAL:%SERVER_PRECEDENCE:%COMPAT:-RSA:-VERS-SSL3.0:-ARCFOUR-128"
И приводим ее к виду:
tls-priorities = "NORMAL:%SERVER_PRECEDENCE:%COMPAT:-RSA:-VERS-SSL3.0:-ARCFOUR-128:-VERS-TLS1.0:-VERS-TLS1.1:-VERS-TLS1.2"
Сохраняем изменения в конфигурационном файле и перезагружаем OpenConnect VPN сервер:
systemctl restart ocserv
Учетные записи VPN клиентов
С помощью утилиты ocpasswd создадим учетную запись (логин/пароль) для VPN клиента. Например, логин выберем vpnuser, а файл паролей, где будут храниться в закодированном виде учетные записи VPN клиентов, — /etc/ocserv/ocpasswd. Вводим команду:
ocpasswd -c /etc/ocserv/ocpasswd vpnuser
Далее, нужно будет ввести пароль для логина vpnuser и повторить его ввод.
Чтобы сбросить пароль для логина vpnuser, просто введите указанную выше команду еще раз.
Чтобы удалить учетную запись с логином vpnuser, введите команду:
ocpasswd -c /etc/ocserv/ocpasswd -d vpnuser
Включение Network Address Translation (NAT)
Включим Network Address Translation (NAT), который позволит Linux-серверу с VPN сервером действовать в качестве шлюза для VPN клиентов, преобразуя их частные IP адреса в общедоступный IP адрес Linux-сервера при общении с Интернетом.
Сначала включим IP Forwarding. Это возможность сетевого устройства, работающего в качестве шлюза между двумя сетями, пересылать сетевой трафик от одной сети к другой. Для этого в файле /etc/sysctl.conf раскомментируем строку (т.е. удалим в начале строки символ #), чтобы стало вот так:
net.ipv4.ip_forward=1

Сохраняем файл. А чтобы применить изменения, введем команду:
sysctl -p
Теперь узнаем имя сетевого интерфейса, подключенного к сети Интернет:
ifconfig
У меня имя такого сетевого интерфейса — eth0:

Настроим правило NAT, для этого введем команду:
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
где eth0
— это имя сетевого интерфейса, подключенного к сети Интернет.
Чтобы изменения iptables сохранились при перезагрузке Linux-сервера, выполним команду:
iptables-save > /etc/iptables/rules.v4
Готово! Теперь OpenConnect VPN сервер готов принимать клиентские подключения.
Установка VPN клиента в Linux, Windows, MacOS, Android и iOS
Установка в Linux (ОС Debian)
VPN клиент в Linux (ОС Debian) называется OpenConnect. Установим клиент командой:
apt install openconnect
Запустим OpenConnect VPN клиент и подключимся к серверу vpn.yourdomain.com, к порту 443:
openconnect -b vpn.yourdomain.com:443
-b
— для запуска OpenConnect VPN клиента в фоновом режиме (background mode).
После ввода логина и пароля VPN клиента устанавливается VPN соединение. Используется протокол TLS 1.3. OpenConnect VPN клиент продолжает работу в фоновом режиме.

Чтобы остановить OpenConnect VPN клиент, введите команду:
pkill openconnect
Установка в Windows и MacOS
VPN клиент в Windows/MacOS, который поддерживает TLS 1.3 — это Cisco Secure Client версии 5. Нам понадобится только модуль Core & AnyConnect VPN:

После установки Cisco Secure Client версии 5 и запуска AnyConnect VPN клиента вводим https://vpn.yourdomain.com, а затем логин и пароль VPN клиента:

После установления VPN соединения в окне Дополнительные параметры можно просмотреть информацию о транспортной сети и используемом протоколе TLS 1.3.

Установка в Android и iOS
Ищем в Google Play или App Store приложение Cisco Secure Client, устанавливаем и запускаем его.

Добавляем новое подключение. В поле Адрес сервера вводим адрес OpenConnect VPN сервера (vpn.yourdomain.com) и нажимаем кнопку Готово.

Далее, нажимаем на AnyConnect VPN для подключения. И вводим логин и пароль VPN клиента.

После установления VPN соединения, нажав в приложении на Сведения Статистика VPN, можно просмотреть информацию о транспортной сети и используемом протоколе TLS 1.3.
Скорость VPN соединения
Протестируем скорость VPN соединения с помощью https://www.speedtest.net/.
У меня без VPN результаты получились такие:

С включенным VPN результаты такие:

Давайте оптимизируем производительность TCP соединений путем включения BBR (Bottleneck Bandwidth and RTT) — алгоритма контроля перегрузки, разработанного компанией Google. BBR имеет ряд преимуществ перед другими алгоритмами контроля перегрузки, такими как Cubic или Reno.
Узнать текущий используемый алгоритм контроля перегрузки можно с помощью команды:
sysctl net.ipv4.tcp_congestion_control
Изменим текущий алгоритм контроля перегрузки на BBR. Для этого добавим в файл /etc/sysctl.conf следующие две строки:
net.core.default_qdisc=fq
net.ipv4.tcp_congestion_control=bbr
Сохраняем файл. А чтобы применить изменения, введем команду:
sysctl -p
У меня с включенным VPN и включенным TCP BBR результат по скорости получился такой:

Обновление SSL/TLS сертификата
Если используете SSL/TLS сертификат от Let’s Encrypt, то команда по обновлению сертификата:
certbot renew
После обновление SSL/TLS сертификата необходимо перезагружать OpenConnect VPN сервер:
systemctl restart ocserv
Для автоматизации этих двух действий (обновления сертификата и перезагрузки VPN сервера) добавим задачу в crontab пользователя root. Для этого под пользователем root введем команду:
crontab -e
И добавим следующую строку:
30 2 * * 1 /usr/bin/certbot renew --quiet && /bin/systemctl restart ocserv
&&
— оператор указывает, что следующая после него команда будет выполнена, если предыдущая команда завершилась успешно.
Выводы
Я надеюсь, что это руководство помогло вам установить и настроить OpenConnect VPN. Если остались вопросы, пожалуйста, спрашивайте в комментариях под статьей. Будет интересно!
Комментарии
Почему-то ocserv не запускается нормально, active:failed
и error connecting to sec-mod socket
Привет! Текст ошибки говорит, что проблема с подключением к SOCKS-серверу. Успешно ли он запущен? Чтобы сказать что-то более конкретное, нужен конфиг SOCKS-сервера.
Добрый день, подскажите как можно предотвратить подключение одного пользователя к нескольким сессиям? Иначе это крайне не безопасно как-то получается
Спасибо за интересный вопрос! Следить за активными сессиями пользователей и блокировать попытку подключения, если уже есть активная сессия с тем же именем пользователя, умеет RADIUS-сервер. Поэтому нужна связка: OpenConnect VPN сервер и, например, FreeRADIUS сервер. Настолько понравился Ваш вопрос, что появилась целая статья «RADIUS server. Аутентификация для OpenConnect VPN сервера«.
Добрый день, Ирина! Установил у себя ocserv на дебиан12. Подскажите пожалуйста, если знаете, как сделать, что бы адреса подключенных клиентов, не НАТились выходя в локальную сеть с ВПН-сервера? Иначе получается, что из локальной сети, даже нет возможности пинговать ВПН-клиентов, не говоря уже о подключении к ним по РДП, например.
Привет, Родион.
Если локальная сетка, например, 192.168.1.0/24, то можно назначить VPN клиентам, например, 192.168.100.0/24 и маршрутизировать трафик. Это если в двух словах. Если подробнее, то:
1) отключаем NAT для VPN клиентов. Для этого правим конфиг /etc/ocserv/ocserv.conf:
use-ipv4-nat = false
2) настраиваем раздачу IP адресов VPN клиентам из локальной сети. Правим тот же /etc/ocserv/ocserv.conf:
ipv4-network = 192.168.100.0
ipv4-netmask = 255.255.255.0
и перезагружаем VPN сервер
3) разрешаем forwarding. Правим конфиг /etc/sysctl.conf:
net.ipv4.ip_forward = 1
и применяем изменения:
sysctl -p
4) прописываем маршрут в локальной сети. Например, если VPN сервер 192.168.1.2, то на основном шлюзе нужно добавить роут:
ip route add 192.168.100.0/24 via 192.168.1.2
Запись означает, что для доступа к VPN клиентам надо обращаться через VPN сервер.
Написала это в теории, проверить негде 🙂 Напишите, как на практике?