مفتاح إيقاف pf في macOS لـ OpenVPN: قواعد تفشل مغلقة
تحجب مجموعة قواعد pf حركة المرور المباشرة أثناء توقف النفق. أبقِ مسار العميل إلى خادمه، ثم أثبت الحجب مع إيقاف النفق.
في macOS، لا يكون مفتاح الإيقاف أفضل من سياسة مرشح الحزم التي تقف خلفه، وpf هو الجزء الذي ينفذ تلك السياسة. على السياسة أن تفعل أمرين متعاكسين في آن واحد: أن تتيح للعميل الوصول إلى خادمه كي يوجد نفق، وأن تمنع كل ما عداه من المغادرة مباشرة. معظم مجموعات القواعد المنشورة تحسن الثاني وتنسى الأول، فتفقد الآلة الاتصال بدل أن تكسب الحماية. النسخة التي تعمل تسمي نقطة النهاية والمحلل والنفق، ولا شيء أكثر.
ما يمكن لمرشح الحزم أن يقرره، وما لا يمكنه
ينظر pf في الواجهات والعناوين وأرقام البروتوكولات والمنافذ، ويتوقف عند ذلك. لا يعرف أبدا أي عملية فتحت مقبسا، لذا يصبح إذن مكتوب لبرنامج واحد إذنا لكل برنامج يستطيع الوصول إلى المنفذ نفسه. وهكذا يحول استثناء UDP السخي مفتاح إيقاف إلى شبكة عادية. الحجب الواعي بالتطبيقات يخص العميل أو امتداد النظام، لا هذا الملف.
المرشح لا ينشئ المسارات أيضا. عندما يسقط العميل، قد يظل المسار الافتراضي يشير إلى نفق ميت، ويحول pf ذلك إلى حزم محجوبة بدل رجوع صامت إلى Wi-Fi. الحجب هو النتيجة المقصودة، لا عطلا يلتف حوله.
الترتيب يقرر النتيجة أكثر مما يقررها نص القاعدة. من دون quick، يواصل pf التقييم بعد التطابق وتفوز آخر قاعدة مطابقة، فيتجاوز تمرير واسع قرب الأسفل الاستثناءات الحذرة أعلاه. ووسم التمريرات بكلمة quick يجعل أول تطابق نهائيا، وهو ما يعنيه كاتب السياسة عادة.
اقرأ حقائق الواجهة ونقطة النهاية أولا
لا ترقم الواجهات اللاسلكية بالطريقة نفسها على كل Mac، ويحصل جهاز النفق على رقم قد يتغير بين عمليات الإقلاع. القاعدة التي تسمي جهازا غير موجود تفشل عند التحليل، وهذا صاخب وسهل الإمساك، أما القاعدة التي تسمي الجهاز الموجود الخطأ فتحلل بنظافة وتسمح بمرور حركة أردت إيقافها.
اجمع الحقائق بينما العميل متصل، لأن جهاز النفق لا يوجد إلا حينها. تحتاج الواجهة الحاملة للمسار الافتراضي، والجهاز الذي أنشأه العميل، وعنوان الخادم ومنفذه الذي يتصل به. تلك القيمة الأخيرة هي التي تغفلها معظم مجموعات القواعد، وإغفالها هو سبب حجب مجموعة قواعد منسوخة لنفقها هي.
route -n get default
ifconfig -l
scutil --nc list
الأمر الأول يسمي الواجهة الفائزة حاليا، والثاني يسرد كل جهاز يعرفه النواة، والثالث يعرض إعدادات VPN التي يستطيع النظام تشغيلها. دون تلك الإجابات، ثم اقرأ عنوان الخادم ومنفذه من إعداد العميل نفسه.
اكتب مجموعة القواعد حول مسار النفق
الملف أدناه يرفض افتراضيا ويعيد قبول خمسة أشياء: الاسترجاع، وجهاز النفق، ومسار العميل إلى خادمه، والمحلل المستخدم قبل وجود النفق، والتبادلين اللذين يبقيان الوصلة اللاسلكية صالحة. أسماء الواجهات وعنوان الخادم تأتي من آلتك، فاستبدل القيم التي تحققت منها. ورقم النفق لن يطابق رقمك أيضا.
set skip on lo0
block all
pass out quick on utun0
# maintain this line when the server address changes
pass out quick on en1 inet proto udp to 203.0.113.10 port 1194
# only the resolver the client uses before the tunnel exists
pass out quick on en1 inet proto udp to 192.0.2.53 port 53
pass out quick on en1 inet proto udp from any port 68 to any port 67
pass out quick on en1 inet proto udp to 224.0.0.251 port 5353
سطر DHCP موجود لأن Mac يطلب عنوانا قبل أن يكون لديه عنوان، فيغادر الطلب المنفذ 68 نحو المنفذ 67 بلا عنوان مصدر صالح. سطر البث المتعدد يتيح للنظام الحكم على ما إذا كانت الوصلة اللاسلكية تستحق الاستخدام، وحذفه ينتج آلة تبلغ عن انقطاع الاتصال في شبكة عاملة. سطر نقطة النهاية هو ما يتيح لـ OpenVPN الوصول إلى خادمه أصلا؛ ومن دونه يسقط block all المصافحة الخارجية ولا ينشأ النفق أبدا. سطر المحلل أضيق من إذن DNS عام، لأنه يسمي عنوانا واحدا ومنفذا واحدا بدل كل استعلام تجريه الآلة.
استثناءا نقطة النهاية والمحلل هما الاثنان اللذان يجب أن يوجدا؛ وكل ما عداهما يبقى محجوبا. إذا اتصل العميل بعنوان حرفي، فاحذف سطر المحلل وأبق سطر نقطة النهاية. وإذا تغير عنوان الخادم، فحدث ذلك السطر قبل الاتصال التالي، أو املأ جدول pf من خطاف العميل نفسه وطابق الجدول بدلا من ذلك.
أنزل النفق ثم أعد التشغيل
حلل قبل التحميل، لأن خطأ الصياغة رخيص في تشغيل تجريبي ومكلف في جلسة بعيدة. ثم حمل الملف، وفعل المرشح إن كان معطلا، واقرأ ما هو نافذ فعلا. القراءة الخلفية ليست مراسم: مرساة أخرى يمكنها إضافة قواعد لم تكتبها، فقارن المجموعة المطبوعة بملفك.
sudo pfctl -n -v -f /etc/pf.conf
sudo pfctl -f /etc/pf.conf
sudo pfctl -e
sudo pfctl -s rules
sudo pfctl -s Anchors
sudo pfctl -a <anchor> -s rules
sudo pfctl -s info
مع تحميل القواعد، أنزل النفق وحاول تحميل صفحة. ينبغي أن تتوقف حركة المرور العادية، وينبغي أن تظل متوقفة بعد نوم الآلة واستيقاظها، لأن ذلك الانتقال هو حيث يتسلل الحالة العالقة. أعد الاتصال وأكد أن الحركة تعود من دون لمس مجموعة القواعد. إذا ظل المتصفح يعمل والنفق منزل، فثمة قاعدة أوسع مما ظننت، والقراءة الخلفية تسميها عادة.
إعادة التشغيل هي الجزء الذي يتخطاه الناس. يقرأ macOS الملف /etc/pf.conf عند الإقلاع، لكن قراءة الملف ليست مثل تفعيل المرشح، لذا قد تكون مجموعة قواعد تعمل الآن معطلة بعد إعادة التشغيل. نفذ بعدها sudo pfctl -s info وأكد أن سطر الحالة يبلغ أن المرشح مفعل.
أبق مسار الخروج وإعادة التشغيل صادقا
مجموعة قواعد تحجب كل شيء يمكنها أيضا أن تحجب عنك آلة تديرها عن بعد. حرر من جلسة محلية حين تستطيع، وأبق الملف السابق بجانب الجديد، واعرف طريق الرجوع قبل أن تحتاجه. الأوامر أدناه تعطل المرشح وتعيد تحميل النسخة التي أبقيتها، وهي التسلسل الذي ينفذ من وحدة تحكم لا عبر النفق الذي قطعته للتو. رجوع في خمس ثوان يغلب قاعدة بارعة في كل مرة.
sudo pfctl -d
sudo pfctl -f /etc/pf.conf.previous
sudo pfctl -s rules
الاستمرارية تتطلب عفريت إطلاق يشغل pfctl -e ويحمل ملفك عند الإقلاع. عامله كأي وظيفة مميزة أخرى: مسارات مطلقة، وسجل يمكنك قراءته لاحقا، واختبار على آلة يمكنك الوصول إليها ماديا. العفريت الذي يفشل بصمت يترك الآلة غير محمية وتبدو طبيعية.
وثق الثغرات، بدءا بعميل VPN ثان ينشئ جهاز نفق خاصا به. قواعدك تسمي واجهة نفق واحدة، فيبقى الثاني محجوبا أو تطابقه قاعدة واسعة تضاف لاحقا. واجهات الربط ونقطة الاتصال تظهر أحيانا فقط وتستحق الملاحظة نفسها. لا شيء من تلك الثغرات سبب لتخطي السياسة؛ بل هي الشروط التي تظل صالحة تحتها.