So richten Sie einen SSH-Server hinter I2P für den persönlichen Zugriff ein

Dies ist ein Tutorial, wie man einen I2P tunnel einrichtet und anpasst, um aus der Ferne auf einen SSH-Server zuzugreifen, entweder mit I2P oder i2pd. Vorerst wird angenommen, dass Sie Ihren SSH-Server über einen Paketmanager installieren und dass er als Dienst läuft.

Überlegungen: In dieser Anleitung setze ich einiges voraus. Diese müssen je nach den Komplikationen, die in Ihrer konkreten Umgebung auftreten, angepasst werden, insbesondere wenn Sie zur Isolierung VMs oder Container verwenden. Dabei wird davon ausgegangen, dass der I2P router und der SSH-Server auf demselben localhost laufen. Sie sollten neu erzeugte SSH-Hostschlüssel verwenden, entweder durch die Verwendung eines frisch installierten sshd oder indem Sie alte Schlüssel löschen und ihre Neuerzeugung erzwingen. Zum Beispiel:

sudo service openssh stop
sudo rm -f /etc/ssh/ssh_host_*
sudo ssh-keygen -N "" -t rsa -f /etc/ssh/ssh_host_rsa_key
sudo ssh-keygen -N "" -t dsa -f /etc/ssh/ssh_host_dsa_key
sudo ssh-keygen -N "" -t ecdsa -f /etc/ssh/ssh_host_ecdsa_key
sudo ssh-keygen -N "" -t ed25519 -f /etc/ssh/ssh_host_ed25519_key

Step One: Set up I2P tunnel for SSH Server

Using Java I2P

Verwenden Sie die Weboberfläche von Java I2P, navigieren Sie zum Manager für versteckte Dienste und starten Sie den tunnel-Assistenten.

Tunnel Wizard

Da Sie diesen tunnel für den SSH-Server einrichten, müssen Sie den tunnel-Typ “Server” auswählen.

Screenshot-Platzhalter: Verwenden Sie den Assistenten, um einen “Server” tunnel zu erstellen

Sie sollten es später feinabstimmen, aber der Standard-Tunnel-Typ ist für den Einstieg am einfachsten.

Screenshot-Platzhalter: Von der „Standard“-Variante

Geben Sie eine aussagekräftige Beschreibung an:

Screenshot-Platzhalter: Beschreiben Sie, wozu er dient

And tell it where the SSH server will be available.

Screenshot-Platzhalter: Geben Sie als Ziel den zukünftigen Standort Ihres SSH-Servers an

Überprüfen Sie die Ergebnisse und speichern Sie Ihre Einstellungen.

Screenshot-Platzhalter: Speichern Sie die Einstellungen.

Advanced Settings

Kehren Sie nun zum Hidden Services Manager zurück und sehen Sie sich die verfügbaren erweiterten Einstellungen an. Eine Sache, die Sie auf jeden Fall ändern sollten, ist, die Konfiguration auf interaktive Verbindungen statt auf Bulk-Verbindungen (Massenübertragungen) einzustellen.

Screenshot-Platzhalter: Konfigurieren Sie Ihren tunnel für interaktive Verbindungen

Außerdem können diese weiteren Optionen die Leistung beim Zugriff auf Ihren SSH-Server beeinflussen. Wenn Ihnen Ihre Anonymität nicht ganz so wichtig ist, könnten Sie die Anzahl der Hops (Zwischenstationen) verringern. Wenn Sie Geschwindigkeitsprobleme haben, könnten mehr tunnel helfen. Ein paar Backup-tunnel sind wahrscheinlich eine gute Idee. Eventuell müssen Sie das ein wenig feinjustieren.

Screenshot-Platzhalter: Wenn Ihnen Anonymität nicht wichtig ist, dann verringern Sie die Tunnel-Länge.

Starten Sie abschließend den tunnel neu, damit alle Ihre Einstellungen wirksam werden.

Eine weitere interessante Einstellung, besonders wenn Sie sich entscheiden, eine hohe Anzahl von tunnels zu betreiben, ist “Reduce on Idle”, welche die Anzahl der laufenden tunnels reduziert, wenn der Server über einen längeren Zeitraum inaktiv war.

Screenshot-Platzhalter: Bei Inaktivität reduzieren, wenn Sie eine hohe Anzahl von tunnels gewählt haben

Using i2pd

Mit i2pd erfolgt die gesamte Konfiguration über Dateien statt über eine Weboberfläche. Um für i2pd einen tunnel für einen SSH‑Dienst zu konfigurieren, passen Sie die folgenden Beispieleinstellungen an Ihre Anforderungen an Anonymität und Leistung an und kopieren Sie sie in tunnels.conf

[SSH-SERVER]
type = server
host = 127.0.0.1
port = 22
inbound.length = 1
outbound.length = 1
inbound.quantity = 5
outbound.quantity = 5
i2cp.reduceOnIdle = true
keys = ssh-in.dat

Restart your I2P router

Schritt 1: I2P tunnel für SSH-Server einrichten

Je nachdem, wie du auf deinen SSH-Server zugreifen möchtest, willst du vielleicht ein paar Einstellungen anpassen. Neben den offensichtlichen SSH-Hardening-Maßnahmen, die du auf allen SSH-Servern umsetzen solltest (Public-Key-Authentifizierung, keine Anmeldung als root, etc.), gilt: Wenn dein SSH-Server auf keiner anderen Adresse als deinem Server tunnel lauschen soll, solltest du AddressFamily auf inet und ListenAddress auf 127.0.0.1 setzen.

AddressFamily inet
ListenAddress 127.0.0.1

Wenn Sie sich dafür entscheiden, für Ihren SSH-Server einen anderen Port als 22 zu verwenden, müssen Sie den Port in Ihrer I2P tunnel-Konfiguration ändern.

Step Three: Set up I2P tunnel for SSH Client

Sie müssen die I2P router console des SSH-Servers aufrufen können, um Ihre Client-Verbindung zu konfigurieren. Ein praktischer Vorteil dieses Setups ist, dass die anfängliche Verbindung zum I2P tunnel authentifiziert ist, was das Risiko etwas verringert, dass Ihre erste Verbindung zum SSH-Server durch einen Man-in-the-Middle-Angriff (MITM) abgefangen oder manipuliert wird, wie es in Trust-On-First-Use (Vertrauen beim ersten Kontakt) Szenarien ein Risiko darstellt.

Verwendung von Java I2P

Tunnel-Assistent

Zuerst starten Sie den Konfigurationsassistenten für tunnel über den Manager für versteckte Dienste und wählen Sie einen Client-tunnel aus.

Platzhalter für Screenshot: Verwenden Sie den Assistenten, um einen Client-Tunnel zu erstellen

Wählen Sie als Nächstes den Standardtyp für den tunnel. Diese Konfiguration werden Sie später noch feinabstimmen.

Screenshot placeholder: Von der Standardvariante

Geben Sie eine gute Beschreibung an.

Screenshot-Platzhalter: Geben Sie eine aussagekräftige Beschreibung

Das ist der einzige etwas knifflige Teil. Gehe in der I2P router-Konsole zum Hidden Services Manager und finde beim SSH-Server tunnel die base64 “local destination”. Du musst einen Weg finden, diese Information in den nächsten Schritt zu kopieren. Ich schicke sie mir normalerweise per Tox selbst, jede Off-the-Record-Methode sollte für die meisten ausreichend sein.

Screenshot-Platzhalter: Finden Sie die destination (Zieladresse innerhalb von I2P), zu der Sie eine Verbindung herstellen möchten

Sobald die Base64-Destination, zu der Sie eine Verbindung herstellen möchten, an Ihr Client-Gerät übermittelt wurde, fügen Sie sie anschließend in das Feld „Client Destination“ ein.

Screenshot-Platzhalter: Ziel anfügen

Legen Sie schließlich einen lokalen Port fest, mit dem sich Ihr SSH-Client verbinden soll. Dieser lokale Port wird mit der base64 destination (Base64-kodierte I2P-Destination) und damit dem SSH-Server verbunden.

Screenshot-Platzhalter: Wählen Sie einen lokalen Port

Entscheiden Sie, ob es automatisch starten soll.

Platzhalter für Screenshot: Entscheiden Sie, ob es automatisch gestartet werden soll

Erweiterte Einstellungen

Wie zuvor sollten Sie die Einstellungen so ändern, dass sie für interaktive Verbindungen optimiert sind. Außerdem sollten Sie, wenn Sie Client-Whitelisting auf dem Server einrichten möchten, das Optionsfeld “Schlüssel generieren, um eine persistente Client-tunnel-Identität zu aktivieren” aktivieren.

Screenshot-Platzhalter: Konfigurieren Sie ihn so, dass er interaktiv ist

Using i2pd

Sie können dies einrichten, indem Sie die folgenden Zeilen zu Ihrer tunnels.conf hinzufügen und sie entsprechend Ihren Anforderungen an Leistung und Anonymität anpassen.

[SSH-CLIENT]
type = client
host = 127.0.0.1
port = 7622
inbound.length = 1
outbound.length = 1
inbound.quantity = 5
outbound.quantity = 5
i2cp.dontPublishLeaseSet = true
destination = thisshouldbethebase32ofthesshservertunnelabovebefore.b32.i2p
keys = ssh-in.dat

Restart the I2P router on the client

Step Four: Set up SSH client

Es gibt viele Möglichkeiten, einen SSH-Client so einzurichten, dass er sich mit Ihrem Server im I2P-Netzwerk verbindet, aber es gibt ein paar Dinge, die Sie tun sollten, um Ihren SSH-Client für die anonyme Nutzung abzusichern. Zunächst sollten Sie ihn so konfigurieren, dass er sich gegenüber dem SSH-Server ausschließlich mit einem einzigen, spezifischen Schlüssel authentifiziert, um nicht das Risiko einzugehen, Ihre anonymen und nicht-anonymen SSH-Verbindungen miteinander zu verknüpfen.

Stellen Sie sicher, dass Ihre $HOME/.ssh/config die folgenden Zeilen enthält:

IdentitiesOnly yes

Host 127.0.0.1
  IdentityFile ~/.ssh/login_id_ed25519

Alternativ könnten Sie einen .bash_alias-Eintrag erstellen, um Ihre Optionen durchzusetzen und automatisch eine Verbindung zu I2P herzustellen. Sie verstehen das Prinzip: Sie müssen IdentitiesOnly durchsetzen und eine Identity-Datei angeben.

i2pssh() {
    ssh -o IdentitiesOnly=yes -o IdentityFile=~/.ssh/login_id_ed25519 serveruser@127.0.0.1:7622
}

Step Five: Whitelist only the client tunnel

Das ist mehr oder weniger optional, aber ziemlich cool und verhindert, dass jeder, der zufällig auf Ihre Destination (Zieladresse) stößt, erkennen kann, dass Sie einen SSH-Dienst hosten.

Zuerst rufen Sie die persistente Destination (Zieladresse) für den Client tunnel ab und übermitteln Sie sie an den Server.

Screenshot-Platzhalter: Client-Destination abrufen

Fügen Sie die Base64-Destination des Clients der Destination-Whitelist des Servers hinzu. Nun können Sie nur noch von genau diesem Client-Tunnel aus eine Verbindung zum Server-Tunnel herstellen, und niemand sonst kann sich mit dieser Destination verbinden.

Screenshot-Platzhalter: Und fügen Sie es in die Server-Whitelist ein

Gegenseitige Authentifizierung ist die beste Wahl.

Hinweis: Die im ursprünglichen Beitrag referenzierten Bilder müssen dem Verzeichnis /static/images/ hinzugefügt werden: - server.webp, standard.webp, describe.webp, hostport.webp, approve.webp - interactive.webp, anonlevel.webp, idlereduce.webp - client.webp, clientstandard.webp, clientdescribe.webp - finddestination.webp, fixdestination.webp, clientport.webp, clientautostart.webp - clientinteractive.webp, whitelistclient.webp, whitelistserver.webp