Опытным администраторам VoIP эта статья будет мало интересна, адресована она админам малых IP-телефонных серверов для маленьких офисов.
DUNDi — протокол динамической маршрутизации для IP-телефонии. Позволяет автоматически находить сервер, обслуживающий конкретный номер.
Если вы не используете этот протокол, то для нескольких офисов приходится создавать отдельные планы нумерации, поделенные на диапазоны. И создавать отдельные маршруты до всех офисов (и транки до кучи). Когда сеть АТС несколько подрастет, то это положение вещей может стать неудобным, и даже создавать проблемы (а может и не создать).
Статей по настройке можно найти много, но они обычно не раскрывают особенности настройки DUNDi в связке с FreePBX (он поддерживает настройку DUNDi в полу ручном режиме).
Итак, нам потребуется:
Заходим на сервера по ssh и:
Файл *.pub надо передать на другие сервера, которые будут в прямой связи с этим сервером
файл: /etc/asterisk/extensions_custom.conf
Файл: /etc/asterisk/dundi.conf
Название транка в этой вкладе — просто отображаемое имя

А в этой, уже то, что использует Asterisk, секцию Incoming мы вообще не используем

Перезагрузить конфигурацию DUNDi можно так:
Перезагрузить ключи можно так:
Название транка в этой вкладе — просто отображаемое имя

DUNDi Mapping соответствует секции mappings из файла /etc/asterisk/dundi.conf

Создаем маршрут:

Так как план нумерации у меня четырехзначный, то и шаблон номера у меня такой

После применения изменений, из командной строки asterisk -rv можно:
Посмотреть статус DUNDi пиров:
Попробовать разрешить внутренний номер:
DUNDI — что это и зачем нужно
DUNDi — протокол динамической маршрутизации для IP-телефонии. Позволяет автоматически находить сервер, обслуживающий конкретный номер.
Если вы не используете этот протокол, то для нескольких офисов приходится создавать отдельные планы нумерации, поделенные на диапазоны. И создавать отдельные маршруты до всех офисов (и транки до кучи). Когда сеть АТС несколько подрастет, то это положение вещей может стать неудобным, и даже создавать проблемы (а может и не создать).
Практика
Статей по настройке можно найти много, но они обычно не раскрывают особенности настройки DUNDi в связке с FreePBX (он поддерживает настройку DUNDi в полу ручном режиме).
Итак, нам потребуется:
- Создать пару приватный\публичный ключ для каждого сервера, подключенного к DUNDi маршрутизации
- Выбрать сервера, которые будут корневыми для работы DUNDi (можно сделать и простую звезду или связать всех со всеми)
- Создать контекст в котором будем искать внутренние номера (можно и не создавать, и прицепиться к существующему)
- Создать DUNDi конфигурацию
- Создать транк, через который будет происходить вызов (в этом случае я использую IAX2)
- Создать DUNDi транк, на который навесить исходящую маршрутизацию
Ключи DUNDi
Заходим на сервера по ssh и:
cd /var/lib/asterisk/keys astgenkey -n <понятное нам имя сервера>
Файл *.pub надо передать на другие сервера, которые будут в прямой связи с этим сервером
Контекст поиска внутренних номеров
файл: /etc/asterisk/extensions_custom.conf
[dundi-extens] include => ext-local include => ext-intercom-users include => ext-meetme
Конфигурация DUNDi
Файл: /etc/asterisk/dundi.conf
[general] ; Заполнять переменные ниже не обязательно, смысл как и у сертификатов department=VoIP organization=******* locality=Moscow stateprov=Moscow country=RU email=****** ; А далее, уже надо port=4520 entityid=FE:7E:15:DC:**:** ; Идентификатор этого сервера, обычно MAC сетевого интерфейса cachetime=600 ; Время кэширования записей, выбирайте сами, сообразно тому, как часто меняется у вас нумерация ttl=32 ; Тоже самое, что и для сетевых пакетов, как глубока может быть цепочка разрешения номера autokill=yes [mappings] ; Задаем соответствие между контекстом DUNDi, найденными номерами и вызывающим транком ; dundi_inter, как раз наш IAX2 транк, через который вызов будет совершен ; dundi-extens - контекст, в котором мы ищем номера ; dundi_context - собственно, контекст DUNDi ; ${IPADDR} - на некоторых версиях Asterisk дает глюк, и постоянно возвращает 127.0.0.1 в запросах. Если у вас такая проблема, поменяйте на IP этого сервера dundi_context => dundi-extens,0,IAX2,dundi_inter:${SECRET}@${IPADDR}/${NUMBER},nopartial ; Секции DUNDi пиров, тут впишем всех, с кем мы имеем прямую связь по DUNDi [FE:A0:79:26:52:65] ; ID пира, обычно MAC интерфейса model = symmetric host = *.*.*.* ; IP пира, можно указать и fqdn inkey = <имя файла публичного ключа пира, без суффикса pub> outkey = <имя файла приватного ключа этого сервера, без суффикса key> include = dundi_context ; Тут указываем контекст DUNDi пира, в котором мы ищем номера permit = dundi_context ; А тут разрешаем этому пиру искать в контексте этого сервера qualify = yes dynamic=yes
Транк для совершения вызова
Название транка в этой вкладе — просто отображаемое имя
А в этой, уже то, что использует Asterisk, секцию Incoming мы вообще не используем
Секция Outgoing
type=user
dbsecret=dundi/secret
context=dundi-extensПерезагрузить конфигурацию DUNDi можно так:
module reload pbx_dundi.so
Перезагрузить ключи можно так:
module reload res_crypto.so
DUNDi транк и маршрутизация
Название транка в этой вкладе — просто отображаемое имя
DUNDi Mapping соответствует секции mappings из файла /etc/asterisk/dundi.conf
Создаем маршрут:
Так как план нумерации у меня четырехзначный, то и шаблон номера у меня такой
Проверка
После применения изменений, из командной строки asterisk -rv можно:
Посмотреть статус DUNDi пиров:
voip*CLI> dundi show peers EID Host Port Model AvgTime Status fe:a0:79:26:**:** 172.16.**.* (S) 4520 Symmetric Unavail OK (9 ms) 1 dundi peers [1 online, 0 offline, 0 unmonitored]
Попробовать разрешить внутренний номер:
voip*CLI> dundi lookup 1000@dundi_context #Это запрос номера, расположенный на этом-же сервере DUNDi lookup returned no results. DUNDi lookup completed in 170 ms voip*CLI> dundi lookup 1901@dundi_context #Это запрос номера, расположенного на другом сервере 1. 0 IAX2/dundi_inter:e3ade6Lmkz5GK5l4KBVsfA==@172.16.*.*/1901 (EXISTS) from fe:a0:79:26:*:*, expires in 600 s DUNDi lookup completed in 9 ms