Freifunk-Gateway aufsetzen/wireguard: Unterschied zwischen den Versionen
(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…“) |
Miki (Diskussion | Beiträge) (→Installation: Ab Debian 11 ist Wireguard in "stable" enthalten.) |
||
(10 dazwischenliegende Versionen von 3 Benutzern werden nicht angezeigt) | |||
Zeile 1: | Zeile 1: | ||
== Wireguard == | == 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 === | === Installation === | ||
Wireguard ist eine recht junge Software und deshalb noch nicht in | 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> | |||
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: | |||
<pre> | |||
~# apt install wireguard | |||
apt | </pre> | ||
</ | |||
=== Interface anlegen === | === Interface anlegen === | ||
Die Schnittstellenkonfiguration sollte weitgehend genauso aussehen, wie bei GRE beschrieben. Auch die beiden fürs Gateway reservierten IP-Adressen (IPv4 | 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> | |||
Hierbei muss die zum Interface gehörende Wireguard-Konfiguration unter '''/etc/wireguard/<IFNAME>.conf abgespeichert werden. | |||
<pre> | |||
[Interface] | |||
PrivateKey = UBnpiQhEz2S192d8nmFmr2rm3+NKpKiBy28fyVa3s= | |||
ListenPort = 51820 | |||
[Peer] | |||
PublicKey = ZAleBcuJ4O9m2hfmz5bnqM0POCAIHQSsnWVBzreJaWw= | |||
</ | AllowedIPs = 0.0.0.0/0, ::/0 | ||
</pre> | |||
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 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 | 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- | chmod go-rwx /etc/wireguard/<IFNAME>.conf | ||
</code> | </code> | ||
Abschließend müssen auch Wireguard | 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 | 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> | |||
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> | |||
Ob das Wireguard Modul geladen ist, kann mit dem Aufruf | 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