【问题标题】:How to forward a Remote Port to a Local Port in a NodeJS App如何在 NodeJS 应用程序中将远程端口转发到本地端口
【发布时间】:2017-11-09 15:27:55
【问题描述】:

我正在创建一个节点应用程序,它通过 SSH 将本地端口映射到远程计算机上的端口。

在 shell 命令中我可以做到:

ssh -fN -l username -i ~/.ssh/myKey.pem  -L 9999:localhost:27017  1.2.3.4

它打开到 1.2.3.4 的持久 ssh 连接,并将远程上的 27017 端口映射到我的本地上的 9999。

但是我怎样才能让这个 -L 动作在 nodejs 中发生 我正在使用 npm ssh2 包来执行 ssh 连接。

【问题讨论】:

  • 检查这个github.com/localtunnel/localtunnel,我认为这正是你想要做的
  • 您想将本地转发到远程,还是将远程转发到本地?你的问题和你的标题不匹配。
  • 我在本地 shell 上使用 mongodump 创建远程数据库的本地转储
  • 否 - localtunnell 不是正确的解决方案。我不想暴露我的本地主机!我想将远程本地端口映射到本地计算机上的端口
  • ssh 命令完全符合我的要求 - 我只是想在 Node 中找到一种方法来做同样的事情

标签: node.js ssh port


【解决方案1】:

您可以使用下面的示例来执行反向 ssh 隧道。我假设远程主机在示例中使用公钥和私钥身份验证,如果不是这种情况,请相应地更改示例。不要忘记,您必须侦听您将请求转发到的本地端口。

var path = require('path');
var fs = require('fs');
var Connection = require('ssh2');
var net = require('net')
var c
var username = 'username'
var hostname = 'remote host IP or domain name'
var port = 22
var privKey = path.join(__dirname, 'path to private key', 'filename')
var localAddr = 'localhost'
var localPort = 'local port on which you want to receive the requests'
var remotePort = 'remote port that you want to forward'
var remoteAddr = '0.0.0.0'

c = new Connection()
c.on('connect', function() {
 console.log('Connection :: connect')
})

c.on('tcp connection', function(info, accept, reject) {
  console.log('TCP :: INCOMING CONNECTION: ' + 
  require('util').inspect(info));

  var stream = accept()
  var socket


  stream.on('data', function(data) {
    console.log('TCP :: DATA: ' + data);
  })

  stream.on('end', function() {
   console.log('TCP :: EOF');
  })

  stream.on('error', function(err) {
   console.log('TCP :: ERROR: ' + err);
  })

  stream.on('close', function(had_err) {
    console.log('TCP :: CLOSED', had_err ? 'had error' : '');
  })

  stream.pause()
  socket = net.connect(localPort, localAddr, function () {
    stream.pipe(socket);
    socket.pipe(stream);
    stream.resume();
  })
})

c.on('ready', function() {
  console.log('Connection :: ready')
  c.forwardIn(remoteAddr, remotePort, function(err) {
    if (err) { throw err }
    console.log('Forwarding connections from remote server on port 7070 to 
      node socket!');
  })
})

 c.on('error', function(err) {
   console.log('Connection :: error :: ', err)
 })

  c.on('end', function() {
    console.log('Connection :: end')
  })

  c.on('close', function(had_error) {
    console.log('Connection :: close', had_error ? 'had error' : '')
  })

 var obj = {
  host: hostname,
  port: port,
  username: username,
  privateKey: fs.readFileSync(privKey).toString()
 }

 c.connect(obj)

【讨论】:

  • 那不一样;它适用于 1:1 端口绑定,但如果我们尝试在同一个远程端口上添加 2 个 forwardIn 则会失败(它适用于 ssh -R)
  • 我找不到使用 ssh2 的示例,您在其中 forwardIn 并将流量代理到目的地。谢谢!
猜你喜欢
  • 2011-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-11
  • 1970-01-01
  • 2017-07-14
相关资源
最近更新 更多