В данном руководстве вы узнаете, как настроить сервер OpenConnect VPN (ocserv) и веб-серверы Apache или Nginx на одном сервере с использованием HAProxy. OpenConnect (ocserv) представляет собой открытую реализацию протокола VPN Cisco AnyConnect.

Содержание статьи
Предварительные условия
Чтобы использовать это руководство, предполагается, что вы уже установили сервер OpenConnect VPN и получили сертификат TLS от Let’s Encrypt. Если это не так, пожалуйста, ознакомьтесь с одним из следующих инструкций.
- Настройка OpenConnect VPN сервера (ocserv) на Ubuntu 20.04 с использованием сертификатов Let’s Encrypt.
- Установка и настройка OpenConnect VPN (ocserv) на Ubuntu 16.04/18.04 с использованием Let’s Encrypt.
- Конфигурация сервера OpenConnect VPN (ocserv) на Debian 10 Buster с использованием сертификатов Let’s Encrypt.
- Конфигурация сервера OpenConnect VPN (ocserv) на CentOS 8/RHEL 8 с использованием сертификатов Let’s Encrypt.
Совместное применение сервера OpenConnect VPN и веб-сервера на одном порту 443.
Сервер OpenConnect VPN по умолчанию работает на порту 443. Если на этом порту уже запущен Apache или Nginx, то ocserv не сможет его использовать. Вы можете изменить порт, на котором будет работать ocserv, однако это потребует от пользователей указания нового порта в клиентском программном обеспечении, что не рекомендуется, если вы хотите обеспечить хороший пользовательский опыт. Кроме того, трафик TLS на TCP-порту 443 обычно имеет приоритет в системе качества обслуживания (QoS), что обеспечивает более высокую скорость соединения.
Как правило, порт может быть занят лишь одним процессом. Тем не менее, с помощью HAproxy (прокси с высокой доступностью) и SNI (индикации имени сервера) мы можем настроить одновременное использование порта 443 для ocserv и Apache/Nginx.
Настройка ocserv
В первую очередь необходимо внести изменения в конфигурационный файл ocserv.
sudo nano /etc/ocserv/ocserv.conf
Удалите комментарий на следующей строке. Это даст возможность ocserv получить IP-адрес клиента вместо IP-адреса HAproxy.
listen-proxy-proto = true
После этого перейдите к следующей строке.
#listen-host = [IP|HOSTNAME]
listen-host = 127.0.0.1
Это приведет к тому, что ocserv будет слушать на 127.0.0.1, так как позже HAproxy должен будет принимать соединения на публичном IP-адресе. Сохраните изменения в файле и закройте его. Затем перезапустите ocserv.
sudo systemctl restart ocserv
Затем необходимо настроить веб-сервер на прослушивание только локального адреса, а не общего IP-адреса.
Настройка Nginx
При использовании Nginx необходимо внести изменения в файл конфигурации серверного блока.
sudo nano /etc/nginx/conf.d/example.com.conf
В блоке SSL вашего сервера найдите указанную директиву.
listen 443 ssl;
listen 127.0.0.2:443 ssl;
Теперь мы настроим прослушивание на 127.0.0.2:443, так как 127.0.0.1:443 уже занят процессом ocserv. Не забудьте сохранить изменения и закрыть файл. В основном конфигурационном файле Nginx, расположенном по пути /etc/nginx/nginx.conf, а также в блоке сервера по умолчанию /etc/nginx/sites-enabled/default может быть виртуальный хост, который слушает 443 порт, поэтому, возможно, вам также потребуется внести изменения в этот файл.
После этого перезапустите Nginx.
sudo systemctl restart nginx
Настройка Apache
При использовании веб-сервера Apache, необходимо внести изменения в файл виртуального хоста.
sudo nano /etc/apache2/sites-enabled/example.com.conf
sudo nano /etc/httpd/conf.d/example.com.conf
В SSL-виртуальном хосте внесите изменения.
В этот раз мы настроим его для прослушивания на 127.0.0.2:443, так как 127.0.0.1:443 уже используется ocserv. Не забудьте сохранить изменения и закрыть файл.
После этого внесите изменения в файл /etc/apache2/ports.conf на системах Debian/Ubuntu.
sudo nano /etc/apache2/ports.conf
Измените файл /etc/httpd/conf.d/ssl.conf на системах CentOS/RHEL.
sudo nano /etc/httpd/conf.d/ssl.conf
Listen 443
Listen 127.0.0.2:443
Сохраните изменения в файле и закройте его. Затем перезапустите Apache.
sudo systemctl restart apache2
sudo systemctl restart httpd
Настройка HAProxy
Теперь необходимо установить HAproxy.
sudo apt install haproxy
sudo dnf install haproxy
sudo systemctl start haproxy
Измените файл настройки.
sudo nano /etc/haproxy/haproxy.cfg
Если вы работаете с Nginx, добавьте следующие строки в конец конфигурационного файла. Подставьте вместо 12.34.56.78 публичный IP-адрес вашего сервера. Вместо vpn. example.com укажите доменное имя, используемое ocserv, а www.example.com — домен вашего веб-сервера.
frontend https bind 12.34.56.78:443 режим tcp задержка инспекции tcp-запроса 5 секунд содержимое tcp-запроса принимается, если< req_ssl_hello_type 1 >используйте_backend ocserv, если< req_ssl_sni - i vpn. example.com >используй_backend nginx, если< req_ssl_sni - i www. example.com >используй_backend nginx, если< req_ssl_sni - i example.com > default_backend ocserv backend ocserv mode tcp option ssl-hello-chk # передача запросов на 127.0.0.1:443. Заголовок протокола прокси (v2) требуется ocserv. server ocserv 127.0.0.1:443 send-proxy-v2 backend nginx mode tcp option ssl-hello-chk server nginx 127.0.0.2:443 check
Если вы работаете с Apache, добавьте следующие строки в конец вашего конфигурационного файла. Подмените 12.34.56.78 на публичный IP-адрес вашего сервера. Также замените vpn. example.com на доменное имя, используемое ocserv, а www.example.com на адрес, который использует ваш веб-сервер.
frontend https bind 12.34.56.78:443 режим tcp задержка инспекции tcp-запроса 5 секунд содержимое tcp-запроса принимается, если< req_ssl_hello_type 1 >используйте_backend ocserv, если< req_ssl_sni - i vpn. example.com >Использовать backend apache, если< req_ssl_sni - i www. example.com >Использовать backend apache, если< req_ssl_sni - i example.com > default_backend ocserv backend ocserv mode tcp option ssl-hello-chk # передача запросов на 127.0.0.1:443. Заголовок протокола прокси (v2) требуется ocserv. server ocserv 127.0.0.1:443 send-proxy-v2 backend apache mode tcp option ssl-hello-chk server apache 127.0.0.2:443 check
Закройте и сохраните файл, после чего перезапустите HAproxy.
sudo systemctl restart haproxy
В данной конфигурации была применена функция SNI (Server Name Indication) в протоколе TLS для разделения VPN-трафика и обычного HTTPS-трафика.
- Когда в TLS Client Hello обнаруживается vpn. example.com, HAProxy перенаправляет поток данных на бэкенд ocserv.
- Когда www.example.com оказывается в TLS Client Hello, HAProxy направляет трафик на бэкенд, используя apache или nginx.
- Если клиент не задает имя сервера в запросе TLS Client Hello, то HAproxy выберет стандартный бэкенд (ocserv).
Эту конфигурацию можно проверить с использованием утилиты openssl. Для начала выполните несколько раз следующую команду.
echo | openssl s_client - connect your-server-IP:443 | grep subject
В приведенной выше команде мы не указали название сервера, поэтому HAproxy будет всегда направлять запрос на бэкенд по умолчанию (ocserv), и его сертификат будет отправлен клиенту. Далее выполните две следующие команды.
echo | openssl s_client - servername www. example.com - connect your-server-IPВот уникальный вариант текста:






