Установим и настроим 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 сервера

По умолчанию 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
Включение IP Forwarding

Сохраняем файл. А чтобы применить изменения, введем команду:

sysctl -p

Теперь узнаем имя сетевого интерфейса, подключенного к сети Интернет:

ifconfig

У меня имя такого сетевого интерфейса — eth0:

Команда ifconfig

Настроим правило 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 клиента

Чтобы остановить OpenConnect VPN клиент, введите команду:

pkill openconnect

Установка в Windows и MacOS

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

Cisco Secure Client версии 5

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

Запуск AnyConnect VPN клиента в Windows

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

AnyConnect VPN поддерживает протокол TLS 1.3

Установка в Android и iOS

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

Cisco Secure Client для Android

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

Cisco Secure Client для Android. Адрес OpenConnect VPN сервера

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

Cisco Secure Client для Android. Логин и пароль для подключения к OpenConnect VPN

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

Скорость VPN соединения

Протестируем скорость VPN соединения с помощью https://www.speedtest.net/.

У меня без VPN результаты получились такие:

Speedtest соединения без VPN

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

Speedtest соединения 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 результат по скорости получился такой:

Speedtest соединения 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 сервер.

      Написала это в теории, проверить негде 🙂 Напишите, как на практике?

Добавить комментарий

Этот сайт защищен reCAPTCHA, и к нему применяются Google Политика конфиденциальности и Условия использования.

Войти

Зарегистрироваться

Сбросить пароль

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