Wireguard
- 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, un serveur VPN sécurisé et très performant, à l'aide des conteneurs :
- 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 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.
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
- Vérifiez si le port
51820 UDP
est libre sur votre serveur, et bien routé dans le NAT de la boxSource 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.
- En cas d'échec, vérifiez les règles du pare-feu.
Structure des dossiers
root
└── docker
└── wg-easy
├── config
│ └── etc_wireguard
├── compose.yaml
└── .env
Le conteneur sera en mode HOST
, c'est à dire qu'il occupera les ports de votre host comme s'il n'etait pas dans un conteneur mais directement installé sur la machine, sans passer par un sous-réseau.
Ouvrez Dockge, cliquez sur compose
et nommez la stack wg_easy
.
Copiez la configuration suivante :
version: "3.8"
volumes:
etc_wireguard:
services:
wg-easy:
network_mode: host
env_file:
- .env
environment:
- LANG=en
- WG_HOST=${HOST}
- PASSWORD_HASH=${PW}
- WG_DEFAULT_ADDRESS=${ADDRESS}
- WG_HIDE_KEYS=never
- WG_ALLOWED_IPS=${IPS}
- WG_DEFAULT_DNS=
- UI_TRAFFIC_STATS=true
- UI_CHART_TYPE=1
image: ghcr.io/wg-easy/wg-easy
container_name: wg-easy
volumes:
- /docker/wg_easy/config/etc_wireguard:/etc/wireguard
restart: unless-stopped
cap_add:
- NET_ADMIN
- SYS_MODULE
services
wg-easy:
#...
labels:
- com.centurylinklabs.watchtower.enable=true
Dans .env
:
HOST=
PW=
ADDRESS=
IPS=
Variable | Valeur | Exemples |
---|---|---|
HOST | Domaine de l'host | mondomaine.fr |
PW | Hash du mot de passe, à générer ici. ATTENTION: doubler les $ | $$2a$$12$$FF6T4QqSP9Ho |
ADDRESS | Plage d'adresse que le DHCP du VPN peut attribuer, le x doit etre présent, on peut changer les autres chiffres ou les remplacer par x aussi | 10.8.0.x |
IPS | les IPs qui doivent etre routées par les clients vers le VPN. Dans notre cas, on veut que seul le traffic vers le serveur et clients du VPN soit routé, on veut pas de leurs réseau local et on veut conserver l'accès à internet direct sans passer par le VPN.Si vous voulez tout de meme ajouter toutes les machines connectées aux appareils en local, ajoutez la plage 192.168.0.0/16 en séparant les deux plages par une virgule. | 10.8.0.0/24 |
Puis déployez la stack.
Activation du forwarding depuis l'host
Pour que l'host autorise les clients à communiquer entre eux, vous devez activer les paramèttres suivants :
sudo sysctl net.ipv4.ip_forward=1
sudo sysctl net.ipv4.conf.all.src_valid_mark=1
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
- Téléchargez le fichier de conf
- Renommez le en
wg0.conf
Sur le serveur client
- Nous partons du principe que le serveur client est un serveur linux avec Docker installé
Structure des dossiers
root
└── docker
└── wireguard
└── config
│ └── wg_confs
└── compose.yaml
Creez le dossier /docker/wireguard/config/wg_confs
.
sudo mkdir -p /docker/wireguard/config/wg_confs
Copiez le fichier wg0.conf
téléchargé précédemment.
/home/nomdutilisateur
puis de le copier dans le bon dossier :sudo cp ~/wg0.conf /docker/wireguard/config/wg_confs
Creez le compose.yaml
dans /docker/wireguard
:
sudo vi /docker/wireguard/compose.yaml
Appuyez sur i
pour rentrer en modification et copiez la configuration ci-dessous
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
Appuyez sur Echap
puis tapez :x
pour quitter et sauvegarder.
Lancez le conteneur :
cd /docker/wireguard
sudo docker compose up -d
- 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
- 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
Et voilà ce que cela peut donner !