Windows'tan otomatik SSH tüneli


32

Linux sunucumda her zaman iki SSH tüneli olacak bir Windows bilgisayarı kurmaya çalışıyorum.

Şu anda, iki SSH tüneli açmak için PuTTY kullanıyorum: PuTTY'deki sunucuya giriş yapıyorum, simge durumuna küçültülmüş halde bırakıyorum ve asla dokunmam. Bu, SSH bağlantısının düştüğü durumlar dışında iyi çalışır: PuTTY bir hata mesajı görüntüler ve hatayı manuel olarak kapatmam ve sunucuya yeniden bağlanmam gerekiyor.

Yapmak istediğim, iki SSH tüneli ayarlayabilen ve bir şifre girme de dahil olmak üzere herhangi bir şeyi manuel olarak yapmak zorunda kalmadan otomatik olarak yeniden bağlanabilen bir uygulamaya sahip olmak. İki tünel üzerinden gönderdiğim veriler VNC bağlantıları, bu nedenle hataları temizlemek ve şifreleri girmek için genellikle makinede olmayacağım. İki tünel bir yerel tünel ve bir uzak tüneldir.

(Evet, otomatik olarak SSH'ya giriş yapmanın tehlikelerinin farkındayım. Ayrıcalıklı olmayan ve etkileşimli olarak giriş yapmama ve kullanmama izinsiz adanmış bir kullanıcı yapmayı planlıyorum.)

Bu soruyu buldum: Bir SSH tüneli nasıl açık tutulur? , ama bu SSH istemcisi olarak Linux kullanıyor ve ben Windows kullanıyorum.


2
Otomatik giriş doğru yapılırsa bir tehlike oluşturmaz. SSH ortak anahtar kimlik doğrulamasına bakın .
Ocak'ta 19:11

Bunu şimdi manuel girişler için yapıyorum, ancak PuTTY'nin anahtarın boş bir parola olmasına izin vermediğine inanıyorum.
David Yaw

Tabii ki öyle.
Ocak'ta 19:11

PuTTY belgelerinin bazılarını yanlış anlamış olmalıyım. Muhtemelen "PuTTY'yi asla sizin için şifrenizi otomatik olarak değiştirmeyeceğiz" i okudum ve anahtarda da şifre kullanılması gerektiğini varsaydım.
David Yaw,

Yanıtlar:


14

Bitvise Tunnelier'i deneyin - bu benim için çalışıyor. Sadece bir tepsi simgesi olarak görünürken SSH tünelleri kurmaya ayarladım. Başlangıçta SSH bağlantısını kurar ve bağlantı kesildikten sonra veya sistem uyku moduna geçtikten hemen sonra yeniden kurulur. Putty konsolunun görünüşünü hala tercih ediyorum, bu yüzden kullanmaya devam ediyorum - ancak tünelleri açık tutmak için şimdi Tunnelier kullanıyorum. Bulduğum tek dezavantajı, Putty'nin kullanıcı işlemine gerek kalmadan sağladığı IPv6 desteğinin eksikliği.


Bunu birkaç aydır kullanıyorum. Doğru: sistem tepsisinde oturur, bağlantı kesilmesinden ve benzeri şeylerden şikayet eden açılır pencereleri kapatır ve tünelleri açık tutar. Bağlantı üzerinde çok çalışacak olursam hala PuTTY kullanıyorum, ancak tüneller ve hızlı terminaller için Tunnelier iyi çalışıyor.
David Yaw,

2
Bu açık olmayabilir, ancak tünel kurmak C2S sekmesini ve ters tüneller S2C sekmesi. Sırasıyla client2server ve server2client anlamına gelir .
frakz,

@ Jean-Marc Liotier Belki bana yardım edebilirsin. Şuna bakın: superuser.com/questions/1353398/…
Başarı Adam

@SuccessMan - Üzgünüm, herhangi bir Microsoft ürününü yüzeysel olarak kullanmayalı yıllar oldu. Şimdi tüm Debian'ım, bu tür bir problemin önemsiz bir şekilde çözüldüğü
yerdeyim


2

Xshell'e bir göz atın - PuTTY'den daha komut dosyasıdır ve ev kullanımı için ücretsizdir (kullanmanız gereken yerdeyse ). Otomatik yeniden bağlanma özelliğine sahip olduğunu iddia ediyor ama denemedim ve Linux tabanlı bir dizüstü bilgisayarda birkaç aydır bu yüzden mo'da test etmek için hiçbir imkanım yok.


Xshell harika, ben 3-4 yıl önce SecureCRT'den değiştirdim ve geriye
bakmadım


2

SSH tünel yöneticileri gibi pek çok çözümü denedim, ama hepsi benim için uygun değildi: çok fazla yapılandırma ekranı, bazen buggy (bir keresinde SSH tünel yöneticisi tüm ayarları sildi! Böylece hepsi güvenimi kaybetti. Bu yüzden özel Powershell script, kolay yapılandırılabilir, değiştirilebilir, küçük ama işe yarar. Yayınlanan burada ve aşağıda:

Kullanmaya başlamak için böyle bir yapılandırmaya ihtiyacınız var:

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

Bir config.csv olarak kaydedin. Ve yetişmek için bir powershell betiği kullanın:

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

Konfigüre edildikten sonra sadece şöyle çalıştırın:

powershell -File autossh.ps1

1

Eğer bir Macun hayranınız varsa, Macun Tepsisi'ni deneyin .

Bir bağlantı hatasından sonra otomatik olarak yeniden bağlanmayı denemek ve bilgisayarınız bekleme modundan uyandığında yeniden bağlanmak da dahil olmak üzere birkaç ek işlevi vardır.

Daha önce bir başkası tarafından bahsedildiği gibi, bunu genel anahtar kimlik doğrulamasıyla, şifreyiz ifade olmadan birleştiririm.

Teoride bu oldukça güvenilir olmalı, ancak ben bir güvenlik uzmanı değilim bu yüzden size bu konuda öneride bulunamam.


0

Ben googled ve sorunuzu için birkaç sonuç gota, temelde her zaman automate putty loginyaptığım bir arama combo deneyebilirsiniz . İşte size uygun olan özellikle yararlı bir sonuç:

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

Macun için bir makronun nasıl ayarlanacağını gösterir. Ayrıca buradan Putty bağlantı yöneticisini indirin (bağlantı ilk bağlantıdan koptuğu için):

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


PuttyCM için SourceForge bağlantısı koptu. Bu soruya bakınız .
Craig McQueen

@CraigMcQueen, bunun 01/19/2011 tarihinde cevaplanmış olduğunu biliyorsunuz !? sağ?
Jakub

1
Evet, anladım. Ve dün Google’da bir aramada buldum ve diğer insanlar bunu bir-iki yıl boyunca yapabilir.
Craig McQueen

0

Putty'yi de kullandım ve daha iyi bir çözüm bulana kadar aynı problemi yaşadım - ADVSoft Persistent SSH'ı deneyin https://persistentssh.com bir Windows servisi olarak çalışıyor ve SSH tünellerini çalışır durumda tutuyor. Kişisel kullanım için ücretsiz, başka bir şey yüklemenize gerek yok.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.