Windows에서 자동 SSH 터널링


32

Linux 컴퓨터에 항상 두 개의 SSH 터널을 갖도록 Windows 컴퓨터를 설정하려고합니다.

현재 PuTTY를 사용하여 두 개의 SSH 터널을 열었습니다. PuTTY에서 서버에 로그인 한 후 최소화 된 상태로 두지 마십시오. SSH 연결이 끊어진 경우를 제외하고는 잘 작동합니다. PuTTY가 오류 메시지를 표시하면 오류를 수동으로 닫고 서버에 다시 연결해야합니다.

내가하고 싶은 것은 두 개의 SSH 터널을 설정할 수 있고 암호 입력을 포함하여 수동으로 아무것도 할 필요없이 자동으로 다시 연결할 수있는 응용 프로그램입니다. 두 개의 터널을 통해 전송하는 데이터는 VNC 연결이므로 오류를 지우고 암호를 입력하기 위해 종종 컴퓨터에 있지 않습니다. 두 개의 터널은 하나의 로컬 터널과 하나의 원격 터널입니다.

(예, SSH에 자동으로 로그인하는 위험을 알고 있습니다. 권한이없는 전용 사용자를 만들고 대화 형으로 로그인하여 사용할 수 없도록 계획하고 있습니다.)

이 질문을 찾았습니다 : SSH 터널을 안정적으로 열어 두는 방법? 하지만 SSH 클라이언트로 Linux를 사용하고 있으며 Windows를 사용하고 있습니다.


2
올바르게 로그인하면 자동 로그인은 위험하지 않습니다. SSH 공개 키 인증을 찾으십시오 .
grawity

수동 로그인을 위해이 작업을 수행하고 있지만 PuTTY는 키에 빈 암호를 허용하지 않는다고 생각합니다.
David Yaw

물론 그렇습니다.
grawity

PuTTY 문서 중 일부를 잘못 이해했을 것입니다. 아마도 "우리는 PuTTY를 자동으로 암호를 자동으로 만들지 않을 것"이라고 읽었으며 키에도 암호가 필요하다고 가정했습니다.
David Yaw

답변:


14

Bitvise Tunnelier를 사용해보십시오 -그것은 나를 위해 작동합니다. 트레이 아이콘으로 만 보이는 동안 SSH 터널을 설정하도록 설정했습니다. 시작시 SSH 연결을 설정하고 절단 후 또는 시스템이 휴면 상태가 된 후 연결이 복원 되 자마자 다시 연결합니다. 나는 여전히 퍼티 콘솔의 외관을 선호하므로 계속 사용하지만 터널을 유지하기 위해 이제 터널을 사용합니다. 내가 찾은 유일한 단점은 Putty가 사용자 조치를 요구하지 않는 IPv6 지원이 없다는 것입니다.


나는 이것을 몇 달 동안 사용 해왔다. 바로 그렇습니다. 시스템 트레이에 앉아 연결 끊기 등에 대해 불평하는 팝업을 끄고 터널을 열어 둡니다. 연결을 통해 많은 작업을 수행하려는 경우 여전히 PuTTY를 사용하지만 터널 및 빠른 터미널 작업의 경우 Tunnelier가 잘 작동합니다.
David Yaw

2
명확하지는 않지만 C2S 탭 에서 터널을 설정하고 S2C 탭 에서 터널을 역방향으로 설정합니다 . 그것은 의미 client2serverserver2client 각각.
fracz

@ Jean-Marc Liotier 어쩌면 당신이 나를 도울 수 있습니다. 이것을보십시오 : superuser.com/questions/1353398/…
성공 남자

@SuccessMan-죄송합니다. Microsoft 제품을 표면적으로 사용한 지 몇 년이 지났습니다. 이제 문제는 이런 종류가 하찮게 해결 모든 데비안, ... 야
장 - 마크 Liotier


2

Xshell을 살펴보십시오 -PuTTY 보다 스크립팅이 가능하며 가정용으로 무료입니다 (사용해야하는 경우). 그것은 자동 재 연결 기능을 가지고 있다고 주장하지만 그것을 시도하지 않았으며 지금은 몇 개월 동안 Linux 기반 랩톱에 있었기 때문에 mo에서 테스트 할 수단이 없습니다.


Xshell은 굉장합니다. 3-4 년 전에 SecureCRT에서 전환했으며 뒤돌아 보지 않았습니다.
alexeit


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 링크가 끊어졌습니다. 이 질문을 참조하십시오 .
Craig McQueen

@CraigMcQueen, 이것이 2011 년 1 월 19 일에 답변되었다는 것을 알고 있습니까? 권리?
Jakub

1
예, 알고 있습니다. 어제 Google 검색에서 찾았으며 다른 사람들은 1 년 또는 2 년 동안 그렇게 할 수 있습니다.
Craig McQueen

0

ADVSoft Persistent SSH 시도 https://persistentssh.com 은 Windows 서비스로 작동하고 SSH 터널을 실행 상태로 유지합니다. 개인적인 용도로는 무료이며 다른 것을 설치할 필요가 없습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.