In einem recht restriktivem Netzwerk benötigte ich eine Möglichkeit, um auf diverse interne Dienste über das Internet zugreifen zu können. Diesen Anlass nahm ich als Gelegenheit um etwas mit TOR und Onioncat herumzuspielen. Mein primäres Ziel war es, sicheren Zugriff auf den internen Mailserver zu gewähren, sodass man E-Mails abrufen kann ohne direkt mit dem LAN verbunden zu sein.
TOR dient hier lediglich als Transportebene, so ist keine Portweiterleitung im Router notwendig. Onioncat wird als hidden-service bereitgestellt und erzeugt ein Overlay-Netzwerk, welches IPv6 als Protokoll auf Layer 3 verwendet. Die Dienste sind dann später über eine statische IPv6 Adresse via TOR/Onioncat erreichbar.
Info: Niemand benötigt globale RootCAs denen generell Vertrauen geschenkt wird, wenn die Onion-Adresse des hidden-service Endpunkts gleichzeitig dem Identitätsnachweis dient!
Zusätzlich greife ich mit port knocking auf eine Technologie aus den 90’ern zurück, um SSH-Zugriff auf das Gateway zu gewähren - alt aber purer Spaß!
Es gibt jede Menge sichere port-knocking Implementierungen, aber sie alle haben gemein, dass sie einen speziellen Client voraussetzen.
Ein einfaches iptables-basiertes Setup is hingegen mit jedem beliebigen Client wie beispielsweise netcat
nutzbar.
Als Server/Gateway Hardware nutze ich einen BeagleBone Black auf dem Archlinux läuft.
Übersicht
Vereinfacht lassen sich die Kommunikationswege folgendermaßen darstellen:
+---------+ +---------+
| VLAN #2 | | VLAN #1 |
|---------| |---------|
| | | |
| +----+ | IPv6 | +----+ |
| | GW +-+--to--+-+ MX | |
| +-++-+ | IPv4 | +----+ |
| || | | |
+----++---+ +---------+
||
+----++--------------------+
| || T |
| IP || O T +++++++++ USER
| v4 || R A ++ |
| || C ++ |
| ++ N ++ |
| ++ O ++ |
| ++ I ++ |
| IP ++ N ++ |
| v6 ++ O ++ |
| ++ ++ |
| ++++ |
| ++ |
| |
|--------------------------|
| INTERNET |
+--------------------------+
Der Mailserver befindet sich in VLAN #2
, welches ausschließlich von VLAN #1
zu erreichen ist.
Unsere Gateway-Box wird per Ethernet direkt ins VLAN #1
gehangen und dort via DHCP eine IP-Adresse
beziehen. Ausgehender Traffic ins Internet ist auf den relevanten Ports (TOR) ungefiltert.
Der TOR Client auf dem Gateway verbindet sich mit dem Onion-Netzwerk und startet den hidden-service.
Darauf hin ist das Gateway unter der IPV6-Adresse für andere Onioncat Teilnehmer erreichbar.
Sobald ein weiterer Onioncat-Endpunkt bekannt ist, kann dieser mit dem Gateway über IPv6 auf Port 443
kommunizieren und das socat
Relay übersetzt den Datenfluss in IPv4 und leitet ihn weiter an den Mailserver
in VLAN #2
. Btw. fragt nicht, warum der Mailserver auf Port 443 erreichbar ist.. es handelt sich hier um
einen Microsoft Exchange ActiveSync Server.
Zur einfacheren Administration des Gateways ist dieses auf zwei Wege per SSH zu erreichen:
-
Optional via mDNS aus dem lokalen Netzwerk. Dies einfach aus Bequemlichkeit; die IP-Adresse wird per DHCP zugewiesen und wenn das Lease ausläuft, kann sie sich ändern. Dank
avahi
habe ich einen generischen Hostnamen für das Gateway. -
Über TOR/Onioncat.
In beiden Fällen kommt port-knocking zum Tragen. Netcat, vom Client ausgeführt, klopft in bestimmter Reihenfolge an definierte Ports und iptables auf der Gateway-Seite registriert dies und wenn alles passt, wird der SSH Port geöffnet.
Vorzüge dieses Setups
- Es wird keine statische öffentliche IP-Adresse benötigt
- Die öffentliche IP-Adresse wird versteckt
- Es wird via Onioncat eine einzigartige IPv6-Adresse bereitgestellt, die von der hidden-service ID abgeleitet wird
- DNS ist nicht involviert und
leakage
sollte damit kein Sicherheitsproblem darstellen
Installation benötigter Pakete
Auf Gateway und Client müssen folgende Pakete installiert werden: tor, nyx, sowie optional avahi aus dem offiziellen Archlinux Paket-Verzeichnis und onioncat aus dem AUR.
Globale Konfiguration
Für Onioncat benötigen wir ein Script, welches von systemd
verwendet wird um den Dienst zu starten:
Danach erstellen wir das systemd unitfile:
Expand to view: /etc/systemd/system/onioncat.service
Konfiguration: Gateway
Autostart für TOR und Onioncat aktivieren und Dienste starten:
Sobald der TOR Client mit dem Onion-Netzwerk verbunden und der Onioncat
hidden-service gestartet ist,
kann man sich die einzigartige IPv6-Adresse des Gateways anzeigen lassen:
Dieser Befehl wandelt die Onion ID (hidden-service ID) in eine durch Onioncat vergebene IPv6 Adresse um.
IPv6-zu-IPv4 Tunnel
Auf dem Gateway benötigen wir zusätzlich socat und iptables.
Ein Script welches das socat Relay started und den Datenfluss zum Mailserver weiterleitet.
Ein weiteres unitfile für den IPv6-zu-IPv4 Tunnel:
Expand to view: /etc/systemd/system/ipv6-mx-gate.service
Autostart für den Tunnel aktivieren und Dienst starten:
iptables
Für die Konfiguration der iptables Regeln setze ich folgendes Script ein:
Konfiguration: Client
Ein Autostart von TOR ist auf dem Client sicherlich nicht zwingend erforderlich, hier genügt es die Dienste manuell zu starten:
Sobald TOR verbunden ist, sollte kurz darauf auch der Onioncat-Dienst verfügbar und somit die IPv6-Adresse des Gateways erreichbar sein.
Bei einem initialen Verbindungsaufbau dürfte in etwa folgendes im systemd journal zu lesen sein.
Die hidden-service ID meines Gateways lautet hier wrg2p2ttysvquls3.onion und die Onioncat Adresse fd87:d87e:eb43:b44d:a7ea:73c4:ab0a:2e5b.
Der Verbindungsaufbau kann je nach Bandbreite beider Parteien (bzw. Qualität der Onion-Netzwerkverbindung) mehrere Sekunden (mitunter sogar Minuten) in Anspruch nehmen. Danach werden Ping-Anfragen normal beantwortet:
Wenn eine Weile keine Daten ausgetauscht wurden, kann es bei erneutem Verbindungsaufbau wieder etwas dauern. Hier hilft es u.U. das Journal im Auge zu behalten, um andere Fehler auszuschließen.
Wenn der Onioncat-Tunnel besteht sollte der freigegebene, interne Dienst - in meinem Fall - auf Port 443 erreichbar sein:
port-knocking
Um sich per SSH zum Gateway verbinden zu können, habe ich ein kleines Script geschrieben, dass mir die ganze
manuelle Arbeit abnimmt. Zuerst wird versucht eine Verbindung via mDNS aufzubauen, hierfür wird der avahi-daemon
gestartet. Wenn der Avahi-Hostname aoe.local innerhalb des angegebenen Timeout-Wertes nicht aufgelöst werden kann,
werden die TOR und Onioncat Dienste ausgeführt. Sobald ein Onioncat-Tunnel zustande gekommen ist, wird versucht eine
SSH-Verbindung zu öffnen. Optional kann zusätzlich noch ein VPN (Wireguard) verbunden werden, das weitere Konfigurationen
auf Gateway und Client voraussetzt.
knock.sh
Um sich per SSH zum Gateway zu verbinden, genügt es das Script auszuführen:
Bzw. wenn man sich im gleichen Netzwerk wie das Gateway befindet: