Если у вас уже стоит Asterisk или FreePBX, обзвоны можно вести через свою станцию: с ваших номеров, через вашего оператора и по вашему тарифу на связь. Абонент видит знакомый номер и перезванивает вам напрямую, а платформа берёт на себя сценарии, распознавание речи, ИИ-агента и отчёты.
Настройка — один SIP-транк. Ниже готовые куски конфигов для голого Asterisk и поля интерфейса для FreePBX.
Как устроен звонок
Направление одно: вызов начинаем мы. Платформа отправляет вашей станции INVITE, где в качестве вызываемого номера стоит номер абонента. Ваша станция обрабатывает этот вызов так же, как если бы номер набрал сотрудник с внутреннего телефона, и выпускает его наружу через вашего оператора.
Отсюда два следствия, из которых растёт вся настройка:
- Транк должен вести в исходящие маршруты. Если оставить его в контексте для входящих, станция будет считать наш вызов звонком на неизвестный номер и никуда его не отправит.
- CallerID должен подменяться на ваш номер. В нашем INVITE в поле «от кого» стоит служебная метка — по ней вы сверите свой CDR с нашей выгрузкой, но телефонным номером она не является, и оператор такой вызов отклонит.
Регистрация не нужна ни в одну сторону: вашу станцию мы опознаём по её статическому публичному IP. За NAT и на динамическом адресе подключение работать не будет — мы просто не знаем, куда слать вызов.
Параметры подключения
| Адрес сигнализации | 185.35.223.2 |
| Порт | 5060 — UDP,
5061 — TLS
|
| Голос (RTP) | подсеть 109.233.108.208/28, порты 10000–20000 |
| Кодек | alaw |
| Формат номера | +7XXXXXXXXXX |
| Регистрация | не нужна, опознание по IP |
Шаг 1. Фаервол
Сигнализация приходит с одного адреса, голос — из подсети: у нас это разные серверы, и это нормально. Открыть нужно оба направления, иначе получится классическая картина «звонок соединился, но в трубке тишина».
# сигнализация udp dport 5060 ip saddr 185.35.223.2 accept tcp dport 5061 ip saddr 185.35.223.2 accept # голос udp dport 10000-20000 ip saddr 109.233.108.208/28 accept
iptables -A INPUT -p udp --dport 5060 -s 185.35.223.2 -j ACCEPT iptables -A INPUT -p tcp --dport 5061 -s 185.35.223.2 -j ACCEPT iptables -A INPUT -p udp --dport 10000:20000 -s 109.233.108.208/28 -j ACCEPT
Шаг 2. Транк в голом Asterisk
Нужны три секции: endpoint, identify и — только если вы хотите, чтобы мы авторизовывались — auth.
[autocall] type=endpoint context=from-autocall transport=transport-udp disallow=all allow=alaw direct_media=no rtp_symmetric=yes force_rport=yes ; auth=autocall-auth ; раскомментируйте, если требуете авторизацию [autocall] type=identify endpoint=autocall match=185.35.223.2 ; [autocall-auth] ; type=auth ; auth_type=userpass ; username=ваш_логин ; password=ваш_пароль
type=identify с match — это и есть «опознание по IP»: любой
вызов с нашего адреса попадёт на этот endpoint и уйдёт в контекст
from-autocall.
Шаг 3. Диалплан
Контекст решает две задачи: отправить наружу вызовы на обычные номера и соединить с внутренним, если сценарий переводит абонента на оператора.
[from-autocall] ; внутренние номера — для элемента «соединить с внутренним номером» exten => _XXX,1,Dial(PJSIP/${EXTEN},60) same => n,Hangup() ; всё остальное — наружу через вашего оператора, с подменой номера на свой exten => _+7XXXXXXXXX,1,Set(CALLERID(num)=7XXXXXXXXXX) same => n,Dial(PJSIP/${EXTEN:1}@ваш-оператор,60) same => n,Hangup()
Шаблон _XXX подгоните под длину своих внутренних номеров, а
${EXTEN:1} отрезает +, если ваш оператор принимает номер
без плюса. Формат набора у операторов разный — это единственное место, где придётся
посмотреть в свой договор.
Не отправляйте наш транк в from-internal на голом
Asterisk «по аналогии с FreePBX». В чистой установке такого контекста
нет, а если вы его завели сами — проверьте, что в нём нет доступа к сервисным кодам
и переадресациям. Отдельный контекст ровно под наши вызовы безопаснее и понятнее.
Шаг 4. Транк во FreePBX
Connectivity → Trunks → Add Trunk → Add SIP (chan_pjsip) Trunk.
Вкладка General
- Trunk Name:
autocall - Outbound CallerID: ваш номер в формате
7XXXXXXXXXX - Maximum Channels: столько же, сколько укажете в кабинете в настройках АТС
pjsip Settings → General
- Username и Secret: оставьте пустыми
- Authentication:
None, Registration:None - SIP Server:
185.35.223.2, Port:5060 - Context:
from-internal
Context — главное поле во всей настройке. По умолчанию
FreePBX ставит транку from-pstn, и наш вызов попадает в обработку
входящих: FreePBX ищет Inbound Route под номер абонента, не находит и завершает
звонок. С from-internal вызов проходит через ваши Outbound Routes —
ровно как звонок сотрудника.
pjsip Settings → Advanced
- Codecs: только
alaw - Match (Permit):
185.35.223.2— по этому адресу FreePBX опознаёт наши вызовы - Media Encryption:
NoneилиSRTP via in-SDP, если выбрали TLS + SRTP - Qualify Frequency:
60
Дальше проверьте, что ваш Outbound Route принимает номера в том
формате, в котором мы их отдаём (+7XXXXXXXXXX), и подставляет ваш
CallerID. Если включён модуль Firewall — добавьте наши адреса в доверенную зону,
иначе он отбросит вызовы раньше, чем их увидит Asterisk.
Шифрование: TLS и SRTP
Если станция смотрит в интернет белым адресом, сигнализацию стоит закрыть. На стороне Asterisk это транспорт и один параметр на endpoint:
[transport-tls]
type=transport
protocol=tls
bind=0.0.0.0:5061
cert_file=/etc/asterisk/keys/fullchain.pem
priv_key_file=/etc/asterisk/keys/privkey.pem
method=tlsv1_2
[autocall]
type=endpoint
transport=transport-tls
media_encryption=sdes
; остальные параметры — как выше
В кабинете при этом выберите транспорт TLS и, если нужен SRTP, соответствующий режим шифрования голоса.
SRTP работает только вместе с TLS. Ключ шифрования голоса передаётся прямо в SIP-сообщении: по незашифрованной сигнализации он уедет открытым текстом рядом с «зашифрованным» потоком. Это не защита, а её видимость, поэтому такое сочетание мы не разрешаем. При этом TLS без SRTP — нормальный вариант: в Казахстане много аппаратов и станций, где SRTP вырезан из прошивки, а TLS работает.
Шаг 5. Добавить АТС в кабинете
Раздел «Мои АТС» → «Подключить АТС». Понадобятся:
- IP-адрес станции и порт;
- транспорт — UDP или TLS, и шифрование голоса, если оно включено;
- логин и пароль — только если ваша станция требует авторизации;
- предел одновременных каналов и скорость набора — ставьте не выше того, что разрешает ваш оператор, и мы не превысим.
После сохранения в списке появится состояние станции: «Отвечает» означает, что она отвечает на наши проверки связи. Дальше при создании обзвона выбираете свою АТС в поле «АТС для звонков» — и смета сразу пересчитывается по льготной цене секунды.
Если звонки не идут
- В кабинете «Не отвечает», звонков нет вообще. Закрыт фаервол или
станция слушает не тот интерфейс. Проверьте
pjsip show transports. - INVITE приходит, но сразу 404 или 603. Вызов попал не в тот
контекст. Включите
pjsip set logger onи посмотрите, в какой контекст ушёл звонок. - Оператор отбивает вызовы. Наружу уходит наша служебная метка вместо вашего номера — не настроена подмена CallerID.
- Соединяется, но тишина. Не открыта голосовая подсеть
109.233.108.208/28на портах 10000–20000 или станция стоит за NAT безexternip. - Часть звонков обрывается на первых секундах. Обычно это
рассогласование кодеков: проверьте, что на транке разрешён только
alaw.
Сколько это стоит
При звонках через свою АТС минуты связи вы оплачиваете своему оператору, а с нашей стороны остаётся только работа платформы — поэтому секунда стоит в несколько раз дешевле обычной. Повторные попытки дозвона через свою станцию бесплатны: платить за настойчивость нашей связи не за что, связь ваша.
Нужно ли регистрировать транк на стороне AutoCall.kz?
Нет. Мы сами отправляем вызов на IP вашей станции, поэтому регистрация не нужна ни в одну сторону. Логин и пароль требуются только если ваша АТС сама требует авторизации от входящего транка.
Почему звонки доходят до Asterisk, но абоненту не уходят?
Транк направлен не в тот контекст. Вызов приходит на номер абонента и должен
попасть туда, откуда станция выпускает звонки наружу: во FreePBX это
from-internal, в голом Asterisk — ваш контекст с маршрутизацией на
транк оператора.
Какой CallerID увидит абонент?
Тот, который подставит ваш исходящий маршрут. В нашем вызове в поле «от кого»
стоит служебная метка вида AutoCall_kz_номер звонка: по
ней удобно сверять CDR, но это не телефонный номер, и оператор его отклонит.
Можно ли использовать TLS и SRTP?
Да, транспорт TLS на порт 5061 и
media_encryption=sdes. SRTP разрешён только поверх TLS: иначе ключ
шифрования уезжает открытым текстом.
Как проверить, что транк работает?
В кабинете состояние станции показывается по проверкам связи. Дальше запустите
обзвон на один свой номер: pjsip set logger on покажет приходящий
INVITE и то, куда он ушёл дальше.
Если что-то не сходится — напишите в поддержку и приложите вывод
pjsip set logger on за время тестового звонка. По нему видно, дошёл ли
вызов, в какой контекст попал и что ответила ваша станция.