====== OpenVPN - Installation d'un serveur VPN ======
--- //[[nekan@shyrkasystem.com|Nicolas THOREZ]] 2022/08/03 08:44//
Un VPN (//**V**irtual **P**rivate **N**etwork//) est, comme son nom l'indique, un réseau privé virtuel. Il s'agit d'une connexion entre 2 points distants (têtes de pont) créant un liaison (tunnel ou pont) et permettant à des ordinateurs distant de partager des informations et des services comme s'ils étaient sur le même réseau privé. Le tunnel étant généralement chiffré et son accès étant assujetti à une authentification spécifique (AD, LDAP, certificat, PAM, etc...), le VPN permet de sécuriser l'accès à des services n'ayant pas d'autres systèmes de sécurisation ou de donner un accès distant à des services n'ayant pas de moyen de publication sécurisée.
Niveau VPN, on trouve 2 types de tunnels :
* site à site : le tunnel connecte 2 réseaux distants pour n'en former qu'un seul. Les flux sont généralement bi-directionnels. Ce tunnel utilise la plupart du temps le protocole **IPSec**.
* client-server : Un poste client se connecte à un serveur en utilisant un protocole tel que **PPTP** (déconseillé car non sécurisé), **L2TP**, **SSTP**, **SSL**, etc... Le client rejoint ainsi le réseau distant. Les flux sont alors uni-directionnels, ils ne peuvent être initialisé que de puis le client.
''OpenVPN'' existe en tant que serveur et en tant que client et utilise le protocole SSL.
Attention, cette procédure nécessite des droits ''root''. La plus grande prudence est donc requise.
===== Installation =====
Cette procédure nécessite un pare-feu fonctionnel. Je me baserai donc sur ''IPTables'' (Procédure d'installation trouvable [[iptables|ici]]).
* En prérequis, le système doit pouvoir foire transiter les paquets. Pour cela, on modifiera le fichier ''/etc/sysctl.conf'' :
sed -i 's/#net.ipv4.ip_forward=1/net.ipv4.ip_forward=1/' /etc/sysctl.conf
sysctl -p
* On installe les paquets nécessaires :
apt update && apt install -y openvpn easy-rsa
==== Création de l'autorité de certification ====
* ''OpenVPN'' a besoin d'un certificat serveur et d'une autorité permettant de valider les certificats clients.
* On initialise le **PKI** (//**P**ublic **K**ey **I**nfrastructure//)
cd /usr/share/easy-rsa/
./easyrsa init-pki --keysize=4096 --digest=sha512
* On crée l'autorité de certification :
./easyrsa --keysize=4096 --digest=sha512 build-ca nopass
* Lors de la création du certificat, le système nous demande de renseigner le nom commun du l'autorité. Cette information n'est pas obligatoire mais permet de retrouver l'objet du certificat, utile donc surtout si on a plusieurs certificats.
* On crée le certificat serveur (on remplace ''server'' par le nom de notre serveur) :
./easyrsa --keysize=4096 --digest=sha512 build-server-full server nopass
* On crée la clé Diffie-Hellman :
./easyrsa --keysize=4096 --digest=sha512 gen-dh
* On crée la clé d'authentification TLS :
openvpn --genkey secret ./pki/ta.key
* On met en place un raccourci vers les certificats dans le dossier de ''OpenVPN'' ainsi qu'un raccourci pour la commande principale :
ln -sf /usr/share/easy-rsa /etc/openvpn/easy-rsa
ln -sf /usr/share/easy-rsa/easyrsa /bin/easyrsa
==== Configuration du serveur ====
* On copie la configuration par défaut dans notre serveur :
cp /usr/share/doc/openvpn/examples/sample-config-files/server.conf /etc/openvpn/
* On édite le fichier ''/etc/openvpn/server.conf'' et on modifie/active les paramètres suivants :
* **local** : adresse local d'écoute du serveur.
* **port** : le port d'écoute, généralement ''1194''.
* **proto** : le protocole, généralement ''udp''.
* **dev** : le type d'interface, on choisira ''tun''.
* **ca** : le chemin et le nom du certificat de l'autorité, donc ''easyrsa/ca.crt''
* **cert** : le chemin et le nom du certificat du serveur, donc ''easyrsa/pki/issued/server.crt'' (//server// devant être remplacé par le nom choisi précédemment).
* **key** : le chemin et le nom de la clé privée correspondant au certificat serveur, donc ''easyrsa/pki/private/server.key'' (//server// devant être remplacé par le nom choisi précédemment).
* **dh** : le chemin et le nom de la clé Diffie-Hellman, donc ''easyrsa/pki/dh.pem''.
* **server** : la plage d'adressage du réseau VPN. Cette plage ne doit pas être présente nativement sur le réseau du serveur et du client (sinon, il y aura un conflit de routage). A noter que le serveur VPN aura automatiquement l'adresse ''.1''.
* **client-config-dir** : le chemin du dossier qui contiendra les configurations des clients. On utilisera ''/etc/openvpn/ccd'' (on évitera le dossier ''client'' qui correspond plutôt au configuration d'un client openvpn qui se connecter sur un autre serveur et non aux informations des clients se connectant à ce serveur).
* **keepalive** : la fréquence en secondes des ping vers le client et le timeout.
* **tls-auth** : le chemin et le nom de la clé d'authentification TLS, soit ''server/ta.key''.
* **cipher** : le protocole de chiffrement utilisé, par défaut ''AES-256-GCM''.
* **comp-lzo** : on décommente ce paramètre pour activer la compression.
* **user** : permet de réduire les droits de ''OpenVPN'' après initialisation. On choisira ''nobody''.
* **group** : même raison que **user**. On choisira ''nogroup''.
* **persist-key** : permet de garder la clé en mémoire pour les négociation malgré la réduction des droits de ''OpenVPN''.
* **persist-tun** : pareil, pour les ressources réseaux.
* **status** : le chemin et le nom du fichier de log pour le status du serveur et des clients connectés.
* **log** : le chemin et le nom du fichier de log de connexions.
* **verb** : la verbosité des logs, Par défaut, ce paramètre est à ''3''.
* On ajoute aussi les lignes suivantes pour des besoins spécifiques :
* **management 127.0.0.1 8989** : à ajouter si on souhaite ajouter une interface de gestion.
* **script-security 2** : à ajouter pour activer règles de pare-feu automatiques (nécessaire pour la compatibilité des clients Linux).
* **ccd-exclusive** : à ajouter pour activer règles de pare-feu automatique.
* **client-connect /etc/openvpn/ovpn_connect.sh** : à ajouter pour activer règles de pare-feu automatique (le script ajoute les règles IPTables à la connexion du client).
* **client-disconnect /etc/openvpn/ovpn_disconnect.sh** : à ajouter pour activer règles de pare-feu automatique (le script supprime les règles IPTables à la connexion du client).
* **plugin /usr/lib/openvpn/openvpn-plugin-auth-pam.so openvpn"** : à ajouter pour utiliser la double authentification Google.
* **auth-gen-token 86400** : permet de redemander une authentification des clients toutes les 24h (86400s).
* **reneg-sec 86400** : limite la renégociation avec les clients à 1/jour (86400s).
* On n'oublie pas de créer le dossier des configurations clientes :
mkdir /etc/openvpn/ccd
=== Déploiement des routes communes ===
Si le VPN doit déployer des routes communes à tous les utilisateurs, il est préférable de les ajouter dans la configuration du serveur en ajoutant pour chaque route une entrée de type :
push "route address mask"
Exemple :
push "route 8.8.8.8 255.255.255.255"Pour chaque route ajoutée de cette manière, il ne faudra pas oublier d'ajouter les règles de pare-feu correspondantes (voir plus bas).
=== Déploiement du DNS ===
Si chaque utilisateur du VPN doivent utiliser un serveur DNS spécifique, on peut là aussi l'ajouter directement dans la configuration serveur avec une entrée de type (on remplace //address// par l'adresse IP du serveur DNS à utiliser) :
push "dhcp-option DNS address"
De plus, si ce serveur DNS doit résoudre des domaines privés, il est nécessaire d'en informer les clients en ajoutant dans la configuration serveur la ligne suivantes :
push "dhcp-option DOMAIN ~."
==== Pare-feu ====
* Si on a suivi la procédure d'installation de ''IPTables'', il nous faut ajouter les règles nécessaires. Dans les exemples suivants, il faudra remplacer les valeurs :
* **1194** : port d'écoute.
* **172.16.0.0/24** : réseau client.
* **10.0.0.1** : adresse principale du serveur.
* **tun0** : nom de l'interface virtuelle du tunnel (0 pour le 1er ou si il n'y en a qu'un puis +1 pour les suivant).
* **ens192** : nom de l'interface réseau hébergeant l'interface virtuelle.
* **172.16.0.49** : adresse du client.
* **10.1.1.1** : adresse du serveur à atteindre au travers du VPN.
* **10.0.0.0/8** : réseau du serveur ''OpenVPN''
* On ajoute donc le fichier ''/etc/iptables.d/40-openvpn'' dont le contenu est :
*filter
# Allow OpenVPN connections
-A INPUT -p udp --dport 1194 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
COMMIT
* On ajoute aussi le fichier de post-routing ''/etc/iptables.d/60-postrouting'' dont le contenu est :
#================#
# Partie serveur #
#================#
*nat
# Source-NAT pour toutes les connexions entrantes vers OpenVPN
-A POSTROUTING -o ens192 -s 172.16.0.0/24 -j SNAT --to-source 10.0.0.1
COMMIT
#==========================================#
# Partie clients pour chaque route commune #
#==========================================#
*filter
# Autorisation à créer selon chaque route commune sous la forme :
# -I FORWARD -i tun0 -o ens192 -s 172.16.0.0/24 -d 10.1.1.1 -j ACCEPT -m comment --comment "DNAT vers serv1"
# -I FORWARD -i ens192 -o tun0 -s 10.1.1.1 -d 172.16.0.0/24 -j ACCEPT -m comment --comment "SNAT depuis serv1"
#========================================================================================#
# Finalisation (doit toujours se trouver à la fin, après les règles de tous les clients) #
#========================================================================================#
# On drop tous les flux qui ne sont pas explicitement autorisés
-A FORWARD -s 172.16.0.0/24 -d 10.0.0.0/8 -j DROP
COMMIT
* On recharge les IPTables :
service iptables restart
==== Démarrage du service ====
* Le serveur étant prêt, on peut lancer le service et ouvrir la tête de pont :
service openvpn@server startSi vous avez ajouté les options pour l'interface de gestion et le 2FA, le services ne démarrera que lorsque ces modules seront installés.
===== Ajout d'une interface de gestion =====
L'interface **OVPN-ADMIN** est un projet open source sous licence Apache 2.0.
Source : [[https://github.com/flant/ovpn-admin/blob/master/README.md|GitHub]]Les scripts de connexions et de déconnexions sont inspirés des travaux de **juris**.
Source : [[https://gist.github.com/juris/1a3123d20afbfb12900caebf351f47f4|GitHub]]
Pour ajouter l'interface de gestion, il est nécessaire d'ajouter les paramètres nécessaires dans la configuration serveur (voir au dessus). Ensuite :
* On télécharge les sources :
cd /tmp
wget https://github.com/flant/ovpn-admin/releases/download/2.0.1/ovpn-admin-linux-amd64.tar.gz
tar -xvf ovpn-admin-linux-amd64.tar.gz
mv ovpn-admin /etc/openvpn/
* On crée le modèle de routage client ''/etc/openvpn/ccd.tpl'' :
{{- if (ne .ClientAddress "dynamic") }}
ifconfig-push {{ .ClientAddress }} 255.255.255.0
{{- end }}
{{- range $route := .CustomRoutes }}
push "route {{ $route.Address }} {{ $route.Mask }}" # {{ $route.Description }}
{{- end }}
* On crée le modèle de configuration client ''/etc/openvpn/client.conf.tpl''
# Configuration automatique via ovpn-admin
client
dev tun
dev-node ClientVPN
{{- range $server := .Hosts }}
proto {{ $server.Protocol }}
remote {{ $server.Host }} {{ $server.Port }}
{{- end }}
nobind
persist-key
persist-tun
comp-lzo
verb 4
# uncomment below lines for use with Google 2FA
#auth-user-pass
cipher AES-256-GCM
key-direction 1
tls-client
remote-cert-tls server
auth-nocache
explicit-exit-notify 1
reneg-sec 86400
# uncomment below lines for use with linux
#script-security 2
# if you use resolved
#up /etc/openvpn/update-resolv-conf
#down /etc/openvpn/update-resolv-conf
# if you use systemd-resolved first install openvpn-systemd-resolved package
#up /etc/openvpn/update-systemd-resolved
#down /etc/openvpn/update-systemd-resolved
{{ .Cert -}}
{{ .Key -}}
{{ .CA -}}
{{ .TLS -}}
* On crée le script de démarrage de l'interface ''/etc/openvpn/launch_ovpn_admin.sh'' :
#!/bin/bash
# Variables
OVPN_LISTEN_HOST=127.0.0.1 # Adresse de l'hôte
OVPN_LISTEN_PORT=8088 # Port de l'hôte
OVPN_NETWORK=172.16.0.0/24 # Plage réseau des clients OpenVPN
OVPN_SERVER=1.2.3.4:1194:udp # Adresse, port et protocole d'écoute pour OpenVPN
OVPN_MGMT=127.0.0.1:8989 # Adresse et port de l'interface de gestion OpenVPN (pour les appels API)
OVPN_METRICS_PATH="/metrics" # URL pour les métriques (pour Grafana)
EASYRSA_PATH="/etc/openvpn/easyrsa" # Racine pour easy-RSA
OVPN_INDEX_PATH="/etc/openvpn/easyrsa/pki/index.txt" # Chemin de la base de données pour les certificats gérés
OVPN_CCD_PATH="/etc/openvpn/ccd" # Stockage des configurations clientes
OVPN_TEMPLATES_CC_PATH="/etc/openvpn/client.conf.tpl" # Chemin du modèle de configuration cliente
OVPN_TEMPLATES_CCD_PATH="/etc/openvpn/ccd.tpl" # Chemin du modèle de routage client
LOG_LEVEL="debug" # Niveau de log
/etc/openvpn/ovpn-admin \
--listen.host=$OVPN_LISTEN_HOST \
--listen.port=$OVPN_LISTEN_PORT \
--log.level=$LOG_LEVEL \
--easyrsa.path=$EASYRSA_PATH \
--easyrsa.index-path=$OVPN_INDEX_PATH \
--ovpn.network=$OVPN_NETWORK \
--ovpn.server=$OVPN_SERVER \
--metrics.path=$OVPN_METRICS_PATH \
--ccd \
--ccd.path=$OVPN_CCD_PATH \
--templates.ccd-path=$OVPN_TEMPLATES_CCD_PATH \
--templates.clientconfig-path=$OVPN_TEMPLATES_CC_PATH &
* On rend le script exécutable :
chmod +x /etc/openvpn/launch_ovpn_admin.sh
* On met en place une tâche planifiée pour s'assurer de l'exécution de l'interface :
echo "# Daemon de gestion des clients OpenVPN" > /etc/cron.d/ovpn-admin
echo '*/10 * * * * root [ "$(pidof -x ovpn-admin)" ] || /etc/openvpn/launch_ovpn_admin.sh &' >> /etc/cron.d/ovpn-admin
* On créé le script de création automatique des règles IPTables à la connexion du client ''/etc/openvpn/ovpn_connect.sh'' :
#!/bin/bash
#########################################################################
# #
# Script de création des règles IPTables à la connexion d'un client #
# #
#########################################################################
#-----------#
# Variables #
#-----------#
# Chemin des configurations clientes
CCD_DIR="/etc/openvpn/ccd"
# Interface de sortie du serveur
IF_OVPN="ens160"
#-----------------------------------------------#
# Memento des variables automatiques de OpenVPN #
#-----------------------------------------------#
# $common_name Identifiant du client (fichier de configuration, certificat, etc...)
# $ifconfig_pool_remote_ip Adresse IP affecté au client par OpenVPN
# $dev Interface réseau du tunnel OpenVPN
#------------#
# Traitement #
#------------#
# Traitement si il y a une configuration cliente
if [ -f $CCD_DIR/$common_name ]; then
# Configuration existante, on extrait les routes à établir
grep "^push \"route" $CCD_DIR/$common_name | tr -d '"' | \
# Boucle de création des règles
while read LINE; do
# Extraction de l'adresse
ADDRESS=$(echo $LINE | cut -f3 -d" ")
# Extraction du masque
NETMASK=$(echo $LINE | cut -f4 -d" ")
# Mise en forme des commentaires
COMMENT=$(echo $LINE | cut -d"#" -f2)
DNAT_COMMENT="$common_name DNAT vers $COMMENT"
SNAT_COMMENT="$common_name SNAT vers $COMMENT"
# Ajout de la règle de DNAT
sudo /sbin/iptables -I FORWARD -i $dev -o $IF_OVPN -s $ifconfig_pool_remote_ip/32 -d $ADDRESS/$NETMASK -j ACCEPT -m comment --comment "$DNAT_COMMENT"
# Ajout de la règle de SNAT
sudo /sbin/iptables -I FORWARD -i $IF_OVPN -o $dev -s $ADDRESS/$NETMASK -d $ifconfig_pool_remote_ip/32 -j ACCEPT -m comment --comment "$SNAT_COMMENT"
done
fi
exit 0
* On créé le script de suppression automatique des règles IPTables à la déconnexion du client ''/etc/openvpn/ovpn_disconnect.sh'' :
#!/bin/bash
############################################################################
# #
# Script de suppression des règles IPTables à la déconnexion du client #
# #
############################################################################
#-----------------------------------------------#
# Memento des variables automatiques de OpenVPN #
#-----------------------------------------------#
# $common_name Identifiant du client (fichier de configuration, certificat, etc...)
# $ifconfig_pool_remote_ip Adresse IP affecté au client par OpenVPN
# $dev Interface réseau du tunnel OpenVPN
#------------#
# Traitement #
#------------#
# On vérifie la présence de règles pour le client
MAX=$(sudo /sbin/iptables -nL FORWARD --line-numbers | grep -E "[[:blank:]]$common_name[[:blank:]]" | wc -l)
if [[ $MAX -gt 0 ]]; then
# On supprime toutes les règles de FORWARD contenant l'identifiant de l'utilisateur dans les commentaires
for ((i=1;i<=$MAX;i++)); do
# On récupère le numéro de la règle à supprimer
RULE=$(sudo /sbin/iptables -nL FORWARD --line-numbers | grep -m 1 -E "[[:blank:]]$common_name[[:blank:]]" | awk '{print $1}')
# On supprimme la règle
sudo /sbin/iptables -D FORWARD $RULE
done
fi
exit 0
* On rend ces scripts exécutables :
chmod +x /etc/openvpn/ovpn_connect.sh
chmod +x /etc/openvpn/ovpn_disconnect.sh
L'interface est désormais disponible mais elle est accessible par n'importe qui. On va donc installer un proxy ''Apache'' devant pour ajouter une authentification de base. Du coup :
* On installe les paquets nécessaires :
apt install -y apache2
* On ajoute la configuration ''/etc/apache2/sites-available/ovpn-admin.conf'' :
ServerAdmin mon.adresse@mail.tld
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
ProxyPass / http://127.0.0.1:8088/
ProxyPassReverse / http://127.0.0.1:8088/
ProxyRequests Off
AuthType Basic
AuthName "Restricted Area"
AuthUserFile "/etc/apache2/password.file"
Require valid-user
SSLEngine On
SSLCertificateFile /etc/ssl/certs/ssl-cert-snakeoil.pem
SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key
* On crée le mot de passe :
htpasswd -c /etc/apache2/password.file ovpn-admin
* On active les modules ''ssl'', ''proxy'' et ''proxy_http'' :
a2enmod ssl
a2enmod proxy
a2enmod proxy_http
* On active le site :
a2ensite ovpn-admin.conf
* On redémarre ''Apache'' :
service apache2 restart
L'interface est maintenant disponible après authentification à l'adresse https://adresse_du_serveur :
{{ :linux:openvpn:ovpn_001.png |}}
===== Ajout de la double authentification Google =====
Pour activer le 2FA de Google, il faut au préalable ajouter le plugin dans la configuration serveur (voir plus haut). Ensuite :
* On installe les paquets nécessaires :
apt install -y libqrencode4 libpam-google-authenticator
* On crée le script de création de 2FA ''/etc/openvpn/create-2fa.sh'' :
#!/bin/bash
# Variables
SCRIPT_PATH="/etc/openvpn"
CCD="$SCRIPT_PATH/ccd"
# Usage
get-help() {
echo "Usage : ./create-2fa.sh user"
echo " user doit être un nom d'utilisateur tel qu'il apparaît dans les configurations clientes de OpenVPN, dans le dossier ccd."
exit 1
}
# Test présence utilisateur
if [ -z "$1" ]; then
get-help
elif [ ! -f $CCD/$1 ]; then
get-help
fi
# Utilisateur existant, création du dossier
useradd $1 -m -s /bin/bash
# Création du google authenticator
su -c "google-authenticator -t -f -d -r 3 -R 30 -w 17 --label=\"OpenVPN ${1}\"" $1
# Mise à jour des droits
chmod 400 /home/${1}/.google_authenticator
chmod 700 /home/${1}
* On rend le script exécutable :
chmod +x /etc/openvpn/create-2fa.sh
* On modifie le service ''/lib/systemd/system/openvpn@.service'' et on le recharge :
sed -i 's/ProtectHome=true/ProtectHome=false/g' /lib/systemd/system/openvpn@.service
systemctl daemon-reload
* On crée la configuration PAM ''/etc/pam.d/openvpn'' :
cp /etc/pam.d/common-account /etc/pam.d/openvpn
* On modifie cette configuration pour y ajouter en 1ère ligne :
auth required pam_google_authenticator.so authtok_prompt=pin
* On redémarre le service :
service openvpn@server restart
Pour créer un 2FA pour un utilisateur, il suffit de lancer le script ''/etc/openvpn/create-2fa.sh user'' où ''user'' est le nom de l'utilisateur tel qu'il apparaît dans le dossier ''/etc/openvpn/ccd/'' et/ou dans l'interface d'administration ''ovpn-admin''. Le script crée le compte utilisateur local affiche un QRcode qu'il faudra scanner depuis l'application mobile ''Google Authenticator''. Il demande alors un code de validation pour terminer la création.
Pour la suite, lorsque l'utilisateur se connecte au VPN, il lui sera demander un code fourni par l'application mobile pour pouvoir se connecter.
===== Clients sans l'interface de gestion =====
Cette procédure devra être suivie pour chaque client devant se connecter au serveur. Chaque configuration sera donc unique.
* On commence par créer le certificat client (on remplace ''client'' par l'identifiant du client, NOMPrenom par exemple) :
cd /usr/share/easy-rsa
./easyrsa --keysize=4096 --digest=sha512 build-client-full client nopass
* On crée le fichier client selon son poste :
* Pour Windows, à mettre dans ''%USERPROFILE%/openvpn/config'' du poste client'', client.ovpn'' dont le contenu est :
* **1.2.3.4 1194** : Adresse publique du serveur et port d'écoute.
* **dev-node** : Remplacer ''ClientVPN'' par le nom de l'interface réseau virtuel (Interface TAP-9)
client
dev tun
dev-node ClientVPN
proto udp
remote 1.2.3.4 1194
nobind
persist-key
persist-tun
comp-lzo
verb 4
# uncomment below lines for use with Google 2FA
#auth-user-pass
cipher AES-256-GCM
key-direction 1
tls-client
remote-cert-tls server
auth-nocache
explicit-exit-notify 1
reneg-sec 86400
# keys
ca chemin_vers_le_fichier_ca.crt
cert chemin_vers_le_fichier_client.crt
key chemin_vers_le_fichier_client.key
tls-auth chemin_vers_le_fichier_ta.key 1
* Pour Linux, à mettre dans ''/etc/openvpn/'' du poste client, ''client.conf'' dont le contenu est :
client
dev tun
proto udp
remote 1.2.3.4 1194
nobind
persist-key
persist-tun
comp-lzo
verb 4
# uncomment below lines for use with Google 2FA
#auth-user-pass
data-cipher AES-256-GCM
key-direction 1
tls-client
remote-cert-tls server
auth-nocache
explicit-exit-notify 1
reneg-sec 86400
# uncomment below lines for use with linux
script-security 2
# if you use resolved
#up /etc/openvpn/update-resolv-conf
#down /etc/openvpn/update-resolv-conf
# if you use systemd-resolved first install openvpn-systemd-resolved package
#up /etc/openvpn/update-systemd-resolved
#down /etc/openvpn/update-systemd-resolved
# keys
ca chemin_vers_le_fichier_ca.crt
cert chemin_vers_le_fichier_client.crt
key chemin_vers_le_fichier_client.key
tls-auth chemin_vers_le_fichier_ta.key 1
* Il faut ensuite inscrire le client sur le serveur, dans le dossier ''/etc/openvpn/ccd/'' (on remplace ''client'' par le nom choisi précédemment) :
nano /etc/openvpn/ccd/client
* Le contenu de ce fichier indique :
* l'adresse IP que le serveur donne au client et l'adresse de sa passerelle. A noter que pour chaque client, une plage de 4 adresses est utilisée :
* **réseau** : adresse du client -1
* **client** : adresse du client
* **passerelle** : adresse du client +1
* **broadcast** : adresse du client +2
* les options de DHCP (sauf si ajouté dans la partie serveur)
* les options de DNS (sauf si ajouté dans la partie serveur)
* les différentes routes vers les serveurs dont les accès sont autorisés
* Exemple :
# Configuration pour le client "client"
ifconfig-push 172.16.0.5 176.16.0.6
push-reset
push "dhcp-option DNS 10.0.0.1"
push "dhcp-option DOMAIN ~."
push "route 10.0.1.1 255.255.255.255"
push "route 10.0.1.2 225.255.255.255"
* Il ne manque plus qu'à rajouter dans ''/etc/iptables.d/60-postrouting'', les règles ''IPTables'' permettant le routage des flux. Dans cette exemple :
* **172.16.0.5** est l'adresse du client.
* Pour le serveur **10.0.1.1**, les ports HTTP(S) (80 et 443) seront autorisés.
* Pour le serveur **10.0.1.2**, le port SSH (22) sera autorisé.
...
# Autorisation pour client
-I FORWARD -i tun0 -o ens192 -s 172.16.0.5 -d 10.0.1.1 -p tcp --dport 80 -j ACCEPT
-I FORWARD -i tun0 -o ens192 -s 172.16.0.5 -d 10.0.1.1 -p tcp --dport 443 -j ACCEPT
-I FORWARD -i ens192 -o tun0 -s 10.0.1.1 -d 172.16.0.49 -j ACCEPT
-I FORWARD -i tun0 -o ens192 -s 172.16.0.5 -d 10.0.1.2 -p tcp --dport 22 -j ACCEPT
-I FORWARD -i ens192 -o tun0 -s 10.0.1.2 -d 172.16.0.49 -j ACCEPT
...
* On oublie pas de recharger les règles ''IPTables'' :
service iptables restartEt voilà ! Vous disposez d'un serveur OpenVPN et d'un configuration cliente permettant de s'y connecter.
===== Clients avec l'interface de gestion =====
* On se connecte à l'interface et on clique sur ''Add user'' :
{{ :linux:openvpn:ovpn_002.png |}}
* Dans la fenêtre qui apparaît, on entre le nom de l'utilisateur et on clique sur ''Create'' :
{{ :linux:openvpn:ovpn_003.png |}}
* Le compte apparaît alors en bas de la liste. On crée sa configuration de base en cliquant sur ''Edit routes'' :
{{ :linux:openvpn:ovpn_004.png |}}
* Si l'utilisateur n'utilise que les routes communes, on clique directement sur ''Save'' :
{{ :linux:openvpn:ovpn_005.png |}}
* Si l'utilisateur utilise des routes spécifiques, on les ajoute une par une en entrant l'adresse IP, le masque et la description de la route puis en cliquant sur ''Add''. Une fois toutes les routes ajoutées, on sauvegarde en cliquant sur ''Save'' :
{{ :linux:openvpn:ovpn_006.png |}}
* On peut alors télécharger la configuration client en cliquant sur ''Download config'' :
{{ :linux:openvpn:ovpn_007.png |}}
~~DISCUSSION~~