如何使用 haproxy 在同一埠上將 vpn 流量與 https 流量分開?
我有以下目標:在埠 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 替代方案……有什麼建議嗎?
乾杯,布蘭登。