راه اندازی سرور VoIP شخصی با Asterisk و FreePBX
آموزش کامل راه اندازی Asterisk و FreePBX روی VPS. تنظیمات SIP trunk، بازه پورتهای RTP، قوانین فایروال برای جلوگیری از اسکنرها و روشهای مقابله با کلاهبرداری تلفنی را بیاموزید.
سرور VoIP شخصی چیست
یک سرور VoIP شخصی، در واقع یک سرور SIP است که روی یک VPS تحت کنترل شما اجرا میشود؛ بنابراین تماسهای شما بهجای هدایت توسط یک سرویس تلفنی میزبانیشده، توسط ماشین خودتان مسیریابی میشوند. VoIP (صدا روی پروتکل اینترنت) صدا را در قالب بستههای UDP منتقل میکند. SIP (پروتکل آغاز جلسه) سیگنالدهی لازم برای برقراری و پایان تماس را انجام میدهد. جریان صوتی از طریق SIP منتقل نمیشود و همین یک نکته، عامل اصلی بروز اکثر مشکلات در ادامه است.
یک سیستم فعال از چهار بخش تشکیل شده است:
- نرمافزار PBX (مرکز تلفن خصوصی). Asterisk انتخاب معمول است. این نرمافزار داخلیها (extensions) و طرح شمارهگیری (dialplan) را مدیریت میکند.
- نقاط پایانی (Endpoints). تلفنهای رومیزی یا نرمافزاری (softphones) که با یک نام کاربری و رمز عبور در PBX ثبت میشوند.
- ترانک SIP (SIP trunk). یک حساب کاربری پولی نزد یک ارائهدهنده که شما را به شبکه تلفن عمومی متصل کرده و شمارههای تلفن واقعی را به شما اجاره میدهد.
- مسیر رسانه (Media path). جریانهای RTP (پروتکل انتقال بلادرنگ) که صدا را روی پورتهای UDP اختصاصی خود حمل میکنند.
میزبانی شخصی PBX به معنای میزبانی شخصی شمارههای تلفن نیست. شمارهها از یک اپراتور تأمین میشوند و شما همچنان بابت هر شماره و هر دقیقه مکالمه هزینه پرداخت میکنید. آنچه در اختیار شماست، مسیریابی تماس، پست صوتی، ضبط مکالمات و لیست داخلیهاست. شما همچنین مسئولیت امنیت سرویسی را بر عهده دارید که افراد برای کسب سود به آن حمله میکنند.
یک سرور VoIP خودمیزبان به چه پورتهایی نیاز دارد؟
سیگنالدهی SIP از پورت 5060 برای پروتکلهای UDP و TCP، و از پورت 5061 برای SIP روی TLS (امنیت لایه انتقال) استفاده میکند. این پورتها فقط وظیفه برقراری تماس را بر عهده دارند. صدای هر تماس یک جریان UDP مجزا است که به پورتی از محدوده RTP ارسال میشود. نرمافزار Asterisk یک نمونه rtp.conf ارائه میدهد که rtpstart=10000 و rtpend=20000 را تنظیم میکند و مقادیر پیشفرض کامپایلشده برای آنها 5000 و 31000 است. هر تماس دو پورت از این محدوده اشغال میکند؛ یکی برای RTP و دیگری برای RTCP (پروتکل کنترل RTP).
این تفکیک همان جایی است که اکثر تلاشهای اولیه با شکست مواجه میشوند. تماس برقرار میشود، هر دو گوشی وضعیت پاسخدادهشده را نشان میدهند، اما هیچکدام صدایی نمیشنوند؛ زیرا فایروال پورت 5060 را باز گذاشته اما تمام بستههای RTP را مسدود میکند. سیگنالدهی و رسانه (صدا)، جریانهای مجزایی هستند و بنابراین به قوانین فایروال جداگانهای نیاز دارند. اگر این تمایز برای شما جدید است، مطالعه نحوه عملکرد پورتها و سوکتهای در حال گوش دادن در لینوکس پیش از باز کردن هر پورتی توصیه میشود.
پیش از باز کردن محدوده پورتها، آن را محدود کنید. بیست هزار پورت برای یک سیستم کوچک بسیار فراتر از نیاز است. دو پورت برای هر تماس به این معناست که محدودهای با دویست پورت، ظرفیت صد تماس همزمان را فراهم میکند.
[general]
rtpstart=10000
rtpend=10200آن را با sudo asterisk -rx "core reload" اعمال کنید.
آیا باید Asterisk را نصب کنید یا FreePBX؟
Asterisk موتور اصلی است. شما آن را با فایلهای متنی در /etc/asterisk پیکربندی میکنید و dialplan را شخصاً مینویسید. FreePBX یک رابط وب است که با PHP و JavaScript نوشته شده و روی Asterisk قرار میگیرد؛ این رابط فایلها را برای شما تولید کرده و ماژولهایی برای پست صوتی و صفهای تماس اضافه میکند.
تفاوتی که در یک VPS اهمیت دارد، مالکیت ماشین است. تا اوت 2026، نصبکننده رسمی FreePBX 17 انتظار یک سیستمعامل Debian 12 خام را دارد و Asterisk، یک وبسرور، یک دیتابیسسرور و PHP را نصب میکند. اگر آن را روی سروری که هماکنون سرویسهای دیگری را اجرا میکند نصب کنید، نتیجه مطلوبی نخواهید گرفت. برای FreePBX یک VPS اختصاصی در نظر بگیرید.
wget https://github.com/FreePBX/sng_freepbx_debian_install/raw/master/sng_freepbx_debian_install.sh -O /tmp/sng_freepbx_debian_install.sh
sudo bash /tmp/sng_freepbx_debian_install.shلاگ نصب در /var/log/pbx/freepbx17-install.log ذخیره میشود که اولین جایی است که هنگام توقف زودهنگام اسکریپت باید بررسی کنید.
FreePBX مالک فایلهای پیکربندی است که تولید میکند. اگر فایل pjsip.conf را در یک سیستم FreePBX بهصورت دستی ویرایش کنید، تغییرات شما دفعه بعد که رابط گرافیکی فایل را بازنویسی کند، از بین میرود. FreePBX فایلهای جداگانهای را که در نام خود _custom دارند برای پیکربندیهای دستی میخواند و به آنها دست نمیزند.
معامله صادقانه این است: FreePBX به شما یک رابط گرافیکی میدهد و یک صفحه ورود برای سیستم تلفنی شما روی اینترنت عمومی قرار میدهد. Asterisk خام هیچ رابط وبی ندارد و تمام تنظیمات آن دستورالعملهای مستندشدهای هستند که میتوانید در یک فایل بخوانید و در git نگهداری کنید. اگر FreePBX را نصب میکنید، دسترسی به پورت وب آن را به آدرس خود محدود کنید یا از طریق VPN به آن متصل شوید، زیرا یک رابط مدیریتی برای PBX هدفی با مسیر مستقیم به منابع مالی است.
یادداشت نسخه، معتبر تا اوت 2026: Asterisk 22 نسخه پشتیبانی بلندمدت (LTS) فعلی است که در اکتبر 2024 منتشر شده و تا اکتبر 2028 بهروزرسانیهای امنیتی دریافت میکند. Asterisk 23 نسخه استاندارد است. Ubuntu 24.04 نسخه Asterisk 20.6.0 را در مخزن universe خود ارائه میدهد.
نصب Asterisk روی Ubuntu 24.04
استفاده از پکیج توزیع، سریعترین روش است. Ubuntu آن را وصله (patch) میکند و سرویس بهطور خودکار تحت systemd اجرا میشود.
sudo apt update
sudo apt install -y asterisk
sudo asterisk -rx "core show version"ساخت از روی سورسکد، نسخه پشتیبانی بلندمدت (LTS) فعلی را در اختیار شما قرار میدهد.
sudo apt update
sudo apt install -y build-essential wget
cd /usr/local/src
sudo wget https://downloads.asterisk.org/pub/telephony/asterisk/asterisk-22-current.tar.gz
sudo tar -xzf asterisk-22-current.tar.gz
cd asterisk-22.*
sudo contrib/scripts/install_prereq install
sudo ./configure
sudo make menuselect
sudo make -j"$(nproc)"
sudo make install
sudo make samples
sudo make config
sudo ldconfigدستور install_prereq install وابستگیهای ساخت را برای توزیع شما دریافت میکند و install_prereq test دستوراتی را که قرار است اجرا شوند، بدون ایجاد هیچ تغییری نمایش میدهد. دستور make menuselect انتخابگر ماژولها را باز میکند؛ جایی که باید codec_opus را در بخش Codec Translators فعال کنید. دستور make samples را فقط روی نصب تازه اجرا کنید، زیرا فایلهای پیکربندی نمونه را در /etc/asterisk مینویسد. دستور make config اسکریپت init را در /etc/init.d/asterisk نصب میکند و systemd آن را از طریق لایه سازگاری SysV مدیریت میکند، بنابراین sudo systemctl enable --now asterisk پس از آن به درستی کار خواهد کرد.
از هر مسیری که پیش رفته باشید، sudo asterisk -rvvv به دیمون در حال اجرا متصل شده و CLI را در اختیار شما میگذارد. اجرای core show version در آن محیط، جزئیات دقیق آنچه نصب کردهاید را نمایش میدهد.
پیکربندی یک SIP trunk و یک داخلی
PJSIP درایور کانال SIP در نسخههای فعلی Asterisk است. پیکربندی آن در /etc/asterisk/pjsip.conf قرار دارد و از بخشهای کوچک و تایپشدهای ساخته میشود که با نام به یکدیگر ارجاع میدهند. بخشهایی با نوعهای متفاوت میتوانند نام یکسانی داشته باشند، به همین دلیل است که هر بلوک در زیر mytrunk نامیده میشود.
[transport-udp]
type=transport
protocol=udp
bind=0.0.0.0
[mytrunk]
type=registration
outbound_auth=mytrunk
server_uri=sip:sip.example.com
client_uri=sip:1234567890@sip.example.com
retry_interval=60
[mytrunk]
type=auth
auth_type=userpass
username=1234567890
password=REPLACE_WITH_A_LONG_RANDOM_SECRET
[mytrunk]
type=aor
contact=sip:sip.example.com:5060
[mytrunk]
type=endpoint
context=from-trunk
disallow=all
allow=ulaw
outbound_auth=mytrunk
aors=mytrunk
[mytrunk]
type=identify
endpoint=mytrunk
match=sip.example.comشیء registration دستور REGISTER را ارسال میکند که به ارائهدهندهٔ شما میگوید تماسها را به کجا تحویل دهد. شیء identify نحوهٔ تطبیق تماسی است که از سمت ارائهدهنده میرسد و بر اساس آدرس مبدأ با این endpoint مطابقت داده میشود؛ ارائهدهندهها معمولاً چندین آدرس را برای لیست کردن در آنجا منتشر میکنند. ثبت خروجی (Outbound registration) و endpoint به عمد اشیاء جداگانهای هستند: یکی به ارائهدهنده میگوید شما کجا هستید، دیگری تصمیم میگیرد با تماسها چه کاری انجام شود.
یک تلفن رومیزی به سه شیء دیگر نیاز دارد.
[6001]
type=endpoint
context=internal
disallow=all
allow=ulaw
auth=auth6001
aors=6001
direct_media=no
[auth6001]
type=auth
auth_type=userpass
username=6001
password=REPLACE_WITH_A_LONG_RANDOM_SECRET
[6001]
type=aor
max_contacts=1direct_media=no باعث میشود Asterisk در مسیر رسانه (media path) باقی بماند. اگر آن را حذف کنید، Asterisk تلاش میکند تا دو endpoint را وادار کند RTP را مستقیماً برای یکدیگر بفرستند، که این کار هنگام قرارگیری تلفن پشت NAT (ترجمه آدرس شبکه) در روترهای خانگی با شکست مواجه میشود. هرگز اجازه ندهید رمز عبور با شماره داخلی یکی باشد. نمونه بالادستی از password=6001 برای داخلی 6001 استفاده میکند تا مثال خوانا باقی بماند، و اسکنرها دقیقاً همین الگو را در وهلهٔ اول امتحان میکنند.
Dialplan در /etc/asterisk/extensions.conf تعیین میکند که هر context چه کاری مجاز است انجام دهد.
[internal]
exten => 6001,1,Dial(PJSIP/6001,20)
exten => _9X.,1,Dial(PJSIP/${EXTEN:1}@mytrunk,60)
[from-trunk]
exten => 1234567890,1,Dial(PJSIP/6001,20)
same => n,Hangup()این دو context یک مرز امنیتی هستند. from-trunk تماسهای رسیده از سمت ارائهدهنده را مدیریت میکند و فقط میتواند داخلی 6001 را زنگ بزند. این بخش نمیتواند به الگوی _9X. دسترسی پیدا کند، بنابراین یک تماس از بیرون نمیتواند از طریق trunk شما به بیرون شمارهگیری کند. اگر این contextها را ادغام کنید، مسیر کلاسیک کلاهبرداری تلفنی (toll fraud) را ایجاد کردهاید: یک غریبه با شماره شما تماس میگیرد، dialplan شما از طریق حساب شما به بیرون شمارهگیری میکند و هزینه آن را شما پرداخت میکنید.
پیکربندی را اعمال کرده و آن را بررسی کنید.
sudo asterisk -rx "pjsip reload"
sudo asterisk -rx "pjsip show registrations"
sudo asterisk -rx "pjsip show endpoints"pjsip show registrations باید mytrunk را با وضعیت Registered لیست کند. Rejected به این معنی است که ارائهدهنده اعتبارنامه شما را رد کرده است. Unregistered به این معنی است که REGISTER شما بدون پاسخ مانده است، بنابراین در مرحله بعد فایروال را بررسی کنید.
قوانین فایروال برای SIP و RTP
سیگنالینگ و مدیا به دلیل تفاوت در سطح ریسک، نیازمند مدیریت متفاوتی هستند. دسترسی به پورت 5060 را فقط به آدرسهایی که ارائهدهنده خدمات شما واقعاً از آنها استفاده میکند و شبکههایی که تلفنهای شما در آن قرار دارند، محدود کنید.
sudo ufw allow proto udp from 203.0.113.10 to any port 5060
sudo ufw allow proto tcp from 203.0.113.10 to any port 5060
sudo ufw allow 10000:10200/udp
sudo ufw status verboseمحدوده RTP بخشی است که نمیتوانید آن را به همان اندازه محدود کنید، زیرا مدیا اغلب از آدرسی متفاوت با آدرس سیگنالینگ ارسال میشود. از ارائهدهنده خود بخواهید زیرشبکههای مدیا را در اختیار شما قرار دهد و در صورت انتشار، دسترسی را به همانها محدود کنید. این محدوده را فقط به اندازهای که برای شلوغترین ساعت کاری نیاز دارید، باز نگه دارید. سیاستهای پیشفرض، ترتیب قوانین و سایر مدلهای ufw در راهنمای مقدماتی فایروال ufw برای VPS پوشش داده شدهاند.
IPv6 را نیز بررسی کنید. اگر IPV6=no در /etc/default/ufw تنظیم شده باشد، ufw ترافیک IPv6 را اصلاً فیلتر نمیکند؛ بنابراین دیمونی که روی :: گوش میدهد، از طریق IPv6 و بدون اعمال هیچکدام از قوانین فوق در دسترس خواهد بود. باز کردن پورتها برای IPv6 با ufw توضیح میدهد که این دو خانواده پروتکل چه تفاوتهایی با هم دارند. اکثر ارائهدهندگان، یک فایروال شبکه مجزا نیز در پنل کنترل خود ارائه میدهند که پیش از رسیدن بستهها به VPS شما اعمال میشود؛ بنابراین پورت باید در هر دو مکان باز باشد.
حملات brute force به SIP و کلاهبرداری از طریق تماس (toll fraud) مشکلات اختیاری نیستند
اگر پورت 5060 را روی یک آدرس عمومی قرار دهید، اسکنها بلافاصله آغاز میشوند. الگوی این حملات ثابت است: درخواستهای REGISTER و INVITE از آدرسهای مبدأ متعدد که سعی میکنند با استفاده از شمارههای داخلی رایج و رمزهای عبور متداول، نفوذ کنند. Asterisk هر مورد ناموفق را لاگ میکند و خط مربوطه به این شکل است.
Request 'REGISTER' from '<sip:1000@198.51.100.20>' failed for '198.51.100.20:5060' (callid: 5f1a5c0d) - No matching endpoint foundدلیل اینکه این موضوع نیازمند تلاش جدی است، مسائل مالی است. یک داخلی سرقتشده برای برقراری تماسهای بینالمللی گرانقیمت استفاده میشود؛ اغلب به شمارههایی با نرخ ویژه که بخشی از درآمد آن به مهاجم میرسد، و قبض آن به عهده شماست زیرا تماسها با اعتبارنامه شما برقرار شدهاند. این حملات با سرعت ماشین و معمولاً در طول شب انجام میشوند.
شش کنترل امنیتی زیر به جای آنکه اختیاری باشند، برای مقاومسازی سیستم الزامی هستند.
- هرگز داخلیای ایجاد نکنید که رمز عبور آن با شماره داخلی یا یک کلمه کوتاه یکسان باشد. با استفاده از
openssl rand -base64 24یک رمز عبور تولید و آن را جایگذاری کنید. - تماسهای ورودی ناشناس (anonymous) را غیرفعال نگه دارید. PJSIP بهصورت پیشفرض تماسهای شناسایینشده را رد میکند و تنها در صورتی آنها را میپذیرد که یک endpoint با نام
anonymousایجاد کرده باشید. چنین چیزی ایجاد نکنید. - کانتکست (context) ترانک را از هر کانتکستی که اجازه تماس خروجی دارد جدا نگه دارید، همانطور که در بالا نشان داده شد.
- سیگنالینگ را بر اساس آدرس مبدأ محدود کنید؛ این کار را هم در ufw و هم در فایروال شبکه ارائهدهنده خود انجام دهید.
- یک سقف هزینه (spending cap) نزد ارائهدهنده ترانک SIP خود تعیین کنید و مقاصد بینالمللی که هرگز با آنها تماس نمیگیرید را غیرفعال کنید. این تنها کنترلی است که در صورت شکست سایر موارد، خسارت را محدود میکند.
- ابزار fail2ban را برای لاگهای Asterisk اجرا کنید.
Asterisk همچنین میتواند پس از درخواستهای نامنطبق مکرر از یک آدرس، یک رویداد امنیتی ایجاد کند. بخش [global] در فایل pjsip.conf پارامتر unidentified_request_count را میپذیرد که مقدار پیشفرض آن 5 است، و همچنین unidentified_request_period که مقدار پیشفرض آن 5 ثانیه است. این دو در کنار هم به این معنا هستند که پنج درخواست نامنطبق از یک آدرس در مدت پنج ثانیه، منجر به ایجاد یک رویداد امنیتی میشود که fail2ban میتواند نسبت به آن واکنش نشان دهد.
مسدودسازی اسکنرها با fail2ban
نرمافزار fail2ban بهصورت پیشفرض یک asterisk jail آماده دارد. این jail پورتهای 5060 و 5061 را پوشش میدهد، فایل /var/log/asterisk/messages را میخواند و تنظیمات پیشفرض آن maxretry = 10 است. این jail تا زمانی که آن را در /etc/fail2ban/jail.local فعال نکنید، غیرفعال باقی میماند.
[asterisk]
enabled = true
maxretry = 5
findtime = 600
bantime = 86400sudo systemctl restart fail2ban
sudo fail2ban-client status asteriskدر صورت عملکرد صحیح، خروجی دستور، فایل لاگ مربوط به jail و تعداد آدرسهای مسدودشده در لحظه را نمایش میدهد. روی یک پورت 5060 عمومی، این تعداد در کمتر از یک روز از صفر خارج میشود. فیلتر پیشفرض با اعلانهای No matching endpoint found در بالا مطابقت دارد و همچنین با خطوط ساختاریافته SecurityEvent در Asterisk نیز همخوانی دارد. این رویدادها به یک کانال لاگ جداگانه ارسال میشوند که در /etc/asterisk/logger.conf کامنت شده است؛ بنابراین اگر میخواهید از آنها استفاده کنید، آن را در فایل مذکور فعال کرده و مسیر فایل را به logpath در jail اضافه کنید.
[logfiles]
console => notice,warning,error
messages.log => notice,warning,error
security.log => securityلاگر را با دستور sudo asterisk -rx "logger reload" بازخوانی کنید. این فیلتر همچنین شامل یک journalmatch برای asterisk.service است، بنابراین اگر ترجیح میدهید فایلهای لاگ را نگه ندارید، میتوانید از backend ژورنال استفاده کنید. نصب، ساختار jail.local و نحوه رفع مسدودیت آدرسی که بهاشتباه قفل کردهاید، در راهنمای fail2ban برای Ubuntu 24.04 پوشش داده شده است.
تأخیر و انتخاب کدک در یک VPS دوردست
تأخیر توسط جغرافیا تعیین میشود و نمیتوان آن را با پیکربندی حذف کرد. استاندارد ITU-T G.114 توصیه میکند که تأخیر یکطرفه برای مکالمه عادی زیر 150 میلیثانیه نگه داشته شود و مقادیر تا حدود 400 میلیثانیه را همچنان قابل استفاده میداند. صدا از تلفن به VPS شما میرود و سپس به سمت ارائهدهنده ترانک (trunk provider) خارج میشود؛ بنابراین یک VPS در منطقه جغرافیایی نامناسب، این مسیر را دو بار طی میکند. سرور را نزدیک به تلفنها یا نزدیک به ارائهدهنده قرار دهید. اگر این دو در جهتهای متفاوتی هستند، اولویت را به نزدیکی به تلفنها بدهید، زیرا آن بخش از مسیر معمولاً از طریق اینترنت مصرفکننده عبور میکند که بیشترین میزان جیتر (jitter) را دارد.
انتخاب کدک، پهنای باند هر تماس را تعیین میکند. هر کدک در اینجا هر 20 میلیثانیه یک بسته ارسال میکند که معادل 50 بسته در ثانیه است و هر بسته علاوه بر محتوای صوتی، 40 بایت هدر IP، UDP و RTP حمل میکند.
The data behind this chart
[
{
"label": "G.711 ulaw",
"payload_kbps": 64,
"ip_kbps": 80
},
{
"label": "G.722",
"payload_kbps": 64,
"ip_kbps": 80
},
{
"label": "Opus at 24 kbps",
"payload_kbps": 24,
"ip_kbps": 40
},
{
"label": "G.729",
"payload_kbps": 8,
"ip_kbps": 24
}
]کدک G.711 ulaw در اکثر ترانکها پیشفرض است. محتوای صوتی آن 64 کیلوبیت بر ثانیه است و با احتساب هدرها، هر تماس در حال انجام 80 کیلوبیت بر ثانیه در هر جهت هزینه دارد. کدک Opus با نرخ 24 کیلوبیت بر ثانیه، پهنای باندی معادل 40 کیلوبیت بر ثانیه مصرف میکند و G.729 این مقدار را به 24 کیلوبیت بر ثانیه کاهش میدهد که البته به قیمت کاهش کیفیت صدا و مصرف بیشتر CPU تمام میشود. این ارقام حاصل محاسبات ریاضی هدرها هستند و نه اندازهگیریهای عملی: نرخ محتوا به اضافه 40 بایت به ازای هر بسته در 50 بسته در ثانیه. فریمبندی Ethernet یا VLAN مقدار کمی به حجم روی سیم اضافه میکند.
ترنسکدینگ (Transcoding) باعث مصرف CPU میشود. اگر تلفنها و ترانک شما هر دو از ulaw استفاده میکنند، فقط اجازه استفاده از ulaw را بدهید تا Asterisk صدا را بدون تغییر عبور دهد. کدک Opus در لینکهای دارای افت بسته (lossy) عملکرد خوبی دارد، اما ترنسکدینگ بین Opus و G.711 نیازمند ماژول خارجی codec_opus است که باید آن را در make menuselect انتخاب کنید و بهصورت پیشفرض ساخته نمیشود.
چه چیزی دچار اختلال میشود و رشتهای که مشاهده خواهید کرد
تماس برقرار میشود اما هیچ صدایی شنیده نمیشود. پروتکل RTP دریافت نمیشود. تأیید کنید که محدوده پورت در rtp.conf همان محدودهای است که در فایروال باز کردهاید، سپس در حین برقراری تماس، بستهها را با sudo tcpdump -ni any udp portrange 10000-10200 مانیتور کنید. اگر هیچ بستهای دریافت نمیشود، به این معناست که فایروال شما یا فایروال شبکه ارائهدهنده، آنها را مسدود میکند.
صدا فقط در یک جهت وجود دارد. یک سمت در حال ارسال RTP به آدرسی است که قادر به دریافت آن نیست؛ این یک مشکل آدرسدهی است، نه مشکل پورت. اگر VPS شما آدرس عمومی را مستقیماً روی اینترفیس خود دارد، نیازی به مدیریت NAT نیست. اگر ارائهدهنده به VPS یک آدرس خصوصی با نگاشت یکبهیک عمومی میدهد، آدرس عمومی را در بخش transport تنظیم کنید و محدوده خصوصی خود را در local_net لیست نمایید.
[transport-udp]
type=transport
protocol=udp
bind=0.0.0.0
local_net=10.0.0.0/8
external_media_address=198.51.100.5
external_signaling_address=198.51.100.5No matching endpoint found در لاگ. درخواست با هیچ endpoint از طریق آدرس IP یا نام کاربری مطابقت نداشته است. این مورد از سمت اسکنرها طبیعی است و fail2ban آن را مدیریت میکند. اگر از سمت ارائهدهنده خودتان باشد، به این معناست که بخش identify آدرسی که آنها از آن طریق با شما تماس میگیرند را لیست نکرده است.
وضعیت ثبت (Registration) برابر با Rejected است. ارائهدهنده اعتبارنامههای موجود در بخش auth شما را رد کرده است. دستور pjsip set logger on را در CLI اجرا کنید، یک پیام REGISTER و پاسخ آن را مشاهده کنید، سپس client_uri و username را با آنچه ارائهدهنده به شما اختصاص داده است، مقایسه کنید.
هیچ چیز مفیدی در لاگ وجود ندارد. Asterisk بهصورت پیشفرض پیامهای سطح notice و بالاتر را در messages.log مینویسد. در حین بازتولید مشکل، سطح لاگ را با core set verbose 4 و pjsip set logger on افزایش دهید و سپس هر دو را غیرفعال کنید، زیرا لاگر SIP تمام بستهها را ثبت میکند.
پیش از قرار دادن در معرض اینترنت
یک PBX با سایر سرویسهایی که خودتان میزبانی میکنید متفاوت است. خرابی یک وباپلیکیشن تنها باعث از دسترس خارج شدن یک صفحه میشود، اما خرابی یک PBX میتواند در عرض چند ساعت و زمانی که خواب هستید، هزینههای سنگین تلفنی روی دست شما بگذارد. آن را روی یک VPS اجرا کنید که هیچ کار دیگری انجام نمیدهد، دسترسی به پورت 5060 را فقط به آدرسهای شناختهشده محدود کنید، برای هر extension یک رمز عبور تصادفی و پیچیده تعیین کنید و برای حساب trunk خود سقف هزینه (spending cap) در نظر بگیرید. سایر بخشهای سرور نیز باید از همان استانداردهای امنیتی پایه برای هر سرورِ در معرض اینترنت برخوردار باشند که در این بررسی درباره امنیت واقعی میزبانی VPS به آنها پرداخته شده است.
FAQ
برای یک سرور VoIP خودمیزبان (self-hosted) چه پورتهایی را باید باز کنم؟
پورت 5060 برای سیگنالینگ SIP از طریق پروتکلهای UDP و TCP، پورت 5061 در صورت استفاده از SIP روی TLS، و بازهای از پورتهای UDP برای انتقال رسانه RTP. نمونه rtp.conf در Asterisk از بازه 10000 تا 20000 استفاده میکند و مقادیر پیشفرض کامپایلشده 5000 تا 31000 هستند. هر تماس دو پورت از این بازه را اشغال میکند، بنابراین بازهای شامل دویست پورت، امکان برقراری صد تماس همزمان را فراهم میکند. بازه RTP را به صورت UDP باز کنید و دسترسی به پورت 5060 را بهجای باز گذاشتن برای همه، فقط به آدرسهای ارائهدهنده خدمات و شبکههای داخلی خود محدود کنید.
آیا باید Asterisk را بهتنهایی نصب کنم یا از FreePBX استفاده کنم؟
اگر به دنبال سطح حمله (attack surface) کوچک هستید و میخواهید فایلهای پیکربندی را در git نگهداری کنید و آمادگی نوشتن dialplan را دارید، Asterisk خام را نصب کنید. اگر برای مدیریت داخلیها (extensions)، پست صوتی و صفهای تماس به یک رابط گرافیکی (GUI) نیاز دارید، FreePBX را نصب کنید. تا آگوست 2026، نصبکننده FreePBX 17 به یک سیستمعامل Debian 12 تمیز نیاز دارد و Asterisk، وبسرور، دیتابیس و PHP را نصب میکند؛ بنابراین یک VPS اختصاصی برای آن در نظر بگیرید. FreePBX فایلهای پیکربندی تحت مدیریت خود را بازنویسی میکند، بنابراین ویرایشهای دستی را فقط در فایلهای _custom انجام دهید.
چرا پس از برقراری تماس، صدایی شنیده نمیشود؟
سیگنالینگ موفق بوده اما انتقال رسانه (media) انجام نشده است. SIP تماس را روی پورت 5060 برقرار کرده، اما صدا یک جریان UDP مجزا به پورتی در بازه RTP است که توسط چیزی مسدود میشود. بررسی کنید که بازه تعریفشده در rtp.conf با بازه باز شده در فایروال شما مطابقت داشته باشد؛ همچنین فایروال شبکه ارائهدهنده و فایروال سرور را چک کنید. در حین تماس دستور sudo tcpdump -ni any udp portrange 10000-10200 را اجرا کنید: نبود هیچ بستهای به این معناست که آنها پیش از رسیدن به سرور مسدود شدهاند.
چگونه حملات brute force به SIP و کلاهبرداریهای مخابراتی (toll fraud) را متوقف کنم؟
برای هر داخلی یک رمز عبور طولانی و تصادفی انتخاب کنید؛ هرگز رمز عبور را مشابه شماره داخلی قرار ندهید. کانتکست (context) مورد استفاده برای ترانک (trunk) را از هر کانتکستی که اجازه تماس خروجی دارد جدا کنید تا یک تماس ورودی نتواند از طریق حساب شما تماس خروجی برقرار کند. دسترسی به پورت 5060 را به آدرسهای ارائهدهنده خود محدود کنید. جیل (jail) asterisk را در fail2ban فعال کنید؛ این ابزار /var/log/asterisk/messages را میخواند و آدرسهایی که باعث ایجاد خطاهای No matching endpoint found میشوند را مسدود میکند. در نهایت، یک سقف هزینه تعیین کنید و مقاصد بینالمللی بلااستفاده را از طریق پنل ارائهدهنده خود مسدود کنید، زیرا در صورت شکست سایر لایههای امنیتی، این تنها راه کنترل خسارت است.
آیا استفاده از VPS در یک منطقه جغرافیایی دور، کیفیت تماس را کاهش میدهد؟
بله، زیرا صدا باید دو مسیر را طی کند: از تلفن تا VPS، و سپس از VPS تا ارائهدهنده ترانک. استاندارد ITU-T G.114 توصیه میکند تأخیر یکطرفه زیر 150 میلیثانیه باشد و یک VPS با موقعیت نامناسب میتواند بخش بزرگی از این بودجه زمانی را صرفاً به دلیل مسافت مصرف کند. منطقهای نزدیک به تلفنها انتخاب کنید، زیرا آن بخش از مسیر معمولاً از طریق اینترنت خانگی عبور میکند که بیشترین میزان جیتر (jitter) را دارد. انتخاب کدک (codec) تأخیر را برطرف نمیکند و فقط پهنای باند را تغییر میدهد؛ بنابراین G.729 باعث صرفهجویی در مصرف بایت میشود اما نمیتواند یک مسیر با تأخیر 200 میلیثانیهای را نجات دهد.