繁体   English   中英

Paramiko:NAT路由器周围的端口转发

[英]Paramiko: Port Forwarding Around A NAT Router

组态

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

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

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

    #从REMOTE机器运行
    ssh -N -R 0.0.0.0:8000:localhost:22 PROXY_USER @ PROXY_HOSTNAME

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

    #从LOCAL机器运行
    ssh -L 1234:localhost:8000 PROXY_USER @ PROXY_HOSTNAME

  3. 创建从LOCAL到REMOTE的转发ssh连接(通过PROXY)。

    #在新的终端窗口中从LOCAL机器运行
    ssh -p 1234 REMOTE_USER @ localhost

    #我现在已经转到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')

关于Paramiko幕后做什么的详细解释可以在@ bitprohet的博客上找到

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

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')

仅仅是为了从PROXY上反弹SSH命令,还是需要转发其他非SSH端口?

如果您只需要SSH进入REMOTE框,Paramiko支持SSH级网关(告诉PROXY sshd打开与REMOTE的连接并代表LOCAL转发SSH流量)和ProxyCommand支持(通过本地命令转发所有SSH流量,这可能是任何能够与远程盒子交谈的东西)。

听起来你想要前者给我,因为PROXY显然已经运行了sshd。 如果您查看Fabric的副本并搜索“网关”,您将找到Fabric如何使用Paramiko网关支持的指针(我现在没有时间自己挖掘具体位置。)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM