{"id":43970270,"url":"https://github.com/xutianyi1999/fubuki","last_synced_at":"2026-02-26T07:38:43.465Z","repository":{"id":39366317,"uuid":"337921331","full_name":"xutianyi1999/fubuki","owner":"xutianyi1999","description":" A mesh VPN","archived":false,"fork":false,"pushed_at":"2026-02-25T07:41:13.000Z","size":926,"stargazers_count":162,"open_issues_count":1,"forks_count":20,"subscribers_count":7,"default_branch":"master","last_synced_at":"2026-02-25T12:42:51.312Z","etag":null,"topics":["p2p","rust","tuntap","vpn"],"latest_commit_sha":null,"homepage":"","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/xutianyi1999.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"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,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2021-02-11T03:40:00.000Z","updated_at":"2026-02-25T07:41:17.000Z","dependencies_parsed_at":"2023-11-15T09:30:04.652Z","dependency_job_id":"1d529a02-54b6-4b79-a855-20aa6ffb65d5","html_url":"https://github.com/xutianyi1999/fubuki","commit_stats":null,"previous_names":[],"tags_count":26,"template":false,"template_full_name":null,"purl":"pkg:github/xutianyi1999/fubuki","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/xutianyi1999%2Ffubuki","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/xutianyi1999%2Ffubuki/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/xutianyi1999%2Ffubuki/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/xutianyi1999%2Ffubuki/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/xutianyi1999","download_url":"https://codeload.github.com/xutianyi1999/fubuki/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/xutianyi1999%2Ffubuki/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29851616,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-25T22:37:40.667Z","status":"online","status_checked_at":"2026-02-26T02:00:06.774Z","response_time":89,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"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":["p2p","rust","tuntap","vpn"],"created_at":"2026-02-07T07:15:13.027Z","updated_at":"2026-02-26T07:38:43.458Z","avatar_url":"https://github.com/xutianyi1999.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Fubuki\n\n[中文](README.zh-CN.md) | English\n\n[![Release](https://github.com/xutianyi1999/fubuki/actions/workflows/rust.yml/badge.svg)](https://github.com/xutianyi1999/fubuki/actions/workflows/rust.yml)\n\nFubuki is a **mesh VPN**: it connects machines in different networks (home, office, cloud) into one virtual network. Each machine runs a **node** and gets a stable **virtual IP**. Nodes discover each other and connect via a central **server**; when possible they talk directly (P2P), otherwise traffic is relayed through the server.\n\n**Use cases:** remote access to home/office devices, linking servers across regions, gaming or tools that assume a single LAN.\n\n---\n\n## Table of contents\n\n- [Quick start](#quick-start)\n- [Prerequisites](#prerequisites)\n- [Configuration](#configuration)\n- [Running server and nodes](#running-server-and-nodes)\n- [Using the network](#using-the-network)\n- [Web UI and TUI](#web-ui-and-tui)\n- [Build from source](#build-from-source)\n- [Features](#features)\n\n---\n\n## Quick start\n\n1. **Prepare**  \n   - One machine with a **public IP** (or port forwarding) to run the **server**.  \n   - One or more machines that will join the mesh as **nodes**.\n\n2. **Create server config** `server.json`:\n   ```json\n   {\n     \"groups\": [{\n       \"name\": \"mygroup\",\n       \"key\": \"your-secret-key\",\n       \"listen_addr\": \"0.0.0.0:12345\",\n       \"address_range\": \"10.0.0.0/24\"\n     }]\n   }\n   ```\n\n3. **Start the server** (on the machine with public IP):\n   ```bash\n   fubuki server daemon ./server.json\n   ```\n\n4. **Create node config** `node.json` on each machine that should join (replace `SERVER_IP` with the server’s public IP):\n   ```json\n   {\n     \"groups\": [{\n       \"node_name\": \"alice\",\n       \"server_addr\": \"SERVER_IP:12345\",\n       \"key\": \"your-secret-key\"\n     }]\n   }\n   ```\n\n5. **Start each node** (as root/admin if required by your OS):\n   ```bash\n   fubuki node daemon ./node.json\n   ```\n\n6. **Test:** from one node, ping another by name or by virtual IP:\n   ```bash\n   ping bob.mygroup\n   # or use the virtual IP shown in logs / Web UI\n   ```\n\nThe **key** and **group name** must match between server and nodes; **node_name** must be unique per group.\n\n---\n\n## Prerequisites\n\n| Platform | Notes |\n|----------|--------|\n| **Windows** | Run as **Administrator**. Put [wintun](https://www.wintun.net) DLL next to `fubuki.exe` or in System32. Windows 7 needs [KB3063858](https://www.microsoft.com/en-us/download/details.aspx?id=47409) and [KB4474419](https://www.catalog.update.microsoft.com/search.aspx?q=kb4474419). |\n| **Linux**  | Run as **root** (or equivalent). Kernel must support **TUN**. |\n| **macOS**  | Run as **root**. Kernel must support **TUN**. |\n\n**Server:** must be reachable from all nodes (open the `listen_addr` port on the firewall and/or router).\n\n---\n\n## Configuration\n\nAll options are in JSON config files passed to `fubuki server daemon \u003cpath\u003e` or `fubuki node daemon \u003cpath\u003e`.\n\n**For complete and advanced examples** (all supported fields, multiple groups, optional tuning), see the **[cfg-example](cfg-example/)** directory ([GitHub](https://github.com/xutianyi1999/fubuki/tree/master/cfg-example)).\n\n### Server config\n\n| Field | Required | Description |\n|-------|----------|-------------|\n| **groups** | Yes | List of groups. Each group is one virtual network. |\n| **groups[].name** | Yes | Group name (e.g. `mygroup`). Nodes use this to join. |\n| **groups[].key** | No | Pre-shared key. Omit for no encryption; set the same on nodes to authenticate. |\n| **groups[].listen_addr** | Yes | `IP:PORT` the server listens on (e.g. `0.0.0.0:12345`). Use a public IP or `0.0.0.0`. |\n| **groups[].address_range** | Yes | Virtual subnet for this group (e.g. `10.0.0.0/24`). |\n| **api_addr** | No | HTTP API address (default `127.0.0.1:3031`). Used for Web UI / status. |\n| **tcp_heartbeat_interval_secs** | No | Default 5. |\n| **udp_heartbeat_interval_secs** | No | Default 5. |\n\nExample with two groups:\n\n```json\n{\n  \"groups\": [\n    {\n      \"name\": \"home\",\n      \"key\": \"secret1\",\n      \"listen_addr\": \"0.0.0.0:12345\",\n      \"address_range\": \"10.0.0.0/24\"\n    },\n    {\n      \"name\": \"office\",\n      \"key\": \"secret2\",\n      \"listen_addr\": \"0.0.0.0:12346\",\n      \"address_range\": \"10.0.1.0/24\"\n    }\n  ]\n}\n```\n\n### Node config\n\n| Field | Required | Description |\n|-------|----------|-------------|\n| **groups** | Yes | List of groups this node joins (can join multiple). |\n| **groups[].node_name** | Yes | Unique name in that group (e.g. `alice`, `laptop`). |\n| **groups[].server_addr** | Yes | Server address: `IP:PORT` (must match server’s `listen_addr`). |\n| **groups[].key** | No | Pre-shared key; must match the server group’s `key`. |\n| **api_addr** | No | HTTP API address (default `127.0.0.1:3030`). Web UI / TUI use this. |\n\nExample (one node, one group):\n\n```json\n{\n  \"groups\": [{\n    \"node_name\": \"alice\",\n    \"server_addr\": \"203.0.113.10:12345\",\n    \"key\": \"secret1\"\n  ]\n}\n```\n\nExample (one node, two groups):\n\n```json\n{\n  \"groups\": [\n    {\n      \"node_name\": \"alice\",\n      \"server_addr\": \"203.0.113.10:12345\",\n      \"key\": \"secret1\"\n    },\n    {\n      \"node_name\": \"alice\",\n      \"server_addr\": \"203.0.113.10:12346\",\n      \"key\": \"secret2\"\n    }\n  ]\n}\n```\n\n---\n\n## Running server and nodes\n\n- **Server** (one per deployment, on a machine reachable by all nodes):\n  ```bash\n  fubuki server daemon /path/to/server.json\n  ```\n\n- **Node** (on each machine that should be in the mesh):\n  ```bash\n  fubuki node daemon /path/to/node.json\n  ```\n\nUse the same **group name** and **key** on server and nodes. Each node’s **node_name** must be unique within that group. You can run multiple nodes on the same machine with different configs (different `node_name` and/or config file).\n\n---\n\n## Using the network\n\n- **By hostname:** `ping \u003cnode_name\u003e.\u003cgroup_name\u003e` (e.g. `ping bob.mygroup`). Fubuki updates the hosts file (or you can resolve manually) so that name points to the node’s virtual IP.\n- **By virtual IP:** each node gets an IP from the group’s `address_range` (e.g. `10.0.0.2`). Use this IP like any other: SSH, HTTP, game servers, etc.\n- **Routing:** ensure your OS routes traffic for the group’s `address_range` via the TUN device Fubuki creates (Fubuki typically sets this up for you on supported platforms).\n\n---\n\n## Web UI and TUI\n\n- **Web UI** (build with `--features web`): While the node or server is running, open `http://API_ADDR` in a browser. Defaults: node `http://127.0.0.1:3030`, server `http://127.0.0.1:3031`. The dashboard shows groups, nodes, virtual IPs, latency, and loss.\n- **TUI** (terminal UI): Run `fubuki node info` or `fubuki server info` to open the status TUI. Use `--api` if the API is not on the default address:\n  ```bash\n  fubuki node info                    # default: 127.0.0.1:3030\n  fubuki node info --api 192.168.1.5:3030\n  fubuki server info                  # default: 127.0.0.1:3031\n  ```\n\nSet **api_addr** in the server or node config to change where the API (and Web UI) listens.\n\n---\n\n## Build from source\n\n- **Rust:** nightly toolchain.  \n- **Windows:** MSVC toolchain.\n\n```bash\ncargo +nightly build --release\n```\n\n**With Web UI** (bundled dashboard):\n\n```bash\ncd fubuki-webui \u0026\u0026 npm install \u0026\u0026 npm run build \u0026\u0026 cd ..\ncargo +nightly build --release --features \"web\"\n```\n\n**With desktop GUI:**\n\n```bash\ncargo +nightly build --release --features \"gui\"\n```\n\n**Android (FFI library):**\n\n```bash\nexport RUSTUP_TOOLCHAIN=nightly\ncargo install cross --git https://github.com/cross-rs/cross\ncross build --lib --release --no-default-features --features \"ffi-export\" --target aarch64-linux-android\n```\n\n---\n\n## Features\n\n| Feature | Cargo flag | Description |\n|---------|------------|-------------|\n| mimalloc | default | Alternative allocator. |\n| web | `--features web` | Embed and serve Web UI from the API. |\n| gui | `--features gui` | Desktop GUI (klask). |\n| cross-nat | `--features cross-nat` | netstack-lwip for cross-NAT. |\n| ffi-export | `--features ffi-export` | FFI for use as a library (e.g. Android). |\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fxutianyi1999%2Ffubuki","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fxutianyi1999%2Ffubuki","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fxutianyi1999%2Ffubuki/lists"}