Projet

Général

Profil

Wireguard

Le VPN Kiss, utilisant les dernières règles de l'art, construit pour être audité & performant ! au revoir IPSec & OpenVPN !
Attention cependant Wireguard est un VPN de niveau 3 ! (on ne peut pas par exemple avoir du broadcast pour DHCP ou des VIP Keepalived)

Aquilenet utilise Wireguard avec succès depuis mi-2019, pour interconnecter une partie de ses îlots à son [[infrastructure:|cœur de réseau]].

Le 8 décembre 2019, Wireguard a enfin fait son entrée dans la branche 'net-next' du noyau Linux et pourrait donc faire partie intégrante de la version 5.6 prévue début 2020.

Aujourd'hui Wireguard est intégré dans les noyaux des principaux systèmes: Linux/*BSD/Windows/Mac

Chez Aquilenet

Deux serveurs pour du failover (avec BGP) : Hypnos et Thanatos.

Installation

Configuration

Config serveur (Hypnos)

Section Interface

  • Ajouter à la mano
umask 077
#wg genkey > /etc/wireguard/private
wg genkey | tee /etc/wireguard/private | wg pubkey > /etc/wireguard/publickey
wg set wg0 private-key /etc/wireguard/private
ip link set wg0 up
  • /etc/wireguard/wg0.conf

    [Interface]
    ListenPort = 50000
    FwMark = 0x64
    PrivateKey = `cat /etc/wireguard/private`
    
  • /etc/network/interfaces
    On ajoute les informations suivantes pour Wireguard (on n'utilise pas wg-quick)
    Chaque IP cliente est ajoutée dans la table de routage.

auto wg0
iface wg0 inet static
  address 185.233.101.127
  netmask 255.255.255.255
  pre-up /sbin/ip link add dev $IFACE type wireguard || true
  pre-up wg setconf $IFACE /etc/wireguard/$IFACE.conf || true
  post-up /etc/wireguard/wg-addroute.sh add
  pre-down /etc/wireguard/wg-addroute.sh del
  #pre-up wg addconf $IFACE /etc/wireguard/users/*/$IFACE.conf || true
  up /sbin/ip link set $IFACE up || true
  up /sbin/ip route add default dev $IFACE || true
  down /sbin/ip link del dev $IFACE || true
iface wg0 inet6 static
  address 2a0c:e300:13::1/48
  • /etc/wireguard/wg-addroute.sh

::: info
Suggestion d'ajout de l'action replace
:::

#!/bin/bash 
interface="wg0"
if [[ $1 == "add" || $1 == "del" || $1 == "replace"]]; then # Ajout de replace pour permettre l'ajout de routes à la conf existante
    action="$1"
else
    exit 1
fi

allowed_ips=$(grep -i allowedip /etc/wireguard/wg0.conf | awk -F= '{print $2}')

for ip_line in $allowed_ips; do
  for ip in $ip_line; do
    ip=$(echo "$ip" | sed 's/[ ,]$//')
    if [[ $ip =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}/ ]]; then
      ip route $action $ip dev $interface proto static
    elif [[ $ip =~ ^[a-f0-9:]+ ]]; then
     ip -6 route $action $ip dev $interface proto static
    else
      exit 1
    fi
  done
done

La section [Peer] suivante doit être ajoutée à la configuration de l'utilisateur

[Peer]
Endpoint = hypnos.aquilenet.fr:50000
PublicKey = XRhI4WqBipwY21pxPZ9Q7EWkypnQCKKtJjqu2tUUTVo=
AllowedIPs = 0.0.0.0/0, ::/0

Le paramètre AllowedIPs définit les adresses qui seront routées dans le VPN par l'utilisateur.
Si l'utilisateur ne veut router que de l'ipv6 il peut la positionner à la valeur AllowedIPs = ::/0
Ou, s'il ne veut router qu'Aquilenet AllowedIPs = 185.233.100.0/22, 2a0c:e300::/29

Sections pairs

Chaque client VPN est un pair Wireguard et aura sa propre section [Peer]
Chaque section est constitué d'au moins 2 éléments :

  • # User : Pour identifier rapidement le propriétaire de la connexion
  • PublicKey : La clef publique du client, elle doit être fournie par l'utilisateur et peut être échangée par n'importe quel canal.
  • AllowedIPs : Les adresses ip attribuées à l'utilisateur. Ce paramètre est constitué au minimum d'une adresse IPv6 ou IPv4
    • L'adresse IPv4 est une adresse disponible du réseau 185.233.101.0/24
    • L'adresse IPv6 peut être :
      • une adresse /128 disponible du réseau 2a0c:e300:13::/64
      • un préfixe /64 du réseau 2a0c:e300:13::/48 attribué par l'équipe admin
      • un préfixe /56 du réseau 2a0c:e300:5::/48 attribué par l'équipe admin (Attention, ces réseaux sont aussi utilisés pour les connexions OpenVPN)

Les paramètres suivants optionnels peuvent être ajoutés sur demande :

  • PresharedKey : Ce paramètre permet d'ajouter une couche de chiffrement symétrique pour ajouter une résistance post-quantique. Il doit être échangé avec l'utilisateur par un canal de communication sécurisé. Dans le cadre d'une utilisation en tant qu'accès Internet public, ce paramètre n'est pas réellement utile.
  • Endpoint : Si l'utilisateur dispose d'une adresse IP fixe, ce paramètre permet au serveur d'initier la connexion vers le pair distant. Ce paramètre n'apporte que peu d'avantage dans le cadre d'une utilisation en tant qu'accès Internet, ni même pour de l'auto-hébergement.
  • PersistentKeepalive : La plus part des utilisateurs n'auront pas besoin de ce paramètre

Modèle de section :

[Peer]
# User
PublicKey = $user_pubkey
AllowedIPs = [185.233.101.$user_ipv4/32, ]2a0c:e300:(13::$user_ipv6/128|13:$user_64prefix::/64|5:$user_56prefix::/56

Une fois la section [Peer] ajoutée ou en cas de modification sur le fichier /etc/wireguard/wg0.conf exécuter les commande suivantes pour prise en compte des changements :

wg syncconf wg0 /etc/wireguard/wg0.conf
/etc/wireguard/wg-addroute.sh replace

Client

Voir plutôt [[infrastructure:Pom_buster_install_2019-07]] pour une configuration détaillée.

umask 077
wg genkey | tee /etc/wireguard/private | wg pubkey > /etc/wireguard/publickey
wg set wg0 private-key /etc/wireguard/private
ip link add dev wg0 type wireguard
ip link set wg0 up

Archives

1er test: sacha's Home (Fibre Bouygues) --> @Hypnos (VM Aquilenet)

root@hypnos:/etc/wireguard# iperf3 -s
-----------------------------------------------------------
Server listening on 5201
-----------------------------------------------------------
Accepted connection from 10.33.33.2, port 60038
[  5] local 10.33.33.1 port 5201 connected to 10.33.33.2 port 60040
[ ID] Interval           Transfer     Bandwidth
[  5]   0.00-1.00   sec  15.1 MBytes   127 Mbits/sec                  
[  5]   1.00-2.00   sec  19.9 MBytes   167 Mbits/sec                  
[  5]   2.00-3.00   sec  20.1 MBytes   169 Mbits/sec                  
[  5]   3.00-4.00   sec  20.1 MBytes   169 Mbits/sec                  
[  5]   4.00-5.00   sec  19.7 MBytes   166 Mbits/sec                  
[  5]   5.00-6.00   sec  20.0 MBytes   168 Mbits/sec                  
[  5]   6.00-7.00   sec  20.2 MBytes   169 Mbits/sec                  
[  5]   7.00-8.00   sec  20.2 MBytes   170 Mbits/sec                  
[  5]   8.00-9.00   sec  20.1 MBytes   169 Mbits/sec                  
[  5]   9.00-10.00  sec  20.2 MBytes   169 Mbits/sec                  
[  5]  10.00-10.03  sec   566 KBytes   165 Mbits/sec                  
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bandwidth
[  5]   0.00-10.03  sec  0.00 Bytes  0.00 bits/sec                  sender
[  5]   0.00-10.03  sec   196 MBytes   164 Mbits/sec                  receiver
-----------------------------------------------------------
Server listening on 5201
-----------------------------------------------------------
root@hypnos:/etc/wireguard# wg
interface: wg0
  public key: Va0X1zOpRc9471Aa3DEUUy7UkAv5aq5SojtIPqOSqwg=
  private key: (hidden)
  listening port: 50000

peer: VEfmgnq/aXPX3qBB7Q2fgxAawQdfUYZDRKEQSPC8tnA=
  endpoint: 5.51.0.155:3418
  allowed ips: 10.33.33.0/24
  latest handshake: 4 minutes, 30 seconds ago
  transfer: 208.75 MiB received, 6.68 MiB sent

InstallDebian sur Apu2

https://blog.pgeiser.com/posts/2017/04/installing-debian-stretch-on-a-machine-without-a-graphic-card/

apt-get install aptitude \
     dhcpd resolvconf \
     curl dnsutils htop iperf3 tcpdump tmux whois \
     debian-security-support debsums needrestart
#!/bin/bash
gw=`ip  route | awk '/default/ { print $3 }'`
sysctl -w net.ipv4.ip_forward=1
ip link add dev wg0 type wireguard
ip address add dev wg0 10.33.33.2/24
ip link set up dev wg0
ip route add 185.233.100.19/32 via $gw dev enp1s0
ip route del default
ip route add default dev wg0
wg setconf wg0 /etc/wireguard/wg0.conf

https://git.zx2c4.com/WireGuard/about/src/tools/man/wg-quick.8
https://git.zx2c4.com/WireGuard/about/src/tools/wg.8

https://vincent.bernat.ch/fr/blog/2018-vpn-wireguard-route