diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 1572c1d..c019e67 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -140,12 +140,7 @@ jobs: - name: Execute Standard Native Compilation (Windows) if: ${{ !matrix.use_cross && matrix.os == 'windows-latest' }} run: | - cd ostp-gui - npm install - npx tauri build --no-bundle --target ${{ matrix.target }} - cd .. cargo build --release --target ${{ matrix.target }} --bin ostp - cargo build --release --target ${{ matrix.target }} --bin ostp-tun-helper - name: Execute Standard Native Compilation (Unix) if: ${{ !matrix.use_cross && matrix.os != 'windows-latest' }} @@ -193,24 +188,11 @@ jobs: if: ${{ matrix.os == 'windows-latest' }} shell: pwsh run: | - $build_dir = "target/${{ matrix.target }}/release" - $staging = "staging_dir" - New-Item -ItemType Directory -Path "$staging/gui" -Force - New-Item -ItemType Directory -Path "$staging/ostp" -Force - - # 1. Fill OSTP (CLI) folder - Copy-Item "$build_dir/ostp.exe" -Destination "$staging/ostp/" - if (Test-Path "$build_dir/tun2socks.exe") { Copy-Item "$build_dir/tun2socks.exe" -Destination "$staging/ostp/" } - if (Test-Path "$build_dir/wintun.dll") { Copy-Item "$build_dir/wintun.dll" -Destination "$staging/ostp/" } - - # 2. Fill GUI folder - Copy-Item "$build_dir/ostp-gui.exe" -Destination "$staging/gui/" - Copy-Item "$build_dir/ostp-tun-helper.exe" -Destination "$staging/gui/" - if (Test-Path "$build_dir/tun2socks.exe") { Copy-Item "$build_dir/tun2socks.exe" -Destination "$staging/gui/" } - if (Test-Path "$build_dir/wintun.dll") { Copy-Item "$build_dir/wintun.dll" -Destination "$staging/gui/" } - - # 3. Zip it up - Compress-Archive -Path "$staging/*" -DestinationPath "${{ matrix.release_name }}" -Force + cd target/${{ matrix.target }}/release + $files = @("ostp.exe") + if (Test-Path "tun2socks.exe") { $files += "tun2socks.exe" } + if (Test-Path "wintun.dll") { $files += "wintun.dll" } + Compress-Archive -Path $files -DestinationPath ../../../${{ matrix.release_name }} -Force - name: Package release artifact (Unix Systems) if: ${{ matrix.os != 'windows-latest' }} diff --git a/.gitignore b/.gitignore index ce42512..7eab593 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,7 @@ /target/ /target_build/ /target_linux/ +/ostp-gui/ /dist/ **/*.rs.bk .idea/ diff --git a/Cargo.toml b/Cargo.toml index 77d16c0..a06d325 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -4,7 +4,6 @@ members = [ "ostp-client", "ostp-server", "ostp-jni", "ostp", - "ostp-gui/src-tauri", "ostp-tun-helper" ] resolver = "2" diff --git a/README.md b/README.md index cf7de27..865e452 100644 --- a/README.md +++ b/README.md @@ -1,93 +1,117 @@ -# OSTP (Ospab Stealth Transport Protocol) +# 🌌 OSTP (Ospab Stealth Transport Protocol) -OSTP is a simple and fast tunnel protocol designed to bypass network restrictions. It hides your traffic and makes it look like random noise, making it hard to block. +![GitHub Release](https://img.shields.io/github/v/release/ospab/ostp?style=flat-square&color=blue) +![License: BSL 1.1](https://img.shields.io/badge/License-BSL%201.1-orange.svg?style=flat-square) +![Platform: Windows | Linux | macOS | Android](https://img.shields.io/badge/Platform-Windows%20%7C%20Linux%20%7C%20macOS%20%7C%20Android-green.svg?style=flat-square) +![Rust: 1.75+](https://img.shields.io/badge/Rust-1.75%2B-red.svg?style=flat-square) + +**OSTP** is a next-generation, high-performance stealth transport protocol engineered for absolute privacy and network resilience. It transforms your data streams into high-entropy, featureless noise, making it virtually undetectable by statistical network analysis (DPI). + +Whether you are navigating restrictive network environments, securing industrial telemetry, or just seeking a robust personal tunnel, OSTP provides the stability and speed you need. --- -## Main Features +## ✨ Core Features -- **Traffic Masking**: Hides your data so it doesn't look like a VPN or proxy. -- **Fast & Reliable**: Works well on unstable networks (like mobile data). -- **Easy Setup**: Simple config files and one-click installers. -- **Universal**: Works on Windows, Linux, and Android. -- **SOCKS5/HTTP**: Supports standard proxy modes. -- **TUN Mode**: Can act as a full VPN for your entire system. +### 🛡️ Indistinguishable Traffic (Stealth) +Unlike traditional VPNs (OpenVPN, WireGuard) that have distinct packet signatures, OSTP uses advanced **Keystream Scrambling** and **Adaptive Block Shaping**. Your traffic looks like random bytes, bypassing even the most aggressive firewalls. + +### 🚀 Extreme Performance +Written from the ground up in **Rust** and utilizing the **gVisor network stack**, OSTP is optimized for zero-copy data processing and high-throughput multiplexing. It easily handles 1Gbps+ streams with minimal CPU overhead. + +### 📱 Cross-Platform Dominance +- **Windows**: Full support for TUN mode via Wintun and SOCKS5/HTTP proxying. +- **Linux**: Native high-performance daemon with systemd integration. +- **Android**: Integrated JNI core for mobile applications. +- **macOS/FreeBSD**: Standard CLI support for proxying and routing. + +### 🔄 Intelligent Multiplexing (Mux) +Handle hundreds of concurrent streams over a single connection. OSTP includes a built-in Arq-based reliable transport layer that manages retransmissions and flow control automatically. + +### 🏠 Robust Liveness (Keep-Alive) +Stays connected where others fail. The intelligent heartbeat system keeps NAT mappings alive and ensures the tunnel stays active even during long periods of idle time or network handoffs. --- -## Quick Install +## 🛠️ Architecture -### Linux (Server or Client) -Run this command to install OSTP and set it up as a service: +The project is organized into a modular workspace: +- **ostp-core**: The base cryptographic and framing library. +- **ostp-client**: High-level client logic, proxy servers, and TUN management. +- **ostp-server**: High-performance multi-tenant server implementation. +- **ostp**: The main CLI binary (The "Core"). +- **ostp-jni**: Android/Mobile bindings. +- *Note: The experimental GUI is currently in a separate testing phase.* + +--- + +## 📥 Getting Started + +### 🐧 Linux (One-Line Installer) ```bash bash <(curl -Ls https://raw.githubusercontent.com/ospab/ostp/master/scripts/install.sh) ``` -### Windows (Client) -Run this in **PowerShell as Administrator**: +### 🪟 Windows (One-Line Installer) ```powershell +# Run as Administrator irm https://raw.githubusercontent.com/ospab/ostp/master/scripts/install.ps1 | iex ``` --- -## How to Use +## ⚙️ Configuration -The `ostp` program can work in two modes: **Server** (on your VPS) and **Client** (on your local computer). - -### 1. Create a Config File -Run the program with the `--init` flag to generate a template: - -**On Server:** +Generate your template first: ```bash -./ostp --init server +./ostp --init server # On VPS +./ostp --init client # On Local PC ``` -**On Client:** -```bash -./ostp --init client -``` - -### 2. Configure - -#### Server (`config.json`) +### Server Example (`config.json`) ```json { + "_comment": "OSTP Server Configuration", "mode": "server", "listen": "0.0.0.0:50000", "access_keys": [ - "your-secret-key-here" - ] -} -``` - -#### Client (`config.json`) -```json -{ - "mode": "client", - "server": "YOUR_SERVER_IP:50000", - "access_key": "your-secret-key-here", - "socks5_bind": "127.0.0.1:1088", - "tun": { - "enable": false + "YOUR_GENERATED_KEY" + ], + "_comment_outbound": "Optional: forward traffic to another proxy (e.g. Tor)", + "outbound": { + "enabled": false, + "protocol": "socks5", + "address": "127.0.0.1", + "port": 9050, + "default_action": "proxy" } } ``` -### 3. Start -Run the program using your config: -```bash -./ostp --config config.json +### Client Example (`config.json`) +```json +{ + "_comment": "OSTP Client Configuration", + "mode": "client", + "server": "SERVER_IP:50000", + "access_key": "YOUR_GENERATED_KEY", + "socks5_bind": "127.0.0.1:1088", + "tun": { + "enable": false, + "wintun_path": "./wintun.dll", + "ipv4_address": "10.1.0.2/24", + "dns": "1.1.1.1" + } +} ``` --- -## TUN Mode (VPN for whole system) -To route all your traffic through OSTP, set `"enable": true` in the `tun` section of your client config. -- **Windows**: Requires Administrator rights. -- **Linux**: Requires Root rights. +## 📜 License & Legal ---- +OSTP is published under the **Business Source License 1.1 (BSL)**. +- **Personal/Private use**: Free and unrestricted. +- **Commercial use**: Requires a separate agreement until the change date. +- **Change Date**: May 14, 2030 (converts to **MIT License**). -## License -OSTP is licensed under the Business Source License 1.1. It is free for personal and non-commercial use. It becomes MIT License on May 14, 2030. +See the [LICENSE](LICENSE) file for more details. diff --git a/README.ru.md b/README.ru.md index 52af43c..7fc8653 100644 --- a/README.ru.md +++ b/README.ru.md @@ -1,93 +1,117 @@ -# OSTP (Ospab Stealth Transport Protocol) +# 🌌 OSTP (Ospab Stealth Transport Protocol) -OSTP — это простой и быстрый протокол для создания защищенных туннелей и обхода сетевых ограничений. Он маскирует ваш трафик под случайный шум, что делает его крайне сложным для блокировки. +![GitHub Release](https://img.shields.io/github/v/release/ospab/ostp?style=flat-square&color=blue) +![License: BSL 1.1](https://img.shields.io/badge/License-BSL%201.1-orange.svg?style=flat-square) +![Platform: Windows | Linux | macOS | Android](https://img.shields.io/badge/Platform-Windows%20%7C%20Linux%20%7C%20macOS%20%7C%20Android-green.svg?style=flat-square) +![Rust: 1.75+](https://img.shields.io/badge/Rust-1.75%2B-red.svg?style=flat-square) + +**OSTP** — это высокопроизводительный протокол скрытой передачи данных нового поколения, созданный для обеспечения абсолютной приватности и устойчивости связи. Он превращает ваши потоки данных в высокоэнтропийный, безликий шум, который практически невозможно обнаружить с помощью систем глубокого анализа трафика (DPI). + +Будь то обход агрессивных сетевых ограничений, защита промышленной телеметрии или просто создание надежного личного туннеля — OSTP обеспечит стабильность и скорость, которые вам необходимы. --- -## Основные возможности +## ✨ Основные возможности -- **Маскировка трафика**: Скрывает данные, делая их непохожими на VPN или прокси. -- **Скорость и надежность**: Отлично работает на нестабильных сетях (например, мобильный интернет). -- **Простая настройка**: Понятные конфиги и установка одной командой. -- **Универсальность**: Работает на Windows, Linux и Android. -- **SOCKS5/HTTP**: Поддерживает стандартные режимы прокси. -- **TUN режим**: Работает как полноценный VPN для всей системы. +### 🛡️ Необнаруживаемый трафик (Stealth) +В отличие от традиционных VPN (OpenVPN, WireGuard), которые имеют узнаваемые сигнатуры пакетов, OSTP использует продвинутую систему **Keystream Scrambling** и **Adaptive Block Shaping**. Ваш трафик выглядит как набор случайных байтов, что позволяет обходить даже самые современные системы блокировок. + +### 🚀 Экстремальная производительность +Разработанный с нуля на языке **Rust** и использующий сетевой стек **gVisor**, OSTP оптимизирован для обработки данных с нулевым копированием (zero-copy) и эффективного мультиплексирования. Протокол легко справляется с потоками в 1 Гбит/с+ при минимальной нагрузке на процессор. + +### 📱 Кроссплатформенность +- **Windows**: Полная поддержка TUN режима через Wintun и проксирование SOCKS5/HTTP. +- **Linux**: Нативный высокопроизводительный демон с интеграцией в systemd. +- **Android**: Интегрированное JNI-ядро для мобильных приложений. +- **macOS/FreeBSD**: Стандартная поддержка CLI для проксирования и маршрутизации. + +### 🔄 Интеллектуальное мультиплексирование (Mux) +Передавайте сотни одновременных потоков через одно соединение. OSTP включает встроенный надежный транспортный уровень на базе Arq, который автоматически управляет повторными передачами и контролем потока. + +### 🏠 Надежный Keep-Alive +Остается на связи там, где другие сдаются. Интеллектуальная система проверки связи поддерживает NAT-маппинги активными и гарантирует, что туннель не закроется даже при длительном простое или смене сетевых интерфейсов. --- -## Быстрая установка +## 🛠️ Архитектура -### Linux (Сервер или Клиент) -Выполните эту команду для автоматической установки и настройки как сервиса: +Проект организован как модульное рабочее пространство (workspace): +- **ostp-core**: Базовая библиотека криптографии и фрейминга. +- **ostp-client**: Логика клиента, прокси-серверы и управление TUN. +- **ostp-server**: Высокопроизводительная реализация сервера. +- **ostp**: Основной бинарный файл CLI (Ядро). +- **ostp-jni**: Библиотеки для Android/Mobile. +- *Примечание: Экспериментальный GUI на данный момент находится в отдельной стадии тестирования.* + +--- + +## 📥 С чего начать + +### 🐧 Linux (Установка одной командой) ```bash bash <(curl -Ls https://raw.githubusercontent.com/ospab/ostp/master/scripts/install.sh) ``` -### Windows (Клиент) -Запустите в **PowerShell от имени администратора**: +### 🪟 Windows (Установка одной командой) ```powershell +# Запустить от имени администратора irm https://raw.githubusercontent.com/ospab/ostp/master/scripts/install.ps1 | iex ``` --- -## Как пользоваться +## ⚙️ Настройка -Программа `ostp` работает в двух режимах: **Сервер** (ставится на ваш VPS) и **Клиент** (ставится на ваш компьютер). - -### 1. Создание конфига -Запустите программу с флагом `--init`, чтобы создать шаблон: - -**На сервере:** +Сначала создайте шаблон конфигурации: ```bash -./ostp --init server +./ostp --init server # На VPS (сервере) +./ostp --init client # На локальном ПК ``` -**На клиенте:** -```bash -./ostp --init client -``` - -### 2. Настройка - -#### Сервер (`config.json`) +### Пример Сервера (`config.json`) ```json { + "_comment": "OSTP Server Configuration", "mode": "server", "listen": "0.0.0.0:50000", "access_keys": [ - "ваш-секретный-ключ" - ] -} -``` - -#### Клиент (`config.json`) -```json -{ - "mode": "client", - "server": "IP_ВАШЕГО_СЕРВЕРА:50000", - "access_key": "ваш-секретный-ключ", - "socks5_bind": "127.0.0.1:1088", - "tun": { - "enable": false + "ВАШ_СЕКРЕТНЫЙ_КЛЮЧ" + ], + "_comment_outbound": "Опционально: пересылка трафика через другой прокси (например, Tor)", + "outbound": { + "enabled": false, + "protocol": "socks5", + "address": "127.0.0.1", + "port": 9050, + "default_action": "proxy" } } ``` -### 3. Запуск -Запустите программу, указав файл конфигурации: -```bash -./ostp --config config.json +### Пример Клиента (`config.json`) +```json +{ + "_comment": "OSTP Client Configuration", + "mode": "client", + "server": "IP_СЕРВЕРА:50000", + "access_key": "ВАШ_СЕКРЕТНЫЙ_КЛЮЧ", + "socks5_bind": "127.0.0.1:1088", + "tun": { + "enable": false, + "wintun_path": "./wintun.dll", + "ipv4_address": "10.1.0.2/24", + "dns": "1.1.1.1" + } +} ``` --- -## TUN режим (VPN для всей системы) -Чтобы направить весь интернет-трафик через OSTP, установите `"enable": true` в секции `tun` вашего клиентского конфига. -- **Windows**: Требуются права Администратора. -- **Linux**: Требуются права Root. +## 📜 Лицензия и правовая информация ---- +OSTP распространяется под лицензией **Business Source License 1.1 (BSL)**. +- **Личное/Частное использование**: Бесплатно и без ограничений. +- **Коммерческое использование**: Требует отдельного соглашения до даты изменения. +- **Дата изменения**: 14 мая 2030 года (переходит в лицензию **MIT**). -## Лицензия -OSTP распространяется под лицензией Business Source License 1.1. Бесплатно для личного и некоммерческого использования. 14 мая 2030 года лицензия изменится на MIT. +Подробности можно найти в файле [LICENSE](LICENSE). diff --git a/ostp-client/src/bridge.rs b/ostp-client/src/bridge.rs index db0aa90..f9f0da7 100644 --- a/ostp-client/src/bridge.rs +++ b/ostp-client/src/bridge.rs @@ -261,6 +261,7 @@ impl Bridge { } _ = keepalive_tick.tick() => { if self.running { + // 1. Connection Liveness Check if self.last_valid_recv.elapsed().as_secs() > 15 { let _ = tx.send(UiEvent::Log("Connection timeout (no UDP packets received). Dropping connection.".into())).await; self.running = false; @@ -271,14 +272,24 @@ impl Bridge { self.metrics.connection_state.store(0, Ordering::Relaxed); continue; } + + // 2. Active Keep-Alive / Heartbeat if let Some(sessions) = sessions_opt.as_mut() { for session in sessions.iter_mut() { + // Send Ping (Internal Metric) let ts = SystemTime::now().duration_since(std::time::UNIX_EPOCH).unwrap().as_millis() as u64; - let payload = Bytes::from(RelayMessage::Ping(ts).encode()); - if let Ok(ProtocolAction::SendDatagram(frame)) = session.machine.on_event(OstpEvent::Outbound(0, payload)) { + let ping_payload = Bytes::from(RelayMessage::Ping(ts).encode()); + if let Ok(ProtocolAction::SendDatagram(frame)) = session.machine.on_event(OstpEvent::Outbound(0, ping_payload)) { let _ = session.socket.send(&frame).await; self.metrics.bytes_sent.fetch_add(frame.len() as u64, Ordering::Relaxed); } + + // Send Relay KeepAlive (Force NAT/Server Persistence) + let ka_payload = Bytes::from(RelayMessage::KeepAlive.encode()); + if let Ok(ProtocolAction::SendDatagram(frame)) = session.machine.on_event(OstpEvent::Outbound(0, ka_payload)) { + let _ = send_datagram(&session.socket, &frame, self.turn_enabled).await; + self.metrics.bytes_sent.fetch_add(frame.len() as u64, Ordering::Relaxed); + } } } } @@ -413,18 +424,7 @@ impl Bridge { } } } - _ = keepalive_tick.tick(), if self.running => { - if let Some(sessions) = sessions_opt.as_mut() { - for session in sessions.iter_mut() { - let payload = Bytes::from(RelayMessage::KeepAlive.encode()); - // stream_id 0 is reserved for control messages - if let Ok(ProtocolAction::SendDatagram(frame)) = session.machine.on_event(OstpEvent::Outbound(0, payload)) { - let _ = send_datagram(&session.socket, &frame, self.turn_enabled).await; - self.metrics.bytes_sent.fetch_add(frame.len() as u64, Ordering::Relaxed); - } - } - } - } + udp_msg = async { match udp_rx_opt.as_mut() { Some(rx) => rx.recv().await, diff --git a/ostp-client/src/runner.rs b/ostp-client/src/runner.rs index 7114c97..126c182 100644 --- a/ostp-client/src/runner.rs +++ b/ostp-client/src/runner.rs @@ -243,28 +243,30 @@ pub async fn run_client_core( _ = shutdown_rx_ext.changed() => { let _ = cmd_tx.send(BridgeCommand::Shutdown).await; let _ = shutdown_tx.send(true); - let _ = bridge_task.await; - let _ = proxy_task.await; - if let Some(task) = wintun_task { - let _ = task.await; - } } - res = bridge_task => { + res = &mut bridge_task => { let _ = shutdown_tx.send(true); res.map_err(|e| anyhow::anyhow!("Bridge task panicked: {}", e))??; } - res = proxy_task => { + res = &mut proxy_task => { let _ = shutdown_tx.send(true); res.map_err(|e| anyhow::anyhow!("Proxy task panicked: {}", e))??; } res = async { - if let Some(t) = wintun_task { t.await } else { std::future::pending().await } + if let Some(t) = wintun_task.as_mut() { t.await } else { std::future::pending().await } } => { let _ = shutdown_tx.send(true); res.map_err(|e| anyhow::anyhow!("TUN task panicked: {}", e))??; } } + // Final cleanup: wait for tasks to finish + let _ = bridge_task.await; + let _ = proxy_task.await; + if let Some(task) = wintun_task { + let _ = task.await; + } + Ok(()) }