我正在尝试根据 FQDN 将 ssh 连接从端口 122/tcp 中继到端口 22/tcp 上的另一台服务器。
这是我的 HAProxy 配置:
frontend my_ssh_frontend
bind *:122
mode tcp
option tcplog
acl my_ssh_acl hdr(host) myHostname.myDomain.com
use_backend my_ssh_backend if my_ssh_acl
backend my_ssh_backend
mode tcp
server myserver1 x2.y2.z2.t2:22 check
但就好像 ACL 条件永远不成立,因此流量不会被路由到后端。
输出如下ssh -vvv
:
ssh.exe -p 122 -l admin-media myHostname.myDomain.com -vvv 2>&1 | egrep.exe -vw "identity file|Failed to open"
OpenSSH_for_Windows_8.1p1, LibreSSL 3.0.2
debug2: resolving "myHostname.myDomain.com" port 122
debug2: ssh_connect_direct
debug1: Connecting to myHostname.myDomain.com [x1.y1.z1.t1] port 122.
debug1: Connection established.
debug1: Local version string SSH-2.0-OpenSSH_for_Windows_8.1
kex_exchange_identification: Connection closed by remote host
我如何使用 HAProxy 来实现这一点?
这是不可能的,因为服务器从来不知道 FQDN。
它仅作为某些应用程序协议(如 TLS 或 HTTP)的一部分发送(HAProxy 需要对每个协议进行特定的支持),而不是作为 TCP 层握手的一部分发送;因此无法通过 HAProxy 或其他方式实现基于 FQDN 的原始 TCP 连接代理。
FQDN 也不会作为 SSH 握手的一部分发送 - SSH 没有相当于 HTTP“主机”标头或 TLS SNI 的内容 - 这意味着即使 HAProxy 确实具有 SSH 特定模式,它仍然无法通过 FQDN 代理。