FreeBind مقابل After=: ربط مقبس systemd بعنوان VPN
يتيح FreeBind لـ systemd امتلاك المستمع قبل وجود عنوان VPN، بينما After= يرتّب المهام فقط. قارن بينهما ثم اختبر الترتيب والجاهزية.
عند الإقلاع، قد تفشل وحدة مقبس تربط عنوان VPN ثابتًا قبل أن يمنحه النفق، فلا تبدأ الخدمة التي تقف خلفه أبدًا. مفتاحان يبدوان كحلّين ويعالجان نصفين مختلفين من المشكلة. يتيح FreeBind لـ systemd إنشاء المستمع بينما لا يزال العنوان غائبًا. أما After= فيرتّب المهام فقط، فيغيّر متى تبدأ الأشياء دون أن يجعل العنوان يصل أبكر.
مشكلتان مختلفتان، مفتاحان مختلفان
المشكلة الأولى هي فشل في الربط: يرفض النواة الاستماع على عنوان لا يملكه المضيف، فتفشل وحدة المقبس فورًا ولا تُنشّط الخدمة أبدًا. المشكلة الثانية هي فشل في الجاهزية: العنوان موجود في النهاية، لكن شيئًا يحاول استخدامه قبل أن ينقل النفق حركة المرور. يعالج FreeBind الأولى ولا يفعل شيئًا للثانية. وتوجيهات الترتيب لا تعالج أيًّا منهما مباشرة، لأنها تقرر فقط ما يبدأ وبأي تسلسل. وتسمية الفشل الذي تواجهه فعلًا هي القرار كله.
تأكد من أي الفشلين لديك من السجل لا من وصف الخدمة. فشل الربط يذكر عنوانًا ويبلّغ بأنه لا يمكن منحه. أما فشل الجاهزية فيظهر عادة لاحقًا، على شكل مهلة أو اتصال مرفوض من الطرف الآخر، مع وحدة مقبس سليمة تمامًا في السجلات.
FreeBind: المستمع موجود قبل العنوان
يخبر FreeBind النواة بالسماح بالربط على عنوان غير محلي، فيستطيع systemd إنشاء المقبس المستمع عند الإقلاع وتسليمه للتطبيق وقت بدء التطبيق. هذا هو جوهر تنشيط المقبس، وهو سبب قدرة المقبس على البقاء بعد الخدمة التي تقف خلفه.
[Socket]
ListenStream=
ListenStream=10.8.0.1:8443
FreeBind=yes
الإسناد الفارغ يمسح مدخلات الاستماع الموروثة من وحدة المورّد قبل إضافة المدخل الجديد، ما يمنع مستمعًا بديلًا عامًا من الرد على كل واجهة. استبدل العنوان والمنفذ بعنوانك ومنفذك، وتحقق من الوحدة الفعلية لا من ملف الإسقاط وحده. استخدم ملف إسقاط باسم الوحدة بدل تحرير ملف الحزمة في مكانه، لأن تحديث الحزمة التالي سيطمس التحرير ولن يترك أثرًا للنية. ثم طبّقه عبر إجراء إعادة التحميل وإعادة التشغيل الذي تتوقعه وحدة المقبس.
يوثّق مرجع مقبس systemd سلوك IPv4 و IPv6 خلف هذا الخيار، والتفصيل المهم أنه ينطبق على الربط لا على التوجيه. لا شيء فيه يمنح عنوانًا أو يشغّل VPN. FreeBind إذن للمستمع، وليس بديلًا عن الواجهة.
After= و Wants=: الترتيب ليس جاهزية
الترتيب والاشتراط محوران منفصلان، والخلط بينهما ينتج وحدات تبدأ بالترتيب الصحيح وتفشل مع ذلك. After=vpn-client.service يعني فقط أنه إذا بدأ العملان، ينتظر هذا بدء الآخر. وهو لا يسحب VPN، ولا ينتظر انتهاء اتصال VPN.
توجيهات الاشتراط مثل Wants= و Requires= تتولى التنشيط، وهي تختلف في ما يحدث عند فشل التبعية: أحدها يواصل والآخر يتوقف. ولا يعرف أي منهما ما يعنيه نفق متصل. فقد تكون عملية VPN نشطة بلا عنوان ممنوح، أو بعنوان ممنوح وبلا مسار إلى النظير، والحالتان تفيان بالتبعية. وإذا كان التطبيق يحتاج وجود العنوان، فصغ ذلك الشرط صراحة بدل اعتبار بدء العملية دليلًا على الجاهزية.
افحص ما تعلنه الوحدة فعليًا عبر systemctl cat و systemctl show -p After -p Wants -p Requires. فملفات الإسقاط من ثلاثة أدلة مختلفة قد تضيف توجيهات لم تكتبها قط، والوحدة الفعلية هي الشيء الوحيد الذي يقرأه systemd.
ما لا يفعله network-online.target
الوحدة المرتّبة بعد network-online.target تنتظر أن يعلن مدير الشبكة أن الشبكة صالحة للاستخدام، وهي نقطة تزامن عند الإقلاع لا شرطًا مستمرًا. ولا تقول شيئًا عن كون نفق معين قائمًا، ولن تنطلق مرة أخرى حين يعيد VPN الاتصال في منتصف بعد الظهر. واعتبارها مراقبًا لإعادة الاتصال هو أكثر قراءة خاطئة شيوعًا لهذا الهدف.
يوثّق مشروع systemd هذا الفرق مباشرة، والنتيجة العملية أن كل ما يحتاج عنوان نفق عليه أن يملك التبعية بنفسه. والوحدة التي تنتظر network-online ثم تربط عنوان نفق لا تكون صحيحة إلا حين يصعد النفق أولًا بمحض المصادفة، وهذا مصادفة لا تصميم.
اختبر دورة الحياة التي اخترتها فعلًا
اختبر إقلاعًا نظيفًا، وطلبًا بعد ظهور العنوان، والسلوك بعد سقوط VPN وعودته. هذه الحالات الثلاث تفصل مستمعًا عاملًا عن خدمة عاملة.
systemd-analyze verify myapp.socket
systemctl cat myapp.socket
ss -ltn "sport = :8443"
الأمر الأول يلتقط أخطاء ملف الوحدة قبل إعادة التشغيل، والثاني يعرض الوحدة المدمجة، والثالث يثبت وجود المستمع وعلى أي عنوان. ومستمع على عنوان عام حيث توقعت عنوان نفق هو بالضبط البقايا التي كان ListenStream الفارغ يهدف إلى إزالتها. أعد الأمر الثالث بعد إعادة اتصال VPN لترى هل تحرك العنوان.
اختر دورة الحياة عن قصد: إما مستمع مربوط بحرية ينتظر عودة عنوان مستقر، وإما خدمة تتوقف مع النفق وتبدأ من جديد عند التعافي. هذان تصميمان مختلفان ويفشلان بطرق مختلفة. ثم أبقِ سياسة الوصول مرتبطة بالمصادر والمسارات التي قصدتها، لأن ربط عنوان وجهة لا يستلزم أن الحزم المقبولة وصلت عبر واجهة موثوقة.