Хочу составить себе понимание как настраивается работа телефонии на базе PJSIP, т.к. что и от чего зависит и что где применяется. Как я пока понимаю в системе Asterisk 22 модуль chan_pjsip.so использует объектную структуру конфигурации: endpoint -> auth -> transport -> identity
Схема №1

Схема №2

Схема №3

transport -> транспорт SIP (UDP/TCP/TLS)
endpoint -> логика звонков
auth -> логин и пароль
aor -> адрес устройства
identity -> сопоставление IP (для транков)
pjsip.conf состоит из секций, где каждая секция определяет конфигурацию для объекта конфигурации res_pjsip. Имена секций задаются в квадратных скобках ([]) и могут быть произвольными, но также есть исключение: имена ENDPOINT & AOR должны быть идентичны с заголовком SIP URI. Внутри каждой секции присутствует обязательная опция "type=" — в ней определяется назначение секции в конфигурации.
Типы type=:
ENDPOINTAORTRANSPORTAUTHREGISTRATIONDOMAIN_ALIASACLIDENTITYCONTACTSystemGlobal
Из схемы выше в типе ENDPOINT (этом модуле) описываются опции протокола SIP и взаимодействие с модулями: AOR, AUTH, TRANSPORT.
Из схемы выше в типе TRANSPORT (этом модуле) описывается использование протоколов транспортного уровня, веб-сокеты и методы шифрования. Если в этой секции есть параметр allow_reload в значении true, то для обновления внесенных данных достаточно перечитать конфиг.
Из схемы выше в типе AOR (этом модуле) указывает Asterisk(у) как производится связь с ENDPOINT.
Из схемы выше в типе REGISTRATION (этом модуле) описываются опции отвечающие за исходящие регистрации. Как возможный пример — это транк до провайдера VoIP телефонии.
Из схемы выше в типе AUTH (этом модуле) ассоциируются между собой ENDPOINT & REGISTRATION.
Тип DOMAIN_ALIAS прописывает псевдонимы домена.
Тип IDENTITY задается определенный IP адрес ENDPOINT, если возникает такая необходимость.
Тип CONTACT используется для того, чтобы не приходилось явно указывать SIP URI в DIALPLAN(е).
Тип ACL используется res_pjsip для контроля всех входящий соединений SIP (аналог permit/deny в sip.conf)
В процессе приобщения к пониманию структуры использования PJSIP вышел на упоминание, что можно использовать PJSIP Configuration Wizard — это упрощенный механизм настройки SIP в Asterisk 22, который автоматически создает все необходимые объекты PJSIP (такие как endpoint, auth, aor и т.д) из одной короткой записи, точнее несколько строк описания.
Удобство в использовании PJSIP Configuration Wizard (/etc/asterisk/pjsip_wizard.conf) заключается в следующем:
Обычная настройка PJSIP задействует несколько объектов: endpoint, auth, aor, identity, registration -> все это занимает множество строк.
Wizard настройка PJSIP упрощает описание.
Но не все так радужно как хочется, не всегда Wizard лучше, если используется несколько типов AOR, двойной NAT, большая АТС обслуживающая несколько филиалов. Это так упоминается в изучаемом, на практике не проверял, но дойду до этого.
Шаг №1: Как инициируется SIP-звонок:
а) устройство отправляет REGISTER
б) Asterisk проверят тип auth
в) IP сохраняется в типе aor -> contact
г) при звонке используется endpoint
д) Asterisk выполняет (DIAL/PJSIP/…)
Из всего упорядоченного для себя выше, могу лишь пока сказать, что конфигурация разделен на независимые объекты, которые связаны между собой.
Шаг №2: Разберу на примере как через pjzip_wizard.conf создать внутренний номер (К примеру 2001):
ekzorchik@srv-s2404a:~$ sudo cp /etc/asterisk/pjsip.conf /etc/asterisk/pjsip.conf.backup
Обратил внимание, что не прослушивается порт 5060:
На заметку:
5060 - это стандартный не шифруемый порт SIP
5061 - это порт с использованием шифрования SIP (TLS).
ekzorchik@srv-s2404a:~$ sudo nano /etc/asterisk/pjsip.conf
;[transport-udp]
;type=transport
;protocol=udp ;udp,tcp,tls,ws,wss,flow
;bind=0.0.0.0
[transport-udp]
type=transport
protocol=udp
bind=172.33.33.11
После не забываем сохранить внесенные изменения в конфигурационный файл.
ekzorchik@srv-s2404a:~$ sudo cp /etc/asterisk/pjsip_wizard.conf /etc/asterisk/pjsip_wizard.conf.backup
ekzorchik@srv-s2404a:~$ sudo nano /etc/asterisk/pjsip_wizard.conf
[phone-2001]
type = wizard
accepts_auth = yes
transport = transport-udp
accepts_registrations = yes
inbound_auth/username = 2001
inbound_auth/password = Aa1234567aA
endpoint/context = internal
endpoint/disallow = all
endpoint/allow = ulaw, alaw
aor/max_contacts = 1
После не забываем сохранить внесенные изменения в конфигурационный файл.
ekzorchik@srv-s2404a:~$ sudo nano /etc/asterisk/extensions.conf
;пример звонка между номерами
[internal]
exten => _20XX,1,Dial(PJSIP/${EXTEN})
После не забываем сохранить внесенные изменения в конфигурационный файл.
Перезапускаем Asterisk для применения внесенных изменений:
ekzorchik@srv-s2404a:~$ sudo asterisk -rvv
Asterisk 22.8.2, Copyright (C) 1999 - 2025, Sangoma Technologies Corporation and others.
Created by Mark Spencer <markster@digium.com>
Asterisk comes with ABSOLUTELY NO WARRANTY; type 'core show warranty' for details.
This is free software, with components licensed under the GNU General Public
License version 2 and other licenses; you are welcome to redistribute it under
certain conditions. Type 'core show license' for details.
=========================================================================
Running as user 'asterisk'
Running under group 'asterisk'
Connected to Asterisk 22.8.2 currently running on srv-s2404a (pid = 875)
srv-s2404a*CLI>
srv-s2404a*CLI> pjsip reload
Module 'res_pjsip.so' reloaded successfully.
Module 'res_pjsip_authenticator_digest.so' reloaded successfully.
Module 'res_pjsip_endpoint_identifier_ip.so' reloaded successfully.
Module 'res_pjsip_mwi.so' reloaded successfully.
Module 'res_pjsip_notify.so' reloaded successfully.
Module 'res_pjsip_outbound_publish.so' reloaded successfully.
Module 'res_pjsip_publish_asterisk.so' reloaded successfully.
Module 'res_pjsip_outbound_registration.so' reloaded successfully.
[Mar 10 10:59:40] NOTICE[925]: sorcery.c:1412 sorcery_object_load: Type 'system' is not reloadable, maintaining previous values
srv-s2404a*CLI>
На заметку: вспомнил, что упоминание про sorcery встречал, когда для себя все конфигурационные файлы в каталоге /etc/asterisk документировал, см. заметку: "Конфигурационные файлы Asterisk 22"
sorcery.conf -> используется для настройки фреймворка Sorcery, который управляет данными и объектами в Asterisk.
Сообщение выше возникает, когда через CLI Вы перезапускаете конфигурацию, а Asterisk сообщает, что системные объекты не могут быть динамически перезагружены. Как я понял из проанализированного и вычитанного это не ошибка, а просто информационное сообщение. Еще системные объекты перечитываются если выполнять sudo systemctl restart asterisk & sudo asterisk -rx "core restart now"
srv-s2404a*CLI>
Disconnected from Asterisk server
Asterisk cleanly ending (0).
Executing last minute cleanups
ekzorchik@srv-s2404a:~$
Проверяем регистрацию номера:
srv-s2404a*CLI> pjsip show endpoints
Endpoint: <Endpoint/CID.....................................> <State.....> <Channels.>
I/OAuth: <AuthId/UserName...........................................................>
Aor: <Aor............................................> <MaxContact>
Contact: <Aor/ContactUri..........................> <Hash....> <Status> <RTT(ms)..>
Transport: <TransportId........> <Type> <cos> <tos> <BindAddress..................>
Identify: <Identify/Endpoint.........................................................>
Match: <criteria.........................>
Channel: <ChannelId......................................> <State.....> <Time.....>
Exten: <DialedExten...........> CLCID: <ConnectedLineCID.......>
==========================================================================================
Endpoint: phone-2001 Unavailable 0 of inf
InAuth: phone-2001-iauth/2001
Aor: phone-2001 1
Transport: transport-udp udp 0 0 172.33.33.11:5060
Objects found: 1
ekzorchik@srv-s2404a:~$ Либо можно так:
ekzorchik@srv-s2404a:~$ sudo asterisk -rx "pjsip show endpoints"
Т.е. сейчас у меня ни на одном устройстве не настроено подключение к номеру 2001, то я и не вижу IP устройства которое через него подключается моей телефонии.
Шаг №3: Если взять приложение GS Wave и поставить его на смартфон Samsung Galaxy A55 5G.
В рамках текущей заметка моя схема взаимодействия выглядит следующим образом:
Смартфон через OpenVPN подключается к домашней сети где уже на тестовом стенде развернут Asterisk 22
При включении "Активный аккаунт" на смартфоне в консоль Asterisk (sudo asterisk -rvvv) получил следующие записи:
[Mar 10 11:27:48] NOTICE[925]: res_pjsip/pjsip_distributor.c:688 log_failed_request: Request 'REGISTER' from '<sip:2001@172.33.33.11>' failed for '10.9.0.10:31849' (callid: 488463944-53172-1@BA.EJ.BB.DJ) - No matching endpoint found
[Mar 10 11:27:48] NOTICE[925]: res_pjsip/pjsip_distributor.c:688 log_failed_request: Request 'REGISTER' from '<sip:2001@172.33.33.11>' failed for '10.9.0.10:31849' (callid: 488463944-53172-1@BA.EJ.BB.DJ) - Failed to authenticate
приступаю к изучению ошибок… Если взять за основу опыт такого подключения: "Настройка GS Wave на Honor 9X для Asterisk 16", то по всей видимости возможно дело в том, что а с каких сетей мне разрешено подключаться — увы не в этом дело. До этого ограничения я еще дойду.
Посмотрел внимательно на pjsip_wizard.conf и перебил настройку с [phone-2001] на [2001], перечитал конфиг sudo asterisk -rx "pjsip reload" и тут же увидел на консоли Asterisk запись
== Endpoint 2001 is now Reachable
srv-s2404a*CLI>
А вот и информация по зарегистрированному клиенту, подключенному к серверу Asterisk с использованием SIP аккаунта 2001 (строка "Contact"):
srv-s2404a*CLI> pjsip show endpoints
Endpoint: <Endpoint/CID.....................................> <State.....> <Channels.>
I/OAuth: <AuthId/UserName...........................................................>
Aor: <Aor............................................> <MaxContact>
Contact: <Aor/ContactUri..........................> <Hash....> <Status> <RTT(ms)..>
Transport: <TransportId........> <Type> <cos> <tos> <BindAddress..................>
Identify: <Identify/Endpoint.........................................................>
Match: <criteria.........................>
Channel: <ChannelId......................................> <State.....> <Time.....>
Exten: <DialedExten...........> CLCID: <ConnectedLineCID.......>
==========================================================================================
Endpoint: 2001 Not in use 0 of inf
InAuth: 2001-iauth/2001
Aor: 2001 1
Contact: 2001/sip:2001@10.49.11.39:28749 db9e8e5823 NonQual nan
Transport: transport-udp udp 0 0 172.33.33.11:5060
Objects found: 1
srv-s2404a*CLI>
На заметку: IP - 10.49.11.39 — это IP адрес SIM карты на смартфоне провайдера Tele2.
Ниже скриншот из приложения GS Wave на Samsung Galaxy A55 5G что аккаунт подключен — это зеленый индикатор параметра аккаунта.

Ради изучения вроде как можно на сервере Asterisk 22 запустить tcpdump (в еще одной консоли) и проанализировать что происходит при включении регистрации SIP на устройстве что можно захватить по трафику от (Samsung Galaxy A55 5G + Application: GS Wave) к Asterisk 22 (172.33.33.11)
На заметку: Нужно себе сделать заметку по использованию tcpdump для анализа трафика к Asterisk. Сделаем.
Справка по используемым ниже ключам tcpdump:
"n" -> отключить преобразование IP в имена"q" -> быстрый/тихий вывод: отображать меньше информации о каждом пакете"t" -> не выводить метку времени (timestamp)."s" -> определяет, сколько байт данных из каждого перехваченного пакета нужно сохранить. Если ставим "-s 0", то захватить пакет целиком, без ограничения размера."A" -> отображать содержимое пакетов в формате ASCII."host" -> имя хоста"port" -> адрес порта
ekzorchik@srv-s2404a:~$ sudo tcpdump -nqt -s 0 -A "host 10.9.0.10 and port 5060"
tcpdump: verbose output suppressed, use -v[v]... for full protocol decode
listening on ens18, link-type EN10MB (Ethernet), snapshot length 262144 bytes
IP 10.9.0.10.31927 > 172.33.33.11.5060: UDP, length 455
E....l..?.".
.
.!!.|......®ISTER sip:172.33.33.11 SIP/2.0
Via: SIP/2.0/UDP 10.49.11.39:31927;branch=z9hG4bK1925335486;rport
From: <sip:2001@172.33.33.11>;tag=404996441
To: <sip:2001@172.33.33.11>
Call-ID: 204930540-31927-1@BA.EJ.BB.DJ
CSeq: 2000 REGISTER
Contact: <sip:2001@10.49.11.39:31927>;expires=0 - откуда идет регистрация для SIP 2001
Max-Forwards: 70
User-Agent: Grandstream Wave 1.0.3.34 - клиент на смартфоне
Allow: INVITE, ACK, OPTIONS, CANCEL, BYE, SUBSCRIBE, NOTIFY, INFO, REFER, UPDATE, MESSAGE
Content-Length: 0
IP 172.33.33.11.5060 > 10.9.0.10.31927: UDP, length 472
E.....@.@....!!.
.
..|....0SIP/2.0 401 Unauthorized
Via: SIP/2.0/UDP 10.49.11.39:31927;rport=31927;received=10.9.0.10;branch=z9hG4bK1925335486
Call-ID: 204930540-31927-1@BA.EJ.BB.DJ
From: <sip:2001@172.33.33.11>;tag=404996441
To: <sip:2001@172.33.33.11>;tag=z9hG4bK1925335486
CSeq: 2000 REGISTER
WWW-Authenticate: Digest realm="asterisk",nonce="1773132169/ef979ca7f3968600062ed981312ab1c8",opaque="79c 38eda4af90bcd",algorithm=MD5,qop="auth"
Server: Asterisk PBX 22.8.2
Content-Length: 0
IP 10.9.0.10.31927 > 172.33.33.11.5060: UDP, length 718
E....q..?.!.
.
.!!.|.....'.REGISTER sip:172.33.33.11 SIP/2.0
Via: SIP/2.0/UDP 10.49.11.39:31927;branch=z9hG4bK1468349542;rport
From: <sip:2001@172.33.33.11>;tag=404996441
To: <sip:2001@172.33.33.11>
Call-ID: 204930540-31927-1@BA.EJ.BB.DJ
CSeq: 2001 REGISTER
Contact: <sip:2001@10.49.11.39:31927>;expires=0
Authorization: Digest username="2001", realm="asterisk", nonce="1773132169/ef979ca7f3968600062ed981312ab1 c8", uri="sip:172.33.33.11", response="fff205a302030bb9e0ccb988ac8258c0", algorithm=MD5, cnonce="09132594 ", opaque="79c38eda4af90bcd", qop=auth, nc=00000001
Max-Forwards: 70
User-Agent: Grandstream Wave 1.0.3.34
Allow: INVITE, ACK, OPTIONS, CANCEL, BYE, SUBSCRIBE, NOTIFY, INFO, REFER, UPDATE, MESSAGE
Content-Length: 0
В выводе:
10.9.0.10 - IP адрес из сеть OpenVPN10.49.11.39 - локальный IP адрес мобильного оператора на моем смартфоне (Tele2)31927 - порт, с которого клиент отправил SIP-запросbranch - уникальный идентификатор транзакции SIPrport - говорит серверу отправлять ответ обратно на тот же порт.expires = 0 - это отмена регистрации (я проверял включая/выключая регистрацию)
Регистрация приходит с IP: 10.49.11.39, а не с адреса, указанного в Form.
Думаю, пока хватит с текущей заметки, не зачем ее перегружать, небольшое введение я для себя провел, по мере развертывания АТС на базе Asterisk 22 все должно проясниться. На уникальность контента выше не претендую, пишу для себя в первую очередь.
На заметку: с опытом дополню или сделаю новую заметку по выше указанному.
На этом пока все, с уважением автор блога ekzorchik.