Par Emilien Macchi, le 27/03/2008 à 19:30.
Voici un tutoriel tout frais qui va vous permettre comme moi d’avoir son propre serveur VPN (Virtual Private Network).
Un serveur VPN, c’est quoi ? Pennons mon exemple : J’ai un serveur à la maison et j’ai un pc portable avec lequel je bouge beaucoup. J’avais envie d’un système me permettant d’être dans mon réseau local partout où j’irais dans le monde. C’est le but du VPN, il va agir comme un tunnel chiffré entre le client et le serveur via des certificats.
J’ai donc choisis une solution libre : OpenVPN accouplé à OpenSSL pour le chiffrement.
Pour cela, une bête de course n’est pas nécessaire, juste de quoi installer une Debian. Pour ma part j’ai une vieille tour trouvée dans ma cave avec un céléron, 32 Mo de mémoire vive et un vieux chipset graphique. De toute façon, pas question d’installer un environnement graphique : les paquetages minimum sont suffisants.
Voici mon architecture réseau :
Mon routeur : 192.168.0.254
Mon serveur VPN derrière le routeur : 192.168.0.111
L’interface TUN sur le serveur VPN qui va faire le lien : 10.8.0.1
L’interface TUN sur le client : 10.8.0.6
Le client étant connecté sur Internet via une autre connexion que la mienne.
Une fois votre serveur installé et mis à jour, installer ces paquets :
# aptitude install openvpn
# aptitude install liblzo
# aptitude install openssl
Vous êtres prêt pour la suite.
Notre VPN sera sécurisé à l’aide de certificats 1024 bits chiffrés RSA.
Sur le serveur :
cd /usr/share/doc/openvpn/examples/easy-rsa/
Edittez le fichier “vars” et à la fin remplissez les champs du certificat, comme par exemple :
- export KEY_COUNTRY=FR
- export KEY_PROVINCE=France
- export KEY_CITY=Paris
- export KEY_ORG=”MonOrganisation”
- export KEY_EMAIL=”contact@MonOrganisation.fr”
Initialisez les clés :
# . ./vars
# ./clean-all
Nous allons créer le certificat principal :
# ./build-ca
Tous les champs sont dejà rentrés sauf “Common Name” où il faut renseigner (par exemple “principal”)
Ensuite nous allons créer le certificat propre au serveur :
# ./build-key-server serveur
Tous les champs sont dejà rentrés sauf “Common Name” où il faut renseigner (par exemple “serveur”)
Création du certificat pour le client :
# cd /usr/share/doc/openvpn/examples/easy-rsa/
# . ./vars
# ./build-key client
# ./build-key client
Création du paramètre Diffie Hellman :
# ./build-dh
Copie des clés dans le répertoire de configuration d’OpenVPN :
# cp ./keys/ca.crt /etc/openvpn/
# cp ./keys/ca.key /etc/openvpn/
# cp ./keys/serveur.crt /etc/openvpn/
# cp ./keys/serveur.key /etc/openvpn/
# cp ./keys/dh1024.pem /etc/openvpn/
Création du fichier de configuration d’OpenVPN :
# vim /etc/openvpn/openvn.conf
#Port en écoute utilisé pour la connexion VPN
port XXX
#Protocole utilisé (Le protocole udp est plus sécurisé que le tcp)
proto tcp
#Type d’interface réseau virtuelle créée
dev tun
#Nom des fichiers servant à l’authentification des clients via OpenSSL
ca /etc/openvpn/ca.crt
cert /etc/openvpn/serveur.crt
key /etc/openvpn/serveur.key
dh /etc/openvpn/dh1024.pem
#Adresse du réseau virtuel (Le serveur aura l’adresse 192.168.0.1)
server 10.8.0.0 255.255.255.0
#Cette ligne ajoute sur le client la route du réseau du serveur
push “route 192.168.0.0 255.255.255.0″
#Ces lignes indiquent aux clients l’adresse des serveur DNS et WINS
push “dhcp-option DNS 192.168.0.254″
push “dhcp-option WINS 192.168.0.254″
# Cette ligne permet aux clients de voire les autres clients
client-to-client
keepalive 10 120
#Cette ligne active la compression
comp-lzo
#Ces lignes permettent de rendre persistante la connexion
persist-key
persist-tun
#Cette ligne permet d’indiquer le niveau de log souhaité (de 1 à 9)
verb 3
Voila pour la configuration serveur.
Si comme moi vous avez un routeur, pensez à ouvrir le port que vous aurez choisit sur le routeur !
Sur le serveur, il nous reste encore à activer le module tun du noyau :
# modprobe tun
Puis à configurer le réseau :
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -t -nat -A POSTROUTING -o eth0 -s 192.168.0.254 -j MASQUERADE
iptables -t nat -A FORWARD -in-interface tun0 -j ACCEPT
iptables --table nat --append POSTROUTING --out-interface eth0 -j MASQUERADE
# /etc/init.d/openvpn restart
Via SCP ou clé USB, importer les certificats clients vers le poste client (les fichiers nécéssaires sont ca.crt, client.crt et client.key).
Mettez les dans votre répertoire /etc/openvpn/
Maintenant, travaillons sur le poste client pour en finir :
Editez le fichier de configuration OpenVPN :
# vim /etc/openvpn/openvpn.conf
#nous sommes client
client
tls-client
#le serveur
remote XX.XX.XX.XX XX #@IP publique du serveur et port d’écoute
proto tcp
dev tun
ifconfig 10.8.0.2 10.8.0.1
#Certification de l’AC
ca /etc/openvpn/ca.crt
#notre certificat
cert /etc/openvpn/client.crt
#clef secrete
key /etc/openvpn/client.key
#negociation
reneg-sec 21600
#compression
comp-lzo
#verbosité
verb 3
Voilà pour la configuration.
Maintenant configurons le réseau :
# echo 1 > /proc/sys/net/ipv4/ip_forward
# route add -net 10.8.0.0 netmask 255.255.255.0 gw 192.168.0.111
# /etc/init.d/openvpn restart
Et maintenant, connectons nous au VPN sur le client :
# openvpn --config /etc/openvpn/openvpn.conf
# ping 192.168.0.111
PING 192.168.0.111 (192.168.0.111) 56(84) bytes of data.
64 bytes from 192.168.0.111: icmp_seq=1 ttl=64 time=3.17 ms
64 bytes from 192.168.0.111: icmp_seq=2 ttl=64 time=2.62 ms
64 bytes from 192.168.0.111: icmp_seq=3 ttl=64 time=3.34 ms
64 bytes from 192.168.0.111: icmp_seq=4 ttl=64 time=2.77 ms
Et voilà le travail.
Vous êtes en réseau local de n’importe où dans le monde.
Cela permet par exemple de détourner des ports fermés lors d’une connection bridée et vous permettrait de les avoir tous ouverts comme à la maison 
Si vous avez la moindre question ou un problème, contactez moi.