网络¶
ssh连接网关¶
背景¶
当连接到内部主机无法从Internet直接访问的安全性良好的网络时,常见的模式是通过中间主机“跳跃”、“网关”或“代理”ssh连接(通常称为“堡垒”、“网关”或“跳箱”)。
网关需要与网关系统建立初始/外部SSH连接,然后使用该连接作为与最终/内部主机的“真正”连接的传输。
在基本层面上,人们可以 ssh gatewayhost
然后 ssh internalhost
从产生的外壳。这适用于单个长时间运行的会话,但在必须经常执行时会成为一个负担。
Fabric中有两个可用的网关解决方案,反映了OpenSSH客户机的功能: ProxyJump
样式(更简单,开销更少,可以嵌套)或 ProxyCommand
样式(开销更大,不能嵌套,有时更灵活)。两者都支持常见的配置源范围:fabric自己的配置框架、ssh配置文件或运行时参数。
ProxyJump
¶
这种类型的网关使用ssh协议 direct-tcpip
通道类型-请求网关的 sshd
代表我们打开与其他系统的连接。(这在OpenSSH服务器中已经存在很长一段时间了;从7.3开始,对OpenSSH客户机的支持是新的。)
通道对象(的实例 paramiko.channel.Channel
)实现python的socket api,因此可以代替几乎所有python代码的实际操作系统套接字。
ProxyJump
样式网关易于使用:创建新的 Connection
为网关参数化的对象,并将其作为 gateway
创建内部/真实时的参数 Connection
::
from fabric import Connection
c = Connection('internalhost', gateway=Connection('gatewayhost'))
和其他的一样 Connection
,网关连接可以配置自己的用户名、端口号等。(包括 gateway
本身——它们可以无限期地被锁住!)
ProxyCommand
¶
传统的openssh命令行客户机早就提供了 ProxyCommand
指令(见) man ssh_config ,它将内部连接的输入和输出通过任意的本地子进程进行管道连接。
相比于 ProxyJump
样式网关,这会增加开销(额外的子进程),并且不容易嵌套。在交易中,它允许使用SOCKS代理或自定义过滤/网关应用程序等高级技巧。
ProxyCommand
子流程通常是另一个 ssh
命令,例如 ssh -W %h:%p gatewayhost
;或(在缺少的ssh版本上) -W
)广泛可用的 netcat
通过 ssh gatewayhost nc %h %p
.
Fabric 支撑物 ProxyCommand
通过接受命令字符串对象 gateway
克沃格 Connection
;用于填充 paramiko.proxy.ProxyCommand
连接时的对象。
其他问题¶
如果您不确定使用哪种方法:使用 ProxyJump
风格。它性能更好,在本地系统上使用的资源更少,并且具有更易于使用的API。
警告
同时向同一主机请求两种类型的网关(即提供 Connection
作为 gateway
通过Kwarg或Config, and 加载包含 ProxyCommand
)被视为错误,将导致异常。