OpenVPN est un VPN SSL se basant sur la création d’un tunnel IP.
Installation du Serveur OpenVPN
On commence par installer le package OpenVPN
apt-get install openvpn
On copie ensuite les fichiers de configurations.
mkdir /etc/openvpn/easy-rsa/
cp -r /usr/share/doc/openvpn/examples/easy-rsa/2.0/* /etc/openvpn/easy-rsa/
chown -R $USER /etc/openvpn/easy-rsa/
Configuration du serveur OpenVPN
On commence par éditer le fichier /etc/openvpn/easy-rsa/vars:
export KEY_COUNTRY="FR"
export KEY_PROVINCE="IDF"
export KEY_CITY="Paris"
export KEY_ORG="martinbranda.eu"
export KEY_EMAIL="dtc@hadopi.fr"
on lance la séquence suivante qui va générer les clés (.key) et les certificats (.crt):
cd /etc/openvpn/easy-rsa/
source vars
./clean-all
./build-dh
./pkitool --pass --initca
./pkitool --pass --server server
openvpn --genkey --secret keys/ta.key
Le password utilisé dans ce cas de figure est PASSWORD
echo 'PASSWORD' > /etc/openvpn/server.password
chmod 0600 /etc/openvpn/server.password
On copie ensuite les clés et les certificats utiles pour le serveur dans le répertoire /etc/openvpn/:
cp keys/ca.crt keys/ta.key keys/server.crt keys/server.key keys/dh1024.pem /etc/openvpn/
Puis on génère un répertoire /etc/openvpn/jail
mkdir /etc/openvpn/jail
mkdir /etc/openvpn/clientconf
Enfin on créé le fichier de configuration /etc/openvpn/server.conf:
# Serveur TCP/443
mode server # c'est le fichier de configuration du serveur
proto tcp
port 443 # port 443 en TCP
dev tun # Utilise l'interface virtuelle tun
# Cles et certificats
ca ca.crt
cert server.crt
key server.key
dh dh1024.pem
tls-auth ta.key 0 # 0 pour le serveur
askpass /etc/openvpn/server.password
cipher AES-256-CBC # algorithme de chiffrement
# Reseau
server 10.8.0.0 255.255.255.0 # adresse IP distribuées aux clients
push "redirect-gateway def1 bypass-dhcp" # redirection du flux de données
push "dhcp-option DNS 4.4.4.4" # Changement des DNS
push "dhcp-option DNS 8.8.8.8" # Changement des DNS
keepalive 10 120 # Test de la connexion avec le client toutes les 10s,
# au bout de 120s de non réponse le client est en timeout.
#ajoute la route au client pour qu'il puisse accéder au VPN
push "route 10.8.0.0 255.255.255.0"
#autorise les clients à se voir entre eux sur le VPN
client-to-client
#Gestion des droits et compression de données
user nobody # Changement de l'utilisateur et du groupe pour l'exécution
group nogroup
chroot /etc/openvpn/jail
persist-key # n'accède plus à certaines options,
persist-tun # car réduction des privilèges utilisateur
comp-lzo # compression des données
# Log
verb 3
mute 20
status openvpn-status.log
; log-append /var/log/openvpn.log
Ce fichier permet de créer un serveur VPN SSL routé basée sur le protocole TCP et utilisant le port HTTPS (443) enfin de maximiser sont accessibilité depuis des réseaux sécurisés par des Firewalls. Les clients obtiendrons une nouvelle adresse IP dans le range 10.8.0.0/24.
On teste la configuration en saisissant la commande suivante:
openvpn /etc/openvpn/server.conf
On doit obtenir les messages suivants:
Initialization Sequence Completed
Si le serveur démarre correctement, on peut terminer la configuration sur serveur OpenVPN en décommentant la dernière ligne du fichier /etc/openvpn/server.conf :
Une fois fait on lance le serveur :
/etc/init.d/openvpn start
A ce stade un client va pouvoir ce connecter au serveur VPN. Par contre impossible d’aller plus loin car l’adresse 10.8.0.x ne sera par routée en dehors de votre serveur. Il faut donc configurer le serveur pour jouer le rôle de routeur entre l’interface VPN (tun0) et l’interface physique (eth0) et de NATeur entre les adresses en 10.8.0.x et son adresse IP réelle.
Configuration du routage:
sh -c ‘echo 1 > /proc/sys/net/ipv4/ip_forward’
Pour rendre ce paramètrage de routage permanant (même après un reboot), il faut ajouter la ligne suivante au fichier /etc/sysctl.conf:
net.ipv4.ip_forward = 1
Configuration du NAT:
sudo iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE
Le serveur est maintenant prêt à accueillir ses clients. Nous allons donc voir comment faire une déclaration de client sur le serveur.
Création d’un compte client OpenVPN
On va créer le client martinbranda
cd /etc/openvpn/easy-rsa
source vars
./build-key martinbranda
Le build-key va générer 3 fichiers dans le répertoire /etc/openvpn/easy-rsa/keys:
martinbranda.crt: Certificat pour le client
martinbranda.csr: Certificat à garder sur le serveur
martinbranda.key: Clés pour le client
On copie les fichiers nécessaires dans un sous répertoire /etc/openvpn/clientconf/ préalablement créé:
mkdir /etc/openvpn/clientconf/martinbranda/
cp /etc/openvpn/ca.crt /etc/openvpn/ta.key keys/martinbranda.crt keys/martinbranda.key /etc/openvpn/clientconf/martinbranda/
On va ensuite dans le répertoire /etc/openvpn/clientconf/martinbranda
Puis on créé le fichier client.conf :
# Client
client
dev tun
proto tcp-client
remote ip_public_serveur 443
resolv-retry infinite
cipher AES-256-CBC
# Cles
ca ca.crt
cert martinbranda.crt
key martinbranda.key
tls-auth ta.key 1
# Securite
nobind
persist-key
persist-tun
comp-lzo
verb 3
Pour assurer la compatibilité avec le client Windows OpenVPN, on fait une copie du fichier client.conf vers client.ovpn:
cp client.conf client.ovpn
Il ne reste plus qu’à mettre ces fichiers dans une archive ZIP et de la transmettre sur le PC client:
zip martinbranda.zip *.*
Attribuer une adresse IP statique à un client VPN
Pour des raisons de sécurité , il est nécessaire d’affecter une adresse IP statique à un client VPN. Pour cela, il faut créer un répertoire qui va contenir les configurations statiques:
mkdir /etc/openvpn/ccd
ln -s /etc/openvpn/ccd /etc/openvpn/jail/ccd
Ensuite on édite à l’intérieur de ce répertoire un fichier correspondant au CNAME (X509) de l’utilisateur dont on veut rendre la configuration statique (par exemple martinbranda):
vi /etc/openvpn/ccd/martinbranda
ifconfig-push 10.8.0.18 10.8.0.17
La syntaxe est la suivante: ifconfig-push @IPCLIENTTUNNELVPN @IPSERVEURTUNNELVPN.
Ainsi quand le client martinbranda se connectera au serveur VPN il obtiendra une adresse en 10.8.0.18. Le bout du tunnel VPN (coté serveur) sera lui en 10.8.0.17.
Révocation d’un certificat client
Si le certificat d’un client à été volé au si ce dernier n’est plus nécessaire, il est important de le révoquer pour qu’il ne puisse plus être utilisé.
Pour révoquer un certificat, il copier les certificats de l’utilisateur à révoquer dans le dossier /etc/openvpn/easy-rsa/keys
La commande suivante permet de révoquer un certificat :
# ./revoke-full martinbranda
Using configuration from /etc/openvpn/easy-rsa/openssl.cnf
DEBUG[load_index]: unique_subject = "yes"
Revoking Certificate 17.
Data Base Updated
Using configuration from /etc/openvpn/easy-rsa/openssl.cnf
DEBUG[load_index]: unique_subject = "yes"
Client01.crt: /
=FR/ST=IDF/O=martinbranda/CN=martinbranda/emailAddress=martinbranda@martinbranda.eu
error 23 at 0 depth lookup:certificate revoked
Remarque : Avec ce script, il ne faut pas mettre l’extension « .crt » du certificat.
A chaque révocation de certificat son numéro est ajouté dans le fichier « keys/crl.pem ». Ce fichier contient donc la liste des certificats révoqués. Après chaque révocation de certificat, il faut donc copier ce fichier dans « /etc/openvpn »
La commande suivante, permet de consulter la liste des certificats révoqués :
# openssl crl -in keys/crl.pem -text
Il faut également ajouter cette ligne dans « etc/openvpn/server.conf » du serveur OpenVPN :
crl-verify crl.pem
Pour information, le fichier « keys/index.txt » contient la liste des certificats créés et révoqués
Pour finir et pour information, lors de la création d’un client, les fichiers suivants sont créés ou modifiés dans « keys/crl.pem »
les connexions VPN
le processus OpenVPN server va écrire toute les minutes un état des clients connectés au serveur dans le fichier /etc/openvpn/openvpn-status.log.
On aura, par exemple, les informations suivantes:
OpenVPN CLIENT LIST
Updated,Fri Jan 21 15:48:06 2011
Common Name,Real Address,Bytes Received,Bytes Sent,Connected Since
client1,27.12.245.248:10086,306367,620864,Fri Jan 21 13:58:25 2011
ROUTING TABLE
Virtual Address,Common Name,Real Address,Last Ref
10.8.0.10,client1,27.12.245.248:10086,Fri Jan 21 15:47:14 2011
GLOBAL STATS
Max bcast/mcast queue length,0
END
Comments
Ab fab my gooldy man.