====== 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.
===== Links =====
* [[https://wiki.debian.org/Wireguard]]
* [[https://moderncrypto.org/mail-archive/noise/2016/000699.html|AES vs chacha-speed]]
* [[https://www.heise.de/newsticker/meldung/Festgefahrene-Wireguard-Aufnahme-kommt-mit-Linux-5-5-endlich-in-Gang-4588112.html|Kernel integration in 5.6.x]] (backports nach 5.4 + 5.5)
===== 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 (und später) ====
''sudo apt install wireguard''
Bei Debian11 ist alternativ die DKMS-Variante möglich, ab 12 ist dies nicht mehr möglich (wireguard-dkms muss entfernt werden).
==== 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: [[https://www.antary.de/2020/04/09/raspberry-pi-installation-und-betrieb-von-wireguard/|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, [[https://heise.de/-6221971|für Standardbenutzer mit workarounds]].
[[https://news.ycombinator.com/item?id=25533772|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 =====
* [[https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=959157|backported feature linux-image-4.19.0-9 breaks wireguard]] ( [[https://git.zx2c4.com/wireguard-linux-compat/commit/?id=88640eddadaed11668d7d38190d9f6158ea3ff60|upstream fix]] für die Dateien unterhalb von ''/var/lib/dkms/wireguard/1.0.20200429/'')
dkms remove -m wireguard -v 1.0.20200429 -k $(uname -r) # oder: -k all
dkms install -m wireguard -v 1.0.20200429 -k $(uname -r) # oder: -k all
Anschließend funktioniert der build:
Creating symlink /var/lib/dkms/wireguard/1.0.20200429/source ->
/usr/src/wireguard-1.0.20200429
DKMS: add completed.
Kernel preparation unnecessary for this kernel. Skipping...
Building module:
cleaning build area...
make -j2 KERNELRELEASE=4.19.0-8-amd64 -C /lib/modules/4.19.0-8-amd64/build M=/var/lib/dkms/wireguard/1.0.20200429/build.......
cleaning build area...
DKMS: build completed.
wireguard.ko:
Running module version sanity check.
- Original module
- No original module exists within this kernel
- Installation
- Installing to /lib/modules/4.19.0-8-amd64/updates/dkms/
depmod........
DKMS: install completed.
==== 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 ====
- pfsense: vpn -> wireguard, Status -> wireguard (leider kein QR-Code)
- opnsense:
- standalone-server: [[https://github.com/ngoduykhanh/wireguard-ui|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.
* https://wiki.ubuntuusers.de/WireGuard/#Konfiguration
[Interface]
PrivateKey =
ListenPort =
# PresharedKey =
[Peer1]
Endpoint = :
PublicKey =
AllowedIPs = 0.0.0.0/0, ::/0
# PresharedKey =
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 =
# 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 =
# meine IP (muss /32 sein da überlappende AllowedIPs nicht funktionieren!)
AllowedIPs = 1.2.3.5/32
# PersistentKeepalive = 25
[Peer]
# Client2
PublicKey =
AllowedIPs = 1.2.3.6/32
=== Client Config ===
[Interface]
# meine interne IP:
Address = 1.2.3.4/24
PrivateKey =
# resolvconf needed:
# DNS = 9.9.9.9, 8.8.4.4
[Peer]
Endpoint = vpn.server.tld:51820
PublicKey =
# 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. [[https://keremerkan.net/posts/wireguard-mtu-fixes/|Quelle]]):
# Client
PostUp = iptables -A FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu
===== Steuerbefehle =====
* Konfiguration anzeigen: wg showconf $Verbindungsname
* Verbindungsstatus anzeigen: wg show
Usage: wg []
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.