Запустите OpenConnect VPN Server и веб-сервер Apache или Nginx на одном сервере с использованием HAProxy

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

ocserv-apache-nginx-haproxy

Предварительные условия

Чтобы использовать это руководство, предполагается, что вы уже установили сервер 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.

Читайте также:  Настройка прокси-сервера Shadowsocks-libev на CentOS/Rocky Linux

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Вот уникальный вариант текста:

bashvpn. example.com - connect your-server-IP:443 | grep subject

Теперь мы задали имя сервера в командах, что позволит HAproxy направлять запросы в соответствии с установленными нами правилами SNI. Имейте в виду, что приложение Cisco AnyConnect не поддерживает TLS SNI, поэтому рекомендуется установить ocserv в качестве бэкенда по умолчанию в конфигурации HAProxy.

При обновлении сертификата Let's Encrypt для вашего сайта лучше использовать http-01 challenge вместо tls-alpn-01 challenge, так как HAproxy работает на порту 443 вашего публичного IP-адреса, что может затруднить обновление.

sudo certbot renew --preferred-challenges http-01

Устранение неполадок в HAproxy

Если ваш сайт на Apache или Nginx не загружается в браузере, и в журнале haproxy (/var/log/haproxy.log) появляются следующие сообщения.

Сервер nginx/nginx недоступен, причина: Ошибка сокета, информация: "Соединение сброшено соперником, бэкенд nginx не имеет доступного сервера! Layer6 недействительный ответ

Ваш бэкенд Nginx, возможно, применяет TLS-сертификат с активированным расширением OCSP must staple. Обратите внимание, что Nginx не передает данные об OCSP staple в первом HTTP-запросе. Для корректной работы необходимо убедиться, что вы включили резолвер в конфигурацию виртуального хоста Nginx, как показано ниже.

< . ssl_trusted_certificate /etc/letsencrypt/live/www. example.com/chain. pem; ssl_stapling on; ssl_stapling_verify on; resolver 8.8.8.8; . >

Сохраните изменения в файле и закройте его. После этого перезапустите Nginx.

sudo systemctl restart nginx

Рассмотрите вариант отключения проверки состояния для бэкенд-сервера в HAproxy.

server nginx 127.0.0.2:443 check

server nginx 127.0.0.2:443

Закройте и сохраните файл, после чего перезапустите HAproxy.

sudo systemctl restart haproxy

Как активировать поддержку IPv6 в ocserv с использованием HAProxy

Сначала добавьте запись AAAA для vpn. example.com в редактор DNS-зоны, чтобы после завершения настройки IPv6 в ocserv DNS-запись была доступна в Интернете.

Проверка подключения по протоколу IPv6.

Для настройки VPN-туннеля с использованием протокола IPv6 проверьте, чтобы у VPN-сервера был доступный публичный IPv6-адрес. (VPN-клиенту наличие публичного IPv6-адреса не обязательно.) Чтобы узнать эту информацию, выполните следующую команду.

ip addr

Определите основной сетевой интерфейс. Если в выводе обнаружится строка inet6 . scope global, это будет свидетельствовать о наличии публичного IPv6-адреса. В то время как адрес inet6 с областью link указывает на частный IPv6-адрес.

адрес ipv6 с глобальной областью действия

Затем перейдите на сайт https://test-ipv6.com/, чтобы протестировать ваше соединение по протоколу IPv6. Если ваш VPN-клиент обнаружит публичный IPv6-адрес, он может уведомить вас, что защита осуществляется только для одного из протоколов, а не для обоих. Это происходит из-за того, что мы не активировали поддержку IPv6 в ocserv.

Ваш VPN защищает только один протокол, а не оба.

Активируйте поддержку IPv6 в ocserv.

Для активации IPv6 в ocserv необходимо внести изменения в конфигурационный файл ocserv.

sudo nano /etc/ocserv/ocserv.conf

Найдите следующие две строки и удалите символы комментария, чтобы клиенты 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

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

sudo systemctl restart ocserv

Активируйте переадресацию IP для протокола IPv6.

Далее необходимо активировать пересылку IP для IPv6 в ядре Linux. Для этого отредактируйте файл sysctl.conf.

sudo nano /etc/sysctl.conf

Вставьте эту строку в конце данного файла.

net. ipv6.conf.all. forwarding=1

Сохраните файл и закройте его. После этого внесите изменения, используя следующую команду.

sudo sysctl - p

Конфигурируйте IPv6 в фаерволе (Debian, Ubuntu)

Следующим шагом необходимо настроить скрытие IPv6 в брандмауэре UFW, чтобы сервер функционировал как виртуальный маршрутизатор для клиентов VPN.

sudo nano /etc/ufw/before6.rules

В таблице фильтров по умолчанию уже установлены некоторые правила. Добавьте указанные строки в конец файла, заменив ens3 на название вашего сетевого интерфейса. В редакторе Nano для перехода к концу файла нажмите Ctrl+W, а затем Ctrl+V.

# Правила таблицы NAT *nat :POSTROUTING ACCEPT [0:0] - A POSTROUTING - o ens3 - j MASQUERADE # Завершите каждую таблицу строкой 'COMMIT', иначе эти правила не будут обработаны COMMIT

Маскировка IPv6 в файрволе UFW.

По умолчанию UFW блокирует пересылку пакетов. Для нашей приватной сети IPv6 можно разрешить пересылку. Откройте цепочку ufw6-before-forward в указанном файле и добавьте три строки, которые разрешат пересылку пакетов, если исходный или целевой IP адрес находится в диапазоне fda9:4efe:7e3b:03ea::/48.

# разрешить пересылку для VPN - A ufw6-before-forward - s fda9:4efe:7e3b:03ea::/48 - j ACCEPT - A ufw6-before-forward - d fda9:4efe:7e3b:03ea::/48 - j ACCEPT

разрешить пересылку пакетов для сети ipv6 в ufw

Закройте и сохраните файл. Также требуется предоставить клиентам IPv6 VPN доступ через цепочку INPUT в брандмауэре.

sudo ufw allow in from fda9:4efe:7e3b:03ea::/48

Перезапустите UFW, чтобы применить изменения.

sudo systemctl restart ufw

Теперь, если вы выполните команду для вывода правил в цепочке POSTROUTING таблицы NAT, это можно сделать следующим образом:

sudo ip6tables - t nat - L POSTROUTING

Вы сможете ознакомиться с правилом Masquerade.

включите IPv6 в ocserv для OpenConnect VPN

Отключите активное VPN-соединение, добавьте AAAA-запись для vpn. example.com и заново подключитесь к VPN. После этого посетите сайт https://test-ipv6.com/ для проверки соединения по протоколу IPv6.

Конфигурация IPv6 в межсетевом экране (CentOS)

Активируйте маскировку для IPv6.

sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv6" source address="fda9:4efe:7e3b:03ea::/48" masquerade'

Предоставьте клиентам доступ к VPN через цепочку INPUT.

sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv6" source address="fda9:4efe:7e3b:03ea::/48" accept'

Перезапустите firewalld, чтобы изменения начали действовать.

sudo systemctl reload firewalld

Конфигурация IPv6 в DNS-сервере BIND

Если вы настраиваете собственный резольвер BIND на VPN-сервере, добавьте следующую строку в файл /etc/ocserv/ocserv.conf, чтобы использовать VPN-сервер в качестве DNS-резольвера для клиентов VPN.

dns = fda9:4efe:7e3b::1

Сохраните файл и закройте его. Для того чтобы выполнять запросы DNS-имен через IPv6, необходимо настроить BIND на разрешение для VPN-клиентов по протоколу IPv6.

Debian/Ubuntu

sudo nano /etc/bind/named.conf.options

Найдите настройку allow-recursion и измените ее на:

allow-recursion < 127.0.0.1; 10.10.10.0/24; fda9:4efe:7e3b:03ea::/48; >;

Сохраните изменения и закройте файл. Затем перезапустите BIND9.

sudo systemctl restart bind9

CentOS

sudo nano /etc/named.conf

Найдите настройку allow-query и измените ее на:

allow-query < 127.0.0.1; 10.10.10.0/24; fda9:4efe:7e3b:03ea::/48; >;

Сохраните изменения и закройте файл. Затем перезапустите BIND9.

sudo systemctl restart named

Конфигурация IPv6 в HAProxy

Измените файл настройки HAProxy.

sudo nano /etc/haproxy/haproxy.cfg

Настройте фронтенд HTTPS для работы как с IPv4, так и с IPv6 адресами. Естественно, необходимо использовать публичный IPv6 адрес вашего сервера.

Привязка HTTPS на стороне фронтенда.12.34.56.78Объект 443 привязан.2607:f8b0:4006:810::200eПерепиши текст так, чтобы он стал оригинальным:

:443 режим tcp, задержка проверки tcp-запросов 5 секунд, принимать содержимое tcp-запросов при условии

Затем откройте бэкенд ocserv и подключите сервер с поддержкой IPv6.

backend ocserv mode tcp option ssl-hello-chk server ocserv 127.0.0.1:443 send-proxy-v2 server ocserv6 [::1]:443 send-proxy-v2

Закройте файл и сохраните изменения.

Для настройки ocserv на прослушивание адресов 127.0.0.1 и ::1 необходимо внести изменения в файл /etc/hosts.

sudo nano /etc/hosts

Измените запись для 127.0.0.1 и ::1, чтобы домен vpn. example.com мог быть доступен по обоим адресам.

127.0.0.1 localhost vpn. example.com::1 ip6-локальный хост ip6-цикл обратной связиvpn. example.com

Сохраните файл и закройте его. После этого внесите изменения в конфигурационный файл ocserv.

sudo nano /etc/ocserv/ocserv.conf

Определите последующую строку.

listen-host = 127.0.0.1

listen-host = vpn. example.com

ocserv обнаружит IPv4 и IPv6 адреса для vpn. example.com в файле /etc/hosts и будет связан с адресами 127.0.0.1 и ::1. Не забудьте сохранить изменения и закрыть файл. После этого перезапустите ocserv и HAProxy.

sudo systemctl restart ocserv sudo systemctl restart haproxy

Теперь выполните команду для проверки состояния прослушивания ocserv. Вы обнаружите, что он принимает подключения на 127.0.0.1 и ::1.

sudo ss - lnpt | grep ocserv

sudo ss - lnpt | grep ocserv ipv6

Проверка соединения по протоколу IPv6.

Перезапустите клиент VPN и посетите сайт https://test-ipv6.com/ для проверки вашего соединения по IPv6. Если всё будет в порядке, вы увидите IPv4 и IPv6 адреса вашего VPN-сервера в тестовых результатах. При этом сообщение о том, что "VPN защищает только один протокол", должно исчезнуть.

Проверка соединения IPv6 с VPN ocserv

Если в результате тестирования вы не обнаружили IPv6-адрес вашего VPN-сервера, попробуйте перезапустить VPN-клиенты и вновь установить соединение с VPN.

Обратите внимание: VPN-клиент не обязан иметь публичный IPv6-адрес. Он может подключаться к IPv6 через VPN-туннель на основе IPv4.

Заключение

Надеюсь, этот гид оказался полезным для вас в настройке сервера OpenConnect VPN и веб-серверов Apache/Nginx на одной машине. Если вам понравилась эта информация, не забудьте подписаться на нашу бесплатную рассылку, чтобы получать дополнительные советы и рекомендации.