Tunnel out of NAT,
into the microsecond era

A Rust async data plane paired with a Go control plane. wrk-verified: peak throughput at 6.03x frp, 558.51μs average latency, zero errors under full concurrency.

A data plane built for throughput, a control plane built for stability

Rust async data plane

Lock-free connection pooling on an async runtime removes contention bottlenecks and saturates the NIC.

241,344.46 Req/s · 197.70 MB/s

QUIC transport

Built-in congestion control absorbs jitter on lossy links; 0-RTT handshake pushes short-connection latency under 2ms.

1.84 ms

P2P direct connect

connect mode punches holes via WebRTC: both endpoints exchange traffic directly, bypassing the relay server entirely.

One binary, zero setup

Server and client are the same executable; one Docker line to start. The client sits around 17MB RSS, happy on a cheap VPS or a Raspberry Pi.

Benchmarks

All numbers come from wrk runs (-c 100 -d 30s -t 10) against a local nginx. Full commands and raw logs live in core/README_CN.md.

View raw wrk output excerpts

            

Download

Single static binary, no install step; server and client are the same executable. Direct links point at GitHub Releases.

One-line install for Linux / macOS POSIX sh · arch detection · verified
curl -fsSL https://gtunnel.dev/install.sh | sh

The script detects your OS and CPU architecture, pulls the matching binary from GitHub Releases and installs it to /usr/local/bin (or ~/.local/bin without root). Pin a version with GT_VERSION, point GT_REPO at your own fork, and sha256 verification runs automatically whenever the release ships checksums.txt.

Windows
Download gt-win-x86_64.exe
macOS
Download gt-macos-arm64
Linux
Download gt-linux-x86_64

Command builder

Fill in your relay parameters and get the client launch command.

Client launch command
./gt client -local http://127.0.0.1:80 -remote tcp://id1.example.com:12080 -id pi -secret secret1