Как разделить трафик vpn от трафика https на тот же порт, используя haproxy?

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

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

VM1 адрес 10.0.0.244

VM2 адрес 10.0.0.245

VM1:

  • запуск контейнера haproxy с использованием сетевого режима "хост", прослушивающего порт 443 (т. е. 10.0.0.245:443)

  • работает softhether vpn-серверный контейнер, используя сетевой режим "host", прослушивающий порт 992 (т. е. 10.0.0.245:992)

VM2:

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

Важно отметить, что если DNS указывает webappX.domain.com на 10.0.0.245, то traefic выполняет свою работу, и все веб-приложения доступны через браузер. Кроме того, когда я пытаюсь подключиться к виртуальному программному интерфейсу 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.

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

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

1 ответ

Решение

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

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

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

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

Другие вопросы по тегам