# OpenVPN Serveur sur Docker

https://www.grottedubarbu.fr/serveur-openvpn-5-minutes-docker/

# Mise en place OpenVPN Serveur avec Docker

<p class="callout info">Image Docker utilisé : [https://hub.docker.com/r/kylemanna/openvpn/](https://hub.docker.com/r/kylemanna/openvpn/)</p>

### Mise en place du serveur

Dans un premier temps, nous allons cloner le dépôt :

```bash
git clone https://github.com/kylemanna/docker-openvpn.git
```

Dès le téléchargement terminé, rendez-vous dans le dossier :

```bash
cd docker-openvpn
```

Nous allons pouvoir construire l'image avec les éléments à jour :

```bash
docker build -t server_vpn .
```

### TCP vs UDP ?

On utilise généralement le protocole UDP pour une connexion VPN. Il est malgré tout possible de réaliser cette connexion en TCP.

La configuration TCP offre les avantages suivants :

> - Plus stable puisque le protocole TCP garantit l'émission des paquets,
> - By-Pass des firewalls : Il est rare de bloquer le port 80 et 443 en TCP,

Par contre de ce fait le protocole TCP est plus lent.

De ce fait le protocole UDP offrira comme gros avantage d'être beaucoup plus rapide. Par contre il peut être déconseillé dans des cas où la connexion n'est pas stable ou si votre infrastructure ne le permet pas.

### Création du dossier des configurations

Vous pouvez ensuite créer un dossier afin de stocker les fichiers de configuration et les clés nécessaires au serveur. Si vous ne stockez pas ces informations persistantes, au prochain redémarrage de votre serveur, il sera nécessaire de refaire la configuration et de générer à nouveau les clés.

```bash
cd ..
mkdir openvpn-etc
```

Lançons maintenant notre première configuration :

```
docker run -v $PWD/openvpn-etc:/etc/openvpn --rm server_vpn ovpn_genconfig -u udp://IP_ADDRESS:1194
```

### Génération des certificats

Nous devons maintenant générer les clés PKI du serveur. Le script d'initialisation, en plus de créer la clé privée, va également générer le certificat CA. Un mot de passe vous sera demandé afin de sécuriser votre clé privée.

```bash
docker run -v $PWD/openvpn-etc:/etc/openvpn --rm -it server_vpn ovpn_initpki
```

Le script exécuté sera cette fois-ci : `ovpn_initpki`

Une fois ces éléments générés, vous pouvez lancer le serveur :

```bash
docker run -v $PWD/openvpn-etc:/etc/openvpn -d -p 1194:1194/udp --cap-add=NET_ADMIN server_vpn
```

##### Créer un utilisateur sans mot de passe

Maintenant, nous allons pouvoir créer les comptes utilisateurs pour connecter au VPN. L'image possède encore un outil pour faciliter notre travail :

```bash
docker run -v $PWD/openvpn-etc:/etc/openvpn --rm -it server_vpn easyrsa build-client-full user1 nopass
```

L'outil ***easyrsa*** vous demandera <span style="text-decoration: underline;">le mot de passe CA</span> (mot de passe du certificat). C'est le mot de passe que nous avons défini ci-dessus pendant la commande ***ovpn\_initpki***.

Nous venons d'ajouter un compte utilisateur avec le nom *user1*, et dans le cadre de notre tutoriel, j'ai utilisé l'option `nopass`. Avec cette option, l'utilisateur peut se connecter directement avec le fichier de configuration.

<p class="callout warning">Cela signifie également que si quelqu'un obtient le fichier de configuration que nous venons de générer en quelques secondes, il pourra alors se connecter à notre serveur VPN sans avoir besoin d'une autre authentification.</p>

##### Créer un utilisateur avec mot de passe

Pour créer un utilisateur avec mot de passe il suffit d'exécuter la même commande sans mettre l'argument `nopass`.

```bash
docker run -v $PWD/openvpn-etc:/etc/openvpn --rm -it server_vpn easyrsa build-client-full user1
```

L'outil ***easyrsa*** vous demandera tout d'abord <span style="text-decoration: underline;">le mot de passe PEM</span> qui correspond à la pass phrase de l'utilisateur. Puis l'outil demandera dans un deuxième temps<span style="text-decoration: underline;"> le mot de passe CA</span> (mot de passe du certificat). C'est le mot de passe que nous avons défini ci-dessus pendant la commande ***ovpn\_initpki***. Exemple :

```powershell
root@antec:/docker/openvpn# sudo docker run -v $PWD:/etc/openvpn --rm -it server_vpn easyrsa build-client-full user1
Using SSL: openssl OpenSSL 1.1.1q  5 Jul 2022
Generating a RSA private key
...............................................+++++
............+++++
writing new private key to '/etc/openvpn/pki/easy-rsa-1.fDdFdh/tmp.HEpcli'
Enter PEM pass phrase: <passphraseForUser1>
Verifying - Enter PEM pass phrase: <passphraseForUser1>
-----
Using configuration from /etc/openvpn/pki/easy-rsa-1.fDdFdh/tmp.dCdGDM
Enter pass phrase for /etc/openvpn/pki/private/ca.key: <passphraseOpenVPN>
Check that the request matches the signature
Signature ok
The Subject''s Distinguished Name is as follows
commonName            :ASN.1 12:'user1'
Certificate is to be certified until Jan 29 09:56:53 2025 GMT (825 days)

Write out database with 1 new entries
Data Base Updated
```

La création d'un utilisateur génère les trois fichiers suivants :

- /openvpn-etc/pki/issued/`user1.crt`
- /openvpn-etc/pki/private/`user1.key`
- /openvpn-etc/pki/reqs/`user1.req`

##### Exporter le fichier **.ovpn** d'un utilisateur

Dernière étape de notre installation, nous allons exporter le fichier de configuration qui sera envoyé à l'utilisateur pour se connecter :

```bash
sudo docker exec openvpn  ovpn_getclient  <user> > monuser.ovpn
```

#### Relancer le serveur VPN en cas d'arrêt 

```shell
sudo docker start <docker_name>
```

# Utiliser Open VPN Connect

> ##### Le tuto pour se connecter à un VPN de type OpenVPN depuis un ordinateur ou un téléphone se fait avec un fichier `.ovpn`

#### <span style="text-decoration: underline;">**Depuis un ordinateur**</span>

<p class="callout info">Il faut tout d'abord installer [Installer Open VPN Connect](https://openvpn.net/client-connect-vpn-for-windows/) sur l'ordinateur disposant du fichier en `.ovpn`.</p>

Une fois que l'application est installé, il suffit d'ajouter un "Profil" :

[![image.png](https://wiki.mira-ceti.ovh/uploads/images/gallery/2022-10/scaled-1680-/lHD8xwBMDDPZvezK-image.png) ](https://wiki.mira-ceti.ovh/uploads/images/gallery/2022-10/lHD8xwBMDDPZvezK-image.png)[![image.png](https://wiki.mira-ceti.ovh/uploads/images/gallery/2022-10/scaled-1680-/mJN2BSP2b44CBzh1-image.png)](https://wiki.mira-ceti.ovh/uploads/images/gallery/2022-10/mJN2BSP2b44CBzh1-image.png)

Sélectionner l'onglet "File". Une fois sur l'onglet File, deux façon s'offre a vous. La première glisser déposer le fichier ou la deuxième, appuyer sur le bouton "Browse" et parcourir les dossiers pour sélectionner votre fichier.

Maintenant que le fichier est chargé, vous pouvez donner un nom au fichier Profil et si vous le souhaitez cocher la case "Save Private Key Password" pour éviter de taper le mot de passe a chaque connexion.

[![image.png](https://wiki.mira-ceti.ovh/uploads/images/gallery/2022-10/scaled-1680-/ZiiNpYb954WpoZsb-image.png) ](https://wiki.mira-ceti.ovh/uploads/images/gallery/2022-10/ZiiNpYb954WpoZsb-image.png)[![image.png](https://wiki.mira-ceti.ovh/uploads/images/gallery/2022-10/scaled-1680-/OBgZu64gpbJdGinz-image.png)](https://wiki.mira-ceti.ovh/uploads/images/gallery/2022-10/OBgZu64gpbJdGinz-image.png)

Vous pouvez dès a présent appuyer sur le bouton "Connect" pour utiliser le fichier de .ovpn pour se connecter au VPN. Saisissez le mot de passe et valider.

[![image.png](https://wiki.mira-ceti.ovh/uploads/images/gallery/2022-10/scaled-1680-/UUg2LMn9WMWhZ5bF-image.png) ](https://wiki.mira-ceti.ovh/uploads/images/gallery/2022-10/UUg2LMn9WMWhZ5bF-image.png)[![image.png](https://wiki.mira-ceti.ovh/uploads/images/gallery/2022-10/scaled-1680-/i1yjPFNe8u7TxQpT-image.png)](https://wiki.mira-ceti.ovh/uploads/images/gallery/2022-10/i1yjPFNe8u7TxQpT-image.png)

Si vous avez la même interface que l'image ci-dessous c'est que tout fonctionne et que vous êtes bien connecté au VPN.

#### <span style="text-decoration: underline;">**Depuis un Téléphone**</span>

Installer l'application mobile depuis l'AppStore ou le PlayStore :

[![image.png](https://wiki.mira-ceti.ovh/uploads/images/gallery/2022-10/scaled-1680-/KACUjQy6jXBWRYkp-image.png)](https://wiki.mira-ceti.ovh/uploads/images/gallery/2022-10/KACUjQy6jXBWRYkp-image.png)

# Les commandes OVPN Server

### Liste des commandes possibles sur OpenVPN Serveur

<p class="callout info">Attention si le VPN se trouve dans un conteneur Docker vous devez soit vous connecter dans le conteneur, soit exécuter les commandes OVPN via l'invite de commande de Docker.</p>

##### Se connecter dans un conteneur 

```bash
sudo docker exec -it <container_name> bash
```

##### Lancer une commande dans un conteneur

```bash
sudo docker exec <container-name> <command>

# Exemple :
sudo docker exec openvpn_server ovpn_listclients
```

##### Exécuter la commande via le CLI de Docker

```bash
sudo docker <container_name> <la_commande_ovpn>
```

##### Liste des utilisateurs enregistré sur le VPN

```bash
ovpn_listclients 
```

##### Liste des utilisateurs connecté sur le VPN

```bash
ovpn_status
```

##### Supprimer un utilisateur du VPN

```bash
ovpn_revokeclient <user>
```

##### Récupérer le fichier de conf d'un utilisateur

```bash
ovpn_getclient <user> > monuser.ovpn
```

##### Récupérer le fichier de conf d'un utilisateur depuis l'extérieur du conteneur

```bash
sudo docker exec openvpn  ovpn_getclient  <user> > monuser.ovpn
```