当前位置: 首页 > 面试题库 >

Paramiko:围绕NAT路由器进行端口转发

微生慈
2023-03-14
问题内容

组态

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

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

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

#从远程计算机
ssh -N -R 0.0.0.0:8000:localhost:22运行PROXY_USER @ PROXY_HOSTNAME

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

#从本地计算机
ssh -L 1234:localhost:8000 PROXY_USER @ PROXY_HOSTNAME运行

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

#在新的终端窗口中从本地计算机运行
ssh -p 1234 REMOTE_USER @ localhost

#我现在已将命令切换到REMOTE框并可以运行命令

我的问题

如何使用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')

问题答案:

可以在@bitprohet的博客中找到有关Paramiko在幕后所做的详细解释。

假设上面的配置,我正在工作的代码如下所示:

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


 类似资料:
  • 问题内容: 您如何使用Paramiko传输完整目录?我正在尝试使用: 这给了我这个错误- 问题答案: 您将需要像使用python在本地一样进行此操作(如果您未使用Shutils)。 结合,和和。您可能还需要检查每个文件和目录,具体取决于您是否要解析符号链接。

  • 我尝试使用VirtualBox进行简单的端口转发,结果显示VirtualBox.exe正在主机上监听端口,但实际上并没有将连接转发给来宾。我已经在多个端口上尝试过,并且我已经多次重新启动VirtualBox。另一方面,来宾到主机的连接也很好。以下是信息: 有什么想法吗?出于多种原因,我想避免使用VirtualBox的桥接适配器。我的印象是NAT端口转发在VirtualBox中相对简单。 谢谢!

  • 现在,我的助手类名为,它接受对象。代码是: 并且我为这个助手类编写了一些单元测试,如下所示: 因为我对单元测试和模拟库(如)非常陌生。现在我的问题是我的测试有什么好处吗?我想测试我的助手类的功能是否在做它应该做的事情(即,如果共享的pref有登录的用户,则获取登录的用户),我该如何做呢?

  • 在我的React项目中,我有: 没有标题的登录组件 问题:我应该如何构建我的路由器从登录页面开始,当我点击登录时,路由器会把我带到仪表板?

  • 问题内容: 由于已弃用,因此我已切换到,但我不知道如何从中打开端口。在我可以这样做: 只要SSH连接打开,它将把端口27017从VirtualBox转发到本地主机27017。请注意,我不是在寻找一种在VirtualBox中永久打开端口的方法。我怎样才能做到这一点? 问题答案: 您仍然可以从docker机器使用的VirtualBox中访问VBoxmanage.exe命令: 使用让您的虚拟机的名称。

  • 我正在尝试使用angular与主播合作,我已经做了我的研究,但没有成功,所以我正在联系你们。 我有 3 个组件 {导航栏组件, 红色组件, 蓝色组件} 导航栏组件有 2 个锚点。我希望当我单击其中一个时,它实际上会将我引导到正确的组件 导航栏组件.ts 红色. component.ts blue.component.ts app.component.html 应用程序模块