Automatyczne tunelowanie SSH z Windows


32

Próbuję skonfigurować komputer z systemem Windows, aby zawsze miał dwa tunele SSH na moim serwerze Linux.

Obecnie używam PuTTY, aby otworzyć dwa tunele SSH: Loguję się do serwera w PuTTY, zostawiam go zminimalizowanego i nigdy go nie dotykam. Działa to dobrze, z wyjątkiem sytuacji, gdy połączenie SSH spada: PuTTY wyświetla komunikat o błędzie i muszę ręcznie zamknąć błąd i ponownie połączyć się z serwerem.

Chciałbym mieć aplikację, która może skonfigurować dwa tunele SSH i może automatycznie łączyć się ponownie, bez potrzeby ręcznego wykonywania jakichkolwiek czynności, w tym wprowadzania hasła. Dane przesyłane przez dwa tunele to połączenia VNC, więc często nie będę przy maszynie, aby usunąć błędy i wprowadzić hasła. Dwa tunele to jeden tunel lokalny i jeden tunel zdalny.

(Tak, zdaję sobie sprawę z zagrożeń związanych z automatycznym logowaniem do SSH. Planuję stworzyć dedykowanego użytkownika bez uprawnień i niedozwolonego interaktywnego logowania i korzystania z niego.)

Znalazłem pytanie: jak niezawodnie utrzymywać tunel SSH otwarty? , ale używa Linuksa jako klienta SSH, a ja korzystam z systemu Windows.


2
Automatyczne logowanie nie stanowi zagrożenia, jeśli zostanie wykonane prawidłowo. Wyszukaj uwierzytelnianie klucza publicznego SSH .
grawity

Robię to teraz dla ręcznego logowania, ale wierzę, że PuTTY nie zezwala, aby klucz miał puste hasło.
David Yaw

Oczywiście, że tak.
grawity

Musiałem źle zrozumieć część dokumentacji PuTTY. Prawdopodobnie przeczytałem: „Nigdy nie będziemy zmuszać PuTTY do automatycznego wpisywania hasła dla ciebie” i założyłem, że oznacza to, że hasła również były wymagane.
David Yaw,

Odpowiedzi:


14

Wypróbuj Bitvise Tunnelier - to działa dla mnie. Ustawiłem go, aby tworzył tunele SSH, będąc widocznym tylko jako ikona na pasku zadań. Ustanawia połączenie SSH przy uruchamianiu i przywraca je, gdy tylko połączenie zostanie przywrócone po przerwie lub po przejściu systemu w tryb uśpienia. Nadal wolę wygląd konsoli Putty, więc nadal go używam - ale do utrzymania tuneli używam teraz Tunnelier. Jedynym poważnym minusem, jaki znalazłem, jest brak obsługi protokołu IPv6, który zapewnia Putty bez konieczności podejmowania działań przez użytkownika.


Używam tego od kilku miesięcy. Jest w sam raz: siedzi w zasobniku systemowym, wyłącza wyskakujące okienka narzekające na rozłączenia itp. I utrzymuje otwarte tunele. Nadal używam PuTTY, jeśli mam dużo pracy nad połączeniem, ale w przypadku tuneli i szybkich terminali Tunnelier działa dobrze.
David Yaw,

2
Może to nie być jasne, ale tunele są konfigurowane na karcie C2S , a tunele odwrotne na karcie S2C . Oznacza odpowiednio client2server i server2client .
fracz

@ Jean-Marc Liotier Może możesz mi pomóc. Spójrz na to: superuser.com/questions/1353398/…
Success Man

@SuccessMan - Przepraszam, minęły lata, odkąd korzystałem z jakiegokolwiek produktu Microsoft bardziej niż powierzchownie. Jestem teraz całkowicie Debianem, w którym ten problem został rozwiązany w sposób trywialny ...
Jean-Marc Liotier


2

Spójrz na Xshell - jest bardziej skryptowalny niż PuTTY i jest darmowy do użytku domowego (jeśli właśnie tam musisz go użyć). Twierdzi, że ma funkcję automatycznego ponownego łączenia, ale nie próbowałem tego i od kilku miesięcy korzystam z laptopa opartego na Linuksie, więc nie mam żadnych środków, aby go przetestować na bieżąco.


Xshell jest niesamowity, przeszedłem na SecureCRT 3-4 lata temu i nie
oglądałem się za


2

Wypróbowałem wiele rozwiązań, takich jak menedżery tuneli SSH, ale wszystkie były dla mnie niewygodne: zbyt wiele ekranów konfiguracji, czasami błędnych (kiedyś menedżer tunelu SSH wyczyścił wszystkie ustawienia, które miałem! Musiałem więc przywrócić ustawienia dla wszystkich 30 tuneli). Więc wszyscy stracili moje zaufanie. Właśnie dlatego wymyśliłem niestandardowy skrypt Powershell, łatwy do skonfigurowania, zmienny, mały, ale działa. Wysłano tutaj i poniżej:

Aby zacząć go używać, potrzebujesz takiej konfiguracji:

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

Zapisz go jako config.csv. Aby używać go, użyj skryptu PowerShell:

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

Po skonfigurowaniu uruchom go w następujący sposób:

powershell -File autossh.ps1

1

Jeśli jesteś fanem Putty, wypróbuj Putty Tray .

Ma kilka dodatkowych funkcji, w tym próbę automatycznego ponownego połączenia po awarii połączenia i ponownego połączenia, gdy komputer budzi się z trybu gotowości.

Jak już wspomniano przez kogoś innego, połączę to z uwierzytelnianiem klucza publicznego bez hasła.

Teoretycznie powinno to być dość niezawodne, ale nie jestem ekspertem od bezpieczeństwa, więc nie mogę ci doradzić w tej kwestii.


0

Poszukałem go i uzyskałem kilka wyników dla twojego pytania, w zasadzie zawsze możesz spróbować kombinacji wyszukiwania, z automate putty loginktórej zrobiłem. Oto szczególnie przydatny wynik, który powinien Ci odpowiadać:

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

Przeprowadzi Cię przez proces ustawiania makra dla szpachli. Pobierz również menedżera połączeń Putty tutaj (ponieważ link jest zerwany z początkowego linku):

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


Link SourceForge dla PuttyCM jest uszkodzony. Zobacz to pytanie .
Craig McQueen

@CraigMcQueen, zdajesz sobie sprawę, że odpowiedziano na to w dniu 19.01.2011 !? dobrze?
Jakub

1
Tak, zdaję sobie sprawę. I znalazłem to wczoraj w wyszukiwarce Google, a inni ludzie mogą to robić przez rok lub dwa.
Craig McQueen

0

Użyłem również Putty i miałem ten sam problem, dopóki nie znalazłem lepszego rozwiązania - wypróbuj ADVSoft Persistent SSH https://persistentssh.com działa jako usługa Windows i utrzymuje tunele SSH w stanie uruchomienia. Bezpłatnie do użytku osobistego, nie trzeba instalować niczego innego.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.