Installation et configuration d’OpenVPN

Installation du serveur OpenVPN

Pour l’installation, on va utiliser la version fournie par les dépots officiels de Debian. On utilise donc APT pour cela :

sudo apt-get install openvpn

Préconfiguration

Le paquet openvpn fournit des examples de configuration, on les copie donc dans le répertoire de configuration pour les modifier ensuite :

#Création du répertoire easy-rsa
sudo mkdir /etc/openvpn/easy-rsa/
# Copie des fichiers de configuration
sudo cp -r /usr/share/doc/openvpn/examples/easy-rsa/2.0/* /etc/openvpn/easy-rsa/
# On change l'utilisateur des fichiers
sudo chown -R $USER /etc/openvpn/easy-rsa/

On a dorénavant les fichiers nécessaire pour configurer le serveur.

Configuration du serveur OpenVPN

On configure en premier lieu l’authentification par clés et certificats. Pour cela, on modifie le fichier /etc/openvpn/easy-rsa/vars :

sudo nano /etc/openvpn/easy-rsa/vars

Ce fichier correspond aux paramètres de création de clés et certificats. On laisse les valeurs par défaut de la plupart des options, on modifie principalement les lignes à la fin du fichier correspondant aux valeurs par défaut des informations qui seront dans les certificats. Par défaut elles sont :

export KEY_COUNTRY="US"
export KEY_PROVINCE="CA"
export KEY_CITY="SanFrancisco"
export KEY_ORG="Fort-Funston"
export KEY_EMAIL="me@myhost.mydomain"

Il faut les modifier par des valeurs correspondant au serveur, cela resssemble à cela :

export KEY_COUNTRY="FR"
export KEY_PROVINCE="75"
export KEY_CITY="Paris"
export KEY_ORG="Organiation"
export KEY_EMAIL="contact@organisation.org"

L’étape suivante correspond à la génération de la clé et du certificat du serveur. On lance les commandes suivantes :

# On se déplace dans le répertoire de configuration
cd /etc/openvpn/easy-rsa/
# On charge les valeurs par défaut
source vars
# On nettoie ce qui existe au cas où
./clean-all
./build-dh
# Génération de la clé privée ca du serveur dans keys/ca.key
./pkitool --initca
# Génération de la clé privée du serveur dans keys/server.key et du certificat dans keys/server.crt
./pkitool --server server
# Génération de la clé du serveur dans keys/ta.key
sudo openvpn --genkey --secret keys/ta.key

Les fichiers keys/ca.crt, keys/ta.key, keys/server.crt, keys/server.key et keys/dh1024.pem sont nécessaire pour l’identification au serveur, on les copie dans /etc/openvpn/ :

sudo cp keys/ca.crt keys/ta.key keys/server.crt keys/server.key keys/dh1024.pem /etc/openvpn/

On crée ensuite deux répertoires :

  • /etc/openvpn/jail où sera chrooté le processus du serveur OpenVPN ;
  • /etc/openvpn/clientconf où seront stockés les fichiers de configuration des utilisateurs qui seront créés par la suite ;
sudo mkdir /etc/openvpn/jail
sudo mkdir /etc/openvpn/clientconf

On crée ensuite le fichier de configuration à proprement dit du serveur /etc/openvpn/server.conf :

sudo nano /etc/openvpn/server.conf

Dans ce fichier on met le contenu suivant :

# Serveur TCP/444
# On utilise le port 444 car le 443 est souvent utilisé par apache ssl
mode server
proto tcp
port 444
dev tun

# Cles et certificats
# On utilise les clés et certifcats générés
ca ca.crt
cert server.crt
key server.key
dh dh1024.pem
tls-auth ta.key 0
cipher AES-256-CBC 

# Reseau
# La machine connectée sera dans le sous-réseau 10.8.0.0
# Les DNS utilisés seront ceux de google
server 10.8.0.0 255.255.255.0
push "redirect-gateway def1 bypass-dhcp"
push "dhcp-option DNS 4.4.4.4"
push "dhcp-option DNS 8.8.8.8"
keepalive 10 120

# Securite
# Configuration de la sécurité du serveur
# Le processus sera chrooté dans /etc/openvpn/jail
user nobody
group nogroup
chroot /etc/openvpn/jail
persist-key
persist-tun
comp-lzo

# Log
# Configuration de la manière dont les fichiers de logs fonctionnent
# Enlever le ";" de la dernière ligne pour activer les logs
verb 3
mute 20
status /var/log/openvpn-status.log
log-append /var/log/openvpn.log

On peut maintenant tester le serveur, on se déplace dans le répertoire de configuration :

cd /etc/openvpn

Et on lance la commande suivante qui lancera le serveur :

sudo openvpn server.conf

Vous devez avoir la ligne suivante à la fin :

Initialization Sequence Completed

Si aucun problème n’apparait, on peut alors décommenter la dernière ligne de la configuration du serveur afin de logguer dans le fichier /var/log/openvpn.log :

# Remplacer la ligne :
; log-append /var/log/openvpn.log
# Par :
log-append /var/log/openvpn.log

Le serveur est dorénavant correctement configuré.

Autoriser le sous-réseau à communiquer vers l’extérieur

Les clients pourront dorénavant se connecter au VPN mais ne devraient pas pouvoir accéder à Internet depuis leur adresse IP 10.8.0.X.

Il faut donc router le sous-réseau vers l’extérieur, le serveur devant jouer le rôle de routeur entre l’interface de connection VPN (tun0) et la carte réseau habituelle (eth0).

On configure le routage avec la commande :

sudo sh -c 'echo 1 > /proc/sys/net/ipv4/ip_forward'

Ce réglage n’est pas permanent, au redémarrage de la machine serveur, il ne sera pas appliqué. Pour le rendre permanent, on modifie le fichier /etc/sysctl.conf en décommentant la ligne suivante :

net.ipv4.ip_forward = 1

On configure iptables ensuite pour que le sous-réseau utilise l’adresse IP publique du serveur :

sudo iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE

Comme le réglage précédent, celui-ci n’est pas permanent. Pour le rendre automatique au démarrage du serveur, les commandes suivantes doivent être exécutées.

On sauvegarde tout d’abord les règles iptables actuelles :

sudo sh -c "iptables-save > /etc/iptables.rules"

On édite ensuite le fichier /etc/network/interfaces de définition des interfaces de réseau :

sudo nano /etc/network/interfaces

On y ajoute la ligne suivante après la définition de l’interface réseau principale (en général « iface eth0 inet… ») :

pre-up iptables-restore < /etc/iptables.rules

On peut maintenant passer à la création des comptes clients.

Création d’un compte client

Pour la création d’un compte client openvpn, on doit créer un couple clé/certificat pour chaque client amené à se connecter au serveur.

On va ici créer un utilisateur machine-cliente.

cd /etc/openvpn/easy-rsa
source vars
./build-key machine-cliente

Vous devez alors répondre à différentes questions pour la génération du certificat.

Le script génère 3 fichiers dans le répertoire /etc/openvpn/easy-rsa/keys :

  • machine-cliente.crt qui correspond au certificat du client ;
  • machine-cliente.csr qui correspond au Certificat Signing Request du client à conserver sur le serveur ;
  • machine-cliente.key qui correspond à la clé correspondante au certificat du client ;

Ces fichiers doivent être à disposition du serveur dans un sous-répertoire du répertoire de configuration pour chaque client. On crée tout d’abord le répertoire nécessaire :

sudo mkdir /etc/openvpn/clientconf/machine-cliente/

On copie les fichiers nécessaires dans ce répertoire :

sudo cp /etc/openvpn/ca.crt /etc/openvpn/ta.key keys/machine-cliente.crt keys/machine-cliente.key /etc/openvpn/clientconf/machine-cliente/

Il est alors nécessaire de créer le fichier de configuration du client dans le même répertoire. On se déplace donc dans ce répertoire :

cd /etc/openvpn/clientconf/machine-cliente/

Et on crée le fichier client.conf :

sudo nano client.conf

Dans lequel on indique les éléments suivants (n’oubliez pas de remplacer le nom du certificat et de la clé ainsi que les XXX.XX.XX.XX par l’adresse IP du serveur) :

# Client
client
dev tun
proto tcp-client
remote XXX.XX.XX.XX 444
resolv-retry infinite
cipher AES-256-CBC

# Cles
ca ca.crt
cert machine-cliente.crt
key machine-cliente.key
tls-auth ta.key 1 

# Securite
nobind
persist-key
persist-tun
comp-lzo
verb 3

Pour que ce fichier de configuration puisse être utilisé par le client windows, on copie le fichier de configuration dans un nouveau fichier avec l’extension ovpn :

sudo cp client.conf client.ovpn

On crée enfin un fichier machine-cliente.zip qui sera à fournir à l’utilisateur afin qu’il puisse configurer son logiciel client :

sudo zip machine-cliente.zip *.*

Lancement du serveur

Il suffit ensuite de lancer le serveur :

sudo /etc/init.d/openvpn start