در این آموزش فرض میکنیم Asterisk 22 روی یک سرور لینوکسی نصب شده است و میخواهیم PJSIP را از پایه راهاندازی کنیم. ابتدا مفاهیم endpoint، auth، aor و transport را ساده توضیح میدهیم، سپس دو داخلی میسازیم، تماس داخلی برقرار میکنیم و بعد NAT، Trunk، TLS و Dialplan را وارد سناریو میکنیم.
در پایان باید بتوانید بدون پنل گرافیکی تشخیص دهید چرا یک Phone رجیستر نمیشود، Contact آن کجاست، NAT چه چیزی را باید بازنویسی کند و یک تماس دقیقاً با کدام Dialplan عبور میکند.
نسخه بررسیشده: در ۱۷ اکتبر ۲۰۲۶، آخرین نسخه پایدار شاخه LTS شماره 22 برابر Asterisk 22.11.0 است. شاخه 22 تا اکتبر ۲۰۲۸ پشتیبانی کامل دارد؛ بنابراین برای نصب Production هنوز گزینه مناسبی است.
Asterisk 22 برای چه کسانی مناسب است؟
Asterisk خام زمانی انتخاب خوبی است که بخواهید کنترل کامل روی رفتار PBX داشته باشید.
🔹 مدیر لینوکسی هستید و از کار با فایل Configuration و CLI مشکلی ندارید.
🔹 یک PBX اختصاصی، سبک یا سفارشی میخواهید.
🔹 Dialplan پیچیده یا منطق تماس اختصاصی دارید.
🔹 میخواهید Asterisk را با CRM، نرمافزار داخلی یا API یکپارچه کنید.
🔹 از AMI، ARI، AGI یا Scriptهای اختصاصی استفاده میکنید.
🔹 به Trunkها، SIP Headerها و Media Policy کنترل دقیق نیاز دارید.
🔹 میخواهید تعداد سرویسها و Moduleهای نصبشده حداقل باشد.
Asterisk خام برای چه کسانی مناسب نیست؟
اگر انتظار دارید داخلی، Trunk، Queue و IVR را فقط با چند کلیک بسازید، FreePBX یا پنل مدیریتی مشابه انتخاب سادهتری است.
Asterisk خام همچنین برای مدیری که با Linux، Firewall، SIP و Log آشنایی ندارد میتواند پیچیده باشد؛ چون هیچ پنلی قرار نیست اشتباه NAT، Dialplan یا Certificate را برای شما پنهان کند.
در محیطهای بزرگ نیز اگر Configuration Management نداشته باشید، نگهداری صدها Endpoint با فایلهای دستی دشوار میشود.
چرا هنوز Asterisk 22 و نه نسخه جدیدتر؟
Asterisk 22 یک شاخه LTS است.
نسخههای LTS برای چند سال Bug Fix و سپس Security Fix دریافت میکنند و برای PBXهایی که قرار است مدت طولانی در Production بمانند مناسبترند.
در زمان نگارش این مقاله Asterisk 24 بهعنوان LTS بعدی وارد چرخه انتشار شده، اما هنوز Pre-release است.
برای Lab میتوانید نسخههای جدیدتر را بررسی کنید؛ برای سیستم تلفنی سازمانی، شاخهای که چند Release Maintenance پشت سر گذاشته معمولاً ریسک کمتری دارد.
قبل از تنظیم PJSIP نسخه Asterisk را ببینید
asterisk -rx "core show version"
اگر وارد CLI هستید:
core show version
مطمئن شوید PJSIP Moduleها Load شدهاند
asterisk -rx "module show like pjsip"
باید Moduleهایی مثل res_pjsip.so و Driver مرتبط را ببینید.
PJSIP چیست؟
PJSIP Stack جدید SIP در Asterisk است که جای chan_sip قدیمی را گرفته است.
یکی از تفاوتهای مهم این است که در PJSIP مفهوم یک «Peer» بزرگ به چند Object مستقل تقسیم شده است.
برای یک تلفن ساده معمولاً با این اجزا روبهرو میشوید:
🔹 transport: SIP از چه پروتکل و پورتی عبور کند.
🔹 endpoint: رفتار SIP و Media آن دستگاه.
🔹 auth: Username و Password احراز هویت.
🔹 aor: دستگاه در حال حاضر از چه Contact یا آدرسی قابل دسترسی است.
Endpoint دقیقاً چیست؟
Endpoint پروفایل اصلی یک تلفن یا SIP Peer است.
در آن مواردی مثل اینها تعریف میشوند:
🔹 Context
🔹 Codec
🔹 Auth Object
🔹 AOR
🔹 NAT Behavior
🔹 Transport
🔹 Media Encryption
نکته مهم این است که خود Endpoint بهتنهایی Address دستگاه را نگهداری نمیکند؛ برای تماسگرفتن با Phone به AOR و Contact نیاز داریم.
Auth چه کاری انجام میدهد؟
Auth Object مشخص میکند تلفن با چه Username و Secretای احراز هویت شود.
مثلاً داخلی 1001 میتواند:
Username: 1001
Password: RANDOM-LONG-PASSWORD
داشته باشد.
در Production از Password قابل حدس مثل 1001، 123456 یا نام شرکت استفاده نکنید.
AOR چیست؟
AOR مخفف Address of Record است.
در عمل مشخص میکند Endpoint از کجا قابل تماس است.
وقتی Phone با Asterisk Register میشود، یک Contact روی AOR ساخته میشود.
مثلاً:
sip:1001@192.0.2.50:5060
به Contact همان AOR تبدیل میشود.
Transport چیست؟
Transport مشخص میکند SIP با چه Protocol، IP و Portی دریافت یا ارسال شود.
PJSIP از Transportهایی مثل:
🔹 UDP
🔹 TCP
🔹 TLS
🔹 WebSocket
🔹 Secure WebSocket
پشتیبانی میکند.
اول یک PJSIP کاملاً ساده در شبکه داخلی بسازیم
فایل اصلی:
/etc/asterisk/pjsip.conf
برای شروع یک Transport UDP تعریف کنید:
[transport-udp]
type=transport
protocol=udp
bind=0.0.0.0:5060
این Transport روی همه IPv4 Interfaceها و UDP/5060 Listen میکند.
ساخت داخلی 1001
[1001]
type=endpoint
transport=transport-udp
context=from-internal
disallow=all
allow=alaw
allow=ulaw
auth=auth1001
aors=1001
direct_media=no
[auth1001]
type=auth
auth_type=userpass
username=1001
password=CHANGE-THIS-TO-A-LONG-RANDOM-PASSWORD
[1001]
type=aor
max_contacts=1
remove_existing=yes
چرا نام Endpoint و AOR هر دو 1001 است؟
در PJSIP میتوان Objectهایی با نام مشابه ولی Type متفاوت داشت.
این روش برای داخلیها خوانایی Configuration را بیشتر میکند.
در Endpoint خط:
auth=auth1001
aors=1001
مشخص میکند Credential در Object دیگری با نام auth1001 قرار دارد و Location دستگاه را AOR شماره 1001 نگه میدارد.
داخلی دوم؛ 1002
[1002]
type=endpoint
transport=transport-udp
context=from-internal
disallow=all
allow=alaw
allow=ulaw
auth=auth1002
aors=1002
direct_media=no
[auth1002]
type=auth
auth_type=userpass
username=1002
password=USE-A-DIFFERENT-RANDOM-PASSWORD
[1002]
type=aor
max_contacts=1
remove_existing=yes
چرا direct_media را فعلاً No گذاشتیم؟
با:
direct_media=no
Asterisk در مسیر Media باقی میماند.
برای شروع و مخصوصاً وقتی NAT در مسیر داریم، این رفتار تشخیص مشکلات RTP را سادهتر میکند.
در شبکه محلی و معماری مناسب میتوان بعداً Direct Media را فعال کرد تا RTP مستقیماً بین Endpointها عبور کند.
حالا Dialplan لازم داریم
وجود دو Endpoint بهتنهایی به معنی امکان تماس نیست.
Asterisk باید بداند وقتی 1002 گرفته شد چه کاری انجام دهد.
فایل:
/etc/asterisk/extensions.conf
را باز کنید.
یک Dialplan ساده برای داخلیهای 10XX
[from-internal]
exten => _10XX,1,NoOp(Call from ${CALLERID(num)} to ${EXTEN})
same => n,Dial(${PJSIP_DIAL_CONTACTS(${EXTEN})},25)
same => n,Hangup()
از آنجا که Endpointها در:
context=from-internal
قرار دارند، تماسهای آنها وارد همین Context میشوند.
PJSIP_DIAL_CONTACTS چه کاری انجام میدهد؟
این Function Contactهای ثبتشده روی AOR را پیدا میکند و آنها را برای Dial آماده میکند.
اگر یک User روی چند Device رجیستر شود، میتوان Contactهای متعدد همان AOR را همزمان Ring کرد.
Configuration را بررسی کنیم
وارد Asterisk CLI شوید:
asterisk -rvvv
Transportها
pjsip show transports
Endpointها
pjsip show endpoints
یک Endpoint خاص
pjsip show endpoint 1001
AOR
pjsip show aor 1001
Contactهای رجیسترشده
pjsip show contacts
اگر Contact نداریم یعنی چه؟
اگر Endpoint وجود دارد ولی:
pjsip show aor 1001
هیچ Contact نشان نمیدهد، تلفن هنوز Registration موفقی روی آن AOR ندارد.
در این مرحله Dialplan مشکل اصلی نیست.
SIP Logger را روشن کنید
برای عیبیابی Registration:
pjsip set logger on
تلفن را یکبار Register کنید و بعد Logger را خاموش کنید:
pjsip set logger off
REGISTER سالم چه شکلی دارد؟
یکی از Flowهای رایج:
REGISTER
401 Unauthorized
REGISTER + Authorization
200 OK
وجود 401 اول معمولاً طبیعی است و بخشی از SIP Digest Authentication محسوب میشود.
Asterisk 22 و Digest Authentication جدیدتر
از Asterisk 22.2.0 و PJProject 2.15.1، PJSIP علاوه بر MD5 از SHA-256 و SHA-512-256 نیز پشتیبانی میکند.
برای دیدن قابلیت Build فعلی:
pjproject show buildopts
اما قبل از اجبار SHA-256 بررسی کنید Phone یا Provider شما نیز آن را پشتیبانی کند.
حالا NAT را وارد سناریو کنیم
تا اینجا فرض میکردیم تلفن و Asterisk شبکه ساده و قابل Route دارند.
در واقعیت معمولاً یکی از این دو حالت را داریم:
حالت اول: Asterisk پشت NAT است.
حالت دوم: Asterisk Public IP دارد ولی Phone پشت NAT است.
گاهی هم هر دو طرف NAT دارند.
Asterisk پشت NAT؛ Transport را اصلاح کنید
فرض کنیم:
IP خصوصی Asterisk:
192.0.2.10
و Public IP نمونه:
203.0.113.20
باشد.
Transport میتواند اینگونه شود:
[transport-udp]
type=transport
protocol=udp
bind=0.0.0.0:5060
local_net=192.0.2.0/24
external_signaling_address=203.0.113.20
external_media_address=203.0.113.20
آدرسها مثال مستندسازی هستند و باید با شبکه واقعی شما جایگزین شوند.
local_net چه کاری انجام میدهد؟
به PJSIP میگوید چه شبکههایی داخلی هستند.
Asterisk با این اطلاعات تصمیم میگیرد چه زمانی باید آدرس Private را با External Address جایگزین کند.
اگر چند LAN دارید میتوانید چند local_net تعریف کنید.
گزینه جدید جالب در Asterisk 22.11
در Asterisk 22.11.0 گزینه:
external_signaling_hostname
به Transport اضافه شده است.
این گزینه برای Providerهایی مفید است که انتظار دارند Contact و Via بهجای IP از FQDN استفاده کنند.
این پارامتر با:
external_signaling_address
همزمان قابل استفاده نیست؛ بر اساس نیاز Provider یکی را انتخاب کنید.
Phone پشت NAT؛ Endpoint چه تنظیماتی لازم دارد؟
برای یک Remote Phone معمولاً این چهار گزینه مهماند:
direct_media=no
rtp_symmetric=yes
force_rport=yes
rewrite_contact=yes
rtp_symmetric چیست؟
به Asterisk میگوید RTP را به همان IP و Portی بفرستد که RTP از آن دریافت شده است.
این گزینه برای Endpointهای پشت NAT بسیار کاربردی است.
force_rport چه کاری میکند؟
SIP Response را به Source IP و Port واقعی Request برمیگرداند.
این رفتار در NAT معمولاً قابل اعتمادتر از اتکا به آدرسی است که Endpoint داخل Header نوشته است.
rewrite_contact چیست؟
Contact Header ورودی را با Source Address واقعی بازنویسی میکند تا درخواستهای بعدی Asterisk به همان مسیر قابل دسترس بروند.
برای Phoneهایی که Private IP خود را در Contact میفرستند بسیار مفید است.
نمونه Endpoint برای Remote Phone
[1001]
type=endpoint
transport=transport-udp
context=from-internal
disallow=all
allow=alaw
allow=ulaw
auth=auth1001
aors=1001
direct_media=no
rtp_symmetric=yes
force_rport=yes
rewrite_contact=yes
[auth1001]
type=auth
auth_type=userpass
username=1001
password=CHANGE-THIS-RANDOM-PASSWORD
[1001]
type=aor
max_contacts=1
remove_existing=yes
qualify_frequency=30
این NAT Optionها را روی همه Endpointها کورکورانه نگذارید
اگر تمام Phoneها و Asterisk روی یک LAN Routable هستند، بعضی از این تنظیمات اصلاً لازم نیستند.
اگر Asterisk پشت SBC قرار دارد، NAT را معمولاً SBC مدیریت میکند و فعالکردن دوباره NAT Logic روی Asterisk میتواند رفتار را پیچیده کند.
تنظیم باید مطابق Topology باشد.
RTP Port Range را مشخص کنید
فایل:
/etc/asterisk/rtp.conf
مثلاً:
[general]
rtpstart=10000
rtpend=20000
این بازه یک انتخاب رایج است، اما نکته جالب این است که Sample فعلی Asterisk مقدار Default داخلی را 5000 تا 31000 مستند میکند و 10000 تا 20000 را بهعنوان نمونه تنظیمشده نشان میدهد.
هر بازهای که انتخاب میکنید باید دقیقاً با Firewall هماهنگ باشد.
پورت SIP را به کل اینترنت باز نکنید
یکی از اشتباههای خطرناک روی VPS این است:
UDP/5060 برای تمام اینترنت باز باشد و فقط Password داخلی از PBX محافظت کند.
برای Trunk Provider، تا حد ممکن Source IPهای رسمی Provider را Allowlist کنید.
برای تلفنهای Remote، استفاده از VPN یا TLS و Policy امنیتی مناسب بهتر از بازکردن آزاد SIP است.
نمونه UFW برای یک Provider با IP مشخص
فرض کنیم Provider از شبکه مستندی:
198.51.100.0/24
استفاده میکند:
ufw allow from 198.51.100.0/24 to any port 5060 proto udp
این شبکه فقط نمونه مستندسازی است؛ Range واقعی را از Provider بگیرید.
ساخت SIP Trunk با PJSIP
حالا فرض کنیم Provider داریم:
sip.provider.example
نمونه زیر فقط Template است و باید با Documentation همان Provider تطبیق داده شود.
Auth مربوط به Provider
[provider-auth]
type=auth
auth_type=userpass
username=YOUR_PROVIDER_USERNAME
password=YOUR_PROVIDER_PASSWORD
AOR Provider
[provider]
type=aor
contact=sip:sip.provider.example:5060
qualify_frequency=60
Endpoint مربوط به Trunk
[provider]
type=endpoint
transport=transport-udp
context=from-provider
disallow=all
allow=alaw
allow=ulaw
aors=provider
outbound_auth=provider-auth
direct_media=no
from_domain=sip.provider.example
Identify برای تماس ورودی
اگر Provider تماس ورودی را از IP ثابت میفرستد، Identify یکی از روشهای مناسب Match کردن آن است.
[provider-identify]
type=identify
endpoint=provider
match=198.51.100.20
IP بالا مثال است.
در Production همه IPها یا Rangeهای رسمی Provider را طبق Documentation خودش وارد کنید.
اگر Provider نیاز به REGISTER دارد
[provider-registration]
type=registration
transport=transport-udp
outbound_auth=provider-auth
server_uri=sip:sip.provider.example
client_uri=sip:YOUR_PROVIDER_USERNAME@sip.provider.example
contact_user=inbound
retry_interval=60
همه Providerها Registration-based نیستند؛ بعضی Trunkها بر اساس IP Authentication کار میکنند.
وضعیت Registration Provider را ببینید
pjsip show registrations
Dialplan تماس خروجی
برای مثال فرض کنیم با Prefix صفر تماس بیرونی میگیریم:
[from-internal]
exten => _10XX,1,NoOp(Internal call)
same => n,Dial(${PJSIP_DIAL_CONTACTS(${EXTEN})},25)
same => n,Hangup()
exten => _0X.,1,NoOp(Outbound call via provider)
same => n,Dial(PJSIP/${EXTEN}@provider,60)
same => n,Hangup()
Dial Pattern بالا صرفاً نمونه آموزشی است. در Production باید شمارههای مجاز، Emergency Calling، International Calls و Permissionها دقیق طراحی شوند.
Dialplan تماس ورودی
چون در Registration مقدار:
contact_user=inbound
گذاشتهایم، در یک Provider سازگار میتوان Context ورودی نمونه را چنین نوشت:
[from-provider]
exten => inbound,1,NoOp(Inbound call from provider)
same => n,Dial(${PJSIP_DIAL_CONTACTS(1001)},25)
same => n,Hangup()
اما بعضی Providerها DID واقعی را در Request-URI میفرستند؛ پس این بخش باید با SIP Trace همان Provider تطبیق داده شود.
حالا TLS را فعال کنیم
UDP/5060 برای Lab و LAN ساده مناسب است، اما اگر Signaling از اینترنت عبور میکند، SIP over TLS انتخاب امنتری است.
برای TLS به Certificate و Private Key معتبر نیاز داریم.
مثلاً:
/etc/asterisk/keys/pbx.crt
/etc/asterisk/keys/pbx.key
Transport TLS
[transport-tls]
type=transport
protocol=tls
bind=0.0.0.0:5061
cert_file=/etc/asterisk/keys/pbx.crt
priv_key_file=/etc/asterisk/keys/pbx.key
method=tlsv1_2
verify_client=no
require_client_cert=no
برای محیطی که Mutual TLS لازم است، Client Certificate Validation باید جداگانه طراحی شود.
Asterisk 22 از TLS 1.3 هم پشتیبانی میکند؟
PJSIP Transport امکان انتخاب tlsv1_3 را دارد، اما Availability واقعی به PJProject و OpenSSL نصبشده وابسته است.
برای سازگاری با Phoneهای مختلف، TLS 1.2 هنوز Baseline قابلاستفادهای است.
اگر همه Endpointهای شما TLS 1.3 را پشتیبانی میکنند، قبل از Production آن را جداگانه آزمایش کنید.
Endpoint را روی TLS ببریم
در Endpoint:
transport=transport-tls
قرار میدهیم.
TLS فقط SIP را رمز میکند
این نکته بسیار مهم است.
SIP over TLS از Signaling محافظت میکند، اما صدای تماس همچنان میتواند RTP معمولی باشد.
اگر Media Encryption هم نیاز دارید باید SRTP را تنظیم کنید.
SRTP با SDES
برای Endpointهایی که SDES-SRTP پشتیبانی میکنند:
media_encryption=sdes
را اضافه کنید.
Asterisk صریحاً توصیه میکند SDES همراه Transport رمزنگاریشده استفاده شود، چون کلیدهای SRTP در SDP حمل میشوند.
نمونه داخلی TLS + SRTP
[1001]
type=endpoint
transport=transport-tls
context=from-internal
disallow=all
allow=alaw
allow=ulaw
auth=auth1001
aors=1001
direct_media=no
rtp_symmetric=yes
force_rport=yes
rewrite_contact=yes
media_encryption=sdes
برای WebRTC از SDES استفاده نکنید
WebRTC معمولاً از DTLS-SRTP استفاده میکند.
در PJSIP:
media_encryption=dtls
استفاده میشود و گزینههای ICE، AVPF و RTCP Mux نیز وارد Configuration میشوند.
WebRTC موضوع مستقلی است و بهتر است با Config تلفن SIP معمولی مخلوط نشود.
Certificate را قبل از اتصال Phone تست کنید
از یک سیستم دیگر:
openssl s_client \
-connect pbx.example.com:5061 \
-servername pbx.example.com
Certificate، Chain و تاریخ اعتبار را بررسی کنید.
تغییر Transport همیشه با Reload ساده اعمال نمیشود
Transportها با Endpointهای معمولی فرق دارند.
در PJSIP گزینه allow_reload بهطور پیشفرض No است، چون Reload Transport ممکن است تماسهای فعال را مختل کند.
بنابراین بعد از تغییر مهم Transport، Restart کنترلشده Asterisk در Maintenance Window مطمئنتر است.
systemctl restart asterisk
این کار تماسهای فعال را قطع میکند؛ روی Production بدون Maintenance Window اجرا نکنید.
Dialplan را قبل از Reload بررسی کنید
بعد از تغییر:
asterisk -rx "dialplan reload"
و:
asterisk -rx "dialplan show from-internal"
را بررسی کنید.
برای تماس فعال چه چیزی ببینیم؟
core show channels
برای جزئیات بیشتر:
core show channels verbose
RTP Debug را فقط کوتاهمدت روشن کنید
rtp set debug on
بعد از تست:
rtp set debug off
RTP Debug روی سیستم شلوغ خروجی بسیار زیادی تولید میکند.
خطای Endpoint not found
اگر Log شبیه این مفهوم دارد:
Endpoint نتوانسته برای Request ورودی شناسایی شود، این موارد را بررسی کنید:
🔹 Username داخل From
🔹 Auth Username
🔹 Identify Rule برای Trunk
🔹 Source IP Provider
در Trunkهای IP-based معمولاً بخش identify بسیار مهم است.
Endpoint هست ولی AOR Contact ندارد
این فرمان را بزنید:
pjsip show aor 1001
اگر Contact ندارید، اول Registration را حل کنید.
Registration هست ولی صدای یکطرفه داریم
این مشکل معمولاً Auth نیست.
موارد اصلی:
🔹 external_media_address
🔹 RTP Firewall
🔹 rtp_symmetric
🔹 direct_media
🔹 NAT/SBC
🔹 IP داخل SDP
Packet Capture و SDP را بررسی کنید.
Registration مرتب جابهجا میشود یا Contact زیاد میشود
وقتی rewrite_contact=yes دارید، NAT ممکن است Source Port جدید ایجاد کند.
اگر:
max_contacts=1
remove_existing=yes
داشته باشید، رفتار به chan_sip قدیمی نزدیکتر میشود و Contact قدیمی جای خود را به Registration جدید میدهد.
Configuration نهایی ساده برای دو داخلی
اگر فقط یک LAN بدون NAT دارید، حداقل Configuration آموزشی میتواند این باشد:
[transport-udp]
type=transport
protocol=udp
bind=0.0.0.0:5060
[1001]
type=endpoint
transport=transport-udp
context=from-internal
disallow=all
allow=alaw
allow=ulaw
auth=auth1001
aors=1001
direct_media=no
[auth1001]
type=auth
auth_type=userpass
username=1001
password=REPLACE-WITH-RANDOM-PASSWORD-1001
[1001]
type=aor
max_contacts=1
remove_existing=yes
[1002]
type=endpoint
transport=transport-udp
context=from-internal
disallow=all
allow=alaw
allow=ulaw
auth=auth1002
aors=1002
direct_media=no
[auth1002]
type=auth
auth_type=userpass
username=1002
password=REPLACE-WITH-RANDOM-PASSWORD-1002
[1002]
type=aor
max_contacts=1
remove_existing=yes
Dialplan نهایی همان سناریو
[from-internal]
exten => _10XX,1,NoOp(Internal PJSIP call)
same => n,Dial(${PJSIP_DIAL_CONTACTS(${EXTEN})},25)
same => n,Hangup()
تنظیم Phone برای داخلی 1001
| گزینه | مقدار |
|---|---|
| SIP Server | IP یا FQDN سرور Asterisk |
| User ID | 1001 |
| Auth ID | 1001 |
| Password | Password داخلی 1001 |
| Transport | UDP برای تست اولیه |
| Port | 5060 |
چکلیست تست اولیه
مرحله ۱: 1001 و 1002 را Register کنید.
مرحله ۲: در CLI بررسی کنید:
pjsip show contacts
مرحله ۳: از 1001 با 1002 تماس بگیرید.
مرحله ۴: Audio هر دو جهت را تست کنید.
مرحله ۵: Hold و Transfer را تست کنید.
مرحله ۶: سپس NAT یا TLS را مرحلهای اضافه کنید.
همه چیز را همزمان فعال نکنید
یکی از بهترین روشهای راهاندازی Asterisk همین است:
اول SIP ساده روی LAN.
بعد Dialplan.
بعد NAT.
بعد Trunk.
بعد TLS/SRTP.
اگر از همان ابتدا NAT، TLS، SRTP و Provider را همزمان وارد کنید، وقتی Registration Fail شود نمیدانید کدام لایه مقصر است.
پرسشهای رایج
Asterisk 22 برای Production مناسب است؟
بله. Asterisk 22 شاخه LTS است و تا اکتبر ۲۰۲۸ پشتیبانی کامل و تا اکتبر ۲۰۲۹ اصلاحات امنیتی دریافت میکند.
PJSIP Endpoint، Auth و AOR چه تفاوتی دارند؟
Endpoint رفتار SIP و Media را تعریف میکند، Auth Credential احراز هویت را نگه میدارد و AOR مشخص میکند Endpoint از چه Contact یا SIP URI قابل دسترسی است.
آیا برای هر داخلی باید Auth و AOR جدا بسازیم؟
برای داخلی معمولی این ساختار سادهترین و قابلفهمترین روش است. در سناریوهای پیچیده میتوان Objectها را به شکلهای دیگری نیز به اشتراک گذاشت.
برای تلفن پشت NAT چه تنظیماتی مهماند؟
معمولاً direct_media=no، rtp_symmetric=yes، force_rport=yes و rewrite_contact=yes بررسی میشوند. اگر خود Asterisk پشت NAT باشد، local_net و External Addressهای Transport نیز اهمیت دارند.
چرا داخلی Register شده ولی صدای یکطرفه داریم؟
Registration مربوط به SIP Signaling است؛ One-Way Audio معمولاً به RTP، NAT، Firewall، SDP یا Direct Media مربوط میشود.
TLS چه چیزی را در Asterisk رمز میکند؟
TLS از SIP Signaling محافظت میکند. برای رمزکردن Media باید SRTP با media_encryption=sdes یا DTLS-SRTP در سناریوی مناسب استفاده شود.
آیا UDP/5060 را میتوان به اینترنت باز کرد؟
از نظر فنی بله، اما از نظر امنیتی بهتر است دسترسی بر اساس Provider IP، VPN، TLS، ACL و سایر کنترلها محدود شود و SIP بدون محدودیت در معرض کل اینترنت قرار نگیرد.
چطور بفهمیم داخلی واقعاً Register شده است؟
از pjsip show contacts و pjsip show aor استفاده کنید. وجود Contact معتبر نشان میدهد AOR محل فعلی Endpoint را میشناسد.
آخرین نسخه پایدار Asterisk 22 در اکتبر ۲۰۲۶ چیست؟
در زمان بررسی این مقاله نسخه پایدار فعلی شاخه 22 برابر Asterisk 22.11.0 است.
جمعبندی
Asterisk 22 برای مدیرانی مناسب است که به کنترل مستقیم روی PBX نیاز دارند و میخواهند SIP، NAT، Trunk و Dialplan را بدون لایه گرافیکی مدیریت کنند.
در PJSIP چهار مفهوم پایه را به خاطر بسپارید: Transport مشخص میکند SIP چگونه جابهجا شود، Endpoint رفتار دستگاه را تعریف میکند، Auth Credential را نگه میدارد و AOR آدرس فعلی Device را مشخص میکند.
برای شروع دو Endpoint ساده روی LAN بسازید و تماس داخلی را کامل تست کنید. بعد NAT، Trunk و TLS را یکییکی وارد Configuration کنید.
در Remote Endpointها نیز تنظیماتی مانند rtp_symmetric، force_rport و rewrite_contact بسیار مهماند، اما نباید آنها را بدون توجه به Topology روی همه Endpointها فعال کرد.
در نهایت اگر Signaling از اینترنت عبور میکند، TLS و در صورت نیاز SRTP را اضافه کنید و Firewall را طوری تنظیم کنید که SIP Server بهصورت آزاد در معرض کل اینترنت قرار نگیرد.
Asterisk خام میخواهید، اما نمیخواهید PBX روی IP متغیر یا شبکه ناپایدار اجرا شود؟
برای Asterisk 22 بهتر است سروری با IP ثابت و دسترسی کامل Linux داشته باشید تا PJSIP، Firewall، NAT، TLS و RTP دقیقاً مطابق معماری تلفنی شما تنظیم شوند.
سرور مجازی ایران میتواند برای PBXهایی که کاربران و تلفنهای آنها داخل ایران هستند مسیر مناسبی باشد؛ همچنین میتوانید قبل از انتقال Trunk اصلی، Asterisk 22 را روی یک VPS جدا راهاندازی و با چند Endpoint آزمایشی بررسی کنید.
مشاوره راهاندازی PJSIP و SIP Trunk: 021-91302467






دیدگاهها (۰)