网络

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 )被视为错误,将导致异常。