SshProxyVpnAndroid/README.md
kykaevv 46fcf18bed Initial commit of SSH Proxy VPN Android app.
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-01 13:31:24 +03:00

105 lines
3.8 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# SSH Proxy VPN (Android)
Приложение поднимает **SSH-туннель по ключу**, внутри него — **SOCKS5** (`ssh -D`), и через **VpnService** направляет **весь трафик Android** в локальный SOCKS.
## Схема
```
Приложения Android
VpnService (TUN 10.8.0.2)
tun2socks (native)
SOCKS5 127.0.0.1:10808 ← SSH dynamic forward (-D)
SSH-сервер
Интернет
```
## Сборка
1. Откройте папку `D:\SshProxyVpn` в **Android Studio** (Hedgehog+).
2. Подключите native-модуль **hev-socks5-tunnel** (обязательно для реальной маршрутизации):
```powershell
cd D:\SshProxyVpn
.\setup-native.ps1
```
Или вручную:
```bash
cd D:/SshProxyVpn/app/src/main/cpp
git clone --recursive https://github.com/heiher/hev-socks5-tunnel.git
cd ../../..
powershell -ExecutionPolicy Bypass -File fix-symlinks.ps1
```
> **Windows:** Git часто не создаёт symlink-заголовки (`../src/...`). Скрипт `fix-symlinks.ps1` заменяет их на реальные `.h` файлы. Без этого сборка падает с ошибкой `hev-memory-allocator-api.h`.
3. Соберите проект: **Build → Make Project**.
4. Установите APK на телефон (minSdk 26).
> Без `hev-socks5-tunnel` SSH подключится, но VPN не пропустит трафик — приложение покажет ошибку native-модуля.
## Настройка
| Поле | Пример |
|------|--------|
| SSH хост | `203.0.113.10` |
| Порт | `22` |
| Пользователь | `ubuntu` |
| Ключ | OpenSSH private key (`id_ed25519`, `id_rsa`) |
| Passphrase | если ключ защищён |
| SOCKS порт | `10808` (локальный) |
На сервере в `~/.ssh/authorized_keys` должен быть ваш **публичный** ключ.
## Как работает код
| Компонент | Файл |
|-----------|------|
| UI и сохранение настроек | `MainActivity.kt` |
| SSH + SOCKS (локальный SOCKS5 через SSH direct-tcpip) | `ssh/SshTunnelManager.kt`, `ssh/LocalSocks5Proxy.kt` |
| Foreground-сервис оркестрации | `service/TunnelService.kt` |
| VPN-интерфейс | `vpn/ProxyVpnService.kt` |
| TUN → SOCKS | `vpn/Tun2Socks.kt` + `cpp/tun2socks_jni.cpp` |
**Важно:** перед включением VPN вызывается `VpnService.protect()` для SSH-сокета, иначе SSH уйдёт в собственный туннель и соединение оборвётся.
## Разрешения
- `INTERNET` — SSH
- `FOREGROUND_SERVICE` — фоновый туннель
- **VPN** — системный запрос при первом подключении
## Ограничения
- Нужен **NDK** для сборки native-части.
- Производительность ниже, чем у WireGuard/OpenVPN.
- Некоторые приложения с certificate pinning могут не работать через прокси.
- Для production добавьте проверку **host key** SSH (сейчас есть опция «принимать неизвестный ключ»).
## Тест SSH без VPN
На ПК с тем же ключом:
```bash
ssh -i id_ed25519 -D 10808 user@server
curl --socks5 127.0.0.1:10808 https://ifconfig.me
```
На Android SOCKS доступен только внутри приложения на `127.0.0.1:10808` после подключения SSH.
## Структура проекта
```
SshProxyVpn/
app/src/main/java/com/sshproxy/vpn/
app/src/main/cpp/
tun2socks_jni.cpp
hev-socks5-tunnel/ ← клонировать вручную
```