WireGuard LXC Alpine Linux
100 % Testé et approuvé
LXC Alpine 3.12
Installation de WireGuard Server
Avec un téléphone android connecté !!! :
On autorise le routage :
lxcalpine:~# echo 'net.ipv4.ip_forward=1' >> /etc/sysctl.conf lxcalpine:~# sysctl -p
net.ipv4.ip_forward = 1
lxcalpine:~# rc-update add sysctl default
Puis on install :
lxcalpine:~# apk update && apk upgrade lxcalpine:~# apk add wireguard-tools
Configuration de WireGuard Server
On génère la configuration sur wireguardconfig
# vi /etc/wireguard/wg0.conf
[Interface] Address = 10.0.0.1/24 ListenPort = 51820 PrivateKey = ***************************************** PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE [Peer] PublicKey = ***************************************** PresharedKey = ***************************************** AllowedIPs = 10.0.0.2/32 [Peer] PublicKey = ***************************************** PresharedKey = ***************************************** AllowedIPs = 10.0.0.3/32 [Peer] PublicKey = ***************************************** PresharedKey = ***************************************** AllowedIPs = 10.0.0.4/32
# vi /etc/wireguard/client1.conf
[Interface] Address = 10.0.0.2/24 ListenPort = 51820 PrivateKey = ***************************************** [Peer] PublicKey = ***************************************** PresharedKey = ***************************************** AllowedIPs = 0.0.0.0/1, 128.0.0.0/1 Endpoint = myserver.dyndns.org:51820
Test du service
lxcalpine:~# wg-quick up wg0
[#] ip link add wg0 type wireguard [#] wg setconf wg0 /dev/fd/63 [#] ip -4 address add 10.0.0.1/24 dev wg0 [#] ip link set mtu 1420 up dev wg0 [#] iptables -A FORWARD -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
lxcalpine:~# wg
interface: wg0 public key: ***************************************** private key: (hidden) listening port: 51820 peer: ***************************************** preshared key: (hidden) allowed ips: 10.0.0.2/32 peer: ***************************************** preshared key: (hidden) allowed ips: 10.0.0.3/32 peer: ***************************************** preshared key: (hidden) allowed ips: 10.0.0.4/32
Fin du test :
lxcalpine:~# wg-quick down wg0
[#] ip link delete dev wg0 [#] iptables -D FORWARD -i wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
Création du script init.d pour lancer le service
lxcalpine:~# vi /etc/init.d/wireguard
#!/sbin/openrc-run
depend() {
need localmount
need net
}
start() {
ebegin "Starting wireguard"
/usr/bin/wg-quick up wg0
eend $?
}
stop() {
ebegin "Stopping wireguard"
/usr/bin/wg-quick down wg0
eend $?
}
On active le script immédiatement et au redémarrage :
lxcalpine:~# chmod +x /etc/init.d/wireguard lxcalpine:~# rc-update add wireguard default lxcalpine:~# service wireguard start
On peut tester avec "wg", rebooter pour vérifier etc...
(Optionnel) QR Code
lxcalpine:~# apk add libqrencode
Exemple :
lxcalpine:~# qrencode -t ansiutf8 < /etc/wireguard/client1.conf
voila!
Ajout d'un utilisateur
On crée les clefs de cryptage pour le nouvel utilisateur dans le repertoir "tmp" :
# cd /tmp/
# umask 077
# name="nom_utilisateur"
# wg genkey | tee "${name}.key" | wg pubkey > "${name}.pub"
# wg genpsk > "${name}.psk"
On peuple le fichier de configuration de WireGuard avec le nouvel utilisateur :
# echo "" >> /etc/wireguard/wg0.conf
# echo "[Peer]" >> /etc/wireguard/wg0.conf
# echo "PublicKey = $(cat "${name}.pub")" >> /etc/wireguard/wg0.conf
# echo "PresharedKey = $(cat "${name}.psk")" >> /etc/wireguard/wg0.conf
# echo "AllowedIPs = 10.0.0.5/32" >> /etc/wireguard/wg0.conf
Ensuite on peuple le fichier de configuration utilisateur, il faut d'abord récupérer la clef pubique du serveur (ici en bleu) :
# wg
interface: wg0 public key: MaClEfPubLiQUe= private key: (hidden) ...
# echo "[Interface]" > "/etc/wireguard/${name}.conf"
# echo "Address = 10.0.0.5/24" >> "/etc/wireguard/${name}.conf"
# echo "ListenPort = 51820" >> "/etc/wireguard/${name}.conf"
# echo "PrivateKey = $(cat "${name}.key")" >> "/etc/wireguard/${name}.conf"
# echo "" >> "/etc/wireguard/${name}.conf"
# echo "[Peer]" >> "/etc/wireguard/${name}.conf"
# echo "PublicKey = MaClEfPubLiQUe=" >> "/etc/wireguard/${name}.conf"
# echo "PresharedKey = $(cat "${name}.psk")" >> "/etc/wireguard/${name}.conf"
# echo "AllowedIPs = 192.168.1.0/24" >> "/etc/wireguard/${name}.conf"
# echo "Endpoint = monserveurvpn.exemple.net:51820" >> "/etc/wireguard/${name}.conf"
Enfin on redémarre le service pour appliquer les changement :
# service wireguard restart
wireguard-ui
Installation
On récupère le programme :
# mkdir -p /opt/wgui # cd /opt/wgui # https://github.com/ngoduykhanh/wireguard-ui/releases/download/v0.6.2/wireguard-ui-v0.6.2-linux-amd64.tar.gz # tar -xzf wireguard-ui-v0.6.2-linux-amd64.tar.gz # rm wireguard-ui-v0.6.2-linux-amd64.tar.gz
On peut tester le fonctionnement du serveur en lançant le bin :
# /opt/wgui/wireguard-ui
Le serveur web sera accessible sur le port 5000, avec l'utilisateur "admin" et mot de passe "admin" par défault (penser à changer le mot de passe immédiatement).
Création des scripts RC
(Optionnel) Script pour surveillé wg0.conf
On crée le script exécutable :
# vi /usr/local/bin/wgui
#!/bin/sh wg-quick down wg0 wg-quick up wg0
# chmod +x /usr/local/bin/wgui
Puis le script RC pour l'utiliser :
# vi /etc/init.d/wgui
#!/sbin/openrc-run
command=/sbin/inotifyd
command_args="/usr/local/bin/wgui /etc/wireguard/wg0.conf:w"
pidfile=/run/${RC_SVCNAME}.pid
command_background=yes
# chmod +x /etc/init.d/wgui
Enfin on inscrit le script RC au système :
# rc-service wgui start # rc-update add wgui default
Script RC pour lancer le GUI automatiquement
# vi /etc/init.d/wireguard-ui
#!/sbin/openrc-run
name="wireguard-ui"
directory="/opt/wgui"
command="/opt/wgui/wireguard-ui"
command_background="yes"
pidfile="/run/${RC_SVCNAME}.pid"
depend() {
need net
}
# chmod +x /etc/init.d/wireguard-ui # rc-update add wireguard-ui default # rc-service wireguard-ui start # reboot
Importation ancienne configuration
"wireguard-ui" est un projet fonctionnel mais dont le développement est abandonné/lent. L'interface web n'est pas prévu pour lire une ancienne configuation, si vous ne démarrez pas votre VPN avec la GUI (donc en partant de 0) il faudra modifier des fichiers .json à la main dans "/opt/wgui/db/"
A noter qu'un utilisateur à créé un script d'import automatisé (non testé).
Certains paramètres pourront être recréé via la GUI, d'autres devront être modifié à la main (pensez a sauvegarder votre wg0.conf et fichiers clients), exemples :
- Les clefs du serveur se trouvent dans "/opt/wgui/db/server/keypair.json"
- il est possible de recréer les utilisateur via la GUI, mais si vous spécifiez la "PublicKey" et "PresharedKey" alors il faudra renseigner la "private_key" dans "/opt/wgui/db/clients/client.json
vhost nginx
server {
listen 80;
listen [::]:80;
server_name wireguard.exemple.net;
# return 404;
return 301 https://$host$request_uri;
}
server {
server_name wireguard.exemple.net;
error_page 403 https://wireguard.exemple.net;
location / {
#proxy_set_header Upgrade $http_upgrade;
#proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
#proxy_set_header X-Forwarded-Host $host;
#proxy_set_header X-Forwarded-Port $server_port;
proxy_pass http://IP_SERVEUR_WEB:5000;
# proxy_pass https://IP_SERVEUR_WEB:PORT; #Alternatif pour redirection sur https
#proxy_buffering off; #activer pour désactiver le "buffering"
}
listen [::]:443 ssl; # managed by Certbot
listen 443 ssl; # managed by Certbot
ssl_certificate /etc/letsencrypt/live/wireguard.exemple.net/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/wireguard.exemple.net/privkey.pem;
include /etc/letsencrypt/options-ssl-nginx.conf;
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
add_header Strict-Transport-Security "max-age=31536000" always;
ssl_trusted_certificate /etc/letsencrypt/live/wireguard.exemple.net/chain.pem;
#ssl_stapling on;
#ssl_stapling_verify on;
server_tokens off;
add_header X-Frame-Options "SAMEORIGIN";
add_header X-XSS-Protection "1; mode=block";
add_header X-Content-Type-Options "nosniff";
}