Windowsからの自動SSHトンネリング


32

LinuxサーバーへのSSHトンネルが常に2つあるようにWindowsコンピューターをセットアップしようとしています。

現在、PuTTYを使用して2つのSSHトンネルを開いています。PuTTYでサーバーにログインし、最小化したままにして、触れないでください。SSH接続が切断された場合を除き、これはうまく機能します。PuTTYにエラーメッセージが表示されます。エラーを手動で閉じてサーバーに再接続する必要があります。

私がやりたいのは、2つのSSHトンネルをセットアップし、パスワードの入力など、手動で何もすることなく自動的に再接続できるアプリケーションです。2つのトンネルを介して送信するデータはVNC接続であるため、エラーをクリアしてパスワードを入力するためにマシンに立ち会わないことがよくあります。2つのトンネルは、1つのローカルトンネルと1つのリモートトンネルです。

(はい、SSHに自動的にログインすることの危険性を認識しています。特権を持たず、インタラクティブにログインすることを許可されていない専用ユーザーを作成して使用することを計画しています。)

私はこの質問を見つけました:SSHトンネルを確実に開いたままにする方法は?、しかしそれはSSHクライアントとしてLinuxを使用しており、私はWindowsを使用しています。


2
自動ログインは、正しく行われれば危険ではありません。SSH 公開キー認証を検索します。
-grawity

現在、手動ログインでこれを行っていますが、PuTTYではキーのパスワードを空にすることはできません。
デビッドヨー

もちろんそうです。
悲しみ

PuTTYドキュメントの一部を誤解していたに違いありません。「PuTTYが自動的にパスワードを自動入力することは決してありません」と読み、キーにもパスワードが必要であると想定しました。
デビッドヨー

回答:


14

Bitvise Tunnelierを試してください-それは私のために動作します。トレイアイコンとしてのみ表示されている間にSSHトンネルを確立するように設定しました。起動時にSSH接続を確立し、切断後またはシステムがスリープ状態になった後に接続が復元されるとすぐに再接続します。私はまだPuttyコンソールの外観を好むので、使い続けています。しかし、トンネルを維持するために、現在Tunnelierを使用しています。私が見つけた唯一の大きな欠点は、IPv6サポートがないことです。これは、Puttyがユーザーのアクションを必要とせずに提供します。


私はこれを数か月間使用しています。それはちょうどいいです:システムトレイに座って、切断などを訴えるポップアップをオフにし、トンネルを開いたままにします。接続を介して多くの作業を行う場合、私はまだPuTTYを使用しますが、トンネルおよび高速端末の場合、Tunnelierは正常に機能します。
デビッドヨー

2
明確ではないかもしれませんが、C2Sタブでトンネルを設定し、S2Cタブで逆トンネルを設定します。これは、の略client2serverserver2clientそれぞれ。
fracz

@ Jean-Marc Liotierたぶんあなたは私を助けることができます。:これを見てsuperuser.com/questions/1353398/...
成功の男

@SuccessMan-申し訳ありませんが、Microsoft製品を表面的に使用してから何年も経ちます。私は今、この種の問題が解決され自明すべてのDebian、...だ
ジャン=マルク・Liotier


2

見ていXshellを -それは、PuTTYのより多くのスクリプト可能だと家庭での使用のために自由である(あなたがそれを使用する必要があるというのであれば)。自動再接続機能があると主張しているが、私は試していないし、Linuxベースのラップトップで数か月間使用しているので、MOでテストする手段がない。


Xshellは素晴らしいです。3〜4年前にSecureCRTから切り替えましたが、振り返ることはありません
12

2

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として保存します。そして、それを維持するために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

パテのあなたのファンならば、試してみるパテトレイ

接続障害後に自動再接続を試行したり、コンピューターがスタンバイから復帰したときに再接続したりするなど、いくつかの追加機能があります。

すでに他の誰かが言及したように、これをパスフレーズなしの公開鍵認証と組み合わせます。

理論的にはこれはかなり信頼できるはずですが、私はセキュリティの専門家ではないので、その点についてアドバイスすることはできません。


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/


PuttyCMのSourceForgeリンクが壊れています。この質問をご覧ください。
クレイグマックイーン

@CraigMcQueen、あなたはこれが2011年1月19日に回答されたことに気付いていますか?右?
ヤクブ

1
はい、実現します。そして、昨日Googleの検索でそれを見つけました。そして、他の人が来て1、2年はそうするかもしれません。
クレイグマックイーン

0

私もPuttyを使用し、より良い解決策を見つけるまで同じ問題を抱えていました。ADVSoftPersistent SSH https://persistentssh.comを試してみてください 。Windowsサービスとして動作し、SSHトンネルを実行状態に保ちます。個人使用は無料で、他のものをインストールする必要はありません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.