لاحقة tailnet تتداخل مع اسم مضيف الخادم
اختيار لاحقة MagicDNS تكون فرعًا أو أصلاً لاسم مضيف خادم التحكم نفسه يُعطّل تحليل الأسماء بطريقة تبدو وكأنها انقطاع في DNS. اجعلهما شقيقتين: vpn.example.com للخادم، وts.example.com لـtailnet.

أي VPN شبكي يحتاج إلى جهة توزّع المفاتيح. مع Tailscale، تلك الجهة شركة؛ ومع WireGuard الخام، تلك الجهة أنت، يدويًا، إلى الأبد. Headscale هو الجواب الثالث: العميل مفتوح المصدر نفسه، يتحدث مع خادم تنسيق على خادم تستأجره دون كشف هويتك. ست خطوات نحو شبكة tailnet تكون فيها خريطة الأجهزة وقواعد الوصول ومُرحِّلات الرجوع الاحتياطي كلها ملكك — Headscale خلف Caddy، وACLs مكتوبة، وMagicDNS موجّهة إلى مُحلِّلك الخاص، وموجّه شبكة فرعية، وعقدة خروج، ومُرحِّل DERP مدمج. يكلّف الخادم $3.90 شهريًا. جُرِّب على Debian 12.
الاختيار
WireGuard، وTailscale، وHeadscale
التوفير
ثلاثة أسماء ثابتة قبل الإقلاع
نشر
Headscale، وCaddy، وإعداد واحد
التسجيل
المستخدمون، ومفاتيح ما قبل المصادقة، والعملاء
التوجيه
الشبكات الفرعية، وعقدة الخروج، وACLs
Keep
DERP، والنسخ الاحتياطي، والترقيات
WireGuard غير مكتمل عن عمد. إنه نفق صغير وسريع وقابل للتدقيق بين مفتاحين عامين، وليس له أي رأي على الإطلاق في كيفية وصول هذين المفتاحين إلى بعضهما. هذا الإغفال هو سبب جودة البروتوكول إلى هذه الدرجة — وهو أيضًا سبب كون شبكة WireGuard من خمسة عشر جهازًا جدول بيانات. كل نظير يحتاج إلى المفتاح العام والعنوان الحالي لكل نظير آخر، وكل حاسوب محمول يتنقل بين مكتب وقطار وفندق يُبطل جزءًا من ذلك الجدول.
الـVPN الشبكي هو الجواب عن هذه المشكلة بالتحديد، ويستحق شكله أن يُوصف بدقة، لأنه يحدد طبيعة الثقة التي تمنحها. يبقى مستوى البيانات كما كان تمامًا: يُنشئ كل جهاز زوج مفاتيحه بنفسه محليًا، ويحتفظ بالنصف الخاص لديه، ويُشفّر مباشرةً إلى نظرائه. وفوق هذا المستوى يقوم مستوى التحكم — خدمة صغيرة تجمع المفاتيح العامة ونقاط النهاية، وتُسلّم كل جهاز قائمة النظراء المسموح له بالتحدث معهم، وتساعد جهازين خلف أجهزة توجيه معاندة على إيجاد أحدهما الآخر. تلك الخدمة لا تحمل مفتاحًا خاصًا أبدًا، ولا ترى بايتًا واحدًا من نصّ صريح.
ما يحتفظ به فعلاً هو الخريطة، والخريطة أكثر إثارة للاهتمام مما يفترضه معظم الناس. كل اسم جهاز وكل اسم مستخدم. كل مفتاح عام. العنوان العام الذي يتصل منه كل جهاز الآن، وهو سجل حي لمكان وجود حاسوبك المحمول وهاتفك فعليًا. أوقات اتصال كل جهاز وانقطاعه، وهو ما يصف يومك. والسياسة التي تحدد من يصل إلى ماذا، وهو ما يصف مؤسستك. لا شيء من هذا يتطلب سوء نية من أحد؛ إنه ببساطة ما وُجد خادم التنسيق من أجله.
هناك خاصية إضافية أهم من البيانات الوصفية. مستوى التحكم هو الجهة التي توزّع المفاتيح، لذا فهو أيضًا الجهة التي يمكنها إضافة مفتاح. خادم تحكم مُخترق، أو مُجبَر، يمكنه إخبار أجهزتك أن جهازًا جديدًا عضو شرعي في الشبكة — وأجهزتك، وهي تفعل بالضبط ما صُممت لفعله، ستُشفّر باتجاهه. تأخذ Tailscale هذا الأمر بجدية كافية لتبني ميزة توقيع ضده. الاستضافة الذاتية تحل المشكلة نفسها من الاتجاه المعاكس: الجهة القادرة على فعل ذلك هي أنت. أربعة ترتيبات، وما يكشفه كل واحد منها فعليًا:
| الخاصية | WireGuard اليدوي | Tailscale، مُستضاف | Headscale على VPS الخاص بك | Headscale + مُرحِّل DERP خاص بك |
|---|---|---|---|---|
| من يستطيع قراءة الحمولة | لا أحد سوى النظراء | لا أحد سوى النظراء | لا أحد سوى النظراء | لا أحد سوى النظراء |
| من يحتفظ بخريطة الأجهزة | أنت، في ملف نصي | شركة، في ولايتها القضائية | أنت، على VPS الخاص بك | أنت، على VPS الخاص بك |
| من يرى من أين تتصل الأجهزة | النظراء أنفسهم فقط | خادم التنسيق، باستمرار | خادمك، باستمرار | خادمك، باستمرار |
| من يُرحِّل حين يفشل الرابط المباشر | لا أحد — الرابط يفشل ببساطة | أسطول مُرحِّلات المزوّد | لا تزال مُرحِّلات المزوّد، افتراضيًا | مُرحِّلك، في مركز بياناتك |
| إضافة الجهاز العشرين | تسعة عشر تعديلاً في الإعدادات | أمر واحد | أمر واحد | أمر واحد |
| اخترها حين | أجهزة قليلة، لا يتجول أي منها | تريد صفر مهام تشغيلية، وتتقبل أن تبقى الخريطة عند طرف آخر | تريد الخريطة وتستطيع تشغيل خادم صغير واحد | تريد الخريطة ومسار الرجوع الاحتياطي أيضًا |
العمود الأول ليس حجة وهمية. بالنسبة لحفنة ثابتة من الخوادم، فإن WireGuard المُعدّ يدويًا هو فعلاً الحل الهندسي الأفضل، وهو خدمة واحدة أقل عليك تحديثها بانتظام. هذا الدليل يتناول النقطة التي يتوقف عندها جدول البيانات عن أن يكون أمرًا مسليًا.
هناك ثلاث إجابات صادقة عن "أريد أن تصل أجهزتي إلى بعضها بشكل خاص"، واحدة منها فقط هي هذا الدليل. WireGuard الخام هو الأصغر: وحدة نواة، وملف إعدادات واحد لكل نظير، ولا خدمة خلفية تتجاوز الواجهة، ولا شيء عليك إبقاؤه محدّثًا سوى نظام التشغيل. إن كانت أجهزتك خوادم بعناوين ثابتة ويمكنك عدّها على يد واحدة، فتوقف هنا واقرأ دليل WireGuard بدلاً من ذلك. ستحصل في النهاية على برنامج أقل وقائمة أقصر من الأشياء التي يمكن أن تتعطل.
Tailscale هو الأكبر: نفس WireGuard في الأساس، إضافةً إلى خدمة تنسيق، واجتياز NAT يعمل من خلف كل شيء تقريبًا، وأسطول مُرحِّلات على عدة قارات، ولوحة تحكم على الويب، وتسجيل دخول موحّد، وعقد دعم فني. إنه برنامج ممتاز فعلاً، وتغطي فئته المجانية احتياجات منزل واحد براحة. الثمن ليس مالاً — بل أن خريطة كل جهاز تملكه، وسجلّ المكان الذي يتصل منه كل جهاز، يعيشان في قاعدة بيانات شركة.
Headscale هو الجواب الثالث، وهو أضيق نطاقًا من كليهما: إعادة تنفيذ مفتوحة المصدر لخادم التنسيق، تُشغّلها أنت، ويتحدث معها العميل الرسمي نفسه. تحتفظ بالأتمتة واجتياز NAT؛ وتتحمّل في المقابل خدمة صغيرة عليك تشغيلها، ومجموعة ميزات جزئية، وترقيات تحتاج إلى قراءة قبل تطبيقها. لا ينبغي لأحد أن يدّعي أن ذلك مجاني. إنه يشتري لك شيئًا واحدًا بالتحديد، وهو ما يهتم به هذا الموقع: لا أحد آخر يحتفظ بالخريطة.
إعداد WireGuard اليدوي يتضاعف مع مربع حجم الأسطول: أربعة نظراء يعني ستة روابط، وعشرة نظراء يعني خمسة وأربعين رابطًا، وعشرون نظيرًا يعني مئة وتسعين رابطًا. أضف حاسوبًا محمولاً متجولاً، تتغيّر نقطة نهايته مع كل شبكة ينضم إليها، وتتوقف الصيانة عن أن تكون أمرًا عرَضيًا. عمليًا، تقع نقطة التحول في حدود خمسة أجهزة، أو عند أول جهاز يتنقل يوميًا، أو عند أول قاعدة وصول لا يمكنك التعبير عنها بعبارة "الجميع يصل إلى كل شيء".
شيء إضافي عليك تقريره الآن لا لاحقًا، لأنه يغيّر ما تُثبّته: هل هذه الشبكة لك وحدك، أم سينضم إليها أشخاص آخرون. شبكة tailnet لشخص واحد يمكن أن تبقى مفتوحة تمامًا من الداخل دون أن يحدث أي مكروه. أما شبكة tailnet يشارك فيها زميل أو مقاول أو أحد أفراد الأسرة فتحتاج إلى قواعد وصول مكتوبة منذ الأسبوع الأول — الخطوة 05 — وتحتاج إلى أن يكون المستخدمون منفصلين بدل أن يتشارك الجميع تسجيل دخول واحد. تقرير هذا الأمر مسبقًا يكلّفك فقرة واحدة؛ وتداركه لاحقًا يكلّفك بعد ظهر كاملاً.
اطلب الخادم أولاً. في اللوحة: اطلب → VPS → Sentinel، والصورة Debian 12، في أي حصن تريد أن تقيم فيه الخريطة — هلسنكي أو ستوكهولم أو أوسلو أو ريكيافيك. لا حاجة إلى عنوان بريد إلكتروني لفتح الحساب، وتُسدَّد الفاتورة بـMonero أو Bitcoin أو Lightning أو أي أصل آخر مدعوم. اختر الحصن الأقرب إلى غالبية أجهزتك إن كنت تنوي أيضًا تشغيل المُرحِّل من الخطوة 06؛ فزمن الاستجابة إلى المُرحِّل هو زمن استجابة على كل اتصال يحمله.
ثم نفّذ قائمة تحصين الساعة الأولى — SSH بالمفتاح فقط على منفذ مُغيَّر، وترقيات تلقائية بلا إشراف، وجدار حماية بسياسة الرفض الافتراضي. كل ما يلي يفترض خادمًا ليس ملكًا لجهة أخرى أصلاً، وهذا الخادم يستحق أكثر من معظم الخوادم الأخرى: إنه الجهاز الذي يقرر أي المفاتيح موثوقة على كل جهاز تملكه.
كل جهاز يُدمج الأسماء الثلاثة في حالته لحظة انضمامه، فتغيير أحدها لاحقًا يعني إعادة تسجيل الأسطول بأكمله يدويًا. أولاً: عنوان URL لخادم التحكم — العنوان العام عبر HTTPS الذي سيتصل به كل عميل بالضبط، بما في ذلك المخطط واسم المضيف. ثانيًا: لاحقة DNS الخاصة بـtailnet، وهي النطاق الذي ستجيب عنه MagicDNS داخليًا؛ ويجب أن يكون نطاقًا تتحكم فيه، وألا يكون فرعًا أو أصلاً لاسم مضيف خادم التحكم نفسه، فهذا هو أكثر أخطاء الإقلاع الأول شيوعًا. ثالثًا: نطاقات العناوين التي توزعها tailnet، وهي تقليديًا كتلة 100.64.0.0/10 المخصصة لـNAT من فئة مشغلي الاتصالات لعناوين IPv4، وعنوان محلي فريد من فئة /48 لعناوين IPv6؛ اترك القيم الافتراضية إلا إذا كانت تتعارض بالفعل مع شبكة تستخدمها.
مثال عملي، والشكل الذي يجدر نسخه: يستجيب خادم التحكم على vpn.example.com، ولاحقة tailnet هي ts.example.com، وتبقى النطاقات على قيمها الافتراضية. لاحظ أن اللاحقة شقيقة لاسم مضيف التحكم لا فرع منه — فـvpn.example.com وts.example.com يتشاركان نطاقًا قابلاً للتسجيل لكن لا يحتوي أحدهما الآخر. وجّه سجل A — وسجل AAAA إن أردته قابلاً للوصول عبر IPv6 — نحو الخادم، وامنحه وقتًا لينتشر قبل أن تبدأ، لأن الوكيل العكسي سيحاول الحصول على شهادة لذلك الاسم أول مرة يُقلع فيها.
ثم اكتب قواعد جدار الحماية بينما لا شيء يستمع بعد. خادم التحكم نقطة نهاية عامة عبر HTTPS بالضرورة: يجب أن يتمكن كل جهاز، على كل شبكة، من الوصول إليه. منفذ UDP لا تحتاج إليه إلا إذا كنت تنوي تشغيل مُرحِّلك الخاص في الخطوة 06، ومن الأسهل فتحه الآن بدل تشخيص غيابه لاحقًا.
ufw default deny incoming
ufw allow 47222/tcp # administrative SSH, moved
ufw allow 80/tcp # ACME HTTP-01 challenge
ufw allow 443/tcp # the control server, and DERP over HTTPS
ufw allow 3478/udp # STUN, only if you run your own relay
ufw enable
ufw status numbered
ثبّت Docker من المستودع الرسمي بدل حزمة التوزيعة، حتى يكون Compose v2 موجودًا ومحدّثًا. ثم أنشئ المجلدين اللذين سيحملان كل ما يستحق النسخ الاحتياطي — واحد للإعدادات، وآخر للحالة — وقاوم إغراء وضع أي شيء آخر فيهما.
curl -fsSL https://get.docker.com | sh
docker compose version
install -d -m 0750 /srv/headscale/config
install -d -m 0750 /srv/headscale/data
cd /srv/headscale
Headscale وCaddy، ولا شيء غيرهما. يستمع Headscale عبر HTTP العادي داخل شبكة Docker؛ وCaddy يُنهي TLS، ويحصل على الشهادة عند الإقلاع الأول، ويجدّدها دون أن يُطلب منه ذلك. مستمع المقاييس يبقى على localhost، لأنه واجهة تصحيح أخطاء داخلية لا واجهة عامة.
قاعدة واحدة قبل الملف: ثبّت صورة الحاوية على إصدار محدد بدقة. Headscale برنامج لم يبلغ الإصدار 1.0 بعد، وقد أعاد تسمية مفاتيح الإعدادات وأوامر CLI الفرعية عبر إصدارات ثانوية متعاقبة أكثر من مرة. الوسم العائم يحوّل إعادة تشغيل روتينية للحاوية إلى انقطاع في خدمة مهمتها أن تتيح لك الوصول إلى كل شيء آخر.
/srv/headscale/docker-compose.yml
services:
headscale:
image: docker.io/headscale/headscale:0.26 # pin it; never :latest
container_name: headscale
command: serve
volumes:
- ./config:/etc/headscale
- ./data:/var/lib/headscale
ports:
- "3478:3478/udp" # STUN, for your own DERP
restart: unless-stopped
caddy:
image: caddy:2-alpine
container_name: caddy
ports:
- "80:80"
- "443:443"
volumes:
- ./Caddyfile:/etc/caddy/Caddyfile:ro
- caddy_data:/data
restart: unless-stopped
volumes:
caddy_data:
/srv/headscale/Caddyfile
vpn.example.com {
reverse_proxy headscale:8080
}
هذه هي إعدادات الوكيل بأكملها. يتحدث Caddy بـHTTP/2 ويُرقّي الاتصالات طويلة الأمد دون أن يُطلب منه ذلك، وهذا مهم هنا لأن كل عميل يُبقي اتصالاً مفتوحًا لتلقي تحديثات الخريطة. خذ ملف الإعدادات النموذجي المرفق مع الإصدار الذي ثبّته وعدّله بدل كتابة واحد من الصفر — فالملف طويل، ومعظمه إعدادات افتراضية منطقية، والمفاتيح المهمة هي هذه:
/srv/headscale/config/config.yaml — the lines that matter
server_url: https://vpn.example.com # exactly what clients will dial
listen_addr: 0.0.0.0:8080 # inside the Docker network only
metrics_listen_addr: 127.0.0.1:9090 # debug surface, keep it local
prefixes:
v4: 100.64.0.0/10
v6: fd7a:115c:a1e0::/48
noise:
private_key_path: /var/lib/headscale/noise_private.key
database:
type: sqlite # postgres for a large fleet
sqlite:
path: /var/lib/headscale/db.sqlite
dns:
magic_dns: true
base_domain: ts.example.com # NOT a parent or child of server_url
nameservers:
global:
- 1.1.1.1 # replaced by your own in step 05
شغّله، ثم اقرأ السجل بدل أن تخمّن. الإقلاع الأول الذي يعجز عن الحصول على شهادة، أو الذي يرفض لاحقة DNS لأنها تتداخل مع اسم مضيف الخادم، يقول ذلك بوضوح ثم يتوقف.
docker compose up -d
docker compose logs -f headscale
# From your laptop — a control server that is up answers this:
curl -s https://vpn.example.com/health
الإقلاع الأول يُنشئ مادة المفتاح الخاص في /srv/headscale/data. انسخها إلى مكان آمن الآن، قبل أن يُسجَّل أي جهاز، ومرة أخرى بعد أول عملية تسجيل: فقدان ذلك المفتاح يعني أن كل جهاز سيرفض الخادم الذي كان يثق به، والإصلاح الوحيد هو إعادة تسجيل الجميع يدويًا. الخطوة 06 تحوّل تلك النسخة إلى نسخة احتياطية حقيقية.
الأمر headscale يعيش داخل الحاوية، لذا فكل إجراء إداري هو عملية docker exec. أنشئ مستخدمًا أولاً — المستخدم هو مالك الأجهزة والوحدة التي تشير إليها قواعد الوصول، فأعطه اسم شخص أو دور بدل اسم جهاز.
hs() { docker exec -it headscale headscale "$@"; }
hs users create alice
hs users list # note the numeric id — newer releases want it
# A single-use key that expires in an hour is the right default.
hs preauthkeys create --user 1 --expiration 1h
ثم شغّل العميل الرسمي على الجهاز، موجّهًا إياه نحو خادمك بدل الخادم الافتراضي. هذه معلمة مدعومة رسميًا، لا حل التفافي — فالعميل مفتوح المصدر وخادم تسجيل الدخول مجرد معلمة قابلة للتغيير.
# On the device (Debian/Ubuntu shown; every platform has an equivalent):
curl -fsSL https://tailscale.com/install.sh | sh
sudo tailscale up \
--login-server https://vpn.example.com \
--auth-key <the-key-you-just-created>
tailscale status
tailscale ip -4
بدون مفتاح ما قبل مصادقة، يطبع العميل عنوان URL بدلاً من ذلك؛ وزيارته تُظهر أمر تسجيل لتنفيذه على الخادم، وهذا هو المسار التفاعلي المناسب لجهاز تجلس أمامه مباشرة. في الحالتين، نفّذ الجهاز الثاني قبل أن تحتفل — فشبكة من جهاز واحد لا تُثبت شيئًا. نفّذ عليه ping عبر عنوانه على tailnet، ثم اقرأ مخرجات الحالة بعناية:
hs nodes list
# On a client, the word after the peer name is the one that matters:
tailscale status
# 100.64.0.2 laptop alice linux active; direct 203.0.113.9:41641
# ^^^^^^ direct, not relay
tailscale netcheck # why it chose what it chose
direct تعني أن الجهازين وجد كل منهما الآخر وأن حركة البيانات تسير من نظير إلى نظير مباشرة. relay تعني أنها تمر عبر خادم DERP، وهو أمر يعمل جيدًا لكنه يضيف زمن استجابة ويُقحم جهازًا ثالثًا في المسار — وهذا الجهاز، افتراضيًا، ليس ملكك. الخطوة 06 مخصصة لضبط أيّهما يكون.
أجهزة سطح المكتب تقبل معلمة سطر أوامر. أما Android فيعرض إعداد الخادم المخصص داخل التطبيق، خلف رقم الإصدار في شاشة الإعدادات. منصات Apple لا تملك حقلاً داخل التطبيق: تُثبّت ملف تعريف إعدادات صغيرًا يضبط عنوان URL لخادم التحكم قبل تسجيل الدخول، وهو أمر متعب لمرة واحدة لكنه دائم بعدها. أمران يوفران الوقت. تحقق من صفحة Headscale الخاصة بكل عميل في توثيقها بدل التخمين، لأن مسار Apple تغيّر أكثر من مرة. وسجّل خروج التطبيق من خدمة Tailscale نفسها أولاً — فالتطبيق الذي يحمل جلسة هناك بالفعل غالبًا ما يرفض خادمًا مختلفًا حتى يتم تسجيل خروجه، أو إعادة تثبيته.
عادتان تستحقان التبني فورًا. استخدم مفاتيح ما قبل مصادقة أحادية الاستخدام وقصيرة الأجل للأشخاص، ومفاتيح قابلة لإعادة الاستخدام أو زائلة فقط للأتمتة التي تحتاجها فعلاً — المفتاح الزائل يُسجّل جهازًا يُزيل نفسه حين يصبح غير متصل، وهذا صحيح تمامًا بالنسبة لمُشغِّل CI وخاطئ تمامًا بالنسبة لحاسوب محمول. وقرر موقفك من انتهاء صلاحية المفاتيح الآن: كل جهاز مُسجَّل يحمل تاريخ انتهاء صلاحية، والجهاز الذي تنتهي صلاحية مفتاحه يتوقف عن أن يكون قابلاً للوصول حتى تُعيد جهة ما مصادقته. هذه ميزة أمنية على حاسوب محمول، ومولّد أعطال على خادم بلا واجهة رسومية في الثالثة فجرًا. تحقق من كيفية إدارة إصدارك لانتهاء الصلاحية — فالأوامر الفرعية تغيّر مكانها — واضبطه عن قصد لكل جهاز بدل اكتشاف القيمة الافتراضية بالطريقة الصعبة.
شبكة tailnet يصل فيها كل جهاز إلى كل جهاز آخر مفيدة أصلاً بحد ذاتها. ثلاث إضافات تحوّلها إلى شبكة حقيقية بدل مجرد مجموعة أنفاق، وتشترك الثلاث في خاصية واحدة تُوقع الناس في الخطأ: العميل يُعلن عن قدرة معينة، ويجب على الخادم أن يوافق عليها. المسار الذي يُعلَن عنه دون أن تتم الموافقة عليه ببساطة لا وجود له، بصمت، والعرَض هو أنك تستطيع عمل ping للموجّه لكن لا شيء خلفه يستجيب.
موجّه شبكة فرعية — ضع شبكة LAN بأكملها على tailnet. جهاز واحد على شبكة منزلية أو مكتبية يُعلن عن نطاق تلك الشبكة؛ عندها يصل كل جهاز آخر إلى الطابعات وأجهزة NAS وواجهات الإدارة الموجودة خلفه دون تثبيت أي شيء إضافي هناك. فعّل التمرير (forwarding) في النواة أولاً، وإلا توقفت الحزم عند الموجّه دون أي رسالة خطأ.
# On the machine that sits inside the LAN:
echo 'net.ipv4.ip_forward = 1' | sudo tee /etc/sysctl.d/99-ts.conf
echo 'net.ipv6.conf.all.forwarding = 1' | sudo tee -a /etc/sysctl.d/99-ts.conf
sudo sysctl -p /etc/sysctl.d/99-ts.conf
sudo tailscale up --login-server https://vpn.example.com \
--advertise-routes=192.168.1.0/24 --accept-routes
# On the control server — approve it, or it does not exist.
# The subcommand moved between releases; check `hs nodes --help` first.
hs nodes list
hs nodes approve-routes --identifier 3 --routes 192.168.1.0/24
عقدة خروج — أرسل كل شيء عبر VPS. الآلية نفسها لكن بمسار أوسع: الجهاز الذي يُعلن عن نفسه كعقدة خروج يعرض حمل اتصال جهاز آخر بالإنترنت بأكمله. على شبكة مقهى أو فندق غير موثوقة، هذا بالضبط ما تريده، وهو أقرب شيء في هذا الدليل إلى VPN شخصي.
# On the VPS that will do the exiting (forwarding must be on, as above):
sudo tailscale up --login-server https://vpn.example.com --advertise-exit-node
# Approve it on the control server, then on the laptop:
tailscale set --exit-node=100.64.0.1 --exit-node-allow-lan-access
tailscale set --exit-node= # turn it off again
عقدة الخروج ليست VPN تجاريًا، ولا ينبغي أن تُقنع نفسك بأنها كذلك. عنوانها ملكك وحدك وهو ثابت، وهذا ممتاز في مواجهة شبكة Wi-Fi المقهى، لكنه عديم الجدوى في مواجهة الربط طويل الأمد بين مواقع مختلفة — والمفاضلة موضحة بالتفصيل في الدليل المحوري. لاحظ أيضًا أنه يمكنك تشغيل عقدة الخروج على VPS ثانٍ أرخص، وإبقاء خادم التحكم خاليًا تمامًا من الحركة المُرحَّلة.
قواعد الوصول — اكتبها قبل أن ينضم شخص ثانٍ. السياسة الافتراضية هي "السماح بكل شيء"، وهذا صحيح لشبكة tailnet لشخص واحد وخاطئ من اللحظة التي ينضم فيها شخص آخر. السياسة هي مستند HuJSON صغير: مجموعات من المستخدمين، ووسوم للأجهزة، وقائمة قواعد تحدد أي المصادر يمكنها الوصول إلى أي الوجهات وعبر أي المنافذ. وجّه الإعدادات نحو الملف، واحتفظ بالملف تحت نظام التحكم بالإصدارات، وأعد التحميل بعد كل تعديل.
{
"groups": {
"group:admin": ["alice"],
"group:contractor":["bob"]
},
"tagOwners": {
"tag:server": ["group:admin"],
"tag:exit": ["group:admin"]
},
"acls": [
// Admins reach everything.
{ "action": "accept", "src": ["group:admin"], "dst": ["*:*"] },
// The contractor reaches one machine, on two ports, and nothing else.
{ "action": "accept", "src": ["group:contractor"],
"dst": ["tag:server:22,443"] }
],
"autoApprovers": {
"routes": { "192.168.1.0/24": ["tag:server"] },
"exitNode": ["tag:exit"]
}
}
ملاحظتان بخصوص ذلك الملف. لغة السياسة هي لغة Tailscale، وHeadscale يُنفّذ مجموعة جزئية كبيرة ومتنامية منها لا كلها — تحقق من توثيق إصدارك قبل الاعتماد على قاعدة غير مألوفة. كما أن مكان إقامة السياسة قد تغيّر: الإصدارات الأقدم كانت تُسمّي مسارًا في الإعدادات على المستوى الأعلى، بينما تجمعها الإصدارات الأحدث تحت قسم للسياسة له نمط يمكنه أيضًا الاحتفاظ بالقواعد في قاعدة البيانات. كلا الأسلوبين موثّق؛ والمهم هو الأسلوب الذي يعتمده الإصدار الذي ثبّته أنت.
MagicDNS — أسماء مختصرة، ومُحلِّلك الخاص في كل مكان. مع تفعيل MagicDNS، يستجيب كل جهاز لاسم مختصر داخل اللاحقة التي اخترتها في الخطوة 02، لذا يعمل الأمر ssh nas من أي مكان دون الحاجة إلى ملف hosts. النصف الثاني هو الأكثر إثارة للاهتمام: خادم التحكم يدفع أيضًا قائمة خوادم أسماء إلى كل عميل، ما يعني أن المُحلِّل الذي بنيته في دليل مُحلِّل DNS الخاص يمكنه خدمة هاتفك على بيانات الجوّال — بالفلترة والتخزين المؤقت ودون تسجيل أي شيء — بينما يستمع على عنوان tailnet غير قابل للوصول من الإنترنت على الإطلاق.
dns:
magic_dns: true
base_domain: ts.example.com
override_local_dns: true # beat whatever DHCP handed the device
nameservers:
global:
- 100.64.0.5 # your resolver, on the tailnet
المُرحِّل الذي نسيت أنك تستخدمه. حين يعجز جهازان عن فتح اتصال مباشر — NAT متماثل على الطرفين، أو جدار حماية يبتلع UDP، أو مشغّل يفعل شيئًا مبتكرًا — تعود حركة البيانات إلى مُرحِّل DERP. تبقى مُشفّرة من طرف إلى طرف، فيحمل المُرحِّل نصًا مشفّرًا. ما يراه المُرحِّل هو من يتحدث مع من، وكمّ ذلك، ومتى. بشكل افتراضي، يُسلّم Headscale عملاءك خريطة المُرحِّلات العامة، وتلك المُرحِّلات تُشغّلها الشركة التي كنت تحاول الابتعاد عنها. يأتي Headscale مزوّدًا بمُرحِّل مدمج؛ وتفعيله يضع ذلك المسار الاحتياطي في نفس مركز البيانات النوردي الذي يقيم فيه كل شيء آخر هنا.
derp:
server:
enabled: true
region_id: 999 # custom regions live in the 900s
region_code: "nb-hel"
region_name: "Helsinki (self-hosted)"
stun_listen_addr: "0.0.0.0:3478"
urls:
- https://controlplane.tailscale.com/derpmap/default # remove for yours only
auto_update_enabled: true
update_frequency: 24h
الإبقاء على الخريطة العامة إلى جانب منطقتك الخاصة هو الخيار الافتراضي العملي: العملاء يفضّلون أقرب مُرحِّل، فالجهاز الموجود في نفس نصف الكرة الأرضية يحصل على مُرحِّلك، والجهاز الموجود في الطرف الآخر من العالم لا يبقى عالقًا خلف قفزة نوردية وحيدة. إزالة العنوان العام تجعل شبكة tailnet مكتفية ذاتيًا تمامًا، على حساب مسار رجوع احتياطي أضعف للأجهزة البعيدة. كلا الخيارين مدافَع عنه؛ اختر عن دراية لا عن إغفال.
أربعة ملفات، خارج الموقع، مُشفّرة. النسخة الاحتياطية صغيرة إلى درجة تجعل غيابها أمرًا محرجًا: قاعدة البيانات، ومادة المفتاح الخاص، وملف الإعدادات، وملف السياسة. مجتمعة، هي هامش تقريب على أي فاتورة تخزين، وبدون مادة المفتاح يرفض كل جهاز على الشبكة الخادم. أرسلها إلى مكان غير هذا الخادم — ويُفضّل أن يكون في ولاية قضائية ثانية، وهذا ما يتناوله دليل النسخ الاحتياطي — واسترجعها على VPS تجريبي مرة واحدة، عن قصد، قبل أن تحتاج إلى ذلك فعلاً.
# Stop briefly for a consistent SQLite copy, or use .backup on a live db.
docker compose stop headscale
tar czf /tmp/headscale-$(date +%F).tar.gz -C /srv/headscale config data
docker compose start headscale
restic -r sftp:backup@backup.example.com:/srv/restic backup \
/tmp/headscale-$(date +%F).tar.gz
الترقيات، وهي الخطر الحقيقي. هذا برنامج لم يبلغ الإصدار 1.0 بعد، وهو يتصرف على هذا الأساس: أُعيدت تسمية مفاتيح الإعدادات، وانتقلت أوامر CLI الفرعية، واحتاج إصدار ما أكثر من مرة إلى ترحيل موثّق بدل مجرد إعادة تشغيل. لا شيء من هذا سبب لتجنبه — بل هو سبب لاتباع روتين ثابت. اقرأ ملاحظات الإصدار قبل السحب. خذ النسخة الاحتياطية المذكورة أعلاه أولاً. قارن ملف إعداداتك بالمثال المرفق مع الإصدار الجديد، لأن هذا هو المكان الذي تُعلن فيه المفاتيح المُعاد تسميتها عن نفسها. ارتقِ بإصدار ثانوي واحد في كل مرة بدل ثلاثة. واحتفظ بوسم الصورة القديم مكتوبًا في مكان ما، لأن التراجع الذي يمكنك تنفيذه في ثلاثين ثانية هو ما يجعل الأمر برمته منخفض المخاطر.
ثم اضبط تذكيرًا شهريًا للنظر في أمرين: قائمة الأجهزة المسجَّلة، حتى تتوقف الأجهزة التي أوقفتها منذ ستة أشهر عن كونها أعضاء، وتواريخ انتهاء الصلاحية، حتى لا يسقط شيء بصمت في لحظة سيئة. الـVPN الشبكي واحد من الخدمات القليلة التي تفشل بهدوء — يستمر كل شيء في العمل حتى تلك المرة الوحيدة التي تحتاج فيها الجهاز الذي انتهت صلاحيته بصمت.
استضافة مستوى التحكم بنفسك تحسين حقيقي ومحدد، وهي ليست خدعة اختفاء. خمسة أشياء تبقى صحيحة بعد إنجاز كل ما سبق، ومعرفتها هي الفارق بين دفاع حقيقي وقصة مطمئنة فقط.
خادم التحكم نقطة نهاية عامة ومُسمّاة. كل جهاز يتصل به، لذا فهو يملك اسم مضيف، وذلك الاسم يُنشر في سجلات شفافية الشهادات لحظة إصدار الشهادة. إنه قابل للاكتشاف حتى لو لم تربطه بأي مكان أبدًا، وعنوانه هو الثابت الوحيد المشترك بين كل أجهزتك. استخدم نطاقًا فرعيًا من اسم تنشره أصلاً بدل اسم يصف طبيعة الخادم.
Headscale إعادة تنفيذ، وهو يصرّح بذلك. إنه غير مبني ولا مدعوم من Tailscale، والتكافؤ في الميزات جزئي بحكم طبيعته، وبعض ما يبيعه المنتج المُستضاف تجاريًا — لوحة التحكم على الويب، وأسطول المُرحِّلات العام، ومسارات تسجيل الدخول الموحّد المصقولة — إما غير موجود هنا أو هو مشروع من جهة خارجية لم يدقّقه أحد. اقرأ توثيق المشروع لمعرفة ما إذا كانت ميزة ما موجودة قبل أن تبني عليها خطة، وتعامل مع الترقيات بوصفها مهمة تتطلب انتباهك لا عملية تجري في الخلفية.
المُرحِّلات الافتراضية لا تزال ملكًا لجهة أخرى. إلى أن تُفعّل خادم DERP المدمج، يعود أي اتصال يعجز عن أن يصبح مباشرًا إلى أسطول المُرحِّلات العام. تبقى الحمولة مُشفّرة من طرف إلى طرف ولا يستطيع أحد قراءتها — لكن حقيقة أن جهازين من أجهزتك يتحدثان، وكمّ ذلك الحديث، تمر عبر بنية تحتية لا تملكها. هذا هو الجزء من سلسلة الثقة الذي يفوت على معظم الناس في أول بعد ظهر.
عقدة الخروج عنوان ثابت، لا حشد من الناس. توجيه حركة بياناتك عبر VPS خاص بك يُفشل شبكة المقهى وتنميط ISP لك. لكنه لا يُفشل الربط، لأن ذلك العنوان يخصك وحدك ولا يتغيّر. العنوان المشترك لـVPN تجاري أسوأ من كل النواحي إلا في الناحية الوحيدة المهمة بالنسبة لهذا التهديد بالذات.
الجهاز لا يزال داخل مبنى. الخادم المستأجَر يعمل على عتاد فعلي داخل مركز بيانات له أبواب وموظفون. ما يتغيّر هو عدم وجود فهرس على مستوى المنتج لأجهزتك، ولا قاعدة بيانات لدى شركة تسجّل من أين يتصل كل جهاز، ولا سياسة خصوصية يمكن تعديلها في الربع القادم. أما ما لا يتغيّر فهو أن القرص مادي فعلي، وهو ليس في منزلك.
ما اشتريته فعليًا، بدقة: قائمة كل جهاز تملكه، وسجل المكان الذي يتصل منه كل واحد منها، وصلاحية إضافة جهاز جديد، كلها محفوظة على خادم تستأجره دون اسم محدد. هذا ادعاء ضيق النطاق، لكنه حقيقي. وهو يستحق ما يكلفه فقط إذا أُنجزت الخطوة 06 — فمستوى تحكم ذاتي الاستضافة بلا استعادة مُختبَرة ليس تحسينًا في الخصوصية، بل نقطة فشل وحيدة ذات صورة تسويقية أفضل.
| الفئة | شهرياً | الموارد | ما يشغّله براحة |
|---|---|---|---|
| Sentinel | $3.90 | 2 vCPU · 4 GB · 120 GB · 1 Gbps | خادم التحكم، ومُرحِّل، واستخدام خفيف لعقدة الخروج. البداية الصحيحة. |
| خادم Sentinel ثانٍ | $3.90 | عقدة الخروج، على خادمها الخاص | يُبقي الحركة المُمرَّرة بعيدًا عن مستوى التحكم |
| Ravelin | $16.90 | 8 vCPU · 16 GB · 480 GB · 2.5 Gbps | عقدة خروج للاستخدام اليومي في المنزل، بأقصى سرعة للخط |
| Bulwark | $32.90 | 16 vCPU · 32 GB · 960 GB · 5 Gbps | عقدة خروج تابعة لشركة ومُرحِّل مزدحم، معًا |
لا شيء في هذا الجدول مُقاس بحسب حِمل التنسيق. خادم التحكم يحمل اتصالاً خاملاً واحدًا لكل جهاز وقاعدة بيانات تُقاس بالكيلوبايت؛ وبضع مئات من الأجهزة لن تُثقل حتى أصغر فئة. ما يستهلك موارد الخادم هو الحركة المُمرَّرة — الاتصالات المُرحَّلة، والأهم من ذلك بكثير، عقدة خروج تحمل اتصال إنترنت شخص بأكمله. احسب الحجم بناءً على الرابط الصاعد وإنتاجية التشفير، وتذكّر أن النطاق الترددي غير محدود في كل الفئات، فالسؤال الوحيد هو ما مدى السرعة التي تريدها.
اختيار لاحقة MagicDNS تكون فرعًا أو أصلاً لاسم مضيف خادم التحكم نفسه يُعطّل تحليل الأسماء بطريقة تبدو وكأنها انقطاع في DNS. اجعلهما شقيقتين: vpn.example.com للخادم، وts.example.com لـtailnet.
العميل يُبلّغ بارتياح أنه يُعلن عن 192.168.1.0/24، لكن لا شيء خلف الموجّه يستجيب، لأن الخادم لم يوافق عليه قط. لا يوجد أي خطأ في أي مكان. وافق عليه على الخادم، ثم تحقق من قائمة المسارات بدل العميل.
الشبكة التي تحجب UDP الصادر تُجبر كل اتصال على المرور عبر مُرحِّل: الأمر يعمل، لكنه أبطأ، ويُقحم جهازًا ثالثًا في المسار. الأمر tailscale status يعرض relay بدلاً من direct، والأمر netcheck يوضح السبب. أصلح جدار الحماية أو تقبّل تلك القفزة الإضافية عن علم.
شبكة tailnet جديدة تتيح لكل جهاز الوصول إلى كل جهاز آخر عبر كل منفذ. هذا صحيح بالنسبة لشخص واحد، وخاطئ من اللحظة التي ينضم فيها حاسوب مقاول محمول — بما يشمل واجهات الإدارة التي لم يكن يعلم أصلاً بوجودها. اكتب السياسة قبل توجيه الدعوة.
أعد بناء الخادم، واسترجع قاعدة البيانات، وانسَ مادة المفتاح — عندها يرفض كل جهاز الخادم الذي كان يثق به بالأمس. لا يوجد تعافٍ ذكي هنا؛ هناك فقط يوم كامل من إعادة تسجيل الهواتف يدويًا. انسخ مجلد البيانات قبل أن ينضم أول جهاز.
أُعيدت تسمية مفاتيح الإعدادات وأوامر CLI الفرعية عبر إصدارات ثانوية متعاقبة. ومع استخدام الوسم :latest، تؤدي إعادة تشغيل لا علاقة لها بالأمر إلى سحب إصدار جديد فيتوقف مستوى التحكم الخاص بأسطولك بأكمله. ثبّت الوسم، واقرأ الملاحظات، ورقِّ عن قصد.
أحد عشر سؤالًا يتكرر طرحها أثناء بناء هذا — بدءًا بالسؤالين اللذين يحددان ما إذا كان ينبغي عليك بناؤه أصلًا.
لا، ويستحق الأمر أن نكون دقيقين بشأن معناه. Headscale إعادة تنفيذ مستقلة ومفتوحة المصدر لـخادم التنسيق — الجزء من Tailscale الذي يوزّع المفاتيح العامة ونقاط النهاية والسياسات. إنه غير مبني ولا مُباع ولا مدعوم من Tailscale، ولا يحمل أي عقد دعم تجاري، وإن تعطّل فأنت تقرأ متتبّع المشكلات (issue tracker) بدل فتح تذكرة دعم. ما يفعله فعلاً هو التحدث بالبروتوكول الذي يتحدث به أصلاً عميل Tailscale الرسمي مفتوح المصدر، ولهذا يعمل العميل معه دون أي تعديل. تترتب على ذلك نتيجتان عمليتان. التكافؤ في الميزات جزئي وسيبقى كذلك دائمًا، لأن المشروع يطارد هدفًا متحركًا يحافظ عليه فريق أكبر بكثير — تحقق من توثيق المشروع نفسه لمعرفة ما إذا كانت ميزة ما موجودة قبل أن تبني تصميمك حولها. والترقيات تستحق عناية أكبر من ترقية حاوية عادية: أُعيدت تسمية مخطط الإعدادات وعدة أوامر CLI فرعية عبر إصدارات ثانوية متعاقبة، وهذا هو السبب الأكثر شيوعًا الذي يجعل الناس يُعطّلون تثبيتًا كان يعمل.
لا — وهذا هو الجزء من البنية الذي يستحق أن تفهمه بدل أن تأخذه على الثقة. كل جهاز يُنشئ زوج مفاتيح WireGuard الخاص به محليًا، ولا يغادره النصف الخاص أبدًا. ما يرفعه الجهاز إلى خادم التحكم هو مفتاحه العام، ونقاط نهايته الحالية، وبعض البيانات الوصفية؛ وما يُنزّله هو الشيء نفسه بالنسبة لكل جهاز آخر مسموح له بالوصول إليه. تُتفاوض الأنفاق بعدها مباشرة بين الأجهزة، والتشفير هو WireGuard العادي بين مفتاحين لم يحملهما الخادم قط. لذا لا يستطيع خادم التحكم فك تشفير أي شيء، وهذا صحيح أيضًا بالنسبة لخادم Tailscale. ما يستطيعه شيء مختلف وأقل تداولاً: إنه يحتفظ بالخريطة. أسماء الأجهزة، وأسماء المستخدمين، والمفاتيح العامة، وعنوان IP العام الذي يتصل منه كل جهاز حاليًا، وأي جهاز استيقظ في الثالثة فجرًا، والسياسة التي تحدد من يصل إلى من. وهو أيضًا الجهة التي توزّع المفاتيح، لذا فخادم تحكم مُخترق أو مُجبَر يمكنه إضافة جهاز إلى شبكتك. الاستضافة الذاتية لا تحل مشكلة رياضية؛ إنها تنقل مشكلة إدارية إلى خادم تملكه أنت.
أقل بكثير مما يتوقعه الناس، وهذا هو الجانب المطمئن في هذا التصميم. الأجهزة تخزّن مؤقتًا خريطة الشبكة التي أُعطيت لها آخر مرة، وأنفاق WireGuard القائمة تعمل من نظير إلى نظير — فهي لا تمر عبر خادم التحكم ولا تحتاج إليه لتستمر في العمل. إعادة تشغيل VPS خلال يوم عمل عادي غالبًا ما تمر دون أن يلاحظها أحد. ما يتوقف هو التغيير: لا يمكن لأي جهاز جديد أن يُسجَّل، والجهاز الذي ينتقل إلى شبكة جديدة قد يستغرق وقتًا أطول ليجد نظراءه من جديد، وتعديلات السياسة لا تنتشر، وأي عقدة تنتهي صلاحية مفتاحها بينما الخادم متوقف لن تستطيع تجديده. لذا فالطريقة الصحيحة للتفكير في خادم التحكم هي بوصفه مستوى تحكم لا مسار بيانات: الانقطاع إزعاج، لا فصل عن الشبكة. مع ذلك، تعامل معه كخدمة إنتاجية. انسخه احتياطيًا (الخطوة 06)، وإن كان قسم كامل يعتمد على tailnet، فضع خادم التحكم على خادم صغير خاص به بدل مشاركته مع شيء يُعاد تشغيله كثيرًا.
عُدّ أجهزتك، وعُدّ كم منها يتنقل. WireGuard الخام إجابة ممتازة لمجموعة صغيرة وثابتة: ثلاثة أو أربعة نظراء، ونقاط نهاية ثابتة، وملف إعدادات واحد لكل جهاز، ولا شيء لتشغيله سوى وحدة النواة. إنه برنامج أقل، وسطح هجوم أصغر، وصيانة أقل من أي شيء آخر في هذا الدليل، ويغطيه دليل WireGuard لدينا من الألف إلى الياء. الثمن هو أن WireGuard، عن عمد، لا يملك آلية لتوزيع المفاتيح، فكل جهاز جديد يعني تعديلاً على كل جهاز آخر — وهو عمل يتضاعف مع مربع حجم أسطولك — والعملاء المتجولون على Wi-Fi الفندق والبيانات الخلوية يحتاجون إلى من يُبقي الجميع على اطلاع بمكان انتقالهم. مستوى التحكم هو ما يشتري لك ذلك. العتبة عمليًا تقع في حدود خمسة أجهزة، أو عند أول حاسوب محمول يغيّر شبكته يوميًا، أو عند أول مرة تريد فيها قاعدة من نوع "حاسوب المقاول المحمول يصل إلى خادم الإعداد التجريبي فقط ولا شيء غيره". دون ذلك، استخدم WireGuard واستمتع بالهدوء.
نعم — إنه العميل الرسمي نفسه، وتوجيهه نحو خادم تحكم مختلف عملية مدعومة رسميًا لا حيلة تحايلية. الآلية تختلف باختلاف المنصة، وهذا ما يجعل الناس يضيّعون أمسية كاملة فيه. على Linux وmacOS وWindows، الأمر معلمة سطر أوامر على العميل (--login-server) أو الإعداد المكافئ لها. على Android يظهر الخيار داخل التطبيق نفسه، خلف رقم الإصدار في شاشة الإعدادات. على iOS وiPadOS وtvOS لا يوجد حقل داخل التطبيق: تُثبّت ملف تعريف إعدادات صغيرًا يضبط عنوان URL لخادم التحكم قبل تسجيل الدخول، وهو أمر دقيق ومزعج أول مرة لكنه دائم بعدها. يحتفظ توثيق Headscale بصفحة خاصة بكل منصة لهذا الغرض بالتحديد، ويستحق الأمر فتحها بدل التخمين، لأن مسار Apple بالذات تغيّر أكثر من مرة. تحذير واحد ليس خاصًا بمنصة بعينها: التطبيق الذي سبق تسجيل دخوله إلى خدمة Tailscale نفسها يحتاج عادة إلى تسجيل الخروج — وأحيانًا إعادة التثبيت — قبل أن يقبل خادمًا مختلفًا.
ليس من أجل جعل الشبكة تعمل — بل لأنه الفارق بين خصوصية غالبة وخصوصية ثابتة، فقرر الأمر عن قصد. خوادم DERP هي مُرحِّلات تُستخدم حين يعجز جهازان عن فتح اتصال مباشر: NAT متماثل على الطرفين، أو جدار حماية في شركة يبتلع UDP، أو مشغّل جوال يفعل شيئًا مبتكرًا. تبقى الحركة المُرحَّلة مُشفّرة بـWireGuard من طرف إلى طرف، لذا فمشغّل المُرحِّل يرى نصًا مشفّرًا، لا محتوى. ما يراه هو بيانات وصفية: أي جهازين يتحدثان، وكمّ ذلك، ومتى. بشكل افتراضي، يُسلّم Headscale أجهزتك خريطة DERP العامة الخاصة بـTailscale، ما يعني أن تلك المُرحِّلات مملوكة لـTailscale — تكون قد استضفت مستوى التحكم بنفسك لكنك تركت مسار البيانات الاحتياطي لدى الشركة التي كنت تحاول الابتعاد عنها. يأتي Headscale مزوّدًا بخادم DERP مدمج؛ وتفعيله يمنحك مُرحِّلاً في نفس مركز البيانات النوردي الذي يقيم فيه خادم التحكم. المفاضلة الصادقة هي التغطية: تُشغّل Tailscale مُرحِّلات على عدة قارات بينما تُشغّل أنت واحدًا فقط، لذا فالجهاز الموجود في الجهة الخطأ من العالم يُخدَم بشكل أفضل عبر مُرحِّلاتها. تشغيل الاثنين معًا، مع وجود مُرحِّلك في الخريطة، حل وسط معقول تمامًا.
نعم، وهذا أحد أفضل الأسباب لبناء هذا كله. يستطيع Headscale دفع إعدادات DNS إلى كل جهاز ينضم، فيستخدم حاسوبك المحمول على Wi-Fi المقهى وهاتفك على بيانات الجوّال كلاهما مُحلِّلاً تُشغّله أنت — مع الفلترة، ومع التخزين المؤقت، ودون أن ترى الشبكة المحلية الاستعلامات. وجّه خادم الأسماء العام لشبكة tailnet نحو عنوان IP على tailnet الخاص بالخادم الذي يُشغّل Unbound أو AdGuard Home الخاص بك، واضبط التجاوز (override) حتى يتغلب على أي إعداد يمنحه DHCP للجهاز. أمران يجب ضبطهما بشكل صحيح. يجب أن يكون المُحلِّل قابلاً للوصول على tailnet لا على الإنترنت العام — فهذا هو صلب الفكرة، وهو يعني أيضًا أنه يمكنك أخيرًا إغلاق المنفذ 53 أمام العالم. وMagicDNS، التي تمنح كل جهاز اسمًا مختصرًا داخل لاحقة تختارها أنت، تحتاج إلى أن تكون تلك اللاحقة نطاقًا تتحكم فيه وألا يكون فرعًا أو أصلاً لاسم مضيف خادم التحكم نفسه؛ والخطأ في ذلك عطل مُربِك يبدو وكأنه خلل في DNS بينما هو في الحقيقة خطأ في الإعدادات.
لمستوى التحكم وحده: صغير، ثم أصغر من ذلك. Headscale ملف ثنائي واحد مكتوب بلغة Go يحمل قاعدة بيانات صغيرة للأجهزة والمفاتيح والسياسات؛ وحركة التنسيق ليست سوى رشقات ضئيلة من اتصالات long-poll، اتصال واحد لكل جهاز، لا تحمل شيئًا يُذكر معظم الوقت. خادم Sentinel — 2 vCPU، و4 GB، و120 GB من NVMe، بسعر $3.90 شهريًا — سيُشغّل منزلاً أو شركة صغيرة أو بضع مئات من الأجهزة دون أن يشعر بذلك. مسألة التحجيم لا تصبح مثيرة للاهتمام إلا حين يتولى الخادم نفسه مهمة ثانية. مُرحِّل DERP المدمج ينقل حركة بيانات حقيقية، لذا فهو يحتاج إلى رابط صاعد أكثر من حاجته إلى أنوية معالج. أما عقدة الخروج فتُمرِّر كل حركة بيانات الجهاز، لذا فهي تحتاج إلى رابط صاعد، وهامش نطاق ترددي سخي، ومعالج قادر على مجاراة التشفير بأقصى سرعة للخط. إن كنت تخطط للاثنين معًا، فاحسب الحجم بناءً على حركة البيانات، وتعامل مع خادم التحكم بوصفه هامش التقريب الذي هو عليه فعلاً — أو الأفضل من ذلك، ضع عقدة الخروج على خادم ثانٍ وأبقِ مستوى التحكم بسيطًا لا يثير الاهتمام.
متشابهان تقنيًا، لكنهما شبه متضادين من ناحية الخصوصية، لذا يستحق الأمر أن تكون واضح الرؤية. عقدة الخروج تُوجّه اتصال جهاز بالإنترنت بأكمله عبر VPS الخاص بك، فترى المواقع عنوان VPS بدل عنوان منزلك أو الفندق، وترى الشبكة المحلية نفقًا مشفّرًا واحدًا بدل تصفحك. هذا القدر يطابق VPN تجاريًا. الفارق هو الحشد. عنوان VPN التجاري يتشاركه آلاف من العملاء غير المرتبطين ببعضهم، وهذا بالضبط ما يجعل نسب حركة البيانات إليك صعبًا؛ أما عنوان عقدة الخروج الخاصة بك فتستخدمه أنت وحدك، بثبات، إلى الأبد. في مواجهة شبكة مقهى متلصصة أو ISP يبني تنميطًا، عقدة الخروج ممتازة. أما في مواجهة مراقب يربط بين الأنشطة عبر مواقع مختلفة على مدى أشهر، فالعنوان المخصص معرّف دائم بينما العنوان المشترك ليس كذلك. استخدم عقدة الخروج فيما تُجيده — الشبكات المحلية غير الموثوقة، والوصول إلى خدماتك الخاصة، وعنوان ثابت لأشياء تتوقع عنوانًا ثابتًا — واقرأ الدليل المحوري للاطلاع على الجزء من نموذج التهديد الذي لا تغطيه.
أربعة أشياء، واحد منها فقط بديهي. قاعدة البيانات — SQLite افتراضيًا، أو PostgreSQL إن نقلتها إليها — تحمل المستخدمين والأجهزة والمفاتيح العامة والمسارات ومفاتيح ما قبل المصادقة. مادة المفتاح الخاص المُنشأة عند الإقلاع الأول هي الجزء الذي ينساه الناس: افقدها وسيرفض كل جهاز الخادم الذي كان يتحدث معه منذ عام، ما يعني إعادة تسجيل الأسطول بأكمله يدويًا. ملف الإعدادات مهم لأنه يُشفّر الأسماء الثلاثة من الخطوة 02، وإعادة بنائها من الذاكرة هي الطريقة التي يغيّر بها الناس أحدها عن طريق الخطأ. أما ملف السياسة، إن احتفظت بقواعد الوصول على القرص، فهو الشيء الذي تريد إعادة كتابته أقل من غيره. تعيش الملفات الأربعة كلها في مجلدين، ووزنها مجتمعة أقل من وزن صورة فوتوغرافية. شفّرها، وأرسلها إلى جهاز غير هذا الجهاز — ويُفضّل أن يكون في ولاية قضائية أخرى، وهذا بالضبط ما يتناوله دليل النسخ الاحتياطي — واسترجعها على VPS تجريبي مرة واحدة، عن قصد، لتتأكد أن الملف الذي بحوزتك هو الملف الذي تحتاجه.
خادم التحكم عبء عمل عادي ومنضبط — قليل من HTTPS، وقليل من UDP، وحركة بيانات شبه معدومة — ولا شيء في سياسة الاستخدام المقبول يتطرق إليه. أما عقدة الخروج فتستحق جملة واحدة من التفكير لا محاضرة كاملة في السياسات: كل ما يرسله جهاز عبرها يغادر الإنترنت من عنوان VPS الخاص بك، تحت حسابك، فما تفعله أجهزتك هو ما سيُعرف به ذلك العنوان. هذا أمر طبيعي وهو بالضبط ما صُممت الميزة من أجله؛ ولهذا السبب أيضًا تُعد مشاركة عقدة الخروج مع أشخاص لا تعرفهم فكرة سيئة، تمامًا كما هو الحال مع أي مُرحِّل مفتوح. النطاق الترددي غير محدود في كل الفئات، والحركة المُرحَّلة حركة عادية، لذا يأتي كلٌّ من خادم DERP وعقدة الخروج ضمن الخدمة دون قياس استهلاك. وفيما عدا ذلك: الحساب لا يحتاج إلى اسمك، وتُسدَّد الفاتورة بـMonero أو Bitcoin، والجهاز الذي يحتفظ بخريطة كل جهاز تملكه غير مُفهرَس لدى أي جهة.
Sentinel — 2 vCPU و4 GB مقابل $3.90 شهريًا، في هلسنكي أو ستوكهولم أو أوسلو أو ريكيافيك. يكفي لـHeadscale وCaddy ومُرحِّل DERP الخاص بك، مع مساحة متبقية لعقدة الخروج إن أردتها على نفس الخادم. لا بريد إلكتروني عند التسجيل، ولا وثيقة هوية، ولا قاعدة بيانات لدى شركة تحمل قائمة كل جهاز تملكه.
آخر مراجعة · 2026-10-12 · المصادر · توثيق Headscale (مرجع الإعدادات، وإعداد العملاء، وACLs، وDERP، وCLI عن بُعد)، وتوثيق عميل Tailscale وعقدة الخروج، وورقة بروتوكول WireGuard، وتوثيق Caddy · الدورية · سنوياً
This guide is one spoke of a larger series. The pillar walks the three privacy layers end to end — the sibling spokes below dive into the specifics.
Three independent layers — signup, payment, network — explained, legal context included, common mistakes flagged.
Your own WireGuard tunnel — server config, peer keys, kill-switch.
A v3 .onion address that survives reboots and IP changes.
Unbound recursing from the root, AdGuard Home filtering, DoH and DoT.
Deploy your own MCP server on a no-KYC VPS — TLS, streamable HTTP, OAuth.
استضافة خاصة، مبنية في الشمال.