רישום מוצלח לא אומר כמעט דבר על שמע. טלפון תוכנה יכול להחזיק קישור תקף עם ה-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 אחר.

PathWho picks the addressTypical failure
REGISTERSoftphone, rewritten by the registrar if configuredBinding expires or points at a private address
INVITE and SDPEach endpoint in its own offer or answerOffer names a media address nobody can route to
RTPPBX relay policy or the two endpointsPort 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 עלול להציע את כתובת ה-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 נושא כתובת שאליה הצד הרחוק יכול להגיע, והחבילות זורמות בשני הכיוונים בפורטי המדיה. אם אחד מהם שגוי, המנהרה אינה מקום הבעיה. תקנו את הנתיב שנכשל, ואז הריצו שוב את אותה לכידה כדי לאשר את השינוי. שמירת הלכידות מלפני ואחרי הופכת את הדוח החד-כיווני הבא לבדיקה של חמש דקות במקום אחר צהריים שלם.

מאמרים קשורים