Automatisches SSH-Tunneling unter Windows


32

Ich versuche, einen Windows-Computer so einzurichten, dass er immer zwei SSH-Tunnel zu meinem Linux-Server hat.

Momentan benutze ich PuTTY, um die beiden SSH-Tunnel zu öffnen: Ich melde mich in PuTTY beim Server an, lasse ihn minimiert und berühre ihn nie. Dies funktioniert gut, außer wenn die SSH-Verbindung unterbrochen wird: PuTTY zeigt eine Fehlermeldung an, und ich muss den Fehler manuell schließen und erneut eine Verbindung zum Server herstellen.

Ich möchte eine Anwendung haben, mit der die beiden SSH-Tunnel eingerichtet und die Verbindung automatisch wiederhergestellt werden kann, ohne manuell etwas tun zu müssen, einschließlich der Eingabe eines Kennworts. Die Daten, die ich über die beiden Tunnel sende, sind VNC-Verbindungen, daher bin ich häufig nicht an der Maschine, um Fehler zu löschen und Kennwörter einzugeben. Die zwei Tunnel sind ein lokaler Tunnel und ein entfernter Tunnel.

(Ja, ich bin mir der Gefahren einer automatischen Anmeldung bei SSH bewusst. Ich plane, einen dedizierten Benutzer ohne Berechtigungen einzurichten, der sich nicht interaktiv anmelden darf, und verwende diesen.)

Ich habe diese Frage gefunden: Wie kann man einen SSH-Tunnel zuverlässig offen halten? , aber dafür wird Linux als SSH-Client verwendet, und ich verwende Windows.


2
Automatische Anmeldung ist keine Gefahr, wenn richtig gemacht. Suchen Sie nach der SSH -Authentifizierung mit öffentlichem Schlüssel .
Grawity

Ich mache das jetzt für die manuellen Anmeldungen, aber ich glaube, PuTTY erlaubt dem Schlüssel nicht, ein leeres Passwort zu haben.
David Yaw

Natürlich tut es das.
Grawity

Ich muss einen Teil der PuTTY-Dokumentation falsch verstanden haben. Wahrscheinlich habe ich gelesen, dass PuTTY Ihr Kennwort niemals automatisch für Sie eingeben wird, und davon ausgegangen, dass auch für den Schlüssel entsprechende Kennwörter erforderlich sind.
David Yaw

Antworten:


14

Probieren Sie Bitvise Tunnelier aus - es funktioniert bei mir. Ich habe es so eingestellt, dass SSH-Tunnel eingerichtet werden und nur als Taskleistensymbol angezeigt werden. Es stellt die SSH-Verbindung beim Start her und stellt sie wieder her, sobald die Konnektivität nach einem Schnitt oder nach dem Ruhezustand des Systems wiederhergestellt ist. Ich bevorzuge immer noch das Aussehen der Putty-Konsole, also verwende ich sie weiterhin - aber um die Tunnel hochzuhalten, verwende ich jetzt Tunnelier. Der einzige große Nachteil, den ich festgestellt habe, ist die mangelnde IPv6-Unterstützung, die Putty bietet, ohne dass Benutzeraktionen erforderlich sind.


Ich benutze das jetzt seit ein paar Monaten. Es ist genau richtig: Befindet sich in der Taskleiste, deaktiviert Popups, die sich über Verbindungsabbrüche und dergleichen beschweren, und hält die Tunnel offen. Ich benutze PuTTY immer noch, wenn ich viel Arbeit über die Verbindung machen werde, aber für Tunnel und schnelle Terminal-Sachen funktioniert Tunnelier gut.
David Yaw

2
Es ist möglicherweise nicht klar, aber Sie richten Tunnel auf der Registerkarte C2S und Rückwärts-Tunnel auf der Registerkarte S2C ein . Es steht für client2server bzw. server2client .
Fracz

@ Jean-Marc Liotier Vielleicht kannst du mir helfen. Schauen Sie sich dies an: superuser.com/questions/1353398/…
Success Man

@ SuccessMan - Es tut mir leid, es ist Jahre her, seit ich ein Microsoft-Produkt mehr als nur oberflächlich verwendet habe. Ich bin jetzt All-Debian, wo diese Art von Problem trivial gelöst wird ...
Jean-Marc Liotier


2

Schauen Sie sich Xshell an - es ist skriptfähiger als PuTTY und für den privaten Gebrauch kostenlos (wenn Sie es dort benötigen). Es behauptet, eine automatische Wiederverbindungsfunktion zu haben, aber ich habe sie nicht ausprobiert und bin jetzt seit einigen Monaten auf einem Linux-basierten Laptop.


Xshell ist großartig, ich bin vor 3-4 Jahren von SecureCRT darauf umgestiegen und habe nicht zurückgeschaut
alexeit


2

Ich habe viele Lösungen wie SSH-Tunnelmanager ausprobiert, aber alle waren für mich unpraktisch: Zu viele Konfigurationsbildschirme, manchmal fehlerhaft (einmal löschte der SSH-Tunnelmanager alle! Einstellungen, die ich hatte! Also musste ich die Einstellungen für alle 30 Tunnel wiederherstellen). Also haben sie alle mein Vertrauen verloren. Aus diesem Grund habe ich mir ein benutzerdefiniertes Powershell-Skript ausgedacht, das einfach konfigurierbar, änderbar und klein ist, aber funktioniert. Hier und unten gepostet :

Um es zu benutzen, brauchst du eine Konfiguration wie diese:

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

Speichern Sie es als config.csv. Und verwenden Sie ein Powershell-Skript, um es auf dem neuesten Stand zu halten:

<#
.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();
    }
  }
}

Nachdem es konfiguriert ist, führen Sie es einfach wie folgt aus:

powershell -File autossh.ps1

1

Wenn Sie ein Fan von Putty sind, probieren Sie Putty Tray aus .

Es verfügt über einige zusätzliche Funktionen, einschließlich des Versuchs, die Verbindung nach einem Verbindungsfehler automatisch wiederherzustellen und die Verbindung wiederherzustellen, wenn Ihr Computer aus dem Standby-Modus aufwacht.

Wie bereits von jemand anderem erwähnt, würde ich dies mit einer Authentifizierung mit öffentlichem Schlüssel ohne Passphrase kombinieren.

Theoretisch sollte dies ziemlich zuverlässig sein, aber ich bin kein Sicherheitsexperte und kann Sie in dieser Hinsicht nicht beraten.


0

Ich habe es gegoogelt und ein paar Ergebnisse für Ihre Frage erhalten. Grundsätzlich können Sie immer eine Suchkombination ausprobieren, automate putty logindie ich durchgeführt habe. Hier ist ein besonders nützliches Ergebnis, das zu Ihnen passen sollte:

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

Hier erfahren Sie, wie Sie ein Makro für Putty einrichten. Laden Sie auch Putty Connection Manager hier herunter (da der Link vom ursprünglichen Link abbricht):

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


Der SourceForge-Link für PuttyCM ist defekt. Siehe diese Frage .
Craig McQueen

@CraigMcQueen, Sie stellen fest, dass dies am 19.01.2011 beantwortet wurde !? Recht?
Jakub

1
Ja, mir ist klar. Und ich habe es gestern in einer Google-Suche gefunden, und andere Leute werden es vielleicht ein oder zwei Jahre lang tun.
Craig McQueen

0

Ich habe auch Putty verwendet und hatte das gleiche Problem, bis ich eine bessere Lösung gefunden habe. Versuchen Sie es mit ADVSoft Persistent SSH. Https://persistentssh.com arbeitet als Windows-Dienst und hält SSH-Tunnel im Betriebszustand. Kostenlos für den persönlichen Gebrauch, keine weitere Installation erforderlich.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.