====== 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 ==== ''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: [[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.