WireGuard

Aus c3RE.de
Wechseln zu: Navigation, Suche

"WireGuard is an extremely simple yet fast and modern VPN that utilizes state-of-the-art cryptography. It aims to be faster, simpler, leaner, and more useful than IPSec, while avoiding the massive headache. It intends to be considerably more performant than OpenVPN. "

Allgemein

Ja das sind die klugen und schönen Worte von WireGuard-peoplen über deren ihr seiner Schöpfung themselves. Ich umreiß mal grob wie der Spaß funktioniert: Wer schonmal SSH mit public-keys verwendet hat dem is das konfigurationsprinzip bekannt. Man kreiert einen Schlüsselpaar hat also einen privaten und einen öffentlichen Schlüssel. Die Schlüssel sind glaub ich 60 Zeichen lang. Nun ist die config recht easy. Man verwendet selbst seinen Private key um seine Pakete an seine Peers zu verschlüsseln. Für die Peers sind public-keys hinterlegt und IP-Ranges für welche sie IP-Pakete im Interface drapieren dürfen.

Thats it, klingt creepy is aber so. Hier mal eine Beispielconfig für den c3re:

[Interface]
Address = 10.2.5.2/24
DNS = 10.2.3.254
PrivateKey = 1337133713371337133713371337133713371337133

[Peer]
PublicKey = I+EPNmmML4EeaWD1iMDCl6Z1OiS+SvynLLrDyzQiGw8=
AllowedIPs = 0.0.0.0/0
Endpoint = wireguard.c3re.de:51820

Wenn man diese config aktiviert geschehen folgende Dinge:

  1. Ein Interface wird erstellt, dieses Interfaces bekommt die IP 10.2.5.2/24
  2. Für jeden Peer wird eine Route für die AllowedIPs richtung Wireguard Interface gesetzt (in dieser config wäre das alles (0.0.0.0/0))
  3. Pakete die per Wireguard mit dem Key I+EP... empfangen werden, werden im Interface abgeliefert (sofern sie aus dem Bereich der AllowedIPs kommen)

c3RE

So oben waren mal die allgemeingültigen Worte ab jetzt wirds nen bisschen c3RE specific.

IPv6

kann wireguard ganz toll. Im c3RE-Setup leider gar nicht vorhanden. Im VPN-kontext passiert addressierung ja sogar doppelt (einmal für die VPN-Verbindung und dann nochmal innerhalb der aufgebauten Verbidung). In beiden Fällen hab ich kein v6 gemacht. Ja uncool aber wegen wechselnden IPs kann man das nicht schön umsetzen. Man könnte v6 natten aber das is doch irgendwie auch nicht so das wahre...

Netzfoo

Der Wireguard Endpoint läuft gerade auf einer VM mit dem hochkreativen Namen wireguard und hört im lokalen Netz auf die schmuckvolle IP 10.2.3.24. Hinter dem Wireguard-Endpoint befindet sich das Subnetz 10.2.5.0/24 wo die Wireguard Clients ihr Plätzchen haben. Hier Bild:


                                                           |
+------------------+                                       
|   mamu 10.2.5.2  |----------------+                      |
+------------------+                |                      
                                    |                      |
+-------------------+               |    10.2.5.1   +-----------+    10.2.3.24       +-------------------+
|   rogue 10.2.5.3  |---------------+---------------| wireguard |--------------------| router 10.2.3.254 |
+-------------------+               |               +-----------+                    +-------------------+
                                    |                      |
+-----------------------+           |                      
|   goldwaage 10.2.5.4  |-----------+                      |
+-----------------------+              10.2.5.0/24                      10.2.2.0/23
                                                           |

Der wireguard Rechner routet also zwischen den Beiden Netzen 10.2.5.0/24 und 10.2.2.0/23. Da sich der meiste Spass im 10.2.2.0/23 abspielt und man auch Antwortpakete von dort erhalten möchte. Ist eine Route auf dem 10.2.3.254 eingetragen, dass er Pakete fürs 10.2.5.0/24er nach 10.2.3.24 routet. Dann halt noch Firewallkrams. Damit die wireguard Peers auch ins Internet können noch NAT fürs 10.2.5.0/24er an. Das wars soweit.

Wireguard Endpoint

Den wireguard host habe ich mit einem ansible-script deployed. Playbook sagt man ja so schön. Ist aber recht übersichtlich:

  1. Wireguard installieren
  2. IP-forwarding aktivieren
  3. wg0.netdev deployen (hier werden keys und IPs wie oben gezeigt hinterlegt)
  4. wg0.network deployen hier wird das Interface konfiguriert (im wesentlichen die 10.2.5.1 vergeben)

Das Ansible playbook findet sich im Repo c3re-ansible.

Client

Hier geht es jetzt darum den wireguard-access ins c3re-Netz als Client zu nutzen. Dazu hier mal drei Varianten vorgestellt. Für alle Varianten muss man die oben gezeigte config haben.

wg-quick

wg-quick ist bei den wireguard-tools mit dabei und ein kleines shellscript was das Interface für einen einrichtet und die routen passend setzt. Die usage ist straight-forward:

wg-quick up ./mamu.conf

oder zum ausmachen wieder:

wg-quick down ./mamu.conf

Braucht root-rechte, schließlich created man Interfaces, setzt routen und pömpelt am Kernel herum :)

Android/iOS Clients

gibts in den einschlägigen Fachstores zum herunterladen. Beide bieten die konfiguration per QR-Code an. Wenn man das Paket qrencode installiert hat kann man mit

cat mamu.conf | qrencode -t utf8

einen QR-Code generieren und die config importieren.

Networkmanager

Der Networkmanager unterstützt wireguard nativ, soweit ich verstanden habe. Das ist ziemlich cool, jedoch fehlt der GUI Support. Das ist ziemlich doof. Mit dem Repo hier konnte ich die GUI zum laufen bringen:

https://github.com/max-moser/network-manager-wireguard

Wenn man die Installation hintersich hat kann man die config wieder importieren. Dannach hat man wie von OpenVPN gewohnnt oben ein kleines Schloss das man activaten oder auch wieder ausschalten kann.

Alles durch VPN oder nur c3RE Netz?

Man kann entweder allen Traffic durchs VPN schieben (den Internetzugang des c3RE nutzen) oder den Zugang nur für die Huettenresourcen nutzen. Das macht man am einfachsten indem man die AllowedIPs in der config anpasst:

Alles durchs VPN (auch Internet)

AllowedIPs: 0.0.0.0/0

nur Huettennetz

AllowedIPs: 10.2.0.0/16

Neuen Client hinzufuegen

Wireguard im c3RE hab ich mit folgendem Ansible repo konfiguriert: https://git.stablerock.de/mamu/c3re-ansible. Im Ordner roles/wireguard/files/ gibt es ein skript mit dem Namen add_client.sh. Nach dem Aufruf von ./add_client.sh <nick> gibt es unter client_confs die config einmal als Text und einmal als QR-Code. Dannach das Repo neu commiten und die Konfiguration wieder per Ansible deployen. Per ansible deployen geht im Hauptverzeichnis des repositories mit dem Aufruf:

ansible-playbook site.yml --limit wireguard