Как разделить трафик VPN из трафика https на том же порту с помощью haproxy?

У меня есть следующая цель: Запуск softhether vpn и веб-приложений через порт 443. Я хочу, чтобы весь трафик приходил на haproxy, который отправляет vpn в один контейнер, а остальной - в другой контейнер (traefik), который, наконец, перераспределяется в соответствующие контейнеры на основе веб-приложения. На самом деле это возможно, но я не могу заставить его работать.

Настройка: 2 Виртуальные машины в XenServer (как на базе Debian, так и под управлением Docker)

Адрес VM1 10.0.0.244

Адрес VM2 10.0.0.245

VM1:

  • выполняется контейнер haproxy, с использованием сетевого режима «хост» прослушивание порта 443 (то есть 10.0.0.245:443)

  • запуск программного контейнера VPN-сервера с использованием сетевого режима "host" прослушивание порта 992 (т. е. 10.0.0.245:992)[1286 impressionVM2:[1287 impressionrunning traefik reverse proxy container, docker internal network, отображает 443 хоста на локальный 443

  • , запускающий несколько веб-приложений / контейнеров, также на внутренняя сеть докеров, нет сопоставленных портов от хоста, только доступ к внутренней сети докеров. Веб-приложения доступны через такие имена, как webappX.domain.com и т. Д., Через обратный прокси traefik.

Важно отметить, что если DNS указывает webappX.domain.com на 10.0.0.245, то traefic выполняет свою работу, и все веб-приложения доступны через браузер. Кроме того, когда я пытаюсь подключиться к softhether vpn с моего Mac на порт 992, соединение устанавливается (оно также работало, когда я экспериментировал с более мягким прослушиванием порта 443 и отключением haproxy). Запись DNS для vpn.domain.com указывает на 10.0.0.244.

После добавления haproxy я переназначил записи DNS для webappX.domain.com на 10.0.0.244.

Вот моя конфигурация haproxy (я подозреваю, что здесь где-то лежит проблема):

defaults
  timeout client 30s
  timeout server 30s
  timeout connect 5s

frontend ft_https
  bind :443
  mode tcp
  tcp-request inspect-delay 5s
  tcp-request content accept if { req.ssl_hello_type 1 }
  default_backend bk_https

backend bk_https
  mode tcp
  acl vpn_app req_ssl_sni -i vpn.domain.com

  use-server server-se if vpn_app
  use-server server-traefik if !vpn_app

  option ssl-hello-chk
  server server-se localhost:992 check
  server server-traefik 10.0.0.245:443 check

Одним из ключевых требований является то, что traefik должен получать полный URL (например, https://webappX.domain.com ), чтобы он мог правильно выполнять обратное проксирование. Также завершение SSL не должно происходить на haproxy.

Есть ли у вас какие-либо советы / предложения относительно того, что изменить или попробовать, чтобы это работало?

Спасибо. Брэндон.

0
задан 21 September 2018 в 00:09
1 ответ

Что ж, у меня был частичный успех, так как он начал работать для веб-приложений, а vpn - нет. После проб и ошибок и большого количества поисковых запросов я нашел этот пост: https://discourse.haproxy.org/t/haproxy-not-switching-between-backends/1903/8

, которые предполагают, что если я использую групповой сертификат (что я использую), то SNI делает не работает должным образом. Вот почему веб-приложения работают (потому что каждый запрос на самом деле идет на 1 адрес сервера, который является traefik, и он дополнительно разделяет трафик), но я никогда не добираюсь до сервера vpn.

Таким образом, решение состоит в использовании пользовательских сертификатов для каждого хоста (чего я не хочу) или не иметь такой настройки. Если нет другого способа, например, альтернативы ha-proxy ... Есть предложения?

Ура, Брэндон.

0
ответ дан 5 December 2019 в 05:16

Теги

Похожие вопросы