Haproxy

如何使用 haproxy 在同一埠上將 vpn 流量與 https 流量分開?

  • September 24, 2018

我有以下目標:在埠 443 上執行 softhether vpn 和 web 應用程序。我希望所有流量都進入 haproxy,它將 vpn 發送到一個容器,其餘的發送到另一個容器(traefik),最終重新分配到基於相應容器在網路應用程序上。顯然這是可能的,但我無法讓它工作。

設置:XenServer 中的 2 台虛擬機(基於 Debian 和執行 docker)

VM1 地址 10.0.0.244

VM2 地址 10.0.0.245

虛擬機1:

  • 執行 haproxy 容器,使用網路模式“主機”監聽埠 443(即 10.0.0.245:443)
  • 執行softhether vpn伺服器容器,使用網路模式“主機”監聽埠992(即10.0.0.245:992)

虛擬機2:

  • 執行traefik反向代理容器,docker內網,將主機的443映射到本地的443
  • 執行多個 Web 應用程序/容器,也在 docker 內部網路上,沒有來自主機的映射埠,僅暴露於內部 docker 網路。Webapp 可以通過 traefik 反向代理通過 webappX.domain.com 等名稱訪問。

值得一提的是,如果 DNS 將 webappX.domain.com 指向 10.0.0.245,那麼 traefic 就可以正常工作,並且所有 webapp 都可以通過瀏覽器訪問。此外,當我嘗試從我的 mac 連接到 softhether vpn 到埠 992 時,連接已建立(當我嘗試在埠 443 上監聽 softether 並關閉 haproxy 時,它也可以正常工作)。vpn.domain.com 的 DNS 記錄指向 10.0.0.244。

添加 haproxy 後,我將 webappX.domain.com 的 DNS 記錄重新映射到 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。

你有什麼建議/建議來改變或嘗試什麼來讓它工作嗎?

謝謝你。布蘭登。

好吧,我取得了部分成功,因為它開始適用於 webapps 但 vpn 不會。經過反複試驗和大量Google搜尋後,我發現了這篇文章: https ://discourse.haproxy.org/t/haproxy-not-switching-between-backends/1903/8

這表明如果我使用萬用字元證書(我這樣做),那麼 SNI 將無法按預期工作。這就是 webapps 工作的原因(因為每個請求實際上都發送到 1 個伺服器地址,即 traefik 並且它進一步分割了流量),但我永遠無法到達 vpn 伺服器。

因此解決方案是為每個主機使用自定義證書(我不想這樣做)或不進行此類設置。除非有另一種方式,比如 ha-proxy 替代方案……有什麼建議嗎?

乾杯,布蘭登。

引用自:https://serverfault.com/questions/931946