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