Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 创建能够处理远程转发的节点SSH2服务器_Node.js_Ssh_Server_Forwarding - Fatal编程技术网

Node.js 创建能够处理远程转发的节点SSH2服务器

Node.js 创建能够处理远程转发的节点SSH2服务器,node.js,ssh,server,forwarding,Node.js,Ssh,Server,Forwarding,在对staskoverflow、Google和official进行了一些研究之后,我仍然无法创建一个节点SSH2服务器来处理远程端口转发 实际上,我可以在远程服务器上使用标准SSH守护程序,在客户端使用以下命令: ssh -R 8100:localsite.tld:80 sub.distantserver.com 来自sub.distantserver.com:8100的所有流量都重定向到localsite.tld:80。(端口22,传统SSH守护进程) 我唯一的目标是通过端口21上的节点SS

在对staskoverflow、Google和official进行了一些研究之后,我仍然无法创建一个节点SSH2服务器来处理远程端口转发

实际上,我可以在远程服务器上使用标准SSH守护程序,在客户端使用以下命令:

ssh -R 8100:localsite.tld:80 sub.distantserver.com
来自sub.distantserver.com:8100的所有流量都重定向到localsite.tld:80。(端口22,传统SSH守护进程)

我唯一的目标是通过端口21上的节点SSH2服务器实现这一点:

ssh -R 8100:localsite.tld:80 foo@sub.distantserver.com -p 21
password: bar
当它起作用时,我可以对用户进行一些检查并启动一些其他流程;)

基于官方的Github问题示例,我尝试了类似这样的方法,就像POC捕获流一样,但它在不存在的
forwardIn
上失败

var fs = require('fs');
var crypto = require('crypto');
var inspect = require('util').inspect;

var buffersEqual = require('buffer-equal-constant-time');
var ssh2 = require('ssh2');
var utils = ssh2.utils;

new ssh2.Server({
  hostKeys: [fs.readFileSync('/etc/ssh/ssh_host_rsa_key')]
}, function(client) {
  console.log('Client connected!');

  client.on('authentication', function(ctx) {
    if (ctx.method === 'password'
        && ctx.username === 'foo'
        && ctx.password === 'bar')
      ctx.accept();
    else
      ctx.reject();
  }).on('ready', function() {
    console.log('Client authenticated!');

    client.on('session', function(accept, reject) {
      var session = accept();
      session.once('exec', function(accept, reject, info) {
        console.log('Client wants to execute: ' + inspect(info.command));
        var stream = accept();
        stream.stderr.write('Oh no, the dreaded errors!\n');
        stream.write('Just kidding about the errors!\n');
        stream.exit(0);
        stream.end();
      });
    });
    client.on('request', function(accept, reject, name, info) {
        console.log(info);
        if (name === 'tcpip-forward') {
        accept();
        setTimeout(function() {
          console.log('Sending incoming tcpip forward');
          client.forwardIn(info.bindAddr,
                           info.bindPort,
                           function(err, stream) {
                                if (err)
                                  return;
                                stream.end('hello world\n');
                            });
        }, 1000);
      } else {
        reject();
      }
    });
  });
}).listen(21, '0.0.0.0', function() {
  console.log('Listening on port ' + this.address().port);
});
有人知道如何实现一个简单的传统SSH转发服务器端吗


谢谢

在作者的帮助下找到了解决方案:


在作者的帮助下找到了解决方案:

let fs = require('fs'),
  inspect = require('util').inspect,
  ssh2 = require('ssh2'),
  net = require('net');

new ssh2.Server({
  hostKeys: [fs.readFileSync('/etc/ssh/ssh_host_rsa_key')]
}, client => {
  console.log('Client connected!');
  client
    .on('authentication', ctx => {
      if (
        ctx.method === 'password'
        && ctx.username === 'foo'
        && ctx.password === 'bar'
      ) {
        ctx.accept();
      } else {
        ctx.reject();
      }
    })
    .on('ready', () => {
      console.log('Client authenticated!');
      client
        .on('session', (accept, reject) => {
          let session = accept();
          session.on('shell', function(accept, reject) {
            let stream = accept();
          });
        })
        .on('request', (accept, reject, name, info) => {
          if (name === 'tcpip-forward') {
            accept();
            net.createServer(function(socket) {
              socket.setEncoding('utf8');
              client.forwardOut(
                info.bindAddr, info.bindPort,
                socket.remoteAddress, socket.remotePort,
                (err, upstream) => {
                  if (err) {
                    socket.end();
                    return console.error('not working: ' + err);
                  }
                  upstream.pipe(socket).pipe(upstream);
                });
            }).listen(info.bindPort);
          } else {
            reject();
          }
        });
    });
}).listen(21, '0.0.0.0', function() {
  console.log('Listening on port ' + server.address().port);
});