|
|
||
|---|---|---|
| app | ||
| gradle/wrapper | ||
| .gitignore | ||
| build.gradle.kts | ||
| fix-symlinks.ps1 | ||
| gradle.properties | ||
| gradlew | ||
| gradlew.bat | ||
| README.md | ||
| settings.gradle.kts | ||
| setup-native.ps1 | ||
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-сервер
↓
Интернет
Сборка
- Откройте папку
D:\SshProxyVpnв Android Studio (Hedgehog+). - Подключите 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.
- Соберите проект: Build → Make Project.
- Установите APK на телефон (minSdk 26).
Без
hev-socks5-tunnelSSH подключится, но 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— SSHFOREGROUND_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/ ← клонировать вручную