Afficher la pageAnciennes révisionsLiens de retourHaut de page Cette page est en lecture seule. Vous pouvez afficher le texte source, mais ne pourrez pas le modifier. Contactez votre administrateur si vous pensez qu'il s'agit d'une erreur. ====== OpenVPN - Installation d'un serveur VPN ====== <label type="success">Création</label> --- //[[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. <callout type="danger" title="Droits" icon="true">Attention, cette procédure nécessite des droits ''root''. La plus grande prudence est donc requise.</callout> ===== Installation ===== <callout type="danger" title="Pare-feu" icon="true">Cette procédure nécessite un pare-feu fonctionnel. Je me baserai donc sur ''IPTables'' (Procédure d'installation trouvable [[iptables|ici]]).</callout> * En prérequis, le système doit pouvoir foire transiter les paquets. Pour cela, on modifiera le fichier ''/etc/sysctl.conf'' : <sxh bash>sed -i 's/#net.ipv4.ip_forward=1/net.ipv4.ip_forward=1/' /etc/sysctl.conf sysctl -p</sxh> * On installe les paquets nécessaires : <sxh bash>apt update && apt install -y openvpn easy-rsa</sxh> ==== 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//) <sxh bash>cd /usr/share/easy-rsa/ ./easyrsa init-pki --keysize=4096 --digest=sha512</sxh> * On crée l'autorité de certification : <sxh bash>./easyrsa --keysize=4096 --digest=sha512 build-ca nopass</sxh> * 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) : <sxh bash>./easyrsa --keysize=4096 --digest=sha512 build-server-full server nopass</sxh> * On crée la clé Diffie-Hellman : <sxh bash>./easyrsa --keysize=4096 --digest=sha512 gen-dh</sxh> * On crée la clé d'authentification TLS : <sxh bash>openvpn --genkey secret ./pki/ta.key</sxh> * On met en place un raccourci vers les certificats dans le dossier de ''OpenVPN'' ainsi qu'un raccourci pour la commande principale : <sxh bash>ln -sf /usr/share/easy-rsa /etc/openvpn/easy-rsa ln -sf /usr/share/easy-rsa/easyrsa /bin/easyrsa</sxh> ==== Configuration du serveur ==== * On copie la configuration par défaut dans notre serveur : <sxh bash>cp /usr/share/doc/openvpn/examples/sample-config-files/server.conf /etc/openvpn/</sxh> * 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 : <sxh bash>mkdir /etc/openvpn/ccd</sxh> === 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 : <sxh bash>push "route address mask"</sxh> Exemple : <sxh bash>push "route 8.8.8.8 255.255.255.255"</sxh> <callout type="warning" title="IPTables" icon="true">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).</callout> === 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) : <sxh bash>push "dhcp-option DNS address"</sxh> 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 : <sxh bash>push "dhcp-option DOMAIN ~."</sxh> ==== 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 : <sxh bash>*filter # Allow OpenVPN connections -A INPUT -p udp --dport 1194 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT COMMIT</sxh> * On ajoute aussi le fichier de post-routing ''/etc/iptables.d/60-postrouting'' dont le contenu est : <sxh bash>#================# # 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</sxh> * On recharge les IPTables : <sxh bash>service iptables restart</sxh> ==== Démarrage du service ==== * Le serveur étant prêt, on peut lancer le service et ouvrir la tête de pont : <sxh bash>service openvpn@server start</sxh> <callout type="warning" title="Options supplémentaires" icon="true">Si 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.</callout> ===== Ajout d'une interface de gestion ===== <callout type="info" title="Interface" icon="true">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]]</callout> <callout type="info" title="Script" icon="true">Les scripts de connexions et de déconnexions sont inspirés des travaux de **juris**. Source : [[https://gist.github.com/juris/1a3123d20afbfb12900caebf351f47f4|GitHub]]</callout> 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 : <sxh bash>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/</sxh> * On crée le modèle de routage client ''/etc/openvpn/ccd.tpl'' : <sxh>{{- if (ne .ClientAddress "dynamic") }} ifconfig-push {{ .ClientAddress }} 255.255.255.0 {{- end }} {{- range $route := .CustomRoutes }} push "route {{ $route.Address }} {{ $route.Mask }}" # {{ $route.Description }} {{- end }}</sxh> * On crée le modèle de configuration client ''/etc/openvpn/client.conf.tpl'' <sxh># 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> {{ .Cert -}} </cert> <key> {{ .Key -}} </key> <ca> {{ .CA -}} </ca> <tls-auth> {{ .TLS -}} </tls-auth> </sxh> * On crée le script de démarrage de l'interface ''/etc/openvpn/launch_ovpn_admin.sh'' : <sxh bash>#!/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 & </sxh> * On rend le script exécutable : <sxh bash>chmod +x /etc/openvpn/launch_ovpn_admin.sh</sxh> * On met en place une tâche planifiée pour s'assurer de l'exécution de l'interface : <sxh>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</sxh> * On créé le script de création automatique des règles IPTables à la connexion du client ''/etc/openvpn/ovpn_connect.sh'' : <sxh bash>#!/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 </sxh> * On créé le script de suppression automatique des règles IPTables à la déconnexion du client ''/etc/openvpn/ovpn_disconnect.sh'' : <sxh bash>#!/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 </sxh> * On rend ces scripts exécutables : <sxh bash>chmod +x /etc/openvpn/ovpn_connect.sh chmod +x /etc/openvpn/ovpn_disconnect.sh</sxh> 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 : <sxh bash> apt install -y apache2</sxh> * On ajoute la configuration ''/etc/apache2/sites-available/ovpn-admin.conf'' : <sxh><VirtualHost *:443> 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 <Location /> AuthType Basic AuthName "Restricted Area" AuthUserFile "/etc/apache2/password.file" Require valid-user </Location> SSLEngine On SSLCertificateFile /etc/ssl/certs/ssl-cert-snakeoil.pem SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key </VirtualHost></sxh> * On crée le mot de passe : <sxh>htpasswd -c /etc/apache2/password.file ovpn-admin</sxh> * On active les modules ''ssl'', ''proxy'' et ''proxy_http'' : <sxh bash>a2enmod ssl a2enmod proxy a2enmod proxy_http</sxh> * On active le site : <sxh bash>a2ensite ovpn-admin.conf</sxh> * On redémarre ''Apache'' : <sxh>service apache2 restart</sxh> L'interface est maintenant disponible après authentification à l'adresse https://adresse_du_serveur : <image shape="thumbnail">{{ :linux:openvpn:ovpn_001.png |}}</image> ===== 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 : <sxh bash>apt install -y libqrencode4 libpam-google-authenticator</sxh> * On crée le script de création de 2FA ''/etc/openvpn/create-2fa.sh'' : <sxh bash>#!/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} </sxh> * On rend le script exécutable : <sxh bash>chmod +x /etc/openvpn/create-2fa.sh</sxh> * On modifie le service ''/lib/systemd/system/openvpn@.service'' et on le recharge : <sxh bash>sed -i 's/ProtectHome=true/ProtectHome=false/g' /lib/systemd/system/openvpn@.service systemctl daemon-reload</sxh> * On crée la configuration PAM ''/etc/pam.d/openvpn'' : <sxh bash>cp /etc/pam.d/common-account /etc/pam.d/openvpn</sxh> * On modifie cette configuration pour y ajouter en 1ère ligne : <sxh>auth required pam_google_authenticator.so authtok_prompt=pin</sxh> * On redémarre le service : <sxh bash>service openvpn@server restart</sxh> 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 ===== <callout type="info" title="Unicité" icon="true">Cette procédure devra être suivie pour chaque client devant se connecter au serveur. Chaque configuration sera donc unique.</callout> * On commence par créer le certificat client (on remplace ''client'' par l'identifiant du client, NOMPrenom par exemple) : <sxh bash>cd /usr/share/easy-rsa ./easyrsa --keysize=4096 --digest=sha512 build-client-full client nopass</sxh> * 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) <sxh>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 </sxh> * Pour Linux, à mettre dans ''/etc/openvpn/'' du poste client, ''client.conf'' dont le contenu est : <sxh>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 </sxh> * 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) : <sxh bash>nano /etc/openvpn/ccd/client</sxh> * 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 : <sxh bash># 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"</sxh> * 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é. <sxh>... # 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 ...</sxh> * On oublie pas de recharger les règles ''IPTables'' : <sxh bash>service iptables restart</sxh> <callout type="success" title="Fini" icon="true">Et voilà ! Vous disposez d'un serveur OpenVPN et d'un configuration cliente permettant de s'y connecter.</callout> ===== Clients avec l'interface de gestion ===== * On se connecte à l'interface et on clique sur ''Add user'' : <image shape="thumbnail">{{ :linux:openvpn:ovpn_002.png |}}</image> * Dans la fenêtre qui apparaît, on entre le nom de l'utilisateur et on clique sur ''Create'' : <image shape="thumbnail">{{ :linux:openvpn:ovpn_003.png |}}</image> * Le compte apparaît alors en bas de la liste. On crée sa configuration de base en cliquant sur ''Edit routes'' : <image shape="thumbnail">{{ :linux:openvpn:ovpn_004.png |}}</image> * Si l'utilisateur n'utilise que les routes communes, on clique directement sur ''Save'' : <image shape="thumbnail">{{ :linux:openvpn:ovpn_005.png |}}</image> * 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'' : <image shape="thumbnail">{{ :linux:openvpn:ovpn_006.png |}}</image> * On peut alors télécharger la configuration client en cliquant sur ''Download config'' : <image shape="thumbnail">{{ :linux:openvpn:ovpn_007.png |}}</image> ~~DISCUSSION~~ openvpn.txt Dernière modification : 2023/08/10 17:17de nekan