首先,这样的事情可能吗?考虑以下设置:
一个面向公众的“SSH 弹跳箱”
bouncer.mydomain.tld
四个私有 *nix 系统
host1.mynet.local
host2.mynet.local
host3.mynet.local
host4.mynet.local
全部在端口 22 上运行 Open-SSH。每个私有系统都有自己独特的根密码和独特的用户。
我希望能够使用以下命令以 root 身份登录 host1.mynet.local:
ssh [email protected]
上述操作将使用 SSH 弹跳箱将我以 root 身份登录到 host1.mynet.local SSH,而无需手动设置隧道。
另外,请考虑以下可能性:
ssh [email protected]
这应该以用户 janet 的身份连接到 host3.mynet.local。最后一个“_”将用户名与主机标识符分开。
问题是这应该对最终用户完全透明。这意味着工作是在服务器端而不是客户端完成的。最终用户无需编辑配置文件、设置隧道或编辑 .ssh/config 文件即可使其在客户端运行。
答案1
我将首先描述一个[不幸的、黑客的但易于设置的]解决方案。然后我将描述为什么我不认为确切地您所描述的将会很容易。
bouncer.mydomain.ltd 上的机器将为每个用户/主机元组分配一个用户。bouncer 机器上的每个用户都有一个 .bashrc:
远程控制[电子邮件保护] 出口
此外,每个用户的保镖机的公钥可以放在authorized_keys
相应主机的预期用户的目录中。
这样做的缺点是信息是多余的,对特定主机的任何更改都不会传播(除非你引入一些黑客脚本)
先前的解决方案实际上是从 ssh 连接的 shell 打开的 ssh 连接。我认为您想象的其实是更像反向代理的东西,它根据您在用户区域输入的内容进行路由。
不幸的是,提取用户区域信息非常困难。(据我所知,目前还没有软件可以做到这一点)当你输入
远程控制[电子邮件保护]
ssh 不会立即提取并发janet_host3
送到服务器。而是……
- SSH 客户端和服务器协商密钥和算法
- 客户端/服务器建立安全(加密)通信通道
只有这样才能通过加密通道进行身份验证。
值得注意的是在某些通信完成之前,你的服务器无法知道将连接信息代理到哪台机器。
作为参考,以下是服务器收到的一些第一部分信息的示例(我运行 ssh 到我的本地主机)。
SSH-2.0-OpenSSH_6.0p1 Debian-3ubuntu1 ......%{AQ.3....*~\.....ecdh-sha2-nistp256,ecdh-sha2-nistp384,ecdh-sha2-nistp521,diffie-hellman-group-exchange-sha256,diffie-hellman-group-ex
因此要解决这个问题:
- 您的服务器必须协商通过传输阶段,设置加密的通信通道,然后获取用户信息。
- 然后,它可以解析用户信息并与预期目的地建立新的连接。
- 此后,它可以将客户端发送的所有内容以及客户端所说的所有内容传送到目标服务器。
根据您想要设置它的原因,也许我可以提出一些替代解决方案:
如果您只是想要别名以便用户记住不同的信息,请使用 DNS 和 cnames,以便
hostn.bouncer.mydomain.tld
将用户发送到他们想要的机器。如果您希望能够使用弹跳器监控流量,您需要执行上述操作之一。要嗅探加密流量,您必须成为中间人,以便解密信息,然后在发送之前再次加密。
答案2
我不确定,但你能看看 sshuttle 吗https://github.com/apenwarr/sshuttle/ 也许它的一种常见用途可以满足您的要求。
答案3
谷歌搜索提供了这个解决方案:
http://blog.gidley.co.uk/2009/03/tunnelling-ssh-over-socks-proxy.html
我发现它简单而聪明,不幸的是它没有满足最后一个要求......
但使用 nc 可能是答案。