fix: resolve build errors and remove GUI from main release; docs: improve READMEs

This commit is contained in:
ospab 2026-05-16 19:15:04 +03:00
parent acf81527b6
commit 514bae94cd
7 changed files with 188 additions and 156 deletions

View File

@ -140,12 +140,7 @@ jobs:
- name: Execute Standard Native Compilation (Windows) - name: Execute Standard Native Compilation (Windows)
if: ${{ !matrix.use_cross && matrix.os == 'windows-latest' }} if: ${{ !matrix.use_cross && matrix.os == 'windows-latest' }}
run: | 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
cargo build --release --target ${{ matrix.target }} --bin ostp-tun-helper
- name: Execute Standard Native Compilation (Unix) - name: Execute Standard Native Compilation (Unix)
if: ${{ !matrix.use_cross && matrix.os != 'windows-latest' }} if: ${{ !matrix.use_cross && matrix.os != 'windows-latest' }}
@ -193,24 +188,11 @@ jobs:
if: ${{ matrix.os == 'windows-latest' }} if: ${{ matrix.os == 'windows-latest' }}
shell: pwsh shell: pwsh
run: | run: |
$build_dir = "target/${{ matrix.target }}/release" cd target/${{ matrix.target }}/release
$staging = "staging_dir" $files = @("ostp.exe")
New-Item -ItemType Directory -Path "$staging/gui" -Force if (Test-Path "tun2socks.exe") { $files += "tun2socks.exe" }
New-Item -ItemType Directory -Path "$staging/ostp" -Force if (Test-Path "wintun.dll") { $files += "wintun.dll" }
Compress-Archive -Path $files -DestinationPath ../../../${{ matrix.release_name }} -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
- name: Package release artifact (Unix Systems) - name: Package release artifact (Unix Systems)
if: ${{ matrix.os != 'windows-latest' }} if: ${{ matrix.os != 'windows-latest' }}

1
.gitignore vendored
View File

@ -1,6 +1,7 @@
/target/ /target/
/target_build/ /target_build/
/target_linux/ /target_linux/
/ostp-gui/
/dist/ /dist/
**/*.rs.bk **/*.rs.bk
.idea/ .idea/

View File

@ -4,7 +4,6 @@ members = [
"ostp-client", "ostp-client",
"ostp-server", "ostp-server",
"ostp-jni", "ostp", "ostp-jni", "ostp",
"ostp-gui/src-tauri",
"ostp-tun-helper" "ostp-tun-helper"
] ]
resolver = "2" resolver = "2"

134
README.md
View File

@ -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. ### 🛡️ Indistinguishable Traffic (Stealth)
- **Fast & Reliable**: Works well on unstable networks (like mobile data). 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.
- **Easy Setup**: Simple config files and one-click installers.
- **Universal**: Works on Windows, Linux, and Android. ### 🚀 Extreme Performance
- **SOCKS5/HTTP**: Supports standard proxy modes. 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.
- **TUN Mode**: Can act as a full VPN for your entire system.
### 📱 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) The project is organized into a modular workspace:
Run this command to install OSTP and set it up as a service: - **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
bash <(curl -Ls https://raw.githubusercontent.com/ospab/ostp/master/scripts/install.sh) bash <(curl -Ls https://raw.githubusercontent.com/ospab/ostp/master/scripts/install.sh)
``` ```
### Windows (Client) ### 🪟 Windows (One-Line Installer)
Run this in **PowerShell as Administrator**:
```powershell ```powershell
# Run as Administrator
irm https://raw.githubusercontent.com/ospab/ostp/master/scripts/install.ps1 | iex 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). Generate your template first:
### 1. Create a Config File
Run the program with the `--init` flag to generate a template:
**On Server:**
```bash ```bash
./ostp --init server ./ostp --init server # On VPS
./ostp --init client # On Local PC
``` ```
**On Client:** ### Server Example (`config.json`)
```bash
./ostp --init client
```
### 2. Configure
#### Server (`config.json`)
```json ```json
{ {
"_comment": "OSTP Server Configuration",
"mode": "server", "mode": "server",
"listen": "0.0.0.0:50000", "listen": "0.0.0.0:50000",
"access_keys": [ "access_keys": [
"your-secret-key-here" "YOUR_GENERATED_KEY"
] ],
} "_comment_outbound": "Optional: forward traffic to another proxy (e.g. Tor)",
``` "outbound": {
"enabled": false,
#### Client (`config.json`) "protocol": "socks5",
```json "address": "127.0.0.1",
{ "port": 9050,
"mode": "client", "default_action": "proxy"
"server": "YOUR_SERVER_IP:50000",
"access_key": "your-secret-key-here",
"socks5_bind": "127.0.0.1:1088",
"tun": {
"enable": false
} }
} }
``` ```
### 3. Start ### Client Example (`config.json`)
Run the program using your config: ```json
```bash {
./ostp --config config.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) ## 📜 License & Legal
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.
--- 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 See the [LICENSE](LICENSE) file for more details.
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.

View File

@ -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 или прокси. ### 🛡️ Необнаруживаемый трафик (Stealth)
- **Скорость и надежность**: Отлично работает на нестабильных сетях (например, мобильный интернет). В отличие от традиционных VPN (OpenVPN, WireGuard), которые имеют узнаваемые сигнатуры пакетов, OSTP использует продвинутую систему **Keystream Scrambling** и **Adaptive Block Shaping**. Ваш трафик выглядит как набор случайных байтов, что позволяет обходить даже самые современные системы блокировок.
- **Простая настройка**: Понятные конфиги и установка одной командой.
- **Универсальность**: Работает на Windows, Linux и Android. ### 🚀 Экстремальная производительность
- **SOCKS5/HTTP**: Поддерживает стандартные режимы прокси. Разработанный с нуля на языке **Rust** и использующий сетевой стек **gVisor**, OSTP оптимизирован для обработки данных с нулевым копированием (zero-copy) и эффективного мультиплексирования. Протокол легко справляется с потоками в 1 Гбит/с+ при минимальной нагрузке на процессор.
- **TUN режим**: Работает как полноценный VPN для всей системы.
### 📱 Кроссплатформенность
- **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
bash <(curl -Ls https://raw.githubusercontent.com/ospab/ostp/master/scripts/install.sh) bash <(curl -Ls https://raw.githubusercontent.com/ospab/ostp/master/scripts/install.sh)
``` ```
### Windows (Клиент) ### 🪟 Windows (Установка одной командой)
Запустите в **PowerShell от имени администратора**:
```powershell ```powershell
# Запустить от имени администратора
irm https://raw.githubusercontent.com/ospab/ostp/master/scripts/install.ps1 | iex irm https://raw.githubusercontent.com/ospab/ostp/master/scripts/install.ps1 | iex
``` ```
--- ---
## Как пользоваться ## ⚙️ Настройка
Программа `ostp` работает в двух режимах: **Сервер** (ставится на ваш VPS) и **Клиент** (ставится на ваш компьютер). Сначала создайте шаблон конфигурации:
### 1. Создание конфига
Запустите программу с флагом `--init`, чтобы создать шаблон:
**На сервере:**
```bash ```bash
./ostp --init server ./ostp --init server # На VPS (сервере)
./ostp --init client # На локальном ПК
``` ```
**На клиенте:** ### Пример Сервера (`config.json`)
```bash
./ostp --init client
```
### 2. Настройка
#### Сервер (`config.json`)
```json ```json
{ {
"_comment": "OSTP Server Configuration",
"mode": "server", "mode": "server",
"listen": "0.0.0.0:50000", "listen": "0.0.0.0:50000",
"access_keys": [ "access_keys": [
"ваш-секретный-ключ" "ВАШ_СЕКРЕТНЫЙ_КЛЮЧ"
] ],
} "_comment_outbound": "Опционально: пересылка трафика через другой прокси (например, Tor)",
``` "outbound": {
"enabled": false,
#### Клиент (`config.json`) "protocol": "socks5",
```json "address": "127.0.0.1",
{ "port": 9050,
"mode": "client", "default_action": "proxy"
"server": "IP_ВАШЕГО_СЕРВЕРА:50000",
"access_key": "ваш-секретный-ключ",
"socks5_bind": "127.0.0.1:1088",
"tun": {
"enable": false
} }
} }
``` ```
### 3. Запуск ### Пример Клиента (`config.json`)
Запустите программу, указав файл конфигурации: ```json
```bash {
./ostp --config config.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**).
## Лицензия Подробности можно найти в файле [LICENSE](LICENSE).
OSTP распространяется под лицензией Business Source License 1.1. Бесплатно для личного и некоммерческого использования. 14 мая 2030 года лицензия изменится на MIT.

View File

@ -261,6 +261,7 @@ impl Bridge {
} }
_ = keepalive_tick.tick() => { _ = keepalive_tick.tick() => {
if self.running { if self.running {
// 1. Connection Liveness Check
if self.last_valid_recv.elapsed().as_secs() > 15 { if self.last_valid_recv.elapsed().as_secs() > 15 {
let _ = tx.send(UiEvent::Log("Connection timeout (no UDP packets received). Dropping connection.".into())).await; let _ = tx.send(UiEvent::Log("Connection timeout (no UDP packets received). Dropping connection.".into())).await;
self.running = false; self.running = false;
@ -271,14 +272,24 @@ impl Bridge {
self.metrics.connection_state.store(0, Ordering::Relaxed); self.metrics.connection_state.store(0, Ordering::Relaxed);
continue; continue;
} }
// 2. Active Keep-Alive / Heartbeat
if let Some(sessions) = sessions_opt.as_mut() { if let Some(sessions) = sessions_opt.as_mut() {
for session in sessions.iter_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 ts = SystemTime::now().duration_since(std::time::UNIX_EPOCH).unwrap().as_millis() as u64;
let payload = Bytes::from(RelayMessage::Ping(ts).encode()); let ping_payload = Bytes::from(RelayMessage::Ping(ts).encode());
if let Ok(ProtocolAction::SendDatagram(frame)) = session.machine.on_event(OstpEvent::Outbound(0, payload)) { if let Ok(ProtocolAction::SendDatagram(frame)) = session.machine.on_event(OstpEvent::Outbound(0, ping_payload)) {
let _ = session.socket.send(&frame).await; let _ = session.socket.send(&frame).await;
self.metrics.bytes_sent.fetch_add(frame.len() as u64, Ordering::Relaxed); 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 { udp_msg = async {
match udp_rx_opt.as_mut() { match udp_rx_opt.as_mut() {
Some(rx) => rx.recv().await, Some(rx) => rx.recv().await,

View File

@ -243,28 +243,30 @@ pub async fn run_client_core(
_ = shutdown_rx_ext.changed() => { _ = shutdown_rx_ext.changed() => {
let _ = cmd_tx.send(BridgeCommand::Shutdown).await; let _ = cmd_tx.send(BridgeCommand::Shutdown).await;
let _ = shutdown_tx.send(true); 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); let _ = shutdown_tx.send(true);
res.map_err(|e| anyhow::anyhow!("Bridge task panicked: {}", e))??; res.map_err(|e| anyhow::anyhow!("Bridge task panicked: {}", e))??;
} }
res = proxy_task => { res = &mut proxy_task => {
let _ = shutdown_tx.send(true); let _ = shutdown_tx.send(true);
res.map_err(|e| anyhow::anyhow!("Proxy task panicked: {}", e))??; res.map_err(|e| anyhow::anyhow!("Proxy task panicked: {}", e))??;
} }
res = async { 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); let _ = shutdown_tx.send(true);
res.map_err(|e| anyhow::anyhow!("TUN task panicked: {}", e))??; 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(()) Ok(())
} }