در این پست توپولوژی را بررسی می کنیم که Asterisk به عنوان SIP Server  درون شبکه NAT شده  و IP Phone  ها خارج از شبکه قرار دارند . شاید در نگاه اول به نظر بیاد که Forward کردن پورت 5060  که برای سیگنالینگ SIP استفاده میشود ، مشکل را حل کند ولی تتظیمات مخصوص NAT در Asterisk  و محدود کردن پورت های مورد استفاده پروتکل  RTP نیز از جمله کارهایی که برای حل این مشکل باید انجام شود .

تنظیمات مربوط به NAT در Asterisk  در دو فایل sip.conf و rtp.conf  گنجانده شده است .

بهتره از فایل rtp.conf  شروع کنیم . همانطور که می دانید بعد از عملیات Signalling  که توسط پروتکل SIP انجام می شود نوبت به Real-time Transfer Protocol یا همان RTP است تا صدا را بین دو گوشی تلفن منتقل کند . اما RTP مشابه SIP از یک پورت خاص (پورت شماره 5060 ) استفاده نمی کند بلکه در هر ارتباط از یک رنج پورت خاص برای انتفال Media بهره می برد . برای Forward کردن این رنج در فایروال یا مسیر یاب که انجام عملیات NAT را بر عهده دارد باید این رنج را بدانید و انرا با توجه به تعداد کلاینت ها محدود تر کنید تا مشکلی در عملیات PortForwarding در فایروال یا مسیریاب ایجاد نشود .

این رنج پورت در بخش [general] فایل rtp.conf در مسیر /etc/asterisk قابل مشاهده و تنظیم است . که در اینجا این رنج را به صد پورت محدود کرده ایم .

[general]

rtpstart=10000 ; first port to use

rtpend=10100   ; last port to use 

اگر از لینوکس و IPTables برای عملیات مسیریابی یا فایروال استفاده می کنید می توانید از دستورات زیر برای تنظیم قوانین IPtables  بهره ببرید .

iptables -t nat -A PREROUTING -i eth0 -p udp \
-m udp  dport 10000:10100 -j DNAT \
 to-destination 192.168.16.1
iptables -t nat -A PREROUTING -i eth0 -p udp \
-m udp  dport 5060 -j DNAT \
 to-destination 192.168.16.11

مرحله دوم تنظیمان مربوط به NAT در فایل sip.conf در مسیر /etc/asterisk  است .

در بخش [general] پارامتر externip را با آدرس آی پی عمومی فایروال یا مسیریاب شبکه که در مثال ما 217.219.220.220   است را مقدار دهی کنید . و رنج آی پی های داخلی شبکه را در پارامتر localnet وارد کنید .

[general]
localnet=192.168.16.0/255.255.255.0 ; or your subnet 
externip=217.219.220.220               ; use your address
حال باید برای گوش های آی پی ای که در خارج از شبکه محلی هستند باید پارامتر nat را yes کنید .
 اضافه کردن پارامتر qualify=yes باعث میشود تا Asterisk به صورت دائم ارتباط را چک کند و به عبارتی زنده نگه دارد 
تا ترجمه NAT از فایروال یا مسیر یاب پاک نشود . 
[YOURREMOTEPEER]               ; your peer's name
nat=yes
qualify=yes                    ; Force keepalives

مرجع مقاله : نت استاک