Asterisk PJSIP: Endpoint not found in endpoint table (Траблшутинг)
- В логах фиксируется ошибка
WARNING res_pjsip.c: Endpoint 'anonymous': Endpoint not found in endpoint table. - Входящие вызовы от оператора или междугородних транков сбрасываются со статусом
404 Not Foundили401 Unauthorized. - АТС не может сопоставить входящий запрос с конкретным контекстом диалплана.
- Команда
pjsip show endpointsне выводит созданный транк.
1. Архитектура сопоставления эндпоинтов в res_pjsip
В отличие от chan_sip, драйвер res_pjsip использует модульную систему идентификации. Когда на сервер приходит входящий SIP-запрос, PJSIP последовательно опрашивает модули-идентификаторы в порядке их приоритета:
res_pjsip_endpoint_identifier_ip(по IP-адресу и порту источника);res_pjsip_endpoint_identifier_user(по заголовку From / Digest Username);res_pjsip_endpoint_identifier_anonymous(гостевой доступ).
Если совпадений нет, запрос отклоняется сообщением Endpoint not found.
2. Настройка идентификации транка по IP в `/etc/asterisk/pjsip.conf`
Для операторских транков со статическим IP-адресом обязательно создайте секцию identify:
[my_trunk_endpoint]
type=endpoint
context=from-trunk
disallow=all
allow=alaw,ulaw
aors=my_trunk_aor
[my_trunk_aor]
type=aor
contact=sip:198.51.100.1:5060
; Секция привязки IP-адреса оператора к эндпоинту
[my_trunk_identify]
type=identify
endpoint=my_trunk_endpoint
match=198.51.100.1
match=198.51.100.2 ; Дополнительные сигнальные IP оператора3. Настройка идентификации абонентов с динамическими IP
Для внутренних телефонов идентификация выполняется по имени пользователя в заголовке From:
[101]
type=endpoint
context=from-internal
disallow=all
allow=alaw,ulaw
auth=101_auth
aors=101
[101_auth]
type=auth
auth_type=userpass
username=101
password=VeryStrongPassword!45
[101]
type=aor
max_contacts=24. Проверка модулей идентификации и перезагрузка
asterisk -rx "module show like identifier"
asterisk -rx "pjsip show identifies"
asterisk -rx "pjsip reload" Частые вопросы (FAQ)
Почему входящие звонки от транка попадают в endpoint 'anonymous'?
Это означает, что для транка не настроена секция type=identify с директивой match=<IP_оператора>, либо модуль res_pjsip_endpoint_identifier_ip.so не загружен.
Можно ли сопоставлять эндпоинты по подсети (CIDR)?
Да, директива match поддерживает маски подсетей: match=192.168.0.0/24 или match=10.0.0.0/8.
Как включить идентификацию по заголовку Line (Outbound Registration)?
В секции type=registration включите параметр line=yes и endpoint=<имя_эндпоинта>. Провайдер будет возвращать специальный токен line в заголовке Contact/URI.
Что делать, если оператор шлет вызовы с разных портов?
В секции type=identify укажите match_header=To: /.../ или задайте IP без указания порта (match=1.2.3.4), чтобы матчились любые порты источника.