配置
- LOCAL:将创建 ssh 连接并在 REMOTE 机器上发出命令的本地机器。
- PROXY:一个 EC-2 实例,可以通过 ssh 访问 LOCAL 和 REMOTE。
- REMOTE:位于 NAT 路由器后面的远程机器(LOCAL 无法访问,但会打开到 PROXY 的连接并允许 LOCAL 与它建立隧道)。
端口转发步骤(通过命令行)
创建从 REMOTE 到 PROXY 的 ssh 连接,以将 REMOTE 机器上端口 22 上的 ssh 流量转发到 PROXY 服务器上的端口 8000。
# 从远程机器运行
ssh -N -R 0.0.0.0:8000:localhost:22 PROXY_USER@PROXY_HOSTNAME创建从 LOCAL 到 PROXY 的 ssh 隧道,并将 ssh 流量从 LOCAL:1234 转发到 PROXY:8000(然后转发到 REMOTE:22)。
# 从本地机器运行
ssh -L 1234:localhost:8000 PROXY_USER@PROXY_HOSTNAME创建从本地到远程的转发 ssh 连接(通过代理)。
# 在新的终端窗口中从本地机器运行
ssh -p 1234 REMOTE_USER@localhost# 我现在已经 ssh'd 到 REMOTE 框并且可以运行命令了
帕拉米科研究
我已经查看了一些与使用 Paramiko 进行端口转发相关的问题,但它们似乎并没有解决这种特定情况。
我的问题
如何使用 Paramiko 运行上面的步骤 2 和 3?我基本上想运行:
import paramiko
# Create the tunnel connection
tunnel_cli = paramiko.SSHClient()
tunnel_cli.connect(PROXY_HOSTNAME, PROXY_PORT, PROXY_USER)
# Create the forwarded connection and issue commands from LOCAL on the REMOTE box
fwd_cli = paramiko.SSHClient()
fwd_cli.connect('localhost', LOCAL_PORT, REMOTE_USER)
fwd_cli.exec_command('pwd')