چرا یک تماس 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 را مبادله میکنند، که در یک LAN خوب کار میکند و وقتی یک طرف پشت محدوده درگاه تنگی است بد.
تنظیم direct_media=no PBX را به مسیر رسانه میراند تا هر دو شاخه روی آدرسی که خودش کنترل میکند پایان یابند و در عوض پهنای باند و پردازنده را برای آدرسدهی قابل پیشبینی مبادله کند. هنگام رله، PBX باز هم باید آدرس قابلدسترسی اعلام کند. روی میزبان چندرابطی، external_media_address و external_signaling_address در pjsip.conf تعیین میکنند چه چیزی در SDP و در سرآیندهای Via ظاهر شود. اگر آنها را تنظیمنشده بگذارید، PBX ممکن است آدرس LAN خود را به تماسگیرندهای پیشنهاد دهد که تنها مسیرش سمت دور تونل است.
پیش از دست زدن به تنظیمات هر جهت را دنبال کنید
وقتی تماسی برقرار است با جدول سوکتهای 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 آدرسی را حمل میکند که طرف دور میتواند به آن برسد، و بستهها در هر دو جهت روی درگاههای رسانه جریان دارند. اگر هر یک از اینها نادرست باشد، تونل جای مشکل نیست. مسیری را که شکست خورده درست کنید و سپس همان ضبط را دوباره اجرا کنید تا تغییر را تأیید کنید. نگه داشتن ضبطهای قبل و بعد، گزارش یکطرفه بعدی را از یک بعدازظهر کامل به بررسی پنجدقیقهای تبدیل میکند.