لماذا تُسجِّل مكالمة SIP عبر VPN دون أن ترسل أي صوت
التسجيل والصوت يسلكان مسارين مختلفين. تتبَّع مكالمة واحدة عبر النفق لترى العناوين التي يستطيع PBX استخدامها وأين يتوقف RTP فعليًا.
نجاح التسجيل لا يخبرك تقريبًا بأي شيء عن الصوت. يمكن لهاتف برمجي أن يحتفظ بربط صالح مع PBX المكتب لساعات ويظل يسلّم صمتًا. النفق لا يحمل إلا الحزم التي يرسلها أحدهم إليه عمدًا، والمكالمة تستخدم ثلاثة مسارات منفصلة: الربط، وإعداد الحوار، وتدفق RTP. وبمجرد فصل هذه المسارات، يقع العطل على مسار واحد بدلًا من كلمة VPN.
تخيّل حاسوبًا محمولًا على شبكة Wi-Fi منزلية يتصل بتحويلة مكتبية عبر نفق معتمد. يتحقق PBX من المستخدم، ويقبل REGISTER، وتظهر التحويلة متاحة، ومع ذلك تتصل المكالمة بصمت تام في اتجاه واحد.
التسجيل يربط جهة اتصال، لا مسار وسائط
يطلب REGISTER من المسجّل تخزين تعيين بين عنوان السجل وعنوان URI واحد أو أكثر لجهة الاتصال. يجيب ذلك التعيين عن سؤال ضيق حول مكان إرسال حوار جديد الآن. ولا يقول شيئًا عن مكان الوسائط، والتسجيل المقبول لا يثبت أن INVITE لاحقًا يحمل عنوان وسائط يمكن الوصول إليه. كما تنتهي صلاحية التسجيلات بمؤقت، فالهاتف الذي يتوقف عن التجديد يفقد المكالمات الواردة بينما يبدو النفق سليمًا. راقب انتهاء صلاحية جهة الاتصال بدلًا من حالة النفق.
عندما يكون الهاتف البرمجي خلف النفق، قد يحمل رأس جهة الاتصال عنوانًا خاصًا. وPBX الذي يعيد توجيهه إلى نقطة نهاية أخرى ينشئ حوارًا موجّهًا إلى شبكة لا يستطيع الطرف المتصل به الوصول إليها. ضبط rewrite_contact=yes على نقطة نهاية PJSIP يجعل PBX يستبدل عنوان المصدر الذي رصده، وهو غالبًا الفرق بين رنين ومهلة.
ما يعرضه INVITE ومن يستطيع استخدامه
يعرض INVITE الذي يحمل جسم SDP المكان الذي يريد المتصل استقبال الوسائط فيه: عنوانًا ومنفذًا وقائمة ترميزات. يرد الطرف المتصل به بعنوانه ومنفذه، ثم يرسل كل جانب RTP إلى ما اقترحه الآخر. وإذا اقترح المتصل عنوانًا من نوع 192.168.x.x لا يوجد إلا داخل شبكته المنزلية، فلا يجد الطرف الآخر مكانًا يرسل إليه الصوت مهما كانت الإشارة نظيفة. إخفاء العناوين يعيد كتابة رؤوس IP مع خروج الحزم من الموجّه، لكنه لا يعيد كتابة النص داخل جسم SDP أبدًا.
تفسر تلك الفجوة المكالمة الكلاسيكية أحادية الاتجاه: تعمل الإشارة لأن كلا الطرفين يستطيع الوصول إلى PBX، ويفشل الصوت لأن أحد الطرفين أُمر بالإرسال إلى عنوان لا يوجد إلا خلف NAT مختلف.
| Path | Who picks the address | Typical failure |
|---|---|---|
| REGISTER | Softphone, rewritten by the registrar if configured | Binding expires or points at a private address |
| INVITE and SDP | Each endpoint in its own offer or answer | Offer names a media address nobody can route to |
| RTP | PBX relay policy or the two endpoints | Port range blocked, or no return path |
من يحمل الصوت خيار إعدادات
الإشارة والوسائط دوران منفصلان. يمكن لوكيل أن يبقى على مسار الإشارة طوال مكالمة كاملة ولا يلمس حزمة RTP واحدة. أما أن يصبح PBX مرحّل وسائط فيعتمد على الإعدادات، لا على وجود نفق.
مع الوسائط المباشرة يتبادل الطرفان RTP بنفسيهما، وهذا يعمل جيدًا على شبكة محلية واحدة وسيئًا عندما يكون أحد الجانبين خلف نطاق منافذ ضيق.
ضبط direct_media=no يدفع PBX إلى مسار الوسائط كي ينتهي كلا الفرعين على عنوان يتحكم فيه، مقابل عرض النطاق والمعالجة من أجل عنونة يمكن التنبؤ بها. وعندما يرحّل، يظل على PBX أن يعلن عنوانًا يمكن الوصول إليه. على مضيف متعدد الواجهات، يحدد external_media_address و external_signaling_address في pjsip.conf ما يظهر في SDP وفي رؤوس Via. اتركهما دون ضبط فقد يعرض PBX عنوان شبكته المحلية على متصل مساره الوحيد هو الطرف البعيد من النفق.
تتبَّع كل اتجاه قبل لمس الإعدادات
ابدأ بجدول المقابس على PBX أثناء مكالمة قائمة: ss -uanp | grep -E '5060|10000' يبيّن ما إذا كانت منافذ RTP مربوطة وأي عنوان محلي تستخدمه. وإذا لم يكن هناك شيء مربوط في نطاق الوسائط، فالمرحّل غير مشارك والطرفان يتحدثان مباشرة. ثم التقط على جانب الهاتف البرمجي باستخدام tcpdump -ni any -s0 udp portrange 10000-20000 -w rtp.pcap. الحزم الصادرة دون حزم واردة تضيّق المشكلة إلى مسار العودة أو إلى العنوان الذي أُمر الطرف البعيد باستخدامه، والالتقاط الفارغ يعني أن الوسائط لم تصل إلى واجهة النفق إطلاقًا. والتقاط الإشارة باستخدام sngrep يجيب عن النصف الآخر بعرض سطر اتصال SDP كما أُرسل.
قارن العنوان في سطر الاتصال ذلك بالعنوان الذي يستطيع الطرف البعيد التوجيه إليه فعليًا. هذا المقارنة الواحدة تحل معظم تقارير الصوت أحادي الاتجاه أسرع من أي مراجعة إعدادات.
التشفير يتوقف عند حافة النفق
SIP عبر TLS يحمي قفزة الإشارة التي ضُبط من أجلها، وSRTP يحمي الوسائط عندما يتفاوض الطرفان عليه، والنفق يحمي حركة المرور بين طرفيه. ولا شيء منها يمنح الآخر. المكالمة المشفرة داخل النفق قد تغادر البوابة بنص واضح نحو PBX، وهذا قرار تصميم لا عيب.
قبل إغلاق التذكرة، تحقق من ثلاثة أمور بالترتيب: التسجيل حديث، وجسم SDP يحمل عنوانًا يستطيع الطرف البعيد الوصول إليه، والحزم تتدفق في الاتجاهين على منافذ الوسائط. إذا كان أي منها غير صحيح، فالنفق ليس مكان المشكلة. أصلح المسار الذي فشل، ثم أعد نفس الالتقاط لتأكيد التغيير. الاحتفاظ بالتقاطعات قبل وبعد يجعل التقرير التالي أحادي الاتجاه فحصًا من خمس دقائق بدلًا من بعد ظهر كامل.