PeerVPN – Ein Mesh VPN Netzwerk aufbauen

Beim stöbern im Netz bin ich dank Thomas Leister auf dieses spannende und sehr unkomplizierte VPN Tool gestoßen – PeerVPN. Sobald ihr mehr als nur einen physischen oder virtuellen Server zu verwalten habt hilft PeerVPN ein privates dezentrales vermaschtes Peer-to-Peer Netzwerk aufzubauen.

PeerVPN bietet dir folgende Features:

  • Ethernet tunneling support using TAP devices
  • IPv6 support
  • Full mesh network topology
  • Shared key encryption and authentication support

Punkt 1: Installation unter Debian

Da es noch kein Repository gibt benötigen wir zuerst folgende Pakete.

apt update && apt install git build-essential

Punkt 2: Quellcode herunterladen

Wir wechseln in einen beliebigen Ordner, oder bleiben in /root/.

git clone https://github.com/peervpn/peervpn/

Punkt 3: Kompilieren

Wer OpenSSL verwenden möchte benötigt nur das Paket libssl-dev.

apt install libssl-dev

Anschließen wechseln wir den Ordner und kompilieren.

cd peervpn/
make -j4

Bevorzugte Alternative: Die Empfehlung des Herstellers ist LibreSSL, diese Library habe ich ebenfalls verwendet und dazu folgendes Script genutzt (Danke Thomas Leister).

Wechsel den Ordner und erstelle das Script.

cd peervpn/
vim build.sh

Holt euch von der Webseite https://www.libressl.org/ die aktuelle Versionsnummer und tragt sie unter libressl_version= ein.

#!/bin/sh

libressl_version=libressl-2.5.5
libressl_archive=${libressl_version}.tar.gz

if [ -f ${libressl_archive} ]
then
	:
else
	wget -O ${libressl_archive} https://ftp.openbsd.org/pub/OpenBSD/LibreSSL/${libressl_archive}
fi

if [ -f ${libressl_archive} ]
then
	:
else
	echo wget failed.
	return -1
fi

libressl_lib=${libressl_version}/crypto/.libs/libcrypto.a
if [ -f $libressl_lib ]
then
	:
else
	tar -xzf ${libressl_archive}
	cd ${libressl_version} && ./configure && make && cd ..
fi

cc -O2 -I${libressl_version}/include peervpn.c -o peervpn ${libressl_version}/crypto/.libs/libcrypto.a && echo success!

Das Script führen wir aus, dieses erstellt eine statisch gelinkte Version von PeerVPN mit LibreSSL.

Punkt 4: Kopieren der Binary

Die soeben erstelle Binary kopieren wir auf dem lokalen Server um.

cp peervpn /usr/local/bin

Ebenso kann diese Binary auf die anderen Server kopiert werden.

scp peervpn server2:/usr/local/bin

Punkt 5: Konfiguration

Wir erstellen uns einen Konfigurations Ordner sowie Datei.

mkdir /etc/peervpn
touch /etc/peervpn/peervpn.conf

Beispiel Konfiguration:

networkname ExampleNet
psk mysecretpassword
enabletunneling yes
interface peervpn0
ifconfig4 10.1.2.3/24
port 7000
initpeers server1.example.org 7000 server2.example.org 7000

Erläuterung (Details im Github):

  • networkname – Ein frei wählbarer Name. Auf allen Servern identisch.
  • psk – Ein Shared Key. Kann mittels openssl rand -base64 32 generiert werden. Auf allen Servern identisch.
  • enabletunneling – Ermöglicht Ethernet Tunneling per TAP Device.
  • interface – Der Interface Name.
  • ifconfig4- Die IPv4 Adresse für den Server. Beispiel Server1: 10.1.2.3, Server2: 10.1.2.4 etc.
  • port – Der verwendete Port.
  • initpeers – Server die im gesamten PeerVPN sich erreichen sollen. Domainname + Port. Getrennt mit Leerzeichen. Auf allen Servern am besten identisch.

Punkt 6: Systemd Service Unit

Auf jedem Server legen wir eine Systemd Service Unit an.

[Unit]
Description=PeerVPN Server (%i)
After=syslog.target network.target
ConditionPathExists=/etc/peervpn/%i.conf

[Service]
Type=simple
ExecStart=/usr/local/bin/peervpn /etc/peervpn/%i.conf
Restart=on-failure

[Install]
WantedBy=multi-user.target

Aktivieren und starten den PeerVPN Dienst.

systemctl enable peervpn@peervpn.service
systemctl start peervpn@peervpn.service

Punk 7: Test

Jetzt sollte der Dienst laufen.

systemctl status peervpn@peervpn.service

Auch die Server sollten über die in der Konfiguration angegeben IP-Adressen erreichbar sein.

ping 10.1.2.3
ping 10.1.2.4
...

 

Dominion

Dominion

Linux Systemadministrator

Das könnte Dich auch interessieren …

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.