基于主机名的 Nginx TCP 转发
随着 Nginx 社区版本的 TCP 负载平衡的发布,我想混合使用 OpenVPN 和 SSL 传递数据。 Nginx 知道如何路由流量的唯一方法是通过它们的域名。
vpn1.app.com ─┬─► nginx at 10.0.0.1 ─┬─► vpn1 at 10.0.0.3
vpn2.app.com ─┤ ├─► vpn2 at 10.0.0.4
https.app.com ─┘ └─► https at 10.0.0.5
我看过TCP guides和 module documentation ,但它似乎没有被很好地引用。如果有人能指出我正确的方向,我将不胜感激。
有关 ServerFault 的相关问题:Can a Reverse Proxy use SNI with SSL pass through?
nginx version: nginx/1.18.0 (Ubuntu) 默认包含此模块,测试成功,只能转发https,同时可以使用cname切换给客户使用,方面后续我们切换ip。SRV记录可以解析端口
最佳答案
现在可以通过添加 ngx_stream_ssl_preread module 来实现。在 Nginx 1.11.5 和 ngx_stream_map module 中添加在 1.11.2 添加。
这允许 Nginx 读取 TLS Client Hello 并根据 SNI 扩展决定使用哪个后端。
stream {
map $ssl_preread_server_name $name {
vpn1.app.com vpn1_backend;
vpn2.app.com vpn2_backend;
https.app.com https_backend;
default https_default_backend;
}
upstream vpn1_backend {
server 10.0.0.3:443;
}
upstream vpn2_backend {
server 10.0.0.4:443;
}
upstream https_backend {
server 10.0.0.5:443;
}
upstream https_default_backend {
server 127.0.0.1:443;
}
server {
listen 10.0.0.1:443;
proxy_pass $name;
ssl_preread on;
}
}
关于基于主机名的 Nginx TCP 转发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34741571/