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