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

3.8 KiB
Raw Blame History

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 (обязательно для реальной маршрутизации):
cd D:\SshProxyVpn
.\setup-native.ps1

Или вручную:

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.

  1. Соберите проект: Build → Make Project.
  2. Установите 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

На ПК с тем же ключом:

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