gpt4 book ai didi

python - 使用sshtunnel软件包进行两步SSH本地端口转发

转载 作者:行者123 更新时间:2023-12-02 13:59:54 66 4
gpt4 key购买 nike

我正在尝试在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之间的隧道似乎不起作用。

最佳答案

第一步是建立SSH隧道。然后,您通过隧道传输自定义端口。
较易掌握的方法(尽管不是最佳方法)是:

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

  • 但是实际上您不需要执行第一个物理端口转发,可以使用 sock方法,例如 Nested SSH using Python Paramiko中所示。
    (我相信,即使是您原来的 ssh方法,它的两次转发也不必要地变得复杂)

    关于python - 使用sshtunnel软件包进行两步SSH本地端口转发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64344221/

    66 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com