OpenVPN sur RaspberryPI


DNS / DHCP / Nagios / Gammu / Asterisk / MusicPlayerDaemon / Arduino RaspberryPI / OpenVPN | Créer son image pour Raspberry PI | DJI Fade | Reolink Timelapse | K8S on Raspberry Pi


Installation d’un serveur et d’un client OpenVPN sur RaspberryPI

L’objectif est de voir l’installation complete d’un serveur openVPN sur Raspberry PI (Debian Buster) puis d’un client OpenVPN sur un autre Raspberry Pi.

Les images de Debian Buster peuvent etre trouvées sur le site RaspberryPI.org , pour l’installation il suffit de suivre la documentation

Attention toutes les opérations se font sur le compte root, il faut donc avoir effectué un sudo -u root bash

Préparatoin de la carte SD

Insérer la carte SD

$ df
/dev/disk6s1 249671680 16128 249655552 1% 63 975217 0% /Volumes/Untitled

Unmount de la carte

$ diskutil unmountDisk /dev/disk6

Ecrite l’image sur la carte

$ sudo dd bs=1m if=2020-08-20-raspios-buster-armhf-lite.img of=/dev/disk6 ; sync
Password:
1760+0 records in
1760+0 records out
1845493760 bytes transferred in 443.168437 secs (4164317 bytes/sec)

Ejecter la carte SD

$ sudo diskutil eject /dev/rdisk6
Password:
Disk /dev/rdisk6 ejected

Préparation du systeme.

Pour le premier boot brancher un écran un clavier et une souris (enfin si nécessaire), il est conseillé d’activer ssh ainsi par la suite plus besoin de clavier / souris / ecran on peut se connecter a distance sur le Pi.

$> sudo -u root bash
$> apt-get update
$> apt-get upgrade

Installation des packages

$> apt-get install openvpn resolvconf openvpn-systemd-resolved easy-rsa
$> apt install net-tools zip lsof

Si vous souhaitez ajouter le second facteur de type Google Authenticator installer les packages qui suivent

$> apt-get install libqrencode4 libpam-google-authenticator

Configuration de la PKI

Deux possibilités ici. Soit vous avez deja une PKI et il faut alors générer les fichiers nécessaires (certificat, clé privée …) avec votre PKI (si vous en avez une vous voyez de quoi il s’agit, si vous n’en avez pas passer au second cas). Soit vous n’avez pas de PKI on va alors tout faire avec l’outil easy-rsa.

Initialisation de la PKI

$> cd /etc/openvpn/
$> cp -r /usr/share/easy-rsa ./
$> cd easy-rsa/
$> cp vars.example vars
$> vi vars
set_var EASYRSA_REQ_COUNTRY     "FR"
set_var EASYRSA_REQ_PROVINCE    "France"
set_var EASYRSA_REQ_CITY        "Paris"
set_var EASYRSA_REQ_ORG         "MonOrga"
set_var EASYRSA_REQ_EMAIL       "ptrognon@ptro.me"
set_var EASYRSA_REQ_OU          "OrgUnit"

set_var EASYRSA_KEY_SIZE    4096

$> cd ../
$> ./easy-rsa/easyrsa init-pki
$> ./easy-rsa/easyrsa build-ca # il est conseillé de mettre une passphrase sur le CA
$> ./easy-rsa/easyrsa gen-dh

La passphrase sur le CA permet de protéger la signature nouvelles clés client.

L’opération de génération du DH peut prendre un certain temps, il faut patienter.

Génération de clé du serveur

Ici je ne place pas de passphrase afin que le serveur puisse démarer tout seul.

Attention lors de la signature il faut saisir le passphrase du CA.

./easy-rsa/easyrsa gen-req RPIDevPtro nopass
./easy-rsa/easyrsa sign server RPIDevPtro

Génération des clés des clients.

Si vous souhaitez que la clé du client soit protégée par un passphrase il faut supprimer le nopass des lignes de commandes, sinon il faut le laisser.

Attention lors de la signature il faut saisir le passphrase du CA.

Génération des clés pour le client LinuxMint qui va servir aux tests.

./easy-rsa/easyrsa gen-req RPIDevPtroClientMint nopass
./easy-rsa/easyrsa sign client RPIDevPtroClientMint

Génération des clés pour le client LinuxRaspberryPi qui va servir aux tests.

./easy-rsa/easyrsa gen-req RPIDevPtroClientPi nopass
./easy-rsa/easyrsa sign client RPIDevPtroClientPi

Configuration du serveur OpenVPN

Il faut configurer le serveur OpenVPN, cela se fait dans le répertoire /etc/openvpn, se placer dans ce répertoire et créer un fichier avec l’extention .conf. Dans ce fichier nous allons retrouver plusieurs types d’informations : ## La configuration réseau d’écoute du serveur OpenVPN C’est à dire le port sur lequel le serveur OpenVPN écoute ainsi que le protocole (TCP ou UDP)

port 443
proto tcp
dev tun

Le plan d’adressage IP de votre serveur OpenVPN

ifconfig-pool-persist ipp.txt

server 10.20.1.0 255.255.255.0

keepalive 10 120

client-to-client

La configuration du chiffrement.

cipher AES-256-CBC
auth SHA512

La configuration des certificats, clé SSL etc.

ca /etc/openvpn/pki/ca.crt
cert /etc/openvpn/pki/issued/RPIDevPtro.crt
key /etc/openvpn/pki/private/RPIDevPtro.key
dh /etc/openvpn/pki/dh.pem

Exemple complet.

port 443
proto tcp
dev tun
ca /etc/openvpn/pki/ca.crt
cert /etc/openvpn/pki/issued/RPIDevPtro.crt
key /etc/openvpn/pki/private/RPIDevPtro.key
dh /etc/openvpn/pki/dh.pem

ifconfig-pool-persist ipp.txt

server 10.20.30.0 255.255.255.0

keepalive 10 120

cipher AES-256-CBC
auth SHA512

persist-key
persist-tun

max-clients 10

user openvpn
group openvpn

client-to-client

status /var/log/openvpn.status
status-version 1


verb 3

Création du fichier de configuration et activation.

$> cd /etc/openvpn
$> vi dev-ptro.ptro.me.conf # ici placer le contenu du fichier indiqué au dessus
$> groupadd openvpn
$> grep openvpn /etc/group
openvpn:x:1001:
$> useradd --gid 1001 openvpn # ici le 1001 corresponds au gid renvoyė par le grep précédent
$> systemctl enable openvpn@dev-ptro.ptro.me
Created symlink /etc/systemd/system/multi-user.target.wants/openvpn@dev-ptro.ptro.me.service → /lib/systemd/system/openvpn@.service.
$> systemctl start openvpn@dev-ptro.ptro.me

A ce niveau le VPN doit etre monté, pour le vérifier regardez si une interface tun0 est présente dans le ifconfig

$> ifconfig tun0
tun0: flags=4305<UP,POINTOPOINT,RUNNING,NOARP,MULTICAST>  mtu 1500
        inet 10.20.30.1  netmask 255.255.255.255  destination 10.20.30.2
        inet6 fe80::b671:b713:83d6:d65a  prefixlen 64  scopeid 0x20<link>
        unspec 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00  txqueuelen 100  (UNSPEC)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 15  bytes 902 (902.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

vous pouvez aussi vérifier que le serveur est bien en écoute sur le port que vous avez paramétré dans le fichier de conf :

$> lsof | grep LISTEN | grep openvpn
openvpn   11781                         openvpn    7u     IPv4     139099      0t0        TCP *:https (LISTEN)

Ici on voit que le process openvpn est bien en écoute sur le port https (443) comme nous l’avons configuré plus haut.

La configuration du serveur est terminée.

Récupération des fichiers pour la configuration des clients.

Nous avons préparé deux clients, RPIDevPtroClientMint et RPIDevPtroClientPi, nous allons voir ce qu’il faut récupérer et la configuration à effectuer sur les clients afin que ceux ci puissent se connecter au serveur OpenVPN.

RPIDevPtroClientMint

Il faut transférer les fichiers qui suivent sur le client qui veut lancer la configuration RPIDevPtroClientMint /etc/openvpn/pki/ca.crt /etc/openvpn/pki/issued/RPIDevPtroClientMint.crt /etc/openvpn/pki/private/RPIDevPtroClientMint.key

Se placer dans le répertoire /etc/openvpn, créer un répertoire du nom de la configuration Client, par exemple RPIDevPtroClientMint, et dans ce répertoire y placer les 3 fichiers ca.crt, RPIDevPtroClientMint.crt, RPIDevPtroClientMint.key. Toujours dans le répertoire /etc/openvpn/RPIDevPtroClientMint créer le fichier de configuration OpenVPN du client.

$> cd /etc/openvpn/RPIDevPtroClientMint
$> vi RPIDevPtroClientMint.conf
client
remote 192.168.0.85 443
nobind
dev tun
cipher AES-256-CBC

# SSL Configuration
ca /etc/openvpn/RPIDevPtroClientMint/ca.crt
cert /etc/openvpn/RPIDevPtroClientMint/RPIDevPtroClientMint.crt
key /etc/openvpn/RPIDevPtroClientMint/RPIDevPtroClientMint.key

proto tcp

Attention la ligne remote indique comment trouver le serveur, au choix vous pouvez utiliser l’adresse ip du serveur (dans l’exemple 192.168.0.85 sur un réseau privé), ou un nom DNS, si vous indiquez un nom DNS qui pointe vers un IP public et il faudra router le traffic de cette IP public vers l’ip privée du Raspberry Pi qui fait touner le serveur OpenVPN sur le port 443

Se placer ensuite dans le répertoire /etc/openvpn

$> cd /etc/openvpn
$> ln -s /etc/openvpn/RPIDevPtroClientMint/RPIDevPtroClientMint.conf RPIDevPtroClientMint.conf
$> systemctl enable openvpn@RPIDevPtroClientMint.service
$> systemctl start openvpn@RPIDevPtroClientMint.service

Le client RPIDevPtroClientMint est alors connecté au serveur OpenVPN, celui ci va lui attribuer une adresse IP qui sera toujours la même.

Pour que votre VPN démarre automatiquement au boot, il faut modifier le fichier de configuration /etc/default/openvpn

$> vi /etc/default/openvpn
AUTOSTART="RPIDevPtroClientMint"

RPIDevPtroClientPi

Il faut transférer les fichiers qui suivent sur le client qui veut lancer la configuration RPIDevPtroClientMint /etc/openvpn/pki/ca.crt /etc/openvpn/pki/issued/RPIDevPtroClientPi.crt /etc/openvpn/pki/private/RPIDevPtroClientPi.key

Se placer dans le répertoire /etc/openvpn, créer un répertoire du nom de la configuration Client, par exemple RPIDevPtroClientPi, et dans ce répertoire y placer les 3 fichiers ca.crt, RPIDevPtroClientPi.crt, RPIDevPtroClientPi.key. Toujours dans le répertoire /etc/openvpn/RPIDevPtroClientPi créer le fichier de configuration OpenVPN du client.

$> cd /etc/openvpn/RPIDevPtroClientPi
$> vi RPIDevPtroClientPi.conf
client
remote 192.168.0.85 443
nobind
dev tun
cipher AES-256-CBC

# SSL Configuration
ca /etc/openvpn/RPIDevPtroClientPi/ca.crt
cert /etc/openvpn/RPIDevPtroClientPi/RPIDevPtroClientPi.crt
key /etc/openvpn/RPIDevPtroClientPi/RPIDevPtroClientPi.key

proto tcp

Attention la ligne remote indique comment trouver le serveur, au choix vous pouvez utiliser l’adresse ip du serveur (dans l’exemple 192.168.0.85 sur un réseau privé), ou un nom DNS, si vous indiquez un nom DNS qui pointe vers un IP public et il faudra router le traffic de cette IP public vers l’ip privée du Raspberry Pi qui fait touner le serveur OpenVPN sur le port 443

Se placer ensuite dans le répertoire /etc/openvpn

$> cd /etc/openvpn
$> ln -s /etc/openvpn/RPIDevPtroClientPi/RPIDevPtroClientPi.conf RPIDevPtroClientPi.conf
$> systemctl enable openvpn@RPIDevPtroClientPi.service
$> systemctl start openvpn@RPIDevPtroClientPi.service

Le client RPIDevPtroClientPi est alors connecté au serveur OpenVPN, celui ci va lui attribuer une adresse IP qui sera toujours la même.

Pour que votre VPN démarre automatiquement au boot, il faut modifier le fichier de configuration /etc/default/openvpn

$> vi /etc/default/openvpn
AUTOSTART="RPIDevPtroClientPi"

[DNS / DHCP / Nagios / Gammu / Asterisk / MusicPlayerDaemon / Arduino RaspberryPI / OpenVPN | Créer son image pour Raspberry PI | DJI Fade | Reolink Timelapse | K8S on Raspberry Pi