FredVoyage

Installation de OpenVPN avec IPv4 + IPv6

Voici un tutoriel pour installer openVPN sur un serveur qui a une IP publique, à la fois en IPv4 et IPv6. Le but est d'avoir un VPN qui permet à l'ordinateur ou au mobile connecté d'obtenir une adresse IPv4 NAT et une adresse IPv6 publique, par exemple pour se connecter à des sites internet en IPv6 à partir de réseaux dépourvus de ce type d'IP.

Ce tutoriel se base sur une installation de Debian 12 avec une configuration qui a déjà une IPv4 et une IPv6 publique, déjà configurées.

Installation et configuration de openVPN

Tout d'abord, on va installer les paquets pour openVPN et easyRSA pour gérer les certificats :

# apt install openvpn easy-rsa

Ensuite, on crée l'arborescence pour la partie certifcat serveurs avec cette commande :

# make-cadir /var/openvpn-ca && cd /var/openvpn-ca

Puis on modifie dans le fichier vars, les lignes qui contiennent EASYRSA_REQ avec les informations qu'il faut.

Ensuite, on lance la création des clés avec ces commandes :

# ./easyrsa init-pki
# ./easyrsa build-ca
# ./easyrsa gen-req server nopass
# ./easyrsa sign-req server server
# ./easyrsa gen-dh
# openvpn --genkey --secret pki/ta.key

Ensuite, on va créer la configuration du serveur openVPN de base avec ces commandes :

# cat /usr/share/doc/openvpn/examples/sample-config-files/server.conf | tee /etc/openvpn/server.conf
# cp /var/openvpn-ca/pki/{ca.crt,dh.pem,ta.key} /etc/openvpn
# cp /var/openvpn-ca/pki/issued/server.crt /etc/openvpn
# cp /var/openvpn-ca/pki/private/server.key /etc/openvpn

Une fois en place, on modifie le fichier /etc/openvpn/server.conf pour avoir ces lignes avec les bonnes valeurs :

ca ca.crt
cert server.crt
key server.key
dh dh.pem
;tls-auth ta.key 0
tls-crypt ta.key

A la fin du fichier, on va ajouter ces lignes pour gérer l'IPv6 (c'est votre préfixe dédié pour le VPN :

server-ipv6 2a0a:xxxx:xxxx:xxxx::/64
push "route-ipv6 2000::/3"

Configuration du pare-feu

Pour que le réseau du VPN soit bien connecté au réseau internet sur lequel le serveur est connecté, il faut autoriser le forward d'IP.

Dans le fichier /etc/sysctl.conf, on active ces 2 lignes (dé-commenter ou ajouter les lignes si absentes) :

net.ipv4.ip_forward=1
net.ipv6.conf.all.forwarding=1

Puis on active la nouvelle configuration avec ces commandes :

# sysctl -p
# systemctl start openvpn@server
# systemctl enable openvpn@server

Dans la configuration iptables, on va ajouter ces règles, au début de la configuration actuelle :

-A INPUT -i eno1 -m state --state NEW -p udp --dport 1194 -j ACCEPT
-A INPUT -i tun+ -j ACCEPT
-A FORWARD -i tun+ -j ACCEPT
-A FORWARD -i tun+ -o eno1 -m state --state RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -i eno1 -o tun+ -m state --state RELATED,ESTABLISHED -j ACCEPT

Puis à la fin du même fichier :

*nat
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
-A POSTROUTING -s 10.8.0.0/24 -o eno1 -j MASQUERADE
COMMIT

Ensuite on configure ip6tables en ajoutant cela :

-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
-A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A FORWARD -i tun0 -o eno1 -s 2a0a:xxxx:xxxx:xxxx::/64 -m state --state NEW -j ACCEPT
-A FORWARD -i tun0 -m state --state ESTABLISHED,RELATED -j ACCEPT

Puis, à la fin du même fichier :

*nat
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
-A POSTROUTING -s 2a0a:xxxx:xxxx:xxxx::/64 -o eno1 -j MASQUERADE
COMMIT

N'oubliez pas d'appliquer la configuration de iptables et ip6tables et de vous assurer que celle-ci persiste bien d'un reboot à l'autre.

Configuration des certificats clients

Le nom du client pour l'exemple est client3, à remplacer par le nom que vous choisissez, il doit être différent pour chaque client.

On va exécuter ces commandes pour configurer un certificat client :

# cd /var/openvpn-ca
# ./easyrsa gen-req client3 nopass
# ./easyrsa sign-req client client3

Puis on va créer le dossier /root/client3 dans lequel on exécute ces commandes :

# cp pki/private/client3.key /root/client/
# cp pki/issued/client3.crt /root/client/
# cp pki/{ca.crt,ta.key} /root/client/
# cp /usr/share/doc/openvpn/examples/sample-config-files/client.conf /root/client/

On modifie ensuite le fichier client.conf avec les bonnes informations (l'IP est l'IP publique du serveur) :

remote xxx.xxx.xxx.xxx 1194
user nobody
group nogroup
;ca ca.crt
;cert client.crt
;key client.key
;tls-auth ta.key 1
key-direction 1

Enfin, on crée le fichier /var/openvpn-ca/config_gen.sh qui va permettre de créer le fichier .ovpn pour déployer le certificat :

#!/bin/bash
KEY_DIR=/root/client
OUTPUT_DIR=/root
BASE_CONFIG=/root/client/client.conf
cat ${BASE_CONFIG}
    <(echo -e '<ca>')
    ${KEY_DIR}/ca.crt
    <(echo -e '</ca> <cert>')
    ${KEY_DIR}/${1}.crt
    <(echo -e '</cert> <key>')
    ${KEY_DIR}/${1}.key
    <(echo -e '</key> <tls-crypt>')
    ${KEY_DIR}/ta.key
    <(echo -e '</tls-crypt>')
    > ${OUTPUT_DIR}/${1}.ovpn

Enfin, on exécute le fichier config_gen.sh avec ces commandes :

# chmod 700 /var/openvpn-ca/config_gen.sh
# ./config_gen.sh client3

Le fichier client3.ovpn permet de déployer le certificat et la configuration simplement en chargeant le fichier sur n'importe quel ordinateur, mobile ou tablette avec openVPN déjà installé.