使用 sshtunnel 包进行两步 SSH 本地端口转发

Posted

技术标签:

【中文标题】使用 sshtunnel 包进行两步 SSH 本地端口转发【英文标题】:Two step SSH local port forwarding using sshtunnel package 【发布时间】:2021-01-28 07:45:35 【问题描述】:

我正在尝试在 host1 和 host3 之间打开一条双向隧道,其中 host2 位于中间。

host1 <--> host2 <--> host3

这是我在 host1 上运行的(阻塞)bash 命令转发端口 51672。

ssh -g -L 51672:host2:51672 host2_username@host2 \'/tmp/sshpass -p host3_pass ssh -g -L 51672:host3:51672 host3_username@host3 \'\'"while true; do : ; sleep 5; done"\'\'\'

我有一个在host3 上运行的脚本,监听端口51672。当我在host1 上创建一个TCP 套接字并连接到host2:51672 时,我可以通过该套接字与host3 上的脚本进行通信。

在下一步中,我尝试将其移植到 python 中并使用 sshtunnel 包。我有点困惑here 中的哪个选项相当于我的场景。

这是我的第一次尝试:

import paramiko
import sshtunnel

with sshtunnel.open_tunnel(
        ssh_address_or_host=(host2, 22),
        ssh_username=host2_username,
        ssh_password=host2_pass,
        local_bind_address=('0.0.0.0', 51672),
        remote_bind_address=(host3, 22),
        block_on_close=False
) as tunnel1:
    log.info('Tunnel to host2 is established.')
    with sshtunnel.open_tunnel(
            ssh_address_or_host=('localhost', tunnel1.local_bind_port),
            ssh_username=host3_username,
            ssh_password=host3_password,
            remote_bind_address=(host3, 51672),
            block_on_close=False
    ) as tunnel2:
        log.info('Tunnel to host3 is established.')
        while True:
            time.sleep(1)

我可以确认从 host1 到 host2 的隧道是打开的,因为下面的命令在 host1 上返回 0。

nc -z localhost 51672

但是,host2 和 host3 之间的隧道似乎无法正常工作。

【问题讨论】:

【参考方案1】:

第一步是建立 SSH 隧道。然后你隧道你的自定义端口。

更容易掌握的方法(尽管不是最佳的)是:

打开到host2的直接SSH连接。 通过host2 连接将本地host1:A 端口转发到host3:22 使用转发端口host1:A 打开与host3 的SSH 连接。 通过host3 将另一个本地host1:B 端口转发到host3:51672。 连接到host1:B 以访问host3:51672

但您实际上不需要进行第一个物理端口转发,您可以使用sock 方法,例如Nested SSH using Python Paramiko。

(我相信即使是您最初的 ssh 方法也过于复杂,有两个转发)

【讨论】:

以上是关于使用 sshtunnel 包进行两步 SSH 本地端口转发的主要内容,如果未能解决你的问题,请参考以下文章

通过Python用pymysql,通过sshtunnel模块ssh连接远程数据库。

Navicat for Mysql SSH tunnel 用跳板机解决方案

eclipse RSE 可以连接到本地端口(ssh 隧道)吗?

Java:SSH 隧道 - 将本地 SOCKS 设置为侦听器

使用 python sshtunnel 的隧道

Python sshtunnel - 如何验证 SSH 连接?