Skip to content
VITAZGIOPublic

About

No description, website, or topics provided.

Resources

Security policy

Stars

3 stars

Watchers

0 watching

Forks

Latest commit

 

History

173 Commits

Folders and files

Repository files navigation

ssh_tunnel

Пропускает трафик приложений через твой собственный Linux-сервер по обычному SSH.

Один файл, без установки. Для компьютера — две версии: прокси (без прав администратора) и VPN (весь трафик системы). Учебный проект: показывает, как из штатного механизма SSH собирается рабочий локальный прокси.

Лицензия: MIT Версия Windows Linux Android Go

🇷🇺 Русский · 🇬🇧 English

Скачать

Система Вариант Скачать Что делает Права 🕸 Сеть устройств
🪟 Windows Прокси ⬇ ssh_tunnel.exe Через сервер идут браузер и программы с настройкой прокси не нужны только в браузере
VPN ⬇ ssh_tunnel_vpn.exe Через сервер идёт весь интернет компьютера ⚠️ администратор ✅
🐧 Linux Прокси 📖 инструкция Через сервер идут браузер и программы с настройкой прокси не нужны только в браузере
VPN 📖 инструкция Через сервер идёт весь интернет компьютера ⚠️ sudo ✅
🤖 Android Приложение ⬇ ssh_tunnel.apk Через сервер идёт интернет телефона, можно выбрать приложения не нужны ✅
🖥 VPS-сервер Панель 📖 инструкция Ставится на твой сервер: новые устройства добавляются кнопкой нужен сервер с Linux связывает устройства

Не знаешь, что выбрать? Прокси — проще и не просит прав. VPN — если нужно, чтобы через сервер шло вообще всё, включая игры и программы без настроек прокси.

🕸 Сеть устройств — твои компьютер, телефон и домашний сервер видят друг друга по именам вроде ноутбук.mesh, где бы ни находились. Подробнее

Сборка под ARM и контрольные суммы — на странице релиза.

главный экран выбор программ

Что это

У SSH есть штатная возможность — проброс TCP-соединений (direct-tcpip, то же самое, что делает ssh -D). ssh_tunnel поднимает SSH-соединение с твоим сервером и разворачивает поверх него локальный прокси: приложение обращается к прокси на своей же машине, а соединение до нужного адреса открывает сервер.

Зачем это бывает нужно: посмотреть, как сервис отвечает с адреса твоего сервера, дотянуться до внутренней сети, где ты и так работаешь по SSH, отладить работу приложения через прокси, дать программе выход в сеть с постоянного адреса.

Никаких чужих серверов, подписок и учётных записей: нужен только сервер, к которому у тебя есть доступ по SSH.

Проект сделан в образовательных целях — чтобы разобраться, как устроены SOCKS, HTTP CONNECT, каналы SSH и определение процесса по сокету. Как ты его используешь и не нарушает ли это правил твоего провайдера, сервиса или законодательства — твоя ответственность.

Ключевые возможности

  • 🔌 Три протокола сразу — SOCKS5, SOCKS4/4a и HTTP CONNECT. Разные программы умеют разное, и нужны все три.
  • 🎯 Разделение трафика по программам — через туннель идёт всё, только выбранные приложения, или всё кроме выбранных. Правила меняются на ходу, без переподключения.
  • 🏠 Локальная сеть остаётся доступной — роутер, NAS, Home Assistant и прочее по адресам 192.168.x.x или по имени идут напрямую, а не через сервер. Mesh-VPN (NetBird, Tailscale) тоже: их адреса 100.64.x.x учтены. Для остальных сетей есть свой список «всегда напрямую».
  • 🧩 Работает там, где системный прокси бессилен — Node.js, Python, Go и всё на них (Claude Code, npm, pip, curl) читают только переменные окружения, и программа их прописывает.
  • ♻️ Переживает обрывы связи — пул SSH-соединений с проверкой живости и переподключением. Заснувший ноутбук не ломает туннель.
  • 🛟 Возвращает настройки как было — при любом закрытии, включая аварийное. Интернет после выхода не пропадает.
  • 🕸 Сеть устройств — компьютер, телефон и домашний сервер видят друг друга по именам вида ноутбук.mesh, как в NetBird, но через твой сервер. Подробнее — MESH.md.
  • 🔑 Проверяет ключ сервера — подмена сервера по дороге не пройдёт незаметно.
  • 📈 Меряет реальную скорость — тест в несколько потоков через туннель.
  • 👀 Видно, кто ходит в интернет — живой список программ и адресов, с пометкой, если DNS-запрос ушёл мимо туннеля.

Подробное техническое описание — в ARCHITECTURE.md.


Как это устроено (кратко)

  приложение
      │  SOCKS4/4a/5 (1080)   HTTP CONNECT (1081)
      ▼
  ssh_tunnel  ──── зашифрованный SSH (22) ────►  твой сервер  ──►  сеть
  1. Приложение думает, что говорит с обычным прокси на своей же машине.
  2. Программа разбирает запрос, узнаёт адрес назначения и открывает до него канал direct-tcpip через SSH.
  3. Имя хоста разрешает сервер, а не твой компьютер: соединение выходит в сеть с адреса сервера целиком, включая DNS-запрос.

Что нужно

На твоей машине:

  • Windows 10 / 11 либо Linux (amd64 / arm64)
  • больше ничего: файл самодостаточный, без установщика и без библиотек

На сервере:

  • любой Linux-сервер с доступом по SSH — свой или арендованный, разницы нет. Ставить на него ничего не надо: прокси разворачивается на твоей машине, сервер только пропускает через себя соединения.

Сервер только что арендован и настроен «как из коробки»? Первым делом стоит закрыть вход по паролю и включить firewall — готовый набор команд одним блоком лежит в первой настройке сервера.


Windows

  1. Скачай ssh_tunnel.exe (прокси) или ssh_tunnel_vpn.exe (VPN, см. ниже) и положи в постоянную папку. Дальше всё одинаково, в командах ниже для VPN замени имя файла.

    Браузер может обозвать файл опасным — программа не подписана сертификатом (это стоит денег и требует юрлица), а к неподписанным и малоизвестным файлам он придирается по умолчанию. Чтобы не спорить с браузером, скачай через PowerShell — заодно файл не получит метку «загружено из интернета»:

    curl.exe -fL --ssl-no-revoke -o "$env:USERPROFILE\Desktop\ssh_tunnel.exe" https://github.com/VITAZGIO/ssh_tunel/releases/latest/download/ssh_tunnel.exe
    Get-FileHash "$env:USERPROFILE\Desktop\ssh_tunnel.exe" -Algorithm SHA256

    Вторая команда печатает контрольную сумму — сверь её с SHA256SUMS.txt на странице релиза. Это надёжнее любой подписи: ты проверяешь именно тот файл, который скачал.

  2. Запусти двойным щелчком. Если файл всё же скачан браузером, Windows предупредит о неизвестном издателе — «Подробнее» → «Выполнить в любом случае».

  3. Открой настройки (шестерёнка), укажи адрес сервера и пользователя. Ключа ещё нет? Нажми знак вопроса у поля «Приватный ключ» — там готовая команда, которая создаст ключ и положит его на сервер.

  4. Сохрани, вернись назад, нажми круглую кнопку.

Крестик прячет программу в трей, туннель продолжает работать. Выйти совсем — правый щелчок по значку у часов → «Выход». Windows 11 новые значки прячет под стрелку «^» рядом с часами — при первом закрытии программа сама подскажет, где её искать. Закрепить значок на виду: перетащи его из-под стрелки на панель задач.

Нужна консольная версия для Windows — она есть в исходниках, собирается одной командой: GOOS=windows go build -o ssh_tunnel_cli.exe ./cmd/ssh_tunnel_cli.

Режим VPN

ssh_tunnel.exe — прокси: через туннель идут только программы, которые умеют в прокси. ssh_tunnel_vpn.exe создаёт виртуальную сетевую карту, и через сервер идёт всё — в том числе игры, Docker и утилиты, которые про прокси не знают. Сетевые адаптеры Windows даёт создавать только администратору, поэтому без службы при каждом запуске появляется окно UAC. Галочка «Запускать при старте системы» ставит программу службой Windows (UAC один раз): VPN и сеть устройств поднимаются при включении компьютера, ещё до входа в систему, — к нему можно подключиться по RDP прямо с экрана ввода пароля, как с NetBird. Обход блокировок и сеть устройств включаются отдельными кнопками. Окно, трей и настройки — те же, что у прокси, серверы у обеих версий общие. Одновременно работает только одна версия: если уже запущена другая, откроется её окно. Для Linux то же самое — ssh_tunnel_vpn_linux. Как это устроено — в VPN.md.


Android

Android 8.0 и новее. Устроено иначе, чем на компьютере, и это принципиально: локального прокси, который надо прописывать в настройках, здесь нет.

Приложение поднимает VPN-подключение средствами самой системы, забирает из неё сырые IP-пакеты и разбирает их своим сетевым стеком, а наружу выпускает всё тем же SSH-соединением. Приложениям настраивать нечего — они просто ходят в интернет, а система отдаёт их трафик нам.

  1. Скачай ssh_tunnel.apk.
  2. Открой файл. Android спросит разрешение ставить приложения из этого источника — оно нужно один раз.
  3. Шестерёнка → адрес сервера, пользователь tunnel, закрытый ключ. Ключ вставляется целиком, вместе со строками -----BEGIN... и -----END.... После сохранения поле очищается: на экране ему не место.
  4. Кнопка на главном экране. Первый раз система спросит подтверждение VPN-подключения — это её собственный запрос, не наш.

Ключ для телефона делай отдельный, а не тот же, что на компьютере: тогда потеря одного устройства не тянет за собой второе.

ssh-keygen -t ed25519 -f ~/.ssh/phone -C "phone"

Открытую часть (phone.pub) добавь на сервере в /home/tunnel/.ssh/authorized_keys — с теми же ограничениями, что и остальные, см. docs/SERVER_SETUP.md.

Что есть: выбор приложений (какие вести через туннель, какие мимо) — отбором занимается сама система; кнопка в шторке быстрых настроек; журнал соединений; тест скорости; задержка до сервера.

Чего нет: UDP. Через SSH он не проходит, поэтому звонки и игры, которым нужен UDP, надо выносить в исключения — они пойдут напрямую. Веб и мессенджеры работают: приложение отбивает UDP сразу, и они за доли секунды переключаются на TCP.


Настройки

Лежат в %APPDATA%\ssh_tunnel\config.json на Windows и в ~/.config/ssh_tunnel/config.json на Linux. Окно и флаги пишут один и тот же файл.

Ключ Назначение
host Адрес твоего сервера.
sshPort Порт SSH, по умолчанию 22.
user Пользователь для входа.
keyPath Приватный ключ. Находится сам среди id_ed25519, id_ecdsa, id_rsa.
socksPort Локальный порт SOCKS4/4a/5, по умолчанию 1080.
httpPort Локальный порт HTTP-прокси, по умолчанию 1081.
poolSize Сколько параллельных SSH-соединений. Больше потоков — выше скорость на длинном канале.
filterMode all, only или except — режим разделения трафика.
filterApps Список программ, к которым режим применяется.
localViaTunnel Вести ли через сервер и локальную сеть. По умолчанию false — она идёт напрямую.
directHosts Свой список адресов и сетей, которые всегда идут напрямую: 100.64.0.0/10, 10.8.*, .netbird.cloud.

Флаги версии для Linux: -host, -sshport, -user, -key, -port, -httpport, -pool, -filter, -apps, -direct, -local-via-tunnel, -sysproxy, -setenv, -save, -env, -web, -web-lan, -web-listen, -v.


Безопасность

  • Ключ сервера проверяется. При первом подключении его отпечаток запоминается (TOFU) в known_hosts; если потом он изменится, программа откажется соединяться, а не будет молча говорить с тем, кто ответил.
  • Имена разрешает сервер, поэтому запрос уходит целиком через туннель. Соединения, пришедшие уже с адресом (приложение разрешило имя само), помечаются в журнале: они выходят наружу не полностью через сервер.
  • Системный прокси возвращается при любом выходе, включая аварийный: есть сохранённый снимок и восстановление при следующем запуске. Остаться без интернета из-за того, что программа упала, недопустимо.
  • Локальный веб-интерфейс защищён случайным токеном и проверкой Origin, на случайном порту: посторонняя страница, открытая в браузере, не должна иметь возможности достучаться до 127.0.0.1 и выключить туннель или прочитать настройки.
  • Прокси-версии прав администратора не требуется. Всё пишется под текущим пользователем. Права нужны только VPN-версии — чтобы создать сетевой адаптер и поменять маршруты.

Чего программа не делает: она не маскирует сама себя. Со стороны это обычное SSH-соединение с твоим сервером — со всеми свойствами обычного SSH-соединения, не больше и не меньше. Полная картина — в SECURITY.md.


Чего туннель не покрывает

  • Программы со своим сетевым стеком, игнорирующие и системный прокси, и переменные окружения — часть игр, некоторые мессенджеры.
  • UDP целиком: SSH пробрасывает только TCP. Браузеры при недоступности QUIC откатываются на TCP сами.
  • DNS-запросы приложений, которые резолвят имена сами, до обращения к прокси. Такие соединения помечаются в журнале.
  • Локальную сеть — намеренно: адреса 192.168.x.x, 10.x.x.x, имена без точек и суффиксы .local/.lan/.home идут напрямую, иначе домашние сервисы перестали бы открываться. Нужно наоборот (внутренняя сеть самого сервера) — галочка «Локальную сеть тоже вести через сервер» в настройках.

Сборка из исходников

Нужен только Go 1.22 или новее — ни компилятора C, ни внешних библиотек.

cd src
go test ./... -race     # проверить, что всё работает
./build.sh              # собрать всё в ../releases
src/          исходный код (модуль Go)
android/      приложение (Kotlin) и сетевой стек к нему (Go)
vpn/          режим VPN для Windows и Linux (свой модуль: Go 1.26, Wintun; vpn/build.sh)
packaging/    служба systemd и установщик для Linux
docs/         архитектура, безопасность, диагностика

Приложение для Android локально не собрать: нужны Android SDK и NDK. Оно собирается на серверах GitHub — workflow android на каждый пуш и release при выпуске. Ключ подписи заводится один раз, см. docs/ANDROID_SIGNING.md.

Готовые файлы в репозитории не лежат — они публикуются в релизах, чтобы история не пухла от бинарников.


Вклад в проект

PR и issue приветствуются. Пожалуйста, не коммить личные данные (адрес сервера, ключи, config.json, known_hosts) — они уже в .gitignore.

Лицензия

MIT © 2026 Vitaliy (VITAZGIO). Разработано в паре с Claude (Anthropic).

About

No description, website, or topics provided.

Resources

Security policy

Stars

3 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages