# 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/ ← клонировать вручную ```