Автоматическое SSH-туннелирование из Windows


32

Я пытаюсь настроить компьютер Windows, чтобы всегда иметь два SSH-туннеля к моему Linux-серверу.

В настоящее время я использую PuTTY, чтобы открыть два туннеля SSH: я вхожу на сервер в PuTTY, оставляю его свернутым и никогда не трогаю его. Это работает хорошо, за исключением случаев, когда соединение SSH прекращается: PuTTY отображает сообщение об ошибке, и мне нужно вручную закрыть ошибку и повторно подключиться к серверу.

Я хотел бы иметь приложение, которое может настроить два SSH-туннеля и может автоматически переподключаться без необходимости что-либо делать вручную, включая ввод пароля. Данные, которые я посылаю через два туннеля, - это соединения VNC, поэтому я часто не буду за машиной, чтобы очистить ошибки и ввести пароли. Два туннеля - это один локальный туннель и один удаленный туннель.

(Да, я знаю об опасностях автоматического входа в SSH. Я планирую сделать выделенного пользователя без каких-либо привилегий и не иметь возможности интерактивного входа в систему и использовать его.)

Я нашел этот вопрос: как надежно держать туннель SSH открытым? , но это использует Linux в качестве клиента SSH, а я использую Windows.


2
Автоматический вход не представляет опасности, если все сделано правильно. Посмотрите SSH аутентификацию с открытым ключом .
grawity

Сейчас я делаю это для ручного входа, но я считаю, что PuTTY не позволяет ключу иметь пустой пароль.
Дэвид Йо

Конечно, это так.
Гравитация

Должно быть, я неправильно понял часть документации PuTTY. Я, вероятно, прочитал: «Мы никогда не сделаем так, чтобы PuTTY автоматически вводил ваш пароль для вас», и предположил, что для ключа также требовались пароли.
Дэвид Йо

Ответы:


14

Попробуйте Bitvise Tunnelier - у меня это работает. Я установил его для установки SSH-туннелей, пока он виден только в виде иконки в трее. Он устанавливает соединение SSH при запуске и восстанавливает его, как только соединение восстанавливается после отключения или после того, как система перешла в спящий режим. Я все еще предпочитаю внешний вид консоли Putty, поэтому я продолжаю использовать ее, но для поддержания туннелей я сейчас использую Tunnelier. Единственный существенный недостаток, который я обнаружил, - это отсутствие поддержки IPv6, которую Putty обеспечивает без каких-либо действий пользователя.


Я использую это в течение нескольких месяцев. Это просто правильно: сидит в системном трее, отключает все всплывающие окна, жалуются на разъединения и тому подобное, и держит туннели открытыми. Я все еще использую PuTTY, если собираюсь много работать над соединением, но для туннелей и быстрого терминального вещания Tunnelier работает хорошо.
Дэвид Йо

2
Это может быть непонятно, но вы настроили туннели на вкладке C2S и обратные туннели на вкладке S2C . Это означает client2server и server2client , соответственно.
Fracz

@ Жан-Марк Лиотье Может, ты поможешь мне. Посмотрите на это: superuser.com/questions/1353398/…
Успех Man

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


2

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


Xshell потрясающий, я перешел на него с SecureCRT 3-4 года назад и не оглядывался назад
alexeit

2

Два замечательных инструмента:

Оба имеют эти особенности:

  • Может быть автоматизирован при загрузке
  • Открытый источник
  • Управляйте многими туннелями одновременно
  • Может находиться в системном трее
  • Бесплатно (у Mobaxterm есть бесплатная версия)
  • Зашифровать сохраненный пароль

1. Mobaxterm

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

Захватить :

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

2. SSH Tunnel Manager

Сайт: 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. И используйте сценарий 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();
    }
  }
}

После того, как он настроен, просто запустите его так:

powershell -File autossh.ps1

1

Если вы поклонник Putty, попробуйте Putty Tray .

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

Как уже упоминалось кем-то другим, я бы сочетал это с аутентификацией с открытым ключом без парольной фразы.

В теории это должно быть довольно надежно, но я не эксперт по безопасности, поэтому не могу посоветовать вам в этом вопросе.


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.