Пропускает трафик приложений через твой собственный Linux-сервер по обычному SSH.
Один файл, без установки. Для компьютера — две версии: прокси (без прав администратора) и VPN (весь трафик системы). Учебный проект: показывает, как из штатного механизма SSH собирается рабочий локальный прокси.
🇷🇺 Русский · 🇬🇧 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) ────► твой сервер ──► сеть
- Приложение думает, что говорит с обычным прокси на своей же машине.
- Программа разбирает запрос, узнаёт адрес назначения и открывает до него
канал
direct-tcpipчерез SSH. - Имя хоста разрешает сервер, а не твой компьютер: соединение выходит в сеть с адреса сервера целиком, включая DNS-запрос.
На твоей машине:
- Windows 10 / 11 либо Linux (amd64 / arm64)
- больше ничего: файл самодостаточный, без установщика и без библиотек
На сервере:
- любой Linux-сервер с доступом по SSH — свой или арендованный, разницы нет. Ставить на него ничего не надо: прокси разворачивается на твоей машине, сервер только пропускает через себя соединения.
Сервер только что арендован и настроен «как из коробки»? Первым делом стоит закрыть вход по паролю и включить firewall — готовый набор команд одним блоком лежит в первой настройке сервера.
-
Скачай 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на странице релиза. Это надёжнее любой подписи: ты проверяешь именно тот файл, который скачал. -
Запусти двойным щелчком. Если файл всё же скачан браузером, Windows предупредит о неизвестном издателе — «Подробнее» → «Выполнить в любом случае».
-
Открой настройки (шестерёнка), укажи адрес сервера и пользователя. Ключа ещё нет? Нажми знак вопроса у поля «Приватный ключ» — там готовая команда, которая создаст ключ и положит его на сервер.
-
Сохрани, вернись назад, нажми круглую кнопку.
Крестик прячет программу в трей, туннель продолжает работать. Выйти совсем — правый щелчок по значку у часов → «Выход». Windows 11 новые значки прячет под стрелку «^» рядом с часами — при первом закрытии программа сама подскажет, где её искать. Закрепить значок на виду: перетащи его из-под стрелки на панель задач.
Нужна консольная версия для Windows — она есть в исходниках, собирается одной
командой: GOOS=windows go build -o ssh_tunnel_cli.exe ./cmd/ssh_tunnel_cli.
ssh_tunnel.exe — прокси: через туннель идут только программы, которые умеют
в прокси. ssh_tunnel_vpn.exe создаёт виртуальную сетевую карту, и через
сервер идёт всё — в том числе игры, Docker и утилиты, которые про прокси
не знают. Сетевые адаптеры Windows даёт создавать только администратору,
поэтому без службы при каждом запуске появляется окно UAC. Галочка
«Запускать при старте системы» ставит программу службой Windows (UAC один
раз): VPN и сеть устройств поднимаются при включении компьютера, ещё до входа
в систему, — к нему можно подключиться по RDP прямо с экрана ввода пароля,
как с NetBird. Обход блокировок и сеть устройств включаются отдельными
кнопками. Окно, трей и настройки — те же, что у прокси, серверы у обеих
версий общие. Одновременно работает только одна версия: если уже запущена
другая, откроется её окно.
Для Linux то же самое — ssh_tunnel_vpn_linux. Как это устроено — в
VPN.md.
Android 8.0 и новее. Устроено иначе, чем на компьютере, и это принципиально: локального прокси, который надо прописывать в настройках, здесь нет.
Приложение поднимает VPN-подключение средствами самой системы, забирает из неё сырые IP-пакеты и разбирает их своим сетевым стеком, а наружу выпускает всё тем же SSH-соединением. Приложениям настраивать нечего — они просто ходят в интернет, а система отдаёт их трафик нам.
- Скачай ssh_tunnel.apk.
- Открой файл. Android спросит разрешение ставить приложения из этого источника — оно нужно один раз.
- Шестерёнка → адрес сервера, пользователь
tunnel, закрытый ключ. Ключ вставляется целиком, вместе со строками-----BEGIN...и-----END.... После сохранения поле очищается: на экране ему не место. - Кнопка на главном экране. Первый раз система спросит подтверждение 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 # собрать всё в ../releasessrc/ исходный код (модуль 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).