Un VPN qui ne nécessite qu’un serveur SSH ? C’est Sshuttle (TCP seulement)

On ne présente plus Sshuttle, l’ami Korben ayant même réalisé un joli tuto commenté.

Bien pratique, mais un poil long lorsqu’on affine sa configuration : fowarding supplémentaire des DNS, exclusion d’un réseau local, démonisation du processus pour pouvoir le tuer quand bon nous semble, et je me suis arrêté là. Sshuttle souffre chez moi d’échec au premier lancement, je vous propose un workaround bonus.

Mon alias Bash (devrait marcher avec ZSH) pour ouvrir un tunnel :

alias 'stunnel'='while [ ! -f /tmp/sshuttle.pid ]; do sudo sshuttle -r login@server.tld -e '"'"'ssh -p 110 -i /home/vincent/.ssh/id_rsa'"'"' 0.0.0.0/0 -v -x 10.19.0.0/16 --dns --daemon --pidfile=/tmp/sshuttle.pid && sleep 2; done && echo -n "Public IP: " && sleep 1 && curl icanhazip.com'

Explications :

  • stunnel est le nom de l’alias qui lance le bousin
  • Tant que le fichier /tmp/sshuttle.pid n’existe pas, la commande bouclera
  • Démarrage de Sshuttle similaire à SSH en précisant ma clé privée
  • Exclusion de mon réseau local 10.19.0.0/16 (pour conserver les accès à un Samba)
  • --dns capture les requêtes DNS et les forwarde au DNS distant
  • --daemon et --pidfile permettent de récupérer le processus en stockant son id dans un fichier créé à la volée
  • sleep 2 met en pause le programme 2 secondes le temps que tout se mette en place
  • Retour au test de la condition de la boucle : si le fichier existe, sortie de la boucle et affichage de l’IP publique en console
  • Sinon c’est reparti pour un tour. Il arrive que Sshuttle plante en chemin la première fois, ne me demandez pas pourquoi

Du coup, mon second alias permet de stopper net le fowarding :

alias 'ktunnel'='[[ -f /tmp/sshuttle.pid ]] && sudo kill `cat /tmp/sshuttle.pid`'

Explications :

  • Si le fichier /tmp/sshuttle.pid existe, on affiche l’id du processus qu’il contient et on le tue
  • Toutes les connexions TCP repassent par votre porte locale

Tout ceci est à ajouter dans votre ~/.bashrc et le logiciel est dans les dépôts !

2 commentaires sur “Un VPN qui ne nécessite qu’un serveur SSH ? C’est Sshuttle (TCP seulement)

  1. Ouups et j’ai ajouté || echo "No instance to kill." au second alias donnant:
    alias k_tunnel='[[ -f /tmp/sshuttle.pid ]] && sudo kill `cat /tmp/sshuttle.pid` || echo "No instance to kill."'
    Attention aussi au choix de l’alias une commande stunnel est reconnue hypothétiquement existante avec le paquet stunnel4!
    re-Ciao

L'espace de discussion de cet article est désormais fermé.