تسجّل الدخول إلى الراوتر، وتلصق مجموعة قواعد مفتاح إيقاف من منشور في منتدى، وتتوقف LAN عن التصفح في اللحظة التي يسقط فيها النفق. بعد يومين لا يزال الراوتر يحدّث سجل DNS الديناميكي عبر WAN العادي، ولا يزال حاسوب الضيف يصل إلى مواقع IPv6. السلوكان طبيعيان، لأن القواعد الملصقة كانت تغطي سلسلة واحدة وعائلة عناوين واحدة، ولا شيء من ذلك هو الراوتر كله. المرور على مسارات الحزم بالترتيب يُظهر بالضبط ما تُرك خارج الحساب.

ابدأ من الراوتر، لا من الحاسوب المحمول

سياسة على مستوى الراوتر جذابة لمكتب صغير لأن كل جهاز خلفه يرث السلوك نفسه ولا يمكن لأحد أن ينسى تشغيل مفتاح على العميل. وهي تمنحك أيضًا مكانًا واحدًا للاختبار بعد كل تحديث للبرنامج الثابت. أما ما لا تمنحه فهو تغطية تلقائية لحركة الراوتر نفسه أو لعائلة عناوين ثانية، وهما الفجوتان اللتان تقفان خلف معظم عمليات النشر الفاشلة.

قبل أن تعدّل أي شيء، دوّن ثلاث حقائق على الورق: اسم واجهة WAN، واسم جسر LAN، وعنوان نقطة نهاية VPN ومنفذها. ستحتاج الثلاثة في القواعد، والتخمين في أسماء الواجهات هو السبب الأكثر شيوعًا لأن مجموعة قواعد تبدو صحيحة ولا تفعل شيئًا.

امشِ عبر المسارات الثلاثة التي يمكن أن تسلكها الحزمة

تُمرَّر الحركة من الحاسوب المحمول إلى الإنترنت، لذا تمر عبر سلسلة FORWARD. أما الحركة التي يولّدها الراوتر نفسه، مثل تمرير DNS واستعلامات NTP وتحديثات DDNS وقناة تحكم VPN، فتمر عبر OUTPUT. وحركة الإدارة الموجّهة إلى الراوتر تصل عبر INPUT.

لذلك يحمي مفتاح الإيقاف المبني في FORWARD وحده العملاء ولا شيء غيرهم. ويوضح الجدول لماذا كان التسريب في المشهد الافتتاحي متوقعًا وليس لغزًا.

Packet pathExampleChain that sees it
LAN client to WAN or tunnelBrowser requestFORWARD
Router-originatedDDNS update, NTPOUTPUT
Addressed to the routerSSH from the LANINPUT

في معظم التصاميم لا تحتاج إلى مفتاح إيقاف على INPUT، لكنك تحتاج إلى إبقاء وصول الإدارة عاملًا بينما النفق متوقف. وإلا فستذهب إلى المكتب بكبل طرفية عند أول فشل لـ VPN.

رتّب القواعد حتى يظل النفق قادرًا على الإقلاع

مفتاح الإيقاف العامل قائمة سماح تنتهي بالرفض، والترتيب هو ما يجعله مفتاح إيقاف بدلًا من طوبة. اسمح أولًا بـ loopback، ونقطة نهاية VPN، والردود على التدفقات القائمة، وواجهة النفق؛ ثم ارفض الباقي أخيرًا.

iptables -A OUTPUT -o lo -j ACCEPT
iptables -A OUTPUT -d 198.51.100.7 -p udp --dport 51820 -j ACCEPT
iptables -A OUTPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o wg0 -j ACCEPT
iptables -A OUTPUT -o eth0 -j REJECT

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

كرّر الشكل في FORWARD لحركة العملاء، وضع قاعدة إدارة صريحة فوق الرفض. أبقِ قاعدة الإدارة هذه ضيقة لكن قابلة للوصول، وأكّدها بفتح جلسة SSH ثانية قبل إغلاق الأولى. حبس نفسك خارج النظام أثناء تغيير مفتاح إيقاف أمر شائع بما يكفي للتخطيط له. وعلى راوتر يشغّل WireGuard، تحدد allowed-ips للقرين ما يدخل النفق، بينما تحدد هذه القواعد ما يُسمح له بالخروج دونه.

يحتاج IPv6 إلى بابه الخاص

كل ما سبق هو IPv4. إذا كانت شبكة LAN لديك تعمل بـ IPv6 بينما ينقل النفق IPv4 فقط، فكل جهاز مغطى ما زال لديه مسار مباشر إلى الإنترنت لا تراه قواعدك الجديدة أبدًا. وسيفضّله حاسوب محمول ثنائي الحزمة بسرور، ولن يبدو مفتاح الإيقاف معطلًا إلا لمن يختبر بـ IPv4.

ip6tables -A FORWARD -i br-lan -j REJECT
ip6tables -A OUTPUT -o eth0 -j REJECT
ip6tables -A OUTPUT -o lo -j ACCEPT

هنا أيضًا يهم الترتيب: يجب أن يسبق سماح loopback رفض WAN، وإلا بدأت الخدمات المحلية على الراوتر بالفشل بطرق غريبة. وإذا كانت الشبكة لا تستخدم IPv6 إطلاقًا، فتعطيله على WAN وLAN أبسط ولا يترك شيئًا يمكن نسيانه.

بعض عملاء VPN يثبّتون مسارًا افتراضيًا لـ IPv4 فقط ويتركون مسار IPv6 الافتراضي القائم دون مساس. افحص جدول التوجيه بعد اتصال النفق بدلًا من افتراض أن العميل تكفّل بالأمر.

أثبت ذلك والنفق متوقف

أوقف النفق من الراوتر واختبر من ثلاثة أماكن بهذا الترتيب:

# systemctl stop wg-quick@wg0
# ip route get 203.0.113.1
# curl -m 5 -sS http://example.com || echo blocked
# iptables -vnL OUTPUT | head
# ip6tables -vnL OUTPUT | head

يخبرك بحث المسار إلى أين ستذهب الحزمة، وتخبرك العدادات ما إذا كانت قواعدك قد طابقت يومًا. القاعدة التي لا تمر بها أي حزمة بعد اختبار فاشل لا تحمي شيئًا، والسبب المعتاد اسم واجهة يختلف عن الذي كتبته. اختبر حركة الراوتر نفسه صراحةً، لأن اختبارًا من جهة LAN لا يمكنه تفعيل OUTPUT.

قرّر نمط الفشل قبل أن تحتاج إليه. يبقي fail-closed العملاء دون اتصال حتى يعود النفق؛ ويعيد fail-open وصول WAN العادي ويهدر الغرض بالنسبة للحركة التي كانت تهمك. ومسار blackhole نحو تجمّع VPN بمعيار مرتفع طبقة ثانية مفيدة لتصاميم fail-closed، لأنه يبقى حين يختفي مسار النفق بدلًا من السقوط إلى المسار الافتراضي.

لا تقبل الإعداد إلا عندما يفشل عميل في LAN وطلب يولّده الراوتر وطلب IPv6 جميعًا والنفق متوقف، وتعمل الثلاثة مرة أخرى بمجرد إقلاعه.

مقالات ذات صلة