ssh2 acepta un flujo ya conectado mediante su opción sock. Deja que socksv5 establezca la ruta hasta el servidor SSH y luego entrega ese flujo 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 es la configuración SSH existente de la aplicación, incluidos su cuenta, su clave y su política hostVerifier. El host y el puerto SOCKS identifican al intermediario; sshConfig.host y port identifican el servicio SSH final.

El ejemplo usa un punto de conexión SOCKS sin autenticación. Para un servidor SSH accesible desde Internet, la lista de proxies SOCKS5 puede aportar candidatos; cada uno debe seguir permitiendo el destino y el puerto SSH. Para su método de usuario/contraseña, usa socks.auth.UserPassword(proxyUser, proxyPassword) en auths. Esas credenciales no sustituyen la cuenta SSH.

localDNS false pasa el nombre de host de destino al servidor SOCKS, usando la resolución de destino del lado del proxy. Sin esa elección explícita, el valor predeterminado documentado de socksv5 intenta la resolución local.

La devolución de llamada SOCKS se ejecuta después de la negociación. Espera el evento ready de ssh2 antes de solicitar SFTP. Son etapas correctas separadas; ni una conexión TCP al proxy ni una respuesta SOCKS demuestran que la autenticación SSH o el subsistema SFTP hayan tenido éxito.

Artículos relacionados