OpenSSH : Tunneling VPN
Contents
1 Introduction
Depuis la version 4.3 de OpenSSH, l'option pour faire des tunnels IP a été ajoutée.
Avant tout, il faut vérifier la version d'OpenSSH sur le serveur et le client.
ssh |
ssh -v |
Tout d'abord, il faut les droits root sur les 2 machines. En effet, il y a quelques opérations à faire, aussi bien au niveau de la configuration que du réseau.
2 Configuration
2.1 Serveur
2.1.1 OpenBSD
La première chose à faire est de dire à OpenSSH d'autoriser les tunnels, en rajoutant cette directive :
/etc/ssh/sshd_config |
# Enable layer-3 tunneling. Change the value to 'ethernet' for layer-2 tunneling PermitTunnel point-to-point |
Nous devons nous assurer que le forwarding est activé :
sysctl |
sysctl net.inet.ip.forwarding=1 |
Et sera activé au reboot :
/etc/sysctl.conf |
net.inet.ip.forwarding=1 |
On va créer une interface tun :
ifconfig tun0 create ifconfig tun0 10.0.0.1 10.0.0.2 netmask 0xfffffffc |
Et encore une fois, rendre la configuration permanente :
/etc/hostname.tun0 |
10.0.0.1 10.0.0.2 netmask 0xfffffffc |
Nous allons maintenant pouvoir relancer SSH :
pkill -HUP sshd ; /usr/sbin/sshd |
Il faut aussi retirer la séparation des privilèges, ou jouer sur les permissions de /dev/tun . J'ai pris la facilité pour le moment, j'ai rajouté
UsePrivilegeSeparation no
Une autre solution est de donner les permissions en lecture écriture à un groupe particulier sur /dev/tun, ce qui est bien plus simple et sûr.
chmod :mongroupe /dev/tun
et bien sur, être dans le groupe en question.
Il faut ensuite charger le module tun :
modprobe tun
et le rajouter dans /etc/modprobe.preload
echo tun >> /etc/modprobe.preload
pour le charger au prochain démarrage.
2.2 Client
Au niveau du client, nous devons également ajouter cette directive mais dans le fichier /etc/ssh/ssh_config :
/etc/ssh/ssh_config |
# Enable layer-3 tunneling. Change the value to 'ethernet' for layer-2 tunneling PermitTunnel point-to-point |
Editez le fichier /etc/network/interfaces et rajoutez cette interface :
Il faut simplement les droits sur /dev/tun, donc soit tourner en root, ou avoir la permission d'écrire sur /dev/tun, comme plus haut, puis faire ( client etant le serveur ) :
ssh -w any:any client
Vous pouvez jeter une oeil sur les options -f et -N pour ne pas lancer de shell sur la machine distante. Et bien sur, les options habituelles marchent encore ( clé, tunnel, master/slave ).
Puis, en root, vous pourrez changer l'ip de la nouvelle interface tun0 sur le serveur
ifconfig tun0 10.0.0.1
sous FreeBSD:
ifconfig tun100 inet 10.0.0.1 10.0.0.2 netmask 255.255.255.255
et faire pareil sur le client :
ifconfig tun0 10.0.0.2
ou
ifconfig tun100 inet 10.0.0.2 10.0.0.1 netmask 255.255.255.255
Et finalement, vous pouvez maintenant tester le ping depuis le client :
ping 10.0.0.1
Le reste, c'est de la configuration normale pour les interfaces. Vous pouvez rajouter des routes, un firewall, n'importe quoi.
Néanmoins, il faut savoir que les connexions tcp par dessus tcp ( comme c'est le cas avec ssh ) sont déconseillées, de par la nature de tcp.
3 FAQ
3.1 Connection closed by ...
Ceci est généralement du au serveur qui galère. Vérifier qu'il a bien les bons DNS et que dans la config (/etc/ssh/sshd_config) la valeur LoginGraceTime est assez élevée.
3.2 Cannot fork into background without a command to execute
Vous avez peut être ce message d'erreur :
Cannot fork into background without a command to execute Failed to bring up tun1.
Pour palier ce problème, rajoutez l'option -N à la commande ssh.
4 Ressources
Documentation sur le VPN SSH
http://www.kernel-panic.it/openbsd/vpn/vpn5.html
http://www.debian-administration.org/article/Setting_up_a_Layer_3_tunneling_VPN_with_using_OpenSSH