Автоматичне тунелювання SSH з Windows


32

Я намагаюся налаштувати комп'ютер під Windows, щоб завжди було два тунелі SSH на моєму сервері Linux.

В даний час я використовую PuTTY для відкриття двох тунелів SSH: я входжу на сервер в PuTTY, залишаю його мінімізованим і ніколи не торкаюся його. Це добре працює, за винятком випадків, коли з’єднується SSH: PuTTY відображає повідомлення про помилку, і мені потрібно вручну закрити помилку та знову підключитися до сервера.

Що я хотів би зробити - це програма, яка може налаштувати два тунелі SSH і може автоматично підключатись, не вимагаючи нічого вручну робити, включаючи введення пароля. Дані, які я надсилаю через два тунелі, - це з'єднання VNC, тому я часто не буду за машиною, щоб очищати помилки та вводити паролі. Два тунелі - один локальний тунель і один віддалений тунель.

(Так, я знаю про небезпеку автоматичного входу в SSH. Планую створити виділеного користувача без привілеїв і не дозволяти інтерактивно входити в систему та використовувати це.)

Я знайшов це питання: як надійно тримати тунель SSH відкритим? , але це використовує Linux як клієнт SSH, і я використовую Windows.


2
Автоматичне вхід не становить небезпеки, якщо зробити це правильно. Знайдіть аутентифікацію відкритого ключа SSH .
grawity

Я роблю це для ручного входу зараз, але я вважаю, що PuTTY не дозволяє ключу мати порожній пароль.
Девід Яу

Звичайно, так і є.
grawity

Я, мабуть, неправильно зрозумів деякі документи PuTTY. Я, мабуть, читав "ми ніколи не зробимо PuTTY автоматичним введенням вашого пароля", і припустив, що введені паролі також потрібні.
Девід Яу

Відповіді:


14

Спробуйте Bitvise Tunnelier - це працює для мене. Я встановив його для встановлення тунелів SSH, але видно лише як значок лотка. Він встановлює SSH-з'єднання під час запуску та відновлює його, як тільки відновлюється зв’язок після розриву або після того, як система переходить у режим сну. Я все ще віддаю перевагу зовнішньому вигляду консолі Putty, тому продовжую користуватися нею, але для збереження тунелів зараз використовую Tunnelier. Єдиний головний недолік, який я знайшов, - це відсутність підтримки IPv6, яку Putty надає без необхідних дій користувачів.


Я використовую це вже кілька місяців. Це правильно: сидить у системному треї, вимикає будь-які спливаючі віки, які скаржаться на відключення та інше, і він тримає тунелі відкритими. Я все ще використовую PuTTY, якщо я буду робити багато роботи над підключенням, але для тунелів та швидких термінальних речей Tunnelier працює добре.
Девід Яв

2
Це може бути не зрозуміло, але ви налаштовуєте тунелі на вкладці C2S , а зворотні тунелі - на вкладці S2C . Він розшифровується як client2server та server2client відповідно.
fracz

@ Жан-Марк Ліотьє Можливо, ви можете мені допомогти. Подивіться на це: superuser.com/questions/1353398/…
Людина успіху

@SuccessMan - Вибачте, минули роки, коли я використовую будь-який продукт Microsoft більш ніж поверхово. Я зараз все Debian, де подібні проблеми вирішуються тривіально ...
Жан-Марк Ліотьє


2

Погляньте на Xshell - це більш чітко, ніж PuTTY, і він безкоштовний для домашнього користування (якщо саме там потрібно його використовувати). Він стверджує, що має функцію автоматичного підключення, але я не пробував її і вже на декількох місяцях працюю на ноутбуці на базі Linux, тому не маю жодних засобів для тестування цього процесу.


Xshell є приголомшливим, я перейшов на нього з SecureCRT 3-4 роки тому і не озирнувся назад
alexeit

2

Два чудових інструменти:

У обох є такі особливості:

  • Може бути автоматизовано під час завантаження
  • Відкрите джерело
  • Керуйте багатьма тунелями одночасно
  • Міг розташуватися в системному треї
  • Безкоштовно (у Mobaxterm є безкоштовна версія)
  • Шифруйте збережений пароль

1. Mobaxterm

Сайт: http://mobaxterm.mobatek.net/

Захоплення:

введіть тут опис зображення

2. Менеджер тунелів SSH

Сайт: https://code.google.com/archive/p/ssh-tunnel-manager/

Захоплення:

введіть тут опис зображення


2

Я спробував багато рішень, таких як менеджери тунелів SSH, але всі для мене були незручними: занадто багато екранів конфігурації, іноді помилки (один раз менеджер тунелів SSH очистив усі налаштування! Я мав відновити настройки для всіх 30 тунелів). Тож усі вони втратили мою довіру. Ось чому я придумав користувацький сценарій Powershell, легко налаштовується, змінюється, невеликий, але працює. Опубліковано тут і нижче:

Щоб розпочати його використання, вам потрібна така конфігурація:

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

Збережіть його як config.csv. І використовувати сценарій powerhell, щоб продовжувати це:

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

Після налаштування просто запустіть його так:

powershell -File autossh.ps1

1

Якщо ви любитель Putty, спробуйте Putty Loy .

У ньому є кілька додаткових функцій, включаючи спробу автоматичного підключення після відключення з'єднання та повторне підключення, коли ваш комп'ютер прокидається з режиму очікування.

Як уже згадував хтось інший, я б поєднав це з автентифікацією відкритого ключа без пропусків фрази.

Теоретично це повинно бути досить надійним, але я не експерт із безпеки, тому не можу порадити вас з цього приводу.


0

Я переглянув це і отримав декілька результатів для вашого питання, в основному ви завжди можете спробувати пошуковий комбо, з automate putty loginякого я. Ось особливо корисний результат, який повинен вам підходити:

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

Це допоможе вам налаштувати макрос для шпаклівки. Також завантажте тут менеджер з'єднань Putty (оскільки посилання перервано з початкового посилання):

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


Посилання SourceForge для PuttyCM розірвано. Дивіться це питання .
Крейг МакКуїн

@CraigMcQueen, ти розумієш, що на це відповіли 19.01.2011 !? правильно?
Якуб

1
Так, я розумію. І я вчора знайшов це в пошуку Google, і інші люди можуть зробити це протягом року чи двох.
Крейг МакКвін

0

Я також використовував Putty і мав таку ж проблему, поки не знайшов кращого рішення - Спробуйте ADVSoft Persistent SSH https://persistentssh.com працює як служба Windows і підтримує тунелі SSH у стані роботи. Безкоштовно для особистого користування, не потрібно встановлювати нічого іншого.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.