Terowongan SSH otomatis dari Windows


32

Saya mencoba mengatur komputer Windows untuk selalu memiliki dua terowongan SSH ke server Linux saya.

Saat ini, saya menggunakan Putty untuk membuka dua terowongan SSH: Saya masuk ke server Putty, biarkan diminimalkan, dan tidak pernah menyentuhnya. Ini berfungsi dengan baik, kecuali ketika koneksi SSH turun: Putty menampilkan pesan kesalahan, dan saya perlu menutup kesalahan secara manual dan menyambung kembali ke server.

Yang ingin saya lakukan adalah memiliki aplikasi yang dapat mengatur dua terowongan SSH, dan dapat secara otomatis menyambung kembali, tanpa perlu melakukan apa pun secara manual, termasuk memasukkan kata sandi. Data yang saya kirim di kedua terowongan adalah koneksi VNC, jadi saya sering tidak berada di mesin untuk menghapus kesalahan dan memasukkan kata sandi. Dua terowongan adalah satu terowongan lokal, dan satu terowongan terpencil.

(Ya, saya menyadari bahaya masuk secara otomatis ke SSH. Saya berencana membuat pengguna khusus tanpa hak istimewa dan tidak diizinkan untuk masuk secara interaktif, dan menggunakannya.)

Saya memang menemukan pertanyaan ini: Bagaimana cara menjaga agar terowongan SSH tetap terbuka? , tapi itu menggunakan Linux sebagai klien SSH, dan saya menggunakan Windows.


2
Login otomatis tidak berbahaya jika dilakukan dengan benar. Cari otentikasi kunci publik SSH .
grawity

Saya melakukan itu untuk login manual sekarang, tetapi saya percaya Putty tidak mengizinkan kunci untuk memiliki kata sandi kosong.
David Yaw

Tentu saja.
grawity

Saya pasti salah paham beberapa dokumentasi Putty. Saya mungkin membaca "kami tidak akan pernah membuat Putty secara otomatis mengetikkan kata sandi Anda untuk Anda", dan berasumsi bahwa kata sandi yang diperlukan juga diperlukan pada kunci.
David Yaw

Jawaban:


14

Coba Bitvise Tunnelier - ini bekerja untuk saya. Saya mengaturnya untuk membuat terowongan SSH sementara hanya terlihat sebagai ikon baki. Itu membangun koneksi SSH pada startup dan membangun kembali begitu konektivitas dipulihkan setelah dipotong atau setelah sistem pergi tidur. Saya masih lebih suka tampilan konsol Putty, jadi saya tetap menggunakannya - tetapi untuk menjaga terowongan saya sekarang menggunakan Tunnelier. Satu-satunya kelemahan utama yang saya temukan adalah kurangnya dukungan IPv6, yang disediakan oleh Putty tanpa perlu tindakan pengguna.


Saya telah menggunakan ini selama beberapa bulan sekarang. Itu benar: duduk di baki sistem, matikan sembulan yang mengeluhkan tentang terputusnya dan semacamnya, dan itu membuat terowongan tetap terbuka. Saya masih menggunakan Putty jika saya akan melakukan banyak pekerjaan melalui koneksi, tetapi untuk terowongan & terminal cepat, Tunnelier berfungsi dengan baik.
David Yaw

2
Ini mungkin tidak jelas, tetapi Anda mengatur terowongan di tab C2S dan membalikkan terowongan di tab S2C . Itu singkatan dari client2server dan server2client , masing-masing.
fracz

@ Jean-Marc Liotier Mungkin Anda bisa membantu saya. Lihat ini: superuser.com/questions/1353398/...
Success Man

@SuccessMan - Maaf, sudah bertahun-tahun saya tidak menggunakan produk Microsoft apa pun. Saya sekarang semua-Debian, di mana masalah semacam ini diselesaikan dengan sepele ...
Jean-Marc Liotier


2

Lihatlah Xshell - lebih skrip daripada Putty dan gratis untuk digunakan di rumah (jika itu yang Anda butuhkan). Ia mengklaim memiliki fitur auto-sambungkan kembali tetapi saya belum mencobanya dan telah menggunakan laptop berbasis Linux selama beberapa bulan sekarang jadi tidak memiliki sarana untuk mengujinya di mo.


Xshell luar biasa, saya telah beralih dari SecureCRT 3-4 tahun yang lalu dan belum melihat ke belakang
alexeit


2

Saya mencoba banyak solusi seperti SSH tunnel manager, tetapi semua tidak nyaman bagi saya: terlalu banyak layar konfigurasi, terkadang buggy (satu kali SSH tunnel manager membersihkan semua! Pengaturan yang saya miliki! Jadi saya harus mengembalikan pengaturan untuk semua 30 terowongan). Jadi mereka semua kehilangan kepercayaan saya. Itu sebabnya saya membuat skrip Powershell khusus, mudah dikonfigurasi, dapat diubah, kecil, tetapi berfungsi. Diposting di sini dan di bawah ini:

Untuk mulai menggunakannya, Anda memerlukan konfigurasi seperti ini:

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

Simpan sebagai config.csv. Dan menggunakan skrip PowerShell untuk mempertahankannya adalah:

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

Setelah dikonfigurasi jalankan saja seperti:

powershell -File autossh.ps1

1

Jika Anda penggemar Putty, cobalah Putty Tray .

Ini memiliki beberapa fungsi tambahan, termasuk mencoba untuk menghubungkan kembali secara otomatis setelah kegagalan koneksi dan menghubungkan kembali ketika komputer Anda bangun dari standby.

Seperti yang telah disebutkan oleh orang lain, saya akan menggabungkan ini dengan otentikasi kunci publik tanpa frasa sandi.

Secara teori ini seharusnya cukup andal, tapi saya bukan ahli keamanan jadi tidak bisa memberi tahu Anda di depan itu.


0

Saya mencari di Google dan memberikan beberapa hasil untuk pertanyaan Anda, pada dasarnya Anda selalu dapat mencoba kombo pencarian automate putty loginyang saya lakukan. Berikut ini adalah hasil yang sangat berguna yang cocok untuk Anda:

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

Ini menuntun Anda melalui cara menyiapkan makro untuk dempul. Juga unduh manajer koneksi Putty di sini (karena tautannya terputus dari tautan awal):

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


Tautan SourceForge untuk PuttyCM rusak. Lihat pertanyaan ini .
Craig McQueen

@CraigMcQueen, Anda sadar bahwa ini dijawab pada 01/19/2011 !? kanan?
Jakub

1
Ya, saya sadar. Dan saya menemukannya di pencarian Google kemarin, dan orang lain dapat melakukannya untuk satu atau dua tahun mendatang.
Craig McQueen

0

Saya menggunakan Putty juga dan memiliki masalah yang sama sampai saya menemukan solusi yang lebih baik - Coba ADVSoft SSH Persisten https://persistentssh.com berfungsi sebagai layanan Windows dan membuat terowongan SSH dalam keadaan berjalan. Gratis untuk penggunaan pribadi, tidak perlu menginstal apa pun.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.