
Einfacher TCP-Tunnel in Rust, der lokale Ports auf einem entfernten Server bereitstellt und NAT-Firewalls umgeht. Leichtgewichtig, selbst hostbar und einfach zu installieren.
Ein moderner, einfacher TCP-Tunnel in Rust, der lokale Ports auf einem entfernten Server bereitstellt und dabei standardmäßige NAT-Verbindungsfirewalls umgeht. Das ist alles, was er tut: nicht mehr und nicht weniger.

# Installation (erfordert Rust, siehe Alternativen unten)
cargo install bore-cli
# Auf deinem lokalen Rechner
bore local 8000 --to bore.pub
Dieser Befehl macht deinen lokalen Port unter localhost:8000 im öffentlichen Internet unter bore.pub:<PORT> verfügbar, wobei die Portnummer zufällig zugewiesen wird.
Ähnlich wie localtunnel und ngrok, außer dass bore als hocheffizientes, meinungsfreies Werkzeug zur Weiterleitung von TCP-Verkehr gedacht ist, das einfach zu installieren und leicht selbst zu hosten ist – ohne Schnickschnack.
(bore umfasst etwa 400 Zeilen sicheren, asynchronen Rust-Codes und ist trivial einzurichten – führe einfach eine einzelne Binärdatei für Client und Server aus.)
bore ist als Homebrew-Core-Formel verpackt.
brew install bore-cli
bore ist im AUR als bore verfügbar.
yay -S bore # oder dein bevorzugter AUR-Helfer
bore ist im gentoo-zh Overlay verfügbar.
sudo eselect repository enable gentoo-zh
sudo emerge --sync gentoo-zh
sudo emerge net-proxy/bore
Andernfalls ist der einfachste Weg, bore zu installieren, über vorgefertigte Binärdateien. Diese sind auf der Releases-Seite für macOS, Windows und Linux verfügbar. Entpacke einfach die entsprechende Datei für deine Plattform und verschiebe die ausführbare bore-Datei in einen Ordner in deinem PATH.
Du kannst bore auch aus dem Quellcode mit Cargo, dem Rust-Paketmanager, erstellen. Dieser Befehl installiert die bore-Binärdatei an einem benutzerzugänglichen Pfad.
cargo install bore-cli
Wir veröffentlichen auch versionierte Docker-Images für jedes Release. Das Image ist für eine AMD 64-Bit-Architektur gebaut. Sie sind mit der spezifischen Version getaggt und ermöglichen es dir, die statisch gelinkte bore-Binärdatei aus einem minimalen "scratch"-Container auszuführen.
docker run -it --init --rm --network host ekzhang/bore <ARGS>
Dieser Abschnitt beschreibt die detaillierte Nutzung des bore-CLI-Befehls.
Du kannst einen Port auf deinem lokalen Rechner mit dem Befehl bore local weiterleiten. Dieser nimmt ein positionsabhängiges Argument, den zu leitenden lokalen Port, sowie eine obligatorische Option --to, die die Adresse des entfernten Servers angibt.
bore local 5000 --to bore.pub
Optional kannst du eine Option --port übergeben, um einen bestimmten Port auf dem entfernten Server auszuwählen. Der Befehl schlägt fehl, wenn dieser Port nicht verfügbar ist. Mit --local-host kannst du außerdem einen anderen Host in deinem lokalen Netzwerk angeben, anstelle der Loopback-Adresse localhost.
Die vollständigen Optionen sind unten aufgeführt.
Startet einen lokalen Proxy zum entfernten Server
Verwendung: bore local [OPTIONEN] --to <ZIEL> <LOKALER_PORT>
Argumente:
<LOKALER_PORT> Der lokale Port, der freigegeben werden soll [env: BORE_LOCAL_PORT=]
Optionen:
-l, --local-host <HOST> Der lokale Host, der freigegeben werden soll [standard: localhost]
-t, --to <ZIEL> Adresse des entfernten Servers, um lokale Ports freizugeben [env: BORE_SERVER=]
-p, --port <PORT> Optionaler Port auf dem entfernten Server zur Auswahl [standard: 0]
-s, --secret <SECRET> Optionales Geheimnis für die Authentifizierung [env: BORE_SECRET]
-h, --help Hilfe anzeigen
Wie in den Startanweisungen erwähnt, gibt es eine öffentliche Instanz des bore-Servers, die unter bore.pub läuft. Wenn du bore jedoch auf deinem eigenen Netzwerk selbst hosten möchtest, kannst du dies mit dem folgenden Befehl tun:
bore server
Das ist alles! Nachdem der Server unter einer bestimmten Adresse gestartet ist, kannst du den Befehl bore local mit der Option --to <ADRESSE> aktualisieren, um einen lokalen Port an diesen entfernten Server weiterzuleiten.
Es ist möglich, unterschiedliche IP-Adressen für den Kontrollserver und die Tunnel anzugeben. Dieses Setup ist nützlich, wenn der Kontrollserver in einem privaten Netzwerk liegen soll, während Tunnelverbindungen über eine öffentliche Schnittstelle erfolgen, oder umgekehrt.
Die vollständigen Optionen für den Befehl bore server sind unten aufgeführt.
Führt den entfernten Proxy-Server aus
Verwendung: bore server [OPTIONEN]
Optionen:
--min-port <MIN_PORT> Mindestanzahl akzeptierter TCP-Portnummern [env: BORE_MIN_PORT=] [standard: 1024]
--max-port <MAX_PORT> Höchstzahl akzeptierter TCP-Portnummern [env: BORE_MAX_PORT=] [standard: 65535]
-s, --secret <SECRET> Optionales Geheimnis für die Authentifizierung [env: BORE_SECRET]
--bind-addr <BIND_ADDR> IP-Adresse, an die gebunden wird; Clients müssen diese erreichen [standard: 0.0.0.0]
--bind-tunnels <BIND_TUNNELS> IP-Adresse, an der Tunnel lauschen; standardmäßig --bind-addr
-h, --help Hilfe anzeigen
Es gibt einen impliziten Kontrollport unter 7835, der verwendet wird, um bei Bedarf neue Verbindungen zu erstellen. Beim Initialisieren sendet der Client eine "Hello"-Nachricht an den Server auf dem TCP-Kontrollport und fragt an, einen ausgewählten entfernten Port zu proxen. Der Server antwortet dann mit einer Bestätigung und beginnt, auf externe TCP-Verbindungen zu lauschen.
Immer wenn der Server eine Verbindung auf dem entfernten Port erhält, erzeugt er eine sichere UUID für diese Verbindung und sendet sie an den Client zurück. Der Client öffnet dann einen separaten TCP-Stream zum Server und sendet eine "Accept"-Nachricht mit der UUID auf diesem Stream. Der Server proxet dann die beiden Verbindungen miteinander.
Aus Gründen der Korrektheit und zur Vermeidung von Speicherlecks werden eingehende Verbindungen vom Server nur maximal 10 Sekunden lang gespeichert, bevor sie verworfen werden, falls der Client sie nicht akzeptiert.
Bei einer benutzerdefinierten Bereitstellung von bore server kannst du optional ein Geheimnis verlangen, um zu verhindern, dass der Server von anderen genutzt wird. Das Protokoll erfordert, dass Clients den Besitz des Geheimnisses bei jeder TCP-Verbindung überprüfen, indem sie zufällige Herausforderungen in Form von HMAC-Codes beantworten. (Dieses Geheimnis wird nur für den initialen Handshake verwendet; der gesamte weitere Verkehr wird standardmäßig nicht verschlüsselt.)
# auf dem Server
bore server --secret mein_geheimes_passwort
# auf dem Client
bore local <LOKALER_PORT> --to <ZIEL> --secret mein_geheimes_passwort
Falls kein Geheimnis in den Argumenten angegeben ist, versucht bore auch, die Umgebungsvariable BORE_SECRET auszulesen.
Erstellt von Eric Zhang (@ekzhang1). Lizenziert unter der MIT-Lizenz.
Der Autor dankt den Mitwirkenden und Betreuern des Tokio-Projekts, die es ermöglicht haben, ergonomische und effiziente Netzwerkdienste in Rust zu schreiben.