我在住宅网络上(NAT后面),并且想要在服务器上的容器中托管多个服务。
由于它们都使用相同的内部端口(并且很难更改它们),我想知道是否可以使用反向代理根据目标 URL 分割容器之间的流量。
我知道这对于 HTTP 服务来说是可能的,但我不确定对于通用 TCP 连接如何做到这一点。
此外,这还允许我将每个服务分离到其自己的域和相关容器中,而不必担心端口冲突。
答案1
不,TCP 中没有任何内容可以表明最初请求的是哪个域名(更不用说哪个 URL);只知道对等方的 IP 地址和 TCP 端口。
因此,只有当您拥有提供必要信息的高层协议时(就像 HTTP 在其“Host”标头中所做的那样),这才有可能,并且代理必须理解该高层协议。基于域名的通用 TCP 多路复用是不可能的。
例如,如果您的所有服务都使用 TLS,那么您可以根据 TLS SNI 扩展中发送的域名(甚至可能是 TLS ALPN 中发送的协议类型)进行多路复用 - 这可以使用 HAproxy、sniproxy 或甚至可能是 Nginx 来完成。
(还有一些专门的代理可以根据已识别的客户端握手多路复用不同的协议 - 例如“sshttp”可以在同一端口上处理 SSH 和 HTTP,类似地“sslh”可以处理 SSH 和 TLS。所有这些代理都需要至少对所涉及的所有协议有基本的了解,并且它们只能可靠地处理客户端首先使用的协议。)