الرئيسية
» مسؤول الشبكة
»
How to Configure an External TURN Server for Jitsi behind NAT
How to Configure an External TURN Server for Jitsi behind NAT
The most important point: an external TURN server should be configured as a fallback for clients that cannot establish a usable WebRTC path because of NAT or restrictive firewalls. It is not a replacement for the Jitsi Videobridge (JVB) in normal multiparty meetings. If your Jitsi server itself is behind NAT, you must still make JVB reachable from the Internet, normally on UDP 10000, or configure the bridge's advertised public address correctly.
For current Jitsi deployments, the cleanest design is usually a publicly reachable coturn host with a DNS name such as turn.example.com, time-limited credentials supplied by Prosody through XEP-0215, and TURN over UDP/TCP plus TURN over TLS for restrictive networks. Jitsi's current TURN documentation explicitly recommends dynamic credentials instead of embedding a permanent username and password in browser configuration. See the official Jitsi TURN setup documentation.
Jitsi media should use the normal bridge path when possible, while the external TURN server provides a fallback for clients on restrictive networks.
When an external TURN server is the right solution
Use TURN when some participants can open the Jitsi web page but cannot establish reliable media, especially from corporate networks, hotel Wi-Fi, campuses, mobile carriers, VPNs, or other environments that block or heavily filter UDP. TURN is also useful for one-to-one Jitsi calls when peer-to-peer connectivity cannot be established directly.
Do not treat TURN as the first fix for a misconfigured Jitsi Videobridge. The official Jitsi Debian/Ubuntu guide says that when the server is behind NAT, the router must forward the required ports and the bridge may need an explicit local-to-public address mapping. By default, the important Jitsi-facing ports are TCP 443 and UDP 10000. Review the current Jitsi self-hosting guide for Debian/Ubuntu before adding TURN.
Symptom or requirement
What to check first
Two users fail to connect directly on restrictive networks
TURN is a strong candidate.
Three or more participants have no audio/video
Verify JVB UDP 10000 and its public address before blaming TURN.
Users on normal home networks work, but corporate users fail
Add TURN/TLS, preferably reachable on TCP 443 if your network design allows it.
You want credentials that are not permanently exposed in JavaScript
Use Prosody external services with a shared secret and short-lived credentials.
Step 1: Prepare a public TURN host and DNS
أبسط بنية هي استخدام جهاز افتراضي أو خادم منفصل بعنوان IP عام. أنشئ سجل A أو AAAA بحيث turn.example.comيُشير إلى هذا المضيف. يُعد اسم المضيف المخصص مفيدًا للغاية إذا كنت ستوفر لاحقًا بروتوكول TURN عبر TLS، لأن الشهادة يجب أن تتطابق مع اسم المضيف الذي يستخدمه العملاء.
إذا كان مضيف TURN نفسه خلف جدار حماية NAT، يحتاج برنامج coturn إلى معرفة العنوان العام الذي يجب عليه الإعلان عنه. يدعم coturn عملية external-ipربط العناوين، بما في ذلك أزواج العناوين العامة/الخاصة external-ip=203.0.113.10/192.168.1.10. تشير وثائقه أيضًا إلى ضرورة ربط منافذ الترحيل بشكل متسق عبر NAT. راجع مثال تكوين coturn الرسمي .
عادة ما يكون من الأسهل عرض مضيف TURN عام منفصل بشكل متسق من خدمة TURN مخفية خلف نفس الشبكة الخاصة مثل Jitsi.
الخطوة الثانية: تركيب الكوترن
على نظام Debian أو Ubuntu مدعوم، قم بتثبيت coturn من مستودع التوزيعة:
sudo apt update
sudo apt install coturn
تختلف إصدارات الحزمة باختلاف إصدار نظام التشغيل، لذا لا تنسخ رقم الإصدار من لقطة شاشة أو من خادم آخر. بعد التثبيت، تأكد من وجود وحدة الخدمة وأن الحزمة قد تم تثبيتها turnserver.
قم بتثبيت coturn باستخدام مدير الحزم على مضيف TURN المخصص؛ يعتمد إصدار الحزمة الدقيق على إصدار Linux.
الخطوة 3: تهيئة coturn للمصادقة باستخدام السر المشترك
بالنسبة لـ Jitsi، يعتمد الإعداد العملي للإنتاج على آلية السر المشترك لـ coturn، مما يسمح لـ Prosody بإنشاء بيانات اعتماد TURN مؤقتة. استخدم نفس السر على كلا الجانبين. تبدو نقطة البداية الدنيا كالتالي:
إذا كان مضيف TURN خلف جدار حماية NAT، فأضف external-ipالتعيين المناسب. إذا فعّلتَ TURN عبر TLS، فقم بتكوينه certباستخدام pkeyشهادة موثوقة turn.example.com. توضح وثائق حاوية coturn الرسمية أن TURN يستخدم نطاق منافذ ترحيل للوسائط، ويمكن تضييق هذا النطاق باستخدام min-port. max-portراجع وثائق Docker الرسمية لـ coturn لمعرفة سلوك منفذ الترحيل نفسه.
تتضمن إعدادات coturn النموذجية منافذ الاستماع، وسر مشترك، ونطاق منفذ الترحيل، وتعيين عنوان IP خارجي عندما يكون مضيف TURN خلف NAT.
الخطوة 4: افتح منافذ الاستماع والترحيل
من الأخطاء الشائعة فتح المنفذين 3478 أو 5349 فقط مع نسيان نطاق الترحيل. يستمع برنامج Coturn إلى اتصال TURN الأولي، لكن الوسائط المُرحّلة تستخدم منافذ ترحيل مُخصصة. إذا اخترتَ 49160-49200السماح بمرور هذا النطاق نفسه عبر جدار حماية المضيف، ومجموعة أمان السحابة، وأي NAT مُوجّه للشبكة.
إذا كنت بحاجة إلى أقصى قدر من التوافق مع شبكات الشركات ذات الحماية الأمنية، يشرح دليل TURN الخاص بـ Jitsi كيفية تشغيل TURN عبر بروتوكول TLS على منفذ TCP 443. قد يتطلب ذلك اسم مضيف مخصص لـ TURN، وعندما يتشارك بروتوكول HTTPS مع الويب نفس العنوان العام، يلزم استخدام تقنية TLS SNI تعدد الإرسال. لا تنقل TURN إلى المنفذ 443 بشكل عشوائي إلا إذا كنت على دراية تامة بالجهات التي تستخدم هذا المنفذ حاليًا.
يجب أن يسمح جدار الحماية لكل من مستمع TURN ونطاق منفذ الترحيل المحدد في coturn.
الخطوة 5: تهيئة Jitsi للإعلان عن خدمة TURN الخارجية
في بيئة نشر حزمة Jitsi الحالية على Debian/Ubuntu، يستخدم Prosody mod_external_servicesلنشر معلومات STUN/TURN للعملاء. يستخدم مثال Prosody الخاص بـ Jitsi جدولًا external_service_secretيحتوي external_servicesعلى secret = true. يجب أن يتطابق السر المشترك مع static-auth-secret.
external_service_secret = "REPLACE_WITH_THE_SAME_LONG_RANDOM_SECRET";
external_services = {
{ type = "stun", host = "turn.example.com", port = 3478 },
{ type = "turn", host = "turn.example.com", port = 3478,
transport = "udp", secret = true, ttl = 86400, algorithm = "turn" },
{ type = "turns", host = "turn.example.com", port = 5349,
transport = "tcp", secret = true, ttl = 86400, algorithm = "turn" }
};
احتفظ بالوحدات النمطية الحالية والإعدادات الخاصة بالموقع في ملف Prosody الذي أنشأه Jitsi؛ ولا تستبدل الملف بالكامل بالمقتطف المذكور أعلاه. عادةً ما يتبع اسم الملف نطاق النشر الخاص بك /etc/prosody/conf.d/. يمكنك الاطلاع على مثال تكوين Jitsi الأصلي في مستودع Jitsi الرسمي .
إذا كنت تستخدم نشر Docker الرسمي، فمن الأفضل استخدام متغيرات البيئة الموثقة فيه بدلاً من تعديل ملفات Prosody المُنشأة يدويًا. تُوفّر وثائق Docker الحالية المتغيرات التالية TURN_CREDENTIALS: TURN_HOSTو و TURN_PORTو TURN_TRANSPORTو TURNS_HOSTو و . راجع دليل الاستضافة الذاتية لـ Jitsi DockerTURNS_PORT الحالي، لأن القيم الافتراضية للمتغيرات قد تتغير بين الإصدارات.
قبل تغيير Jitsi، تحقق من أن اسم مضيف TURN يتم حله وأن coturn يستمع بالفعل على منافذ النقل المتوقعة.
الخطوة 6: أعد تشغيل الخدمات وتحقق من صحتها
بعد تغيير دورة المحرك، أعد تشغيله وتحقق من حالته:
sudo systemctl restart coturn
sudo systemctl status coturn
sudo ss -lntup | grep -E '3478|5349'
بعد تغيير إعدادات Prosody، تحقق من صحة بناء الجملة إذا كانت حزمة Prosody لديك توفر أداة التحقق، ثم أعد تشغيل Prosody. بناءً على التغييرات التي أجريتها في Jitsi، قد يكون من المناسب أيضًا إعادة تشغيل خدمات Jitsi ذات الصلة.
لا يُثبت وجود حالة خدمة coturn سليمة سوى أن البرنامج يعمل. ولا يُثبت ذلك تطابق بيانات الاعتماد، أو إمكانية الوصول إلى نطاق الترحيل، أو قدرة المتصفح على الحصول على مرشح للترحيل.
استخدم حالة الخدمة وفحوصات المستمع كخطوة تحقق أولى؛ ستختلف الطوابع الزمنية ومعرفات العمليات على خادمك.أعد تشغيل خدمات Jitsi المتأثرة بتغييرات التكوين فقط، ثم اختبرها بجلسة متصفح جديدة.
الخطوة 7: اختبار قدرة TURN على نقل الوسائط فعليًا
لا يكفي إجراء الاختبار من نفس الشبكة المحلية. استخدم عميلًا واحدًا على الأقل على شبكة مختلفة، ويفضل أن تكون شبكة جوالة أو شبكة معروفة بتقييد بروتوكول UDP. في تشخيصات WebRTC للمتصفح، ابحث عن مرشح ICE من النوع المحدد relay. يشير مرشح الترحيل إلى أن المتصفح قد حصل بنجاح على بيانات اعتماد TURN وأنشأ تخصيصًا لشبكة TURN.
راقب أيضًا سجلات coturn أثناء انضمام المستخدم التجريبي. يجب أن ترى عمليات تخصيص موارد مصادق عليها وحركة مرور مُرحّلة عند تحديد TURN. إذا واجهتَ حالات فشل في المصادقة، قارن سجل coturn static-auth-secretمع بيانات اعتماد Prosody أو Docker TURN السرية. إذا نجحت عمليات التخصيص ولكن استمر فشل الوسائط، فتحقق من جدار الحماية الخاص بمنفذ الترحيل وتعيين NAT.
لا تُجبر الخادم على استخدام TURN لمجرد إثبات وجوده إلا إذا كان لديك سبب اختبار مُحكم. في الظروف العادية، يختار ICE المسار الأمثل. لذا، قد يتضمن النشر الناجح العديد من الاجتماعات التي لا تحتاج إلى TURN.
هذه هي النقطة التي تمنع إهدار معظم وقت استكشاف الأخطاء وإصلاحها. لا يزال خادم Jitsi الموجود خلف جدار الحماية NAT بحاجة إلى تهيئة إمكانية الوصول العامة للجسر بشكل صحيح. يشير دليل البدء السريع الحالي لـ Jitsi إلى أن الجسر عادةً ما يقوم بتهيئة نفسه تلقائيًا، ولكن في حالة فشل المكالمات الكبيرة، يمكنك إضافة تعيين ثابت ice4j.harvest.mappingضمن /etc/jitsi/videobridge/jvb.conf:
قم بتوجيه حزمة UDP رقم 10000 من الشبكة العامة إلى مضيف JVB، وتأكد من أن عنوان الشبكة العامة هو العنوان الذي يمكن للعملاء البعيدين الوصول إليه فعليًا. قد يُفيد بروتوكول TURN العملاء على الشبكات ذات القيود، ولكن لا ينبغي استخدامه لإخفاء خلل في تعيين NAT الخاص بـ JVB.
يحافظ التصميم المطلوب على إمكانية الوصول المباشر إلى JVB للوسائط العادية بينما يظل TURN بمثابة خيار احتياطي للشبكات التي لا يمكنها استخدام المسار المباشر.
قائمة التحقق السريعة لحل المشكلات
لا يتم حل اسم المضيف TURN: قم بإصلاح نظام أسماء النطاقات (DNS) قبل اختبار Jitsi.
3478/5349 يستمع محليًا ولكن ليس عن بعد: فحص جدار الحماية المضيف، وجدار الحماية السحابي، وNAT الموجه، وتصفية الموفر.
فشل بيانات الاعتماد: تحقق من أن السر المشترك متطابق في coturn وفي تكوين Jitsi/Prosody.
يظهر مرشح الترحيل ولكن الوسائط تفشل: تحقق من أن نطاق منفذ الترحيل المُكوّن مفتوح من طرف إلى طرف.
فشل المكالمات متعددة الأطراف فقط: تحقق من JVB UDP 10000 وإعلان العنوان العام لـ JVB.
الشبكات المؤسسية فقط هي التي تفشل: أضف أو تحقق من TURN عبر TLS، غالبًا على TCP 443 عند الاقتضاء.
تختفي تغييرات Docker بعد إعادة التشغيل: قم بتكوين المتغيرات المدعومة .envبدلاً من تعديل الملفات التي تم إنشاؤها داخل الحاويات.
هذا ما تبدو عليه النتيجة الصحيحة
يتميز الإعداد السليم بثلاثة سلوكيات ملحوظة. أولًا، يمكن للمستخدمين العاديين الوصول إلى Jitsi Videobridge مباشرةً دون الحاجة إلى TURN عندما تسمح شبكاتهم بذلك. ثانيًا، يمكن للمستخدمين على الشبكات ذات القيود الحصول على بيانات اعتماد TURN مؤقتة والحصول على relayمرشح ICE. ثالثًا، يعرض coturn التخصيصات الموثقة فقط عند الحاجة، بدلًا من عرض جميع الاجتماعات افتراضيًا.
يُوفر هذا المزيج حلاً احتياطياً فعالاً دون تحويل خادم TURN إلى عنق زجاجة غير ضروري في عرض النطاق الترددي. كما يُسهّل عملية استكشاف الأخطاء وإصلاحها: فمشاكل JVB NAT تبقى مشاكل JVB، بينما يُعالج TURN مشكلة اتصال WebRTC عند حظر المسارات المباشرة.