Passez à ssh2 la socket ouverte via SOCKS
Négociez d'abord la connexion SOCKS, puis transmettez sa socket de destination à ssh2 avant d'ouvrir le sous-système SFTP.
ssh2 accepte un flux déjà connecté via son option sock. Laissez socksv5 établir la route vers le serveur SSH, puis transmettez ce flux à 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 est la configuration SSH existante de l'application, y compris son compte, sa clé et sa politique hostVerifier. L'hôte et le port SOCKS désignent l'intermédiaire ; sshConfig.host et port désignent le service SSH final.
L'exemple utilise un point de terminaison SOCKS sans authentification. Pour un serveur SSH joignable depuis l'internet public, la liste de proxys SOCKS5 peut fournir des candidats ; chacun doit encore autoriser la destination et le port SSH. Pour sa méthode nom d'utilisateur/mot de passe, utilisez socks.auth.UserPassword(proxyUser, proxyPassword) dans auths. Ces identifiants ne remplacent pas le compte SSH.
localDNS false transmet le nom d'hôte de destination au serveur SOCKS, en utilisant la résolution de destination côté proxy. Sans ce choix explicite, la valeur par défaut documentée de socksv5 tente une résolution locale.
Le rappel SOCKS s'exécute après la négociation. Attendez l'événement ready de ssh2 avant de demander SFTP. Ce sont des étapes réussies distinctes ; ni une connexion TCP au proxy ni une réponse SOCKS ne prouvent que l'authentification SSH ou le sous-système SFTP a réussi.