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