Le but de ce billet est de détailler l'installation d'un serveur VPN routé de type SSL sur un système FreeBSD 7. Nous utiliserons pour cela le logiciel libre OpenVPN (licence GPL v2).
Installation du système FreeBSD
Robustesse et qualité de sa pile IP font du système FreeBSD un bon "hôte" pour notre serveur VPN. Afin de ne pas surcharger le serveur avec des logiciels inutiles, j'ai choisi l'installation minimale (développeur, comprenant les "ports") à partir du réseau (ISO 7.x-RELEASE-i386-bootonly).
Avant de commencer l'installation d'OpenVPN, il est préférable de s'assurer que notre système d'exploitation est à jour en suivant cette procédure.
Installation de OpenVPN
On commence par installer le port OpenVPN avec la commande suivante:
# pkg_add -r openvpn
On automatise le lancement en ajoutant la ligne suivante au fichier /etc/rc.conf:
openvpn_enable="YES"
Configuration du serveur OpenVPN
OpenVPN permet la création de tunnel VPN de type SSL. Il faut donc que votre serveur puisse gérer des clès de chiffrement. Les étapes à suivre sont les suivantes:
# vi openssl.cnf
dir = /etc/ssl/CA
default_days = 3650 # Valable 10 ans...
default_bits = 2048 # Clès de 2048 bits
countryName_default = FR
stateOrProvinceName_default = PACA
localityName_default = Valbonne
0.organizationName_default = MaBoite
commonName_default = mondomaine.com
emailAddress_default = contact@mondomaine.com# mkdir /etc/ssl/CA
# cd /etc/ssl/CA
# mkdir certs
# mkdir crls
# mkdir newcerts
# mkdir private
# touch index.txt
# echo 01 > serial
# echo 01 > crlnumber
# openssl req -nodes -new -x509 -keyout private/cakey.pem -out cacert.pem -days 3650
> Laisser les options par défaut
A ce stade, on doit avoir notre clés créé dans le fichier private/cakey.pem:
# ls /etc/ssl/CA/private
cakey.pem
On génère ensuite le fichier de révocation:
# cd /etc/ssl/CA
# openssl ca -gencrl -out crls/crl.pem
# chown root:nobody crls/crl.pem
On passe maintenant à la génération de notre certificat pour notre serveur VPN:
# cd /etc/ssl/CA/certs
# openssl req -nodes -new \
-keyout vpn.mondomaine.com.key \
-out vpn.mondomaine.com.csr
> Laisser les options par défaut puis entrer un mot de passe
# chmod 600 /etc/ssl/CA/certs/vpn.mondomaine.com.key
Puis on le signe:
# openssl ca -out al-vpn1.alcasat.net.crt
\-in al-vpn1.alcasat.net.csr
\-policy policy_anything
Enfin on génère les paramètres Diffie-Hellman pour l'échange des clés:
# openssl dhparam -out dh2048.pem 2048
Pour configurer OpenVPN, nous allons nous baser sur une configuration d'exemple fournie par OpenVPN dans le fichier /usr/local/share/doc/openvpn/sample-config-files/server.conf.
# mkdir /usr/local/etc/openvpn/
# cp /usr/local/share/doc/openvpn/sample-config-files/server.conf \
/usr/local/etc/openvpn/openvpn.conf
Puis éditer le fichier /usr/local/etc/openvpn/openvpn.conf en adaptant la configuration à votre réseau.
Voici ma configuration:
et le fichier .conf correspondant:
port 1194
proto udp
dev tunca /etc/ssl/CA/cacert.pem
cert /etc/ssl/CA/certs/al-vpn1.alcasat.net.crt
key /etc/ssl/CA/certs/al-vpn1.alcasat.net.key
crl-verify /etc/ssl/CA/crls/crl.pem
dh /etc/ssl/CA/certs/dh2048.pemserver 192.168.40.0 255.255.255.0
ifconfig-pool-persist ipp.txt
push "route 192.168.1.0 255.255.255.0"keepalive 10 120
cipher BF-CBC
comp-lzouser nobody
group nobodypersist-key
persist-tunstatus openvpn-status.log
verb 6
mute 20
Lancement du serveur OpenVPN
On utilise le script système:
# /usr/local/etc/rc.d/openvpn start
Pour vérifier que le tunnel VPN est prêt à accueillir des clients, on peut vérifier que le preocess openvpn est bien lancé et que l'interface tun0 est bien présente:
# /usr/local/etc/rc.d/openvpn status
openvpn is running as pid 2212.# ifconfig tun0
tun0: flags=8051<UP,POINTOPOINT,RUNNING,MULTICAST> metric 0 mtu 1500
inet 192.168.40.1 --> 192.168.40.2 netmask 0xffffffff
Opened by PID 2207
Pour relancer le serveur (en cas de changement de configuration):
# /usr/local/etc/rc.d/openvpn restart
Pour arrêter le serveur:
# /usr/local/etc/rc.d/openvpn stop
La consultation des logs peut être faire via la commande:
# tail -f /var/log/messages | grep openvpn
Configuration de votre réseau
Si votre réseau hébergeant le serveur VPN comporte des routeurs il faut leur ajouter la route suivante (exemple donnée pour un ajout de route sur un routeur FreeBSD):
# route add -net 192.168.40.0/24 @IP-SERVEUR-VPN
Configuration d'un client Linux
A partir du serveur VPN, on génére les clés pour le nouveau client:
# cd /etc/ssl/CA/certs
# openssl req -nodes -new -keyout vpn-nicolargo.key -out vpn-nicolargo.csr
Generating a 2048 bit RSA private key
...............................................+++
...................+++
writing new private key to 'vpn-nicolargo.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [FR]:
State or Province Name (full name) [PACA]:
Locality Name (eg, city) [Valbonne]:
Organization Name (eg, company) [MaBoite]:
Organizational Unit Name (eg, section) []:
Common Name (eg, YOUR name) [mondomaine.com]:vpn-nicolargo.mondomaine.com
Email Address [contact@mondomaine.com]:monadresse@mondomaine.comPlease enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:monpassword
An optional company name []:
Il faut changer le fichier /etc/ssl/CA/serial (incrémenter la valeur de 1).
# cat 02 > /etc/ssl/CA/serial
Puis signer le certificat:
# openssl ca -out vpn-nicolargo.crt \
-in vpn-nicolargo.csr -policy policy_anything
Sur la machine cliente, on copie les 3 fichiers ainsi que la clés serveur cacert.pem dans le répertoire /etc/ssl/certs (à créer si il n'existe pas).
On doit se retrouver avec nos 4 fichiers:
# ls /etc/ssl/certs/*
/etc/ssl/certs/cacert.pem
/etc/ssl/certs/vpn-nicolargo.crt
/etc/ssl/certs/vpn-nicolargo.csr
/etc/ssl/certs/vpn-nicolargo.key
On protége nos fichiers:
# groupdadd nobody
# chown root:nobody /etc/ssl/certs/cacert.pem
# chown root:nobody /etc/ssl/certs/vpn-nicolargo.*
# chmod 600 /etc/ssl/certs/vpn-nicolargo.key
Après installation d'OpenVPN sur votre machine cliente, on le configure en créant le fichier client.conf dans le répertoire /etc/openvpn/ (sous GNU/Linux Ubuntu):
# sudo vi /etc/openvpn/client.conf
client
dev tun
proto udp
remote al-vpn1.alcasat.net 1194
nobind
user nobody
group nobody
persist-key
persist-tun
ca /etc/ssl/certs/cacert.pem
cert /etc/ssl/certs/vpn-hennionn.crt
key /etc/ssl/certs/vpn-hennionn.key
cipher BF-CBC
comp-lzo
verb 6
mute 20
Lancement du client OpenVPN Linux
Pour monter le VPN entre notre client et le serveur, on utilise le script système (sous GNU/Linux Ubuntu):
# sudo /etc/init.d/openvpn start client
* Starting VPN 'client' [OK]
L'arrêt se fera tout aussi simplement:
# sudo /etc/init.d/openvpn stop client
* Stopping VPN 'client' [OK]
Par défaut, au démarrage de la machine, OpenVPN va lancer tout les tunnels VPN dont il trouve une configuration dans le répertoire /etc/openvpn/. Si vous souhaitez désactiver cette fonction et monter vous même le VPN à la main, il faut éditer le fichier /etc/default/openvpn (sous GNU/Linux Ubuntu) et décommenter la ligne suivante:
AUTOSTART="none"
Pour conclure...
Il est possible de configurer d'autres clients en suivant la même procédure, le tunnel VPN étant routé, il peut accueillir plusieurs utilisateurs en même temps.
Des clients OpenVPN avec interface graphique sont également disponibles sous Windows et Mac OS X.
Quelques sources utiles à la rédaction de ce billet:
- Le How-To du site officiel (en)
- OpenVPN - Creating a routed VPN - FreeBSD Diary (en)
- Setting up routed OpenVPN in FreeBSD - Wiki Section6 (en)
- Basic of using OpenSSL - Wiki Section 6 (en)