Homemade WireGuard VPN on a VPS server

De mémoire non. Comment tu fait ton test ?

Du coup cette partie semble fonctionner,

Donc pour chaque client je dois faire un bloque par ip ?

Sur mon vpn actuelle j’ai ça comme règle tout passe.
PostUp:iptables -A FORWARD -i %i -j ACCEPT; iptables -t nat -A POSTROUTING -o ens192 -j MASQUERADE
postDown: iptables -D FORWARD -i %i -j ACCEPT; iptables -t nat -D POSTROUTING -o ens192 -j MASQUERADE

Ce genre de règle convient pour du trafique internet simple sans routage de port nat. Mais il ne dit pas par exemple au serveur que faire de ce qui arrive en http, sur quel client l’envoyer et inversement ce qui arrive d’un client (par exemple en smtp sur le port 25) où il doit l’envoyer; en l’occurrence vers l’extérieur.

Du coup dans le même exemple une boucle est possible à faire pour éviter de C/C le même bloque x FOIS

for ip in 10 50
DO
iptables -t nat -A POSTROUTING -s 10.6.0.$ip -j SNAT --to [insert public IPV4 of the VPS];
iptables -A FORWARD -s 10.0.6.$ip -j ACCEPT;
ip6tables -t nat -A POSTROUTING -s fd42:42:42::$ip -j SNAT --to [insert public IPV6 of the VPS];
ip6tables -A FORWARD -s fd42:42:42::$ip -j ACCEPT;
DONE

for ip in 10 50
DO
iptables -t nat -D POSTROUTING -s 10.6.0.$ip -j SNAT --to [insert public IPV4 of the VPS];
iptables -D FORWARD -s 10.0.6.$ip -j ACCEPT;
ip6tables -t nat -D POSTROUTING -s fd42:42:42::$ip -j SNAT --to [insert public IPV6 of the VPS];
ip6tables -D FORWARD -s fd42:42:42::$ip -j ACCEPT;
DONE

???

Comme outil pour générer des clients
https://www.wireguardconfig.com/ (ip V6) j’ai pas tester celui-ci
Ou bcp plus vieux
GitHub - brittson/wireguard_config_maker: Simple Java program to create wireguard client config files (pas ip V6) Déjà testé fonctionne bien

Oui carrément !

1 Like

Bon ça fonctionne avec la boucle !!

1 Like

Bonjour,
avec mes maigres compétences, j’ai fais un script qui facilite la création de PEER.
Si ça peut aider.
Je vais rajouter la création des QR par la même occasion

Je ne suis pas un expert donc si des corrections sont à faire… Je suis preneur merci.

#!/bin/bash
#Pour https://forum.yunohost.org/t/homemade-wireguard-vpn-on-a-vps-server/15662
# check if root
#https://github.com/Tontonjo/proxmox_toolbox/blob/main/proxmox_toolbox.sh line73
if [[ $(id -u) -ne 0 ]] ; then echo "- Please run as root / sudo" ; exit 1 ; fi

#quelques variables
RANGE_IPV6=fd42:42:42::
RANGE_IP=10.06.0.
DNS_IP=1.1.1.1
PATH_CLIENT_DIR=clients/


echo '::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::'
echo '                   Ajouter un PEER                                '
echo '::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::'
echo 'Nom du peer'
read 'peer_name'
echo 'IP ( les derniers chiffres) il faut être sur du chiffre et que celui-ci ne soit pas encore attribué'
read 'peer_ip'

#On créé un dossier client
if [ -d "/etc/wireguard/clients/" ]; then
 echo "Dossier client inconnu"
else
mkdir -m 700 "/etc/wireguard/${PATH_CLIENT_DIR}"
fi

#https://docs.pi-hole.net/guides/vpn/wireguard/client/

echo '::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::'
echo '                   Ajouter du client (wg0.conf)                   '
echo '::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::'
umask 077

#Création d'un dossier pour le nouveau client
if [ -d "/etc/wireguard/clients/${peer_name}" ]; then
 echo "Dossier peer "${peer_name}" inconnu"
else
mkdir -m 700 /etc/wireguard/"${PATH_CLIENT_DIR}${peer_name}"
fi

PATH_CLIENT_DIR_DIR="/etc/wireguard/${PATH_CLIENT_DIR}${peer_name}/"

wg genkey | tee "${PATH_CLIENT_DIR_DIR}${peer_name}.key" | wg pubkey > "${PATH_CLIENT_DIR_DIR}${peer_name}.pub"
wg genpsk > "${PATH_CLIENT_DIR_DIR}${peer_name}.psk"

#echo "#############################################" >> /etc/wireguard/wg0.conf
echo "" >> /etc/wireguard/wg0.conf
echo "#"${peer_name}" " >> /etc/wireguard/wg0.conf
echo "[Peer]" >> /etc/wireguard/wg0.conf
echo "PublicKey = $(cat "${PATH_CLIENT_DIR_DIR}${peer_name}".pub)" >> /etc/wireguard/wg0.conf
echo "PresharedKey = $(cat "${PATH_CLIENT_DIR_DIR}${peer_name}".psk)" >> /etc/wireguard/wg0.conf
echo "AllowedIPs = "${RANGE_IP}${peer_ip}"/32, "${RANGE_IPV6}${peer_ip}"/128" >> /etc/wireguard/wg0.conf
echo "" >> /etc/wireguard/wg0.conf
#echo "#############################################" >> /etc/wireguard/wg0.conf

echo "[Interface]" > "${PATH_CLIENT_DIR_DIR}${peer_name}.conf"
echo "Address = "${RANGE_IP}${peer_ip}"/32, "${RANGE_IPV6}${peer_ip}"/128" >> "${PATH_CLIENT_DIR_DIR}${peer_name}.conf"
echo "DNS = $DNS_IP" >> "${PATH_CLIENT_DIR_DIR}${peer_name}.conf"
echo "PrivateKey = $(cat "${PATH_CLIENT_DIR_DIR}${peer_name}.key")" >> "${PATH_CLIENT_DIR_DIR}${peer_name}.conf"
echo "PublicKey = $(cat privatekey.pub)" >> "${PATH_CLIENT_DIR_DIR}${peer_name}.conf"
echo "PresharedKey = $(cat "${PATH_CLIENT_DIR_DIR}${peer_name}.psk")" >> "${PATH_CLIENT_DIR_DIR}${peer_name}.conf"
echo '::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::'
echo "                   "${peer_name} Ajouté "                          "
echo '::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::'
1 Like

Ajout de l’installation de qrencode
Ajout de la génération et sauvegarde de qrcode
il manquait la partie peer dans la création du fichier user_peer.conf

Qrcode testé dans l’importation de wireguard et ça passe.
Le script relance à la fin WG0 pour que la création soit prise en compte

Rajout des variables server_port et server_adress

#!/bin/bash
#Pour https://forum.yunohost.org/t/homemade-wireguard-vpn-on-a-vps-server/15662
# check if root
#https://github.com/Tontonjo/proxmox_toolbox/blob/main/proxmox_toolbox.sh line73
if [[ $(id -u) -ne 0 ]] ; then echo "- Please run as root / sudo" ; exit 1 ; fi

# Installation de qrendcode pour le generer les QRCODEssss
if [ $(dpkg-query -W -f='${Status}' qrencode 2>/dev/null | grep -c "ok installed") -eq 0 ]; then
    apt-get install qrencode -y
echo "Merci de relancer le script"
exit
fi



#quelques variables
RANGE_IPV6="fd42:42:42::"
RANGE_IP="10.6.0."
DNS_IP="80.67.169.12, 2001:910:800::12"
PATH_CLIENT_DIR="peer/"
SERVER_ADRESS="mon_domaine.fr" #IP ou DOMAINE
SERVER_PORT="51820"


echo '::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::'
echo '                   Ajouter un PEER                                '
echo '::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::'
echo 'Nom du peer'
read 'peer_name'
echo 'IP ( les derniers chiffres) il faut être sur du chiffre et que celui-ci ne soit pas encore attribué'
read 'peer_ip'

#On créé un dossier client
if [ -d "/etc/wireguard/peer/" ]; then
 echo "Dossier peer inconnu"
else
echo "Création du dossier peer"
mkdir -m 700 "/etc/wireguard/${PATH_CLIENT_DIR}"
fi

#Basé sur https://docs.pi-hole.net/guides/vpn/wireguard/client/

echo '::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::'
echo '                   Ajout du peer (wg0.conf)                   '
echo '::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::'
umask 077

#Création d'un dossier pour le nouveau client
if [ -d "/etc/wireguard/peer/${peer_name}" ]; then
 echo "Dossier  "${peer_name}" inconnu"
else
echo "Création du dossier ${peer_name}"
mkdir -m 700 /etc/wireguard/"${PATH_CLIENT_DIR}${peer_name}"
fi

PATH_CLIENT_DIR_DIR="/etc/wireguard/${PATH_CLIENT_DIR}${peer_name}/"

wg genkey | tee "${PATH_CLIENT_DIR_DIR}${peer_name}.key" | wg pubkey > "${PATH_CLIENT_DIR_DIR}${peer_name}.pub"
wg genpsk > "${PATH_CLIENT_DIR_DIR}${peer_name}.psk"

echo "Mise à jour du fichier WG0.................... OK"
#echo "#############################################" >> /etc/wireguard/wg0.conf
echo "" >> /etc/wireguard/wg0.conf
echo "#"${peer_name}" " >> /etc/wireguard/wg0.conf
echo "[Peer]" >> /etc/wireguard/wg0.conf
echo "PublicKey = $(cat "${PATH_CLIENT_DIR_DIR}${peer_name}".pub)" >> /etc/wireguard/wg0.conf
echo "PresharedKey = $(cat "${PATH_CLIENT_DIR_DIR}${peer_name}".psk)" >> /etc/wireguard/wg0.conf
echo "AllowedIPs = "${RANGE_IP}${peer_ip}"/32, "${RANGE_IPV6}${peer_ip}"/128" >> /etc/wireguard/wg0.conf
echo "" >> /etc/wireguard/wg0.conf
#echo "#############################################" >> /etc/wireguard/wg0.conf

sleep 2

echo "Création du fichier peer.................... OK"
#Interface section
echo "[Interface]" >> "${PATH_CLIENT_DIR_DIR}${peer_name}.conf"
echo "Address = "${RANGE_IP}${peer_ip}"/32, "${RANGE_IPV6}${peer_ip}"/128" >> "${PATH_CLIENT_DIR_DIR}${peer_name}.conf"
echo "DNS = $DNS_IP" >> "${PATH_CLIENT_DIR_DIR}${peer_name}.conf"
echo "PrivateKey = $(cat "${PATH_CLIENT_DIR_DIR}${peer_name}.key")" >> "${PATH_CLIENT_DIR_DIR}${peer_name}.conf"



#Peer section
echo "[Peer]" >> "${PATH_CLIENT_DIR_DIR}${peer_name}.conf"
echo "AllowedIPs = 0.0.0.0/0, ::0/0" >> "${PATH_CLIENT_DIR_DIR}${peer_name}.conf"
echo "Endpoint = "${SERVER_ADRESS}":"${SERVER_PORT} >> "${PATH_CLIENT_DIR_DIR}${peer_name}.conf"
echo "PersistentKeepalive = 25" >> "${PATH_CLIENT_DIR_DIR}${peer_name}.conf"
echo "PublicKey = $(cat publickey.pub)" >> "${PATH_CLIENT_DIR_DIR}${peer_name}.conf"
echo "PresharedKey = $(cat "${PATH_CLIENT_DIR_DIR}${peer_name}.psk")" >> "${PATH_CLIENT_DIR_DIR}${peer_name}.conf"



echo "Sauvegarde du QRCode.................... OK"
qrencode -m 10 -o "${PATH_CLIENT_DIR_DIR}${peer_name}.png" "${PATH_CLIENT_DIR_DIR}${peer_name}.conf"

sleep 2

qrencode -t ansiutf8 -r "${PATH_CLIENT_DIR_DIR}${peer_name}.conf"

sleep 2

echo "Interface WG0 relancé"
wg-quick down wg0 && wg-quick up wg0

echo '::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::'
echo "                   "${peer_name} Ajouté "                          "
echo '::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::'
2 Likes

Il y a pas un soucis avec les ips?

iptables -t nat -D POSTROUTING -s *10.6.0.X*  -j SNAT --to [insert public IPV4 of the VPS]; 
iptables -D FORWARD -s *10.0.6.X*  -j ACCEPT; 

Si en effet, c’est pas bien les copier/coller ! Corrigé !

1 Like

@rungeard

Bonjour, petite question est-ce que d’utiliser ce resolver de DNS est plus intéressant que d’avoir pihole/unbound?

Merci.

C’est un question complexe qui n’admet pas de réponse unique. Tout d’abord sache que rien ne t’empêche de faire tourner unbound sur le VPS et de remplacer par DNS = 127.0.0.1.

Pour revenir à ta question unbound permet d’effectuer la résolution DNS soit même, c’est donc si il est bien configuré la garantie d’une résolution non biaisée (pas de DNS menteur) et anonyme (pas d’appel à un service externe). En outre, le résolveur étant en local, on peut difficilement faire plus rapide.

Concernant un service DNS externe, je dirai qu’il y a une question de confiance à avoir vis à vis du fouisseur. Des fournisseurs éthiques comme la FFDN s’engagent à lutter contre les DNS menteurs, les collectes de données à des fins discutables, etc. D’autres n’ont pas cet réserve. Enfin en fonction des pays d’implantation, les fournisseurs se doivent de se conformer aux lois en rigueur qui dans certains cas les obliges à mentir (lutte contre le piratage, droit d’auteur, etc). Certains fournisseurs proposent des services qui mettent en avant la sécurité avec des listes noires d’ips connues pour être utiliser pour du hack, extorsion, etc… Cela dit de telles listes peuvent aussi être implémentées au niveau d’unbound. C’est d’ailleurs ce que fait PiHole. Un autre point important est la transparence des données qui circule par défaut en clair entre ton serveur et le résolveur DNS. D’où l’intérêt d’utiliser des DNS over https/tls pour éviter d’afficher à son ISP toutes ses requêtes.

Concernant PiHole cela n’est pas un résolveur DNS à proprement parlé mais plus un filtre qui repose sur un résolveur récursif (local ou distant) avec les questions inhérentes.

Enfin il convient de faire remarquer que si tout le monde utilise unbound ou équivalent cela tend à augmenter la charge sur les serveurs racines et cela n’est par forcement souhaitable en termes de performance. Sur ceux je te laisse faire ton choix !

Merci pour l’explication , mais du coup je sais pas quoi faire :wink:

Coucou j’aurai une question pour le LAN

Je souhaiterai donner accès à une seul adresse sur le LAN via le VPN, les règles IPTABLE ça serait quoi?

Merci.

C’est une histoire de masque de réseau sur les interfaces. Si je dis pas de bêtises mais je suis pas expert sur la question tu dois remplacer dans le fichier conf du client

Address = 10.6.0.2/24, fd42:42:42::2/64

par

Address = 10.6.0.2/32, fd42:42:42::2/128

Merci mais déjà essayé. Le problème est que l’on peut faire ce que l’on veut côté client si côté serveur c’est pas verrouillé, on est d’accord ?

Sinon

Seconde méthode : complexe, mais plus sécurisée

Notre solution préférée nécessite de modifier le fichier de configuration du serveur VPN WireGuard. Ici, nous allons modifier le fichier en ligne de commande sur notre Raspberry Pi sous Linux (installer facilement WireGuard sur un Raspberry Pi) :

sudo nano /etc/wireguard/wg0.conf
En dessous du numéro port, ligne 7 par exemple, tapez les commandes suivantes :
PostUp = iptables -I FORWARD -i wg0 -d 192.168.1.0/24 -j REJECTPostUp = iptables -I FORWARD -i wg0 -d 192.168.1.100/32,192.168.1.254/32 -j ACCEPT

PostUP permet d’envoyer une commande au démarrage du service VPN WireGuard. Notre première ligne rejette (REJECT) l’accès à tout le réseau depuis WireGuard. La seconde ligne (ACCEPT) accepte une liste d’adresse IP (ici les deux adresses 192.168.1.100 et 192.168.1.254). Mais ce n’est pas fini…

En effet, nous allons ajouter ces deux autres lignes :

PostDown = iptables -D FORWARD -i wg0 -d 192.168.1.100/32,192.168.1.254/32 -j ACCEPTPostDown = iptables -D FORWARD -i wg0 -d 192.168.1.0/24 -j REJECT

Ces dernières vont supprimer les règles précédentes lorsque le service WireGuard s’arrêtera. Elles ne sont pas obligatoires, mais elle apporte une certaine cohérence et évite quelques erreurs. Pour la prise en compte des nouvelles règles, vous pouvez redémarrer votre Raspberry Pi ou tout simplement taper les commandes ci-dessous:

wg-quick down wg0

puis

wg-quick up wg0

À noter que les lignes PostUp/PostDown peuvent recevoir un fichier .sh (juste après le signe =). Cela permettra d’indiquer plusieurs règles iptables.

1 Like

@rungeard

Je t’embête mais merci :wink:
Je viens de configurer Yunohost avec ce VPN est ça fonctionne + des clients :slight_smile:

Par contre pour mon autre VPN à mon domicile je n’arrive pas à bloquer le full access au réseau local.
Mais pour l’instant c’est niquel.

Bonjour a tous
Ci-joint le script pour restreindre l’accès au réseaux local à tous et donner accès a certaines ip l’accès à certaines ip sur le réseau local.

J’ai gardé la même idée que l"OP

PostUp.sh

for ip in  4 5 6 7 8 9 10 11 #A changer en fonction des ip's utilisées.
 do
 	iptables -I FORWARD -s 10.10.1.$ip -i wg0 -d 10.0.0.0/8 -j REJECT # On rejet l'accès à tous ce réseau
	iptables -I FORWARD -s 10.10.1.$ip -i wg0 -p tcp --dport 5555 -d 10.10.20.5/32 -j ACCEPT # Et on donne accès a une ip et un port bien précis. 
 done

PostDown.sh
Et bien c’est l’inverse :wink:

 for ip in   4 5 6 7 8 9 10 11 A changer en fonction des ip's utilisées.
 do
 	iptables -I FORWARD -s 10.10.1.$ip -i wg0 -p tcp --dport 5555 -d 10.10.20.5/32 -j ACCEPT
 	iptables -I FORWARD -s 10.10.1.$ip -i wg0 -d 10.0.0.0/8 -j REJECT
 
 done

J’ai rajouté une purge de l’iptable, mais je ne sais pas si c’est pertinent

En fin de PostDown.sh

 iptables -P INPUT ACCEPT
 iptables -P FORWARD ACCEPT
 iptables -P OUTPUT ACCEPT
 iptables -t nat -F
 iptables -t mangle -F
 iptables -F
 iptables -X
1 Like