我想设计一个代理,其IP地址是公共的。客户端知道该代理的 IP 地址并可以通过 SSH 连接到它。然而,有一个主机的IP地址对于客户端来说是未知的。代理的目的是“拦截”来自客户端的 SSH 并重定向它到那个私人主机。下图演示了这个问题:
服务器B是我要设计的代理。客户端 C 不知道服务器 A 的 IP 地址。客户端 C 可以通过 SSH 连接服务器 B(代理)。然后代理(服务器 B)应该将 SSH 连接转发到服务器 A。这回答,我尝试了以下方法:
在服务器 A 中,我运行以下命令:
ssh userB@serverB -R clientC:1234:serverA:22
我从客户端 C 运行以下命令:
ssh userA@serverB -p 1234
但是客户端 C 无法与服务器 A 建立连接,我收到以下消息:
ssh: connect to host server B (192.168.2.122) port 1234: Operation timed out
你能告诉我如何让代理(服务器B)工作吗?
解决了:
我的方法是正确的,我需要sshd_config
在服务器A和服务器B(代理)中重新配置:
AllowAgentForwarding yes
AllowTcpForwarding yes
GatewayPorts yes
X11Forwarding yes
详情可查这里。
答案1
您可以通过 ssh 从clientC
到serverB
以及从serverB
到serverA
吗?如果是这样,有一个更简单的解决方案。在 上clientC
,运行:
ssh -J userB@serverB userA@serverA
这将首先 ssh 到userB@serverB
,自动设置到 ssh 上的端口转发serverA
,并通过该转发的端口连接到userA@serverA
。
如果这不可行,您可以使用您的方法进行一些修改,假设没有防火墙或其他网络限制阻碍。
您需要调整从以下位置运行的反向转发命令serverA
:
ssh userB@serverB -R "*:1234:localhost:22"
这里*
设置的bind_address
是反向转发监听的地址。从 ssh 手册页:
默认情况下,服务器上的 TCP 侦听套接字将仅绑定到环回接口。这可以通过指定绑定地址来覆盖。空的绑定地址或地址“*”表示远程套接字应侦听所有接口。仅当启用服务器的 GatewayPorts 选项(请参阅 sshd_config(5))时,指定远程绑定地址才会成功。
因此,设置bind_address
允许您监听所有接口上的连接。 (在您的版本中,您将其设置为clientC
,这将不起作用,因为clientC
的 IP 地址并不引用 上的网络接口serverB
。
您还需要GatewayPorts clientspecified
设置/etc/ssh/sshd_config
。这授予ssh -R
绑定到非环回接口的权限。
然后你应该能够从以下位置进行 ssh clientC
:
ssh userA@serverB -p 1234
这种类型的B
和之间的端口转发A
对于快速而肮脏的事情来说是很好的。如果您想要更适合生产的东西,请考虑使用 HAProxy、nginx 或 iptables/nftables 之类的东西来处理 TCP 转发,而不是使用 SSH 转发。
答案2
我的方法是正确的,我需要sshd_config
在服务器A和服务器B(代理)中重新配置:
AllowAgentForwarding yes
AllowTcpForwarding yes
GatewayPorts yes
X11Forwarding yes
详细信息可以在这里找到SSH 端口转发。