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

چرا داخلی PJSIP در Asterisk رجیستر نمی‌شود؟ رفع خطاهای 401 و 403 با Logger

اگر داخلی PJSIP در Asterisk رجیستر نمی‌شود، سریع سراغ تغییر Password، NAT یا Firewall نروید. بهترین روش این است که Asterisk را وادار کنید دقیقاً نشان دهد REGISTER از کجا آمده، با کدام Endpoint…

چرا داخلی PJSIP در Asterisk رجیستر نمی‌شود؟ رفع خطاهای 401 و 403 با Logger
خلاصه سریع این آموزش

اگر داخلی PJSIP در Asterisk رجیستر نمی‌شود، سریع سراغ تغییر Password، NAT یا Firewall نروید. بهترین روش این است که Asterisk را وادار کنید دقیقاً نشان دهد REGISTER از کجا…

۱۱ دقیقه مطالعه ۰ دیدگاه ۲۶ مهر ۱۴۰۵ آخرین به‌روزرسانی

اگر داخلی PJSIP در Asterisk رجیستر نمی‌شود، سریع سراغ تغییر Password، NAT یا Firewall نروید. بهترین روش این است که Asterisk را وادار کنید دقیقاً نشان دهد REGISTER از کجا آمده، با کدام Endpoint Match شده، چه Challengeای ارسال شده و چرا Contact داخل AoR ثبت نشده است.

برای این کار، مهم‌ترین ابزار شما در CLI دستور 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 کامل شده باشد.

یک REGISTER واقعی، علت را خیلی سریع‌تر از حدس مشخص می‌کند

داخلی 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 بروید.

منابع و مستندات
رفتار 401/403، Endpoint Identification، AoR، Registrar، Authentication، NAT و Transport این مقاله با مستندات رسمی Asterisk بررسی شده‌اند.
Asterisk Troubleshooting
مرجع `core set verbose 4`، `core set debug 4`، `pjsip set logger on`، Endpoint Identification و خطاهای Registration.
Asterisk res_pjsip
مرجع `identify_by`، Endpoint Options، Transport و رفتار Reload Transport.
Endpoint Identify
مرجع `type=identify`، Match بر اساس Source IP و اتصال Identify Object به Endpoint.
PJSIP Authentication
مرجع Digest Authentication و الگوریتم‌های MD5، SHA-256 و SHA-512-256 در Asterisk 22.2 و جدیدتر.
Outbound Registration
مرجع تفاوت Registration ورودی Phone با Registration خروجی Asterisk و دستورهای `pjsip show registrations`.
401 یا 403 را از روی SIP Flow تشخیص دهید

برای تحلیل 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

برچسب‌ها:

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

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

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

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

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