اگر داخلی PJSIP در Asterisk رجیستر نمیشود، سریع سراغ تغییر Password، NAT یا Firewall نروید. بهترین روش این است که Asterisk را وادار کنید دقیقاً نشان دهد REGISTER از کجا آمده، با کدام Endpoint Match شده، چه Challengeای ارسال شده و چرا Contact داخل AoR ثبت نشده است.
pjsip set logger on است. با همین Log میتوان تفاوت یک 401 طبیعی با یک 401 تکرارشونده و واقعی را فهمید، تشخیص داد چرا Asterisk Endpoint را نمیشناسد، دید 403 بهخاطر max_contacts است یا نه، و بعد سراغ NAT و Transport رفت.
اصل مهم: در SIP، دیدن 401 همیشه به معنی «رمز اشتباه» نیست. در Digest Authentication، اولین 401 معمولاً Challenge طبیعی است. حتی اگر Asterisk اصلاً نتواند Endpoint را شناسایی کند، برای جلوگیری از نشت اطلاعات ممکن است یک 401 ساختگی برگرداند.
اول بدانید یک Registration سالم PJSIP چه شکلی دارد
برای یک داخلی ساده، Flow طبیعی معمولاً این است:
Phone Asterisk
| |
| REGISTER |
|---------------------->|
| |
| 401 Unauthorized |
|<----------------------| | | | REGISTER + Authorization |---------------------->|
| |
| 200 OK |
|<----------------------|
| |
| Contact stored in AoR |
در این Flow، 401 اول خطا نیست. Asterisk با Header مربوط به WWW-Authenticate یک Challenge میفرستد و Phone در REGISTER دوم Authorization را اضافه میکند.
اگر بعد از REGISTER دوم باز هم 401 میبینید، یا Asterisk اصلاً Endpoint درست را Match نکرده، یا Credential/Realm/Username درست نیست.
مرحله ۱: Log کامل Asterisk را روشن کنید
راهنمای رسمی Troubleshooting خود Asterisk پیشنهاد میکند قبل از هر نتیجهگیری این سه سطح Debug را فعال کنید:
asterisk -rvvvvv
core set verbose 4
core set debug 4
pjsip set logger on
حالا فقط یک Phone را Re-register کنید یا یک بار Account را Disable/Enable کنید تا Trace شلوغ نشود.
بعد از پایان تست:
pjsip set logger off
core set debug 0
core set verbose 3
در REGISTER اول چه چیزهایی را یادداشت کنیم؟
🔹 Source IP و Source Port تلفن.
🔹 Transport؛ UDP، TCP یا TLS.
🔹 Username داخل To و From.
🔹 Contact URI.
🔹 Realm داخل Challenge.
🔹 Username داخل Authorization در REGISTER دوم.
مرحله ۲: مطمئن شوید Endpoint، Auth و AoR واقعاً Load شدهاند
قبل از تحلیل Password، ببینید Asterisk اصلاً Config شما را شناخته است یا نه.
برای Endpoint 6001:
pjsip show endpoint 6001
در خروجی باید حداقل چیزی شبیه این ارتباطها ببینید:
Endpoint: 6001
InAuth: auth6001/6001
Aor: 6001
Transport: transport-udp
اگر InAuth وجود ندارد، خط auth= در Endpoint درست نیست یا Auth Section Load نشده است. اگر AoR دیده نمیشود، aors= یا نام Section مشکل دارد.
AoR را جدا ببینید:
pjsip show aor 6001
مرحله ۳: 401 طبیعی را از 401 واقعی جدا کنید
دو نوع 401 را زیاد میبینید.
حالت اول؛ 401 طبیعی Digest Authentication
REGISTER اول بدون Authorization میآید، Asterisk پاسخ 401 میدهد و Phone REGISTER دوم را با Authorization میفرستد. اگر بعدش 200 OK گرفتید، همهچیز طبیعی است.
REGISTER sip:pbx.example.com SIP/2.0
SIP/2.0 401 Unauthorized
WWW-Authenticate: Digest realm="asterisk", ...
REGISTER sip:pbx.example.com SIP/2.0
Authorization: Digest username="6001", ...
SIP/2.0 200 OK
حالت دوم؛ 401 تکراری بهخاطر Credential اشتباه
REGISTER دوم Authorization دارد اما Asterisk باز هم 401 میدهد. در این حالت Username، Password و Realm را بررسی کنید.
روی Asterisk 22.2 و جدیدتر، PJSIP علاوه بر MD5 میتواند SHA-256 و SHA-512-256 هم داشته باشد؛ ولی هر دو سمت باید الگوریتم مشترک داشته باشند. برای دیدن قابلیت Build:
pjproject show buildopts
حالت سوم؛ Endpoint اصلاً Match نشده و 401 ساختگی میبینید
این یکی بسیار مهم است. Asterisk برای جلوگیری از Information Leak، اگر SIP Request را نتواند به هیچ Endpoint شناختهشده Match کند، ممکن است 401 با Challenge ساختگی ارسال کند.
در Log معمولاً پیامهایی درباره Match نشدن Endpoint یا Username میبینید. بنابراین اگر Password را ده بار عوض کردید و باز 401 میگیرید، ممکن است اصلاً به Auth واقعی Endpoint نرسیده باشید.
مرحله ۴: Endpoint Identification را بررسی کنید
PJSIP باید قبل از Authentication بفهمد درخواست متعلق به کدام Endpoint است. Asterisk چند روش Identification دارد.
برای یک Phone داخلی که Register میشود، Match بر اساس Username معمولاً سادهترین حالت است. برای SIP Trunk با IP ثابت، type=identify کاربرد بیشتری دارد.
یک داخلی معمولی
[6001]
type=endpoint
identify_by=username,auth_username
auth=auth6001
aors=6001
نکته مهم مستند Asterisk این است که identify_by فقط روی Match Endpoint اثر ندارد؛ برای پیدا کردن AoR در Registration هم مؤثر است. حداقل یکی از روشهای انتخابشده باید بتواند AoR را هم Match کند، وگرنه Registration Fail میشود.
Identify بر اساس IP برای Trunk
[provider-identify]
type=identify
endpoint=provider
match=203.0.113.50
برای Phoneهایی که IP متغیر دارند، Identify by IP معمولاً انتخاب مناسبی نیست.
Module مربوط به Identify را هم چک کنید
module show like res_pjsip_endpoint_identifier_ip.so
مرحله ۵: 403 را فقط «Password اشتباه» معنی نکنید
در Registration ورودی Asterisk، 403 میتواند دقیقاً از خود AoR بیاید.
دو سناریوی رسمی و رایج:
🔹 روی AoR مقدار max_contacts تعریف نشده است.
🔹 تعداد Contactهای فعلی از max_contacts بیشتر شده است.
اگر max_contacts تنظیم نشده باشد، Log میتواند مفهوم زیر را نشان دهد:
AOR '6001' has no configured max_contacts.
Endpoint '6001' unable to register
Config صحیح پایه:
[6001]
type=aor
max_contacts=1
remove_existing=yes
اگر Phone قبلی هنوز Contact فعال دارد و Device جدید میخواهد جای آن را بگیرد، remove_existing=yes معمولاً مفید است. اگر عمداً چند Device با یک AoR دارید، بهجای حذف Contact قبلی باید max_contacts را متناسب طراحی کنید.
Contactهای فعلی را ببینید
pjsip show aor 6001
اگر Contact وجود دارد اما همان Phone دیگر در دسترس نیست، علت 403 بعدی میتواند محدودیت Contact باشد.
مرحله ۶: Registrar Module را بررسی کنید
Registration ورودی به Module مربوط به Registrar نیاز دارد. اگر Config ظاهراً درست است اما Registration پردازش نمیشود، Module را بررسی کنید:
module show like res_pjsip_registrar.so
وضعیت باید Running باشد.
مرحله ۷: NAT را بعد از Endpoint/Auth بررسی کنید
اگر REGISTER به Asterisk میرسد، Endpoint Match میشود و Authentication هم درست است، تازه NAT را بررسی کنید.
برای Remote Phone این گزینهها معمولاً مهماند:
force_rport=yes
rewrite_contact=yes
rtp_symmetric=yes
direct_media=no
برای خود Asterisk پشت NAT نیز Transport باید شبکه داخلی و Public Address را بشناسد:
[transport-udp]
type=transport
protocol=udp
bind=0.0.0.0:5060
local_net=192.168.10.0/24
external_signaling_address=203.0.113.10
external_media_address=203.0.113.10
اگر Phone داخل همان LAN است، معمولاً این NAT Optionهای Endpoint لازم نیستند. Config را با Topology واقعی هماهنگ کنید.
NAT در Registration از روی Contact مشخص میشود
در Logger به Contact دقت کنید:
Contact: <sip:6001@192.168.1.50:5060>
اگر Phone از اینترنت آمده ولی Contact آدرس خصوصی دارد، rewrite_contact معمولاً به Asterisk کمک میکند درخواستهای بعدی را به Source واقعی بفرستد.
مرحله ۸: Transport را دقیقاً با Phone یکی کنید
ممکن است Phone روی TCP یا TLS تنظیم شده باشد اما Endpoint فقط Transport دیگری را استفاده کند.
Transportهای فعال را ببینید:
pjsip show transports
UDP پایه:
[transport-udp]
type=transport
protocol=udp
bind=0.0.0.0:5060
TLS پایه:
[transport-tls]
type=transport
protocol=tls
bind=0.0.0.0:5061
cert_file=/etc/asterisk/keys/asterisk.crt
priv_key_file=/etc/asterisk/keys/asterisk.key
نکته: Transportهای PJSIP بهطور معمول با Reload ساده تغییر نمیکنند. مستند رسمی Asterisk هشدار میدهد برای تغییر Transport باید Restart کامل Asterisk را در نظر بگیرید.
Config سالم پایه برای یک داخلی PJSIP
اگر میخواهید Config خود را با یک Baseline ساده مقایسه کنید:
[6001]
type=endpoint
transport=transport-udp
context=from-internal
disallow=all
allow=ulaw,alaw
auth=auth6001
aors=6001
direct_media=no
[auth6001]
type=auth
auth_type=digest
username=6001
password=CHANGE-TO-A-LONG-RANDOM-PASSWORD
[6001]
type=aor
max_contacts=1
remove_existing=yes
qualify_frequency=30
این Config برای یک Phone داخلی پایه است. NAT، TLS، Codec و Security را بر اساس محیط خودتان اضافه کنید.
بعد از اصلاح Config، Registration را چطور Verify کنیم؟
اول Config را Reload کنید:
pjsip reload
سپس Endpoint و AoR را ببینید:
pjsip show endpoint 6001
pjsip show aor 6001
بعد از Registration موفق باید Contact زیر AoR دیده شود.
برای همه Endpointها:
pjsip show endpoints
اگر مشکل Trunk Outbound Registration است، دستورها فرق میکنند
تا اینجا درباره Phoneای صحبت کردیم که به Asterisk Register میشود. اما وقتی خود Asterisk باید به Provider Register شود، Object از نوع registration دارید و باید وضعیت دیگری را ببینید.
مثال:
pjsip show registrations
برای یک Registration خاص:
pjsip show registration my_provider
برای Trunk، outbound_auth در Registration تعیین میکند Asterisk وقتی Provider Challenge میدهد از کدام Credential استفاده کند.
جدول تشخیص سریع PJSIP registration failed
| علامت | علت محتمل | اولین بررسی |
|---|---|---|
| 401 و بعد 200 OK | رفتار طبیعی Digest | هیچ مشکلی نیست |
| 401 پشت سر هم | Auth اشتباه یا Endpoint Match نشده | Logger، Username، Realm و pjsip show endpoint |
| 401 با Endpoint ناشناخته | Identification Failure | identify_by / Endpoint Name / From-To Username |
| 403 در REGISTER | AoR یا Contact Limit | max_contacts و remove_existing |
| هیچ REGISTERی در Logger نیست | Network/Transport/Firewall | IP، Port، UDP/TCP/TLS و Capture |
| REGISTER میرسد ولی AoR Contact ندارد | Registrar/AoR/Auth Failure | res_pjsip_registrar و pjsip show aor |
| Contact با IP خصوصی Remote Phone | NAT | rewrite_contact / force_rport |
| TLS وصل نمیشود | Certificate/Port/Transport | 5061، TLS handshake و Certificate |
اشتباههایی که عیبیابی را طولانی میکنند
🔹 عوضکردن Password قبل از دیدن Logger.
🔹 فرض اینکه هر 401 یعنی Password اشتباه.
🔹 استفاده از Identify by IP برای Phone با IP متغیر.
🔹 فراموشکردن max_contacts در AoR.
🔹 نگهداشتن Contact قدیمی و تعجب از 403.
🔹 تغییر Transport و فقط اجرای Reload.
🔹 فعالکردن همه NAT Optionها بدون توجه به Topology.
🔹 عیبیابی RTP قبل از اینکه Registration کامل شده باشد.
داخلی PJSIP هنوز Register نمیشود؟
برای بررسی دقیق، خروجی pjsip show endpoint، pjsip show aor و بخش مربوط به REGISTER از pjsip set logger on را آماده کنید. با همین سه خروجی معمولاً مشخص میشود مشکل از Identification، Credential، AoR، NAT یا Transport است.
ایرانیکاسرور میتواند در نصب و عیبیابی Asterisk 22، PJSIP، SIP Trunk، NAT، TLS و اتصال تلفنهای Cisco/Yealink کمک کند.
تماس با پشتیبانی ایرانیکاسرور: 021-91302467
پرسشهای رایج
آیا 401 در PJSIP همیشه خطاست؟
خیر. اولین 401 در Digest Authentication معمولاً Challenge طبیعی است. اگر REGISTER دوم با Authorization بیاید و 200 OK بگیرد، Registration سالم است.
چرا با Password درست باز هم 401 میگیرم؟
ممکن است Asterisk اصلاً Endpoint را Match نکرده باشد و یک Challenge ساختگی ارسال کند. Logger و خروجی `pjsip show endpoint` را بررسی کنید.
403 هنگام REGISTER در Asterisk یعنی چه؟
یکی از علتهای رسمی و رایج، نبودن `max_contacts` روی AoR یا پرشدن سقف Contactهاست. `pjsip show aor` و Log Registrar را بررسی کنید.
remove_existing چه کاری میکند؟
وقتی یک Registration جدید میآید، به Asterisk اجازه میدهد Contact قبلی را در صورت نیاز جایگزین کند. برای داخلی تکدستگاهی معمولاً کاربردی است.
برای داخلی Phone باید type=identify بسازم؟
معمولاً برای Phone ثبتشونده که با Username شناسایی میشود لازم نیست. `type=identify` بیشتر برای Endpointهایی مانند Trunk با IP ثابت کاربرد دارد.
NAT چه زمانی باعث Registration Failed میشود؟
وقتی SIP Request به Asterisk میرسد ولی Contact و Source Address با مسیر واقعی همخوان نیستند، NAT میتواند باعث مشکل در درخواستهای بعدی شود. `rewrite_contact`، `force_rport` و Transport NAT Settings را بررسی کنید.
چرا بعد از تغییر Transport هنوز Config قدیمی استفاده میشود؟
Transportهای PJSIP بهطور پیشفرض با Reload عادی تغییر نمیکنند. برای تغییر Transport ممکن است Restart کامل Asterisk لازم باشد.
فرق pjsip show registrations با pjsip show aor چیست؟
`pjsip show aor` برای Contactهای Endpointهایی است که به Asterisk Register میشوند. `pjsip show registrations` وضعیت Registrationهایی را نشان میدهد که خود Asterisk به Provider یا Registrar بیرونی ارسال میکند.
جمعبندی
برای رفع PJSIP registration failed با حدسزدن شروع نکنید. ابتدا pjsip set logger on را فعال کنید و Flow واقعی REGISTER را ببینید.
401 اول معمولاً Challenge طبیعی است؛ 401 تکراری میتواند Credential اشتباه یا Endpoint Identification ناموفق باشد. 403 نیز در Asterisk میتواند از AoR و محدودیت Contactها بیاید، مخصوصاً وقتی max_contacts تعریف نشده یا ظرفیت آن پر شده است.
بعد از آن Endpoint/Auth/AoR، Module Registrar، NAT و Transport را بهترتیب بررسی کنید. وقتی Contact زیر AoR ظاهر شد و REGISTER با 200 OK تمام شد، تازه سراغ Call Flow، SDP و RTP بروید.
برای تحلیل PJSIP Logger کمک میخواهید؟
بخش REGISTER از Logger، خروجی `pjsip show endpoint` و `pjsip show aor` را آماده کنید. از روی همین اطلاعات میتوان فهمید Failure در Endpoint Match، Authentication، AoR، NAT یا Transport رخ داده است.
تماس با پشتیبانی ایرانیکاسرور: 021-91302467
”’
scripts = re.findall(r’‘, html, flags=re.S)
assert len(scripts) == 1
json.loads(scripts[0])
html_path = Path(“/mnt/data/asterisk-pjsip-registration-failed-logger-wordpress.html”)
html_path.write_text(html, encoding=”utf-8″)
info = “””اطلاعات یوآست
کلیدواژه کانونی:
عنوان سئو:
نامک:
توضیح متا:
اطلاعات تصویر
متن جایگزین:
عنوان:
عنوان تصویر:
توضیح:
عنوان نهایی مقاله:
رجیستر نشدن داخلی در Asterisk PJSIP؛ عیبیابی 401 و 403 با pjsip set logger
برچسبها:






دیدگاهها (۰)