OpenVPN

1. Présentation générale

On peut avoir besoin d’utiliser un VPN (“Virtual Private Network”) pour masquer son adresse ip sur internet, et ce pour diverses raisons, notamment dans des pays où la liberté de s’exprimer n’est pas satisfaisante. Une entreprise a aussi intérêt à utiliser des VPN pour ses employés – et éventuellement certains partenaires commerciaux – qui ont besoin d’accéder à des ressources informatiques situées sur le réseau local interne. Le VPN apporte ici une solution simple pour ces utilisateurs, et permet de sécuriser leurs connexions.

Ce billet concerne le logiciel libre OpenVPN, qui utilise le protocole SSLv3/TLSv1, un des protocoles de tunnelisation utilisés pour les VPN. OpenVPN n’est pas compatible avec d’autres logiciels utilisant d’autres de ces protocoles, notamment les logiciels utilisant le protocole IPsec. OpenVPN est disponible pour de nombreux systèmes d’exploitation : la plupart des versions de Windows et de Mac OS X, les systèmes Linux et de la famille BSD, ainsi que Solaris.

OpenVPN se présente sous forme de deux types de logiciels fonctionnant ensemble :
- le serveur OpenVPN sera installé sur un ordinateur du réseau local interne. Les clients OpenVPN se connecteront de l’extérieur à ce serveur, qui leur donnera éventuellement accès à certaines autres ressources du réseau local de l’entreprise.
- les logiciels clients OpenVPN seront installés sur les machines des utilisateurs extérieurs.
OpenVPN peut être utilisé en mode TUN ou bien TAP. Dans la pratique, pour un VPN :
- le mode TAP permet d’établir un pont entre 2 réseaux locaux, un peu comme le fait un commutateur. Ce mode permet de transporter n’importe quel protocole réseau (IPv4 ou v6, IPX, etc). Il accepte aussi le trafic broadcast.
- le mode TUN est limité au protocole IP (y compris IPv6 depuis OpenVPN 2.2.3), sans permettre le trafic broadcast. Dans ce mode OpenVPN se comporte comme un routeur.

Ce billet se limite à l’emploi d’OpenVPN en mode TUN, ce qui convient aux besoins d’un utilisateur à l’extérieur de l’entreprise, qui souhaite que son ordinateur puisse accéder par une connexion sécurisée à certaines ressources informatiques internes à cette entreprise.

 

2. Les principales options

Dans ce qui suit, on suppose que le réseau local interne de votre entreprise qui hébergera le serveur OpenVPN :
- utilise des adresses ip dans la plage 172.20.0.0 à 172.20.255.254,
- a un serveur DNS (qui fait autorité en interne et relais pour internet) en 172.20.255.200,
- dispose en 172.20.255.100 d’un ordinateur sous Ubuntu 13.10 serveur, sur lequel on installera la partie serveur d’OpenVPN,
- possède le nom de domaine “votre_societe.fr”,
- utilise en interne le nom de domaine “votre_societe.net”

Avant d’installer et de configurer OpenVPN, plusieurs décisions sont à prendre.

a) OpenVPN permettra à un client OpenVPN extérieur d’accéder à votre serveur situé en 172.20.255.100.
Mais ce client peut aussi vouloir accéder à d’autres ressources informatiques du réseau local interne de votre entreprise, par exemple :
- accéder à un site web interne (portail, wiki),
- accéder à un serveur de mails interne, par exemple avec un client lourd tel que Outlook ou Thunderbird, avec accès aussi à son calendrier et à son carnet d’adresses professionnelles,
- établir une communication audio ou éventuellement vidéo avec un correspondant situé sur le réseau local interne,
- etc.
Dans tous ces cas, le serveur OpenVPN doit donc servir aussi de relais, par lequel le client OpenVPN extérieur pourra accéder à ces ressources sur le réseau local.
Une partie du paramétrage alors nécessaire ne concerne pas directement OpenVPN, mais le système Ubuntu lui-même de ce serveur. Toutefois, dans le cas d’un tel choix, la configuration d’OpenVPN serveur doit en tenir compte : voir ci-après, 3.2.

b) OpenVPN peut utiliser les protocoles tcp ou udp.
Ce choix pose la question de l’environnement dans lequel se trouveront les clients OpenVPN, à l’extérieur de l’entreprise. Ces clients peuvent être informatiquement nomades, et opérer à partir de réseaux locaux (à domicile, à l’hôtel, en clientèle) dont on ignore a priori qui les administre, et si des blocages sont à redouter.
Par prudence on écartera donc le protocole udp. Il permet certes un encapsulage plus performant du trafic – qui, lui, est généralement en tcp –, mais il est susceptible d’être plus souvent bloqué par l’administrateur du réseau local hébergeant temporairement le client OpenVPN.

c) Par défaut OpenVPN utilise le port 1194, mais le serveur et les clients OpenVPN peuvent utiliser n’importe quel port tcp . Par ailleurs OpenVPN chiffre la communication.
Mais le problème ici est la présence possible, sur le réseau local hébergeant le client OpenVPN, d’un firewall bloquant certains ports tcp et n’autorisant, pas exemple, que les ports 80 ou 443 : on rencontre de telles situations en entreprise, où peut se trouver temporairement un utilisateur client de votre OpenVPN.
Un problème supplémentaire est que l’administrateur d’un tel firewall peut alors aussi bloquer le trafic chiffré sur le port 80, en partant du principe que ce port est celui du trafic http, qui n’est normalement pas chiffré. Généralement, un tel blocage ne concerne alors pas le port 443, car ça signifierait interdire totalement toute communication https sur ce port.
Il en résulte que la prudence incite à configurer les clients OpenVPN pour qu’ils se connectent par le port 443. Bien évidemment, ce port sera alors celui de la NAT statique à paramétrer sur le routeur du réseau local de votre entreprise, mais ce choix n’impose rien quant au choix du port tcp sur lequel écoutera votre serveur OpenVPN.

Toutefois, il faut être conscient que le chiffrement SSL de OpenVPN ne se confond pas totalement avec le trafic https, ce que des dispositifs de type DPI peuvent détecter.
Ce risque de se voir bloquer le protocole OpenVPN est particulièrement important pour les utilisateurs dans des pays où la liberté de s’exprimer n’est pas satisfaisante. Dans ce cas diverses solutions complémentaires sont disponibles, comme obfsproxy ou stunnel.

 

3. Installation et configuration de OpenVPN

3.1. Installation du serveur OpenVPN et génération du certificat et des clés

Installer les paquets nécessaires :
apt-get install openvpn easy-rsa

Si on veut utiliser les exemples installés avec OpenVPN :
cd /usr/share/doc/openvpn/examples/sample-config-files/
cp server.conf.gz /etc/openvpn/
gzip -d /etc/openvpn/server.conf.gz

 

Créer un utilisateur et un groupe openvpn :
groupadd openvpn
useradd –d /dev/null –g openvpn –s /bin/false openvpn
chown openvpn:openvpn –R /etc/openvpn

Il faut créer un certificat pour ce serveur OpenVPN. On utilisera ici un certificat auto-signé. L’autorité de certification s’appellera Votre_Societe_CA.

Déplacer le répertoire easy-rsa :
mkdir /etc/openvpn/easy-rsa/
cp -r /usr/share/easy-rsa/* /etc/openvpn/easy-rsa/

Dans le répertoire /etc/openvpn/easy-rsa/, supprimer éventuellement les fichiers :
- openssl-0.9.6.cnf
- openssl-0.9.8.cnf

Ajuster /etc/openvpn/easy-rsa/vars :
export KEY_SIZE=4096
export CA_EXPIRE=xxxx
(nombre de jours jusqu’à la date de validité choisie)
export KEY_EXPIRE = xxxx
export KEY_COUNTRY="FR"
export KEY_PROVINCE="Paris"
export KEY_CITY="Paris"
export KEY_ORG="Votre_Societe"
export KEY_EMAIL="informatique@votre_societe.fr"
export KEY_CN=Votre_Societe_CA
export KEY_NAME=Votre_Societe
export KEY_OU=""

Cette configuration par défaut correspond à l’autorité de certification : Votre_Societe_CA

Dans le répertoire /etc/openvpn/easy-rsa/ :
source vars
./clean-all
./build-ca

On peut valider les options proposées par défaut
Ceci créé, dans le sous-répertoire keys/ :
- la clé privée de l’autorité de certification : ca.key
- le certificat de l’autorité de certification : ca.crt
- le fichier permettant l’incrémentation : serial

Puis :
./build-key-server servername
On peut valider les options par défaut, sauf :
- le Common Name : le hostname du serveur considéré, à la place de Votre_Societe_CA
- éventuellement, l’email address
On signe le certificat
Ceci créé, dans le sous-répertoire keys/ :
- le "Certificate Signing Request" pour ce serveur : servername.csr
- son certificat : servername.crt
- sa clé privée : servername.key
- une version incrémentée de "serial"
- un fichier .pem pour ce serveur

Génération des paramètres Diffie Hellman :
./build-dh
Cette opération peut prendre un certain temps, même sur un ordinateur puissant.
Ceci créé, dans le sous-répertoire keys/ : dh4096.pem

Création de le clé pour utiliser la directive "tls-auth" :
openvpn –genkey –secret ta.key

Certificat et clé d’un premier client OpenVPN :
cd /etc/openvpn/easy-rsa/
source vars
./build-key client1

On peut valider les options par défaut, sauf :
- le Common Name : le hostname du client (si différent de "client1")
Ceci créé, dans le sous-répertoire keys/ :
- le "Certificate Signing Request" pour ce client : client.csr
- son certificat : client1.crt
- sa clé privée : client1.key
- une version incrémentée de "serial"
Il faut copier (d’une façon sécurisée) vers ce "client1" :
- ca.crt
- éventuellement ta.key
- client1.crt
- client1.key
Ces 2 derniers fichiers pourront ensuite être supprimés de ce serveur
(ainsi que client1.csr)

Il faudra répéter cette dernière suite d’opérations pour chaque nouveau client OpenVPN.

 

3.2. Configuration du serveur OpenVPN

Le logiciel OpenVPN est fonctionnellement très riche et ce billet n’a pas l’ambition d’aborder toutes les options disponibles.
On se contentera ici d’une configuration relativement simple, répondant aux besoins exprimés dans la présentation générale de ce billet.

Ce qui suit est alors le contenu du fichier /etc/openvpn/server.conf :

 

# C’est le serveur OpenVPN
mode server
tls-server

# Mode "routeur" et non pas "bridge"
dev tun

# Acces en protocole tcp
# un peu moins performant que udp, mais moins souvent bloque
proto tcp

# Ajustement du MTU
mssfix 1300

# Divers reglages :
keepalive 10 120
persist-key
persist-tun
# compression utilisee
comp-lzo

# A ajuster selon les besoins
max-clients 10

# Les clients OpenVPN doivent y acceder par le port 443
# mais ce serveur OpenVPN est derriere une translation d’adresses
# et donc ce serveur pourrait etre sur un autre port
port 443

# De l’exterieur, on doit pouvoir aussi acceder en https a d’autres services
# heberges sur un serveur 172.20.255.10 (par exemple)
port-share 172.20.255.10 443

##############################################################
# Adressage du lien "tun" a changer si conflit avec          #
# le reseau local distant ou se trouvent les clients OpenVPN #
##############################################################
# le serveur OpenVPN prendra l’adresse ip 192.168.1.1
server 192.168.1.0 255.255.255.0

##################
# Parametres SSL #
##################

# on peut omettre le chemin d’acces si c’est /etc/openvpn/
ca /etc/openvpn/easy-rsa/keys/ca.crt
cert /etc/openvpn/easy-rsa/keys/servername.crt
key /etc/openvpn/easy-rsa/keys/servername.key
dh /etc/openvpn/easy-rsa/keys/dh4096.pem

# Le fichier ta.key doit etre identique a celui utilise
# par les differents clients OpenVPN
# 0 pour le serveur OpenVPN, 1 pour les clients
tls-auth /etc/openvpn/easy-rsa/keys/ta.key 0

# Cryptographie
cipher BF-CBC
# Compression
comp-lzo

##########################################################
# Sur ce lien "tun", le serveur OpenVPN est serveur DHCP #
# et les clients OpenVPN sont clients DHCP.              #
# Ce qui suit, pendant que le VPN est actif,             #
# force la configuration ip des clients OpenVPN.         #
##########################################################

# Tant que OpenVPN est actif, les clients OpenVPN
# connaitront cette route vers le reseau local
push "route 172.20.0.0 255.255.0.0"

# DNS a utiliser et nom du reseau local
push "dhcp-option DNS 172.20.255.200"
push "dhcp-option DOMAIN votre_societe.net"
# la passerelle vers internet
push "redirect-gateway def1"

ifconfig-pool-persist ipp.txt

# Abaissement des privileges
user openvpn
group openvpn

verb 3

# EOF

 

3.3. Configuration du serveur Ubuntu

On veut ici que les clients OpenVPN, en plus d’accéder au serveur OpenVPN, puissent aussi à travers lui accéder à l’ensemble du réseau local interne de l’entreprise. Des tables de routage sont donc à mettre en place.

Installer le paquet iptables-persistent :
apt-get install iptables-persistent

A l’installation de ce paquet les tables sont enregistrées :
- pour IPv4, dans /etc/iptables/rules.v4
- pour IPv6, dans /etc/iptables/rules.v6

Par la suite, dans /etc/init.d/,
la commande ./iptables-persistent save
met à jour ces fichiers rules.v4 et rules.v6

Permettre aux connexions via OpenVPN (interface tun0) d’être relayées vers l’interface ethernet :
iptables -A FORWARD -i tun0 -o eth0 -j ACCEPT

Le serveur OpenVPN sert de routeur dans son réseau :
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

Si on veut aussi que les clients OpenVPN aient accès à internet via ce VPN :
iptables -t nat POSTROUTING -s 192.168.1.0/24 -o eth0 -j MASQUERADE

 

4. Les clients OpenVPN

On trouve aisément des clients de OpenVPN. On trouve même de nombreux logiciels gratuits, par exemple :
- de très nombreuses distributions actuelles de Linux contiennent de tels clients,
- sous Windows on pourra utiliser OpenVPN GUI (à exécuter en tant qu’Administrateur),
- sous Mac OS X, l’outil VPN Tunnelblick.

La configuration de ces clients passe par des interfaces graphiques qu’il n’est évidemment pas possible de toutes décrire ici. En règle générale, on y retrouve les données qui figurent dans le fichier ci-dessous :

# Client OpenVPN
client

# Mode "routeur" et non pas "bridge"
dev tun

# Acces en protocole tcp
# un peu moins performant que udp, mais moins souvent bloque
proto tcp

# Adresse du serveur OpenVPN, via internet
remote votre_societe.fr 443

# Divers reglages
resolv-retry infinite
nobind
persist-key
persist-tun

##################
# Parametres SSL #
##################

# on peut omettre le chemin d’acces si c’est /etc/openvpn/
ca ca.crt
# remplacer si necessaire client par le nom correspondant
cert client.crt
key client.key
# Le fichier ta.key doit etre identique a celui utilise
# par le serveur OpenVPN et les differents clients OpenVPN
# 0 pour le serveur OpenVPN, 1 pour les clients
tls-auth ta.key 1

# Cryptographie
cipher BF-CBC
# Compression
comp-lzo

# Verifie qu’on est bien en communication avec un serveur OpenVPN
# et pas avec un autre ordinateur qui essaye une attaque "man-in-the-middle"
ns-cert-type server

verb 3

# EOF

 

Dans certains cas, la configuration du client OpenVPN se constitue précisément d’un tel fichier texte : le client OpenVPN GUI permet d’utiliser un tel fichier texte en guise de configuration.

 

 

Remarque importante :

Il faut être conscient qu’un ordinateur configuré en client VPN, surtout s’il s’agit d’un ordinateur portable nomade, représente un très grave danger informatique potentiel : grâce à lui, un voleur pourrait accéder facilement à une grande partie des ressources informatiques internes de votre entreprise.

Des mesures renforcées de protection de tels ordinateurs doivent donc être mises en oeuvre, par exemple :
- chiffrement de volume (avec TrueCrypt ou un système équivalent),
- utilisation d’une machine virtuelle elle-même protégée par un chiffrement fort.