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

Схема №1

Схема №1 по chan_pjsip

Схема №2

Схема №2 по chan_pjsip

Схема №3

Схема №3 по chan_pjsip

transport -> транспорт SIP (UDP/TCP/TLS)

endpoint -> логика звонков

auth -> логин и пароль

aor -> адрес устройства

identity -> сопоставление IP (для транков)

pjsip.conf состоит из секций, где каждая секция определяет конфигурацию для объекта конфигурации res_pjsip. Имена секций задаются в квадратных скобках ([]) и могут быть произвольными, но также есть исключение: имена ENDPOINT & AOR должны быть идентичны с заголовком SIP URI. Внутри каждой секции присутствует обязательная опция "type=" — в ней определяется назначение секции в конфигурации.

Типы type=:

  • ENDPOINT
  • AOR
  • TRANSPORT
  • AUTH
  • REGISTRATION
  • DOMAIN_ALIAS
  • ACL
  • IDENTITY
  • CONTACT
  • System
  • Global

Из схемы выше в типе 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 что аккаунт подключен — это зеленый индикатор параметра аккаунта.

Приложение GS Wave успешно зарегистрировало аккаунт 2001 на Asterisk 22

Ради изучения вроде как можно на сервере 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..?.".

        .

.!!.|......&REGISTER 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 адрес из сеть OpenVPN
  • 10.49.11.39 - локальный IP адрес мобильного оператора на моем смартфоне (Tele2)
  • 31927 - порт, с которого клиент отправил SIP-запрос
  • branch - уникальный идентификатор транзакции SIP
  • rport - говорит серверу отправлять ответ обратно на тот же порт.
  • expires = 0 - это отмена регистрации (я проверял включая/выключая регистрацию)

Регистрация приходит с IP: 10.49.11.39, а не с адреса, указанного в Form.

Думаю, пока хватит с текущей заметки, не зачем ее перегружать, небольшое введение я для себя провел, по мере развертывания АТС на базе Asterisk 22 все должно проясниться. На уникальность контента выше не претендую, пишу для себя в первую очередь.

На заметку: с опытом дополню или сделаю новую заметку по выше указанному.

На этом пока все, с уважением автор блога ekzorchik.