目前,我们有几个实验室,其中所有实例均位于私有子网中(Bastion VM 除外)。因此,开发人员应该从他们的笔记本电脑创建一条 SSH 隧道到 Bastion,并从 Bastion 创建另一条隧道到某个微服务,这样他们就可以访问 UI。
该过程如下:
ssh -i <key>.pem -L <port x>:localhost:<port x> user@<hostname of Bastion>
User logged in to Bastion VM.
ssh -i <key>.pem -L <port x>:<hostname of microservice>:<port of microservice> user@<hostname of microservice>
Now they are able to access UI at http://localhost:<port x>
现在,对于日常使用来说,这是一项相当复杂/耗时的任务,因此我正在考虑设置一个可以配置为一键执行相同操作的软件。
我发现安全管道,但不确定如何使用它来实现我的目的。有人可以建议使用其他软件来实现上述目的吗?
答案1
它很复杂,因为你用一种复杂的方式做这件事。OpenSSH 已经有了简化这种频繁连接的机制。(笔记:本文假设开发人员拥有以下私钥:两个都本地计算机上的连接,即堡垒主机不保存某些不可复制的凭据。)
首先找到一种方法将其压缩为一个 SSH 命令。这实际上会稍微逆转隧道,因为堡垒主机现在中继的是 SSH 连接,而不是 Web 连接。
ssh -i <key>.pem -o ProxyCommand="ssh -i <key>.pem -W %h:%p user@<bastion>" -L <portX>:<microservice>:<mport> user@<hostname>
在最新的 OpenSSH 版本中,可以使用-J
/JumpHost
而不是手动 ProxyCommand 进一步简化:
ssh -i <key>.pem -J user@<bastion> -L <portX>:<microservice>:<mport> user@<hostname>
现在将其转换为 ~/.ssh/config 选项 - 标识连接堡垒主机本身所需的选项、适用于服务主机的选项以及所有主机所共有的选项(“主机”部分接受多个名称甚至通配符):
Host <bastion>
User <user>
IdentityFile <key>.pem
Host <hostname>
User <user>
IdentityFile <key>.pem
#JumpHost <bastion>
ProxyCommand ssh -W %h:%p <bastion>
有了这个(可以集中部署),你的命令就变成了:
ssh -L <portX>:<microservice>:<mport> <hostname>
(还有一种方法可以自动附加公司域名,例如,如果服务器名为 svc1.dev.example.com,那么Hostname %h.dev.example.com
或CanonicalDomains dev.example.com
都可以让您运行ssh svc1
。)
这大概就是通用方法所能达到的最简单的程度了——其余四个参数本质上是可变的(取决于每个开发人员的需求),因此即使您在其上添加图形用户界面,用户也需要提供相同数量的信息。(它适用于任何操作系统上的 OpenSSH。)
话虽如此,如果相同的每次都会建立隧道,也可以在 ~/.ssh/config 中编码(-L
对应于 LocalForward),开发人员只需运行ssh <hostname>
。
(实际上,任何能够运行 OpenSSH 的操作系统也支持脚本,通常用 sh/bash 和/或命令别名编写。)