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.