
Сетевой SSH-роутер — направляет соединения на разные IP-адреса/порты/ключи/шлюзы в зависимости от активной VPN-сети или сетевого подключения.
| CI | Code | OpenSpec | Security |
|---|---|---|---|
|
|
|
|
|
Сетевой SSH-маршрутизатор. Определяет вашу активную сеть или VPN и автоматически выбирает правильный хост, порт, файл ключа и шлюз для каждого SSH-подключения — без изменений в ~/.ssh/config.
Определите каждый логический хост один раз с профилем default и опциональными переопределениями для каждой сети. При каждом подключении sshroute определяет, в какой сети вы находитесь (VPN, офисная LAN, WireGuard-пир и т. д.), и разрешает правильные SSH-параметры перед передачей управления настоящему /usr/bin/ssh.
ssh myserver
→ sshroute определяет: corp-vpn активен
→ разрешает: 10.100.0.50:2222 через bastion.corp.internal
→ exec /usr/bin/ssh -p 2222 -i ~/.ssh/corp_key -J bastion.corp.internal 10.100.0.50
В вашей лаборатории, скорее всего, есть как минимум две реальности: вы либо дома в локальной сети, либо в отъезде и подключаетесь через WireGuard или другой VPN. Проблема в том, что ~/.ssh/config не знает, в какой из них вы находитесь — в итоге вам приходится создавать отдельные алиасы (server-lan, server-vpn), или шлюз, который работает только половину времени, или просто запоминать IP-адреса.
sshroute решает эту проблему, определяя текущую сеть перед каждым подключением. Когда интерфейс WireGuard активен и существует маршрут к пиру, он подключается напрямую к туннельному IP. Когда вы в локальной сети — использует локальный адрес. Если ни один из адресов не доступен, он переключается на публичное имя хоста. Один алиас, три реальности, ноль ручного переключения.
Кроме того, он прозрачно перехватывает SSH — git push, rsync, scp будут работать через него автоматически после настройки теневого режима. Никаких обёрток, шелл-функций или размышлений.
Корпоративные сети ещё сложнее. У вас есть публичный интернет, возможно, VPN «сайт-сайт», возможно, личный VPN с разделением трафика, а внутри — разные шлюзы в зависимости от целевой среды — dev, staging, prod, у каждой свой бастион и ключ. Поддерживать всё это в ~/.ssh/config означает либо один огромный конфиг, который ломается при любом изменении инфраструктуры, либо писать скрипт, который каждый член команды поддерживает по-своему.
sshroute позволяет определить логику маршрутизации декларативно, хранить её в версионируемом YAML-файле и распространять среди команды. Одна и та же конфигурация работает для всех — правильная сеть определяется автоматически на основе активных интерфейсов или маршрутов на каждой машине. Ключи, порты, пользователи и шлюзы разрешаются без необходимости думать об этом.
| Функция | ~/.ssh/config | Только WireGuard | Teleport / Boundary | sshroute |
|---|---|---|---|---|
| Определяет вашу текущую сеть | ❌ | ❌ | ❌ | ✅ |
| Автоматически выбирает лучший путь | ❌ | ❌ | ❌ | ✅ |
| Переключение при сбое подключения | ❌ | ❌ | ✅ | ✅ |
| Автопереподключение + смена маршрута при обрыве | ❌ | ⚠️ туннель кочует | ⚠️ через фиксированный прокси | ✅ |
| Одна команда на хост из любого места | ❌ | ⚠️ VPN должен быть включён | ✅ | ✅ |
| Размер конфига для 10 хостов × 4 пути | 📄 ~600 строк | 📄 ~600 строк + конфиг VPN | 📄 конфиг на сервере | 📄 ~60 строк |
| Мобильные устройства в роуминге | ⚠️ ручные алиасы | ⚠️ требуется VPN | ✅ | ✅ |
| Автоматическая цепочка шлюзов | ⚠️ ручной -J | ➖ не применимо | ✅ | ✅ |
| Работает с scp / rsync / git / Ansible | ✅ | ✅ | ⚠️ частично | ✅ |
| Не требует установки серверной части | ✅ | ❌ | ❌ | ✅ |
| Не требует сервера аутентификации или демона | ✅ | ❌ | ❌ | ✅ |
| Не требует клиентского агента | ✅ | ❌ | ❌ | ✅ |
| Open source, полностью самостоятельный | ✅ | ✅ | ⚠️ open-core | ✅ |
Teleport и Boundary — это другая категория: они добавляют контроль доступа, журналы аудита и аутентификацию на основе сертификатов поверх маршрутизации. Если вам нужно именно это — используйте их. sshroute предназначен для тех случаев, когда нужна интеллектуальная маршрутизация без операционных издержек центрального сервера аутентификации.
Загрузите последний релиз с GitHub Releases. Доступны бинарные файлы для Linux, macOS и Android на архитектурах AMD64 и ARM64.
go install github.com/thereisnotime/sshroute@latest
Загрузите архив android_arm64 с GitHub Releases, распакуйте и поместите бинарный файл в ~/.local/bin:
mkdir -p ~/.local/bin
curl -Lo "$TMPDIR/sshroute.tar.gz" \
https://github.com/thereisnotime/sshroute/releases/latest/download/sshroute_android_arm64.tar.gz
tar -xzf "$TMPDIR/sshroute.tar.gz" -C ~/.local/bin sshroute
chmod +x ~/.local/bin/sshroute