Tunnels SSH et Tunnels VPN

Tout ce que je vous ai raconté plus tôt au sujet des serveurs proxy est bien gentil, mais ça limite notre accès web au protocole HTTP(S)… Dans le cadre d’usage défini par l’administrateur qui plus est (rappelez-vous le filtrage des URL)… Autant dire que si votre but est d’accéder à des sites de fesses au boulot, c’est toujours pas gagné. Heureusement, il existe plusieurs moyens de se libérer complètement de cet enquiquineur rabat-joie d’administrateur.

Ce dossier va vous permettre de mettre en place différents types de tunnels SSH et VPN. Mais avant de plonger dans la technique, je vais tenter de répondre en quelques phrases à cette interrogation en train de naître sur certaines de vos lèvres, lecteurs.

Qu’est-ce que c’est un tunnel ?

Et bien, un tunnel est une connexion entre deux points de deux réseaux distants grâce à laquelle transite un ou plusieurs flux de données généralement chiffrés. Dans le monde des réseaux, une connexion correspond à un flux, je vois à votre mine perplexe que ce “plusieurs” vous embarrasse…

En réalité ces flux de données sont encapsulés dans un protocole capable de transporter de l’information, par exemple SSH, ainsi un flux en porte de multiples autres. Grâce à cette petite subtilité, l’utilisateur est capable de communiquer à travers ce tunnel avec les éléments du réseau situés à l’autre bout de la connexion (et potentiellement vice-versa) en utilisant n’importe quel protocole ou presque.

Pour que ça marche, les flux de données sontt encapsulés à l’entrée du tunnel puis désencapsulés à la sortie, et ça de façon complètement transparente pour l’utilisateur lorsque c’est fait avec talent. Mais tout ceci devrait vous sembler limpide d’ici quelques lignes, rassurez vous et laissez vous guider. ;)

tunnel

Prérequis : vous disposez d’un serveur Linux accessible depuis l’internet. Vous êtes en mesure d’y installer les packages que vous souhaitez, par exemple OpenSSH et CorkScrew. Votre machine cliente se trouve sur un réseau privé où l’accès web se fait à travers un proxy.

Tunnel SSH

OpensshLe tunnel SSH est en réalité très simple à mettre en œuvre. Je vous parlerai d’abord de cette technique de tunneling parce qu’elle peut dans certains cas s’apparenter à ce que je vous ai présenté dans le chapitre dédié aux proxy.

Plusieurs choses sont possibles :

Le Port Forwarding, qui va permettre de binder un de vos port local de votre machine cliente avec un port local de votre serveur hébergeant le daemon sshd auquel vous vous connectez (ou même un port distant accessible depuis ce serveur par ce serveur).

La mise en place d’un Proxy SOCKS qui permet de faire passer tous les flux réseaux à travers ce tunnel, même UDP si vous utilisez SOCK v5… Dans la mesure où l’application gère les proxy SOCKS (ce qui n’est pas gagné)…

Et le SSH VPN qui permet de tout faire passer à travers votre tunnel SSH, quel que soit le talent et l’attention avec lesquels l’application a été développée !

Installer OpenSSH

Nous partons du principe que vous avez bien lu le prérequis indiquant que le serveur est sur internet et que votre client se trouve derrière un proxy web.

Installation et configuration du serveur

Tout d’abord il convient d’installer OpenSSH. Généralement le package est présent par défaut lorsque vous installez votre distribution Linux. Si toutefois ce n’est pas le cas, vous connaissez la musique…

apt-get install openssh-server

Une fois OpenSSH installé, modifiez son fichier de configuration pour définir le port d’écoute à 443, qui correspond traditionnellement au port HTTPS et qui en plus d’être généralement ouvert sur les proxy permet d’y faire passer du flux chiffré sans que cela ne soit suspect.

vim /etc/ssh/sshd_config 
   => Trouvez la ligne Port 22 et remplacez-la par Port 443
/etc/init.d/ssh start # ou /etc/init.d/sshd start selon votre distribution

Configuration du client OpenSSH (Linux)

Vous situant derrière un proxy, vous aurez besoin du package CorkScrew. Si vous vous trouvez derrière un proxy nécessitant une authentification NT LM/NTLMv2, référez-vous au chapitre présentant CNTLM afin d’installer et configurer un proxy local que vous utiliserez à la ligne ProxyCommand de votre fichier de configuration SSH.

apt-get install corkscrew

La complexité de la situation rend plus aisée l’utilisation d’un fichier de configuration SSH plutôt que l’utilisation de nombreux arguments. C’est donc cette méthode qui est préférée tout au long de l’article. Pour configurer votre connexion suivez ces quelques étapes :

cd ~
mkdir .ssh
vim .ssh/config
Host MyProX
        HostName <ip de votre serveur ssh>
        Port 443
        User <user>
        ProxyCommand /usr/bin/corkscrew <proxy local ou d'entreprise> <port> %h %p /root/.ssh/auth 
vim .ssh/auth
user:pass

Puis essayez de vous connecter. Si vous n’y parvenez pas, référez vous au paragraphe Résolution d’incidents un peu plus bas.

ssh MyProX

Configuration du client SSH PuTTy (Windows)

Si vous êtes sur un domaine, et que votre proxy nécessite une authentification NT LM ou NTLMv2, lisez ce précédent article sur CNTLM qui vous expliquera comment gérer ce petit désagrément.

téléchargez PuTTY et configurez votre connexion SSH comme indiqué ci-après.

Sur la page Session :

Host Name (or IP address) : <ip du serveur ssh> Port : <port du serveur ssh>
Connection type : ssh

putty-connection

Allez chercher la page Connection > Proxy et configurez les champs ainsi :

Proxy type : HTTP
Proxy hostname : <IP du proxy derrière lequel vous vous trouvez>
Port : <Port du proxy>
Username : <nom d'utilisateur du proxy> # Si nécessaire
Password : <mot de passe du proxy> # Si nécessaire

putty-http-proxy

Résolution d’incidents

Si vous ne parvenez pas à vous connecter, essayez ces différents conseils un par un en essayant de vous reconnecter après chaque modification.

#1 Rendez le service accessible par le réseau

echo sshd:ALL >> /etc/hosts.allow

#2 Régénérer vos HostKeys (Pourquoi pas ?)

rm /etc/ssh/ssh_host_*
ssh-keygen -t dsa -f /etc/ssh/ssh_host_dsa_key
ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key 
/etc/init.d/ssh(d) restart

#3 Reconfigurez votre package

dpkg-reconfigure openssh-server 
/etc/init.d/ssh(d) restart

#4 Autorisez spécifiquement votre utilisateur à accéder au service

echo AllowUsers <votre utilisateur Linux> >> /etc/ssh/sshd_config 
/etc/init.d/ssh(d) restart

#5 RTFM !

man ssh
man sshd
man sshd_config

Mettre en place du port forwarding

Maintenant que vous parvenez à accéder à votre serveur à travers le proxy de votre entreprise/école/université/FastFood préféré, il vous est tout à fait possible d’installer un proxy local (d’autant plus facilement que vous avez lu les articles précédents traitant des proxy webs : CNTLM, Havij et proxy d’entreprise et Lillou Dalas, multi proxy bypass !) sur votre serveur distant qui écoute sur le port 3129 et qui autorise uniquement les connexions en provenance de localhost. Pour être encore plus certain que personne ne puisse accéder à votre proxy à part vous, le proxy nécessite d’entrer un nom d’utilisateur user et un mot de passe pass pour accéder au web.

Configuration du serveur OpenSSH

Il n’y a rien à faire, bande de veinards !

Configuration du client openSSH (Linux)

Pour configurer le port forwarding, il suffit d’ajouter une ligne à votre fichier de configuration client :

echo LocalForward 3129 127.0.0.1:3129 >> .ssh/config

Puis de vous connecter à votre serveur :

ssh MyProX

Dans un second terminal

Pour utiliser un serveur proxy, il est nécessaire de configurer quelques variables d’environnement.

export http_proxy='http://user:pass@localhost:3129'
export https_proxy='https://user:pass@localhost:3129'
wget google.fr # Ça devrait être bon normalement ;)

Configuration du client SSH PuTTy (Windows)

Rendez-vous dans Connection > SSH > Tunnels et configurez votre Port Forwarding ainsi :

Source port : 3129 
Destination : localhost:3129 
Les Puces Local et IPv4 sont cochées.

Puis cliquez sur le bouton Add.

putty-portforwarding

Pour accéder à internet, il vous suffit de configurer votre navigateur pour utiliser le serveur proxy localhost:3129

Sélectionnez Configuration manuelle du proxy.
Proxy HTTP : localhost Port : 3129 
Laissez coché: Utilisez ce serveur proxy pour tous les protocoles.

internet-proxy-conf

Lorsque vous commencez à surfer, un popup apparaît. Une fois authentifié, le proxy vous laisse accéder au web. :)

chrome-proxyauth-popup

SOCKS Proxy

Les Proxy SOCKS sont similaires au port forwarding sauf qu’il ne vous limitent pas à l’utilisation d’un seul port ! En effet, il est possible de faire passer n’importe quel flux  vers n’importe quel port à travers ce genre de proxy, même UDP avec SOCKSv5 (pratique pour éviter le DNS Leak) ! L’inconvénient majeur de cette solution est que toutes les applications ne prennent pas en charge le protocol SOCKS…

Mais finalement votre navigateur s’en sort très bien alors pour surfer c’est bien suffisant. Mais voyez plutôt :

Configuration du serveur OpenSSH

Il n’y a toujours rien à faire. Ça va, pas trop fatigué ?

Configuration du client OpenSSH (Linux)

Il vous suffit d’ajouter une ligne à votre fichier de configuration précédemment créé :

echo DynamicForward 7777 >> .ssh/config

Puis de vous connecter :

ssh MyProX

Configuration du client PuTTy (Windows)

Rendez-vous dans Connection > SSH > Tunnels et configurez votre SOCKS Proxy ainsi :

Source port : 7777 # Ou le port que vous voulez après tout...
Destination :
Les Puces Dynamic et auto cochées.

Puis cliquez sur le bouton Add.

putty-socksproxy

Commencer à surfer

Pour accéder à internet, il vous suffit de configurer votre navigateur pour utiliser le serveur proxy SOCKS que vous venez de configurer (localhost:7777). Dans les paramètres internet :

Sélectionnez Configuration manuelle du proxy.
Proxy HTTP : vide Port : vide
Décochez Utilisez ce serveur proxy pour tous les protocoles.
Proxy SSL : vide Port : vide
Proxy FTP : vide Port : vide
Hôte SOCKS : localhost Port : 7777
Sélectionnez SOCKS v5

firefox-socksproxy-conf

Le petit truc en plus

Si vous utilisez un SOCKS Proxy il peut arriver que les requêtes DNS soient émises en dehors du tunnel ce qui dans un réseau d’entreprise ne sera pas permis. En conséquence vous n’aurez pas de résolution de nom et donc pas accès facilement à internet ! ;)

Si vous êtes un ressortissant d’un pays un peu zélé en matière de contrôle de sa population, le risque majeur de ces leaks est de laisser des traces de vos différentes visites sur le web. Car il y a toute les chances du monde que vos requêtes DNS (contenant votre IP) soient enregistrées sur un serveur gouvernemental. Pensez-y !

firefox-prevent-dnsleak

 

SSH VPN

Mais le fin du fin en terme de tunnel SSH est de monter un VPN ! Et oui, c’est possible et pas compliqué du tout sous Linux !

Configuration du serveur OpenSSH (Linux)

Je suis fairplay, je vous préviens, vous risquez de vous froisser un muscle en réalisant cette minutieuse et terriblement longue configuration..

Editez le fichier /etc/ssh/sshd_config pour que la ligne suivante soit présente (sans # devant hein) :

vim /etc/ssh/sshd_config
...
PermitTunnel yes
/etc/init.d/ssh restart

Seconde étape, il faut autoriser notre serveur à faire du routage. Pour cela, il faut modifier la valeur contenue dans un fichier bien spécifique qui est 0 lorsque le routage est interdit :

echo 1 > /proc/sys/net/ipv4/ip_forward

Votre serveur est à présent configuré correctement, félicitations !

Configuration du client OpenSSH (Linux)

On va tout d’abord forcer la route en direction du serveur SSH, car on va jouer avec la table de routage un peu plus tard et ce serait vraiment dommage de nous couper la connexion.

Ensuite, connectez vous à votre serveur en ajoutant le paramètre -w3:3 afin d’établir un tunnel entre deux interfaces virtuelles tunnel3 et tunnel3 qui seront créées respectivement sur le client et sur le serveur (les deux interfaces peuvent porter le même nom car chacune sera créée sur un machine différente).

route add -host <ip de votre serveur SSH> gw <ip de votre routeur> 
ssh -w3:3 root@server # On se connecte en SSH

Une fois connecté en SSH sur votre serveur :

Il vous faut maintenant monter un tunnel point-à-point entre le client et le serveur. Dans l’exemple ci-dessous, j’ai choisi deux adresse situées dans le réseau privé 10.0.0.0/xx. Si cette plage est accessible d’un côté ou de l’autre, il est préférable d’en prendre une autre. ;)

ifconfig tun3 10.0.0.1 pointopoint 10.0.0.2

Dans un second terminal (sur le client donc) :

route # Prenez note de vos règles de routage, gardez en mémoire l'adresse <IP de votre default gw actuelle>.
ifconfig tun3 10.0.0.2 pointopoint 10.0.0.1
route add -host <ip de votre serveur ssh> gw <IP de votre default gw actuelle>
route del default gw <ip de votre default gw actuelle> # Attention, si vous êtes connecté en SSH vous vous tirez sans doute une balle dans le pied. ;)
route add default gw 10.0.0.1
nmap website-to-scan.com # Tout devrait être OK ! ;)

Yoplaboom, vous voilà l’heureux propriétaire d’un tunnel VPN basé sur la technologie SSH ! :-)

Configuration du client SSH (Windows)

Je risque de vous décevoir mais j’en ai pas la moindre idée. Si vous avez quelques infos sur le sujet, je suis évidemment preneur. Je me ferais d’ailleurs une joie de compléter cette article avec cet apport, et je n’oublierais certainement pas de louer vos mérites dans la foulée !

Tunnel VPN

Si vous avez pour ambition d’utiliser régulièrement un tunnel VPN, deux choix s’offrent à vous. Passer par un fournisseur d’accès VPN gratuit ou payant. Ou fabriquer de toute pièce votre VPN. Si les deux solutions vous permettent d’accéder à internet lorsque vous êtes derrière un proxy ou un firewall, l’une et l’autre auront des avantages et des inconvénients…

Les fournisseurs d’accès VPN sont une solution adéquate aux personnes ne souhaitant pas s’investir techniquement. C’est aussi un excellent choix pour passer outre la Web-Censure lorsque vous ne possédez pas de serveur hébergé à l’étranger.

Monter son propre tunnel avec OpenVPN peut-être extrêmement gratifiant pour ceux qui s’initient à l’informatique et plus particulièrement à l’InfoSec car ses applications sont nombreuses et les bénéfices sont immédiats. L’avantage majeur de cette solution est que le nœud de sortie n’est pas mutualisé, vous êtes donc seul à profiter de la bande passante !

Souscrire un abonnement auprès d’un fournisseur d’accès VPN

PIAlogo

La première solution et certainement la plus simple est de vous offrir un compte chez un fournisseur VPN. De 5$ à 15$ par mois, vous pouvez trouver tout un tas d’offres différentes qui sauront sans doute combler vos attentes. Je vous ai sélectionné deux VPN, Private Internet Access car je l’utilise et j’en suis plutôt satisfait, et nVpn car on me l’a conseillé sur Twitter et je crois les gens sur parole. Les deux ont la particularité de pratiquer le No-Log, c’est à dire qu’ils s’engagent à ne jamais enregistrer vos informations (votre adresse IP). La plupart des fournisseurs d’accès VPN ne pratiquent pas cette politique et sont donc enclin à fournir vos informations lorsqu’une autorité quelconque le demande.

Configurer votre propre OpenVPN

Prérequis : vous disposez d’un serveur Linux accessible depuis l’internet. Vous êtes en mesure d’y installer les packages que vous souhaitez, par exemple OpenVPN. Votre machine cliente se trouve sur un réseau privé où l’accès web se fait à travers un proxy.

Documentation

Parce qu’on va pas réinventer la roue, je vous invite à aller lire ces trois documents et/ou à chercher des tutoriels adaptés sur la toile. rappelez vous juste que votre proxy ne laisse pas passer les flux vers n’importe quel port. Choisir le port 443 qui porte traditionnellement le trafic HTTPS est sans doute la meilleure solution car en plus de supporter la méthode HTTP Connect il ne semblera pas étrange d’y voir passer des flux chiffrés.

Tunnel VPN over SSH

Notez qu’il est tout à fait possible de faire passer un tunnel dans un tunnel dans un tunnel etc… Rappelez vous le chapitre précédent concernant le SSH Tunneling. Imaginons maintenant qu’au lieu de réaliser un Local Port Forwarding sur un serveur proxy local vous choisissiez de réaliser un Local Port Forwarding vers un serveur VPN distant.

Host MyProX
 HostName 10.10.10.10
 Port 443
 User root
 ProxyCommand /usr/bin/corkscrew 192.168.1.250 3128 %h %p /root/.ssh/auth
 LocalForward 8888 <ip de votre serveur VPN>:<port de votre serveur vpn>

Et bien vous êtes en mesure de monter un tunnel VPN au travers un tunnel SSH ! ;-)