Nginx
無需列舉所有後端的通用基於 SNI 的透明 TLS 代理?
我的情況是,我必須在一組數千個後端 https 網路伺服器前提供一個透明的反向代理,並且列表經常(相對)變化。
我知道我可以
haproxy
根據客戶端與客戶端 Hello 一起發送的 SNI 字元串來選擇要連接的後端(參見例如,反向代理可以使用 SNI 和 SSL 傳遞嗎?),但似乎我需要列舉所有後端並在配置中單獨引用它們;即“如果 SNI 是某某,請與後端交談”。相反,我只想從客戶端 Hello 中獲取 SNI 字元串,在 DNS 中查找它,連接到 IP DNS 提供(在 tcp 埠 443 上),將客戶端 hello 中繼到伺服器,然後在客戶端之間繼續中繼和伺服器。
我不想檢查流量,也不想在客戶端上安裝新證書。
haproxy可以做到這一點嗎?如果沒有,還有什麼其他程序可以?
我最終使用
nginx
了流 SSL 預讀模組。配置非常簡單:
stream { server { resolver 127.0.0.1; listen 443; ssl_preread on; proxy_pass $ssl_preread_server_name:443; } }
http { }
甚至不需要任何塊,但nginx
如果我省略它,我會出現段錯誤,所以我http { }
在配置中有一個空塊。僅載入流模組。resolver
需要 nginx 才能在 DNS 中查找後端名稱;我在 127.0.0.1 上有一個記憶體遞歸解析器。我這樣做是為了讓所有需要連接到任何後端的客戶端都連接到我的 nginx(使用水平分割 DNS 和 DNAT 的組合),並且 nginx 代表他們連接到實際的後端。它對客戶完全透明。