الإشارة القاتلة 15 في L2TP: خطأ NO_PROPOSAL_CHOSEN وغياب modp1024
الإشارة القاتلة 15 مع NO_PROPOSAL_CHOSEN تعني عدم تطابق في المرحلة 2: إما أن البرنامج الخفي لم يعد يعرض modp1024، أو أن قيمة من المرحلة 1 موضوعة في حقل المرحلة 2.
اتصالك يتوقف عن الاستجابة، ويخرج العميل، ويكون آخر سطر على الشاشة هو death_handler: Fatal signal 15 received. ذلك السطر يبلّغ عن إجهاض العملية لا عن سببها. وقبل سطر واحد في سجل IPsec يوجد دائمًا تقريبًا NO_PROPOSAL_CHOSEN، ويشير الزوجان إلى المرحلة 2 من التبادل، حيث يقارن الطرفان خيارات التشفير والتجزئة ويتوقفان عندما لا يشتركان في أي منها. لم تُرسَل بيانات الاعتماد في تلك المرحلة بعد، لذا فإن إعادة كتابة كلمة المرور لا يمكن أن تغيّر النتيجة.
عادةً ما يُفرغ أمران ذلك التقاطع على عميل لينكس. قد لا ينفّذ البرنامج الخفي المحلي مجموعة Diffie-Hellman التي يطلبها الملف الشخصي، أو قد يحمل الملف الشخصي مقترحًا من المرحلة 1 في حقل المرحلة 2. كلاهما يترك أثرًا في السجل، وليس أي منهما مشكلة في الحساب.
ما تقوله الرسالتان في الحقيقة
يتفاوض IKE على مراحل. تبني المرحلة 1 قناة محمية وتختار خوارزمياتها الخاصة؛ أما المرحلة 2، وهي SA الفرعية، فتحمل حركة البيانات وفق مجموعة منفصلة. NO_PROPOSAL_CHOSEN هو الإشعار الذي يعيده المستجيب عندما لا يكون أي من التوليفات المعروضة مقبولًا، ويظهر بصيغة [ HASH N(NO_PROP) ] داخل تبادل INFORMATIONAL.
الإشارة 15 حدث مختلف: شيء ما أمر العملية المحلية بالتوقف فسجّله المعالج. وعندما يظهر السطران معًا يكون الترتيب سببيًا، الرفض أولًا ثم الإغلاق.
اقرأ التفاوض قبل أن تمسّ بيانات الاعتماد
ارفع مستوى السجل حيث يكتب البرنامج الخفي، ثم أعد الاتصال مع مراقبة الخرج. على مضيف NetworkManager يمرّر ملحق L2TP ذلك المستوى إلى الواجهة الخلفية، وتصل الرسائل إلى السجل اليومي أو إلى ملف syslog التقليدي بحسب التوزيعة. أي من هذين الأمرين سيُظهر التبادل: journalctl -f -u NetworkManager | grep -Ei 'pluto|charon|no_prop|proposal' أو tail -f /var/log/syslog | grep -Ei 'pluto|charon|ike'.
السطر الذي يذكر pluto يأتي من libreswan، وcharon من strongSwan، وكلاهما يصف الحالة نفسها بكلمات مختلفة. والصيغة التي تستحق البحث عنها هي التي تسمّي المجموعة المفقودة، مثل algorithm 'modp1024' is not supported، لأنها تحوّل عطلًا غامضًا إلى عطل محدد.
إلى أين ذهب modp1024
المجموعة 2 من Diffie-Hellman ضعيفة بما يكفي لتتوقف عدة توزيعات عن تضمينها في libreswan بدءًا من 3.30. عندئذٍ يطلب ملف شخصي كُتب قبل سنوات، أو نُقل من دليل بوابة يسرد aes128-sha1-modp1024 فقط، من البرنامج الخفي المحلي شيئًا لا يستطيع تنفيذه إطلاقًا. وبناءات NetworkManager-l2tp الأحدث تجعل هذه النتيجة أكثر ترجيحًا: فهي منذ 1.2.16 تستبدل المجموعة بمقترحات على طراز Windows 10 وiOS وتُسقط modp1024 بمجرد اكتشاف libreswan. وغالبًا ما يكون الطرف المقابل بريئًا ولا يزال يعرض المجموعة التي أعددتها بالضبط.
هذا التفاوت هو ما يجعل العطل يبدو عشوائيًا. عميل أقدم يتصل، والملف الشخصي نفسه على حاسوب محمول محدّث لا يتصل، وإعدادات الخادم لم تتغير قط. انحراف الإصدارات هو ما يسبب الضرر.
إصلاحان بأثرين مختلفين
الإصلاح الرخيص هو التوقف عن تثبيت الخوارزميات يدويًا. أفرغ حقلي المقترحات في المحرر ودع الملحق يختار مجموعة يقبلها الطرف البعيد؛ فإن كانت البوابة تدعم مجموعات حديثة يكتمل التفاوض دون عمل إضافي.
الإصلاح الثاني يبقي بوابة قديمة قابلة للوصول عبر تثبيت strongSwan، الذي لا تزال حزمه تنفّذ المجموعة 2 على معظم التوزيعات. هذا استبدال للبرنامج الخفي، وله كلفة: تأكد مما إذا كانت أنفاق أخرى على المضيف تعتمد على إعداد libreswan قبل إزالته، وتوقع رفضًا من SELinux بين NetworkManager وملحق strongSwan على فيدورا. تظهر حالات الرفض تلك في سجل التدقيق لا في أثر IKE، ولهذا قد يبدو النفق معطلًا مباشرة بعد تثبيت ناجح. الترتيب الذي ينجح هو dnf install strongswan أولًا، ثم rpm -e libreswan.
سلاسل المقترحات المتوافقة، والمصائد حولها
عندما يتعين ملء الحقول يدويًا، تأخذ المرحلة 1 والمرحلة 2 قيمًا مختلفة. الزوج المعروف بنجاحه مع طرف مقابل على طراز Meraki يعرض aes128-sha1-modp1024 في المرحلة 1، ويأتي 3des-sha1-modp1024 خلفه، وكلاهما مغلق بعلامة تعجب تجعل المجموعة صارمة، فلا تُرسل إلا تلك المقترحات.
ثم تضيّق المرحلة 2 إلى aes128-sha1 ويأتي بعده 3des-sha1 بالعلامة الصارمة نفسها ودون أي لاحقة Diffie-Hellman. سطر في المرحلة 2 يحمل -modp1024 هو قيمة من المرحلة 1 في الحقل الخطأ، ويرفضه المستجيب في كل محاولة إعادة. انسخ ذلك السطر إلى ملف شخصي ثانٍ فيفشل الثاني بالطريقة نفسها، وهكذا يتحول خطأ كتابي واحد إلى حادثة على مستوى الأسطول.
أعطال أخرى ترتدي النافذة المنبثقة نفسها من دون أن تكون عدم تطابق في المقترحات. على KDE قد يُدرج نوع L2TP مع أن الملحق مثبّت بينما يموت كل اتصال فورًا، لأن محرر الاتصالات ومساعدات وقت التشغيل تُشحن كحزم منفصلة. ويمكن للمضيفات بلا واجهة إعادة استخدام ملف شخصي من سطح مكتب عامل: انسخه من /etc/NetworkManager/system-connections/، واضبط الوضع على 600، ثم نفّذ nmcli con reload. أطلقه بـ nmcli con up id work-l2tp، لأن الصيغة المجردة تطلب UUID، وأزل أي مدخل ifname قديم وإلا ردّ المدير بـ Could not find source connection بينما كل شيء آخر صحيح.
قد تُخزَّن المفاتيح المشتركة مسبقًا كنص صريح أو بصيغة 0s متبوعة بـ base64؛ كلتا الصيغتين تعملان، لكن القيمة يجب أن تطابق البوابة بايتًا ببايت، بما في ذلك المسافات اللاحقة التي نسختها معها.