
Простой TCP-туннель на Rust, который открывает доступ к локальным портам через удалённый сервер, обходя NAT-фаерволы. Лёгкий, самостоятельно развёртываемый и простой в установке.
Современный, простой TCP-туннель на Rust, который открывает локальные порты на удаленный сервер, обходя стандартные межсетевые экраны NAT. Это всё, что он делает: ни больше, ни меньше.

# Installation (requires Rust, see alternatives below)
cargo install bore-cli
# On your local machine
bore local 8000 --to bore.pub
Это откроет ваш локальный порт localhost:8000 в публичный интернет по адресу bore.pub:<PORT>, где номер порта назначается случайным образом.
Аналогично localtunnel и ngrok, за исключением того, что bore задуман как высокоэффективный, непредвзятый инструмент для пересылки TCP-трафика, который прост в установке и лёгок в самостоятельном хостинге, без лишних наворотов.
(bore состоит примерно из 400 строк безопасного асинхронного кода на Rust и его настройка тривиальна — просто запустите один бинарный файл для клиента и сервера.)
bore packaged as a Homebrew core formula.
brew install bore-cli
bore доступен в AUR как bore.
yay -S bore # or your favorite AUR helper
bore доступен в оверлее gentoo-zh.
sudo eselect repository enable gentoo-zh
sudo emerge --sync gentoo-zh
sudo emerge net-proxy/bore
В противном случае самый простой способ установить bore — использовать готовые бинарные сборки. Они доступны на странице релизов для macOS, Windows и Linux. Просто распакуйте соответствующий файл для вашей платформы и переместите исполняемый файл bore в папку из вашего PATH.
Вы также можете собрать bore из исходников с помощью Cargo, менеджера пакетов Rust. Эта команда устанавливает бинарный файл bore в доступную пользователю директорию.
cargo install bore-cli
Мы также публикуем версионированные Docker-образы для каждого релиза. Образ собран для 64-битной архитектуры AMD. Они помечены конкретной версией и позволяют запускать статически слинкованный бинарный файл bore из минимального контейнера "scratch".
docker run -it --init --rm --network host ekzhang/bore <ARGS>
В этом разделе описывается подробное использование CLI-команды bore.
Вы можете переслать порт на вашей локальной машине с помощью команды bore local. Она принимает позиционный аргумент — локальный порт для пересылки, а также обязательный параметр --to, который указывает адрес удаленного сервера.
bore local 5000 --to bore.pub
Вы можете по желанию передать параметр --port, чтобы выбрать конкретный порт на удаленной стороне, хотя команда завершится ошибкой, если этот порт занят. Также параметр --local-host позволяет открыть другой хост в вашей локальной сети, кроме адреса loopback localhost.
Полный список параметров приведен ниже.
Starts a local proxy to the remote server
Usage: bore local [OPTIONS] --to <TO> <LOCAL_PORT>
Arguments:
<LOCAL_PORT> The local port to expose [env: BORE_LOCAL_PORT=]
Options:
-l, --local-host <HOST> The local host to expose [default: localhost]
-t, --to <TO> Address of the remote server to expose local ports to [env: BORE_SERVER=]
-p, --port <PORT> Optional port on the remote server to select [default: 0]
-s, --secret <SECRET> Optional secret for authentication [env: BORE_SECRET]
-h, --help Print help
Как упоминалось в инструкции по запуску, существует публичный экземпляр сервера bore, работающий на bore.pub. Однако, если вы хотите разместить bore на своей собственной сети, вы можете сделать это с помощью следующей команды:
bore server
Вот и всё! После того как сервер запустится по заданному адресу, вы можете обновить команду bore local, указав параметр --to <ADDRESS>, чтобы переслать локальный порт на этот удаленный сервер.
Можно указать разные IP-адреса для управляющего сервера и для туннелей. Такая настройка полезна в случаях, когда вы хотите, чтобы управляющий сервер находился в частной сети, а туннельные соединения были разрешены через публичный интерфейс, или наоборот.
Полный список параметров команды bore server приведен ниже.
Runs the remote proxy server
Usage: bore server [OPTIONS]
Options:
--min-port <MIN_PORT> Minimum accepted TCP port number [env: BORE_MIN_PORT=] [default: 1024]
--max-port <MAX_PORT> Maximum accepted TCP port number [env: BORE_MAX_PORT=] [default: 65535]
-s, --secret <SECRET> Optional secret for authentication [env: BORE_SECRET]
--bind-addr <BIND_ADDR> IP address to bind to, clients must reach this [default: 0.0.0.0]
--bind-tunnels <BIND_TUNNELS> IP address where tunnels will listen on, defaults to --bind-addr
-h, --help Print help
Существует неявный управляющий порт на 7835, используемый для создания новых соединений по требованию. При инициализации клиент отправляет серверу сообщение "Hello" через управляющий TCP-порт, запрашивая проксирование выбранного удаленного порта. Сервер отвечает подтверждением и начинает прослушивание внешних TCP-соединений.
Всякий раз, когда сервер получает соединение на удаленном порту, он генерирует безопасный UUID для этого соединения и отправляет его обратно клиенту. Клиент затем открывает отдельный TCP-поток к серверу и отправляет сообщение "Accept", содержащее UUID, в этом потоке. После этого сервер проксирует два соединения друг к другу.
Из соображений корректности и во избежание утечек памяти входящие соединения хранятся сервером не более 10 секунд, прежде чем будут отброшены, если клиент их не принимает.
В пользовательском развертывании bore server вы можете по желанию потребовать секрет, чтобы предотвратить использование сервера другими. Протокол требует от клиентов подтверждать владение секретом при каждом TCP-соединении, отвечая на случайные вызовы в виде HMAC-кодов. (Этот секрет используется только для начального рукопожатия; дальнейший трафик по умолчанию не шифруется.)
# on the server
bore server --secret my_secret_string
# on the client
bore local <LOCAL_PORT> --to <TO> --secret my_secret_string
Если секрет не указан в аргументах, bore также попытается прочитать его из переменной окружения BORE_SECRET.
Создано Эриком Чжаном (@ekzhang1). Лицензировано под лицензией MIT.
Автор благодарит участников и мейнтейнеров проекта Tokio за возможность писать эргономичные и эффективные сетевые сервисы на Rust.