Installation d'un réseau privé virtuel
OpenVPN est un logiciel permettant de créer des réseaux privés virtuels sans utiliser des technologies telles que PPtP (Microsoft) ou IPSec. Il est de plus disponibles sur de nombreux systèmes d'exploitation (Microsoft Windows, GNU / Linux, MacOS X, ...). C'est une solution simple pour gérer un réseau privé virtuel composé de machines hétéroclites dans un environnement n'autorisant pas IPSec.
Attention !
Cet article est obsolète, et je vous recommande de ne pas le suivre. Il est avantageusement remplacé par :
Installer et configurer OpenVPN sur Debian 4.0 Etch
Installation du logiciel
L'installation d'OpenVPN se fait simplement par la ligne de commande :
apt-get install openvpn openssl
Il nous faut aussi créer les fichiers spéciaux utilisés par le serveur et installer les pilotes nécessaires:
modprobe tun
mkdir /dev/net
mknod /dev/net/tun c 10 200
Création des clefs d'encryption
OpenVPN utilise OpenSSH pour crypter les connexions. L'identification des clients se base sur un mécanisme de clefs privés / clefs publiques. Ce mécanisme est au coeur du fonctionnement du réseau privé. Il vous faut donc préter la plus grande attention à sa configuration. Nous commençons par renseigner le nom de notre serveur :
OPENVPN_SERVER=vpn.landure.org
Initialisez ensuite la liste des clients que vous souhaitez créer. Cette liste doit être séparée par des espaces :
OPENVPN_CLIENTS="client1 client2 client3"
Choisissez ensuite la plage d'adresses IP assignées à votre VPN :
OPENVPN_IPRANGE=10.8.157
Attention : Veillez à ce que cette plage soit différente de celle de votre réseau local et des réseaux locals des machines clientes.
Puis choisissez le nom de domaine du réseau local de votre VPN :
OPENVPN_LOCALDOMAIN=landure.vpn
Enfin, initialisez les variables d'environnement suivantes en fonction de votre configuration. Elle fournirons les valeurs par défaut à utiliser lors de la création des clefs.
KEY_COUNTRY=FR
KEY_PROVINCE=75
KEY_CITY=PARIS
KEY_ORG="$OPENVPN_SERVER Virtual Private Network Server"
KEY_EMAIL=votre@email.org
Par défaut, la longueur des clefs créées est de 1024 bits. Si vous êtes légèrement paranoïaque, vous pouvez augmenter cette valeur au coût de moindres performances de votre VPN.
KEY_SIZE=2048
Installation des scripts easy-rsa
OpenVPN fournit des scripts pour faciliter la création des clefs d'encryption. Nous allons les copier de façon à ce que nous puissions les modifier à notre guise :
cp -r /usr/share/doc/openvpn/examples/easy-rsa/ /etc/openvpn
if [ -e /etc/openvpn/easy-rsa/openssl.cnf ]; then rm /etc/openvpn/easy-rsa/openssl.cnf; fi
gunzip /etc/openvpn/easy-rsa/openssl.cnf.gz
sed -i -e '/commonName[\t ]*=[\t ]*Common/a\
commonName_default\t\t= $ENV::KEY_COMMONNAME' \
/etc/openvpn/easy-rsa/openssl.cnf;
Nous allons maintenant mettre à jour le fichier de configuration des certificats en fonction de nos besoins. Exécutez ensuite les commandes suivantes pour mettre à jour le fichier de configuration d'easy-rsa.
if [ ! $KEY_SIZE ]; then KEY_SIZE=1024; fi
sed -i -e "s/\(export D=\).*/\1\"\/etc\/openvpn\"/" \
-e "s/\(export KEY_CONFIG=\).*/\1\"\/etc\/openvpn\/easy-rsa\/openssl.cnf\"/" \
-e "s/\(export KEY_SIZE=\).*/\1\"$KEY_SIZE\"/" \
-e "s/\(export KEY_COUNTRY=\).*/\1\"$KEY_COUNTRY\"/" \
-e "s/\(export KEY_PROVINCE=\).*/\1\"$KEY_PROVINCE\"/" \
-e "s/\(export KEY_CITY=\).*/\1\"$KEY_CITY\"/" \
-e "s/\(export KEY_ORG=\).*/\1\"$KEY_ORG\"/" \
-e "s/\(export KEY_EMAIL=\).*/\1\"$KEY_EMAIL\"/" \
/etc/openvpn/easy-rsa/vars
echo "export OPENVPN_SERVER=\"$OPENVPN_SERVER\"
export OPENVPN_CLIENTS=\"$OPENVPN_CLIENTS\"
export OPENVPN_IPRANGE=\"$OPENVPN_IPRANGE\"
export OPENVPN_LOCALDOMAIN=\"$OPENVPN_LOCALDOMAIN\"
" >> /etc/openvpn/easy-rsa/vars
Création d'une authorité de certification
Une autorité de certification est un ensemble clef privée / clef publique destiné à signer des clefs publiques. Pour créer votre authorité de certification, éxecutez les lignes de commandes suivantes :
source /etc/openvpn/easy-rsa/vars
export KEY_COMMONNAME="ca.$OPENVPN_SERVER"
/etc/openvpn/easy-rsa/clean-all
/etc/openvpn/easy-rsa/build-ca
Si vous avez correctement configuré easy-rsa, vous pouvez utiliser les valeurs par défaut.
Création du certificat du serveur
Nous allons maintenant créer le certificat d'encryption du serveur. Exécutez les commandes suivantes :
source /etc/openvpn/easy-rsa/vars
export KEY_COMMONNAME="$OPENVPN_SERVER"
/etc/openvpn/easy-rsa/build-key-server server
Ici encore, utilisez les valeurs par défaut. Enfin, le script vous demande de confirmer la signature du certificat. Répondez Oui aux deux questions.
Sign the certificate? [y/n]: y
1 out of 1 certificate requests certified, commit? [y/n] y
Création des certificats des clients
Nous créons enfin les certificats clients. Executez la commande suivante pour créer les certificats :
source /etc/openvpn/easy-rsa/vars
for OPENVPN_CLIENT in $OPENVPN_CLIENTS; do
export KEY_COMMONNAME="$OPENVPN_CLIENT.client.$OPENVPN_SERVER";
/etc/openvpn/easy-rsa/build-key $OPENVPN_CLIENT;
done
Lorsque le script vous pose des questions, utilisez les valeurs par défaut, mais faites bien attention de répondre y aux questions :
Sign the certificate? [y/n]: y
1 out of 1 certificate requests certified, commit? [y/n] y
Génération des paramètres de Diffie Hellman
Les paramètres de Diffie Hellman doivent être généré pour que votre configuration fonctionne. Cela se fait grâce aux lignes :
source /etc/openvpn/easy-rsa/vars
/etc/openvpn/easy-rsa/build-dh
Génération d'une clef TLS
Nous allons maintenant générer une clef qui nous protègera de certains types d'attaques. Elle va nous permettre de créer un pare-feu HSA :
openvpn --genkey --secret /etc/openvpn/keys/ta.key
Configuration du serveur
Pour créer la configuration du serveur VPN, nous allons nous basé sur le fichier d'exemple disponible :
cp /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz /etc/openvpn/
gunzip /etc/openvpn/server.conf.gz
Nous allons ajuster ce fichier à nos besoins.
source /etc/openvpn/easy-rsa/vars
sed -i \
-e "s/^ca ca\.crt/ca \/etc\/openvpn\/keys\/ca\.crt/" \
-e "s/^cert server\.crt/cert \/etc\/openvpn\/keys\/server\.crt/" \
-e "s/^key server\.key/key \/etc\/openvpn\/keys\/server\.key/" \
-e "s/^dh[\t ]*dh1024.pem/dh \/etc\/openvpn\/keys\/dh$KEY_SIZE.pem/" \
-e "s/^server[\t ].*$/server $OPENVPN_IPRANGE\.0 255\.255\.255\.0/" \
-e 's/^;client-to-client/client-to-client/' \
-e 's/^;\(tls-auth \)\(ta.key.*\)$/\1\/etc\/openvpn\/keys\/\2/' \
-e 's/^;\(.*# Triple-DES\)$/\1/' \
-e 's/^\(status \).*/\1\/var\/log\/openvpn-status.log/' \
-e 's/^group[ \t]*nobody$/group nogroup/' \
/etc/openvpn/server.conf
Enfin, vous pouvez redémarrer votre serveur :
/etc/init.d/openvpn restart
Configuration des clients
Nous allons maintenant créer des archives contenant les clefs et fichiers de configurations à copier sur les différents clients. Nous commençons par créer les fichiers de configurations adaptés aux différents clients.
source /etc/openvpn/easy-rsa/vars
for OPENVPN_CLIENT in $OPENVPN_CLIENTS; do
cp /usr/share/doc/openvpn/examples/sample-config-files/client.conf /etc/openvpn/;
sed -i \
-e "s/^remote[\t ]*my-server-1[\t ].*/remote $OPENVPN_SERVER 1194/" \
-e 's/^group[ \t]*nobody$/group nogroup/' \
-e "s/^ca ca\.crt/ca \/etc\/openvpn\/keys\/ca\.crt/" \
-e "s/^cert client\.crt/cert \/etc\/openvpn\/keys\/$OPENVPN_CLIENT\.crt/" \
-e "s/^key client\.key/key \/etc\/openvpn\/keys\/$OPENVPN_CLIENT\.key/" \
-e "s/;\(ns-cert-type[\t ]*server.*\)/\1/" \
-e "s/;tls-auth[\t ]*ta.key[\t ]*1.*/tls-auth \/etc\/openvpn\/keys\/ta.key 1/" \
/etc/openvpn/client.conf;
egrep "^cipher " /etc/openvpn/server.conf \
>> /etc/openvpn/client.conf;
tar cf /etc/openvpn/$OPENVPN_CLIENT.tar /etc/openvpn/client.conf;
tar rf /etc/openvpn/$OPENVPN_CLIENT.tar /etc/openvpn/keys/ca.crt;
tar rf /etc/openvpn/$OPENVPN_CLIENT.tar /etc/openvpn/keys/$OPENVPN_CLIENT.crt;
tar rf /etc/openvpn/$OPENVPN_CLIENT.tar /etc/openvpn/keys/$OPENVPN_CLIENT.key;
tar rf /etc/openvpn/$OPENVPN_CLIENT.tar /etc/openvpn/keys/ta.key;
if [ -e /etc/openvpn/client.conf ]; then rm /etc/openvpn/client.conf; fi;
done
Vous disposez maintenant de plusieurs fichiers tar qu'il vous suffit de copier sur les machines clientes et de décompresser à l'aide de la commande :
tar --directory / -xf votre-fichier-client.tar
Enfin, il vous faut installer openvpn sur les machines clientes et / ou le redémarrer :
apt-get install openvpn
/etc/init.d/openvpn restart
Normallement, vous verrez apparaître un message vous signalant que tout s'est bien passé, La commande suivante vous permettra d'obtenir plus d'informations sur votre lien VPN :
ifconfig tun0
Pour aller plus loin
Le premier chapitre vous à permis de créer un réseau privé virtuel basique où les clients peuvent communiquer entre-eux et avec le serveur. C'est bien, mais dans la majorité des cas, ca ne suffit pas. Nous allons voir ici comment étoffer les fonctionnalités de votre VPN. La première êtape pour ce-faire est d'éxecuter les lignes de commandes suivantes :
mkdir /etc/openvpn/clients-configs
echo "
# Configurations avancées.
client-config-dir /etc/openvpn/clients-configs" \
>> /etc/openvpn/server.conf
Autoriser les clients VPN à accéder au réseau local du serveur
Si vous souhaitez accéder au réseau local de votre serveur VPN à partir des clients de votre VPN, vous devez d'abord vous assurez que les réseaux locaux de vos clients n'utilisent pas la même classe d'adresse IP que celui de votre serveur. Si tout va bien sur ce point, commencez par signaler aux clients quelle route utiliser pour accéder au réseau local de votre serveur :
ifconfig eth0 | grep inet | \
sed -e 's/.*:\([0-9\.]*\)[0-9]\{1,3\} .*:\([0-9\.]*\) .*:\([0-9\.]*\).*/push "route \10 \3"/g' \
>> /etc/openvpn/server.conf
Une fois ceci fait, nous allons jouer avec la configuration iptables pour faire de votre serveur VPN un routeur NAT. Oui, oui, j'ai bien dit NAT. J'ai vu passer plein de tutoriels compliqués pour mettre en place un routage complet entre les clients du VPN et le réseau local du serveur, mais je trouve que c'est complètement surdimensionné par rapport à la plupart des besoins.
En premier lieu, si vous ne l'avez pas déjà fait, nous allons installer le script init.d d'iptables. Ce script permet notamment de sauvegarder et de restaurer la configuration d'iptables. Executez la commande suivante :
gunzip --to-stdout /usr/share/doc/iptables/examples/oldinitdscript.gz > /etc/init.d/iptables
chmod +x /etc/init.d/iptables
Nous créons le dossier contenant la sauvegarde d'iptables :
mkdir /var/lib/iptables
Et enfin, nous configurons le script de démarrage d'iptables dans le rc.d.
update-rc.d iptables defaults
Nous autorisons le NAT sur le système :
sed -i -e 's/\(ip_forward=\).*/\1yes/g' /etc/network/options
echo 1 > /proc/sys/net/ipv4/ip_forward
Ensuite, nous mettons en place la configuration NAT pour notre réseau VPN :
iptables -t nat -A POSTROUTING -s $OPENVPN_IPRANGE.0/24 -o eth0 -j MASQUERADE
Et nous la sauvegardons :
/etc/init.d/iptables save active
Votre configuration iptables sera rechargée à chaque redémarrage par la suite.
Attribuer des adresses IP fixes aux clients du réseau privé virtuel
Il est possible d'attribuer une IP fixe à chacun des clients du réseau privé virtuel. Il vous est ainsi possible de vous connecter de manière sûre à une machine du réseau privé. Pour ce faire, éxecutez le script suivant qui fixera automatiquement l'adresse IP à assigner à chaque clients :
source /etc/openvpn/easy-rsa/vars
COUNTER=2
for OPENVPN_CLIENT in $OPENVPN_CLIENTS; do
KEY_COMMONNAME="$OPENVPN_CLIENT.client.$OPENVPN_SERVER"
if [ ! -e "/etc/openvpn/clients-configs/$KEY_COMMONNAME" ]; then
touch "/etc/openvpn/clients-configs/$KEY_COMMONNAME"
fi
SERVER_SIDE_IP=`perl -e "print ((4*$COUNTER)-3);"`
CLIENT_SIDE_IP=`perl -e "print ((4*$COUNTER)-2);"`
echo "ifconfig-push $OPENVPN_IPRANGE.$SERVER_SIDE_IP $OPENVPN_IPRANGE.$CLIENT_SIDE_IP" \
>> "/etc/openvpn/clients-configs/$KEY_COMMONNAME"
COUNTER=`perl -e "print ($COUNTER+1);"`
done
Configurer un serveur de nom pour votre VPN
Si vous avez choisi d'attribuer des adresses IP fixes aux clients de votre VPN, il est intéressant de disposer d'un serveur DNS pour diffuser simplement les associations nom de machine / adresse IP. Personnellement, j'utilise bind :
apt-get install bind9
Si vous dite que c'est utiliser une masse pour enfoncer un clou, vous avez certainement raison, mais j'avais envie de me former à Bind ;D (Rien ne vaut l'apprentissage par la pratique). Bref, nous allons maintenant ajouter les adresses IPs fixes de notre VPN à la configuration de Bind.
source /etc/openvpn/easy-rsa/vars
if [ ! -e /etc/bind/db.$OPENVPN_IPRANGE ]; then
touch /etc/bind/db.$OPENVPN_IPRANGE
REVERSE_IPRANGE=`echo $OPENVPN_IPRANGE | sed -e 's/\([0-9]*\)\.\([0-9]*\)\.\([0-9]*\)/\3\.\2\.\1/'`
SERVER_BASENAME=`hostname | sed -e "s/^\([^\.]*\)\..*/\1/"`
echo "$REVERSE_IPRANGE.in-addr.arpa. IN SOA $(hostname). root.localhost. (
1; Serial
10800; refresh after 3 hours.
3600; Retry after 1 hour.
604800; expire after 1 week.
86400; Minimum TTL of 1 day.
);
;
; Name servers declaration.
;
$REVERSE_IPRANGE.in-addr.arpa. IN NS $(hostname).;
;
; Hostnames declaration.
;
1.$REVERSE_IPRANGE;in-addr.arpa. IN PTR $SERVER_BASENAME.$OPENVPN_LOCALDOMAIN.;
" >> /etc/bind/db.$OPENVPN_IPRANGE
fi
for OPENVPN_CLIENT in $OPENVPN_CLIENTS; do
KEY_COMMONNAME="$OPENVPN_CLIENT.client.$OPENVPN_SERVER"
if [ -e "/etc/openvpn/clients-configs/$KEY_COMMONNAME" ]; then
IP_LAST_DIGIT=`cat "/etc/openvpn/clients-configs/$KEY_COMMONNAME" | \
grep "ifconfig-push" | \
sed -e "s/ifconfig-push[ \t]*[0-9]*\.[0-9]*\.[0-9]*\.\([0-9]*\)[ \t]*.*/\1/"`
CLIENT_BASENAME=`echo $OPENVPN_CLIENT | sed -e "s/^\([^\.]*\)\..*/\1/"`
echo "$IP_LAST_DIGIT.$REVERSE_IPRANGE.in-addr.arpa. IN PTR $CLIENT_BASENAME.$OPENVPN_LOCALDOMAIN.;" \
>> /etc/bind/db.$OPENVPN_IPRANGE
fi
done
echo "
zone \"$REVERSE_IPRANGE.in-addr.arpa\" in {
type master;
file \"/etc/bind/db.$OPENVPN_IPRANGE\";
};" >> /etc/bind/named.conf.local
Exécutez ensuite les commandes suivantes :
if [ ! -e /etc/bind/db.$OPENVPN_LOCALDOMAIN ]; then
touch /etc/bind/db.$OPENVPN_LOCALDOMAIN
REVERSE_IPRANGE=`echo $OPENVPN_IPRANGE | sed -e 's/\([0-9]*\)\.\([0-9]*\)\.\([0-9]*\)/\3\.\2\.\1/'`
SERVER_BASENAME=`hostname | sed -e "s/^\([^\.]*\)\..*/\1/"`
echo "$OPENVPN_LOCALDOMAIN. IN SOA $(hostname). root.localhost. (
1; Serial
10800; refresh after 3 hours.
3600; Retry after 1 hour.
604800; expire after 1 week.
86400; Minimum TTL of 1 day.
);
;
; Name servers declaration.
;
$OPENVPN_LOCALDOMAIN. IN NS $(hostname).;
;
; Hostnames declaration.
;
$SERVER_BASENAME.$OPENVPN_LOCALDOMAIN. IN A $OPENVPN_IPRANGE.1;
" >> /etc/bind/db.$OPENVPN_LOCALDOMAIN
fi
for OPENVPN_CLIENT in $OPENVPN_CLIENTS; do
KEY_COMMONNAME="$OPENVPN_CLIENT.client.$OPENVPN_SERVER"
if [ -e "/etc/openvpn/clients-configs/$KEY_COMMONNAME" ]; then
IP_LAST_DIGIT=`cat "/etc/openvpn/clients-configs/$KEY_COMMONNAME" | \
grep "ifconfig-push" | \
sed -e "s/ifconfig-push[ \t]*[0-9]*\.[0-9]*\.[0-9]*\.\([0-9]*\)[ \t]*.*/\1/"`
CLIENT_BASENAME=`echo $OPENVPN_CLIENT | sed -e "s/^\([^\.]*\)\..*/\1/"`
echo "$CLIENT_BASENAME.$OPENVPN_LOCALDOMAIN. IN A $OPENVPN_IPRANGE.$IP_LAST_DIGIT;" \
>> /etc/bind/db.$OPENVPN_LOCALDOMAIN
fi
done
echo "
zone \"$OPENVPN_LOCALDOMAIN\" in {
type master;
file \"/etc/bind/db.$OPENVPN_LOCALDOMAIN\";
};" >> /etc/bind/named.conf.local
Vous pouvez maintenant redémarrer bind :
/etc/init.d/bind9 restart
Il vous reste à configurer votre serveur VPN pour qu'il propage votre configuration DNS. Exécutez simplement la commande :
echo "
push \"dhcp-option DOMAIN $OPENVPN_LOCALDOMAIN\"
push \"dhcp-option DNS $OPENVPN_IPRANGE.1\"" \
>> /etc/openvpn/server.conf
Et redémarrez votre serveur VPN :
/etc/init.d/openvpn restart
Cette configuration fonctionnera automatiquement sur vos clients Microsoft Windows. Il faut effectuer une manipulation supplémentaire pour qu'elle fonctionne sur vos clients Linux. Téléchargez le fichier /etc/openvpn/client.up avec la commande suivante :
wget --output-document=/etc/openvpn/client.up http://howto.landure.fr/gnu-linux/debian-sarge/installation-dun-reseau-prive-virtuel/client.up
Exécutez ensuite les commandes :
chmod +x /etc/openvpn/client.up
echo "up /etc/openvpn/client.up
route-up /etc/openvpn/client.up
plugin /usr/lib/openvpn/openvpn-down-root.so \"script_type=down /etc/openvpn/client.up\"" >> /etc/openvpn/client.conf
Il vous suffit maintenant de redémarrer votre client VPN pour terminer la configuration :
/etc/init.d/openvpn restart
Remerciements
Je souhaite remercier les acteurs qui m'ont aidés lors de la rédaction de ce howto :
- http://www.openvpn.net
- Le site officiel du logiciel OpenVPN, qui fournit un HOWTO très complet et très bien écrit. Si vous souhaitez plongez plus en avant dans l'univers du réseau privé virtuel, c'est la qu'il vous faut aller.
- Charles Duffy
- C'est la personne qui a écrit le script /etc/openvpn/client.up. Sans lui, ce howto n'aurait jamais été complet ;D Merci à lui donc.
Client Openvpn
Le logiciel openvpn fait à la fois office de serveur et de client.
apt-get install openvpn
Vous aurez ainsi tout ce qu'il vous faut pour vous connecter à un réseau openvpn.
Lwolf
client openvpn=interface graphique de connexion
Antares
client openvpn
Antares
OpenVpn n'est pas fait pour ca..;
openvpn-admin=GUI de openvpn
Antares
Probleme pour spécialiste...
je désire que le serveur qui héberge openvpn puisse "monter" un dossier d'un client dans son systeme samba lorsque le client se connecte.
La séquence idéale serait:
le client se connecte au serveur openVPN
le serveur lui attribu son IP VPN
Le serveur "détecte" que le client répond sur son ip VPN et ...
Le serveur lance un script de montage smbfs d'un dossier du client, via le tunnel VPN.
Il semblerait que tout les scripts côté serveur s'éxecutent avant que le client de soit en mesure de répondre à sa nouvelle ip sur le VPN. Toute commande "mount" via le vpn vers un de ses clients en cours de connexion échoue .
Comment faire pour automatiser cela?
Merci.
client openvpn
Quel est le client openvpn que vous allez utiliser sous linux Debian
Merci
Antares