OpenVPN serveur sur CentOS/RHEL/Fedora

Dans cet article nous allons voir comment installer un serveur OpenVPN sur CentOS/RHEL/Fedora.

Personnellement j’ai pris un VPS Start à 5€99/mois en Hollande (mais il y a aussi l’Allemagne, l’Angleterre ou la Roumanie) chez VPS2Day.
Il dispose de 2 To de bande-passante par mois à 100 Mbps, au-delà le débit est réduit, ce qui me laisse suffisamment de marge.

Aller, on attaque !

Dépôt EPEL

Dans un premier temps il faut installer le dépôt EPEL qui permet l’installation d’OpenVPN avec yum (inutile si vous êtes sous Fedora):

yum install epel-release

Et pour finir on fais un petit update:

yum update

Passons maintenant à OpenVPN et Easy-RSA 😉

Installation d’OpenVPN et Easy-RSA

Tout simple grâce à cette commande:

yum install openvpn easy-rsa -y

On peut enfin s’attaquer à la configuration 🙂

Configuration d’OpenVPN

Les certificats

Il faut commencer par copier les scripts d’Easy-RSA qui vont nous aider à créer les certificats:

mkdir -p /etc/openvpn/easy-rsa/keys
cp -rf /usr/share/easy-rsa/2.0/* /etc/openvpn/easy-rsa

On édite le fichier vars

nano /etc/openvpn/easy-rsa/vars

Pour modifier ces variables:

export KEY_COUNTRY="NL"
export KEY_PROVINCE="Netherland"
export KEY_CITY="Amsterdam"
export KEY_ORG="Ce que vous voulez"
export KEY_EMAIL="votre@adresse.mail"
export KEY_OU="Encore ce que vous voulez"

Pour plus de sécurité vous pouvez également modifier cette ligne:

export KEY_SIZE=2048
  • 1024 (je vous le déconseille)
  • 2048 (standard)
  • 4096 (pour les plus paranos d’entre nous).

Nous allons maintenant créer les différents certificats:

cd /etc/openvpn/easy-rsa
source ./vars
./clean-all
./build-ca
./build-key-server vpn.votre-nom-de.domaine
./build-dh

Attention: si vous avez mis 4096 pour la taille de la clé je vous conseil de rééditer le fichier vars pour y mettre 2048 avant de créer le Diffie-Hellman.

On rapatries les fichiers nécessaires au fonctionnement du VPN:

cp keys/ca.crt keys/vpn.votre-nom-de.domaine.crt keys/vpn.votre-nom-de.domaine.key keys/dh2048.pem /etc/openvpn

Et enfin on sécurise encore un peux plus notre VPN grâce à tls-auth:

cd /etc/openvpn/
openvpn --genkey --secret ta.key

Fichier de configuration du serveur

Voici un fichier de configuration assez complet et sécurisé (de mon point de vue):

nano /etc/openvpn/server.conf
# Configuration de base
lport 443
proto tcp-server
dev tun

# Sécurité
ca ca.crt
cert vpn.votre-nom-de.domaine.crt
key vpn.votre-nom-de.domaine.key
tls-auth ta.key 0 # 0 pour le serveur, 1 pour les clients
dh dh2048.pem
auth SHA1
cipher AES-256-CBC # Algorithme de chiffrement

# Authentification par login/password
client-cert-not-required
plugin /usr/lib64/openvpn/plugins/openvpn-plugin-auth-pam.so openvpn

# Configuration du VPN
server 10.8.0.0 255.255.255.0 # IP des clients
push "redirect-gateway def1 bypass-dhcp"
push "dhcp-option DNS 208.67.222.222"
push "dhcp-option DNS 208.67.220.220"

# Autre
comp-lzo # Compression des données
client-to-client # Autorise la communication entre client
duplicate-cn # Autorise la connexion multiple avec un seul compte
max-clients 42 # Nombre max de client
keepalive 10 60
user nobody
group nobody
persist-key
persist-tun
passtos
status /var/log/openvpn-status.log # Status des clients connectés

Voilà, je vous invite à lire la doc pour plus d’informations.

Module d’authentification PAM

J’ai choisi l’authentification via PAM pour des raisons pratique mais vous pouvez aussi utiliser des certificats voir coupler les deux 😉

nano /etc/pam.d/openvpn
auth required pam_unix.so shadow nodelay
account required pam_unix.so

Systemd

Pour faciliter l’utilisation du VPN nous allons ajouter un lien symbolique pour systemd:

restorecon -Rv /etc/openvpn
systemctl -f enable openvpn@server.service

Vous pouvez maintenant lancer votre serveur:

systemctl start openvpn@server.service

Firewall

Personnellement je préfère iptables à firewalld (surement par habitude), je vais donc le désactiver et installer iptables:

systemctl stop firewalld
systemctl disable firewalld
yum install iptables-services # Si il n'est pas déjà installé
systemctl enable iptables
systemctl start iptables

Je vous laisse le soin d’y mettre les règles qui vous chantes, mais ajouter quand même celle-ci afin d’autoriser la connexion à internet des clients:

iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o esn3 -j SNAT --to 123.123.123.123 # Remplacer par votre IP

On va en profiter pour activer l’IP forwarding:

nano /etc/sysctl.conf
net.ipv4.ip_forward = 1

Et on recharge:

sysctl -p

Configuration du client

Fichier de configuration client à exporter, il faut évidemment qu’ils soient coordonnés (clients <=> serveur):

nano /etc/openvpn/client.conf
# Configuration de base
client # Mode client
dev tun
tls-client
remote vpn.votre-nom-de.domaine 443 tcp-client

# Sécurité
ca ca.crt # Le certificat du CA
tls-auth ta.key 1 # 1 pour le client, 0 pour le serveur
ns-cert-type server # Pour vérifier que c'est bien un serveur
cipher AES-256-CBC # Algorithme de chiffrement
auth SHA1

# Authentification par login/password
auth-user-pass pass.txt # Créer un fichier texte avec vos ID pour automatiser la connexion
auth-nocache

# Autre
resolv-retry infinite
nobind
persist-key
persist-tun
comp-lzo # Compression
passtos

Il faudra aussi exporter les fichiers suivants:

  • /etc/openvpn/ca.crt
  • /etc/openvpn/ta.key

Création des utilisateurs

Utilisant l’authentification via PAM, une simple ligne de commande suffit:

adduser -M -s /bin/false user
  • -M, pas de home
  • -s /bin/false, pas de shell valide

Cet utilisateur est dépourvu de shell et de home, il ne peut donc absolument rien faire sauf s’authentifier, justement c’est ce qu’il nous faut 🙂

Dernière étape, le mot de passe:

passwd user

Conclusion

Vous avez donc un serveur OpenVPN sur CentOS 7 avec authentification via PAM (ce qui simplifie grandement la gestion des utilisateurs). Je vous laisse le soin de configurer votre client avec les différents fichiers 😉

Laisser un commentaire