Back to Blog

// security

How Turbo handles security and privacy

What the open-source codebase actually does to protect node operators, proxy users, and payments — without the marketing fluff.

Lished
7 min read
#security#privacy#encryption#quic

Turbo is a distributed residential proxy network — not a fully decentralized one. That distinction matters for security: there is a central proxy server that routes traffic, authenticates buyers, and selects nodes. The good news is that almost all of this is open source under Apache 2.0, so you can read the code, self-host the backend, and decide for yourself whether the design is acceptable.

This article describes what Turbo actually implements today, based on the public repository and the website pairing flow.

Architecture at a glance

From the Turbo README:

  • Proxy buyers send HTTP/S or SOCKS5 requests to a self-hosted proxy server.
  • The server forwards each request — destination address plus payload — to a client node over TLS-encrypted QUIC.
  • The node opens a normal TCP connection to the target website and relays the response back.
  • Redis handles proxy-user authentication and credit accounting.
  • Supabase (PostgreSQL) stores node metadata and links nodes to website accounts.
  • Blockchain is used for node-operator payouts (rewards are paid in USDC, not a project token).
  1. Proxy buyer → Proxy server: SOCKS5 or HTTP CONNECT request
  2. Proxy server → Client node: destination address + TLS-encrypted payload over QUIC
  3. Client node → Target website: plain TCP connection
  4. Response travels back over QUIC to the server, then to the buyer

If you do not trust the official server, you can run your own with docker-compose up inside the server/ directory and point client nodes at it.

Encrypted transit between server and nodes

The server-to-node link is the most security-sensitive hop. Turbo uses quic-go to run a QUIC listener on port :8443 with a TLS configuration (server/proxy/quic.go, server/main.go).

Each connected node maintains a bidirectional QUIC stream. Messages are JSON-framed and carry typed payloads (connect, data, close, ping/pong, etc.). Application data is base64-encoded inside those messages — it is not sent in plaintext over the wire.

QUIC builds on TLS, so the transport between your node and the server is encrypted and authenticated at the connection level. The landing page specs list QUIC / TLS 1.3 as the node protocol, which matches this stack.

What this does not mean: end-to-end encryption from the proxy buyer all the way to the target website. The proxy server sees the destination address and relays the request body. Nodes see the same for connections assigned to them. That is inherent to how a proxy works.

Proxy buyer authentication

Access to the SOCKS5 entrypoint is gated by username/password authentication (server/proxy/socks/authentication.go):

  1. The client presents SOCKS5 credentials.
  2. The password is checked against Redis, where credentials are stored as bcrypt hashes (server/database/redis.go).
  3. On success, the username field is parsed for routing parameters — country code, session ID, residential group — not for identity verification (server/proxy/user/params.go).

Credits are tracked per credential in Redis. Invalid passwords are rejected unless DEBUG_MODE=1 is set on the server (a development escape hatch, not used in production).

This is straightforward credential auth, not zero-knowledge or anonymous access. Buyers get a password; the server validates it before routing any traffic.

Node pairing and account linking

When you click Connect in the desktop tray app, the node opens turbo.network/connect?uuid=… in your browser. That flow works like this:

  1. The node client inserts a row into node_connect_requests with a UUID, its public IP, and a 10-minute expiry.
  2. You sign in on the website (Supabase Auth).
  3. The website claims the UUID server-side and links your account to that node IP.
  4. A node can only be paired once — database triggers reject reassignment to a different user.

The pairing UUID is short-lived and single-use. The website validates it with the Supabase service role, not in the browser. If the link expires or the node is already linked to someone else, pairing fails with a clear error.

This replaces an older flow that relied on a localhost callback (/api/desktop-auth), which has been deprecated.

What runs on your machine as a node operator

The Turbo client is a lightweight background process (tray app on Windows, macOS, and Linux). It:

  • Maintains a persistent QUIC connection to the proxy server.
  • Accepts forwarded connect instructions and opens outbound TCP sockets to the specified host/port.
  • Relays bytes in both directions; it does not browse your filesystem or inspect local applications.

The node client does not need your browsing history, personal files, or local network credentials. It only handles proxy traffic the server assigns to it — typically small research, monitoring, and scraping workloads when your connection is idle.

That said, running a node means your IP address becomes egress for third-party requests. You should understand that before opting in. Turbo limits you to one node per network/IP and expects operators to share bandwidth they would not otherwise use.

Node quality monitoring (and removal)

The server continuously evaluates connected nodes:

  • Every 10 seconds, it sends a QUIC ping and expects a pong (server/proxy/ping.go).

  • Nodes that fail to respond are kicked from the pool.

  • Each node gets a score based on latency and reliability. The README defines:

    S=wLL+wRRS = w_L \cdot L + w_R \cdot R

    with wL=40%w_L = 40\% (latency) and wR=60%w_R = 60\% (reliability).

  • Higher-scoring nodes are preferred when routing buyer requests (server/proxy/balancer.go).

This is an operational security measure: unreliable or unresponsive nodes are removed rather than left in rotation.

Traffic analysis (in progress)

The README lists AI abnormal traffic detection as a planned feature — currently marked as not yet shipped. When implemented, it will evaluate server-side connection patterns via Redis streams. Until then, abuse prevention relies on credential auth, node scoring, and operator opt-in.

Payments and financial transparency

Node rewards are paid in USDC on public blockchains. Turbo does not operate its own token. Payouts are verifiable on-chain — every transaction is recorded on a public ledger.

This is a deliberate choice: crypto here is used for cross-border, censorship-resistant settlement, not for protocol governance or speculative tokenomics. See Is Turbo a DePIN project? for more on why we avoid blockchain bloat elsewhere in the stack.

Observability

The server exposes Prometheus metrics on :8080/metrics and a stats dashboard at :8080/stats. Connection metadata can be logged to ClickHouse for analytics (server/data/logging.go). These are server-side operational tools — they track bandwidth, latency, and routing quality, not personal browsing data from node operators.

What we do not claim

To be clear about what is not in the codebase today:

  • No zero-knowledge architecture — the proxy server is a trusted routing point.
  • No smart-contract-governed payouts or multi-sig wallets built into the protocol.
  • No bug bounty program, GDPR compliance module, or quantum-resistant cryptography.
  • No "military-grade" marketing labels — just TLS over QUIC, bcrypt in Redis, and standard SOCKS5 auth.

Security here is practical engineering: encrypt the node link, authenticate buyers, score and eject bad nodes, pair devices with expiring tokens, and keep the source auditable.

Self-hosting as a trust option

Because Turbo is Apache 2.0 licensed, you can:

  • Audit the Go server code yourself.
  • Run your own proxy server and Redis instance.
  • Connect your own client nodes.
  • Implement a different payment or auth model if needed.

If your threat model requires not trusting our hosted infrastructure, self-hosting is the supported path — not an afterthought.

Running a node safely

A few practical recommendations for operators:

  • Read the source before installing a binary — or build from the Turbo repository yourself.
  • Pair only through the official /connect flow and verify you land on turbo.network.
  • One node per IP/network — do not run multiple nodes behind the same egress if you want clean accounting.
  • Monitor your dashboard for unexpected bandwidth spikes.
  • Keep the client updated when new releases ship.

For proxy buyers, rotate credentials if they leak, use country/session parameters intentionally, and treat the service as shared residential egress — not as a VPN for hiding your identity from the proxy operator.

Summary

Turbo's security model is built around a few concrete mechanisms: TLS-encrypted QUIC between server and nodes, bcrypt-hashed credentials in Redis for buyer auth, time-limited UUID pairing for account linking, score-based node selection with automatic ejection, and on-chain USDC payouts. The codebase is public, self-hostable, and deliberately avoids blockchain complexity where it does not help.

That is a narrower story than "zero-knowledge decentralized privacy network" — and that is the point. We would rather describe what the system actually does than invent protections that are not there.


Questions about the architecture? Open an issue on GitHub or reach out via the Telegram channel.

TurboTurbo