sshuttle : Utiliser SSH comme un VPN transparent

	Comment utiliser une connexion SSH comme un VPN ?

« sshuttle » permet d’utiliser une connexion SSH non root (simple utilisateur), comme un VPN transparent sous Linux, BSD et MacOS. Les seuls prérequis sont :

  • un accès root à la machine cliente (machine à connecter au VPN),
  • iptables sur la machine cliente (ou ipfw sur BSD ou MacOS),
  • python doit être installé sur le serveur SSH

Installation d’sshuttle

L’outil est packagé sur quelques distributions, mais partir des sources permettra de bénéficier de la dernière version d’sshuttle disponible.

Téléchargez les sources via « git » :

fhh@aaricia ~ $ mkdir bin
fhh@aaricia ~/bin $ git clone git://github.com/apenwarr/sshuttle
Cloning into 'sshuttle'...
remote: Counting objects: 945, done.
remote: Compressing objects: 100% (474/474), done.
remote: Total 945 (delta 479), reused 868 (delta 424)
Receiving objects: 100% (945/945), 592.22 KiB | 27.00 KiB/s, done.
Resolving deltas: 100% (479/479), done.
Checking connectivity... done.
fhh@aaricia ~/bin $ cd sshuttle
fhh@aaricia ~/bin/sshuttle $ ./sshuttle 
error: at least one subnet (or -N) expected
usage: sshuttle [-l [ip:]port] [-r [username@]sshserver[:port]] <subnets...>
   or: sshuttle --server
...

Utilisation d’sshuttle

Dans les exemples qui vont suivre, sshuttle sera utilisé en root ou via « sudo ». Tous les alias définis dans « .ssh/config » peuvent être utilisés avec sshuttle. L’option « -v » incrémente le niveau de verbosité d’sshuttle.

Rediriger tous le trafic

Ce premier exemple redirige (presque) tout le trafic TCP par la connexion SSH :

fhh@aaricia ~/bin/sshuttle $ wget -qO- http://utils.admin-linux.fr/ip.php ; echo ""
XXX.YYY.ZZZ.TTT
fhh@aaricia ~/bin/sshuttle $ su -c "./sshuttle -r fhh@srv-ssh.admin-linux.fr 0/0"
Password: 
fhh@srv-ssh.admin-linux.fr's password:
Connected.
client: warning: closed channel 1 got cmd=STOP_SENDING len=0

et dans un autre terminal :

fhh@aaricia ~ $ wget -qO- http://utils.admin-linux.fr/ip.php ; echo ""
AAA.BBB.CCC.DDD

« -r » Précise le serveur ssh à utiliser et 0/0 désigne le réseau pour lequel utiliser le « vpn ». Ici 0/0 désigne tous les réseaux.

Dans cet exemple, les requêtes DNS ne passent pas par la connexion SSH. Pour y remédier utiliser l’option « –dns » d’sshuttle :

fhh@aaricia ~/bin/sshuttle $ su -c "./sshuttle --dns -r fhh@srv-ssh.admin-linux.fr 0/0"
...

Exclure des réseaux / IPs du VPN

L’option « -x » permet d’exclure des réseaux ou des IPs de la redirection VPN.

fhh@aaricia ~/bin/sshuttle $ su -c "./sshuttle -r fhh@srv-ssh.admin-linux.fr -x XXX.YYY.ZZZ.0/24 -x AAA.BBB.CCC.DDD 0/0"
...

Toutes les requêtes passent par la connexion ssh à l’exception de celles destinées aux machines XXX.YYY.ZZZ.1 à XXX.YYY.ZZZ.254 ou à la machine AAA.BBB.CCC.DDD.

Utiliser le VPN uniquement pour un réseau / une IP

En restreignant le réseau « 0/0 », vous pourrez utiliser le VPN uniquement pour accéder à un réseau ou à une IP donnée :

fhh@aaricia ~/bin/sshuttle $ su -c "./sshuttle -r fhh@srv-ssh.admin-linux.fr XXX.YYY.ZZZ.0/24 AAA.BBB.CCC.DDD"
...

Dans cet exemple, la connexion ssh sera utilisée pour accéder aux machines XXX.YYY.ZZZ.1 à XXX.YYY.ZZZ.254 ainsi qu’à l’adresse AAA.BBB.CCC.DDD.

Détection automatique des réseaux et des routes

Plutôt que de définir les réseaux pour lesquels utiliser le VPN, vous pouvez choisir de laisser sshuttle le faire pour vous via l’option « -N » :

fhh@aaricia ~/bin/sshuttle $ su -c "./sshuttle -NHr fhh@srv-ssh.admin-linux.fr"
...

L’option « -H » ajoutera à votre « /etc/hosts » les associations IP / nom de machine déjà résolues afin de limiter les requêtes DNS.

Références

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *