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.
Optional: routing aktivieren in /etc/sysctl.conf → net.ipv4.ip_forward = 1 or live: /proc/sys/net/ipv4/ip_forward
# 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
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
sudo apt install wireguard
Alternativ ist die DKMS-Variante möglich.
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
mindestens unter debian 11 wird das Modul automatisch geladen.
echo "wireguard" >> /etc/modules-load.d/modules.conf
echo "wireguard" >> /etc/modules
experimental add-on in pfSense CE 2.5.2 .
Für Administrative Benutzer kein Problem, für Standardbenutzer mit workarounds.
New-ItemProperty "hklm:\software\wireguard" -Name "LimitedOperatorUI" -Value 1 -PropertyType "DWord" -Force Add-LocalGroupMember -Group "Network Configuration Operators" -Member "$username"
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
/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.
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
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
Datei anlegen: /etc/wireguard/wg-$NAME.conf
Im Textmodus anzeigen:
qrencode -t ansiutf8 < /etc/wireguard/wg-$NAME.conf
Als Grafik abspeichern:
qrencode -t png --output=FILENAME < /etc/wireguard/wg-$NAME.conf
via systemd:
systemctl enable wg-quick@$NAME.service systemctl start wg-quick@$NAME.service systemctl status wg-quick@$NAME.service
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
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
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.
[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
[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
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
wg showconf $Verbindungsname
wg show
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.