gpt4 book ai didi

python - Paramiko:围绕 NAT 路由器的端口转发

转载 作者:太空狗 更新时间:2023-10-29 17:56:49 25 4
gpt4 key购买 nike

配置

  • LOCAL:将创建 ssh 连接并在 REMOTE box 上发出命令的本地计算机。
  • PROXY:一个 EC-2 实例,可以通过 ssh 访问 LOCAL 和 REMOTE。
  • REMOTE:位于 NAT 路由器后面的远程机器(本地无法访问,但会打开到 PROXY 的连接并允许本地通过隧道连接到它)。

端口转发步骤(通过命令行)

  1. 创建从 REMOTE 到 PROXY 的 ssh 连接,以将 REMOTE 机器上端口 22 上的 ssh 流量转发到 PROXY 服务器上的端口 8000。

    # Run from the REMOTE machine
    ssh -N -R 0.0.0.0:8000:localhost:22 PROXY_USER@PROXY_HOSTNAME

  2. 创建从 LOCAL 到 PROXY 的 ssh 隧道,并将 ssh 流量从 LOCAL:1234 转发到 PROXY:8000(然后转发到 REMOTE:22)。

    # Run from LOCAL machine
    ssh -L 1234:localhost:8000 PROXY_USER@PROXY_HOSTNAME

  3. 创建从本地到远程(通过代理)的转发 ssh 连接。

    # Run from LOCAL machine in a new terminal window
    ssh -p 1234 REMOTE_USER@localhost

    # I have now ssh'd to the REMOTE box and can run commands

Paramiko 研究

我看过一个 handfulquestions与使用 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')

最佳答案

关于 Paramiko 在“幕后”做什么的详细解释可以在 @bitprohet's blog here 找到。 .

假设上面的配置,我正在工作的代码看起来像这样:

from paramiko import SSHClient

# Set up the proxy (forwarding server) credentials
proxy_hostname = 'your.proxy.hostname'
proxy_username = 'proxy-username'
proxy_port = 22

# Instantiate a client and connect to the proxy server
proxy_client = SSHClient()
proxy_client.load_host_keys('~/.ssh/known_hosts/')
proxy_client.connect(
proxy_hostname,
port=proxy_port,
username=proxy_username,
key_filename='/path/to/your/private/key/'
)

# Get the client's transport and open a `direct-tcpip` channel passing
# the destination hostname:port and the local hostname:port
transport = proxy_client.get_transport()
dest_addr = ('0.0.0.0', 8000)
local_addr = ('127.0.0.1', 1234)
channel = transport.open_channel("direct-tcpip", dest_addr, local_addr)

# Create a NEW client and pass this channel to it as the `sock` (along with
# whatever credentials you need to auth into your REMOTE box
remote_client = SSHClient()
remote_client.load_host_keys(hosts_file)
remote_client.connect('localhost', port=1234, username='remote_username', sock=channel)

# `remote_client` should now be able to issue commands to the REMOTE box
remote_client.exec_command('pwd')

关于python - Paramiko:围绕 NAT 路由器的端口转发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18968069/

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