mirror of https://github.com/ospab/ostp.git
fix: resolve build errors and remove GUI from main release; docs: improve READMEs
This commit is contained in:
parent
acf81527b6
commit
514bae94cd
|
|
@ -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,6 +1,7 @@
|
||||||
/target/
|
/target/
|
||||||
/target_build/
|
/target_build/
|
||||||
/target_linux/
|
/target_linux/
|
||||||
|
/ostp-gui/
|
||||||
/dist/
|
/dist/
|
||||||
**/*.rs.bk
|
**/*.rs.bk
|
||||||
.idea/
|
.idea/
|
||||||
|
|
|
||||||
|
|
@ -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"
|
||||||
|
|
|
||||||
122
README.md
122
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.
|

|
||||||
|

|
||||||
|

|
||||||
|

|
||||||
|
|
||||||
|
**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,
|
||||||
|
"protocol": "socks5",
|
||||||
|
"address": "127.0.0.1",
|
||||||
|
"port": 9050,
|
||||||
|
"default_action": "proxy"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
#### Client (`config.json`)
|
### Client Example (`config.json`)
|
||||||
```json
|
```json
|
||||||
{
|
{
|
||||||
|
"_comment": "OSTP Client Configuration",
|
||||||
"mode": "client",
|
"mode": "client",
|
||||||
"server": "YOUR_SERVER_IP:50000",
|
"server": "SERVER_IP:50000",
|
||||||
"access_key": "your-secret-key-here",
|
"access_key": "YOUR_GENERATED_KEY",
|
||||||
"socks5_bind": "127.0.0.1:1088",
|
"socks5_bind": "127.0.0.1:1088",
|
||||||
"tun": {
|
"tun": {
|
||||||
"enable": false
|
"enable": false,
|
||||||
|
"wintun_path": "./wintun.dll",
|
||||||
|
"ipv4_address": "10.1.0.2/24",
|
||||||
|
"dns": "1.1.1.1"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
### 3. Start
|
|
||||||
Run the program using your config:
|
|
||||||
```bash
|
|
||||||
./ostp --config config.json
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## 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.
|
|
||||||
|
|
|
||||||
122
README.ru.md
122
README.ru.md
|
|
@ -1,93 +1,117 @@
|
||||||
# OSTP (Ospab Stealth Transport Protocol)
|
# 🌌 OSTP (Ospab Stealth Transport Protocol)
|
||||||
|
|
||||||
OSTP — это простой и быстрый протокол для создания защищенных туннелей и обхода сетевых ограничений. Он маскирует ваш трафик под случайный шум, что делает его крайне сложным для блокировки.
|

|
||||||
|

|
||||||
|

|
||||||
|

|
||||||
|
|
||||||
|
**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,
|
||||||
|
"protocol": "socks5",
|
||||||
|
"address": "127.0.0.1",
|
||||||
|
"port": 9050,
|
||||||
|
"default_action": "proxy"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
#### Клиент (`config.json`)
|
### Пример Клиента (`config.json`)
|
||||||
```json
|
```json
|
||||||
{
|
{
|
||||||
|
"_comment": "OSTP Client Configuration",
|
||||||
"mode": "client",
|
"mode": "client",
|
||||||
"server": "IP_ВАШЕГО_СЕРВЕРА:50000",
|
"server": "IP_СЕРВЕРА:50000",
|
||||||
"access_key": "ваш-секретный-ключ",
|
"access_key": "ВАШ_СЕКРЕТНЫЙ_КЛЮЧ",
|
||||||
"socks5_bind": "127.0.0.1:1088",
|
"socks5_bind": "127.0.0.1:1088",
|
||||||
"tun": {
|
"tun": {
|
||||||
"enable": false
|
"enable": false,
|
||||||
|
"wintun_path": "./wintun.dll",
|
||||||
|
"ipv4_address": "10.1.0.2/24",
|
||||||
|
"dns": "1.1.1.1"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
### 3. Запуск
|
|
||||||
Запустите программу, указав файл конфигурации:
|
|
||||||
```bash
|
|
||||||
./ostp --config config.json
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## 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.
|
|
||||||
|
|
|
||||||
|
|
@ -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,
|
||||||
|
|
|
||||||
|
|
@ -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 = &mut bridge_task => {
|
||||||
res = 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(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue