
Tunnel TCP simple en Rust qui expose des ports locaux vers un serveur distant, contournant les pare-feux NAT. Léger, auto-hébergeable et facile à installer.
Un tunnel TCP moderne et simple en Rust qui expose des ports locaux vers un serveur distant, en contournant les pare-feux NAT standard. C'est tout ce qu'il fait : ni plus, ni moins.

# Installation (nécessite Rust, voir les alternatives ci-dessous)
cargo install bore-cli
# Sur votre machine locale
bore local 8000 --to bore.pub
Cela exposera votre port local localhost:8000 sur l'internet public à bore.pub:<PORT>, où le numéro de port est attribué aléatoirement.
Similaire à localtunnel et ngrok, sauf que bore est conçu pour être un outil très efficace et sans opinion pour transférer le trafic TCP, simple à installer et facile à auto-héberger, sans fioritures.
(bore totalise environ 400 lignes de code Rust asynchrone et sûr, et sa configuration est triviale — il suffit d'exécuter un seul binaire pour le client et le serveur.)
bore est packagé comme une formule Homebrew core.
brew install bore-cli
bore est disponible dans l'AUR sous le nom bore.
yay -S bore # ou votre helper AUR préféré
bore est disponible dans l'overlay gentoo-zh.
sudo eselect repository enable gentoo-zh
sudo emerge --sync gentoo-zh
sudo emerge net-proxy/bore
Sinon, le moyen le plus simple d'installer bore est à partir de binaires pré-construits. Ils sont disponibles sur la page des releases pour macOS, Windows et Linux. Il suffit de décompresser le fichier approprié pour votre plateforme et de déplacer l'exécutable bore dans un dossier sur votre PATH.
Vous pouvez aussi compiler bore à partir des sources avec Cargo, le gestionnaire de paquets Rust. Cette commande installe le binaire bore dans un chemin accessible à l'utilisateur.
cargo install bore-cli
Nous publions également des images Docker versionnées pour chaque release. L'image est construite pour une architecture AMD 64 bits. Elles sont étiquetées avec la version spécifique et vous permettent d'exécuter le binaire bore lié statiquement à partir d'un conteneur minimal "scratch".
docker run -it --init --rm --network host ekzhang/bore <ARGS>
Cette section décrit l'utilisation détaillée de la commande CLI bore.
Vous pouvez transférer un port sur votre machine locale en utilisant la commande bore local. Celle-ci prend un argument positionnel, le port local à transférer, ainsi qu'une option obligatoire --to qui spécifie l'adresse du serveur distant.
bore local 5000 --to bore.pub
Vous pouvez éventuellement passer une option --port pour choisir un port spécifique sur le serveur distant à exposer, mais la commande échouera si ce port n'est pas disponible. De plus, passer --local-host vous permet d'exposer un hôte différent sur votre réseau local autre que l'adresse de boucle locale localhost.
Les options complètes sont présentées ci-dessous.
Démarre un proxy local vers le serveur distant
Usage: bore local [OPTIONS] --to <TO> <LOCAL_PORT>
Arguments:
<LOCAL_PORT> Le port local à exposer [env: BORE_LOCAL_PORT=]
Options:
-l, --local-host <HOST> L'hôte local à exposer [default: localhost]
-t, --to <TO> Adresse du serveur distant vers lequel exposer les ports locaux [env: BORE_SERVER=]
-p, --port <PORT> Port optionnel sur le serveur distant à sélectionner [default: 0]
-s, --secret <SECRET> Secret optionnel pour l'authentification [env: BORE_SECRET]
-h, --help Affiche l'aide
Comme mentionné dans les instructions de démarrage, il existe une instance publique du serveur bore exécutée à bore.pub. Cependant, si vous souhaitez auto-héberger bore sur votre propre réseau, vous pouvez le faire avec la commande suivante :
bore server
C'est tout ce qu'il faut ! Une fois le serveur démarré à une adresse donnée, vous pouvez alors mettre à jour la commande bore local avec l'option --to <ADDRESS> pour transférer un port local vers ce serveur distant.
Il est possible de spécifier des adresses IP différentes pour le serveur de contrôle et pour les tunnels. Cette configuration est utile dans les cas où vous pourriez vouloir que le serveur de contrôle soit sur un réseau privé tout en autorisant les connexions tunnel sur une interface publique, ou vice versa.
Les options complètes de la commande bore server sont présentées ci-dessous.
Exécute le serveur proxy distant
Usage: bore server [OPTIONS]
Options:
--min-port <MIN_PORT> Numéro de port TCP minimum accepté [env: BORE_MIN_PORT=] [default: 1024]
--max-port <MAX_PORT> Numéro de port TCP maximum accepté [env: BORE_MAX_PORT=] [default: 65535]
-s, --secret <SECRET> Secret optionnel pour l'authentification [env: BORE_SECRET]
--bind-addr <BIND_ADDR> Adresse IP à laquelle se lier, les clients doivent y accéder [default: 0.0.0.0]
--bind-tunnels <BIND_TUNNELS> Adresse IP où les tunnels écouteront, par défaut --bind-addr
-h, --help Affiche l'aide
Il existe un port de contrôle implicite à 7835, utilisé pour créer de nouvelles connexions à la demande. Lors de l'initialisation, le client envoie un message « Hello » au serveur sur le port de contrôle TCP, demandant de proxifier un port distant sélectionné. Le serveur répond ensuite par un accusé de réception et commence à écouter les connexions TCP externes.
Lorsque le serveur obtient une connexion sur le port distant, il génère un UUID sécurisé pour cette connexion et le renvoie au client. Le client ouvre alors un flux TCP séparé vers le serveur et envoie un message « Accept » contenant l'UUID sur ce flux. Le serveur proxifie ensuite les deux connexions entre elles.
Pour des raisons de correction et pour éviter les fuites de mémoire, les connexions entrantes ne sont conservées par le serveur que pendant 10 secondes maximum avant d'être abandonnées si le client ne les accepte pas.
Sur un déploiement personnalisé de bore server, vous pouvez éventuellement exiger un secret pour empêcher le serveur d'être utilisé par d'autres. Le protocole exige que les clients vérifient la possession du secret sur chaque connexion TCP en répondant à des défis aléatoires sous forme de codes HMAC. (Ce secret n'est utilisé que pour la poignée de main initiale, et aucun trafic ultérieur n'est chiffré par défaut.)
# sur le serveur
bore server --secret my_secret_string
# sur le client
bore local <LOCAL_PORT> --to <TO> --secret my_secret_string
Si un secret n'est pas présent dans les arguments, bore tentera également de lire la variable d'environnement BORE_SECRET.
Créé par Eric Zhang (@ekzhang1). Sous licence MIT.
L'auteur tient à remercier les contributeurs et mainteneurs du projet Tokio pour avoir rendu possible l'écriture de services réseau ergonomiques et efficaces en Rust.