转发到外部服务器的SSH请求到内部服务器

我有一个虚拟机configuration当前我有一个外部IP指向一个虚拟机与Nginx HTTP反向代理服务HTTP网页从几个内部虚拟机没有外部IP。

我需要一个类似的设置来将SSH请求redirect到某些主机名到内部服务器,这是一个托pipe的git存储库,由代理服务器,因此没有自己的外部IP,所以我需要某种iptables规则来允许我反转代理/转发SSH请求到相应的虚拟机。

有人能指出我的方向吗?

如果所有客户端都可以连接到端口22,并且端口转发可以将它们引导到适当的服务器,这取决于客户端想要访问哪个主机名,这将是非常方便的。

不幸的是,这是不可能的。

客户端永远不会发送它所连接的主机名。 (我知道的唯一的协议,客户端发送一个主机名,可以用于这种代理的是:http,https,smtp,dns)。 而且,客户端只需打开一个TCP连接并等待来自服务器的标题。 这意味着你将绝对没有应用层信息来根据服务器的select。 只有当你select一台服务器,并从服务器获得一个横幅发送到客户端,客户端才会开始说ssh。

从代理伪造广告到客户端也不会工作,因为代理不知道横幅将是什么样子,如果横幅广告错了,ssh客户端会在连接build立后注意到这一点,并报告一个完整的错误。

你确实有其他的select。

解决scheme1

将不同的端口号从网关转发到每个服务器上的端口22。 例如:

-A PREROUTING -i eth0 -d 192.0.2.42 -p tcp --dport 62210 -j DNAT --to-destination 192.168.42.10:22 -A PREROUTING -i eth0 -d 192.0.2.42 -p tcp --dport 62211 -j DNAT --to-destination 192.168.42.11:22 

解决scheme2

通过另一种协议代理SSH。 这可以使用HTTP CONNECT命令或使用SOCKS完成。 在ssh客户端上,您可以使用ProxyCommand来指定一个客户端,通过在网关上运行的代理来说明相关的协议。 网关上的代理软件然后连接到实际的SSH服务器。

解决scheme3

代理想法的一个变种是通过ssh隧道ssh。 从客户端你可以运行这个命令:

 ssh -o ProxyCommand='ssh -W %h:%p bastion-host' [email protected] 

bastion-host可以是分配给您的代理的任何主机名。 如果对您的代理的身份validation是publickey那么authorized_keys可以限制授予哪种访问权限。 应该可以将访问限制为只转发到一个相关的ssh端口,而不允许ssh连接到代理被用于其他任何事情。

解决scheme4

使用IPv6。 然后你可以得到足够的IP地址,每个服务器都有一个IP地址。 如果ssh客户端运行在通过使用Teredo来访问IPv6的唯一方式的networking上,则可以通过在代理上运行Teredo中继来确保ssh连接仍然可靠。 安装Miredo并将其configuration为Teredo中继器需要不到五分钟的时间。

只要使用SSH端口转发,它会更安全(因为你不打开额外的系统到networking)。 例如,您的主机A具有公共和私有IP地址,则您的主机B和C位于专用networking上。 要连接到B,请使用以下技术:

 terminal-1$ ssh -L 10022:B_private_IP:22 A_public_IP terminal-2$ ssh -p10022 user_at_B@0 

只要terminal1窗口正在运行,你有一个SSH隧道主机B.

你可以使用〜/ .ssh / config自动完成整个事情,所以你只需要做一些类似“ssh user_at_B @ B”的事情就可以启动隧道了。