הנה מידע כללי על NAT שעשוי לעזור במצב שלך …
Network Address Translation (NAT) הוא נוהג נפוץ ברשתות, והוא לא מסתדר היטב עם VoIP. פתרון הבעיה דורש הבנה של NAT, VoIP וההגדרה של מערכת ה‑VoIP שלך. ההסבר הבא מתמקד בפרוטוקול SIP עבור VoIP באמצעות Asterisk, אבל הבעיות והפתרונות רלוונטיים לרוב המצבים האחרים.
NAT יכול לגרום לבעיות בכמה מקומות. אם אחד ממרכזיות ה‑PBX נמצא מאחורי שער NAT, מרכזיית ה‑PBX השנייה לא תוכל ליצור איתו קשר בלי הגדרה נוספת של הרשת. אם אחד או יותר מהטלפונים נמצאים מאחורי שער NAT, הטלפון בצד השני ינסה לשלוח אודיו לכתובת שאינה ניתנת לניתוב. התוצאה היא שיחות שנכשלות או אודיו חסר.
החלופה ל‑re‑invite היא לגרום ל‑PBX לתווך (relay) את חבילות הקול בין שני קצות השיחה.
לקוח SIP מאחורי שער NAT שמתחבר לשרת באינטרנט
הלקוח יוצר את רשומת התרגום (translation entry) עבור תעבורת ה‑SIP כאשר הוא נרשם לראשונה. כל עוד יש תקשורת תכופה בין שני המארחים, כמו חבילה אחת לדקה, הערוץ יישאר פתוח. ההגדרה היחידה הנדרשת היא לגרום ללקוח להשתמש בכתובת החיצונית שלו בכל חבילות ה‑SDP. בלקוחות שתומכים בכך, יש להפעיל STUN (Simple Traversal of UDP through NAT), כדי שהלקוח יוכל לקבוע את הכתובת החיצונית באופן דינמי, או להזין אותה ידנית. Asterisk אינו תומך ב‑STUN בשלב זה, ולכן כל הגדרות ה‑NAT חייבות להיעשות ידנית. הפקודות הבאות בקובץ /etc/asterisk/sip.conf מגדירות את ה‑NAT כראוי:
[general]
localnet=192.168.0.0/255.255.0.0 // או תת־הרשת שלך
externip=x.x.x.x // השתמש בכתובת שלך
[YOURREMOTEPEER] // שם ה‑peer שלך
nat=yes
qualify=yes // אילוץ keepalives
עם הגדרה זו, Asterisk משתמש בכתובת שהוגדרה ב‑externip עבור כל השיחות ל‑peers שהוגדרו עם nat=yes. הוספת qualify=yes גורמת ל‑Asterisk לבדוק את החיבור לעיתים תכופות כך שתרגומי ה‑NAT לא יוסרו מהחומת־אש. עם שתי הפקודות האלה, תמיד יהיה ערוץ תקשורת בין Asterisk לבין ה‑peer, ו‑Asterisk ישתמש בכתובת החיצונית כאשר הוא שולח הודעות SDP.
מספר טלפוני SIP ושרת Asterisk מאחורי שער NAT
שיחות בין הטלפונים יעבדו היטב כי אין צורך ב‑NAT. עבור שיחות בינך לבין מערכות אחרות באינטרנט יהיו בעיות. אלא אם כן תירשם בצד המרוחק כלקוח (כפי שנעשה בדוגמה הקודמת), לא תוכל לקבל הודעות SIP, ולכן לא תוכל לקבל שיחות. שנית, פרטי הכתובת בהקמת השיחה יצביעו על הכתובת הפנימית של הטלפון, ובעיות האודיו חד־כיווני שהוזכרו קודם לכן יצוצו.
הפתרון הקל ביותר לכך הוא להימנע מ‑NAT לחלוטין. אם יש לך כתובת IP ציבורית זמינה עבור שרת השיחות שלך, השתמש בה. אם שרת ה‑Asterisk מחובר גם לאינטרנט וגם לרשת הפנימית, פורט ה‑SIP נגיש הן מהפנים והן מהחוץ, והבעיה היחידה היא להבטיח ש‑RTP יזרום כראוי. שרת ה‑PBX לא צריך להיות מוגדר כנתב בין הממשקים או לספק masquerading; הוא פשוט צריך לגשר בין שיחות הקול הנכנסות והיוצאות.
כפי שציינתי קודם, ה‑PBX יכול או להישאר בנתיב הקול או לצאת מהדרך. במקרה השני, ה‑PBX מודיע לשני קצות השיחה זה על זה ולאחר מכן הקצוות מדברים ישירות. עם זאת, ל‑Asterisk יכולה להיות הקמת שיחה עם שני הקצוות והוא יתווך את חבילות ה‑RTP בשם כל קצה. המארח הפנימי ידבר עם הכתובת הפנימית, והמארח החיצוני ידבר עם הכתובת החיצונית. ההגדרה היחידה הנדרשת כדי להשיג זאת בקובץ sip.conf היא לבטל re‑invites:
[general]
canreinvite=no // אילוץ תיווך (relaying)
הגדרה זו עובדת היטב משום ששרת ה‑Asterisk יכול לדבר בחופשיות עם האינטרנט כדי לשלוח ולקבל שיחות. הוא גם יכול לדבר עם הטלפונים הפנימיים, ובאמצעות גישור פשוט, להתעלם לחלוטין מ‑NAT.
מתברר שהתנהגות התיווך הזו נדרשת גם כאשר לשרת ה‑Asterisk יש רק כתובת פרטית. יש גם להעביר (forward) את פורטי ה‑RTP בחומת־האש. RTP בוחר מספרי פורטים אקראיים על בסיס גבולות מוגדרים. לפני שניתן להגדיר את הפורטים, יש להגביל אותם בטווח. הגדרת חוקי חומת־האש קלה הרבה יותר אם טווח הפורטים ידוע מראש.
טווח הפורטים שישמש ל‑RTP מוגדר בקובץ rtp.conf. ההגדרה הבאה תגביל את בחירת פורטי ה‑RTP של Asterisk בין 10000 ל‑20000:
[general]
rtpstart=10000 // הפורט הראשון לשימוש
rtpend=20000 // הפורט האחרון לשימוש, מעוגל כלפי מעלה אם אי־זוגי
Asterisk יזדקק למספר פורטי RTP כדי לפעול כראוי. רק פורטים זוגיים משמשים בפועל, וביטול re‑invites גורם להקמת שני חיבורים לכל שיחה. פורטים אלה ופורט ה‑SIP חייבים אז להיות מועברים פנימה על ידי חומת־האש. תחביר iptables הוא:
iptables -t nat -A PREROUTING -i eth0 -p udp \
-m udp --dport 10000:10100 -j DNAT \
–to-destination 192.168.1.10
iptables -t nat -A PREROUTING -i eth0 -p udp \
-m udp --dport 5060 -j DNAT \
–to-destination 192.168.1.10
החלף eth0 בממשק החיצוני של חומת־האש שלך ו‑192.168.1.10 בכתובת של שרת ה‑Asterisk שלך. כללים אלה אומרים לליבת לינוקס לתרגם את כתובת היעד של כל חבילות ה‑UDP בטווח הנתון שנכנסות דרך הממשק החיצוני. זה חייב לקרות בשלב PREROUTING ולא בשלב POSTROUTING, משום שכתובת היעד היא זו שמתורגמת. בשלב זה, כל חבילת SIP או RTP מהאינטרנט תועבר לשרת ה‑Asterisk הפנימי לעיבוד.
כאשר תחנה מרוחקת מבצעת שיחה ל‑Asterisk, חבילת ה‑SIP תועבר פנימה בגלל חוקי ה‑iptables. Asterisk יישאר בזרם המדיה בגלל הפקודה canreinvite=no והוא ישתמש בכתובת החיצונית של חומת־האש בכל חבילות ה‑SDP בגלל פקודות ה‑NAT. לבסוף, זרם המדיה יועבר לשרת ה‑Asterisk בזכות השילוב של העברת פורטי ה‑RTP ב‑iptables וטווחי הפורטים שהוגדרו ב‑rtp.conf.
עד כה, ההגדרה התמקדה בהפעלת Asterisk מאחורי שער NAT, עם כמה פרטים נוספים כדי לגרום לטלפונים לתווך דרך Asterisk. כמובן שיש פתרונות כלליים יותר.
אם אתה יכול להימנע מ‑NAT מלכתחילה, זה לטובתך, משום שזה מונע את כל הבעיות שנתקלנו בהן עד עכשיו.
לשער ה‑Asterisk ניתן להחיל מדיניות חומת־אש מאוד מגבילה – אתה רק צריך לאפשר UDP 5060 עבור SIP ואת טווח הפורטים שהוגדר ב‑rtp.conf. בהגדרה זו, Asterisk יכול ליצור קשר הן עם הטלפונים הפנימיים והן עם שאר האינטרנט.
אם SIP אינו דרישה, ואתה משתמש ב‑Asterisk, שקול להשתמש בפרוטוקול IAX. IAX ממ tunneל גם את תעבורת הבקרה וגם את תעבורת הקול על גבי שיחת UDP יחידה שניתן לבצע לה port‑forwarding, לסנן או לתרגם בקלות. שיטה זו מוגבלת לקבוצת מנהרות סטטית, שהיא מספקת אם אתה מחבר כמה מרכזיות PBX דרך האינטרנט או מתחבר לספק שיחות למרחקים ארוכים.
לפעמים הפתרונות שלעיל אינם זמינים לך. במקרה כזה, ייתכן שכדאי לעבור ל‑SIP proxy מלא־יכולות ולהשתמש ב‑Asterisk רק ליישומי קול, כגון תא קולי. SIP Express Router (SER) הוא שרת SIP חזק שמתמודד היטב עם NAT ומשמש במספר שירותים בעלי נפח גבוה, כולל Free World Dialup. תפקידו של SER הוא רק בהקמת שיחות בין קצות השיחה, ולכן הוא חייב להסתמך על יישומים אחרים, כגון media proxies ייעודיים, כדי לטפל בזרמי RTP בעת הצורך.
השלב שמעבר ל‑SIP proxy הוא Session Border Controller (SBC), שהוא כמו חומת־אש ל‑VoIP. SBC יכול להתערב במסלולי האיתות (signaling) או ה‑RTP כדי להוסיף תכונות נוספות, כגון תרגום פרוטוקול איתות או codec, וכל זאת תוך אכיפת מדיניות אבטחה. אלה מוצרים מסחריים כמעט בלעדית.