Túnel SSH automático do Windows


32

Estou tentando configurar um computador com Windows para sempre ter dois túneis SSH no meu servidor Linux.

No momento, estou usando o PuTTY para abrir os dois túneis SSH: Faço login no servidor no PuTTY, deixo-o minimizado e nunca o toco. Isso funciona bem, exceto quando a conexão SSH cai: PuTTY exibe uma mensagem de erro e preciso fechar manualmente o erro e reconectar-me ao servidor.

O que eu gostaria de fazer é ter um aplicativo que possa configurar os dois túneis SSH e reconectar automaticamente, sem a necessidade de fazer nada manualmente, incluindo digitar uma senha. Os dados que estou enviando pelos dois túneis são conexões VNC, portanto, muitas vezes não estou na máquina para limpar erros e inserir senhas. Os dois túneis são um túnel local e um túnel remoto.

(Sim, estou ciente dos riscos de fazer login automaticamente no SSH. Estou pensando em criar um usuário dedicado, sem privilégios e sem permissão para fazer logon interativamente, e usá-lo.)

Eu encontrei esta pergunta: Como manter confiável um túnel SSH aberto? , mas está usando o Linux como cliente SSH e estou usando o Windows.


2
O login automático não é um risco, se bem feito. Procure a autenticação de chave pública SSH .
grawity

Estou fazendo isso para os logins manuais agora, mas acredito que o PuTTY não permita que a chave tenha uma senha em branco.
precisa

Claro que sim.
grawity

Devo ter entendido errado parte da documentação do PuTTY. Eu provavelmente li "nós nunca faremos o PuTTY digitar automaticamente sua senha para você" e presumi que as senhas exigidas também fossem necessárias na chave.
precisa

Respostas:


14

Experimente o Bitvise Tunnelier - funciona para mim. Defini-o para estabelecer túneis SSH enquanto apenas é visível como um ícone de bandeja. Ele estabelece a conexão SSH na inicialização e a restabelece assim que a conectividade é restaurada após um corte ou após a suspensão do sistema. Ainda prefiro a aparência do console Putty, por isso continuo usando - mas para manter os túneis ativos, agora uso o Tunnelier. A única grande desvantagem que encontrei é a falta de suporte ao IPv6, que o Putty fornece sem a necessidade de ação do usuário.


Estou usando isso há alguns meses. Está certo: fica na bandeja do sistema, apaga todos os pop-ups que se queixam de desconexões e coisas assim e mantém os túneis abertos. Eu ainda uso o PuTTY se vou fazer muito trabalho pela conexão, mas para túneis e terminais rápidos, o Tunnelier funciona bem.
precisa

2
Pode não estar claro, mas você configurou túneis na guia C2S e inverte os túneis na guia S2C . Representa client2server e server2client , respectivamente.
Fracz 28/07/16

@ Jean-Marc Liotier Talvez você possa me ajudar. Veja isto: superuser.com/questions/1353398/…
Success Man

@SuccessMan - desculpe, já faz anos desde que eu uso qualquer produto da Microsoft mais do que superficialmente. Agora estou todo-Debian, onde este tipo de problema é resolvido trivialmente ...
Jean-Marc Liotier


2

Dê uma olhada no Xshell - é mais programável que o PuTTY e é gratuito para uso doméstico (se for onde você precisar usá-lo). Ele alega ter um recurso de reconexão automática, mas eu não o experimentei e estou em um laptop baseado em Linux há alguns meses, portanto, não há meios de testá-lo no momento.


O Xshell é incrível, mudei para ele do SecureCRT há 3 ou 4 anos e não olhei para trás
alexeit


2

Eu tentei muitas soluções, como gerenciadores de túneis SSH, mas todas eram inconvinientes para mim: muitas telas de configuração, às vezes com erros (uma vez o gerenciador de túneis SSH eliminou todas as configurações que eu tinha! Então tive que restaurar as configurações de todos os 30 túneis). Então todos eles perderam minha confiança. É por isso que eu proponho o script Powershell personalizado, fácil de configurar, alterável, pequeno, mas funciona. Postado aqui e abaixo:

Para começar a usá-lo, você precisa de uma configuração como esta:

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

Salve-o como um config.csv. E use um script do PowerShell para mantê-lo:

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

Depois de configurado, execute-o como:

powershell -File autossh.ps1

1

Se você é fã de Putty, experimente Putty Tray .

Possui algumas funções adicionais, incluindo a tentativa de se reconectar automaticamente após uma falha na conexão e a reconexão quando o computador sair do modo de espera.

Como já mencionado por outra pessoa, eu combinaria isso com autenticação de chave pública sem frase secreta.

Em teoria, isso deve ser bastante confiável, mas eu não sou especialista em segurança, portanto não posso aconselhá-lo nessa área.


0

Eu pesquisei no Google e coloquei alguns resultados para sua pergunta. Basicamente, você sempre pode tentar uma combinação de pesquisa automate putty loginque fiz. Aqui está um resultado particularmente útil que combina com você:

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

Ele mostra como configurar uma macro para massa. Faça o download do Putty Connection Manager aqui (como o link está quebrado no link inicial):

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


O link SourceForge para PuttyCM está quebrado. Veja esta pergunta .
Craig McQueen

@CraigMcQueen, você percebe que isso foi respondido em 19/01/2011 !? direita?
27412 Jakub

1
Sim, eu percebo. Encontrei-o ontem em uma pesquisa no Google e outras pessoas podem fazê-lo por um ou dois anos.
Craig McQueen

0

Também usei o Putty e tive o mesmo problema até encontrar uma solução melhor - Tente o SSH persistente do ADVSoft https://persistentssh.com funciona como um serviço do Windows e mantém os túneis do SSH no estado de execução. Gratuito para uso pessoal, não é necessário instalar mais nada.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.