43 votes

Tunnel SSH automatique sous Windows

Je suis en train de configurer un ordinateur Windows afin d'avoir toujours deux tunnels SSH vers mon serveur Linux.

Actuellement, j'utilise PuTTY pour ouvrir les deux tunnels SSH : je me connecte au serveur dans PuTTY, le laisse réduit, et n'y touche plus. Cela fonctionne bien, sauf lorsque la connexion SSH est interrompue : PuTTY affiche un message d'erreur, et je dois manuellement fermer l'erreur et me reconnecter au serveur.

Ce que j'aimerais faire, c'est avoir une application capable de mettre en place les deux tunnels SSH, et de se reconnecter automatiquement, sans avoir besoin de faire quoi que ce soit manuellement, y compris entrer un mot de passe. Les données que j'envoie à travers les deux tunnels sont des connexions VNC, donc je ne serai souvent pas devant la machine pour effacer les erreurs et entrer des mots de passe. Les deux tunnels sont un tunnel local et un tunnel distant.

(Oui, je suis conscient des dangers de se connecter automatiquement en SSH. Je prévois de créer un utilisateur dédié sans privilèges et non autorisé à se connecter de manière interactive, et d'utiliser celui-ci.)

J'ai trouvé cette question : Comment maintenir de manière fiable un tunnel SSH ouvert?, mais cela utilise Linux comme client SSH, et j'utilise Windows.

20voto

Korbin Points 752

Essayez Bitvise Tunnelier - ça fonctionne pour moi. Je l'ai configuré pour établir des tunnels SSH tout en étant visible uniquement en tant qu'icône de la barre des tâches. Il établit la connexion SSH au démarrage et la rétablit dès que la connectivité est restaurée après une coupure ou lorsque le système passe en veille. Je préfère toujours l'apparence de la console Putty, donc je continue de l'utiliser - mais pour maintenir les tunnels en place, j'utilise désormais Tunnelier. Le seul inconvénient majeur que j'ai trouvé est le manque de prise en charge de l'IPv6, que Putty fournit sans nécessiter d'action de l'utilisateur.

13voto

Ebrahim Byagowi Points 376

Essayez MyEnTunnel. Il peut se reconnecter en cas d'échec de la connexion.

afficher la description de l'image ici

5voto

reox Points 1444

Deux outils formidables :

Les deux ont ces caractéristiques :

  • Peut être automatisé au démarrage
  • Open source
  • Gérer de nombreux tunnels en même temps
  • Peut résider dans la barre des tâches du système
  • Gratuit (Mobaxterm a une version gratuite)
  • Chiffrer les mots de passe stockés

1. Mobaxterm

Site : http://mobaxterm.mobatek.net/

Capture :

entrer la description de l'image ici

2. Gestionnaire de tunnels SSH

Site : https://code.google.com/archive/p/ssh-tunnel-manager/

Capture :

entrer la description de l'image ici

5voto

Tony Points 151

J'ai essayé de nombreuses solutions comme les gestionnaires de tunnel SSH, mais tous étaient inconvinient pour moi: trop de fenêtres de configuration, parfois buggés (une fois le gestionnaire de tunnel SSH a purgé tous les réglages que j'avais! Donc j'ai dû restaurer les réglages pour les 30 tunnels). Donc ils ont tous perdu ma confiance. C'est pourquoi j'ai créé un script personnalisé Powershell, facile à configurer, modifiable, petit, mais fonctionne. Publié ici et ci-dessous :

Pour commencer à l'utiliser, vous avez besoin d'une configuration comme ceci :

# LocalPort TargetHost  TargetPort  SshHost SshUsername SshKeyPath 
18080   google.com  80  bastion.example.com User    D:\secure\path\to\private_key.ppk

Enregistrez-le en tant que config.csv. Et utilisez un script Powershell pour le maintenir en marche :

<#
.SYNOPSIS
  Script Powershell pour maintenir un tunnel ssh actif et fonctionnel

.DESCRIPTION
  Ce script utilise la configuration des tunnels située dans config.csv. Pour plus d'informations, visitez http://tsherlock.tech/2019/03/13/simple-ssh-tunnel-auto-reconnect-using-putty-and-powershell/

.NOTES
  Version :       1.0
  Auteur :        Anton Shkuratov
  Date de création :   2019-03-13
  Objectif/Changement : Développement du script initial

#>

$currentDir = $PSScriptRoot
if (-not $env:PATH.Contains($currentDir)) {
  $env:PATH="$env:PATH;$currentDir"
}

# Vérifier que plink est accessible
try {
  Start-Process plink.exe -WindowStyle Hidden
} catch {
  Write-Host Erreur en exécutant plink.exe. Assurez-vous que son chemin est bien dans la variable d'environnement PATH
  EXIT 1
}

# Analyse de la configuration
$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 "Veuillez entrer le mot de passe pour la clé (si définie) : $sshKey" -AsSecureString
      $keyPasswords.Add($sshKey, $pass);
    }
  }
}

# Démarrer les processus
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 "Mauvaise phrase passe pour $sshKey, veuillez réessayer"
      $pass = Read-Host "Veuillez entrer le mot de passe pour : $sshKey" -AsSecureString
      $keyPasswords[$sshKey] = $pass;
    } else {
      $exitCode = $proc.ExitCode
      $tHost = $binding.sshHost

      Write-Host "Connexion à $tHost est perdue, code de sortie : $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 Connecté à $sshUser@$sshHost
    }

    $procs[$binding] = $proc;
  }
}

function EnsureAllRunning($procs, $keyPasswords, $bindings) {
  while($true) {
    foreach($binding in $bindings) {
      EnsureRunning $procs $keyPasswords $binding
    }
    Start-Sleep 1
  }
}

try {
  # En attente de la commande de sortie
  Write-Host En cours d'exécution... Appuyez sur Ctrl+C pour arrêter l'exécution...
  EnsureAllRunning $procs $keyPasswords $bindings
} finally {
  # Nettoyage
  Write-Host Nettoyage

  foreach($proc in $procs.Values) {
    if ($proc -ne $null -and -not $proc.HasExited) {
      $proc.Kill();
    }
  }
}

Une fois configuré, exécutez-le simplement comme suit :

powershell -File autossh.ps1

2voto

Linker3000 Points 26898

Jetez un œil à Xshell - il est plus scriptable que PuTTY et est gratuit pour un usage domestique (si c'est là où vous avez besoin de l'utiliser). Il prétend avoir une fonction de reconnexion automatique mais je ne l'ai pas essayée et j'utilise un ordinateur portable basé sur Linux depuis quelques mois maintenant donc je n'ai aucun moyen de le tester pour le moment.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X