SSH عبر Tor onion دون فتح أي منفذ
ضع sshd خلف خدمة Tor onion لتمنع الاتصالات الواردة تماماً. تعرّف إلى إعداد v3 وتفويض العميل وترتيب الخطوات الذي يمنع فقدان الوصول بعد إعادة التشغيل.
ما الذي يغيّره تشغيل SSH عبر خدمة onion في Tor
يتيح لك تشغيل SSH عبر خدمة onion في Tor إدارة VPS لا يقبل أي اتصال وارد على أي منفذ. يتصل الخادم بشبكة Tor اتصالاً صادراً ويحافظ عليه مفتوحاً. تصل جلسة SSH الخاصة بك عبر هذا الاتصال، لذلك لا حاجة إلى أن يستمع أي شيء على عنوان IP العام.
يظهر الأثر في السجل فوراً. يجمع خادم ذو منفذ SSH عام آلاف محاولات كلمات المرور الفاشلة يومياً من أدوات الفحص. انقل sshd خلف خدمة onion، واحظر حركة المرور الواردة في الجدار الناري، وعندها لن يسجّل /var/log/auth.log إلا الجلسات التي بدأتها أنت.
المقابل هو أن tor يكون ضمن مسار كل جلسة إدارية. وهو daemon يعمل في مساحة المستخدم، ويجب أن يبدأ ويُكمل عملية الإقلاع الأولي بعد كل إعادة تشغيل قبل أن تتمكن من تسجيل الدخول. خطط لذلك قبل إغلاق المنفذ، لأن نمط الفشل هنا هو فقدان الوصول إلى جهاز لا يمكنك الوصول إليه فعلياً.
أنشئ طريقة للعودة قبل إجراء أي تغيير
لا تبدأ قبل أن تتأكد من توفر مسار استرداد لا يستخدم SSH.
افتح الآن وحدة التحكم لدى مزود الخدمة، سواء كانت وحدة تحكم VNC أو التسلسلية في لوحة التحكم، وسجّل الدخول من خلالها. إذا كنت لا تعرف كلمة مرور root، فاستخدم إعادة تعيين كلمة مرور root من لوحة التحكم أولاً، ثم تأكد من نجاحها. وحدة تحكم لم تختبرها من قبل ليست مسار استرداد.
الترتيب أدناه مهم. يجب إثبات نجاح كل خطوة قبل تنفيذ الخطوة التالية، ويظل المنفذ 22 مفتوحاً حتى يعمل مسار onion.
- ثبّت tor وتأكد من إكمال عملية bootstrap.
- عرّف خدمة onion واقرأ العنوان.
- اتصل عبر onion بينما يظل المنفذ 22 مفتوحاً.
- أضف مصادقة العميل، ثم اتصل مرة أخرى.
- اربط
sshdبعنوان loopback وأغلق المنفذ 22. - أعد التشغيل، ثم اتصل عبر onion مرة أخرى.
أبقِ جلسة SSH الحالية مفتوحة طوال العملية. تبقى الجلسة القائمة فعالة عند تطبيق تغيير في الجدار الناري قد يمنع إنشاء جلسة جديدة، ولذلك فهي وسيلة الإنقاذ الأولى.
تثبيت tor على الخادم
تتضمن Ubuntu حزمة tor في مستودعها الخاص، وغالباً ما تكون هذه الحزمة أقدم من الإصدار الحالي. يحتوي مستودع Tor Project على الإصدار المذكور في توثيقه. أضِفه باستخدام الأوامر الواردة في دليل مستودع apt.
sudo apt update
sudo apt install -y apt-transport-https wget gpg
wget -qO- https://deb.torproject.org/torproject.org/A3C4F0F979CAA22CDBA8F512EE8CBC9E886DDD89.asc | gpg --dearmor | sudo tee /usr/share/keyrings/deb.torproject.org-keyring.gpg >/dev/nullاكتب /etc/apt/sources.list.d/tor.sources. يأخذ Suites اسم الإصدار البرمجي، وتطبعه lsb_release -cs (noble في Ubuntu 24.04).
Types: deb deb-src
URIs: https://deb.torproject.org/torproject.org/
Suites: noble
Components: main
Signed-By: /usr/share/keyrings/deb.torproject.org-keyring.gpgsudo apt update
sudo apt install -y tor deb.torproject.org-keyring
sudo journalctl -u tor@default -n 20 --no-pagerيجب أن ينتهي السجل بـ Bootstrapped 100% (done). إذا ظل عالقاً قبل ذلك، فهذا يعني أن tor لا يستطيع الوصول إلى الشبكة. والسبب في الغالب قاعدة في جدار الحماية تمنع الاتصالات الصادرة أو أن ساعة النظام غير مضبوطة بشكل كبير.
اسم الوحدة خادع. يعرض systemctl status tor القيمة Active: active (exited) حتى عندما يكون كل شيء سليماً، لأن Debian وUbuntu تحزّمان tor كوحدة رئيسية متعددة المثيلات، وتقتصر مهمتها على تشغيل المثيل الفعلي. تعمل الخدمة نفسها باسم tor@default.service. استخدم هذا الاسم مع status ومع journalctl. وتصل أوامر بدء tor وإيقافه وإعادة تحميله إلى المثيل فعلاً، لذلك يعمل sudo systemctl reload tor كما تتوقع.
تعريف خدمة onion للمنفذ 22
أضف سطرين إلى /etc/tor/torrc.
HiddenServiceDir /var/lib/tor/ssh/
HiddenServicePort 22 127.0.0.1:22يخبر السطر الثاني tor بقبول المنفذ الافتراضي 22 على عنوان onion والاتصال بـ 127.0.0.1:22 على الخادم. يصل Tor إلى sshd عبر loopback، ولهذا تحديداً يمكن لـ sshd التوقف لاحقاً عن الاستماع على العنوان العام.
sudo systemctl reload tor
sudo cat /var/lib/tor/ssh/hostnameيطبع ذلك 56 محرفاً بترميز base32 يتبعها .onion. هذه المحارف هي المفتاح العام للخدمة بصيغة مشفّرة. لا توجد جهة إصدار شهادات ولا تسجيل اسم في أي مكان ضمن هذا الإعداد.
دع tor ينشئ /var/lib/tor/ssh/ بنفسه. إذا أنشأته يدوياً بمالك غير صحيح أو بوضع أكثر تساهلاً من 0700، فسيرفض tor استخدامه، وسيذكر journal أن أذونات الدليل متساهلة أكثر من اللازم. الملفات الموجودة داخله هي هوية الخدمة: hs_ed25519_secret_key هو العنوان. أنشئ نسخة احتياطية من هذا الدليل بالوضع 600، واحتفظ بالنسخة خارج الخادم، لأن فقدانها يعني إنشاء عنوان جديد وتعديل الإعدادات على كل عميل.
الاتصال من محطة العمل
تحتاج محطة العمل إلى عميل Tor، ولا يحتاج هذا العميل إلى أي إعداد. في Debian أو Ubuntu، يكون الأمر sudo apt install -y tor netcat-openbsd. بعد ذلك، يستمع Tor على 127.0.0.1:9050 باعتباره وكيلاً من نوع SOCKS5. SOCKS هو بروتوكول وكيل عام، ويمكن للإصدار 5 تمرير اسم مضيف بدلاً من عنوان IP. وهذا هو الجزء المهم هنا.
لا يتضمن OpenSSH عميلاً لـSOCKS، لذلك يستخدم برنامجاً مساعداً لإنشاء الاتصال. أضف ما يلي إلى ~/.ssh/config.
Host myvps
HostName xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.onion
User admin
ProxyCommand /usr/bin/nc -X 5 -x 127.0.0.1:9050 %h %p
ServerAliveInterval 30يحدد -X 5 استخدام SOCKS5، ويشير -x 127.0.0.1:9050 إلى Tor المحلي. يمرر %h اسم onion إلى Tor باعتباره اسماً، لذلك يحل Tor الاسم داخل الشبكة. يجب أن يكون هذا هو OpenBSD netcat. لا يتضمن GNU netcat الخيار -X، ويتوقف مع nc: invalid option -- 'X'.
ssh myvpsيكون الاتصال الأول بطيئاً لأن Tor ينشئ دائرة قبل تنفيذ أي إجراء آخر. اقبل بصمة مفتاح المضيف بالطريقة نفسها التي تتبعها في أي اتصال آخر. من هنا فصاعداً، ينطبق التعامل المعتاد مع مفاتيح SSH دون تغيير. تغيّرت وسيلة النقل، ولم تتغير المصادقة.
للاستخدام لمرة واحدة، يمكنك تخطي إدخال الإعداد: ينفذ torsocks ssh admin@xxxxx.onion المهمة نفسها.
إضافة تفويض العميل باستخدام v3
حالياً، يمكن لأي شخص يعرف العنوان الوصول إلى ترويسة SSH وبدء التخمين. لا يمكن تعداد عناوين Onion من نظام الدليل، لذلك يتصرف العنوان كأنه سر، لكنه قد يتسرب بطرق عادية: من سجل الصدفة وملفات الإعداد الملتزم بها في مستودع git. يسد تفويض العميل هذه الثغرة. تنشر الخدمة واصفها مشفراً باستخدام مفتاح العميل، لذلك لا يستطيع من يملك العنوان دون المفتاح حتى تحديد موقع الخدمة.
أنشئ زوج مفاتيح x25519 على العميل. هذا هو المسار الوارد في دليل تفويض العميل من Tor Project، مع تغيير واحد.
openssl genpkey -algorithm x25519 -out /tmp/k1.prv.pem
grep -v " PRIVATE KEY" /tmp/k1.prv.pem | base64 -d | tail --bytes=32 | base32 | sed 's/=//g' > /tmp/k1.prv.key
openssl pkey -in /tmp/k1.prv.pem -pubout | grep -v " PUBLIC KEY" | base64 -d | tail --bytes=32 | base32 | sed 's/=//g' > /tmp/k1.pub.keyيستخدم الإصدار المنشور من هذه الأسطر base64pem -d، وهو غير موجود في تثبيت Ubuntu القياسي. يتوقف الأمر عندها ويعرض base64pem: command not found. تفكك GNU base64 -d نص PEM نفسه، لذا استخدمها بدلاً منها.
على الخادم، ثبّت المفتاح العام.
sudo install -d -m 700 -o debian-tor -g debian-tor /var/lib/tor/ssh/authorized_clients
echo "descriptor:x25519:PASTE_PUBLIC_KEY_HERE" | sudo tee /var/lib/tor/ssh/authorized_clients/laptop.auth >/dev/null
sudo chown debian-tor:debian-tor /var/lib/tor/ssh/authorized_clients/laptop.auth
sudo systemctl reload torتُقرأ الملفات التي تنتهي فقط بـ .auth. احفظه باسم laptop.auth.txt، وإلا فسيتجاهل tor الملف من دون طباعة أي خطأ، وستظل الخدمة متاحة بهدوء لأي شخص يملك العنوان.
على العميل، ثبّت المفتاح الخاص. في Ubuntu، تعمل خدمة tor باسم المستخدم debian-tor ولا يمكنها قراءة الملفات في الدليل الرئيسي الخاص بك، لذلك احتفظ بالدليل في مكان يمكن لذلك المستخدم الوصول إليه.
sudo install -d -m 700 -o debian-tor -g debian-tor /var/lib/tor/onion_auth
echo "ADDRESS_WITHOUT_DOT_ONION:descriptor:x25519:PASTE_PRIVATE_KEY_HERE" | sudo tee /var/lib/tor/onion_auth/myvps.auth_private >/dev/null
sudo chown debian-tor:debian-tor /var/lib/tor/onion_auth/myvps.auth_private
sudo chmod 600 /var/lib/tor/onion_auth/myvps.auth_privateأضف ClientOnionAuthDir /var/lib/tor/onion_auth إلى /etc/tor/torrc لدى العميل، ثم أعد تحميل tor. إذا كنت تشغّل tor باسم مستخدمك بدلاً من ذلك، مثل إصدار Homebrew على macOS، فاجعل ClientOnionAuthDir يشير إلى ~/.tor/onion_auth مع ضبط الوضع على 0700.
العنوان الموجود داخل ذلك الملف هو الأحرف الـ56 من دون اللاحقة .onion. احذف /tmp/k1.prv.pem و/tmp/k1.prv.key عند الانتهاء.
اختبر الاتجاهين الآن. يجب أن يظل ssh myvps قادراً على الاتصال. ومن جهاز لا يحتوي على أي مفتاح، يجب أن يفشل الاتصال بالعنوان نفسه. يثبت هذا الفشل أن التفويض مفعّل.
إغلاق المنفذ 22 بهذا الترتيب
أنشئ شبكة أمان أولاً. يلغي هذا الأمر الواحد التغييرين أدناه بعد خمس عشرة دقيقة إذا منعت نفسك من الوصول.
sudo systemd-run --on-active=15m --unit=ssh-rescue \
/bin/sh -c 'ufw allow 22/tcp; rm -f /etc/systemd/system/ssh.socket.d/override.conf; systemctl daemon-reload; systemctl restart ssh.socket'ألغِه باستخدام sudo systemctl stop ssh-rescue.timer بعد التأكد من أن مسار onion ما زال يعمل.
بعد ذلك، أوقف استماع sshd على العنوان العام. يفعّل Ubuntu 24.04 SSH عبر وحدة socket، لذلك يتم تجاهل ListenAddress في sshd_config: تتولى ssh.socket مقبس الاستماع، وليس sshd. تحقق من الحالة الموجودة لديك.
systemctl is-enabled ssh.socketإذا طبع ذلك enabled، فنفّذ sudo systemctl edit ssh.socket وأضف ما يلي.
[Socket]
ListenStream=
ListenStream=127.0.0.1:22تفرغ ListenStream= القيمة الموروثة من الوحدة المضمّنة مع الحزمة. إذا حذفت هذا السطر، فستضيف مستمعاً ثانياً مع إبقاء المستمع العام، وهذه أكثر طريقة شائعة لفشل هذه الخطوة من دون ظهور رسالة واضحة.
sudo systemctl daemon-reload
sudo systemctl restart ssh.socket
ss -tlnp | grep ':22'يجب أن يعرض ss القيمة 127.0.0.1:22، وألا يعرض شيئاً على 0.0.0.0:22. إذا كانت ssh.socket معطّلة، فأضف ListenAddress 127.0.0.1 إلى /etc/ssh/sshd_config.d/10-onion.conf، ثم نفّذ sudo systemctl restart ssh وتحقق باستخدام سطر ss نفسه. يمثل هذا الناتج الدليل في كلتا الحالتين.
بعد ذلك اضبط الجدار الناري، وهو إدارة عادية لقواعد ufw على VPS. نفّذ sudo ufw status numbered أولاً واحذف قاعدة SSH التي يعرضها.
sudo ufw status numbered
sudo ufw delete allow OpenSSH
sudo ufw default allow outgoing
sudo ufw default deny incoming
sudo ufw status verboseأبقِ حركة المرور الصادرة مسموحة. يتصل Tor خارجياً بمرحلات على منافذ مثل 443 و9001، لذلك يؤدي إعداد افتراضي يمنع الاتصالات الصادرة إلى إيقاف تهيئة Tor وإزالة وسيلة الوصول الوحيدة المتبقية إليك في الوقت نفسه. كما يشغّل معظم مزوّدي الخدمة جداراً نارياً منفصلاً للشبكة في لوحة التحكم. أغلق المنفذ 22 هناك أيضاً، وإلا فسيظل المنفذ قابلاً للوصول مهما أبلغ ufw.
إذا كان Docker يعمل على هذا الخادم، فتحقق من المنافذ المنشورة قبل اعتبار المهمة مكتملة. يكتب Docker قواعده الخاصة في الجداول نفسها وينشر منافذ الحاويات متجاوزاً ufw مباشرة، لذلك لا تعكس سياسة المنع في ufw الصورة كاملة.
أعد التشغيل قبل الاعتماد عليه
systemctl is-enabled tor@default
sudo rebootإذا لم يعرض الأمر الأول أن الخدمة مفعّلة، فنفّذ sudo systemctl enable tor@default قبل إعادة التشغيل. انتظر دقيقتين، ثم نفّذ ssh myvps. يجب أن ينفّذ Tor عملية bootstrap بعد الإقلاع، لذلك يبدأ عنوان onion في الاستجابة بعد فترة من تشغيل الجهاز نفسه.
إذا لم تعد الخدمة أبداً، افتح وحدة التحكم واقرأ sudo journalctl -u tor@default -b. يظهر فيها خطأ في صياغة torrc أو مشكلة في صلاحيات أحد الأدلة. يمكنك أيضاً التحقق من تعديل torrc قبل تطبيقه.
sudo -u debian-tor tor --verify-configما تكلفة ذلك مقارنةً بنفق WireGuard
مقارنةً بـشبكة WireGuard VPN على VPS تملكه، تكون خدمة onion أبطأ وأقل قابلية للتنبؤ. كن صريحاً مع نفسك بشأن هذه المقايضة قبل اعتمادها.
زمن الاستجابة. تتكون دائرة العميل من ثلاثة مرحلات، وتضيف جهة الخدمة ثلاثة أخرى، لذلك تعبر ضغطات المفاتيح نحو ستة أجهزة اختيرت عشوائياً حول العالم. يظهر تأخير ملحوظ أثناء الكتابة التفاعلية، وتكون نسخ الملفات بطيئاً. يضيف WireGuard قفزة واحدة. قِس حالتك بنفسك باستخدام time ssh myvps 'echo ok'، لأن الرقم يعتمد على الدائرة التي أنشأها tor في تلك اللحظة، ويتغير عندما ينشئ tor دائرة أخرى.
خدمة userspace daemon ضمن المسار الحرج. يعمل WireGuard داخل النواة ويبدأ مع الشبكة. أما Tor فهو عملية يجب أن تبدأ وتنفذ bootstrap وتتصل بمرحل guard قبل أن يعمل أي شيء. عند فشلها، ستحتاج إلى وحدة تحكم المزوّد.
دقة الساعة. تُنشر واصفات خدمة onion وفق فترات زمنية، لذلك تؤدي الساعة غير الصحيحة بدرجة كبيرة إلى تعطّل البحث عن العنوان من دون ظهور رسالة واضحة في أي مكان. يجب أن يعرض timedatectl النتيجة System clock synchronized: yes.
ما تحصل عليه في المقابل هو تقليل التعرض الذي لم يعد يعتمد على صحة قاعدة جدار ناري. لا يوجد منفذ يمكن فحصه ولا banner يمكن التقاطه، والعنوان نفسه مفتاح عام، لذلك تثبت نقطة النهاية هويتها قبل أن يبدأ SSH.
الحل العملي عادةً هو استخدام الاثنين. شغّل WireGuard كمسار يومي، واحتفظ بخدمة onion كمسار يظل يعمل عندما يكون إعداد WireGuard خاطئاً. وبهذا تترك منفذ UDP واحداً مفتوحاً بدلاً من منفذ SSH عام. لا يحل أي من ذلك محل تقوية sshd نفسه: تظل المصادقة باستخدام المفاتيح فقط وتسجيل الدخول بحساب غير root مهمين، لأن خدمة onion تحمي مسار الشبكة ولا تحمي ما يتجاوزه.
أنماط الفشل والأخطاء التي ستراها
لا يتجاوز Tor Bootstrapped 0% أبداً. حركة الشبكة الصادرة محظورة، أو أن الساعة غير مضبوطة بفارق كبير. تحقّق من سياسة الاتصالات الصادرة باستخدام sudo ufw status verbose، ثم شغّل timedatectl.
يعرض systemctl status tor الرسالة active (exited). هذا طبيعي في Debian وUbuntu. اقرأ tor@default بدلاً من ذلك.
تعذّر العثور على الواصف. يعرض Tor خطأ SOCKS الموسّع F0، "Onion Service Descriptor Can Not be Found". إما أن الواصف لم يُنشر بعد، وقد يستغرق ذلك وقتاً قصيراً بعد إعادة التحميل، أو أن tor على الخادم لا يعمل.
F4، "Onion Service Missing Client Authorization". لا يملك العميل .auth_private مطابقاً يمكن لـtor استخدامه. تحقّق من وجود ClientOnionAuthDir في torrc، وأن وضع الدليل هو 0700، وأن اسم الملف ينتهي بـ.auth_private، وأن debian-tor يمكنه قراءته.
F5، "Onion Service Wrong Client Authorization". لا يطابق المفتاح الخاص ملف .auth على الخادم. يؤدي وجود = زائدة أو سطر جديد غير مقصود داخل سلسلة base32 إلى حدوث ذلك.
nc: invalid option -- 'X'. تم تثبيت GNU netcat بدلاً من إصدار OpenBSD. شغّل sudo apt install -y netcat-openbsd.
Could not resolve hostname. حاول ssh استخدام DNS العادي، ولا توجد إجابة للاسم .onion، لذلك لم يُنفَّذ ProxyCommand مطلقاً. لا يطابق النمط Host في ~/.ssh/config الاسم الذي كتبته.
Permission denied (publickey). نجح النفق وانتهى دور tor. تعامل مع هذه الحالة باعتبارها مشكلة عادية تتعلق برفض الإذن publickey، ولا تُدخل tor فيها.
FAQ
هل تعني خدمة onion فعلاً عدم وجود منافذ مفتوحة على VPS؟
نعم، بعد ربط sshd بالعنوان 127.0.0.1 وإسقاط جدار الحماية لحركة المرور الواردة. ينشئ Tor اتصال TCP صادراً إلى relay، وتمر جلستك عبره في الاتجاه المعاكس، لذلك لا يقبل أي شيء على الخادم اتصالاً على العنوان العام. أثبت ذلك باستخدام ss -tlnp على الخادم، وبإجراء فحص للمنافذ من جهاز آخر. لا تنسَ جدار الحماية الشبكي الخاص بالمزوّد في لوحة التحكم. فهو عنصر تحكم منفصل عن ufw، ويجب إغلاقه أيضاً.
هل يكفي عنوان .onion وحده لتأمين SSH؟
لا. يتكون العنوان من 56 حرفاً، ولا يمكن تخمينه أو حصره من نظام الدليل، لذلك يتصرف كأنه سر، لكنه قد يتسرب عبر سجل shell وملفات الإعداد. أضف مصادقة العميل v3. عند تفعيلها، يُشفَّر واصف الخدمة باستخدام مفتاح العميل، لذلك يحصل من يملك العنوان فقط على الخطأ الموسّع F4، ولا يصل إلى sshd إطلاقاً.
ماذا يحدث إذا فشل tor في البدء بعد إعادة التشغيل؟
ستفقد الوصول إلى SSH بالكامل، لأن عنوان onion سيكون عندها وسيلة الدخول الوحيدة. لذلك يجب اختبار وحدة تحكم المزوّد قبل إغلاق المنفذ 22. يحتاج Tor أيضاً إلى وقت لتهيئة اتصاله بعد الإقلاع، لذلك يستجيب العنوان بعد استجابة الجهاز لـ ping بوقت أطول. إذا لم يستجب مطلقاً، سجّل الدخول عبر وحدة التحكم واقرأ sudo journalctl -u tor@default -b، حيث يظهر خطأ في صياغة torrc أو مشكلة في الصلاحيات على /var/lib/tor/ssh.
هل يكون SSH عبر Tor أبطأ من WireGuard؟
نعم، بفارق كبير. يمر الاتصال بخدمة onion عبر نحو ستة relays يختارها Tor عشوائياً، بينما يمثل WireGuard قفزة مشفّرة واحدة مباشرة إلى خادمك. ستشعر بتأخر أثناء الكتابة، وستكون عمليات النقل بطيئة. من الإعدادات الشائعة استخدام WireGuard للعمل اليومي، مع إبقاء خدمة onion كمسار طوارئ يستمر في العمل عند تعطل إعداد VPN.