Настройка DUNDi в Asterisk, под управлением FreePBX


Опытным администраторам VoIP эта статья будет мало интересна, адресована она админам малых IP-телефонных серверов для маленьких офисов.

DUNDI — что это и зачем нужно


DUNDi — протокол динамической маршрутизации для IP-телефонии. Позволяет автоматически находить сервер, обслуживающий конкретный номер.

Если вы не используете этот протокол, то для нескольких офисов приходится создавать отдельные планы нумерации, поделенные на диапазоны. И создавать отдельные маршруты до всех офисов (и транки до кучи). Когда сеть АТС несколько подрастет, то это положение вещей может стать неудобным, и даже создавать проблемы (а может и не создать).

Практика


Статей по настройке можно найти много, но они обычно не раскрывают особенности настройки DUNDi в связке с FreePBX (он поддерживает настройку DUNDi в полу ручном режиме).

Итак, нам потребуется:

  1. Создать пару приватный\публичный ключ для каждого сервера, подключенного к DUNDi маршрутизации
  2. Выбрать сервера, которые будут корневыми для работы DUNDi (можно сделать и простую звезду или связать всех со всеми)
  3. Создать контекст в котором будем искать внутренние номера (можно и не создавать, и прицепиться к существующему)
  4. Создать DUNDi конфигурацию
  5. Создать транк, через который будет происходить вызов (в этом случае я использую IAX2)
  6. Создать 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

Транк для совершения вызова


Название транка в этой вкладе — просто отображаемое имя

a8366ca4e40047d998d2c2ae1a2bd3b3.PNG

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

ca1264efe46f466d9b6126192562b312.PNG

Секция Outgoing
type=user
dbsecret=dundi/secret
context=dundi-extens

DUNDi транк и маршрутизация


Название транка в этой вкладе — просто отображаемое имя

7ae370819f06465289e51fbc5f1468bb.PNG

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

a41f0ca707824284b96de4a41604fae7.PNG

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

e5094beb5a4b4a3cbb207aaaaa637c7c.PNG

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

daec9e7471f847508ee2bc60156b43f1.PNG

Проверка


После применения изменений, из командной строки 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

Комментарии (2)

  • 17 марта 2017 в 17:15

    0

    И как впечатления от использования? Много ли серверов у вас завязаны на работу с DUNDi? Какие проблемы встречаются? Конечно, понимаю, что это туториал, но разобраться как работает можно и по официальной документации, больше хочется узнать впечатления. Или вы просто собрали на стенде и «вау, работает! напишу-ка инструкцию» ;)
  • 17 марта 2017 в 17:27

    0

    Работать оно работает. Пока серьезных проблем нет. Основная цель — это избавление от единого узла коммутации телефонии. Офисов стало относительно много, и сеть между ними нормально туннелями с OSPF работает (есть два филиала, которые обеспечивают общую связность сети). А вот телефония была заведена на одном из узловых филиалов, и настроена звездой (исторически так получилось). Когда узловой филиал остается без интернета, все филиалы, которые сохранили сетевую связность (спасибо OSPF) теряли связь по телефонии между собой. После перехода, на DUNDi связь сохраняется при сохранение сетевой связности.
    Добавлять новые узлы не сложнее чем при классической схеме, а плюс в том, что нет нужды держать четкие диапазоны для каждого филиала, я могу с легкостью номер перенести на другую АТС, и он останется рабочим (разве что, надо изменить входящую маршрутизацию до него, если такая была).

© Habrahabr.ru