Монитор обратного SSH-туннеля

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

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

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

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

этот вопрос практически аналогичен: stackoverflow.com/questions/312471/…

Colin Pickard 16.12.2008 23:24
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
12
1
6 621
6

Ответы 6

Рассматривали ли вы использование plink и превращение его в службу с помощью srvany?

Я согласен Игал. Хорошее, короткое и конкретное руководство можно найти на xxlinxx.wordpress.com/2009/03/23/…

kanngard 10.09.2009 02:16

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

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

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

Используйте 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

Я часто использую 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.

Постоянный туннель - это нарушение безопасности. Я установил открытую службу, защищенную и открытую, пока вы находитесь в сети. У него также есть встроенные таймауты, без активности 2 минуты, в противном случае 10. Переходит по https и сверху имеет шифрование XTEA. Доступно на mylinuz.com

screen shot

Другие вопросы по теме