Обратный туннельный монитор SSH - PullRequest
12 голосов
/ 16 декабря 2008

Я настроил обратный ssh-туннель, используя PuTTY, чтобы позволить мне подключиться к VNC на домашнем компьютере без необходимости переадресации порта NAT. Работает отлично, без проблем.

Я бы хотел настроить туннель как «постоянный сервис», который будет подключаться при загрузке и переподключаться при удалении. PS. это на Windows.

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

Кто-нибудь имеет опыт работы с подобными вещами или с любым из этих продуктов? Мне не нужны все навороты, только надежность.

Ответы [ 5 ]

2 голосов
/ 16 декабря 2008

Сравнение ssh клиентов в Википедии имеет столбцы для туннелирования, SOCKS и т. Д. Может помочь вам найти что-то подходящее

1 голос
/ 23 октября 2012

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

Как это:

  :: This is a batch file. Save with file name: plink_forever.bat
  :restart
  plink saved_session_name
  goto restart

И, наконец, заверните это в srvany, чтобы запустить его при входе в систему.

Или, может быть, проще: поместите .bat в планировщик Windows и установите его запускаться один раз при каждой загрузке.

Документы: http://the.earth.li/~sgtatham/putty/0.58/htmldoc/Chapter7.html

1 голос
/ 16 декабря 2008

Рассматривали ли вы использовать plink и сделать его сервисом с srvany ?

0 голосов
/ 19 марта 2019

Я часто использую ssh-туннели, но мне не все менеджеры были удобны (слишком много экранов пользовательского интерфейса, не очень стабильно). Я хотел, чтобы у меня был сценарий, который можно было бы легко настроить и обслуживать, поэтому я разработал сценарий PowerShell для этого. Размещено здесь . Правила SO диктуют мне также публиковать решение в ответе, так что рад это сделать:

Для того, чтобы начать его использовать, вам понадобится такой конфиг:

# 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

Чтобы запустить его автоматически при загрузке Windows, используйте планировщик Windows.

0 голосов
/ 04 мая 2009

Вы можете просто настроить любое приложение для запуска с Windows и автоматически подключить ваш туннель при запуске. Я лично использую Easytunnel ... только что установил флажок для подключения всех туннелей при запуске и настройки окон для запуска Easytunnel при загрузке. Это прекрасно работает, хотя вам нужно установить таймаут неактивности вашего сервера, или вы будете отключаться каждые 10 минут или около того.

Надеюсь, у вас все получится!

...