OpenVPN configuration d'un vpn point à point
Le VPN (Virtual Private Network) est un réseau privé, qui permet de connecter plusieurs réseaux de manière chiffrée à travers une connexion non sécurisée. Ici nous allons utiliser OpenVPN créée par James Yonan en 2002. OpenVPN est l'une des solutions qui existe parmi beaucoup d'autres mais à l'immense avantage d’être sous licence GNU GPL et d'être disponible sur plusieurs OS.
OpenVPN création d'un réseaux virtuel
Pour la mise en œuvre de ce howto, nous avons besoin de deux machines. Un serveur j'utiliserai pour cela une machine virtuelle sous FreeBSD que nous avons créée précédemment. Pour faire office de client ma machine de tous les jours qui tourne sous Archlinux.
Topo de départ :
- Serveur
- FreeBSD 11.0
- IP 192.168.100.80
- Client
- Archlinux
- IP : 192.168.100.110
Serveur OpenVPN
Installation d'openvpn sous FreeBSD
pkg install openvpn
Créer le répertoire de configuration et copier le fichier exemple openvpn.conf.
mkdir /usr/local/etc/openvpn
cp /usr/local/share/examples/openvpn/sample-config-files/openvpn.conf
On va aussi récupérer le dossier "easy-rsa" grâce auquel, on va générer facilement toutes les clés et certificats nécessaire.
cp -r /usr/local/share/easy-rsa /usr/local/etc/openvpn/easy-rsa
cd /usr/local/etc/openvpn/easy-rsa
Nous allons éditer le fichier vars pour l'adapter à notre situation
set_var EASYRSA_REQ_COUNTRY "FR" set_var EASYRSA_REQ_PROVINCE "PARIS" set_var EASYRSA_REQ_CITY "PARIS" set_var EASYRSA_REQ_ORG "BINSP" set_var EASYRSA_REQ_EMAIL "contactAROBASEbinspPOINTnet" set_var EASYRSA_REQ_OU "BINSP"
Pour une sécurité plus pérenne modifier la taille de la clé
set_var EASYRSA_KEY_SIZE 4096
Vous pouvez aussi modifier la date de validité par défaut de 10 ans
#set_var EASYRSA_CA_EXPIRE 3650 #set_var EASYRSA_CERT_EXPIRE 3650
Nous allons maintenant initialiser l'infrastructure de clé publique
./easyrsa.real init-pki
Note: using Easy-RSA configuration from: ./vars init-pki complete; you may now create a CA or requests. Your newly created PKI dir is: /usr/local/etc/openvpn/easy-rsa/pki
Nous allons maintenant créer notre autorité de certification qui nous demandera un mot de passe et le "COMMON NAME" de votre autorité
./easyrsa.real build-ca
Note: using Easy-RSA configuration from: ./vars Generating a 4096 bit RSA private key .................................................++ writing new private key to '/usr/local/etc/openvpn/easy-rsa/pki/private/ca.key.Yc6EXjoQg5' Enter PEM pass phrase: ""******"" Verifying - Enter PEM pass phrase : ""******"" ----- You are about to be asked to enter information that will be incorporated .. ----- Common Name (eg: your user, host, or server name) \[Easy-RSA CA\]: BINSP -- Your new CA certificate file for publishing is at: /usr/local/etc/openvpn/easy-rsa/pki/ca.crt
Nous allons maintenant générer les certificats pour notre serveur
Si vous ne voulez pas fournir de mot de passe au lancement du serveur. Il faut ajouter l'option nopass à votre ligne de commande
./easyrsa.real build-server-full openvpn-server nopass
Note: using Easy-RSA configuration from: ./vars Generating a 4096 bit RSA private key ...........................................................++ ............++ writing new private key to '/usr/local/etc/openvpn/pki/private/server.key.Z6kUgRYl7Y' ----- Using configuration from /usr/local/etc/openvpn/openssl-1.0.cnf Enter pass phrase for /usr/local/etc/openvpn/pki/private/ca.key:""******"" Check that the request matches the signature Signature ok commonName :ASN.1 12:'server' Certificate is to be certified until Dec 29 13:34:47 2026 GMT (3650 days) Write out database with 1 new entries Data Base Updated
Nous allons maintenant créer un certificat pour notre client (attention chaque client devra avoir son propre certificat)
./easyrsa.real build-client-full client1
Note: using Easy-RSA configuration from: ./vars Generating a 4096 bit RSA private key ..................................................................++ writing new private key to '/usr/local/etc/openvpn/pki/private/client1.key.f1RXvpmPYP' Enter PEM pass phrase:""******"" Verifying - Enter PEM pass phrase:""******"" ----- Using configuration from /usr/local/etc/openvpn/openssl-1.0.cnf Enter pass phrase for /usr/local/etc/openvpn/pki/private/ca.key:""******"" Check that the request matches the signature Signature ok .. commonName :ASN.1 12:'client1' Certificate is to be certified until Dec 29 13:37:14 2026 GMT (3650 days) Write out database with 1 new entries Data Base Updated
Création des paramètres Diffie-Hellman (cela prend un certain temps)
./easyrsa.real gen-dh
Note: using Easy-RSA configuration from: ./vars Generating DH parameters, 4096 bit long safe prime, generator 2 This is going to take a long time ............+.........+................................................. .................................................+.+................+.. .......................+.............................+................. ...............................................................++*++* DH parameters of size 4096 created at /usr/local/etc/openvpn/pki/dh.pem
Pour une sécurité accrue et pour bloquer les attaques de type DoS et bloquer les flood sur les ports UDP générez une clé statique
cd /usr/local/etc/openvpn
mkdir keys
openvpn --genkey --secret keys/static.key
Voila, nous disposons de tous les fichiers pour sécuriser notre liaison.
ca.crt # Certificat Root CA : Serveur et client dh.pem # Paramétre de Diffie Hellman : Serveur issued/client1.crt # Certificat client : Client issued/server.crt # Certificat serveur : Serveur private/client1.key # Clé client : Client 1 et seulement lui private/server.key # Clé serveur : Serveur
Nous allons maintenant placer les fichiers nécessaire au serveur
cd /usr/local/etc/openvpn
mkdir keys
cd esay-rsa/pki
cp dh.pem ca.crt issued/server.crt private/server.key /usr/local/etc/openvpn/keys
Configuration serveur openvpn
Modifions maintenant la configuration (/usr/local/etc/openvpn.conf) en fonction des fichiers que nous avons généré
... ca /usr/local/etc/openvpn/keys/ca.crt cert /usr/local/etc/openvpn/keys/server.crt key /usr/local/etc/openvpn/keys/server.key ... dh /usr/local/etc/openvpn/keys/dh.pem ... tls-auth /usr/local/etc/openvpn/keys/static.key 0 .. cipher AES-256-CBC
Lancement du service openvpn
Ajoutons le script pour un lancement au démarrage du serveur puis démarrons-le.
echo "openvpn_enable='YES'" >> /etc/rc.conf
service openvpn start
S'il n'y a pas d'erreur, nous pouvons voir la création de tun0 avec la commande ifconfig
tun0: flags=8051<UP,POINTOPOINT,RUNNING,MULTICAST> metric 0 mtu 1500 options=80000<LINKSTATE> inet6 fe80::50df:5371:e1c2:f2a1%tun0 prefixlen 64 tentative scopeid 0x3 inet 10.8.0.1 --> 10.8.0.2 netmask 0xffffffff nd6 options=29<PERFORMNUD,IFDISABLED,AUTO_LINKLOCAL> groups: tun Opened by PID 4158
Client OpenVPN
Passons maintenant à notre client vpn
Installation sous ArchLinux
pacman -S openvpn
Nous récupérons de manière sécurisée les clés précédemment générées
cd /etc/openvpn
mkdir keys
cd keys
scp root@192.168.100.80:/usr/local/etc/openvpn/static.key .
scp root@192.168.100.80:/usr/local/etc/openvpn/pki/ca.crt .
scp root@192.168.100.80:/usr/local/etc/openvpn/pki/issued/client1.crt .
scp root@192.168.100.80:/usr/local/etc/openvpn/pki/private/client1.key .
Configuration du client
Copier le fichier de configuration "example"
cp /usr/share/openvpn/examples/client.conf /etc/openvpn/client/
Modifions le fichier openvpn.conf
remote 192.168.100.80 1194 ... ca /etc/openvpn/keys/ca.crt cert /etc/openvpn/keys/client.crt key /etc/openvpn/keys/client1.key .. tls-auth /etc/openvpn/keys/static.key 1 .. cipher AES-256-CBC
Connection au serveur
Nous pouvons maintenant, nous connecter à notre serveur vpn.
cd /etc/openvpn
openvpn client/client.conf
Nous voilà connecté à la machine distante et avons une nouvelle ip.
ip a 8: tun0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UNKNOWN group default qlen 100 link/none inet 10.8.0.6 peer 10.8.0.5/32 scope global tun0 valid_lft forever preferred_lft forever inet6 fe80::18a:d158:e6e5:59a9/64 scope link flags 800 valid_lft forever preferred_lft forever