linux:wireguard

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.

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
#bzw. bei einem cloud-kernel:
# sudo apt install linux-headers-cloud-amd64
# apt install wireguard-dkms
sudo apt install wireguard

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

  • backported feature linux-image-4.19.0-9 breaks wireguard ( 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.

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

QR-Code aus Konfiguration

Im Textmodus anzeigen:

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

Als Grafik abspeichern:

qrencode -t ansiutf8 --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.

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

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
  • Konfiguration anzeigen:
    wg showconf $Verbindungsname
  • Verbindungsstatus anzeigen:
    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.