Опытным администраторам VoIP эта статья будет мало интересна, адресована она админам малых IP-телефонных серверов для маленьких офисов.
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 мы вообще не используем
type=user
dbsecret=dundi/secret
context=dundi-extens
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
Автор: MagicGTS