Voici un exemple d’installation de OpenVPN sous Debian. Voici le prérequis à celle-ci qu’il vous faudra bien entendu adapter à votre environnement.
Prérequis
- Serveur Debian 12 Bookworm
- UFW installé et configuré
- Accès root ou sudo
Personnellement j’utilise aptitude
mais si vous utilisez apt
il vous faudra adapter les commandes présentent dans ce tutoriel.
Installation des paquets
sudo aptitude update
sudo aptitude install openvpn easy-rsa
Configuration de l’autorité de certification
On commence par copier les scripts easy-rsa
dans le dossier ̀openvpn
.
sudo mv /usr/share/easy-rsa /etc/openvpn/
cd /etc/openvpn/easy-rsa/
Initialisons l’infrastructure de clé publique (PKI)
sudo ./easyrsa init-pki
Puis créons l’autorité de certification
sudo ./easyrsa build-ca
Génération des certificats serveur
sudo ./easyrsa gen-req server nopass
nopass : cette option permet de ne pas mettre de mot de pas côté serveur, vous pourriez choisir de ne pas l’utiliser mais attention cela signifie qu’en cas de reboot openvpn aura besoin de la saisie du mot de passe et donc d’une intervention manuelle.
Il existe une alternative qui consiste à créer un fichier sur le serveur qui contiendrait le mot de passe en clair et d’ajouter à la configuration de openvpn
askpass /path_to_password/pass.txt
Mais en cas d’intrusion et de récupération de ce fichier, l’attaquant aura accès au déchiffrement de la clé, donc c’est un peu l’équivalent à nopass. J’extrapole un peu, mais l’idée est là.
Maintenant on signe le certificat serveur, on génère les paramètres Diffie-Hellman et la clé la clé TLS-auth
sudo ./easyrsa sign-req server server
sudo ./easyrsa gen-dh
sudo openvpn --genkey --secret /etc/openvpn/ta.key
Création du fichier de configuration de OpenVPN
Voci un script qui va permettre de créer le fichier /etc/openvpn/server/server.conf
#!/bin/bash
GREEN=$'\e[0;32m'
RED=$'\e[0;31m'
NC=$'\e[0m'
if [ ! -d "/etc/openvpn" ]; then
echo "${RED}OpenVPN doesn't seem to be installed; Install OpenVPN before executing thins script.${NC}"
exit 1
fi
read -p "${GREEN}Which OpenVPN do you want to use [1194] ?${NC} " OPENVPN_PORT
read -p "${GREEN}Which primary DNS do you want to use [8.8.8.8] ?${NC} " OPENVPN_PRIMARY_DNS
read -p "${GREEN}Which secondary DNS do you want to use [8.8.4.4] ?${NC} " OPENVPN_SECONDARY_DNS
cat > "/etc/openvpn/server/server.conf" << EOL
port ${OPENVPN_PORT:-1194}
proto udp
dev tun
ca /etc/openvpn/pki/ca.crt
cert /etc/openvpn/pki/issued/server.crt
key /etc/openvpn/pki/private/server.key
dh /etc/openvpn/pki/dh.pem
# Network
server 10.8.0.0 255.255.255.0
ifconfig-pool-persist /var/log/openvpn/ipp.txt
# Routing
push "redirect-gateway def1 bypass-dhcp"
push "dhcp-option DNS ${OPENVPN_PRIMARY_DNS:-8.8.8.8}"
push "dhcp-option DNS ${OPENVPN_SECONDARY_DNS:-8.8.4.4}"
# Security
data-ciphers AES-256-GCM:AES-128-GCM:AES-256-CBC:CHACHA20-POLY1305
cipher AES-256-GCM
auth SHA256
tls-auth /etc/openvpn/ta.key 0
tls-version-min 1.2
# Performance
keepalive 10 120
# Security
user nobody
group nogroup
persist-key
persist-tun
# Logs
status /var/log/openvpn/openvpn-status.log
log-append /var/log/openvpn/openvpn.log
verb 3
explicit-exit-notify 1
# Security
remote-cert-tls client
EOL
echo "${GREEN}Server configuration file /etc/openvpn/server/server.conf created.${NC}"
Le port par défaut est celui de OpenVPN, donc 1194, et les DNS sont ceux de Google (8.8.8.8 et 8.8.4.4).
Configuration du routage d’IP
Activation du forwarding d’IP
echo 'net.ipv4.ip_forward=1' | sudo tee -a /etc/sysctl.conf
sudo sysctl -p
Configuration de UFW
Il faut tout d’abord identifier l’interface réseau
ip route show default
Le résultat doit ressembler à
default via 192.168.1.1 dev eth0
ce qui signifie que l’interface est eth0
Ensuite il faut configurer les règles NAT dans UFW
sudo nano /etc/ufw/before.rules
en ajoutant au début du fichier après les commentaires initiaux
# START OPENVPN RULES
# NAT table rules
*nat
:POSTROUTING ACCEPT [0:0]
# Allow traffic from OpenVPN client to your main interface (remplacez eth0 par votre interface)
-A POSTROUTING -s 10.8.0.0/8 -o eth0 -j MASQUERADE
COMMIT
# END OPENVPN RULES
Remplacez eth0
par votre interface qui a été trouvée dans l’étape précédente
Il faut maintenant configurer la politique de forwarding de UFW du fichier
sed -i 's/DEFAULT_FORWARD_POLICY="DROP"/DEFAULT_FORWARD_POLICY="ACCEPT"/g' /etc/default/ufw
et enfin autoriser OpenVPN au niveau de ufw
sudo ufw allow 1194/udp
sudo ufw disable
sudo ufw enable
Démarrage de OpenVPN
Création du répertoire de log
sudo mkdir -p /var/log/openvpn
Activation du service et démarrage de celui-ci
sudo systemctl enable openvpn@server
sudo systemctl start openvpn@server
et pour vérifier que tout se passe bien
sudo systemctl status openvpn@server
Création client OpenVPN
Voilà, OpenVPN est installer, mais ce n’est pas terminé, il faut maintenant créer un ou des clients.
Pour faciliter la création d’un (ou des) client, voici un script que vous pouvez nommer comme vous le souhaitez
par exemple openvpn-client-generator.sh
#!/bin/bash
GREEN=$'\e[0;32m'
RED=$'\e[0;31m'
NC=$'\e[0m'
if [ $# -ne 1 ]; then
echo "${GREEN}Usage: $0 <client_name>${NC}"
exit 1
fi
CLIENT_NAME="$1"
SERVER_IP=$(curl -4 -s ifconfig.me)
OPENVPN_PORT=$(grep port /etc/openvpn/server/server.conf|cut -d' ' -f2)
cd /etc/openvpn/easy-rsa/
./easyrsa gen-req "${CLIENT_NAME}"
./easyrsa sign-req client "${CLIENT_NAME}"
cat > "/etc/openvpn/client/${CLIENT_NAME}.ovpn" << EOL
client
dev tun
proto udp
remote ${SERVER_IP} ${OPENVPN_PORT}
resolv-retry infinite
nobind
persist-key
persist-tun
data-ciphers AES-256-GCM:AES-128-GCM:AES-256-CBC:CHACHA20-POLY1305
cipher AES-256-GCM
auth SHA256
remote-cert-tls server
tls-version-min 1.2
key-direction 1
verb 3
<ca>
$(cat /etc/openvpn/pki/ca.crt)
</ca>
<cert>
$(cat /etc/openvpn/easy-rsa/pki/issued/${CLIENT_NAME}.crt)
</cert>
<key>
$(cat /etc/openvpn/easy-rsa/pki/private/${CLIENT_NAME}.key)
</key>
<tls-auth>
$(cat /etc/openvpn/ta.key)
</tls-auth>
EOL
chmod 600 "/etc/openvpn/client/${CLIENT_NAME}.ovpn"
echo "${GREEN}Client file /etc/openvpn/client/${CLIENT_NAME}.ovpn created.${NC}"
Et donc on peut maintenant créer un client avec la commande
openvpn-client-generator.sh john_doe
Une fois le fichier client générer il ne reste plus qu’à le récupérer via scp
ou en copiant/collant le contenu sur la machine cible,
et à configurer l’application OpenVPN ou le VPN via Network Manager de la machine.
Voici également un script qui va facilter la gestion des clients, qu’on peut appeler openvpn-client-manager.sh
#!/bin/bash
GREEN=$'\e[0;32m'
RED=$'\e[0;31m'
NC=$'\e[0m'
case "$1" in
list)
echo "${GREEN}Clients certificates${NC}"
ls -la /etc/openvpn/easy-rsa/pki/issued/ | grep -v server
echo ""
echo "${GREEN}Clients configuration files${NC}"
ls -la /etc/openvpn/client/*.ovpn 2>/dev/null || echo "${RED}No .ovpn file found${NC}"
echo ""
echo "${GREEN}Currently connected clients${NC}"
cat /var/log/openvpn/openvpn-status.log 2>/dev/null | grep "10.8.0" || echo "${RED}No client connected${NC}"
;;
create)
if [ -z "$2" ]; then
echo "${GREEN}Usage: $0 create <client_name>${NC}"
exit 1
fi
/etc/openvpn/openvpn-client-generator.sh "$2"
;;
revoke)
if [ -z "$2" ]; then
echo "${GREEN}Usage: $0 revoke <client_name>${NC}"
exit 1
fi
echo "${GREEN}Client $2 certificate revocation.${NC}"
cd /etc/openvpn/easy-rsa/
./easyrsa revoke "$2"
./easyrsa gen-crl
cp pki/crl.pem /etc/openvpn/
grep -q "crl-verify" /etc/openvpn/server/server.conf || echo "crl-verify crl.pem" | tee -a /etc/openvpn/server/server.conf
systemctl restart openvpn@server
echo "${GREEN}Client $2 revoked and openvpn server restarted.${NC}"
;;
show)
if [ -z "$2" ]; then
echo "${GREEN}Usage: $0 show <client_name>${NC}"
echo ""
exit 1
fi
cat "/etc/openvpn/client/$2.ovpn" 2>/dev/null || echo "${RED}Client $2.ovpn not found.${NC}" && echo ""
;;
*)
echo "${GREEN}Usage: $0 {list|create|revoke|show} [client_name]"
echo ""
echo "Commands :"
echo " list - List all clients"
echo " create <nom> - Create a new client"
echo " revoke <nom> - Revoke client certificate"
echo " show <nom> - Show client configuration"
echo ""
echo "Examples :"
echo " $0 list"
echo " $0 create john_doe"
echo " $0 show john_doe"
echo " $0 revoke john_doe${NC}"
;;
esac
Quelques élément de vérifications
Afin de verifier le bon fonctionnement, voici quelques commandes qui peuvent se montrer très utilise
Vérification du statut de OpenVPN
sudo systemctl status openvpn@server
Vérification d’écoute du port
sudo ss -ulnp | grep $(grep port /etc/openvpn/server/server.conf|cut -d' ' -f2)
Vérification des règles NAT UFW
sudo iptables -t nat -L POSTROUTING -v -n
Vérification du forwarding d’IP
cat /proc/sys/net/ipv4/ip_forward
Vérification UFW
sudo ufw status numbered
Backup
Il est judicieux de prévoir une sauvegarde de OpenVPN
sudo tar -czf openvpn-backup-$(date +%Y%m%d).tar.gz /etc/openvpn/
mais également de la configuration UFW
sudo cp /etc/ufw/before.rules /etc/openvpn/ufw-before.rules.backup
Désinstallation de OpenVPN
Vous pouvez vouloir complètement supprimer OpenVPN de votre système, donc voici la procédure
Arrêter et désactiver le service
sudo systemctl stop openvpn@server
sudo systemctl disable openvpn@server
Supprimer les paquets
sudo aptitude purge openvpn easy-rsa
Supprimer les fichiers de configuration
sudo rm -rf /etc/openvpn/
sudo rm -rf /var/log/openvpn/
Restaurer la configuration réseau
Désactiver le forwarding IP en commentant la ligne net.ipv4.ip_forward=1
dans le fichier /etc/sysctl.conf
et appliquer les changements
sudo sysctl -p
Nettoyer les règles UFW Supprimer la règle du port OpenVPN
sudo ufw delete allow 1194/udp
Nettoyer les règles NAT dans UFW
sudo nano /etc/ufw/before.rules
et supprimez le bloc
# START OPENVPN RULES
# NAT table rules
*nat
:POSTROUTING ACCEPT [0:0]
# Allow traffic from OpenVPN client to your main interface (remplacez eth0 par votre interface)
-A POSTROUTING -s 10.8.0.0/8 -o eth0 -j MASQUERADE
COMMIT
# END OPENVPN RULES
Restaurer la politique de forwarding par défaut
sed -i 's/DEFAULT_FORWARD_POLICY="ACCEPT"/DEFAULT_FORWARD_POLICY="DROP"/g' /etc/default/ufw
Redémarrer UFW
sudo ufw reload
Vérification de suppression
Vérifier qu’OpenVPN n’est plus installé
dpkg -l | grep openvpn
Vérifier qu’aucun processus OpenVPN ne tourne
ps aux | grep openvpn
Vérifier qu’aucun port 1194 n’écoute
sudo ss -ulnp | grep 1194 # ou le port que vous aviez configuré
Vérifier les règles firewall
sudo ufw status
sudo iptables -t nat -L POSTROUTING -v -n