SSD Nodes Learn Hosting plans →
الأدلة Matt Connorبقلم Matt Connor · آخر تحديث في 2026-08-23

SSH عبر Tor onion بلا منافذ مفتوحة

شغّل sshd خلف خدمة Tor onion ليجيب VPS على بلا منافذ واردة. تعرّف إلى إعداد v3 وترتيب الخطوات الذي يمنع فقدان الوصول بعد إعادة التشغيل.

ما الذي يتغير عند تشغيل SSH عبر خدمة onion في Tor

يتيح لك SSH عبر خدمة onion في Tor إدارة VPS لا يقبل أي اتصال وارد على أي منفذ. يتصل الخادم بشبكة Tor ويُبقي ذلك الاتصال مفتوحاً. تصل جلسة SSH الخاصة بك عبره، لذلك لا تحتاج إلى تشغيل أي خدمة تستمع على عنوان IP العام.

يظهر الأثر فوراً في السجل. يجمع خادم يتيح منفذ SSH عاماً آلاف محاولات كلمات المرور الفاشلة يومياً من أدوات المسح. انقل sshd خلف خدمة onion واحظر حركة المرور الواردة في الجدار الناري، وعندها يسجّل /var/log/auth.log الجلسات التي بدأتها أنت فقط.

المقابل هو أن tor يمرّر كل جلسة إدارية. وهو daemon يعمل في مساحة المستخدم، ويجب أن يبدأ ويُجري عملية bootstrap بعد كل إعادة تشغيل قبل أن تتمكن من تسجيل الدخول. خطط لذلك قبل إغلاق المنفذ، لأن نمط الفشل هنا هو فقدان الوصول إلى جهاز لا يمكنك الوصول إليه فعلياً.

أنشئ وسيلة وصول احتياطية قبل تغيير أي شيء

لا تبدأ قبل أن تتأكد من وجود مسار استرداد لا يعتمد على SSH.

افتح الآن وحدة التحكم الخاصة بمزوّدك، سواء كانت وحدة تحكم VNC أو وحدة التحكم التسلسلية في لوحة التحكم، وسجّل الدخول باستخدامها. إذا كنت لا تعرف كلمة مرور root، فاستخدم إعادة تعيين كلمة مرور root من لوحة التحكم أولاً، ثم تأكد من نجاح تسجيل الدخول. وحدة تحكم لم تختبرها من قبل ليست مسار استرداد.

الترتيب التالي مهم. ستتحقق من نجاح كل خطوة قبل تنفيذ الخطوة التالية، وسيظل المنفذ 22 مفتوحاً حتى يعمل مسار onion.

  1. ثبّت tor وتأكد من إكمال عملية bootstrap.
  2. عرّف خدمة onion واقرأ العنوان.
  3. اتصل عبر onion بينما يظل المنفذ 22 مفتوحاً.
  4. أضف مصادقة العميل، ثم اتصل مرة أخرى.
  5. اربط sshd بواجهة loopback وأغلق المنفذ 22.
  6. أعد التشغيل، ثم اتصل عبر onion مرة أخرى.

أبقِ جلسة SSH الحالية مفتوحة طوال العملية. تستمر الجلسة القائمة رغم تغيير في الجدار الناري قد يمنع جلسة جديدة، ولذلك فهي وسيلة الإنقاذ الأولى.

ثبّت tor على الخادم

يتوفر tor في مستودع Ubuntu الخاص، لكن هذا الإصدار غالباً ما يكون أقدم. يحتوي مستودع 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.gpg
sudo 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 لاحقاً التوقف عن الاستماع على العنوان العام. وجّه السطر الثاني إلى خادم ويب على 127.0.0.1:80 بدلاً من ذلك، وستنشر التوجيهات نفسها موقعاً على عنوان onion، وهي خدمة ثانية مفيدة لتشغيلها بعد تثبيت tor.

sudo systemctl reload tor
sudo cat /var/lib/tor/ssh/hostname

يطبع ذلك 56 حرفاً بترميز base32، يتبعها .onion. تمثل هذه الأحرف المفتاح العام للخدمة بصيغة مشفّرة. لا توجد جهة إصدار شهادات ولا تسجيل اسم في أي مكان ضمن هذا الإعداد.

دع tor ينشئ /var/lib/tor/ssh/ بنفسه. إذا أنشأته يدوياً بمالك غير صحيح أو بوضع صلاحيات أوسع من 0700، فسيرفض tor استخدامه، وسيعرض السجل أن أذونات الدليل متساهلة أكثر من اللازم. الملفات الموجودة بداخله هي هوية الخدمة: 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 من نظام الدليل، لذلك يتصرف العنوان كأنه سر، لكنه قد يتسرب بطرق عادية: من سجل shell أو ملفات الإعداد الملتزم بها في مستودع 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، يعمل daemon الخاص بـ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

مقارنةً بـشبكة VPN عبر WireGuard على 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، ومن أن الدليل مضبوط على mode 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 أيضاً إلى وقت لإكمال bootstrap بعد الإقلاع، لذلك يستجيب العنوان بعد استجابة الجهاز لـ ping بمدة أطول. إذا لم يستجب مطلقاً، فسجّل الدخول عبر وحدة التحكم واقرأ sudo journalctl -u tor@default -b، حيث يظهر خطأ في صياغة torrc أو مشكلة في الصلاحيات على /var/lib/tor/ssh.

هل يكون SSH عبر Tor أبطأ من WireGuard؟

نعم، بفارق كبير. يعبر الاتصال بخدمة onion نحو ستة relays يختارها عشوائياً، بينما يستخدم WireGuard قفزة مشفّرة واحدة مباشرة إلى خادمك. ستشعر بتأخر أثناء الكتابة، وستكون عمليات النقل بطيئة. من الإعدادات الشائعة استخدام WireGuard للعمل اليومي، مع الاحتفاظ بخدمة onion كمسار طوارئ يستمر في العمل عند تعطل إعدادات VPN.