
موجه SSH مدرك للشبكة - يوجه الاتصالات إلى عناوين IP/منافذ/مفاتيح/مضيفات قفز مختلفة بناءً على VPN أو الشبكة النشطة.
| CI | Code | OpenSpec | Security |
|---|---|---|---|
|
|
|
|
|
موجه SSH مدرك للشبكة. يكتشف شبكتك النشطة أو VPN ويختار تلقائيًا المضيف والمنفذ وملف الهوية ومضيف القفز الصحيح لكل اتصال SSH — دون لمس ~/.ssh/config.
حدد كل مضيف منطقي مرة واحدة باستخدام ملف تعريف default وإعدادات اختيارية لكل شبكة. في كل اتصال، يكتشف sshroute الشبكة التي تتصل منها (VPN، شبكة المكتب المحلية، نظير WireGuard، إلخ) ويحل معاملات SSH الصحيحة قبل تسليم الاتصال إلى /usr/bin/ssh الحقيقي.
ssh myserver
→ يكتشف sshroute: corp-vpn نشط
→ يحل: 10.100.0.50:2222 عبر bastion.corp.internal
→ ينفذ /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 كلها تمر عبره تلقائيًا بمجرد إعداد وضع الظل (shadow mode). بدون محولات أو دوال شيل أو تفكير.
الشبكات المؤسسية أسوأ. لديك الإنترنت العام، ربما VPN من موقع إلى موقع، ربما VPN شخصي بتقسيم النفق، وداخل ذلك لديك مضيفات قفز مختلفة اعتمادًا على البيئة التي تستهدفها — التطوير، التجهيز، الإنتاج، كل منها له حصن ومفتاح خاص به. الحفاظ على هذا في ~/.ssh/config يعني إما ملف إعداد ضخم ينكسر عندما تتغير البنية التحتية، أو كتابة سكربت يصونه كل شخص في الفريق بشكل مختلف.
يتيح لك sshroute تعريف منطق التوجيه بشكل تصريحي، والاحتفاظ به في ملف YAML مُرقم الإصدار، ومشاركته عبر الفريق. يعمل نفس الإعداد للجميع — يتم اكتشاف الشبكة الصحيحة تلقائيًا بناءً على الواجهات أو المسارات النشطة على كل جهاز. يتم حل المفاتيح والمنافذ والمستخدمين ومضيفات القفز دون أن يضطر المستخدم إلى التفكير في الأمر.
| الميزة | ~/.ssh/config | WireGuard فقط | Teleport / Boundary | sshroute |
|---|---|---|---|---|
| يكتشف شبكتك الحالية | ❌ | ❌ | ❌ | ✅ |
| يختار أفضل مسار تلقائيًا | ❌ | ❌ | ❌ | ✅ |
| يعود للخلف عند فشل الاتصال | ❌ | ❌ | ✅ | ✅ |
| إعادة الاتصال تلقائيًا + إعادة التوجيه عند الانقطاع | ❌ | ⚠️ النفق يتنقل | ⚠️ عبر وكيل ثابت | ✅ |
| أمر واحد لكل مضيف، أي موقع | ❌ | ⚠️ يجب أن يكون VPN نشطًا | ✅ | ✅ |
| حجم الإعداد لـ 10 مضيفين × 4 مسارات | 📄 ~600 سطر | 📄 ~600 سطر + إعداد VPN | 📄 إعداد من جانب الخادم | 📄 ~60 سطر |
| الأجهزة المحمولة المتجولة | ⚠️ أسماء مستعارة يدوية | ⚠️ VPN مطلوب | ✅ | ✅ |
| سلسلة مضيف القفز تلقائيًا | ⚠️ -J يدوي | ➖ غير قابل للتطبيق | ✅ | ✅ |
| يعمل مع scp / rsync / git / Ansible | ✅ | ✅ | ⚠️ جزئي | ✅ |
| لا حاجة لتثبيت من جانب الخادم على الأهداف | ✅ | ❌ | ❌ | ✅ |
| لا حاجة لخادم مصادقة أو خدمة لتشغيلها | ✅ | ❌ | ❌ | ✅ |
| لا حاجة لعميل وكيل | ✅ | ❌ | ❌ | ✅ |
| مفتوح المصدر، مستضاف بالكامل ذاتيًا | ✅ | ✅ | ⚠️ نواة مفتوحة | ✅ |
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
أضف ~/.local/bin إلى PATH في ~/.bashrc أو ~/.profile إذا لم يكن موجودًا بالفعل:
echo 'export PATH="$HOME/.local/bin:$PATH"' >> ~/.bashrc
source ~/.bashrc
بدلاً من ذلك، قم بتجميع من المصدر باستخدام Go الخاص بـ Termux. نظرًا لأن سلسلة أدوات Go الرسمية لا تنشر ثنائيات android/arm64، قم بتعيين GOTOOLCHAIN=local لاستخدام ما يوفره Termux:
GOTOOLCHAIN=local go install github.com/thereisnotime/sshroute@latest
بعد التثبيت، قم بتعيين مسار ثنائي SSH لأن Termux لا يحتوي على /usr/bin/ssh:
# ~/.config/sshroute/config.yaml
ssh_binary: /data/data/com.termux/files/usr/bin/ssh
أو عبر متغير بيئة: export SSHROUTE_SSH=$(which ssh)
docker run --rm -v ~/.config/sshroute:/root/.config/sshroute \
ghcr.io/thereisnotime/sshroute network