Передайте ssh2 сокет, открытый через SOCKS
Сначала согласуйте соединение SOCKS, затем передайте его сокет назначения в ssh2 перед открытием подсистемы SFTP.
ssh2 принимает уже подключённый поток через опцию sock. Пусть socksv5 проложит маршрут к серверу SSH, а затем передайте этот поток в 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 — это существующая конфигурация SSH приложения, включая учётную запись, ключ и политику hostVerifier. Хост и порт SOCKS обозначают посредника; sshConfig.host и port обозначают конечную службу SSH.
В примере используется конечная точка SOCKS без аутентификации. Для сервера SSH, доступного из публичного интернета, список прокси SOCKS5 может дать кандидатов; каждый из них всё равно должен разрешать назначение и порт SSH. Для метода с именем пользователя и паролем используйте socks.auth.UserPassword(proxyUser, proxyPassword) в auths. Эти учётные данные не заменяют учётную запись SSH.
localDNS false передаёт имя хоста назначения серверу SOCKS, используя разрешение назначения на стороне прокси. Без этого явного выбора документированное значение по умолчанию socksv5 пытается выполнить локальное разрешение.
Обратный вызов SOCKS выполняется после согласования. Дождитесь события ready в ssh2, прежде чем запрашивать SFTP. Это отдельные успешные этапы; ни TCP-соединение с прокси, ни ответ SOCKS не доказывают, что аутентификация SSH или подсистема SFTP завершились успешно.