пятница, 21 марта 2025 г.

Реализация распределенной VoIP-сети с помощью DUNDi в Asterisk

DUNDi (Distributed Universal Number Discovery) — это распределённый механизм маршрутизации вызовов в Asterisk, который позволяет серверам находить и маршрутизировать вызовы между собой без централизованной базы данных.

DUNDi не передаёт голосовой трафик, а только маршруты. Голосовая передача происходит через SIP, IAX2 или другие протоколы.


1. Архитектура сети с DUNDi

Основные компоненты:

  • Несколько Asterisk-серверов (например, asterisk-moscow, asterisk-dubai, asterisk-london).
  • DUNDi для обмена маршрутами между серверами.
  • SIP или IAX2 для передачи аудиопотока.

Каждый сервер хранит информацию только о локальных пользователях, но может запрашивать маршруты у других узлов сети.


2. Настройка DUNDi на Asterisk

Рассмотрим настройку на примере двух серверов:

  • asterisk-moscow (10.10.10.1)
  • asterisk-dubai (10.10.20.1)

Шаг 1: Установите DUNDi
DUNDi встроен в Asterisk, но его нужно активировать:

module load pbx_dundi.so

Если модуля нет, загрузите его:

module reload pbx_dundi.so

Шаг 2: Настройка ключей шифрования (для безопасности)
Генерируем ключи на обоих серверах:

mkdir /var/lib/asterisk/keys cd /var/lib/asterisk/keys astgenkey -n dundi

Это создаст файлы dundi.pem и dundi.pub.

Скопируйте dundi.pub между серверами:

scp /var/lib/asterisk/keys/dundi.pub root@10.10.20.1:/var/lib/asterisk/keys/

Шаг 3: Конфигурация dundi.conf Файл /etc/asterisk/dundi.conf на asterisk-moscow (10.10.10.1):

[general] department=IT organization=MyCompany locality=Moscow state=RU country=RU email=admin@mycompany.com bindaddr=0.0.0.0 bindport=4520 cachetime=5 ttl=32 autokill=yes [dundi-pub] inkey=dundi outkey=dundi include=priv permit=10.10.20.1 qualify=yes [mappings] priv => dundi_exten,0,IAX2/dundi:${NUMBER}@10.10.20.1,60

Файл /etc/asterisk/dundi.conf на asterisk-dubai (10.10.20.1):

[general] department=IT organization=MyCompany locality=Dubai state=AE country=AE email=admin@mycompany.com bindaddr=0.0.0.0 bindport=4520 cachetime=5 ttl=32 autokill=yes [dundi-pub] inkey=dundi outkey=dundi include=priv permit=10.10.10.1 qualify=yes [mappings] priv => dundi_exten,0,IAX2/dundi:${NUMBER}@10.10.10.1,60

Шаг 4: Настроим extensions.conf Добавляем в диалплан на asterisk-moscow:

[dundi-lookup] exten => _XXXX,1,GotoIf(${DB_EXISTS(dundi/${EXTEN})}?local:remote) exten => _XXXX,n(local),Dial(SIP/${EXTEN},20) exten => _XXXX,n,Hangup() exten => _XXXX,n(remote),Macro(dundi-lookup,${EXTEN})

На asterisk-dubai:

[dundi-lookup] exten => _XXXX,1,GotoIf(${DB_EXISTS(dundi/${EXTEN})}?local:remote) exten => _XXXX,n(local),Dial(SIP/${EXTEN},20) exten => _XXXX,n,Hangup() exten => _XXXX,n(remote),Macro(dundi-lookup,${EXTEN})

Шаг 5: Добавляем IAX2-соединение для голосового трафика Файл /etc/asterisk/iax.conf на asterisk-moscow:

[dundi] type=friend host=10.10.20.1 secret=dundi-secret context=from-dundi

На asterisk-dubai:

[dundi] type=friend host=10.10.10.1 secret=dundi-secret context=from-dundi

3. Проверка работы

1. Запускаем DUNDi и проверяем доступные маршруты

asterisk -rx "dundi show mappings"

Вы должны увидеть список номеров и маршрутов.

2. Ищем номер в сети

dundi lookup 1001@priv

Если номер найден, он будет направлен на нужный сервер.

3. Проверяем связь между серверами Попробуйте вызвать абонента с другого сервера:

sip show peers iax2 show peers

Если всё работает, вызовы будут направляться автоматически.


4. Преимущества и недостатки DUNDi

✅ Преимущества:

  • 🔹 Нет централизованной БД — маршруты находятся динамически.
  • 🔹 Поддержка множества серверов — легко добавлять новые узлы.
  • 🔹 Гибкая маршрутизация — звонки идут кратчайшим путём.
  • 🔹 Высокая отказоустойчивость — если один сервер недоступен, вызов пойдёт по альтернативному маршруту.

❌ Недостатки:

  • DUNDi не передаёт голос, только маршруты — для голосового трафика нужен IAX/SIP.
  • Не работает через NAT без дополнительных настроек — требуется прямое соединение между серверами.
  • Требует настройки безопасности — иначе возможны атаки на маршруты.

5. Когда использовать DUNDi?

Для распределённых VoIP-сетей с множеством офисов.
Для отказоустойчивых решений (если один сервер выходит из строя, другие могут перенять вызовы).
Для маршрутизации номеров между независимыми Asterisk-серверами без единого центра.


DUNDi — это мощный механизм для построения распределённых VoIP-сетей без централизованной базы данных. Он позволяет серверам Asterisk обмениваться маршрутами в реальном времени, обеспечивая гибкость и отказоустойчивость системы. 🚀

Комментариев нет:

Отправить комментарий