我知道我可以使用 Nginx 重定向 HTTP 流量。
但是非 HTTP 流量怎么办,例如 SSHD 等?我之所以问这个问题,是因为我有各种 dockerized 服务想要共享父服务器的 443 端口。
答案1
发送的第一条消息从客户端到服务器,并且该消息包含主机名的协议可以根据主机名轻松地进行代理。
其中包括带有主机标头的 HTTP(主机标头在 HTTP/1.0 中是可选的,在 HTTP/1.1 中是必需的),以及只要客户端支持 SNI 的 HTTPS。
实际上,这意味着它将适用于所有 HTTP 客户端和大多数未运行过时软件的 HTTPS 客户端。
请注意,SSH 不是这些协议之一,并且它也不运行在端口 443 上。SSH 协议不发送主机名(该协议不需要主机名,即使在加密消息中也不需要)。但这并不是无法基于主机名代理 SSH 的唯一原因:
- 协议中未传递主机名
- 服务器在收到客户端的任何消息之前就发送了第一条消息
- 代理无法修改所发送消息的任何部分,因为即使是通信的初始未加密部分也会在加密设置后不久通过签名进行验证。
任何将 SSH 代理到多个后端都需要修改协议或将 SSH 封装在另一个协议中以绕过该问题。
答案2
sshd 在 tcp/22 上运行。这与 tcp/443 无关。这也与 nginx 无关,因为它目前无法处理 ssh(希望在遥远的未来也不会如此)。