A fast, custom encrypted transport protocol written in Rust.
Go to file
ospab a547ebff17 fix(ci): quote run-name — unquoted colon broke YAML parsing on every push
The run-name expression contains the GHA string literal 'Release build: {0}'
— an unquoted YAML plain scalar treats ": " as starting a nested mapping,
which invalidated the entire workflow file at parse time (before any job
runs). Every push since that line was introduced failed instantly with
"Invalid workflow file ... line 11", silently burning an Actions-minutes
run each time for nothing. Wrapping the whole expression in double quotes
fixes it — verified with `npx js-yaml` that the file now parses and the
run-name value round-trips intact.
2026-07-08 22:23:01 +03:00
.github fix(ci): quote run-name — unquoted colon broke YAML parsing on every push 2026-07-08 22:23:01 +03:00
docs Polish docs/README to match v0.4.x: fix license mismatch, CLI, crypto docs 2026-07-08 03:06:53 +03:00
icons Fix memory leaks, hang issues, gui helper token vulns, and log spam 2026-06-16 14:11:37 +03:00
netstack-smoltcp Fix memory leaks, hang issues, gui helper token vulns, and log spam 2026-06-16 14:11:37 +03:00
ostp refactor(config): one canonical config.json schema for client/server/relay 2026-07-08 18:58:34 +03:00
ostp-client refactor(config): one canonical config.json schema for client/server/relay 2026-07-08 18:58:34 +03:00
ostp-core 0.4.1: per-key junk marker, GUI polish, pre-release pipeline 2026-07-07 16:33:57 +03:00
ostp-flutter chore: release 0.4.4-nightly on nightly 2026-07-08 19:13:55 +03:00
ostp-gui chore: release 0.4.4-nightly on nightly 2026-07-08 19:13:55 +03:00
ostp-jni §A.3: remove dead tun2socks code (native OSTP TUN is the only path) 2026-06-27 16:29:55 +03:00
ostp-server 0.4.1: per-key junk marker, GUI polish, pre-release pipeline 2026-07-07 16:33:57 +03:00
ostp-tun §B: port stability fixes from 0.3.x onto the clean base 2026-06-27 16:30:42 +03:00
ostp-tun-helper §B: port stability fixes from 0.3.x onto the clean base 2026-06-27 16:30:42 +03:00
scripts feat(client): one authoritative config migrator, manual-only 2026-07-08 18:45:04 +03:00
.gitattributes chore: enforce LF line endings on bash scripts via gitattributes to fix 'bad interpreter' on Linux 2026-05-15 19:08:03 +03:00
.gitignore Remove repo-root cruft: scratch files, dead migration script, stale wiki/config 2026-07-08 02:59:02 +03:00
.release-state.json chore: release 0.4.4-nightly on nightly 2026-07-08 19:13:55 +03:00
CONTRIBUTING.md docs: add commit conventions and branch strategy to CONTRIBUTING 2026-07-08 17:28:10 +03:00
CONTRIBUTING.ru.md docs: add commit conventions and branch strategy to CONTRIBUTING 2026-07-08 17:28:10 +03:00
Cargo.lock chore: release 0.4.4-nightly on nightly 2026-07-08 19:13:55 +03:00
Cargo.toml chore: release 0.4.4-nightly on nightly 2026-07-08 19:13:55 +03:00
Cross.toml CI/CD: Resolve MIPS Tier-3 compilation by instructing Cross to dynamically build-std library from source 2026-05-14 23:57:19 +03:00
LICENSE Initial public release: Ospab Stealth Transport Protocol v0.1.0 2026-05-14 21:41:54 +03:00
README.md Polish docs/README to match v0.4.x: fix license mismatch, CLI, crypto docs 2026-07-08 03:06:53 +03:00
README.ru.md Polish docs/README to match v0.4.x: fix license mismatch, CLI, crypto docs 2026-07-08 03:06:53 +03:00
REBUILD_PLAN.md §A: remove WSS + Reality (TLS-mimicry); bump to 0.4.0 / AGPL-3.0 2026-06-27 16:29:42 +03:00
app-icon.svg Refactor: Phase 1 and 2 - Async architecture, JNI fixes, SmolTCP data races, and Tunnel optimizations 2026-06-03 02:06:06 +03:00

README.md

OSTP — Ospab Stealth Transport Protocol

Русский язык · Wiki · Contributing · Releases

GitHub Release License: AGPL v3 Platform: Windows | Linux | macOS | Android Crypto Transport

A fast, custom encrypted transport protocol written in Rust.

OSTP (Ospab Stealth Transport Protocol) is a high-performance transport protocol. It implements a custom ARQ transport over UDP, as well as a UoT (UDP-over-TCP) mode. Every byte on the wire — including packet headers — is cryptographically indistinguishable from random noise, making it highly resistant to Deep Packet Inspection (DPI).


Quick Install

Linux

bash <(curl -Ls https://raw.githubusercontent.com/ospab/ostp/master/scripts/install.sh)

Windows (PowerShell, run as Administrator)

irm https://raw.githubusercontent.com/ospab/ostp/master/scripts/install.ps1 | iex

Manual Download

Download pre-built binaries for your platform from GitHub Releases.


Key Features

Feature Description
Full Traffic Obfuscation Every packet — including headers — is indistinguishable from random noise. Session IDs and nonces are masked with per-packet HMAC-derived keys.
Noise Protocol Handshake Noise_NNpsk0_25519_ChaChaPoly_BLAKE2s — PSK-authenticated, forward-secret key exchange with no static identity exposure.
Reliable UDP (ARQ) Selective ACK/NACK with rate-limited retransmission, configurable reorder buffer, and exponential backoff.
Multiplexed Streams Multiple logical TCP streams over a single encrypted UDP session with per-stream flow control.
Seamless Roaming Clients can switch networks (WiFi ↔ LTE) without session interruption — tracked by session-ID, not IP.
Management API Built-in REST API for third-party panels (3x-ui, custom dashboards). Per-user stats, traffic limits, key CRUD.
Fallback Server TCP fallback proxy to a web server — makes OSTP indistinguishable from nginx during active probing.
Multi-Listener Bind to multiple addresses simultaneously (dual-stack IPv4/IPv6, multi-port).
TUN Mode Full-system VPN via native smoltcp network stack without external dependencies. All traffic transparently routed through the tunnel.
xHTTP Stealth (UoT) UDP-over-TCP tunnel that completely hides traffic. Since all data is fully encrypted and length-prefixed, it bypasses DPI filters that block unknown UDP traffic by riding over a plain TCP connection.
Mobile & Web Apps Beautiful cross-platform mobile client (Flutter) and a modern Web Control Panel (React/Vite) for effortless server and client management.
TURN Relay RFC 5766 TURN support for environments where direct UDP is blocked.
Hot-Reload Runtime config reload without restart (access keys, exclusions, mux settings).
Structured Logging tracing-based logging with RUST_LOG filtering. JSON/file/syslog output support.
Cross-Platform Windows, Linux, macOS, Android, FreeBSD, MIPS, RISC-V. Single binary, no runtime dependencies.

Architecture

graph TD
    subgraph Client ["Client"]
        A[Browser / Apps] -->|SOCKS5 / HTTP| B(Bridge Multiplexer)
        TUN[TUN Interface] -->|IP Packets| B
        
        subgraph OSTPCoreClient ["OSTP Core Protocol"]
            B --> C{Protocol Machine}
            C -->|Noise Handshake| D[ChaCha20Poly1305 AEAD]
            D -->|Obfuscated UDP Payload| E((UDP Socket))
        end
    end

    E <==>|Encrypted & Obfuscated UDP Tunnel| F

    subgraph Server ["Server"]
        F((UDP Socket)) --> G{Dispatcher}
        
        subgraph OSTPCoreServer ["OSTP Core Backend"]
            G -->|Auth & Decrypt| H[Session & State Guard]
            H -->|TCP Stream| I[Relay Loop]
        end
        
        G -->|Active Probing / Unauth| FB[TCP Fallback Proxy]
        FB -->|Forward| NGINX[nginx / Caddy]
        
        H -->|Stats & Traffic| API[Management API]
        
        I -->|Outbound| WWW((Internet))
    end

Quick Start

1. Generate config

# On your VPS (server):
./ostp init server

# On your machine (client):
./ostp init client

2. Edit config

Server — set your access keys:

{
  "mode": "server",
  "listen": "0.0.0.0:50000",
  "access_keys": ["YOUR_SECRET_KEY"],
  "api": { "enabled": true, "bind": "127.0.0.1:9090", "token": "admin-token" },
  "fallback": { "enabled": false, "listen": "0.0.0.0:443", "target": "127.0.0.1:8080" }
}

Client — point to your server:

{
  "mode": "client",
  "server": "YOUR_SERVER_IP:50000",
  "access_key": "YOUR_SECRET_KEY",
  "socks5_bind": "127.0.0.1:1088",
  "transport": { "mode": "udp", "stealth_sni": "vk.com" },
  "tun": { "enable": false, "dns": "1.1.1.1" }
}

3. Run

./ostp                         # Uses config.json in current directory
./ostp --config /path/to.json  # Custom config path
./ostp check                   # Validate config without running
./ostp gk                      # Generate a new access key
./ostp links                   # Print client share links
./ostp connect "ostp://ACCESS_KEY@server.com:50000?..."

[!WARNING] Always wrap the ostp://... link in quotes (") so your terminal doesn't misinterpret special characters like & or ?.


Management API

Built-in REST API for building panels and dashboards.

# Server status
curl -H "Authorization: Bearer mytoken" http://127.0.0.1:9090/api/server/status

# List all users with traffic stats  
curl -H "Authorization: Bearer mytoken" http://127.0.0.1:9090/api/users

# Create a user with 10GB traffic limit
curl -X POST -H "Authorization: Bearer mytoken" \
  -H "Content-Type: application/json" \
  -d '{"limit_bytes": 10737418240}' \
  http://127.0.0.1:9090/api/users

Full API reference: Management API


CLI Reference

ostp [--config <PATH>] [COMMAND]

Commands:
  run                    Run the daemon using the config file (default when no command is given)
  connect <URL>          Connect once using a share link: ostp://KEY@HOST:PORT
  setup                  Interactive setup wizard
  init <MODE>            Generate a template config (server/client/relay)
  check                  Validate the configuration file and exit
  gk                     Generate a secure access key (alias: generate-key)
    --format <FMT>         Key format: hex, base64 (default: hex)
    -n, --count <N>        Number of keys to generate (default: 1)
  links                  Print client share links from the server config
  import <URL>           Import a share link into the config file
  update                 Update OSTP to the latest release
    -b, --branch <NAME>    Release channel: stable, pre-release, nightly (default: stable)
    -v, --version <VER>    Update to an exact version instead of the channel's latest
  migrate                Force-migrate the configuration file to the current format
  prober                 Run the DNS-transport resolver prober
  proxy-env               Print shell export commands for the local SOCKS proxy
  proxy-env-clear         Print shell export commands to unset it
  uninstall              Stop the service and remove the binary and config

Global options:
  --config <PATH>        Config file path (default: config.json)

Every subcommand also accepts -h/--help for its own option list.


Protocol Summary

Layer Mechanism
Key Exchange Noise NNpsk0 (X25519 + ChaChaPoly + BLAKE2s) zero-RTT
Encryption ChaCha20-Poly1305 AEAD per-packet
Header Obfuscation HMAC-SHA256 derived per-packet mask
Reliability Selective ACK with cumulative + SACK ranges
Retransmission Rate-limited NACK + exponential backoff RTO
Keepalive Ping/Pong with RTT measurement every 5s

Building from Source

# Prerequisites: Rust 1.75+
cargo build --release

# Cross-compile for Linux
cross build --release --target x86_64-unknown-linux-gnu

# Run tests
cargo test -p ostp-core -p ostp-server

Documentation


License

GNU Affero General Public License v3.0 (AGPL-3.0). See LICENSE for the full text.


Contact