{"id":26474298,"url":"https://github.com/conduktor/bore-kafka","last_synced_at":"2026-01-27T14:04:37.844Z","repository":{"id":169004752,"uuid":"614015858","full_name":"conduktor/bore-kafka","owner":"conduktor","description":"Fork of bore to tunnel kafka connection","archived":false,"fork":false,"pushed_at":"2024-11-21T10:47:11.000Z","size":422,"stargazers_count":2,"open_issues_count":17,"forks_count":0,"subscribers_count":11,"default_branch":"main","last_synced_at":"2025-04-05T14:21:50.997Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/conduktor.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null},"funding":{"github":["ekzhang"]}},"created_at":"2023-03-14T18:09:36.000Z","updated_at":"2024-11-21T10:47:13.000Z","dependencies_parsed_at":"2025-03-19T22:52:18.799Z","dependency_job_id":"bd4dc7a0-0442-4d0c-a5b9-17e7c0dfd07f","html_url":"https://github.com/conduktor/bore-kafka","commit_stats":null,"previous_names":["conduktor/bore-kafka"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/conduktor/bore-kafka","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/conduktor%2Fbore-kafka","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/conduktor%2Fbore-kafka/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/conduktor%2Fbore-kafka/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/conduktor%2Fbore-kafka/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/conduktor","download_url":"https://codeload.github.com/conduktor/bore-kafka/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/conduktor%2Fbore-kafka/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28814326,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-27T12:25:15.069Z","status":"ssl_error","status_checked_at":"2026-01-27T12:25:05.297Z","response_time":168,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2025-03-19T22:52:08.869Z","updated_at":"2026-01-27T14:04:37.815Z","avatar_url":"https://github.com/conduktor.png","language":"Rust","funding_links":["https://github.com/sponsors/ekzhang"],"categories":[],"sub_categories":[],"readme":"# \u003cimg src=\"https://user-images.githubusercontent.com/2573301/192741305-0e1441a4-308b-4308-947a-656a1dc53577.png\" width=\"25\"\u003e bore-kafka\n\n[![discord](https://img.shields.io/badge/chat-on%20discord-yellowgreen)](https://discord.com/channels/861899833970262046/861899833970262049)\n[![twitter](https://img.shields.io/twitter/follow/getconduktor.svg?style=social)](https://twitter.com/getconduktor)\n\nThis is a fork of the https://github.com/ekzhang/bore project to be able to work with Apache Kafka.\n\nThanks to this, it's possible to establish a connection from your private or localhost cluster to a public cloud infrastructure such as Conduktor https://www.conduktor.io.\n\n# How to run it?\n\nIf you have a Kafka running on `localhost:9092` for instance:\n\n```shell\ncargo run kafka-proxy --bootstrap-server localhost:9092\n```\n\nThis will expose your local port and all the others returned by kafka at `localhost:9092` to the public internet at `bore.pub:\u003cPORT\u003e`, where the port number is assigned randomly.\n\n## Detailed Usage\n\nThis section describes detailed usage for the `conduktor-kafka-proxy` CLI command.\n\n### Local Forwarding\n\n```shell\ncargo run start --bootstrap-server localhost:9092\n```\nThe full options are shown below.\n\n```shell\nStarts a local LocalProxy to the remote server\n\nUsage: conduktor-kafka-proxy start [OPTIONS]\n\nOptions:\n  -b, --bootstrap-server \u003cBOOTSTRAP_SERVER\u003e  The local host to expose [default: localhost:9092]\n  -s, --secret \u003cSECRET\u003e                      Optional secret for authentication [env: BORE_SECRET]\n  -h, --help                                 Print help\n\n```\n\n### Self-Hosting\n\nAs mentioned in the startup instructions, there is a public instance of the `bore` server running at `bore.pub`. However, if you want to self-host `bore` on your own network, you can do so with the following command:\n\n```shell\nbore server\n```\n\nThat's all it takes! After the server starts running at a given address, you can then update the `bore local` command with option `--to \u003cADDRESS\u003e` to forward a local port to this remote server.\n\nThe full options for the `bore server` command are shown below.\n\n```shell\nRuns the remote proxy server\n\nUsage: bore server [OPTIONS]\n\nOptions:\n      --min-port \u003cMIN_PORT\u003e  Minimum TCP port number to accept [default: 1024]\n  -s, --secret \u003cSECRET\u003e      Optional secret for authentication [env: BORE_SECRET]\n  -h, --help                 Print help information\n```\n\n## Protocol\n\nThere is an implicit _control port_ at `7835`, used for creating new connections on demand. At initialization, the client sends a \"Hello\" message to the server on the TCP control port, asking to proxy a selected remote port. The server then responds with an acknowledgement and begins listening for external TCP connections.\n\nWhenever the server obtains a connection on the remote port, it generates a secure [UUID](https://en.wikipedia.org/wiki/Universally_unique_identifier) for that connection and sends it back to the client. The client then opens a separate TCP stream to the server and sends an \"Accept\" message containing the UUID on that stream. The server then proxies the two connections between each other.\n\nFor correctness reasons and to avoid memory leaks, incoming connections are only stored by the server for up to 10 seconds before being discarded if the client does not accept them.\n\n## Authentication\n\nOn a custom deployment of `bore server`, you can optionally require a _secret_ to prevent the server from being used by others. The protocol requires clients to verify possession of the secret on each TCP connection by answering random challenges in the form of HMAC codes. (This secret is only used for the initial handshake, and no further traffic is encrypted by default.)\n\n```shell\n# on the server\nbore server --secret my_secret_string\n\n# on the client\nbore local \u003cLOCAL_PORT\u003e --to \u003cTO\u003e --secret my_secret_string\n```\n\nIf a secret is not present in the arguments, `bore` will also attempt to read from the `BORE_SECRET` environment variable.\n\n## Acknowledgements\n\nCreated by Eric Zhang ([@ekzhang1](https://twitter.com/ekzhang1)). Licensed under the [MIT license](LICENSE).\n\nThe author would like to thank the contributors and maintainers of the [Tokio](https://tokio.rs/) project for making it possible to write ergonomic and efficient network services in Rust.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fconduktor%2Fbore-kafka","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fconduktor%2Fbore-kafka","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fconduktor%2Fbore-kafka/lists"}