ssh2 accepteert een al verbonden stream via zijn sock-optie. Laat socksv5 de route naar de SSH-server opzetten en geef die stream daarna aan 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 is de bestaande SSH-configuratie van de applicatie, inclusief het account, de sleutel en het hostVerifier-beleid. De SOCKS-host en -poort wijzen de tussenpersoon aan; sshConfig.host en port wijzen de uiteindelijke SSH-dienst aan.

Het voorbeeld gebruikt een SOCKS-eindpunt zonder authenticatie. Voor een SSH-server die vanaf het openbare internet bereikbaar is, kan de SOCKS5-proxylijst kandidaten leveren; elk moet nog steeds de SSH-bestemming en -poort toestaan. Gebruik voor de gebruikersnaam/wachtwoordmethode socks.auth.UserPassword(proxyUser, proxyPassword) in auths. Die inloggegevens vervangen het SSH-account niet.

localDNS false geeft de hostnaam van de bestemming door aan de SOCKS-server en gebruikt bestemmingsresolutie aan de proxykant. Zonder die expliciete keuze probeert de gedocumenteerde standaard van socksv5 lokale resolutie.

De SOCKS-callback draait na de onderhandeling. Wacht op de ready-gebeurtenis van ssh2 voordat SFTP wordt aangevraagd. Dit zijn afzonderlijke geslaagde fasen; noch een TCP-verbinding met de proxy noch een SOCKS-antwoord bewijst dat de SSH-authenticatie of het SFTP-subsysteem is geslaagd.

Gerelateerde artikelen