通过代理计算机拦截 SSH 连接并将其转发到另一台(远程)计算机

通过代理计算机拦截 SSH 连接并将其转发到另一台(远程)计算机

我想设计一个代理,其IP地址是公共的。客户端知道该代理的 IP 地址并可以通过 SSH 连接到它。然而,有一个主机的IP地址对于客户端来说是未知的。代理的目的是“拦截”来自客户端的 SSH 并重定向它到那个私人主机。下图演示了这个问题:

在此输入图像描述

服务器B是我要设计的代理。客户端 C 不知道服务器 A 的 IP 地址。客户端 C 可以通过 SSH 连接服务器 B(代理)。然后代理(服务器 B)应该将 SSH 连接转发到服务器 A。回答,我尝试了以下方法:

  1. 在服务器 A 中,我运行以下命令:

    ssh userB@serverB -R clientC:1234:serverA:22

  2. 我从客户端 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 从clientCserverB以及从serverBserverA吗?如果是这样,有一个更简单的解决方案。在 上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 端口转发

相关内容