تحويل VPS إلى عقدة خروج في Tailscale
حوّل VPS إلى عقدة خروج في Tailscale بخمس خطوات: ثبّت البرنامج، أعلن المسار، فعّل IP forwarding، وافق عليه من لوحة الإدارة، ثم أصلح DNS وIPv6.
ما الذي تفعله عقدة الخروج في Tailscale
عقدة الخروج في Tailscale هي جهاز على شبكة tailnet يتولى كل حركة الإنترنت من أجهزتك الأخرى. ويُعد VPS (خادم خاص افتراضي) خياراً مناسباً لذلك، لأنه يملك عنواناً عاماً ثابتاً ويظل متصلاً بالإنترنت. يتطلب إعدادها خمس خطوات: تثبيت Tailscale على الخادم، والإعلان عن عقدة الخروج، وتفعيل إعادة توجيه IP، والموافقة على المسار في وحدة تحكم الإدارة، ثم اختيار العقدة على حاسوبك المحمول. الخطوة الرابعة عبارة عن مفتاح تبديل في صفحة ويب وليست أمراً، ولذلك يتوقف معظم الأشخاص عندها.
بعد تفعيلها، يقوم حاسوبك المحمول بتشفير كل حزمة ويرسلها إلى VPS. يطبّق VPS ترجمة عناوين الشبكة المصدرية (NAT)، ثم يرسل الحزمة باستخدام عنوان IP العام الخاص به. ترى مواقع الويب عنوان VPS. ولا ترى شبكة Wi-Fi في المقهى سوى تدفق UDP مشفراً واحداً إلى VPS، ولا ترى أي شيء آخر.
يستخدم Tailscale بروتوكول WireGuard لمسار البيانات، إضافة إلى خادم تنسيق يوزّع المفاتيح ويساعد جهازين على العثور على بعضهما عبر NAT. وخادم التنسيق هذا هو سبب عدم الحاجة إلى نسخ المفاتيح في أي خطوة أدناه. للاطلاع على المقارنة التفصيلية بين Tailscale وWireGuard العادي، اقرأ كيفية مقارنة Tailscale وWireGuard العادي. وإذا كنت تفضّل إدارة كل جزء من النفق بنفسك، فأنشئ شبكة VPN عادية باستخدام WireGuard على VPS بدلاً من ذلك.
تفترض الخطوات أدناه أن Tailscale يعمل بالفعل على حاسوبك المحمول، وأن الجهازين سجّلا الدخول إلى شبكة tailnet نفسها. شبكة tailnet هي شبكة Tailscale الخاصة بك، ويحصل كل جهاز فيها على عنوان ثابت داخل 100.64.0.0/10.
ثبّت Tailscale على VPS الخاص بك
curl -fsSL https://tailscale.com/install.sh | sh
sudo tailscale upيحدّد برنامج التثبيت مستودع الحزم المناسب لتوزيعتك، ثم يثبّت daemon الخاص بـ tailscaled. يطبع tailscale up بعد ذلك عنوان URL للمصادقة. افتحه في متصفح وسجّل الدخول باستخدام الحساب نفسه الذي يستخدمه حاسوبك المحمول، لأن VPS المسجّل في tailnet مختلف لن يتمكّن من خدمة حاسوبك المحمول إطلاقاً.
tailscale status
tailscale ip -4يفترض أن يعرض tailscale status الآن الجهازين. يطبع tailscale ip -4 عنوان VPS داخل tailnet، وهو العنوان الذي ستستخدمه مع العميل لاحقاً.
يحتاج Tailscale إلى جهاز TUN لإنشاء النفق. يتوفر هذا الجهاز في VPS يعمل عبر KVM. أما الخطط التي تستخدم المحاكاة الافتراضية القائمة على الحاويات وتشارك نواة المضيف، فقد يكون /dev/net/tun مفقوداً أحياناً، وعندها لا يتمكّن tailscaled من إنشاء واجهة tailscale0. نفّذ ls -l /dev/net/tun قبل المتابعة.
تفعيل إعادة توجيه IP، وإلا فسيسقط VPS كل حزمة
تسقط آلة Linux أي حزمة لا تكون موجّهة إليها، لأنّ net.ipv4.ip_forward تكون قيمته 0 افتراضياً. ستقبل عقدة الخروج حركة الشبكة الخاصة بك، وتفك تشفيرها، ثم تتخلص منها. اكتب الإعداد في ملف حتى يبقى بعد إعادة التشغيل.
echo 'net.ipv4.ip_forward = 1' | sudo tee -a /etc/sysctl.d/99-tailscale.conf
echo 'net.ipv6.conf.all.forwarding = 1' | sudo tee -a /etc/sysctl.d/99-tailscale.conf
sudo sysctl -p /etc/sysctl.d/99-tailscale.confيستخدم tee -a وضع الإلحاق، لذلك يؤدي تشغيل هذه الأسطر مرة ثانية إلى كتابة الإعدادين مرتين. ستظل النتيجة تعمل، لكن سيبدو cat /etc/sysctl.d/99-tailscale.conf غريباً. تحقّق من القيمة الفعلية بدلاً من الوثوق بالملف:
sysctl net.ipv4.ip_forwardيجب أن يطبع net.ipv4.ip_forward = 1. إذا تخطيت هذه الخطوة واستخدمت tailscale up --advertise-exit-node، فسيخبرك العميل بما يلي:
Warning: IP forwarding is disabled, subnet routing/exit nodes will not work.لا ينفّذ tailscale set --advertise-exit-node هذا الفحص، لذلك لا يثبت الصمت من set أن إعادة التوجيه مفعّلة. اقرأ قيمة sysctl بنفسك.
لا تحتاج إلى كتابة قاعدة masquerade يدوياً. يثبّت tailscaled سلاسل جدار الحماية الخاصة به، وتُسمّى ts-input وts-forward وts-postrouting، وتوجد قاعدة NAT لحركة شبكة عقدة الخروج في ts-postrouting. اعرضها باستخدام sudo iptables-save | grep ts-، أو باستخدام sudo nft list ruleset على نظام يستخدم nftables.
أعلن عن VPS كعقدة خروج
sudo tailscale set --advertise-exit-nodeيغيّر tailscale set تفضيلاً واحداً ويُبقي بقية التفضيلات دون تغيير. كما يعلن tailscale up --advertise-exit-node عن العقدة، لكنه يسبب أثراً جانبياً: يتعامل up مع الخيارات الموجودة في سطر الأوامر على أنّها مجموعة الإعدادات غير الافتراضية الكاملة، لذلك يرفض تشغيل sudo tailscale up مجرّداً لاحقاً ويطبع
changing settings via 'tailscale up' requires mentioning all
non-default flags. To proceed, either re-run your command with --reset or
use the command below to explicitly mention the current value of
all non-default settings:استخدم set لإجراء التغييرات المستمرة، ولن تظهر لك تلك الرسالة.
الإعلان هو عرض. يُبلغ VPS الآن خادم التنسيق بأنّه مستعد للعمل كعقدة خروج. لا يمكن لأي عميل استخدامه بعد.
اعتماد عقدة الخروج من Tailscale في وحدة تحكم الإدارة
هذه هي الخطوة التي لا يوجد لها أمر. افتح صفحة الأجهزة في وحدة تحكم الإدارة، وابحث عن VPS، ثم افتح قائمة النقاط الثلاث في نهاية صفه، واختر Edit route settings، وفعّل Use as exit node.
إلى أن تفعّل هذا الخيار، تحتفظ طبقة التحكم بالعرض ولا تمنحه لأي جهاز. لا يعرض tailscale exit-node list على حاسوبك المحمول أي شيء، ويستمر مرور الشبكة وفق مساره المعتاد. ولا تظهر رسالة خطأ على أي من الجهازين. لا تظهر عقدة الخروج على الإطلاق.
يمكنك اعتماد عقد الخروج تلقائياً بإضافة إدخال إلى ملف سياسة tailnet:
"autoApprovers": {
"exitNode": ["tag:exit"],
}يُعتمد الجهاز الذي شُغِّل باستخدام --advertise-tags=tag:exit تلقائياً، ما دام tag:exit معرّفاً تحت tagOwners في ملف السياسة نفسه. يغيّر وضع الوسوم ملكية الجهاز: يصبح الجهاز الموسوم تابعاً لـtailnet بدلاً من حساب المستخدم، وتتغير معه قواعد الوصول المطبقة عليه. بالنسبة إلى VPS واحد، يكون الخيار أبسط.
حدِّد عقدة الخروج على حاسوبك المحمول
على عميل Linux:
tailscale exit-node list
sudo tailscale set --exit-node=vps.your-tailnet.ts.netيطبع exit-node list عقد الخروج المعتمدة في tailnet مع عناوينها. تعني القائمة الفارغة أن خطوة الاعتماد لم تُنفَّذ. في macOS وWindows وiOS وAndroid، يتوفر الخيار نفسه كعنصر قائمة ضمن Exit Node في تطبيق Tailscale.
تحقّق من العميل، وليس من الخادم:
curl -4 https://ifconfig.meشغّل الأمر مرة قبل تحديد عقدة الخروج ومرة بعده. يجب أن يتغير العنوان من عنوانك المحلي إلى عنوان IP العام لـ VPS. لإيقاف استخدام عقدة الخروج:
sudo tailscale set --exit-node=هناك خيار آخر مهم منذ اليوم الأول. عند تحديد عقدة خروج، يرسل العميل كل شيء عبر النفق، بما في ذلك الحزم الموجّهة إلى 192.168.1.50، ولذلك تتوقف الطابعة ووحدة التخزين الشبكية عن الاستجابة. أبقِ الشبكة المحلية على المسار المحلي:
sudo tailscale set --exit-node=<name> --exit-node-allow-lan-access=trueلماذا تتغير إعدادات DNS فور تفعيل exit node
بشكل افتراضي، يستخدم الجهاز الذي يتصل عبر exit node عقدة الخروج نفسها كمحلّل DNS (نظام أسماء النطاقات) لكل نطاق. وهذا يتجاوز خوادم الأسماء العامة والمقسّمة التي ضبطتها لشبكة tailnet. هذا السلوك مقصود. إذا استمرت الاستعلامات في التوجّه إلى محلّل الشبكة المحلية، فسيظل جهاز التوجيه في المقهى يرى اسم كل موقع تزوره، بينما تبقى حركة الشبكة نفسها خاصة. يجب أن تخرج الأسماء والحزم من المكان نفسه.
تظهر إحدى النتائج بوضوح لدى من يشغّلون محلّلاً داخلياً: يتوقف استخدام خادم أسماء في tailnet تعتمد عليه أثناء تفعيل exit node. فعّل Use with exit node لذلك الخادم من صفحة DNS في وحدة تحكم الإدارة لإعادته إلى الاستخدام.
تستمر أسماء MagicDNS في العمل، لأن عميل Tailscale يجيب عنها محلياً عند 100.100.100.100 قبل وصول أي شيء إلى exit node. تحقّق من ذلك باستخدام dig @100.100.100.100 your-vps.your-tailnet.ts.net، أو على عميل يستخدم systemd-resolved باستخدام resolvectl status، حيث تسرد واجهة Tailscale العنوان 100.100.100.100 بوصفه خادم DNS.
إذا عطّلت معالجة DNS في Tailscale باستخدام --accept-dns=false، فسيحتفظ العميل بالمحلّل الذي تعلّمه من الشبكة المحلية. تُمرَّر حركة الشبكة عبر النفق، لكن الاستعلامات لا تُمرَّر عبره. وهذا هو تسرّب DNS نفسه الذي يؤثر في أنفاق WireGuard المنشأة يدوياً. اترك --accept-dns دون تغيير ما لم يكن لديك سبب محدد لتعديله.
IPv6 عبر عقدة الخروج
تعلن عقدة الخروج عن المسارين الافتراضيين، 0.0.0.0/0 و::/0. إذا لم يكن لدى VPS مسار IPv6 يعمل إلى الإنترنت، تصل حزم IPv6 عبر النفق وتتوقف هناك. اختبر ذلك على VPS قبل الاعتماد عليه:
ip -6 addr show
curl -6 https://ifconfig.meيعني فشل الطلب أن VPS لا يملك مساراً صاعداً لـIPv6. عادةً ما تستمر مواقع dual stack في التحميل، لأن العميل يتوقف عن استخدام IPv6 ويعيد المحاولة عبر IPv4، لكن إعادة المحاولة هذه تضيف تأخيراً عند أول اتصال بكل موقع. وتبقى الوجهات التي لا تدعم إلا IPv6 غير قابلة للوصول.
الجزء الآخر هو إعادة التوجيه. يمنحك net.ipv4.ip_forward = 1 مع ترك net.ipv6.conf.all.forwarding مضبوطاً على 0 مسار IPv4 يعمل، لكنه ينشئ ثقباً أسود لـIPv6. يختبر القارئ ذلك على هيئة «بعض المواقع بطيئة» بدلاً من ظهور خطأ يمكن البحث عنه. يجب وضع السطرين في ملف sysctl.
هل ينبغي أن يعلن VPS عن مسارات الشبكات الفرعية أيضاً؟
تنقل عقدة الخروج كل حركة الإنترنت. أما مسار الشبكة الفرعية فينقل نطاقاً خاصاً واحداً يقع خلف الجهاز الذي يعلنه. هاتان ميزتان منفصلتان، ولكل منهما موافقة مستقلة، ويمكن لجهاز واحد تنفيذ الوظيفتين.
sudo tailscale set --advertise-routes=10.0.0.0/24أعلن عن شبكة فرعية عندما يشترك VPS في شبكة خاصة مع خوادم أخرى تريد الوصول إليها عبر عناوينها الخاصة. وافق على المسار من لوحة Edit route settings نفسها، باستخدام مفتاح التبديل المخصص له.
اختر النطاق بعناية. يكون المسار المعلن أكثر تحديداً من المسار الافتراضي في حاسوبك المحمول. لذلك، يؤدي إعلان 192.168.1.0/24 من VPS إلى تولّي عناوين شبكة منزلية تستخدم النطاق نفسه، فتنقطع أجهزتك المكتبية عن الشبكة. استخدم نطاقاً اخترته بنفسك، لا النطاق الذي اختاره موجّه منزلك تلقائياً.
اجعل عقدة الخروج سريعة باستخدام إعادة توجيه UDP GRO
يمكن لـTailscale 1.54 والإصدارات الأحدث، عند تشغيلها على نواة Linux 6.2 أو أحدث، استخدام تفريغ استقبال يرفع معدل نقل البيانات المُعاد توجيهها. تدمج GRO (إعادة تفريغ الاستقبال العامة) الحزم الواردة قبل أن تعالجها النواة واحدةً تلو الأخرى. وحتى أغسطس 2026، ما تزال هذه الخطوة يدوية على عقدة الخروج.
sudo apt install -y ethtool
NETDEV=$(ip -o route get 8.8.8.8 | cut -f 5 -d " ")
sudo ethtool -K $NETDEV rx-udp-gro-forwarding on rx-gro-list offيعرض ip -o route get 8.8.8.8 الواجهة التي تصل فعلياً إلى الإنترنت، لذلك لن تضطر إلى التخمين بين eth0 وens3 وenp1s0. أكّد ذلك باستخدام ethtool -k $NETDEV | grep udp-gro-forwarding، الذي ينبغي أن يعرض الآن on.
يُفقد هذا الإعداد عند إعادة التشغيل. على نظام يشغّل networkd-dispatcher، اجعله تلقائياً:
printf '#!/bin/sh\n\nethtool -K %s rx-udp-gro-forwarding on rx-gro-list off \n' "$(ip -o route get 8.8.8.8 | cut -f 5 -d " ")" | sudo tee /etc/networkd-dispatcher/routable.d/50-tailscale
sudo chmod 755 /etc/networkd-dispatcher/routable.d/50-tailscaleتحقق أولاً من وجود /etc/networkd-dispatcher/routable.d/. إذا لم يكن موجوداً، فهذا يعني أن الجهاز لا يشغّل networkd-dispatcher، ويمكن لوحدة systemd صغيرة تشغّل السطر ethtool عند الإقلاع أن تؤدي المهمة نفسها.
ما تعنيه سياسة الاستخدام المقبول لدى مزوّدك بشأن حركة الخروج
تغادر كل حزمة يرسلها العميل عبر عقدة الخروج باستخدام عنوان IP العام لخادم VPS، لذلك تُنسب إلى حسابك. ستصل تقارير إساءة الاستخدام إلى بريدك الوارد، مثل إشعارات حقوق الطبع والنشر وشكاوى فحص المنافذ. اقرأ سياسة الاستخدام المقبول لدى مزوّدك قبل توجيه حركة منزل أو فريق عبر خادم واحد، ولا تفتح عقدة خروج لأشخاص لا يمكنك ضمان موثوقيتهم.
يُحتسب النطاق الترددي مرتين. تصل حركة الشبكة إلى خادم VPS عبر النفق، ثم تغادره مجدداً إلى الإنترنت، وعادةً يُحتسب الاتجاهان ضمن حد نقل البيانات في الخطة. ويستهلك بث فيديو تتم مشاهدته عبر عقدة خروج حصة أكبر مما يتوقعه معظم الأشخاص.
تحمل نطاقات عناوين مراكز البيانات سمعة أيضاً. تعرض بعض المواقع اختبارات CAPTCHA أكثر عند الوصول منها، وترفضها بعض خدمات البث تماماً. لا يغيّر أي إعداد لديك ذلك، لأن هذه سمة لكتلة العناوين التي يملكها مزوّدك.
لماذا ما زالت حركة الشبكة تخرج عبر اتصالك المحلي
عقدة الخروج معلنة، لكنها غير معتمدة. لا يعرض tailscale exit-node list على العميل أي مخرجات، ولا تسجل أي من الآلتين خطأً. انتقل إلى صفحة Machines وفعّل Use as exit node.
لم يحدّد العميل عقدة الخروج. تجعل الموافقة العقدة متاحة لشبكة tailnet. لكن تحديدها إجراء منفصل على كل جهاز. أعد تشغيل sudo tailscale set --exit-node=<name>، ثم تحقّق من curl -4 https://ifconfig.me مرة أخرى.
إعادة التوجيه متوقفة. العَرَض محدد: ينجح tailscale ping <vps>، ويكون النفق قائماً بوضوح، لكن تنتهي مهلة الاتصال لكل عنوان خارجي. يعرض sysctl net.ipv4.ip_forward القيمة 0. أصلح ملف sysctl، ثم شغّل sudo sysctl -p /etc/sysctl.d/99-tailscale.conf.
جدار ناري يسقط الحزم المُعاد توجيهها. ينشئ tailscaled سلسلة ts-forward الخاصة به، ويكون ذلك كافياً على VPS جديد. لكن الخادم الذي يشغّل ufw أو Docker مسبقاً قد ينتهي بسياسة FORWARD تساوي DROP، مع وجود قواعد مرتبة قبل قواعد Tailscale. لا تخمّن أي قاعدة هي السبب: شغّل sudo iptables -L FORWARD -n -v أثناء محاولة العميل تحميل صفحة، وراقب العدادات التي تتغير. على خادم يستخدم ufw، يكون الإصلاح المعتاد هو DEFAULT_FORWARD_POLICY="ACCEPT" في /etc/default/ufw، ثم تشغيل sudo ufw reload. افحص أيضاً جدار الشبكة الناري لدى مزوّد الخدمة من لوحة التحكم، لأنه عنصر تحكم مستقل عن أي شيء يعمل على الخادم.
يعمل، لكنه بطيء. شغّل tailscale netcheck على الجهازين. إذا أظهر أن UDP محجوب، فلن يتمكن الجهازان من إنشاء مسار مباشر، وسينتقلان إلى مرحّل DERP، ما يضيف زمن تأخير إلى كل اتصال. يتيح السماح بحركة UDP الواردة على المنفذ 41641 إلى VPS في جدار الشبكة الناري لدى المزوّد عادةً استعادة المسار المباشر.
متى تترك خادم التنسيق الخاص بـTailscale
يعتمد كل ما سبق على خادم التنسيق المستضاف لدى Tailscale لتبادل المفاتيح ولتنفيذ الموافقة التي نقرت عليها. تنتقل حركة الشبكة مباشرةً من الحاسوب المحمول إلى VPS، ولا ينقلها خادم التنسيق مطلقاً، لكنه يحدد من يمكنه الانضمام إلى tailnet وما الذي يمكن لكل جهاز الوصول إليه. إذا كانت هذه التبعية هي ما تريد إزالته، شغّل Headscale كخادم التحكم الخاص بك في Tailscale ووجّه العميلين إليه. تبقى خطوات exit node نفسها بعد ذلك، مع تنفيذ الموافقة على المسار عبر سطر أوامر Headscale بدلاً من وحدة التحكم المستضافة.
FAQ
لماذا لا تزال حركة الشبكة تمر عبر اتصالي المحلي بعد أن أختار عقدة الخروج؟
هناك سببان شائعان. تم الإعلان عن عقدة الخروج، لكن لم تتم الموافقة عليها: افتح صفحة Machines في وحدة تحكم الإدارة، وابحث عن VPS، واختر Edit route settings، ثم فعّل Use as exit node. الموافقة عبارة عن مفتاح تبديل في وحدة التحكم، ولا ينفّذها أي أمر على الخادم. السبب الثاني مختلف: إعادة توجيه IP متوقفة، لذلك تُنشأ النفقية، ويعمل tailscale ping إلى VPS، لكن تنتهي مهلة الاتصال بكل عنوان خارجي. تحقّق باستخدام sysctl net.ipv4.ip_forward، ويجب أن تكون قيمته 1.
هل يجب أن أوافق يدوياً على عقدة الخروج في كل مرة؟
مفتاح التبديل إجراء يُنفّذ مرة واحدة لكل جهاز. إذا كنت تعيد إنشاء VPS كثيراً، فأضف كتلة autoApprovers إلى ملف سياسة tailnet، وتضمّن فيها "exitNode": ["tag:exit"]، وعرّف tag:exit ضمن tagOwners، ثم شغّل العقدة باستخدام --advertise-tags=tag:exit. يكون الجهاز المعلَّم مملوكاً لـtailnet بدلاً من حساب المستخدم، ولذلك تتغير أيضاً قواعد الوصول المطبقة عليه.
ما خادم DNS الذي يستخدمه حاسوبي المحمول عند تفعيل عقدة الخروج؟
يستخدم عقدة الخروج نفسها. يرسل الجهاز الذي يستخدم عقدة خروج جميع استعلامات DNS إليها، وهذا يتجاوز خوادم أسماء DNS العامة وSplit DNS المحددة لـtailnet. ويمنع ذلك الشبكة المحلية من رؤية الأسماء التي تبحث عنها. للإبقاء على تطبيق أحد خوادم أسماء tailnet، فعّل Use with exit node له في صفحة DNS داخل وحدة تحكم الإدارة. تظل أسماء MagicDNS قابلة للحل، لأن عميل Tailscale يجيب عنها محلياً على 100.100.100.100.
هل يمكن أن تكون VPS واحدة عقدة خروج وموجّه شبكة فرعية في الوقت نفسه؟
نعم. sudo tailscale set --advertise-exit-node وsudo tailscale set --advertise-routes=10.0.0.0/24 مستقلان، ولكل منهما مفتاح موافقة خاص به ضمن Edit route settings. يجب تفعيل إعادة توجيه IP على VPS لكليهما. تجنب الإعلان عن نطاق يطابق شبكة حاسوبك المحمول المنزلية، لأن المسار المعلن أكثر تحديداً من المسار الافتراضي، وستصبح أجهزتك المحلية غير قابلة للوصول.
هل تخفي عقدة الخروج حركة الشبكة عن موفّر VPS الخاص بي؟
لا. تنتهي النفقية عند VPS، لذلك يغادر traffic الخادم بالشكل الذي يتوقعه الوجهة، وينقله الموفّر بنص واضح أينما كان الموقع نفسه غير مشفّر. تنقل عقدة الخروج النقطة التي تنضم عندها حركة الشبكة إلى الإنترنت من الشبكة التي تتصل بها إلى الخادم الذي تستأجره. وهي تخفي تصفحك عن شبكة Wi-Fi في المقهى وعن موفّر خدمة الإنترنت المنزلي، لكنها تعرض التصفح نفسه لموفّر VPS مع إرفاق اسم حسابك به.