Installation d'un serveur VPN sous FreeBSD

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 tun

ca /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.pem

server 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-lzo

user nobody
group nobody

persist-key
persist-tun

status 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.com

Please 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).

# echo 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:

Vus : 581
Publié par Nicolargo : 402