使用 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 隧道)吗?