حجب عميل OpenVPN واحد من شبكة LAN دون إيقاف النفق
ثبّت عنوان النفق الخاص بالعميل على شهادته، وأسقط حركة مروره إلى LAN في رأس FORWARD، ثم تحقق من IPv6 والجلسات المتتبعة والبقاء بعد إعادة التشغيل.
يجب أن يفقد عميل واحد على خادم OpenVPN الخاص بك الوصول إلى LAN بينما يبقى كل نفق آخر قائمًا. ابحث عن ذلك، وأفضل إجابة تقول عادةً إن الخادم الخفي لا يستطيع فعل ذلك، وهذا نصف صحيح فقط: لا يملك OpenVPN جدار حماية لكل عميل، لكن المضيف الذي يُنهي النفق يرشح الحزم بالفعل. القراران المهمان هما الهوية التي تحجبها وموضع القاعدة. إذا أحسنت هذين يصبح التغيير سطرًا واحدًا يمكنك اختباره وإزالته.
ثبّت العميل قبل أن تكتب القاعدة
يؤجّر OpenVPN عناوين النفق من مجموعة، لذا فإن 10.8.0.6 مقعد وليس شخصًا. عندما تنتهي الجلسة يعود التأجير ويمكن منحه للاتصال التالي، ما يعني أن قاعدة مكتوبة ضد ذلك العنوان تتبع المقعد لا المستخدم. لذا قرر أولًا ما تحجبه فعليًا: عنوان لتجربة قصيرة، أو شهادة لشخص تريد إبعاده.
لربط العنوان بالشهادة، أنشئ ملفًا في الدليل المسمى بـ client-config-dir وامنح الملف اسم الشهادة الشائع بالضبط. ضع فيه توجيهًا واحدًا، ifconfig-push 10.8.0.6 255.255.255.0، ويحتفظ ذلك العميل بالعنوان نفسه عبر إعادة الاتصال. يجب أن يوجد إعدادان حتى يسري هذا: يجب التصريح بـ client-config-dir في إعداد الخادم، ويجب أن يقع العنوان المدفوع في شبكة فرعية يستطيع الخادم توجيهها. إن فاتك أحدهما يُتجاهل الملف دون خطأ، ما يجعل اختبار جدار الحماية التالي مضللًا.
يمكن للحجب المؤقت استخدام عنوان من المجموعة، ما دامت التذكرة تسجل أي جلسة احتفظت به في ذلك الوقت.
الترتيب يحدد ما إذا كان الإسقاط يعمل
على بوابة Linux التي تمرر بين النفق وLAN، تعبر الحزم سلسلة FORWARD. اقرأ الأمر أدناه كجملة: أدرج في رأس FORWARD، طابق الحركة الداخلة من tun0، من ذلك المضيف الوحيد، الموجهة إلى الشبكة الفرعية LAN، وأسقطها.
iptables -I FORWARD -i tun0 -s 10.8.0.6/32 -d 192.168.1.0/24 -j DROPإن -I هو ما يجعل القاعدة تعمل. عند الإضافة بـ -A تهبط تحت أي قبول واسع للشبكة الفرعية للنفق ولا ترى أي حزمة. تحقق من الموضع بـ iptables -vnL FORWARD --line-numbers واقرأ العدادات أيضًا: إسقاط في الأعلى لا يعد شيئًا يعني أن الحركة تصل عبر مسار آخر.
عنوان LAN الخاص بالبوابة مسار مختلف. الحزم المرسلة إلى الصندوق نفسه تذهب إلى INPUT وليس FORWARD، لذا يمكن للعميل أن يفقد مضيف LAN ويظل يفتح صفحة إدارة الموجه. أضف قاعدة INPUT المطابقة عندما يهم ذلك.
ما لا يستطيع المرشح رؤيته
يحدث الترشيح عند تقييم الحزمة، لذا يمكن لجلسة TCP قائمة أن تستمر حتى تُغلق أو تُعاد. إن كان الحجب يجب أن يقطع فورًا فامسح التدفقات المتتبعة لذلك المصدر بـ conntrack -D -s 10.8.0.6 بعد إدخال القاعدة. إن كان تداخل بضع ثوانٍ مقبولًا فسجل ذلك الاختيار بدلًا من تركه ضمنيًا. في الحالتين يحتاج الشخص التالي إلى معرفة ما إذا كانت القاعدة توقف الحركة الحية أم الاتصالات الجديدة فقط.
حركة الأقران لا تلمس جدار حماية المضيف أبدًا. مع تفعيل client-to-client يمرر OpenVPN تلك الحزم داخل الخادم الخفي، فلا يراها FORWARD ولا INPUT. الحلول الوحيدة هي إيقاف client-to-client أو قبول أن الأقران يمكنهم الوصول إلى بعضهم؛ لن ترى قاعدة iptables تلك الحركة.
IPv6 والبرنامج الثابت والبقاء بعد إعادة التشغيل
قاعدة IPv4 لا تقول شيئًا عن IPv6. إن كان النفق وLAN يحملان العائلتين فيجب أن توجد القاعدة المكافئة في ip6tables أو في مجموعة قواعد nftables التي تملك السياسة على ذلك المضيف. غالبًا ما يخفي برنامج الموجه الثابت netfilter خلف تجريده الخاص، لذا قد لا تنطبق الصياغة وأسماء الجداول المنسوخة من منتدى.
على OpenWrt المسار الموثق هو إدخال إعداد جدار حماية لا سطر iptables مكتوب بيد، وقد يختفي السطر المكتوب بيد عند إعادة تحميل جدار الحماية. توزيعات أخرى تستعيد القواعد عبر netfilter-persistent أو وحدة إقلاع أو مخزن من المورد، وهذه الآليات غير قابلة للتبادل. أثبت أيها اخترت بإعادة تشغيل، لأن إعادة التحميل تمارس مسارًا مختلفًا.
تحقق حسب المسار ثم تراجع بنظافة
اختبر كل مسار على حدة، لأن فحصًا ناجحًا واحدًا يخفي الآخرين. يجب أن يظل العميل المحجوب يصل إلى الإنترنت عبر النفق بينما يفشل ضد مضيف LAN، ويجب أن يصل عميل ثانٍ إلى المضيف نفسه، ويحتاج عنوان البوابة ومسار الأقران كل منهما إلى ملاحظة خاصة. اكتب النتائج بجانب القاعدة ليكون للتغيير التالي خط أساس. الجدول أدناه هو المجموعة التي تستحق البقاء في التذكرة.
| المسار | المتوقع مع القاعدة | عندما يفشل |
|---|---|---|
| عميل محجوب إلى مضيف LAN | لا رد | القاعدة تحت قبول، أو المصدر لا يطابق |
| عميل محجوب إلى الإنترنت | يعمل عبر tun0 | القاعدة واسعة جدًا، بلا مطابقة وجهة |
| عميل ثانٍ إلى مضيف LAN نفسه | يعمل | القاعدة طابقت أكثر من المضيف المقصود |
| عميل محجوب إلى عنوان LAN للبوابة | محجوب فقط مع قاعدة INPUT المطابقة | قاعدة INPUT مفقودة |
| عميل محجوب إلى عنوان نفق قرين | لا يزال يعمل | client-to-client مفعّل وخارج نطاق جدار الحماية |
التراجع هو حذف بالمواصفة لا تفريغ: iptables -D FORWARD -i tun0 -s 10.8.0.6/32 -d 192.168.1.0/24 -j DROP يزيل ذلك الإدخال بالضبط ويترك بقية السلسلة سليمة. أزل السطر نفسه من أي ملف يستعيد القواعد عند الإقلاع وأعد تحميله وتأكد من أن العميل يصل إلى مضيف LAN مجددًا. تفريغ FORWARD سيلغي أيضًا قواعد لم تكتبها، ما يحول التراجع إلى حادثة ثانية.
قبل إغلاق التذكرة تأكد من ثلاثة أشياء: العنوان المثبت يطابق الشهادة، والقاعدة تقع فوق القبولات بعداد غير صفري، وملف الاستمرارية يحتوي القاعدة نفسها التي اختبرتها. إن غاب أي منها فالحجب وهم داخل جلسة shell.