ssh2 accepta un flux ja connectat mitjançant la seva opció sock. Deixa que socksv5 estableixi la ruta fins al servidor SSH i després passa aquest flux a SSH:

const socks = require('socksv5');
const { Client } = require('ssh2');

const connection = socks.connect({
  host: sshConfig.host,
  port: sshConfig.port || 22,
  proxyHost: 'proxy.example',
  proxyPort: 1080,
  localDNS: false,
  auths: [socks.auth.None()],
}, socket => {
  const ssh = new Client();
  ssh.on('error', error => console.error(error.message));
  ssh.on('ready', () => {
    ssh.sftp((error, sftp) => {
      if (error) {
        console.error(error.message);
        ssh.end();
        return;
      }
      sftp.readdir('.', (error, entries) => {
        if (error) console.error(error.message);
        else console.log(entries);
        ssh.end();
      });
    });
  });
  ssh.connect({ ...sshConfig, sock: socket });
});
connection.on('error', error => console.error(error.message));

sshConfig és la configuració SSH existent de l'aplicació, incloent-hi el compte, la clau i la política hostVerifier. L'amfitrió i el port SOCKS identifiquen l'intermediari; sshConfig.host i port identifiquen el servei SSH final.

L'exemple utilitza un punt de connexió SOCKS sense autenticació. Per a un servidor SSH accessible des d'Internet, la llista de proxys SOCKS5 pot proporcionar candidats; cadascun encara ha de permetre la destinació i el port SSH. Per al seu mètode d'usuari/contrasenya, utilitza socks.auth.UserPassword(proxyUser, proxyPassword) a auths. Aquestes credencials no substitueixen el compte SSH.

localDNS false passa el nom d'amfitrió de destinació al servidor SOCKS, utilitzant la resolució de destinació al costat del proxy. Sense aquesta elecció explícita, el valor predeterminat documentat de socksv5 intenta la resolució local.

La retornada de trucada SOCKS s'executa després de la negociació. Espera l'esdeveniment ready de ssh2 abans de sol·licitar SFTP. Són etapes correctes separades; ni una connexió TCP al proxy ni una resposta SOCKS proven que l'autenticació SSH o el subsistema SFTP hagin tingut èxit.

Articles relacionats