مجله ایرانیکاسرورآموزش سرور، هاست، وردپرس و شبکه
آموزشی

چطور Asterisk 22 را با PJSIP راه‌اندازی کنیم؟ Endpoint، NAT، TLS و Dialplan

Asterisk 22 برای کسی مناسب است که می‌خواهد یک مرکز تلفن VoIP را بدون وابستگی به پنل‌هایی مثل FreePBX، با کنترل مستقیم روی SIP، Dialplan، Trunk، NAT و امنیت بسازد. اگر با لینوکس راحت…

چطور Asterisk 22 را با PJSIP راه‌اندازی کنیم؟ Endpoint، NAT، TLS و Dialplan
خلاصه سریع این آموزش

Asterisk 22 برای کسی مناسب است که می‌خواهد یک مرکز تلفن VoIP را بدون وابستگی به پنل‌هایی مثل FreePBX، با کنترل مستقیم روی SIP، Dialplan، Trunk، NAT و امنیت بسازد.…

۱۸ دقیقه مطالعه ۰ دیدگاه ۲۵ مهر ۱۴۰۵ آخرین به‌روزرسانی
Asterisk 22 برای کسی مناسب است که می‌خواهد یک مرکز تلفن VoIP را بدون وابستگی به پنل‌هایی مثل FreePBX، با کنترل مستقیم روی SIP، Dialplan، Trunk، NAT و امنیت بسازد. اگر با لینوکس راحت هستید و می‌خواهید دقیقاً بدانید هر تماس از کجا وارد می‌شود، با چه Credentialای احراز هویت می‌شود و با چه Dialplanی به مقصد می‌رسد، Asterisk خام انعطاف بسیار بیشتری در اختیار شما می‌گذارد.

در این آموزش فرض می‌کنیم 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 22، ساختار PJSIP، NAT، Authentication، TLS و Dialplan این مقاله با مستندات رسمی پروژه Asterisk تا ۱۷ اکتبر ۲۰۲۶ بررسی شده‌اند.
Asterisk LTS
مرجع LTS بودن Asterisk 22، پشتیبانی کامل تا اکتبر ۲۰۲۸ و وضعیت شاخه‌های 23 و 24
Asterisk 22
مرجع نسخه پایدار فعلی شاخه 22 یعنی Asterisk 22.11.0 در زمان بررسی مقاله
PJSIP Architecture
مرجع رسمی تفاوت endpoint، auth، aor، contact، transport و identify
PJSIP Examples
مرجع ساخت Endpoint رجیسترشونده، Auth، AOR و تنظیمات Endpoint پشت NAT
NAT
مرجع local_net، external_media_address، external_signaling_address، rtp_symmetric، force_rport و rewrite_contact
PJSIP Authentication
مرجع Digest Authentication و پشتیبانی SHA-256 و SHA-512-256 در Asterisk 22.2 به بعد
TLS / SRTP
مرجع Transport TLS، Certificate و جداسازی امنیت SIP Signaling از SRTP Media
پیشنهاد ایرانیکاسرور برای Asterisk 22

Asterisk خام می‌خواهید، اما نمی‌خواهید PBX روی IP متغیر یا شبکه ناپایدار اجرا شود؟

برای Asterisk 22 بهتر است سروری با IP ثابت و دسترسی کامل Linux داشته باشید تا PJSIP، Firewall، NAT، TLS و RTP دقیقاً مطابق معماری تلفنی شما تنظیم شوند.

سرور مجازی ایران می‌تواند برای PBXهایی که کاربران و تلفن‌های آن‌ها داخل ایران هستند مسیر مناسبی باشد؛ همچنین می‌توانید قبل از انتقال Trunk اصلی، Asterisk 22 را روی یک VPS جدا راه‌اندازی و با چند Endpoint آزمایشی بررسی کنید.

مشاوره راه‌اندازی PJSIP و SIP Trunk: 021-91302467

اشتراک‌گذاری مقاله
گفت‌وگو درباره آموزش

دیدگاه‌ها (۰)

هنوز دیدگاهی ثبت نشده است.

دیدگاه یا سؤال خود را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *