جدار حماية VPS: افتح منفذ VPN فقط ثم أثبت ذلك
منفذ واحد يجب أن يبقى عامًا وإلا لن يتصل أي عميل. ارفض ما عداه، وافصل التمرير عن الإدخال، واترك مسار استعادة اختبرته مسبقًا.
جدار الحماية الذي يسمح بمنفذ VPN وحده ليس قاعدة واحدة. إنه ثلاثة قرارات منفصلة تصادف أنها تتعلق برقم المنفذ نفسه: سلسلة الإدخال تحدد ما يمكن أن يصل إلى عملية محلية، وسلسلة التمرير تحدد ما يمكن أن يعبر المضيف نيابة عن عملاء النفق، وجدول NAT يعيد كتابة عنوان المصدر عند الخروج. أخطئ في واحد منها ولن تكون النتيجة انقطاعًا نظيفًا إلا نادرًا. ستحصل على مضيف يقبل العملاء لكنه لا يحمّل شيئًا، أو مضيف يبدو مغلقًا حتى يقرأ أحدهم ترتيب السلاسل.
المنفذ الوحيد الذي لا يمكن إغلاقه
على مستمع VPN أن يقبل اتصالات من عناوين لا يمكنك توقعها، فهو خدمة عامة بحكم التعريف. هذا هو الاستثناء الوحيد الذي بُني عليه التصميم: منفذ UDP واحد لـ OpenVPN، ومنفذ UDP واحد لـ WireGuard، ومنفذ TCP واحد لـ VPN عبر SSL. كل ما عدا ذلك ينتمي إلى ما وراء النفق، أي أن خدمات التطبيقات يجب أن ترتبط بعنوان النفق أو بواجهة الاسترجاع لا بكل الواجهات.
الارتباط ليس فرضًا للسياسة. العملية المرتبطة بـ 0.0.0.0 لا يمكن الوصول إليها إلا إذا سمحت قاعدة بذلك، والسياسة الافتراضية هي الملاذ للحركة التي لم تطابقها أي قاعدة، وليست القاعدة التي تحكم المنفذ. وقاعدة السماح الموضوعة فوق قاعدة الرفض تبقى سماحًا، ونقل خدمة بعيدًا عن العنوان العام تحسين مستقل لا بديل عن السلسلة.
الإدخال والتمرير وNAT تجيب عن أسئلة مختلفة
حركة الإدخال متجهة إلى المضيف نفسه، فهي موطن مستمع VPN ومسار الإدارة. حركة التمرير تعبر المضيف، ويحتاجها عملاء النفق مع net.ipv4.ip_forward=1. التكوين الناقص الكلاسيكي يسمح بالتدفق الصادر وينسى اتجاه العودة، فيُكمل العميل مصافحته ثم لا يُحمَّل شيء؛ وقاعدة conntrack للحركة القائمة والمرتبطة تغطي ذلك الاتجاه.
NAT هو السؤال الثالث. بدون إعادة كتابة postrouting تخرج الحزم الممرَّرة بعنوان المصدر الخاص بالنفق وتُسقط في المنبع، لأن لا شبكة بعد المضيف تعرف كيف تعيد توجيه التجمع. يجب أن تطابق بادئة المصدر في تلك القاعدة تجمع VPN لا عنوان المضيف نفسه، والأمر كذلك في قاعدة التمرير التي تسمي شبكة العملاء.
IPv6 سياسة ثانية وليست فكرة لاحقة. المضيف الذي لديه سلسلة IPv4 صارمة وسياسة مفتوحة في ip6tables لم يغلق شيئًا؛ فالخدمات ما زالت قابلة للوصول عبر العائلة الأخرى. إما أن تعكس مجموعة القواعد باستخدام ip6tables أو تعطّل IPv6 عمدًا على الواجهة العامة، واكتب أي الخيارين اخترت.
أساس يمكن قراءته في مرور واحد
ابدأ بالرفض ثم أضف ما يحتاجه المضيف فقط. أولًا واجهة الاسترجاع والردود، ثم مسار الإدارة، ثم مستمع النفق، ثم سياسة التمرير للعملاء:
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW -j ACCEPT
iptables -A INPUT -p udp --dport 1194 -m conntrack --ctstate NEW -j ACCEPT
sysctl -w net.ipv4.ip_forward=1
iptables -A FORWARD -i tun0 -o eth0 -s 10.8.0.0/24 -j ACCEPT
iptables -A FORWARD -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADEأسماء الواجهات والمنفذ والتجمع مواضع مؤقتة؛ اقرأها من الخادم بدل نسخها. حفظ النتيجة لا يقل أهمية عن كتابتها، لأن مجموعة قواعد تحيا في الذاكرة وحدها تختفي عند إعادة التشغيل التالية وتعيد فتح المضيف بهدوء. احفظها بآلية التوزيع، واحتفظ بنسخة خارج الجهاز لليوم الذي لن يقلع فيه الجهاز.
إغلاق المنفذ الأخير دون فقدان المضيف
في التصميم مأزق. إذا كانت SSH موجودة فقط عبر النفق، فإن تعطل خدمة VPN يأخذ SSH معها، وقد يكون الطريق الوحيد للعودة وحدة تحكم لم تفتحها قط. قبل إغلاق آخر منفذ عام، تأكد من وجود تلك الوحدة ومن قدرتك على استخدامها فعلًا، أو أبقِ مسار إدارة ضيقًا لا يعتمد على النفق: SSH من عنوان ثابت، بالمفاتيح فقط، مع إيقاف مصادقة كلمة المرور.
طبّق التغيير من جلسة قائمة بالفعل، لا عبر الاتصال الذي أنت على وشك تصفيته. جدول تراجعًا كي تنتهي صلاحية الخطأ بدل أن يصبح دائمًا، مثل مهمة systemd-run --on-active=10min تستعيد مجموعة القواعد السابقة، وأبقِ جلسة SSH ثانية مفتوحة أثناء اختبار الأولى. ثم تحقق من أن مهمة التراجع تعمل فعلًا، لأن استعادة لم تُختبر تساوي عدم وجود استعادة.
تحقق من المسار لا من السكربت
اقرأ القواعد المحمّلة، لا الملف الذي كان يُفترض أن يحمّلها. من مضيف خارجي مُصرَّح له، تأكد من أن المنافذ المقصودة وحدها هي التي تجيب؛ ومن داخل النفق، تأكد من أن الخدمات التي أردت نشرها قابلة للوصول. سياسة الرفض الافتراضي التي تحجب حركة النفق أيضًا تبدو مطابقة لإغلاق ناجح حتى يحاول أحدهم استخدامه.
iptables -S
iptables -t nat -S
ss -lntup
ip -4 addr showسجّل المنفذ المسموح وتجمع العملاء وواجهة النفق ومصدر الإدارة وإجراء وحدة التحكم بجانب التكوين. التغيير التالي في التجمع أو اسم الواجهة يجب أن يطابق في المرشح وقاعدة NAT معًا، وإلا عاد المضيف إلى حالة نصف مفتوحة دون أن يلاحظ أحد.
عادة واحدة تساوي أكثر من مجموعة القواعد: بعد كل تغيير، أثبت مسار التمرير بطلب من العميل وأثبت مسار الاستعادة بجلسة ثانية. الإغلاق الذي لم تستخدمه ليس إلا فرضية.