---
title: "Wireguard einrichten"
id: "1999"
type: "post"
slug: "wireguard-einrichten"
published_at: "2020-02-13T07:40:00+00:00"
modified_at: "2020-02-13T09:51:02+00:00"
url: "https://www.geekbundle.org/wireguard-einrichten/"
markdown_url: "https://www.geekbundle.org/wireguard-einrichten.md"
excerpt: "Die Performance zwischen Wireguard und IPSec hatte ich schon in einem vergangenen Beitrag verglichen. Aber wie wird Wireguard sinnvoll eingerichtet und debugged?"
taxonomy_category:
  - "Netzwerk"
taxonomy_post_tag:
  - "linux"
  - "vpn"
  - "wireguard"
---

Table of Contents

Die Performance zwischen [Wireguard](https://www.wireguard.com/)
 und IPSec hatte ich schon in einem [vergangenen Beitrag](https://www.geekbundle.org/wireguard-ipsec-vpn-performance/)
 verglichen. Aber wie wird Wireguard sinnvoll eingerichtet und debugged? Dieser Beitrag ist leicht abgewandelt aus meiner privaten Dokumentation übernommen und erklärt die Einrichtung anhand von Debian. Ich gehe von einem grundlegendem Wissen über Wireguard und Netzwerk im allgemeinen voraus. Für eine Einführung in Wireguard empfehle ich folgenden Link:  
[https://www.wireguard.com/#simple-network-interface](https://www.wireguard.com/#simple-network-interface)

## Installation - Debian

Dieser Teil ist in gekürzter Form aus dem Debian Wiki entnommen:  
[https://wiki.debian.org/Wireguard](https://wiki.debian.org/Wireguard)

```
echo "deb http://deb.debian.org/debian/ unstable main" > /etc/apt/sources.list.d/unstable-wireguard.list
printf 'Package: *\nPin: release a=unstable\nPin-Priority: 90\n' > /etc/apt/preferences.d/limit-unstable
apt update
apt install linux-headers-amd64
apt install wireguard
echo "net.ipv4.ip_forward = 1" > /etc/sysctl.d/99-ip_forward.conf
sysctl -p /etc/sysctl.d/99-ip_forward.conf
```

## Private / Public Keys generieren

```
PRIV=$(wg genkey) && PUB=$(echo $PRIV | wg pubkey) && echo -e "PublicKey = $PUB\nPrivateKey = $PRIV"
```

## Konfiguration

Bei Wireguard gibt es keinen "Server". Jeder Wireguard Endpoint ist ein Peer im Netzwerk. Die Konfiguration besteht bei jedem Peer aus einer Konfigurationsdatei.

### Peer "Server"

Die folgende Beispielconfig unter /etc/wireguard mit z.B. dem Namen wg-internal.conf abspeichern.

```
[Interface]
# PublicKey = <SuperServerNotSecretblahblah>
PrivateKey = <SuperServerSecretblahblah=>
Address = 192.168.102.1/24
ListenPort = 51821
PostUp = iptables -t nat -A POSTROUTING -s 192.168.102.0/24 -d <Tolle.Server.IP> -j ACCEPT
PostUp = iptables -t nat -A POSTROUTING -s 192.168.102.0/24 -o eth0 -j MASQUERADE
PostDown = iptables -t nat -D POSTROUTING -s 192.168.102.0/24 -d <Tolle.Server.IP> -j ACCEPT
PostDown = iptables -t nat -D POSTROUTING -s 192.168.102.0/24 -o eth0 -j MASQUERADE

# Generate Keypair:
#
# PRIV=$(wg genkey) && PUB=$(echo $PRIV | wg pubkey) && echo -e "PublicKey = $PUB\nPrivateKey = $PRIV"
#
#
# Reload Config:
#
# wg syncconf wg-internal <(wg-quick strip wg-internal)
#

# User1
[Peer]
PublicKey = <SuperUser1NotSecretblahblah>
AllowedIPs = 192.168.102.2/32
```

### Client

Unterstützte Betriebssysteme können auf der offiziellen Wireguard Seite nachgesehen werden:  
[https://www.wireguard.com/install/](https://www.wireguard.com/install/)
  
Unterstützt werden unter anderem die Systeme:

- macOS
- Linux
- Android
- Windows
- iPhone
- FreeBSD (wobei diese Implementierung wohl noch mit Vorsicht zu genießen ist)

Folgende Konfiguration erzeugt am Peer "Client" einen VPN Split Tunnel. Nur die "internen" Netze werden über den Tunnel geschickt. Der Rest geht über den eigenen Internetzugang. Wenn dann noch Wireguard über den NetworkManager genutzt wird, setzt NetworkManager v1.16 voraus, kann Wireguard über den NetworkManager verwaltet werden. Nützlich, um z.B. die DNS-Search Domain(s) zu setzen, damit diese Domains über den im Wireguard Tunnel eingestellten DNS-Server aufgelöst werden.

```
[Interface]
# PublicKey = <SuperUser1NotSecretblah=>
PrivateKey = <SuperUser1Secretblah=>
Address = 192.168.102.2/24
DNS = 172.16.0.1

# "Server"
[Peer]
Endpoint = <Tolle.Server.IP>:51821
PublicKey = <SuperServerNotSecretblahblah>
AllowedIPs = 192.168.102.1/32
AllowedIPs = 10.0.0.0/8
AllowedIPs = 172.16.0.0/12
```

Diese Datei als z.B. wg-internal.conf abspeichern und per nmcli in den NetworkManager importieren.

```
nmcli connection import type wireguard file wg-internal.conf
nmcli connection modify wg-internal ipv4.dns-search contoso.com,internal.eu
nmcli connection up wg-internal
```

Und für die Menschen mit Bambusinternet...

```
nmcli connection modify wg-internal wireguard.mtu 1300
```

Oder ohne den NetworkManager, erfordert, dass die Konfiguration unter /etc/wireguard liegt:

```
sudo wg-quick up wg-internal
```

### QR-Code aus Config Datei erstellen

Mobile Clients unter Android und iPhone können die Wireguard Konfiguration per QR-Code importieren.

```
qrencode -t ansiutf8 < wg-internal.conf
```

## Neuen "Client" zum "Server" hinzufügen

Um einen neuen Client hinzuzufügen, muss ein neues Private / Public Keypair generiert und ein neuer Peer zur Serverkonfiguration hinzugefügt werden.

- Neues Client KeyPair erstellen (siehe **Private / Public Keys generieren** weiter oben)
- Auf dem "Server" Peer die Datei /etc/wireguard/wg-internal.conf um einen Peer erweitern

```
# User2
[Peer]
PublicKey = <SuperUser2NotSecretblahblah>
AllowedIPs = 192.168.102.3/32
```

AllowedIPs muss natürlich um eine Zahl erhöht und der erzeugte PublicKey genutzt werden.

- wireguard Konfiguration neu laden

```
wg syncconf wg-internal <(wg-quick strip wg-internal)
```

- Client wie weiter oben bei der Konfiguration "Client" beschrieben einrichten und als "Address" die selbe IP wie unter "AllowedIPs" beim Server Peer eintragen und den passenden PrivateKey einfügen

## Wireguard debuggen

Um Wireguard zu debuggen, muss es nicht extra neu kompiliert werden. Es reicht, wenn **debugfs** unter **/sys/kernel/debug** gemountet ist.

### Wireguard debugging einschalten

```
echo 'module wireguard +p' | sudo tee /sys/kernel/debug/dynamic_debug/control
```

### Wireguard debugging ausschalten

```
echo 'module wireguard -p' | sudo tee /sys/kernel/debug/dynamic_debug/control
```

### Logs ansehen

```
dmesg
```

oder

```
sudo journalctl -f
```

### Beispielausgabe

```
[609111.685904] wireguard: wg-internal: Sending keepalive packet to peer 1 ([<Tolle.IP>]:51821/0%0)
[609120.971109] wireguard: wg-internal: Receiving handshake initiation from peer 3 ([<Tolle.IP>]:51821/0%0)
[609120.971111] wireguard: wg-internal: Sending handshake response to peer 3 ([<Tolle.IP>]:51821/0%0)
[609120.971340] wireguard: wg-internal: Keypair 14001 destroyed for peer 3
[609120.971341] wireguard: wg-internal: Keypair 14007 created for peer 3
[609120.988683] wireguard: wg-internal: Receiving keepalive packet from peer 3 ([<Tolle.IP>]:51821/0%0)
[609144.432936] wireguard: wg-internal: Sending keepalive packet to peer 1 ([<Tolle.IP>]:51821/0%0)
[609144.436857] wireguard: wg-internal: Sending keepalive packet to peer 2 ([<Tolle.IP>]:51821/0%0)
```

## Fazit

Wireguard ist momentan meine favorisierte VPN Lösung. Mit der Aufnahme in den 5.6er Linux Kernel wird es hoffentlich eine breitere Unterstützung auch in Appliances finden. All meine Server sind über ein per ansible eingerichtetes Wireguard Full Mesh VPN miteinander verbunden und Tasker aktiviert auf meinem Android Smartphone automatisch eine Wireguard Verbindung nach Hause sobald es sich nicht mehr im heimischen WLAN befindet. Ich denke, für mich hat es sich schon längst bewährt.

**Ähnliche Beiträge**- [Wireguard / IPSec VPN Performance](https://www.geekbundle.org/wireguard-ipsec-vpn-performance/)
- [Debian residual und broken Packages identifizieren](https://www.geekbundle.org/debian-residual-und-broken-packages-identifizieren/)
- [systemd? Auf jedenfall!](https://www.geekbundle.org/systemd-auf-jedenfall/)
- [Schneller neustarten mit kexec](https://www.geekbundle.org/schneller-neustarten-mit-kexec/)

1. Danke für den tollen Beitrag. Eine Frage habe ich allerdings bezüglich „Bambusinternet“. Was genau meinst du damit? Kabelprovider mit DS-lite? Davon abgesehen dachte ich, dass WireGuard die MTU zuverlässig selber aushandelt. [Antworten](https://www.geekbundle.org/wireguard-einrichten/?replytocom=151#respond)
  1. Mit Bambusinternet meine ich vor allem Internetanschlüsse mit geringer Bandbreite, wie sie leider immer noch in Deutschland weit verbreitet sind, und Anschlüsse die hinter einem Carrier Grade NAT stecken. Wireguard selber macht keine Form PathMTU Discovery. [Antworten](https://www.geekbundle.org/wireguard-einrichten/?replytocom=152#respond)

2. Was ist mit [https://github.com/Nyr/wireguard-install](https://github.com/Nyr/wireguard-install) ? Ist das ausreichend? [Antworten](https://www.geekbundle.org/wireguard-einrichten/?replytocom=178#respond)
  1. Für eine reine Roadwarrior Installation sieht das Skript gut aus. Ob es das wirklich ist, kann ich dir aber nicht beantworten weil ich es nicht nutze. Ich verwende die folgende Ansible Role: [https://github.com/githubixx/ansible-role-wireguard](https://github.com/githubixx/ansible-role-wireguard) Bietet mehr Funktionen, die ich auch alle nutze. Neben der Roadwarrior Installation auch eine Full-Mesh Konfiguration meiner Server. [Antworten](https://www.geekbundle.org/wireguard-einrichten/?replytocom=179#respond)

### Kommentar hinterlassen [Antwort abbrechen](/wireguard-einrichten/#respond)
