Linux – Créer un serveur Openvpn avec EasyRSA

Si vous souhaitez vous installer un serveur OpenVpn à la maison, voici la marche à suivre:

On installe OPenvpn (client/serveur):

sudo apt update
sudo apt install -y openvpn

On récupère easyRSA pour gérer l’infrastructure de clés:
cd ~
wget -P ~/ https://github.com/OpenVPN/easy-rsa/releases/download/v3.0.4/EasyRSA-3.0.4.tgz
tar xvf EasyRSA-3.0.4.tgz
mv EasyRSA-3.0.4 EasyRSA-3.0.4_SRV
tar xvf EasyRSA-3.0.4.tgz
mv EasyRSA-3.0.4 EasyRSA-3.0.4_CA

On extrait deux fois, une fois pour gérer le serveur et une fois pour gérer l’autorité de certification
Ce n’est pas propre, donc en contrepartie on durcira la configuration iptables

On crée les variables pour la CA:
cd ~/EasyRSA-3.0.4_CA
cp vars.example vars
vi vars

On configure suivant nos données:
set_var EASYRSA_REQ_COUNTRY "FR"
set_var EASYRSA_REQ_PROVINCE "IDF"
set_var EASYRSA_REQ_CITY "PARIS"
set_var EASYRSA_REQ_ORG "MAZLINE"
set_var EASYRSA_REQ_EMAIL "admin@mazline.fr"
set_var EASYRSA_REQ_OU "VIP"

On crée les certificats de l’AC
./easyrsa init-pki
./easyrsa build-ca nopass

Validez avec entrée à chaque question puisque nous avons déjà renseigné les variables
Pour le commonName, mettez le nom sous lequel apparaîtra la CA:
Common Name (eg: your user, host, or server name) [Easy-RSA CA]:

On crée les variables pour le serveur:
cd ~/EasyRSA-3.0.4_SRV
cp vars.example vars
vi vars

On configure suivant nos données:
set_var EASYRSA_REQ_COUNTRY "FR"
set_var EASYRSA_REQ_PROVINCE "IDF"
set_var EASYRSA_REQ_CITY "PARIS"
set_var EASYRSA_REQ_ORG "MAZLINE"
set_var EASYRSA_REQ_EMAIL "admin@mazline.fr"
set_var EASYRSA_REQ_OU "VIP"

On crée la structure pour le serveur:
./easyrsa init-pki

On crée la demande de certificat du serveur
./easyrsa gen-req server nopass
Validez avec entrée à chaque question puisque nous avons déjà renseigné les variables
Pour le name, mettez le nom du serveur:
Common Name (eg: your user, host, or server name) [server]:

On copie la clé du serveur dans Openvpn
sudo cp ~/EasyRSA-3.0.4_SRV/pki/private/server.key /etc/openvpn/

On importe la requête et génère le certificat du serveur, dans la CA:
cd ~/EasyRSA-3.0.4_CA
./easyrsa import-req ~/EasyRSA-3.0.4_SRV/pki/reqs/server.req NOM_DU_SERVEUR
./easyrsa sign-req server NOM_DU_SERVEUR

Tapez yes puis entrée

On copie les certificats signés dans openvpn:
sudo cp ~/EasyRSA-3.0.4_CA/pki/issued/server.crt /etc/openvpn/
sudo cp ~/EasyRSA-3.0.4_CA/pki/ca.crt /etc/openvpn/

On crée le random Diffie-hellman pour l’échange serveur/client
cd ~/EasyRSA-3.0.4_SRV
./easyrsa gen-dh
openvpn --genkey --secret ta.key
sudo cp ~/EasyRSA-3.0.4_SRV/ta.key /etc/openvpn/
sudo cp ~/EasyRSA-3.0.4_SRV/pki/dh.pem /etc/openvpn/

On crée un dossier pour les certificats pour les clients:
mkdir -p ~/client-configs/keys
chmod -R 700 ~/client-configs

On génère la demande pour le client et on copie sa clé dans le dossier clients:
./easyrsa gen-req NOM_DU_CLIENT nopass
cp pki/private/NOM_DU_CLIENT.key ~/client-configs/keys/

On importe et signe la demande pour le client
cd ~/EasyRSA-3.0.4_CA
./easyrsa import-req ~/EasyRSA-3.0.4_SRV/pki/reqs/NOM_DU_CLIENT.req NOM_DU_CLIENT
./easyrsa sign-req client NOM_DU_CLIENT

Tapez yes puis entrée

On copie le certificat du client dans le dossier des clients
cp pki/issued/NOM_DU_CLIENT.crt ~/client-configs/keys/
cp ~/EasyRSA-3.0.4_SRV/ta.key ~/client-configs/keys/
sudo cp /etc/openvpn/ca.crt ~/client-configs/keys/

On copie un exemple de configuration openvpn sur le dossier openvpn:
sudo cp /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz /etc/openvpn/
sudo gzip -d /etc/openvpn/server.conf.gz
sudo vi /etc/openvpn/server.conf

On rentre/adapte les infos suivantes dans le fichier server.conf:
Le fichier pour déchiffrer l’authentification
tls-auth ta.key 0 # This file is secret*

On spécifie l’authentification
cipher AES-256-CBC
auth SHA256 #a placer sous l'option cipher

On spécifie le chiffrement de l’échange:
dh dh.pem

On décommente le user et le group:
user nobody
group nogroup

Décommentez la ligne suivante pour forcer l’envoi de DNS au client:
push "redirect-gateway def1 bypass-dhcp"

Décommentez les serveurs DNS à passer au client et mettez vos DNS (ici adguard):
push "dhcp-option DNS 176.103.130.130"
push "dhcp-option DNS 176.103.130.131"

On change le port en 443 pour écouter sur https au cas où le port 1194 serait bloqué en sortie chez le client:
port 443

Si vous souhaitez passer en tcp, changez udp en tcp
proto tcp

Et passez la ligne suivante à 0 si et seulement si vous passez en tcp:
explicit-exit-notify 0

Si vous n’avez pas utilisé le nom server pour la génération des certificats, spécifiez le nom du certificat et de la clé:
cert server.crt
key server.key

On active l’ip forwarding pour la masquerade:
sed -i "s/#net.ipv4.ip_forward=.*/net.ipv4.ip_forward=1/g" /etc/sysctl.conf
sed -i "s/net.ipv4.ip_forward=.*/net.ipv4.ip_forward=1/g" /etc/sysctl.conf

On recharge la configuration pour que le système la prenne de suite
sudo sysctl -p

On récupère l’interface de sortie après le mot dev:
ip route | grep default

On active la mascarade en sortie sur eth0 ou l’interface trouvée par la précédente commande
iptables -t nat -A POSTROUTING -i tun0 -o etho -j MASQUERADE
iptables -A FORWARD -i tun0 -o eth0 -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -i eth0 -o tun0 -m state --state RELATED,ESTABLISHED -j ACCEPT

Voilà, votre serveur est en écoute sur le port 443, plus qu’à contrôler votre iptables et envoyer les fichiers contenus dans le dossier ~/client-configs/keys/ au client:
client.crt
client.key
ca.crt
ta.key

20 janvier 2020