Skip to content

Latest commit

History

3 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

rproxy — Self-Hosted Residential Proxy Service

A production-quality residential proxy service written in Rust. Two binaries:

BinaryRole
rproxy-serverProxy gateway — accepts SOCKS5 / HTTP CONNECT from client apps
rproxy-agentExit node — runs on residential machines, tunnels traffic to targets

Architecture

[Client App]
│ SOCKS5 :1080 or HTTP CONNECT :8080
▼
[rproxy-server] ←── picks provider from pool, opens yamux stream
│ WSS :8888 (provider WebSocket endpoint)
│ yamux multiplexing — many proxy streams over one WebSocket
▼
[rproxy-agent] ←── runs on the residential machine, accepts yamux streams
│ direct TCP
▼
[Target Website]

Key design decisions:

  • Provider agents connect outbound to the server (NAT-friendly, no port forwarding needed)
  • Streams are multiplexed via yamux over a single persistent WebSocket per provider
  • Gateway uses Mode::Client (opens streams); agent uses Mode::Server (accepts streams)
  • Thin VLESS-inspired framing header inside each yamux stream for addressing

Quick Start

1. Build

cargo build --release

2. Start the server

RPROXY_PROVIDER_TOKEN=my-secret-token ./target/release/rproxy-server

Listens on:

  • :1080 — SOCKS5 for client apps
  • :8080 — HTTP CONNECT for client apps
  • :8888 — WebSocket for provider agents

3. Start an agent (on a residential machine)

RPROXY_TOKEN=my-secret-token \
RPROXY_SERVER_URL=ws://your-server:8888 \
RPROXY_GEO=US-CA \
./target/release/rproxy-agent

The agent connects outbound, authenticates, and waits for proxy requests.

4. Use the proxy

curl --socks5 your-server:1080 https://example.com
# or
curl --proxytunnel --proxy http://your-server:8080 https://example.com

Configuration

rproxy-server

FlagEnvDefaultDescription
--socks5-portRPROXY_SOCKS5_PORT1080SOCKS5 listener port
--http-portRPROXY_HTTP_PORT8080HTTP CONNECT listener port
--provider-portRPROXY_PROVIDER_PORT8888Provider WebSocket port
--provider-tokenRPROXY_PROVIDER_TOKENchange-meShared secret for auth

rproxy-agent

FlagEnvDefaultDescription
--server-urlRPROXY_SERVER_URLws://127.0.0.1:8888Server WebSocket URL
--tokenRPROXY_TOKENchange-meAuth token
--geoRPROXY_GEOGeographic label (e.g. US-CA)
--labelRPROXY_LABELHuman-readable label
--accept-invalid-certsRPROXY_ACCEPT_INVALID_CERTSfalseSkip TLS cert validation

Wire Protocol

Each yamux stream carries one proxied TCP connection:

┌──────────┬────────────────┬──────────┐
│ Ver (1B) │ AddrType (1B) │ Port (2B)│
│ Addr (variable) │ │
└──────────┴────────────────┴──────────┘
← raw TCP byte stream follows →

Address types: 0x01 IPv4, 0x03 Domain, 0x04 IPv6.

Agent replies with 0x00 (success) or 0x01 (error + message) before relaying.

TLS / WSS

For production, put the server behind a reverse proxy (Nginx/Caddy) with TLS and point agents at wss://your-domain:443. The agent supports WSS natively.

License

MIT

About

Self-hosted residential proxy service — server + agent in Rust (tokio + yamux + WebSocket)

Resources

Stars

2 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages