Freifunk-Gateway aufsetzen/wireguard: Unterschied zwischen den Versionen

Aus Freifunk Franken
Wechseln zu:Navigation, Suche
(Die Seite wurde neu angelegt: „== Wireguard == Alternativ zum oben beschriebenen GRE Protokoll kann ein Babel Tunnel auch mit dem Wireguard Protokoll aufgebaut werden. Insbesondere ist dies…“)
 
(→‎Installation: Ab Debian 11 ist Wireguard in "stable" enthalten.)
 
(10 dazwischenliegende Versionen von 3 Benutzern werden nicht angezeigt)
Zeile 1: Zeile 1:
== Wireguard ==
== Wireguard ==


Alternativ zum oben beschriebenen GRE Protokoll kann ein Babel Tunnel auch mit dem Wireguard Protokoll aufgebaut werden. Insbesondere ist dies erforderlich, wenn eine Seite hinter einem NAT steckt und/oder keine feste IP hat (bei dezentralen Gateways oft der Fall).
Wireguard benötigt nur an einem Ende eine feste IP Adresse. Außerdem kann es leicht hinter NAT betrieben werden, da UDP verwendet wird.
 
Dafür ist das Protokoll etwas komplizierter (und verschlüsselt) und dadurch auch etwas langsamer. Dennoch lassen sich je nach Hardware einige hundert MBit/s erreichen.


=== Installation ===
=== Installation ===


Wireguard ist eine recht junge Software und deshalb noch nicht in Debian 9 enthalten. In die Apt Paketverwaltung muss der "unstable" Zweig eingebunden werden. Dies erfolgt nachrangig, damit bei "apt-get upgrade" keine Pakete aus dem unstable Zweig installiert werden, die schon im Hauptzweig existieren.
Wireguard ist eine recht junge Software und deshalb meist noch nicht in Upstream Kernels enthalten.
In debian gibt es ein Paket, dass dynamisch zum Kernel ein passendes Wireguard-Modul kompiliert. Dieses ist nur in den ''unstable'' Repositories enthalten.
 
Bis Debian 10 muss daher in die APT Paketverwaltung eine Quelle für "unstable" eingebunden werden. Diese wird über apt-preferences so weit abgewertet, dass nicht das gesamte System auf unstable geupdated wird.
 
Eine schöne Anleitung dafür gibt es auf der [https://www.wireguard.com/install/#debian-module-tools Wireguard Webseite]
 
<pre>
~# echo "deb http://deb.debian.org/debian/ unstable main" > /etc/apt/sources.list.d/unstable.list
~# printf 'Package: *\nPin: release a=unstable\nPin-Priority: 140\n' > /etc/apt/preferences.d/limit-unstable
~# apt update
~# apt install wireguard linux-headers-amd64
</pre>


<code>
Ab Debian 11 ist Wireguard enthalten. Dort ist die oben beschriebene Methode wirkungslos und kann entfallen, denn das sowieso vorhandene Paket in "stable" wird mit höherer Priorität gezogen. Dort genügt folgender Aufruf:
echo "deb <nowiki>http://deb.debian.org/debian/</nowiki> unstable main" > /etc/apt/sources.list.d/unstable.list<br>
 
printf 'Package: *\nPin: release a=unstable\nPin-Priority: 150\n' > /etc/apt/preferences.d/limit-unstable<br>
<pre>
apt-get update<br>
~# apt install wireguard
apt-get install wireguard linux-headers-amd64
</pre>
</code>


=== Interface anlegen ===
=== Interface anlegen ===


Die Schnittstellenkonfiguration sollte weitgehend genauso aussehen, wie bei GRE beschrieben. Auch die beiden fürs Gateway reservierten IP-Adressen (IPv4 und IPv6) sowie die willkürlich gewählte Link-Local-Adresse (fe80::...) können für GRE und Wireguard gemeinsam verwendet werden.
Die Schnittstellenkonfiguration sollte weitgehend genauso aussehen, wie bei GRE beschrieben. Auch die beiden fürs Gateway reservierten IP-Adressen (IPv4 sowie die möglichst zufällig generierte Link-Local-Adresse) können sowohl für GRE, als auch für Wireguard gleichzeitig verwendet werden.
 
<pre>
auto <IFNAME>
iface <IFNAME> inet6 static
address fe80::IRGENDWAS/64
 
# initialize wireguard
pre-up ip link add $IFACE type wireguard
pre-up wg setconf $IFACE /etc/wireguard/$IFACE.conf
post-down ip link del $IFACE
 
# Enable Multicast for Babel
pre-up ip link set dev $IFACE multicast on
 
# iif rules
post-up ip -6 rule add iif $IFACE prio 200 table fff
pre-down ip -6 rule add iif $IFACE prio 200 table fff
 
iface <IFNAME> inet static
address 10.83.252.x/32
scope link
 
# iif rules
post-up ip -4 rule add iif $IFACE prio 200 table fff
pre-down ip -4 rule add iif $IFACE prio 200 table fff
</pre>


<code>
vi /etc/network/interfaces
</code>


auto DEVICENAME
Hierbei muss die zum Interface gehörende Wireguard-Konfiguration unter '''/etc/wireguard/<IFNAME>.conf abgespeichert werden.
iface DEVICENAME inet static
  address 10.83.252.x/32
  <s>#IPv4 GRE</s>
  <s>#pre-up ip -4 tunnel add $IFACE mode gre local EIGENEPUBLICIP remote REMOTEPUBLICIP ttl 255</s>
  <s>#IPv6 GRE</s>
  <s>pre-up ip -6 tunnel add $IFACE mode ip6gre local EIGENEPUBLICIP remote REMOTEPUBLICIP ttl 255</s>
  pre-up ip link add $IFACE type wireguard
  pre-up wg setconf $IFACE /etc/wireguard/$IFACE.conf
  ...
  <s>post-down ip tunnel del $IFACE</s>
  post-down ip link del $IFACE
  ...


Hierbei wird angenommen, dass die Wireguard-Konfigurationsdateien unter den Dateinamen <DEVICENAME>.conf abgespeichert werden:
<pre>
[Interface]
PrivateKey = UBnpiQhEz2S192d8nmFmr2rm3+NKpKiBy28fyVa3s=
ListenPort = 51820


<code>
[Peer]
vi /etc/wireguard/<DEVICENAME>.conf
PublicKey = ZAleBcuJ4O9m2hfmz5bnqM0POCAIHQSsnWVBzreJaWw=
</code>
AllowedIPs = 0.0.0.0/0, ::/0
</pre>


# /etc/wireguard/wg-test.conf
Dabei ist "PrivateKey" der eigene private Schlüssel, "PublicKey" der öffentliche Schlüssel der Gegenstelle. "ListenPort" ist der Port, auf dem die Pakete der Gegenstelle empfangen werden.
[Interface]
PrivateKey = UBnpiQhEz2S192d8nmFmr2rm3UU+NKpKiBy28fyVa3s=
ListenPort = 51820
[Peer]
PublicKey = ZAleBcuJ4O9m2hfmz5bnqM0POCAIHQSsnWVBzreJaWw=
AllowedIPs = 0.0.0.0/0, ::/0


Dabei ist "PrivateKey" der eigene private Schlüssel, "PublicKey" der öffentliche Schlüssel der Gegenstelle. "ListenPort" ist der Port, auf dem die Pakete der Gegenstelle empfangen werden. "AllowedIPs" sind alle IPs IPv4 und IPv6.
"AllowedIPs" wird von Wireguard für die Entscheidung, welches Paket zu welchem Peer gehen soll verwendet. Da sämtliche Pakete geroutet werden können müssen, ist nur ein Peer pro Wireguard Interface möglich und AllowedIPs muss auf alle möglichen IPv4 und IPv6 gesetzt (/0) werden.


Die Schlüssel können mit folgender Aufrufkette in zwei Dateien "wg-private.key" und "wg-public.key" im aktuellen Verzeichnis erzeugt werden. Diese Schlüssel sollten außerhalb des Servers gesichert werden! Danach können die beiden Dateien gelöscht werden.
Die Schlüssel können mit folgender Aufrufkette in zwei Dateien "wg-private.key" und "wg-public.key" im aktuellen Verzeichnis erzeugt werden. Die Keys müssen dann entsprechend in die Konfiguration übernommen werden.


<code>
<code>
Zeile 61: Zeile 80:
</code>
</code>


Weil in der Konfigurationsdatei der geheime private Schlüssel im Klartext steht, empfiehlt es sich anderen Nutzern außer "root" das Lesen zu verbieten.
Weil in der Konfigurationsdatei der geheime private Schlüssel steht empfiehlt es sich anderen Nutzern außer "root" das Lesen zu verbieten.


<code>
<code>
chmod go-r /etc/wireguard/<DEVICENAME>.conf
chmod go-rwx /etc/wireguard/<IFNAME>.conf
</code>
</code>


Abschließend müssen auch Wireguard Interfaces genauso wie GRE Interfaces in die Datei "/etc/default/babeld" eingefügt werden.
Abschließend müssen auch Wireguard Interfaces in die Datei "/etc/default/babeld" eingefügt werden. (Siehe [[Freifunk-Gateway_aufsetzen/Babel]])


=== Tests ===
=== Tests ===


Nach Aufruf von "ifconfig" sollten wir einen Eintrag für den Tunnel (in diesem Beispiel wg-test) vorfinden.
Nach Aufruf von <code>ip link</code> bzw. <code>ip addr</code> sollte ein passender Eintrag für den Tunnel auftauchen:
 
<pre>
9: <IFNAME>: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1420 qdisc noqueue state UNKNOWN group default qlen 1
    link/none
    inet 10.83.252.x/32 brd 10.83.252.x scope link wg_squ
      valid_lft forever preferred_lft forever
    inet6 fe80::IRGENDWAS/64 scope link
      valid_lft forever preferred_lft forever
</pre>
 
 
Der Aufruf <code>wg show</code> zeigt die Parameter aller aktiven Wireguard Interfaces an:
 
<pre>
interface: <IFNAME>
  public key: <eigner Public Key>
  private key: (hidden)
  listening port: <eigener Listen Port>


Der Aufruf "wg show" gibt etwas aus, mindestens den Namen der konfigurierten Interfaces, deren Ports und Keys. Falls auch die Gegenstelle schon erreichbar ist, werden weitere Informationen angezeigt. Beispiel:
peer: <remote Public Key>
  endpoint: <remote Adresse>:<remote Port>
  allowed ips: 0.0.0.0/0, ::/0
  latest handshake: 21 seconds ago
  transfer: 465.27 GiB received, 35.12 GiB sent
</pre>


interface: wg-test
  public key: PecwpxwnSKPs4Gp39gvQzxdbZxQBCupB5Oo9OVM/5ko=
  private key: (hidden)
  listening port: 51820
peer: ZAleBcuJ4O9m2hfmz5bnqM0POCAIHQSsnWVBzreJaWw=
  endpoint: 193.202.123.89:51820
  allowed ips: 0.0.0.0/0, ::/0
  latest handshake: 37 seconds ago
  transfer: 125.24 MiB received, 140.72 MiB sent


Ob das Wireguard Modul geladen ist, kann mit dem Aufruf "lsmod | grep wireguardermittelt werden. Beispiel:
Ob das Wireguard Kernel Modul geladen ist, kann mit dem Aufruf <code>lsmod | grep wireguard</code> ermittelt werden. Beispiel:


  wireguard            221184  0
  wireguard            221184  0
  ip6_udp_tunnel        16384  1 wireguard
  ip6_udp_tunnel        16384  1 wireguard
  udp_tunnel            16384  1 wireguard
  udp_tunnel            16384  1 wireguard

Aktuelle Version vom 7. Oktober 2021, 10:14 Uhr

Wireguard

Wireguard benötigt nur an einem Ende eine feste IP Adresse. Außerdem kann es leicht hinter NAT betrieben werden, da UDP verwendet wird.

Dafür ist das Protokoll etwas komplizierter (und verschlüsselt) und dadurch auch etwas langsamer. Dennoch lassen sich je nach Hardware einige hundert MBit/s erreichen.

Installation

Wireguard ist eine recht junge Software und deshalb meist noch nicht in Upstream Kernels enthalten. In debian gibt es ein Paket, dass dynamisch zum Kernel ein passendes Wireguard-Modul kompiliert. Dieses ist nur in den unstable Repositories enthalten.

Bis Debian 10 muss daher in die APT Paketverwaltung eine Quelle für "unstable" eingebunden werden. Diese wird über apt-preferences so weit abgewertet, dass nicht das gesamte System auf unstable geupdated wird.

Eine schöne Anleitung dafür gibt es auf der Wireguard Webseite

~# echo "deb http://deb.debian.org/debian/ unstable main" > /etc/apt/sources.list.d/unstable.list
~# printf 'Package: *\nPin: release a=unstable\nPin-Priority: 140\n' > /etc/apt/preferences.d/limit-unstable
~# apt update
~# apt install wireguard linux-headers-amd64

Ab Debian 11 ist Wireguard enthalten. Dort ist die oben beschriebene Methode wirkungslos und kann entfallen, denn das sowieso vorhandene Paket in "stable" wird mit höherer Priorität gezogen. Dort genügt folgender Aufruf:

~# apt install wireguard

Interface anlegen

Die Schnittstellenkonfiguration sollte weitgehend genauso aussehen, wie bei GRE beschrieben. Auch die beiden fürs Gateway reservierten IP-Adressen (IPv4 sowie die möglichst zufällig generierte Link-Local-Adresse) können sowohl für GRE, als auch für Wireguard gleichzeitig verwendet werden.

auto <IFNAME>
iface <IFNAME> inet6 static
	address fe80::IRGENDWAS/64

	# initialize wireguard
	pre-up ip link add $IFACE type wireguard
	pre-up wg setconf $IFACE /etc/wireguard/$IFACE.conf
	post-down ip link del $IFACE

	# Enable Multicast for Babel
	pre-up ip link set dev $IFACE multicast on

	# iif rules
	post-up ip -6 rule add iif $IFACE prio 200 table fff
	pre-down ip -6 rule add iif $IFACE prio 200 table fff

iface <IFNAME> inet static
	address 10.83.252.x/32
	scope link

	# iif rules
	post-up ip -4 rule add iif $IFACE prio 200 table fff
	pre-down ip -4 rule add iif $IFACE prio 200 table fff


Hierbei muss die zum Interface gehörende Wireguard-Konfiguration unter /etc/wireguard/<IFNAME>.conf abgespeichert werden.

[Interface]
PrivateKey = UBnpiQhEz2S192d8nmFmr2rm3+NKpKiBy28fyVa3s=
ListenPort = 51820

[Peer]
PublicKey = ZAleBcuJ4O9m2hfmz5bnqM0POCAIHQSsnWVBzreJaWw=
AllowedIPs = 0.0.0.0/0, ::/0

Dabei ist "PrivateKey" der eigene private Schlüssel, "PublicKey" der öffentliche Schlüssel der Gegenstelle. "ListenPort" ist der Port, auf dem die Pakete der Gegenstelle empfangen werden.

"AllowedIPs" wird von Wireguard für die Entscheidung, welches Paket zu welchem Peer gehen soll verwendet. Da sämtliche Pakete geroutet werden können müssen, ist nur ein Peer pro Wireguard Interface möglich und AllowedIPs muss auf alle möglichen IPv4 und IPv6 gesetzt (/0) werden.

Die Schlüssel können mit folgender Aufrufkette in zwei Dateien "wg-private.key" und "wg-public.key" im aktuellen Verzeichnis erzeugt werden. Die Keys müssen dann entsprechend in die Konfiguration übernommen werden.

wg genkey | tee wg-private.key | wg pubkey > wg-public.key

Weil in der Konfigurationsdatei der geheime private Schlüssel steht empfiehlt es sich anderen Nutzern außer "root" das Lesen zu verbieten.

chmod go-rwx /etc/wireguard/<IFNAME>.conf

Abschließend müssen auch Wireguard Interfaces in die Datei "/etc/default/babeld" eingefügt werden. (Siehe Freifunk-Gateway_aufsetzen/Babel)

Tests

Nach Aufruf von ip link bzw. ip addr sollte ein passender Eintrag für den Tunnel auftauchen:

9: <IFNAME>: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1420 qdisc noqueue state UNKNOWN group default qlen 1
    link/none 
    inet 10.83.252.x/32 brd 10.83.252.x scope link wg_squ
       valid_lft forever preferred_lft forever
    inet6 fe80::IRGENDWAS/64 scope link 
       valid_lft forever preferred_lft forever


Der Aufruf wg show zeigt die Parameter aller aktiven Wireguard Interfaces an:

interface: <IFNAME>
  public key: <eigner Public Key>
  private key: (hidden)
  listening port: <eigener Listen Port>

peer: <remote Public Key>
  endpoint: <remote Adresse>:<remote Port>
  allowed ips: 0.0.0.0/0, ::/0
  latest handshake: 21 seconds ago
  transfer: 465.27 GiB received, 35.12 GiB sent


Ob das Wireguard Kernel Modul geladen ist, kann mit dem Aufruf lsmod | grep wireguard ermittelt werden. Beispiel:

wireguard             221184  0
ip6_udp_tunnel         16384  1 wireguard
udp_tunnel             16384  1 wireguard