我在私有子网中有一个服务器,我想通过一台面向互联网的机器连接到该服务器。有一些关于此的教程。我用的是这个:https://heipei.github.io/2015/02/26/SSH-Agent-Forwarding-considered-harmful/
问题在于它假设我可以编辑~/.ssh/config
文件。但是,如果我在 CI 上运行代码,我宁愿使用存储库中提供的配置文件并使用-F
switch。在这种情况下,上述策略将停止工作,因为ssh
使用的命令ProxyCommand
不会加载相同的配置文件并且不知道别名。我所做的是:
Host ansible
User ubuntu
Hostname xxx.compute.amazonaws.com
Host app
User ubuntu
Hostname 10.0.2.40
ProxyCommand ssh -F test-ssh.cfg -W %h:%p ansible
这可行,但有点麻烦,因为我需要将文件名放入文件本身,如果有人更改文件名,它就会中断。所以我的问题是:有没有更简洁的方法来创建带有别名的配置文件,并且可以与ProxyCommand
一起使用-F
?
答案1
根据此超级用户条目从版本 7.3p1 开始,有一个Include
指令,因此您可以创建一个包含“常规”配置但包含所有ProxyCommand
条目的配置文件。这样,如果您指定该文件,代理连接将起作用,如果您省略开关-F
,则将读取默认配置,如下所示:
~/.ssh/config
:
Host ansible
User ubuntu
Hostname xxx.compute.amazonaws.com
~/.ssh/proxyconfig
:
Include config
Host app
User ubuntu
Hostname 10.0.2.40
ProxyCommand ssh -W %h:%p ansible
如果你有上述配置,你可以使用
ssh -F proxyconfig app
到达“应用程序”服务器。
如果您无法将上述版本安装到您的客户端计算机,您可以ProxyCommand
在命令行中指定,而不需要单独的配置文件,如下所示:
ssh -o ProxyCommand='ssh -W %h:%p ansible' app
由于每次都编写整个命令有点不舒服,您可能需要为该命令创建一个别名,或者 - 如果您想通过代理访问更多计算机 - 请使用如下函数:
function proxyssh {
# The first argument is the 'stepping stone',
# the second is the target to ssh into
ssh -o proxyCommand="ssh -W %h:%p $1" $2
}
并像使用它一样
proxyssh ansible app
答案2
对于代理主机,您不再需要ProxyCommand
。有一个新的选项ProxyJump
,它可以执行相同的操作,而无需另一个ssh
配置。它将在内部发出相同的命令,但它也会-F
如果有提供则传递参数:
Host ansible
User ubuntu
Hostname xxx.compute.amazonaws.com
Host app
User ubuntu
Hostname 10.0.2.40
ProxyJump ansible
此功能自以下日期起可用:OpenSSH 7.3。
答案3
您可以~/.ssh/config
使用ProxyCommand
作为参数来执行此操作而无需进行编辑。
从OpenSSH 5.4(2010-03-08) 出现了“netcat 模式”:
- 为 ssh(1) 添加了“netcat 模式”:
ssh -W host:port ...
这将客户端上的 stdio 连接到服务器上的单个端口转发。例如,这允许使用 ssh 作为ProxyCommand
通过中间服务器路由连接。bz#1618
因此可以:
ssh -o ProxyCommand="ssh -W %h:%p firewall" [email protected]
对于历史版本,您可以使用外部nc
(来自SSH ProxyCommand 文章作者:Vivek Gite):
ssh -o ProxyCommand='ssh user@firewall nc 10.0.2.40 22' [email protected]
在哪里
firewall
是面向互联网的服务器。10.0.2.40
是本地网络上的服务器。- netcat (
nc
) 用于在本地网络上的服务器之间设置和建立 TCP 管道。