---
title: Wireguard
description: Installer et configurer WireGuard VPN pour accéder à votre homelab de n'importe où et connecter tous vos appareils à votre réseau privé.
---

:ellipsis{left=0px width=40rem top=10rem blur=140px zIndex=60}
# Wireguard

::note
🎯 __Objectifs :__

  - Installer Wireguard
  - Configurer les clients
  - Accéder au réseau sécurisé
::

## Introduction
---
L'utilisation d'un VPN permet d'accéder à distance aux ressources locales du serveur sans les exposer sur internet. C'est notamment une manière propre de sécuriser l'accès à la console SSH, plutot que d'exposer le port sur internet. C'est pouvoir se connecter à son réseau où que l'on soit, de maniere sécurisée, et de faire dialoguer des machines qui sont sur des réseaux différents.

Ici nous utiliserons [Wireguard](https://www.wireguard.com/), un serveur VPN sécurisé et très performant, à l'aide des conteneurs :

- [wg-easy](https://github.com/wg-easy/wg-easy) pour le serveur, qui propose une interface web très simple pour controler les connexions et télécharger les fichiers de conf (notamment par QR code pour les téléphones)
- [Wireguard](https://docs.linuxserver.io/images/docker-wireguard/?h=wireguard) pour les clients linux

Il existe aussi des clients Windows, MacOS, iOS et Android.

Le principe est le suivant :

- Sur internet, n'importe qui peut contacter n'importe quel box internet et donc essayer de contacter n'importe quel serveur exposé.
- Votre serveur est sur votre réseau local. Il est accessible depuis le réseau local mais pas depuis internet, mis à part les services exposés (comme nous l'avons fait avec Dockge). Pour accéder aux ressources non exposées, vous devez être connecté sur le meme réseau que votre serveur et donc etre chez vous. De plus, vous devez laisser ouvert les ports utilisés par vos services à travers le pare feu de votre serveur.
- Nous souhaitons ici au contraire, depuis n'importe où, pouvoir accéder de maniere securisée aux services non exposés sur internet du serveur, comme la console SSH qui permet de se connecter à la machine par exemple.
- Nous souhaitons aussi accéder aux services d'autres serveurs, et par exemple relier de maniere sécurisée deux instances de Dockge pour tout controler depuis la meme interface.

Pour cela nous allons créer un **réseau privé virtuel**, ou VPN, c'est à dire un tunnel sécurisé auquel personne n'a accès à part les machines que vous relierez entre elles. Elles feront partie d'un nouveau réseau et pourront dialoguer entre elle comme dans un réseau local. 

D'autre part, vous pourrez ajouter votre téléphone, un ordinateur portable ou n'importe quel appareil au réseau pour pouvoir utiliser vos ressources depuis vos appareils quotidiens, où que vous soyiez.

![picture](/img/serveex/vpn.svg)

Dans cette illustration, la machine 1 est sur deux réseaux :

- son réseau local (tous les appareils liés à la box, avec une adresse IP du type `192.168.x.x ` donc ici la machine 1 et la machine 2)
- le réseau du VPN (tous les appareils reliés au VPN, avec une seconde adresse IP du type `10.8.x.x` donc ici la machine 1 et 4)

On peut aussi faire en sorte que les machines reliées au réseau virtuel partagent les acces à leur réseau local. Ici nous ne le ferons pas, pour des raisons de sécurité, et de complexité en terme de sous-réseau (si les deux machines distantes ont des machines locales qui utilisent la meme adresse IP locale, par exemple `192.168.1.1`, cela posera des conflits). 

Ainsi, sur le réseau virtuel, seules les machines directement reliées pourront dialoguer entre elle depuis ce réseau. Elles ne pourront pas dialoguer avec une machine situées sur un autre réseau local et non reliée au VPN.

## Côté serveur
---
::note
📋 __A vérifier au préalable :__

- Vérifiez si le port `51820 UDP` estlibre sur votre serveur, et bien routé dans le NAT de la box `Source 51820 UDP -> Destination 51820 UDP -> Serveur`. En effet, votre serveur étant derrière votre box, le port de votre box doit etre joignable et rediriger vers le port de votre serveur connecté à votre VPN.
- Vérifiez aussi que le port `51821 TCP` est libre sur le serveur pour accéder à la web ui.
::

::warning

__Attention__: Si votre IP n'est pas fixe, vous devez avoir un nom de domaine redirigeant vers l'IP à jour à l'aide d'un [DynDNS](https://en.wikipedia.org/wiki/Dynamic_DNS). Si votre opérateur internet utilise un [CGNAT](https://en.wikipedia.org/wiki/Carrier-grade_NAT), vous êtes cuit. Vous devrez utiliser un VPS externe pour ce tuto, et y connecter votre serveur comme client.
::

Structure des dossiers

```sh
root
└── docker
    └── wg-easy
        ├── config
        │   └── etc_wireguard
        ├── compose.yaml
        └── .env
```

Ouvrez Dockge, cliquez sur `compose` et nommez la stack `wg_easy`.

Copiez la configuration suivante :

```yaml
---
services:
  wg-easy:
    environment:

      - INSECURE=true
    image: ghcr.io/wg-easy/wg-easy:15
    container_name: wg-easy
    networks:
      wg:
        ipv4_address: 10.42.42.42
        ipv6_address: fdcc:ad94:bacf:61a3::2a
    volumes:

      - ./etc_wireguard:/etc/wireguard
      - /lib/modules:/lib/modules:ro
    ports:

      - "51820:51820/udp"
      - "51821:51821/tcp"
    restart: unless-stopped
    cap_add:

      - NET_ADMIN
      - SYS_MODULE
    sysctls:

      - net.ipv4.ip_forward=1
      - net.ipv4.conf.all.src_valid_mark=1
      - net.ipv6.conf.all.disable_ipv6=0
      - net.ipv6.conf.all.forwarding=1
      - net.ipv6.conf.default.forwarding=1

networks:
  wg:
    driver: bridge
    enable_ipv6: true
    ipam:
      driver: default
      config:

        - subnet: 10.42.42.0/24
        - subnet: fdcc:ad94:bacf:61a3::/64

```
::tip
✨ __Astuce :__ 

- Vous pouvez personnaliser le port de wireguard et de la webui au lieu des ports par défaut.
- Ajoutez le label de watchtower afin d'automatiser les mises à jour

    ```yaml
    services
      wg-easy:
        #...
        labels:

          - com.centurylinklabs.watchtower.enable=true
::

Puis déployez la stack et connectez vous via le web en local sur `http://ipduserveur:51821`

::caution

En cas d'échec, vérifiez les règles du pare-feu.
::

Une fois connecté, la webui vous guidera :

- Pour créer votre compte et mot de passe d'accès
- Pour configurer l'host à utiliser dans les fichiers de conf : utilisez l'IP publique de votre box internet (ou de votre VPS), ou le nom de domaine redirigeant vers l'IP de votre box, le cas écheant.

Une fois fait:

- Cliquez sur *« Administrator »* > *« Admin Panel »* > *« Config »*
- Modifiez `Allowed IPs` en remplaçant `0.0.0.0/24` par `10.8.0.0/24`. Cela signifie que seules les requêtes IP de `10.8.0.1` à `10.8.0.255` seront redirigées dans le tunnel (split tunneling), laissant ainsi à l'appareil la possibilité d'etre connecté à d'autres tunnels, et à accéder à internet par lui meme. Si vous voulez tout rediriger dans le tunnel, y compris l'acces à internet, laissez `0.0.0.0/24`.
- Supprimez l'IPv6, cela n'apportera que des problèmes.

### Recuperation des fichiers de conf

Afin de configurer les clients, vous devez télécharger les fichiers de conf générés par l'host :

- Connectez vous via le web en local sur `http://ipduserveur:51821`
- Créez un client
- Modifiez le client en cliquant sur l'icone d'édition
- Modifiez `Server Allowed IPs` en ajoutant `10.8.0.0/24`. Cela signifie que le serveur laissera vos clients accéder à toutes les IP `10.8.0.1` à `10.8.0.255` connectées à lui, et donc laissera les clients dialoguer entre eux si nécessaire. Si vous voulez laisser vos clients accéder à tous les appareils réseau connectés autour de votre serveur en local, mettez `0.0.0.0`, à condition de l'avoir fait précédemment dans la configuration générale.
- (facultatif) Si votre client est un serveur qui doit être connecté en permanence, modifiez `Advanced` > `Persistent Keep Alive` en mettant `25`.
- Sauvegardez
- Téléchargez le fichier de conf
- Renommez le en `wg0.conf`. (Si ce n'est pas le premier, incrémentez: `wg1.conf`, etc...)

## Sur le serveur client
---
::note

Nous partons du principe que le serveur client est un serveur linux avec Docker installé
::

Structure des dossiers

```sh
root
└── docker
    └── wireguard
        └── config
        │   └── wg_confs
        └── compose.yaml
```

Creez le dossier `/docker/wireguard/config/wg_confs`.

::tip
✨ __Astuce pour les allergiques au terminal :__
vous pouvez utiliser [File Browser](/fr/serveex/files/file-browser) pour naviguer dans vos fichier et éditer vos documents au lieu d'utiliser les commandes du terminal.
::

```sh
sudo mkdir -p /docker/wireguard/config/wg_confs
```

Créez le fichier `wg0.conf`

```sh
sudo nano /docker/wireguard/config/wg_confs/wg0.conf
```

Copiez-collez le contenu du `wg0.conf` que vous avez téléchargé, puis enregistrez avec :kbd{value="Ctrl+O"} et :kbd{value="Entrée"}, et quittez avec :kbd{value="Ctrl+X"}. 

::tip
✨ __Astuce :__ Un autre moyen est de transférer le fichier par sftp dans le dossier `/home/nomdutilisateur` puis de le copier dans le bon dossier :

    ```sh
    sudo cp ~/wg0.conf /docker/wireguard/config/wg_confs
::

Creez le `compose.yaml` dans `/docker/wireguard `:
```sh
sudo nano /docker/wireguard/compose.yaml
```
Appuyez sur `i` pour rentrer en modification et copiez la configuration ci-dessous
```yaml
services:
  wireguard:
    image: lscr.io/linuxserver/wireguard:latest
    container_name: wireguard
    network_mode: host
    cap_add:

      - NET_ADMIN
      - SYS_MODULE #optional
    environment:

      - TZ=Europe/Paris
    volumes:

      - /docker/wireguard/config:/config
      - /lib/modules:/lib/modules #optional
    restart: unless-stopped
```

Enregistrez avec :kbd{value="Ctrl+O"} puis :kbd{value="Entrée"}, puis quittez avec :kbd{value="Ctrl+X"}.

Lancez le conteneur :
```sh
cd /docker/wireguard
sudo docker compose up -d
```
::note

A répéter pour chaque client
::

## Autres appareils
---

- **Téléphone :** installer wireguard et scanner le QR code via le webui (http://ipduserveur:51821)
- **PC :** Installer wireguard client et mettre directement le fichier de conf téléchargé via le webui

::warning

__Attention :__ Si des machines clientes sont sur le meme réseau local que le serveur (derriere la box), éditez le fichier `wg0.conf` uploadé sur cette machine en changeant avec l'adresse locale du serveur : `Endpoint = ipduserveur:51820`{lang=properties}
::

Et voilà ce que cela peut donner !

![picture](/img/serveex/wireguard.svg)
