Post

Serveur vpn wireguard

Serveur vpn wireguard

WireGuard est un serveur VPN à code source ouvert, gratuit, moderne et rapide, doté d’un chiffrement de pointe. Il est plus rapide et plus simple que l’IPSec et l’OpenVPN. Il est associé à Unbound qui améliore le DNS et à un parefeu UFW pour la sécurité.

Unbound

Un problème majeur avec beaucoup de configurations VPN/Wireguard est que le DNS n’est pas suffisant. Cela finit par une fuite de connexion client et de détails d’emplacement (test via le site http://ipleak.net/

Pour l’installation complète Unbound qui ajoute la mise à jour des serveurs “racine”, le blocage des publicités et des DMP (Data Management Platforms), voir lien Résolveur DNS Unbound

Nous allons sécuriser le trafic DNS avec la solution unbound qui offre les caractéristiques suivantes

  • Léger et rapide
  • Facile à installer et à configurer
  • Orienté sécurité
  • Prise en charge DNSSEC

Nous allons le configurer de manière à contrer les fuites DNS, les attaques plus sophistiquées comme la fausse configuration de proxy, les routeurs escrocs et toutes sortes d’attaques MITM sur HTTPS et autres protocoles.

Nous installons unbound sur le serveur

ATTENTION : Le programme resolvconf est en général seulement nécessaire quand un système a plusieurs programmes qui ont besoin de modifier de façon dynamique les informations sur les serveurs de noms de domaine. Sur un système simple où les serveurs de noms de domaine ne changent pas souvent ou bien ne sont modifiés que par un programme, le fichier de configuration **resolv.conf** est suffisant.
Il faut installer resolvconf, sinon on a une erreur unbound-resolvconf
Une fois le paquet « resolvconf » installé, il ne faut plus modifier le fichier « /etc/resolv.conf », car le contenu de celui-ci sera automatiquement géré et remplacé par resolvconf

Installation des outils dns, des paquets Unbound et resolv :

1
sudo apt install unbound resolvconf -y

Ajout d’un fichier de configuration unbound-wg.conf

1
sudo nano /etc/unbound/unbound.conf.d/unbound-wg.conf 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
server:
    # ne rien enregistrer dans les journaux hormis les erreurs
    verbosity: 0

    # n'écouter que sur l'interface locale en IPv4
    # unbound nécessite d'être relancé si modifié
    interface: 127.0.0.1

    port: 53

    # refuser tout le monde sauf les connexions locales (pas forcément
    # nécessaire vu que le serveur n'écoute que sur la boucle locale en IPv4)
    access-control: 0.0.0.0/0 refuse
    access-control: 127.0.0.1/32 allow

    # par défaut, unbound ne log pas les requêtes ni les réponses
    # on peut le rappeler au cas où
    log-queries: no
    log-replies: no

    # imposer la QNAME minimisation (RFC 7816)
    # Pour mieux protéger la vie privée
    qname-minimisation: yes
    # même si le serveur faisant autorité ne le veut pas
    #   après discussion, il est possible que cette option ne soit
    #   pas recommandée dans le cadre d'un résolveur ouvert
    qname-minimisation-strict: yes

Vérifier la validité du fichier de configuration avec la commande suivante :

1
sudo unbound-checkconf /etc/unbound/unbound.conf.d/unbound-wg.conf

unbound-checkconf: no errors in /etc/unbound/unbound.conf.d/unbound-wg.conf

Toutes les règles disponibles sont détaillées dans le manuel man 5 unbound.conf ou dans le manuel en ligne.

Démarrer le résolveur.

1
sudo systemctl start unbound.service

S’assurer que tout fonctionne bien à l’aide de la commande dig disponible dans le paquet bind9-dnsutils ou dnsutils. Pour cela il suffit de spécifier l’adresse de notre résolveur, ici 127.0.0.1 ou ::1 et d’effectuer une requête DNS. Ici on demande à Unbound de récupérer l’enregistrement AAAA associé au nom de domaine afnic.fr.

1
dig @127.0.0.1 A afnic.fr

Résultat commande

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
; <<>> DiG 9.18.28-1~deb12u2-Debian <<>> @127.0.0.1 A afnic.fr
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 37353
;; flags: qr rd ra ad; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
;; QUESTION SECTION:
;afnic.fr.			IN	A

;; ANSWER SECTION:
afnic.fr.		600	IN	A	51.178.83.21

;; Query time: 232 msec
;; SERVER: 127.0.0.1#53(127.0.0.1) (UDP)
;; WHEN: Sun Sep 15 14:53:14 GMT 2024
;; MSG SIZE  rcvd: 53

Une réponse est bien renvoyée. Le résolveur fonctionne.Vérifier que tout est opérationnel en IPv4, et en utilisant UDP et TCP.

1
2
$ dig +notcp @127.0.0.1 A afnic.fr  # connexion UDP en IPv4 au résolveur
$ dig +tcp @127.0.0.1 A afnic.fr    # connexion TCP en IPv4 au résolveur

À ce stade, un résolveur Unbound est configuré en local et écoute sur le port 53. Il peut donc être utilisé pour résoudre toutes les requêtes en provenance de la machine.

Parefeu UFW

Installation

1
sudo apt install ufw

Ajout des règles pour ssh et wireguard

1
2
3
sudo ufw allow 52255/udp # wireguard
sudo ufw allow 55027/tcp # ssh
sudo ufw allow DNS

Activation

1
sudo ufw enable

Status sudo ufw status

1
2
3
4
5
6
7
8
9
10
Status: active

To                         Action      From
--                         ------      ----
55027/tcp                  ALLOW       Anywhere                  
52255/udp                  ALLOW       Anywhere                  
DNS                        ALLOW       Anywhere                  
55027/tcp (v6)             ALLOW       Anywhere (v6)             
52255/udp (v6)             ALLOW       Anywhere (v6)             
DNS (v6)                   ALLOW       Anywhere (v6)             

Désactiver les règles IPv6 utilisant UFW sur Linux
Le désactivation des règles IPv6 dans UFW est relativement facile. Ouvrez simplement le fichier de configuration UFW /etc/default/ufw
Remplacer IPV6=yes par IPV6=no
Recharger : sudo ufw reload

Wireguard

wireguard
WireGuard est un serveur VPN à code source ouvert, gratuit, moderne et rapide, doté d’un chiffrement de pointe. Il est plus rapide et plus simple que l’IPSec et l’OpenVPN

Wireguard est dans le noyau 5.6+

1
sudo apt install wireguard

Autorisations

**Autoriser le serveur Wireguard à relayer les paquets **

Autoriser le serveur Wireguard à relayer les paquets venant de ces clients vers l’internet et de traiter les paquets retours (modifier /etc/sysctl.conf)
On passe en mode su : sudo -s

1
2
3
sed -i 's/^#net.ipv4.ip_forward=1/net.ipv4.ip_forward=1/' /etc/sysctl.conf
sed -i 's/^#net.ipv6.conf.all.forwarding=1/net.ipv6.conf.all.forwarding=1/' /etc/sysctl.conf
sysctl -p # prise en compte immédiate

Résultat

1
2
net.ipv4.ip_forward = 1
net.ipv6.conf.all.forwarding = 1

Générer une paire de clés

On passe en mode su : sudo -s

On se positionne dans le dossier /etc/wireguard/

1
cd /etc/wireguard

WireGuard repose sur une authentification par clé publique/privée (cryptographie asymétrique), vous devez donc créer ces clés avec les sous-commandes wg genkey et wg pubkey
La création de la clé privée se fait avec wg genkey et la clé publique est générée en la canalisant dans wg pubkey

1
umask 077; wg genkey | tee wg0.key | wg pubkey > wg0.pub

Configuration wg0.conf

Fichier de configuration /etc/wireguard/wg0.conf

Récupérer le nom de la carte réseau et l’adresse IP, ip a :
carte réseau ens3
adresse IP 91.194.161.27

La première étape consiste à choisir une plage IPV4 privée, Random IPV4 Private Address Generator, qui sera utilisée par le serveur : 10.30.55.0/8

Pour une adresse IPV6 Local IPv6 Address Generator : fd27:4ae2:2ed9::/64

Les adresses locales uniques (ULA) IPv6 sont utilisées de la même manière que les adresses locales IPv4, telles que 10.0.0.0/8. Les adresses privées IPv4 ont été définies par la RFC 1918, tandis que les ULA IPv6 ont été définies par la RFC 4193. Contrairement à leur équivalent IPv4, les adresses locales IPv6 ont une partie aléatoire de 40 bits, ce qui les rend uniques. L’objectif des adresses locales IPv6 est que si vous connectez deux réseaux IPv6 privés ensemble - tels que deux sites privés connectés par VPN - il est très peu probable que vous rencontriez des conflits d’adressage.

Le serveur aura l’adresse IP suivante: 10.30.55.1 . Il est également nécessaire de choisir un port, qui sera exposé publiquement, pour que le serveur écoute.Le port de documentation standard est généralement 51820.

Créer le fichier /etc/wireguard/wg0.conf serveur wg0

1
/etc/wireguard/wg0.conf
1
2
3
4
5
6
7
8
9
10
[Interface]
Address = 10.30.55.1, fd27:4ae2:2ed9::1
ListenPort = 52255
PostUp = ufw route allow in on wg0 out on ens3
PostUp = iptables -t nat -I POSTROUTING -o ens3 -j MASQUERADE; ip6tables -t nat -A POSTROUTING -o ens3 -j MASQUERADE
PreDown = ufw route delete allow in on wg0 out on ens3
PreDown = iptables -t nat -D POSTROUTING -o ens3 -j MASQUERADE; ip6tables -t nat -D POSTROUTING -o ens3 -j MASQUERADE
# wg0_PRIVATE_KEY
PrivateKey = 5Z........................................mk=
DNS = 10.30.55.1, fd27:4ae2:2ed9::1

Address , fixer l’adresse IP privée du serveur à l’intérieur du VPN.Les adresses du réseau VPN de 10.30.55.0 à 10.30.55.255 sont fixées par le masque /24 et fd27:4ae2:2ed9::1 à fd27:4ae2:2ed9::ffff sont fixées par le masque /128
PostUp , pour la mise en place des règles iptables de translation d’adresses à l’activation du VPN (autoriser le routage des paquets réseau venant des clients vers internet)
PostDown , pour la suppression des règles iptables de translation d’adresses à l’arrêt du VPN
PrivateKey , clé privée du serveur (wg0.key)
DNS = Pour utiliser un pair comme serveur DNS, définissez DNS = wireguard_internal_ip_address_of_peer dans la section [Interface]. Les domaines de recherche sont également définis avec l’option DNS =. Séparez toutes les valeurs dans la liste par des virgules. AllowedIPs = Pour acheminer tout le trafic du tunnel vers un pair spécifique, ajoutez l’itinéraire par défaut (0.0.0.0/0 pour IPv4 et ::/0 pour IPv6) à AllowedIPs. Par exemple, AllowedIPs = 0.0.0.0/0, ::/0. wg-quick se chargera automatiquement de configurer le routage correct et fwmark [5] pour que le réseau fonctionne toujours.

Modifier les droits des fichiers wg0.conf (lecture uniquement par “root”)

1
chmod 600 /etc/wireguard/wg0.conf

Activer wireguard

Pour une activation permanente de wireguard

1
sudo systemctl enable wg-quick@wg0.service

Modifier unbound

Modifier le fichier de configuration unbound-wg.conf pout y ajouter l’adresse IP privée 10.30.55.1

1
sudo nano /etc/unbound/unbound.conf.d/unbound-wg.conf 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
server:
    # ne rien enregistrer dans les journaux hormis les erreurs
    verbosity: 0

    # n'écouter que sur l'interface locale en IPv4
    # unbound nécessite d'être relancé si modifié
    interface: 127.0.0.1
    interface: 10.30.55.1

    port: 53

    # refuser tout le monde sauf les connexions locales (pas forcément
    # nécessaire vu que le serveur n'écoute que sur la boucle locale en IPv4)
    access-control: 0.0.0.0/0 refuse
    access-control: 127.0.0.1/32 allow
    access-control: 10.30.55.0/24 allow

    # par défaut, unbound ne log pas les requêtes ni les réponses
    # on peut le rappeler au cas où
    log-queries: no
    log-replies: no

    # imposer la QNAME minimisation (RFC 7816)
    # Pour mieux protéger la vie privée
    qname-minimisation: yes
    # même si le serveur faisant autorité ne le veut pas
    #   après discussion, il est possible que cette option ne soit
    #   pas recommandée dans le cadre d'un résolveur ouvert
    qname-minimisation-strict: yes

Relancer unbound

1
sudo systemctl restart unbound

Wireguard wg-gen-web

Le but est d’exécuter Wg Gen Web dans un espace et WireGuard sur le système hôte.wg-gen-web (original)

Caractéristiques

  • Libre-service et basé sur le web
  • QR-Code pour une configuration pratique du client mobile
  • Support optionnel multi-utilisateurs derrière un proxy d’authentification
  • Prise en charge de l’authentification simple
  • Zéro dépendance externe - juste un binaire unique utilisant le module noyau wireguard
  • Déploiement de binaires et de conteneurs

Prérequis

Installer go

1
2
3
4
5
cd ~
wget https://go.dev/dl/go1.23.1.linux-amd64.tar.gz
sudo tar -C /usr/local -xzf go1.23.1.linux-amd64.tar.gz
echo "export PATH=$PATH:/usr/local/go/bin"  >> ~/.bashrc
source ~/.bashrc

Version go version –> go version go1.23.1 linux/amd64

Installer node

1
2
curl -fsSL https://deb.nodesource.com/setup_20.x | sudo bash -
sudo apt-get install -y nodejs

Versions node -v && npm -v
v20.17.0
10.8.2

Vous devez avoir WireGuard installé sur la machine qui exécute wg-ui

Application web

Création dossier application web

1
sudo mkdir -p /opt/appwg

Construction du site

1
2
3
4
5
6
7
8
9
10
11
cd ~/wg-webui-fr/
go mod tidy
go build -o wg-ui main.go
cd ui
export NODE_OPTIONS=--openssl-legacy-provider
export VUE_APP_API_BASE_URL=http://localhost:8080/api/v1.0
npm install
npm run build
sudo mkdir -p /opt/appwg/ui
sudo cp ../wg-ui /opt/appwg
sudo cp -r dist /opt/appwg/ui/

Environnement

l’autorisation à 2 facteurs n’est pas utilisée, le fichier /opt/appwg/.env se résume à remplir la zone correspondante SMTP de la messagerie et désactiver l’autorisation

1
/opt/appwg/.env
1
2
3
4
5
6
7
8
9
10
11
12
13
14
SERVER=127.0.0.1
PORT=8090
# Gin framework release mode
#GIN_MODE=release
GIN_MODE=debug

WG_CONF_DIR=/etc/wireguard
WG_INTERFACE_NAME=wg0.conf

SMTP_HOST=127.0.0.1
SMTP_PORT=587
SMTP_USERNAME=""
SMTP_PASSWORD=""
SMTP_FROM="wg-web-ui@wg-web-ui.xyz"

On modifie dans /opt/appwg/.env ,le paramètre WG_CONF_DIR=./wireguard → WG_CONF_DIR=/etc/wireguard

Créer service wgweb

Créer un service systemd wgweb qui lance le serveur avec journalisation

1
sudo nano /etc/systemd/system/wgweb.service
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[Unit]
Description=Wireguard web
After=network.target

[Service]

Type=simple

Restart=on-failure
RestartSec=10

WorkingDirectory=/opt/appwg
ExecStart=/opt/appwg/wg-ui

[Install]
WantedBy=multi-user.target

Créer et configurer server.json

wireguard (wg0.conf et server.json)

Modifier les fichiers existants pour être identique au paramétrage de wireguard wg0.conf situé sous /etc/wireguard

1
/etc/wireguard/server.json 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
{
 "address": [
    "10.30.55.1", 
    "fd27:4ae2:2ed9::1"
  ],
  "listenPort": 51820,
  "mtu": 0,
  "privateKey": "A----------------------------------------c=",
  "publicKey": "v----------------------------------------c=",
  "endpoint": "91.194.161.27:52255",
  "persistentKeepalive": 16,
  "dns": [
    "10.30.55.1", 
    "fd27:4ae2:2ed9::1"
  ],
  "allowedips": [
    "0.0.0.0/0",
    "::/0"
  ],
  "preUp": "",
  "postUp": "ufw route allow in on wg0 out on ens3; iptables -t nat -I POSTROUTING -o ens3 -j MASQUERADE; ip6tables -t nat -A POSTROUTING -o ens3 -j MASQUERADE",
  "preDown": "ufw route delete allow in on wg0 out on ens3; iptables -t nat -D POSTROUTING -o ens3 -j MASQUERADE; ip6tables -t nat -D POSTROUTING -o ens3 -j MASQUERADE",
  "postDown": "",
  "updatedBy": "Yann",
  "created": "2024-09-15T18:00:50.589913433Z",
  "updated": "2024-09-15T18:00:50.589913433Z"
}

Recharger systemd puis démarrer le service:

1
2
3
sudo systemctl daemon-reload
sudo systemctl start wgweb.service
sudo systemctl status wgweb.service
1
2
3
● wgweb.service - Wireguard web
[...]
sept. 15 16:57:25 icevps.xyz wg-ui[14292]: [GIN-debug] Listening and serving HTTP on 127.0.0.1:8090

Démarrer service wireguard

Lancer wireguard

1
sudo systemctl start wg-quick@wg0.service

Accès page Web Wireguard

On utilise la redirection port SSH (Tunneling SSH)

Vérification,ouvrir un terminal sur le client linux qui dispose des clés ssh et lancer la commande

1
ssh -L 9500:localhost:8090 hallmar@91.194.161.27 -p 55027 -i /home/yann/.ssh/icevps_xyz

Ouvrir un navigateur sur le client et saisir localhost:9500 pour afficher le gestionnaire web de wireguard

wg-cx11 Activer le service si tout fonctionne

1
sudo systemctl enable wgweb.service

Reconstruire wg-web

On peut recompiler l’application wg-web suite à des modifications

Procédure de reconstruction $HOME/reconstruire.sh

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
cat > $HOME/reconstruire.sh << EOF
#!/bin/bash

echo "Arrêt wgweb.service"
sudo systemctl stop wgweb.service
echo "Sauvegarde"
sudo cp /opt/appwg/.env _.env
echo "Supprimer appwg"
sudo rm -r /opt/appwg
echo "Construire wg-ui main.go"
cd $HOME/wg-webui-fr/
go mod tidy
go build -o wg-ui main.go
cd ui
export NODE_OPTIONS=--openssl-legacy-provider
export VUE_APP_API_BASE_URL=http://localhost:8080/api/v1.0
npm install
npm run build
sudo mkdir -p /opt/appwg/ui
sudo cp ../wg-ui /opt/appwg
sudo cp -r dist /opt/appwg/ui/
echo "Restaurer environnement"
sudo cp $HOME/_.env /opt/appwg/.env
echo "Démarrer le service"
sudo systemctl start wgweb.service
echo "FIN reconstruction"
EOF

La rendre exécutable

1
chmod +x $HOME/reconstruire.sh
Cet article est sous licence CC BY 4.0 par l'auteur.