Home > Linux, Network, Unix > VPN avec SSH

VPN avec SSH

Ce que j’adore avec l’informatique c’est que quand on croit connaître un sujet, on se rend toujours compte qu’il reste encore une montagne de choses à apprendre. :-)

J’avais fait un article sur le port forwarding avec ssh pour faire des tunnels mais depuis j’ai trouvé beaucoup mieux !

SSH permet de faire un VPN grâce aux interfaces virtuelles TUN/TAP. Ici je vais expliquer la méthode que j’utilise avec une interface TUN.

Les prérequis sont d’avoir un client sous *nix (j’ai pas testé avec windows), un serveur ssh avec accès root et sur Mac il faut installer les drivers tun/tap. Il faut également ajouter “PermitTunnel yes” dans votre sshd_config.

Première étape, établir la connexion ssh avec le serveur.

sudo ssh -w 0:0 root@server.com

Des droits root sont nécéssaire du coté client et serveur pour créer les interfaces tun. L’option -w spécifie qu’on crée les interfaces et 0:0 spécifie le numéro des interfaces coté client:serveur. Sur Mac l’interface tun peut être différente de 0, vous pouvez alors utiliser “any:0″ qui permettra d’utiliser n’importe quelle interface tun coté client (le mac).

Ensuite il faut configurer les interfaces des 2 cotés :

server# ifconfig tun0 172.16.0.1 netmask 255.255.255.252

server# ifconfig tun0 up

client# ifconfig tun0 172.16.0.2 netmask 255.255.255.252

client# ifconfig tun0 up

Sur Mac il faut rajouter une ip de destination dans le ifconfig :

clientMac# ifconfig tun15 172.16.0.2 netmask 255.255.255.252 172.16.0.1

A partir de maintenant vous devriez pouvoir faire un ping du client sur l’ip de l’interface tun du serveur.

Ensuite il faut que le serveur autorise l’ip forwarding et qu’on active le NAT.

server# echo 1 > /proc/sys/net/ipv4/ip_forward
server# iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

A partir d’ici il n’y a plus de manipulation sur le serveur, il ne reste qu’a configurer les routes coté client.

client# route add 192.168.1.0/24 172.16.0.1

Maintenant vous avez accès au réseau du serveur (192.168.1.0/24) !

Si vous souhaitez faire passer tout votre traffic par le VPN c’est possible aussi, il suffit d’ajouter une route vers l’ip du serveur avec comme gateway l’ip de la gateway coté client pour ne pas perdre la connexion et ensuite mettre la gateway du réseau distant (celui du serveur) comme gateway par défaut sur la machine client.

Il est possible de scripter tout ça, d’utiliser une authentification par clé, de backgrounder la connexion ssh, etc… mais c’est une autre histoire :-)

Categories: Linux, Network, Unix Tags: , , , ,
  1. Puck
    May 1st, 2011 at 16:40 | #1

    Tiens, avec mon groupe à l’inpres, on a découvert un petit truc qui pourrait vous intéresser: Faire un tunel SSH dans le sens inverse avec l’option -R. On a réussi à ouvrir un port à l’inpres (depuis l’inpres) disponible de l’extérieur.
    -R Specifies that the given port on the remote (server) host is to be forwarded to the given host and port on the local side.

    Un petit tuto disponible ici:
    http://blog.uggy.org/post/2006/02/17/76-ssh-r-ou-comment-monter-une-connexion-ssh-dans-le-sens-inverse

    Pour me connecter à l’inpres, je me connecte d’abord sur le serveur d’un pote, ensuite je me connecte à l’inpres en ssh -p leport myHost@localhost.

  2. May 1st, 2011 at 22:31 | #2

    Ouais, j’connaissais :-)
    Les possibilités avec ssh sont tellement vastes ! Par contre, faut laisser une session ssh ouverte du coté de l’inpres et trouver une astuce pour la relancer si le serveur externe n’a pas d’ip fixe.

  3. Ouacaze
    May 2nd, 2011 at 12:38 | #3

    Sympa votre site.
    Pour montre un VPN? il y a aussi http://openvpn.net 😉

  4. Puck
    May 3rd, 2011 at 22:45 | #4

    Pour ce qui est de garder une session ssh ouverte, on a trouver une astuce dans le man de ssh:
    -o TCPKeepAlive et -o ServerAliveInterval=30, puisque le timeout est de 45

  1. December 28th, 2010 at 20:24 | #1