Tunneling SSH automatico da Windows


32

Sto cercando di configurare un computer Windows per avere sempre due tunnel SSH sul mio server Linux.

Attualmente sto usando PuTTY per aprire i due tunnel SSH: accedo al server in PuTTY, lo lascio minimizzare e non lo tocco mai. Funziona bene, tranne quando la connessione SSH si interrompe: PuTTY visualizza un messaggio di errore e devo chiudere manualmente l'errore e riconnettermi al server.

Quello che mi piacerebbe fare è avere un'applicazione in grado di configurare i due tunnel SSH e di riconnettersi automaticamente, senza dover fare nulla manualmente, incluso inserire una password. I dati che sto inviando attraverso i due tunnel sono connessioni VNC, quindi spesso non sono alla macchina per cancellare errori e inserire password. I due tunnel sono un tunnel locale e un tunnel remoto.

(Sì, sono consapevole dei pericoli connessi all'accesso automatico a SSH. Sto pensando di creare un utente dedicato senza privilegi e di non poter accedere in modo interattivo e utilizzarlo.)

Ho trovato questa domanda: come mantenere affidabile un tunnel SSH aperto? , ma quello sta usando Linux come client SSH e io sto usando Windows.


2
L'accesso automatico non è pericoloso se eseguito correttamente. Cerca l'autenticazione con chiave pubblica SSH .
— gravità

Lo sto facendo per gli accessi manuali ora, ma credo che PuTTY non consenta alla chiave di avere una password vuota.
— David Yaw,

Certo che lo fa.
— gravità

Devo aver frainteso parte della documentazione di PuTTY. Probabilmente ho letto "Non faremo mai PuTTY digitando automaticamente la tua password per te", e ho ipotizzato che anche sulla chiave fossero richieste password.
— David Yaw,

Risposte:


14

Prova Bitvise Tunnelier - funziona per me. L'ho impostato per stabilire tunnel SSH pur essendo visibile solo come icona nella barra delle applicazioni. Stabilisce la connessione SSH all'avvio e la ripristina non appena viene ripristinata la connettività dopo un taglio o dopo che il sistema è andato in sospensione. Preferisco ancora l'aspetto della console di Putty, quindi continuo a usarlo - ma per mantenere i tunnel in su ora uso Tunnelier. L'unico aspetto negativo importante che ho riscontrato è la mancanza del supporto IPv6, che Putty non fornisce alcuna azione da parte dell'utente.


Lo sto usando da alcuni mesi. È giusto: si trova nella barra delle applicazioni, disattiva tutti i popup che si lamentano di disconnessioni e simili e mantiene aperti i tunnel. Uso ancora PuTTY se farò molto lavoro sulla connessione, ma per tunnel e terminali veloci, Tunnelier funziona bene.
— David Yaw,

2
Potrebbe non essere chiaro, ma hai impostato i tunnel nella scheda C2S e invertito i tunnel nella scheda S2C . Indica client2server e server2client , rispettivamente.
— venerdì

@ Jean-Marc Liotier Forse mi puoi aiutare. Guarda questo: superuser.com/questions/1353398/…
— Success Man

@SuccessMan - Mi dispiace, sono anni che uso il prodotto Microsoft più che superficialmente. Ora sono tutto-Debian, dove questo tipo di problema viene risolto banalmente ...
— Jean-Marc Liotier,


2

Dai un'occhiata a Xshell : è più scriptabile di PuTTY ed è gratuito per l'uso domestico (se è lì che devi usarlo). Afferma di avere una funzione di riconnessione automatica, ma non l'ho provato e sono su un laptop basato su Linux ormai da alcuni mesi, quindi non ho alcun mezzo per testarlo al momento.


Xshell è fantastico, ci sono passato da SecureCRT 3-4 anni fa e non ho guardato indietro
— alexeit


2

Ho provato molte soluzioni come i gestori di tunnel SSH, ma per me erano tutte inconcludenti: troppe schermate di configurazione, a volte buggy (una volta il gestore del tunnel SSH ha eliminato tutte le impostazioni che avevo! Quindi ho dovuto ripristinare le impostazioni per tutti e 30 i tunnel). Quindi tutti hanno perso la mia fiducia. Ecco perché mi viene in mente lo script Powershell personalizzato, facilmente configurabile, modificabile, piccolo, ma funziona. Pubblicato qui e sotto:

Per iniziare ad usarlo hai bisogno di una configurazione come questa:

# LocalPort TargetHost  TargetPort  SshHost SshUsername SshKeyPath 
18080   google.com  80  bastion.example.com User    D:\secure\path\to\private_key.ppk

Salvalo come config.csv. E usare uno script PowerShell per tenerlo aggiornato è:

<#
.SYNOPSIS
  Powershell script for keeping ssh tunnel up and running

.DESCRIPTION
  This script uses configuration of tunnels located in config.csv. For more information visit http://tsherlock.tech/2019/03/13/simple-ssh-tunnel-auto-reconnect-using-putty-and-powershell/

.NOTES
  Version:        1.0
  Author:         Anton Shkuratov
  Creation Date:  2019-03-13
  Purpose/Change: Initial script development

#>

$currentDir = $PSScriptRoot
if (-not $env:PATH.Contains($currentDir)) {
  $env:PATH="$env:PATH;$currentDir"
}

# Check plink is accessible
try {
  Start-Process plink.exe -WindowStyle Hidden
} catch {
  Write-Host Error running plink.exe Please make sure its path is in PATH environment variable
  EXIT 1
}

# Parse config
$config = [System.IO.File]::ReadAllLines("$currentDir\config.csv");
$bindings = New-Object System.Collections.ArrayList
$regex = New-Object System.Text.RegularExpressions.Regex("(\d)+\s([^ ]+)\s(\d+)\s([^ ]+)\s([^ ]+)\s([^ ]+)", [System.Text.RegularExpressions.RegexOptions]::IgnoreCase);
$keyPasswords = @{}
$procs = @{}

foreach($line in $config) {
  $match = $regex.Match($line)

  if ($match.Success) {
    $sshKey = $match.Groups[6];

    $bindings.Add(@{
      LocalPort = $match.Groups[1];
      TargetHost = $match.Groups[2];
      TargetPort = $match.Groups.Groups[3];
      SshHost = $match.Groups[4];
      SshUser = $match.Groups[5];
      SshKey = $match.Groups[6];
    });

    if (-not $keyPasswords.ContainsKey($sshKey)) {
      $pass = Read-Host "Please enter password for key (if set): $sshKey" -AsSecureString
      $keyPasswords.Add($sshKey, $pass);
    }
  }
}

# Starting Processes
function EnsureRunning($procs, $keyPasswords, $binding) {

  if ($procs.ContainsKey($binding) -and $procs[$binding].HasExited) {

    $proc = $procs[$binding]
    $sshKey = $binding.sshKey
    $out = $proc.StandardError.ReadToEnd()

    if ($out.Contains("Wrong passphrase")) {
      Write-Host "Wrong pass phrase for $sshKey, please re-enter"
      $pass = Read-Host "Please enter password for key: $sshKey" -AsSecureString
      $keyPasswords[$sshKey] = $pass;
    } else {
      $exitCode = $proc.ExitCode
      $tHost = $binding.sshHost

      Write-Host "Connection to $tHost is lost, exit code: $exitCode"
    }
  }

  if (-not $procs.ContainsKey($binding) -or $procs[$binding].HasExited) {
    $sshUser = $binding.SshUser
    $sshHost = $binding.SshHost
    $sshKey = $binding.SshKey
    $lPort = $binding.LocalPort
    $tPort = $binding.TargetPort
    $tHost = $binding.TargetHost
    $sshKeyPass = [Runtime.InteropServices.Marshal]::PtrToStringAuto([Runtime.InteropServices.Marshal]::SecureStringToBSTR($keyPasswords[$sshKey]))

    $psi = New-Object System.Diagnostics.ProcessStartInfo;
    $psi.FileName = "plink.exe";
    $psi.UseShellExecute = $false;

    $psi.CreateNoWindow = $true;
    $psi.RedirectStandardInput = $true;
    $psi.RedirectStandardError = $true;

    $psi.Arguments = "-ssh $sshUser@$sshHost -i `"$sshKey`" -batch -pw $sshKeyPass -L $lPort`:$tHost`:$tPort"

    $proc = [System.Diagnostics.Process]::Start($psi);

    Start-Sleep 1

    if (-not $proc.HasExited) {
      Write-Host Connected to $sshUser@$sshHost
    }

    $procs[$binding] = $proc;
  }
}

function EnsureAllRunning($procs, $keyPasswords, $bindings) {
  while($true) {
    foreach($binding in $bindings) {
      EnsureRunning $procs $keyPasswords $binding
    }
    Start-Sleep 1
  }
}


try {
  # Waiting for exit command
  Write-Host Working... Press Ctrl+C to stop execution...
  EnsureAllRunning $procs $keyPasswords $bindings
} finally {
  # Clean up
  Write-Host Clean up

  foreach($proc in $procs.Values) {
    if ($proc -ne $null -and -not $proc.HasExited) {
      $proc.Kill();
    }
  }
}

Dopo averlo configurato, eseguilo come segue:

powershell -File autossh.ps1

1

Se sei un fan di Putty, prova Putty Tray .

Ha alcune funzioni aggiuntive, tra cui il tentativo di riconnettersi automaticamente dopo un errore di connessione e la riconnessione quando il computer si riattiva dallo standby.

Come già accennato da qualcun altro, lo combinerei con l'autenticazione a chiave pubblica senza passphrase.

In teoria questo dovrebbe essere abbastanza affidabile, ma io non sono un esperto di sicurezza, quindi non posso consigliarti su questo fronte.


0

Ho cercato su Google e ottenuto alcuni risultati per la tua domanda, in pratica potresti sempre provare una combinazione di ricerca di automate putty logincui ho fatto. Ecco un risultato particolarmente utile che dovrebbe adattarsi a te:

http://www.neox.net/w/2008/04/22/putty-auto-login-macro-putty-connection-manager/

Ti guida attraverso come impostare una macro per stucco. Scarica anche qui Putty Connection Manager (poiché il collegamento è interrotto dal collegamento iniziale):

http://sourceforge.net/projects/puttycm/


Il collegamento SourceForge per PuttyCM è interrotto. Vedere questa domanda .
— Craig McQueen,

@CraigMcQueen, ti rendi conto che è stata data una risposta nel 19/01/2011 !? destra?
— Jakub,

1
Sì, me ne rendo conto. E l'ho trovato ieri in una ricerca su Google, e altre persone potrebbero farlo per un anno o due a venire.
— Craig McQueen,

0

Ho usato anche Putty e ho avuto lo stesso problema fino a quando non ho trovato una soluzione migliore: provare ADVSoft Persistent SSH https://persistentssh.com funziona come un servizio di Windows e mantiene i tunnel SSH in stato di esecuzione. Gratuito per uso personale, non è necessario installare nient'altro.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.