Inhaltsverzeichnis

wireguard

WireGuard ist eine freie VPN-Lösung, vor allem geeignet für schnelle 1:1 (bzw. site-2-site)-Verbindungen. Der Schlüsselaustausch findet ausschließlich über Curve25519 und die Verschlüsselung über ChaCha20 statt.

Installation

Optional: routing aktivieren in /etc/sysctl.conf → net.ipv4.ip_forward = 1 or live: /proc/sys/net/ipv4/ip_forward

Ubuntu 18.04

# sudo apt install software-properties-common
# enthalten in bionic-updates (universe) https://packages.ubuntu.com/bionic-updates/wireguard-dkms
sudo apt-get update
sudo apt-get install wireguard
# modprobe wireguard ?

Fehlermeldung:

Module build for kernel 4.15.0-96-generic was skipped since the
kernel headers for this kernel does not seem to be installed.
sudo apt install linux-headers-generic

Debian 10

deb http://deb.debian.org/debian buster-backports main contrib
deb-src http://deb.debian.org/debian buster-backports main contrib

pinning des Paketes nicht nötig (weil wireguard erst ab buster-backports vorhanden)

# vi /etc/apt/preferences.d/90_wireguard
Package: wireguard wireguard-dkms wireguard-tools
Pin: release n=buster-backports
Pin-Priority: 990
sudo apt install linux-headers-generic # oder linux-headers-amd64
# oder bei einem cloud-kernel:
# sudo apt install linux-headers-cloud-amd64
# apt install wireguard-dkms
sudo apt install wireguard

Debian 11

sudo apt install wireguard

Alternativ ist die DKMS-Variante möglich.

Raspian Debian 10

Die folgende dkms-Methode funktioniert mindestens bei Raspberry 3.B Rev. 1.2, andere Modelle erfordern ggf. die manuelle Kompilation (siehe Quelle).

dmesg -T | grep -i Model
cat /proc/cpuinfo
cat /sys/firmware/devicetree/base/model
Ausgabe: Raspberry Pi 3 Model B Rev 1.2
apt-get install raspberrypi-kernel-headers
echo "deb http://deb.debian.org/debian/ unstable main" | tee --append /etc/apt/sources.list.d/unstable.list
apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 04EE7237B7D453EC
printf 'Package: *\nPin: release a=unstable\nPin-Priority: 150\n' | tee --append /etc/apt/preferences.d/limit-unstable
 
apt update
apt-get install --no-install-recommends wireguard

Quelle: Raspberry Pi – Installation und Betrieb von WireGuard

Modul bei Start automatisch laden

debian10, debian 11

mindestens unter debian 11 wird das Modul automatisch geladen.

echo "wireguard" >> /etc/modules-load.d/modules.conf

andere Systeme

echo "wireguard" >> /etc/modules

opnsense

https://docs.opnsense.org/manual/how-tos/wireguard-s2s.html

pfsense

experimental add-on in pfSense CE 2.5.2 .

Windows

Für Administrative Benutzer kein Problem, für Standardbenutzer mit workarounds.

Alternative Lösung:

New-ItemProperty "hklm:\software\wireguard" -Name "LimitedOperatorUI" -Value 1 -PropertyType "DWord" -Force
Add-LocalGroupMember -Group "Network Configuration Operators" -Member "$username"

Debugging

wireguard unterstützt dynamisches debugging auf dmesg, das ist nützlich um z.B. nicht korrekte pubkeys oder presharedkeys zu identifizieren:

echo 'module wireguard +p' > /sys/kernel/debug/dynamic_debug/control

To disable debug:

echo 'module wireguard -p' > /sys/kernel/debug/dynamic_debug/control

Bugs

modul nicht vorhanden

in Zusammenhang mit dem obigen Problem kann es passieren das der build bei gemischt alten und neuen kerneln fehlschlägt.

Wenn wireguard daher im aktuellen Kernel nicht vorhanden ist (

modinfo wireguard

) sollten alte Kernel vom System entfernt werden und neu installiert werden:

apt-get --reinstall install wireguard wireguard-dkms

Konfiguration

grafische Oberflächen

  1. pfsense: vpn → wireguard, Status → wireguard (leider kein QR-Code)
  2. opnsense:
  3. standalone-server: wireguard-UI schreibt die config, generiert profile, download, mailversand möglich, plus anzeige von QR-Code.

Keys generieren

cd /etc/wireguard && wg genkey | tee wg-private.key | wg pubkey > wg-public.key
sudo wg genpsk > psk.key
chmod 600 wg-private.key psk.key

Konfiguration erzeugen

Datei anlegen: /etc/wireguard/wg-$NAME.conf

QR-Code aus Konfiguration

Im Textmodus anzeigen:

qrencode -t ansiutf8 < /etc/wireguard/wg-$NAME.conf

Als Grafik abspeichern:

qrencode -t png --output=FILENAME < /etc/wireguard/wg-$NAME.conf

Interface aus Konfiguration generieren

via systemd:

systemctl enable wg-quick@$NAME.service 
systemctl start wg-quick@$NAME.service 
systemctl status wg-quick@$NAME.service

Interface via System-Netzwerk-Konfiguration anlegen

via /etc/network/interfaces oder /etc/network/interfaces.d/$NAME.cfg:

auto $NAME
iface $NAME inet static
  address 1.2.3.4
  netmask 255.255.255.0
#        pre-up ip link add $IFACE type wireguard
#        pre-up wg setconf $IFACE /etc/wireguard/$IFACE.conf
#        up ip route add 5.6.7.8/24 dev $IFACE
#        down ip route del 5.6.7.8/24 dev $IFACE
#        post-down ip link del $IFACE
pre-up wg-quick up $NAME
post-down wg-quick down $NAME

Peer-To-Peer-Architektur

Alle Teilnehmer brauchen feste IPs (oder müssen z.B. via Dyndns) einen FQDN haben.

[Interface]
PrivateKey = <paste eigener wg-private.key>
ListenPort = <enter a port number to use for Wireguard UDP data, 51820 seems common>
# PresharedKey = <psk.key>

[Peer1]
Endpoint = <server IP>:<server port>
PublicKey = <paste wg-public.key von Peer1>
AllowedIPs = 0.0.0.0/0, ::/0
# PresharedKey = <psk.key>
PersistentKeepalive = 25

Client-Server Architektur

https://wiki.ubuntuusers.de/WireGuard/Client-Server_Architektur/

Beispiel: Client und Server teilen sich das Netz 1.2.3.4/24. Der Server hat routing aktiviert und macht via iptables masquerading der privaten IPs. Es muss der Public-key vom Client1 in die Config übernommen werden, die Gegenstelle wird immer als „Peer“ konfiguriert.

Server Config

[Interface]
# meine IP im internen VPN-Netz:
Address = 1.2.3.4/24
ListenPort = 51820
PrivateKey = <paste wg-private.key Server>
# Allow forwarding + masquerading (optional):
PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -A FORWARD -o %i -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -D FORWARD -o %i -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE

[Peer]
# Client1
PublicKey = <paste wg-public.key Client1>
# meine IP (muss /32 sein da überlappende AllowedIPs nicht funktionieren!)
AllowedIPs = 1.2.3.5/32
# PersistentKeepalive = 25

[Peer]
# Client2
PublicKey = <paste wg-public.key Client1>
AllowedIPs = 1.2.3.6/32

Client Config

[Interface]
# meine interne IP:
Address = 1.2.3.4/24
PrivateKey = <paste wg-private.key Client1>                          
# resolvconf needed:
# DNS = 9.9.9.9, 8.8.4.4

[Peer]
Endpoint = vpn.server.tld:51820
PublicKey = <paste wg-public.key Server>
# nur interne Netze?
# AllowedIPs = 1.2.3.4/24
# ..oder alles durch den Tunnel?
AllowedIPs = 0.0.0.0/0, ::/0
# Falls es zu Verbindungabbrüchen kommt:
#PersistentKeepalive = 25 
systemctl enable wg-quick@$NAME.service
systemctl start wg-quick@$NAME.service

MTU

Standardmäßig benutzt wireguard eine MTU von 1420. Aus den 1500 von Ethernet geht ab: IPv4 (20 Bytes) oder IPv6 (40 Bytes) - UDP (8 Bytes) - Wireguard Overhead (32 Bytes). Aufgrund von PPPoE (besser 1412) oder anderen Faktoren kann dies immer noch zu hoch sein. Ein Wert von 1380 sollte in jedem Fall ausreichen.

Messen lässt sich das mit tracepath oder

traceroute --mtu

, letzteres erfordert eine aktuelle traceroute-Version.

MTU = 1380

Die folgende Einstellung sagt dem Server das er auch nichts größeres schicken soll (lt. Quelle):

# Client
PostUp = iptables -A FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu

Steuerbefehle

Usage: wg <cmd> [<args>]

Available subcommands:
  show: Shows the current configuration and device information
  showconf: Shows the current configuration of a given WireGuard interface, for use with `setconf'
  set: Change the current configuration, add peers, remove peers, or change peers
  setconf: Applies a configuration file to a WireGuard interface
  addconf: Appends a configuration file to a WireGuard interface
  syncconf: Synchronizes a configuration file to a WireGuard interface
  genkey: Generates a new private key and writes it to stdout
  genpsk: Generates a new preshared key and writes it to stdout
  pubkey: Reads a private key from stdin and writes a public key to stdout
You may pass `--help' to any of these subcommands to view usage.