Диагноз: почему ты здесь
Нужна офисная АТС, а платить за облачную телефонию $50/мес за каждого сотрудника не хочется. Или стоит задача поднять call-центр с IVR, очередями и записью звонков. Или просто хочешь понять, как работает IP-телефония изнутри — не по теории, а на реальном сервере.
Знакомо? Тогда по делу.
Что получишь в итоге: работающий сервер asterisk с внутренними номерами, подключённым SIP-транком провайдера и пониманием, как всё это отлаживать когда что-то идёт не так.
Сколько займёт: 30–40 минут на первый запуск. Ещё час — на транк и отладку NAT. Это не быстро, но один раз разобравшись — будешь поднимать за 20 минут.
Что понадобится:
- Сервер или VPS с Ubuntu 22.04 LTS / Debian 12
- Root-доступ по SSH
- Минимум 2 GB RAM, 2 vCPU, 20 GB диск
- Открытые исходящие порты (для загрузки пакетов)
- SIP-провайдер с реквизитами (для транка, необязательно на первом этапе)
Что будет в статье:
- Выбор версии Asterisk — какую брать на прод
- Сборка из исходников — почему не
apt install - Настройка PJSIP — endpoint, auth, aor без путаницы
- Dialplan — первый внутренний звонок
- Порты и firewall — что открывать и почему
- SIP-транк провайдера — входящие и исходящие
- Troubleshooting — нет звука, не регистрируется, не стартует
- Безопасность — минимум, без которого нельзя
Что такое Asterisk и зачем он нужен
Asterisk — это программная АТС с открытым кодом. Работает как SIP-сервер, обрабатывает вызовы, маршрутизирует их по правилам dialplan. По факту: ставишь на Linux-сервер, подключаешь IP-телефоны, подключаешь SIP-транк провайдера — получаешь полноценную IP-телефонию.
Протоколы: SIP (сигнализация) + RTP (медиапоток). SIP договаривается, кто звонит и куда. RTP гонит голос. Важно понимать разницу — иначе потом не поймёшь, почему сигнализация проходит, а звука нет.
Где используется атс asterisk:
- Офис — внутренняя связь + выход на PSTN через транк
- Call-центр — IVR, очереди, запись звонков
- Домашняя лаборатория — попрактиковаться в VoIP без бюджета
Какую версию Asterisk выбрать
Вот тут многие теряются. Смотри на сайте asterisk.org — там всегда актуальная таблица версий. Принцип простой.
| Версия | Тип | Поддержка до | Когда брать |
|---|---|---|---|
| Asterisk 18 | LTS | 2025 | Старые инсталляции, не трогай |
| Asterisk 20 | LTS | 2027 | Прод. Бери это |
| Asterisk 21 | Standard | 2025 | Не для прода |
| Asterisk 22 | LTS | 2029 | Свежий, но пока сырой |
Для нового прод-сервера — Asterisk 20 LTS. Для лабы — можно 22. FreePBX нужен, если нет времени разбираться с конфигами вручную. Если хочешь полный контроль — чистый Asterisk без GUI.
Установка Asterisk на Ubuntu и Debian
Почему не apt install asterisk? Потому что в репозиториях лежит старая версия — обычно 16 или 18. Без нормального модульного набора. Без актуального PJSIP. Собирай из исходников — один раз, зато контроль полный.
Подготовка сервера
Минимум: Ubuntu 22.04 LTS или Debian 12, 2 CPU, 2 GB RAM, 20 GB диск. Для офиса до 50 номеров — хватит с запасом.
apt update && apt upgrade -y apt install -y wget curl <a class="wpil_keyword_link" href="https://it-apteka.com/tag/git/" target="_blank" rel="noopener" title="Git" data-wpil-keyword-link="linked" data-wpil-monitor-id="1428">git</a> sudo build-essential
Результат: система обновлена, базовые утилиты есть.
Установка зависимостей
apt install -y \ libedit-dev uuid-dev libjansson-dev \ libxml2-dev libsqlite3-dev \ libssl-dev openssl \ libnewt-dev libncurses5-dev \ libcurl4-openssl-dev libgmime-3.0-dev \ pkg-config unixodbc-dev \ libspandsp-dev libtiff-dev
Не пропускай libssl-dev и libedit-dev. Без них сборка свалится и непонятно почему.
Сборка Asterisk из исходников
cd /usr/src wget https://downloads.asterisk.org/pub/telephony/asterisk/asterisk-20-current.tar.gz tar xzf asterisk-20-current.tar.gz cd asterisk-20.*/
Теперь зависимости для mp3 и кодеков:
contrib/scripts/install_prereq install
Конфигурация сборки:
./configure --with-jansson-bundled
Выбор модулей. Открывается TUI — тут важно не облажаться:
make menuselect
Обязательно включи в menuselect:
- Channel Drivers → chan_pjsip
- Codec Translators → codec_ulaw, codec_alaw, codec_g722
- Applications → app_dial, app_voicemail, app_queue
- Format Interpreters → format_wav, format_gsm
После menuselect — сборка. Займёт 5–15 минут:
make -j$(nproc) make install make samples make config ldconfig
make samples создаст примеры конфигов. make config — systemd-юнит.
Проверка запуска
systemctl start asterisk systemctl enable asterisk systemctl status asterisk
Подключись к консоли:
asterisk -rvvv
Видишь приглашение localhost*CLI> — работает. Выйди командой exit.
Архитектура Asterisk: как проходит звонок
Вот что происходит, когда телефон набирает номер. Разберём по шагам — это поможет понять, где искать проблему, когда что-то не работает.
- SIP INVITE приходит на chan_pjsip (Channel Driver). Это сигнализация — кто звонит, куда, с какими кодеками.
- Asterisk смотрит в extensions.conf — в какой контекст попадает вызов. Контекст определяется параметром
context=в секции endpoint. - Dialplan построчно выполняет приложения: Dial(), Playback(), Queue(), VoiceMail() и т.д.
- Если звонок идёт на другой endpoint — поднимается второй канал через chan_pjsip.
- После SIP-согласования (200 OK + ACK) стороны переходят к медиа: RTP-поток течёт напрямую между endpoint’ами (если нет NAT) или через Asterisk (если
direct_media=no). - При завершении звонка — SIP BYE, оба канала закрываются, Asterisk пишет CDR (запись о звонке).
Понимание этой цепочки объясняет 90% проблем. Нет звука — проблема на шаге 5 (RTP/NAT). Звонок не проходит вообще — шаг 2 или 3 (контекст или dialplan). Телефон не регистрируется — шаг 1 (auth в pjsip).
Ключевые компоненты сервера asterisk:
| Компонент | Что делает |
|---|---|
| chan_pjsip | Обрабатывает SIP/PJSIP соединения |
| extensions.conf | Dialplan — логика маршрутизации |
| pjsip.conf | Описание endpoint’ов, auth, транков |
| modules.conf | Что грузить при старте |
| asterisk.conf | Системные пути, пользователь |
Основные конфиги Asterisk
Все конфиги лежат в /etc/asterisk/. Главное — понять связку. Новички обычно редактируют файлы хаотично, потом не могут найти, где что сломалось.
pjsip.conf — современный SIP-стек
С версии 13+ рекомендован PJSIP вместо старого chan_sip. Более гибкий, лучше обрабатывает NAT, поддерживает WebRTC и IPv6. Файл sip.conf deprecated — не используй его на новых инсталляциях. Если встречаешь статьи с [general] в sip.conf — они устарели.
extensions.conf — dialplan
Сердце Asterisk. Здесь пишешь: пришёл вызов на номер X в контексте Y → выполни приложение Z. Без нормального dialplan — ничего не работает. Синтаксис нелинейный — это не bash, тут свои правила приоритетов и переменных. Потрать час на понимание синтаксиса сейчас — сэкономишь дни потом.
modules.conf
Управляет загрузкой модулей. По умолчанию autoload=yes — грузит всё. На проде лучше явно отключить лишнее: DAHDI если нет ISDN-карт, chan_oss если нет звуковой карты, app_festival если не используешь TTS. Меньше модулей — меньше атак-поверхность и быстрее старт.
asterisk.conf
Системные пути, пользователь, под которым работает Asterisk. По умолчанию стартует от root — на проде создай отдельного пользователя asterisk и пропиши runuser = asterisk. Это не паранойя, это базовая безопасность.
rtp.conf
Диапазон UDP-портов для медиапотоков. По умолчанию 10000–20000. Совпадение с файрволом обязательно — иначе звука не будет.
logger.conf
Настройки логирования. По умолчанию пишет в /var/log/asterisk/full. На проде настрой ротацию, иначе лог разрастётся до гигабайтов:
logrotate /etc/logrotate.d/asterisk
Настройка PJSIP: endpoint, auth, aor
Asterisk PJSIP — три обязательных объекта на каждый номер. Путают их постоянно, поэтому объясняю один раз.
Открой /etc/asterisk/pjsip.conf, удали примеры, вставь:
[transport-udp] type=transport protocol=udp bind=0.0.0.0:5060 [1000] type=endpoint context=internal disallow=all allow=ulaw allow=alaw allow=g722 auth=1000 aors=1000 direct_media=no rtp_symmetric=yes [1000] type=auth auth_type=userpass username=1000 password=SecurePass1000 [1000] type=aor max_contacts=2 qualify_frequency=30 [1001] type=endpoint context=internal disallow=all allow=ulaw allow=alaw allow=g722 auth=1001 aors=1001 direct_media=no rtp_symmetric=yes [1001] type=auth auth_type=userpass username=1001 password=SecurePass1001 [1001] type=aor max_contacts=2 qualify_frequency=30
direct_media=no и rtp_symmetric=yes — это для NAT. Если телефоны за роутером — без этого не будет звука.
Перезагрузи модуль без рестарта Asterisk:
asterisk -rx "pjsip reload"
Проверь, что endpoint’ы видны:
asterisk -rx "pjsip show endpoints"
Asterisk и NAT — почему нет звука
Это самая частая проблема при настройке asterisk nat. Телефон регистрируется, звонок проходит, но в трубке — тишина. Или звук есть только в одну сторону. Или всё работает внутри офиса, но ломается, когда звонишь снаружи.
Реальный кейс: клиент поднял Asterisk на VPS, подключил IP-телефоны в офисе через SIP. Регистрация проходит, вызов устанавливается, оба абонента видят «звонок идёт» — но голоса нет ни у кого. Три часа дебага, и оказалось: телефоны сидят за офисным роутером с NAT, а asterisk nat не был настроен совсем.
Почему SIP и RTP ломаются за NAT

Здесь важно понять разделение. SIP — это сигнализация: кто кому звонит, какие кодеки поддерживаются, куда слать медиа. RTP — это сам голос, поток UDP-пакетов между двумя точками.
Проблема в том, что SIP-пакет содержит внутри себя IP-адрес клиента. Телефон за роутером пишет в SIP-заголовке свой локальный IP — например, 192.168.1.50. Asterisk получает этот пакет с внешнего IP роутера — например, 203.0.113.10 — но внутри SIP написано 192.168.1.50. Asterisk пытается отправить RTP на 192.168.1.50. Понятно, что до этого адреса он не доберётся — он недоступен из интернета.
Итог: сигнализация работает (SIP проходит через NAT нормально), а медиапоток теряется. Отсюда — односторонний звук или полная тишина.
Второй сценарий: сам Asterisk стоит за NAT. Тогда он сообщает клиентам свой внутренний IP как адрес для RTP. Клиенты пытаются отправить голос на 10.0.0.5, который снаружи недоступен. Тот же результат — нет звука.
Настройка NAT в PJSIP: транспорт
Если Asterisk стоит за NAT или на VPS с внешним IP — настрой транспортный блок в /etc/asterisk/pjsip.conf:
[transport-udp] type=transport protocol=udp bind=0.0.0.0:5060 ; Внешний IP сервера (или домен) external_media_address=203.0.113.10 external_signaling_address=203.0.113.10 ; <a href="https://it-apteka.com/qwen3-coder-next-besplatnyj-ii-dlja-kodinga-lokalno-ustanovka-cli-i-sravnenie-agentov-2026/" title="Qwen3 Coder Next: бесплатный ИИ для кодинга локально — установка, CLI и сравнение агентов 2026" target="_blank" rel="noopener" data-wpil-monitor-id="1402">Локальная подсеть —</a> пакеты внутри неё идут без подмены local_net=192.168.1.0/24 local_net=10.0.0.0/8
Что делает каждый параметр:
external_media_address— Asterisk подставляет этот IP в SDP как адрес для приёма RTP. Клиенты снаружи будут слать голос именно сюда.external_signaling_address— подставляется в SIP-заголовки Contact и Via. Нужен, чтобы ответы на SIP-запросы возвращались на правильный адрес.local_net— подсети, для которых подмена IP не нужна. Клиенты внутри этих сетей получают реальный внутренний IP Asterisk. Можно указать несколько строк.
Если у сервера статический внешний IP — вписывай его напрямую. Если IP меняется (редко, но бывает) — можно использовать DNS-имя, Asterisk периодически его резолвит.
NAT-параметры endpoint: rtp_symmetric, force_rport, rewrite_contact

Помимо транспорта, каждый endpoint, который сидит за NAT, нуждается в трёх параметрах. Добавь их в секцию endpoint в pjsip.conf:
[1000] type=endpoint context=internal disallow=all allow=ulaw allow=alaw allow=g722 auth=1000 aors=1000 direct_media=no rtp_symmetric=yes force_rport=yes rewrite_contact=yes
Объясняю каждый, потому что без понимания будешь ставить наугад:
direct_media=no— запрещает прямой медиапоток между двумя endpoint’ами в обход Asterisk. По умолчанию Asterisk пытается «уйти с дороги» и заставить клиентов общаться напрямую. За NAT это не работает — оба клиента шлют RTP на недоступные адреса. Сdirect_media=noвесь голос идёт через сервер.rtp_symmetric=yes— Asterisk отправляет RTP-пакеты на тот адрес и порт, с которого получил первый RTP-пакет от клиента, а не на адрес из SDP. Это решает проблему, когда NAT-роутер меняет порт-источник при каждой сессии.force_rport=yes— Asterisk отправляет SIP-ответы на реальный IP:порт, с которого пришёл запрос, игнорируя адрес в Via-заголовке. Нужно, когда телефон пишет в Via свой внутренний IP, а надо отвечать на внешний.rewrite_contact=yes— Asterisk переписывает Contact-заголовок в REGISTER, заменяя внутренний IP клиента на реальный IP:порт, с которого пришёл пакет. Без этого Asterisk может пытаться звонить на192.168.x.xвместо внешнего адреса.
Проверка NAT: смотрим что реально происходит
Включи SIP-логирование и делай тестовый звонок:
asterisk -rx "pjsip set logger on" asterisk -rvvvvv
Ищи в выводе строки SDP — там будет адрес, который Asterisk прописал для RTP. Если видишь внутренний IP (10.x.x.x или 192.168.x.x) вместо внешнего — external_media_address не применился. Проверь, что транспортный блок называется именно тем именем, которое используется в endpoint.
Также смотри на Contact в REGISTER-запросах. Если там внутренний IP клиента — нужен rewrite_contact=yes.
; Посмотреть что Asterisk знает о контакте endpoint'а asterisk -rx "pjsip show contact 1000/sip:1000@192.168.1.50" ; Или все контакты разом asterisk -rx "pjsip show contacts"
Частые ошибки с NAT в Asterisk
SIP ALG на роутере включён. SIP ALG (Application Layer Gateway) — «умная» функция роутера, которая пытается помогать SIP-трафику проходить через NAT. По факту она переписывает SIP-заголовки и ломает их. Отключи SIP ALG в настройках роутера. В Mikrotik это ip sip-alg disable, в большинстве домашних роутеров — чекбокс в разделе NAT или Firewall.
RTP-порты закрыты. Сигнализация (5060) открыта, а диапазон RTP (10000–20000) — нет. Звонок устанавливается, но голос не идёт. Проверь:
# Проверить что порты открыты на сервере
ss -ulnp | grep -E "5060|1[0-9]{4}"
# Проверить через ufw
ufw status | grep -E "5060|10000"
Неправильный external IP. Прописал старый IP, который потом поменялся. Или скопировал внутренний IP вместо внешнего. Проверь реальный внешний IP сервера:
curl -s ifconfig.me
Несколько транспортных блоков без явного указания. Если в pjsip.conf несколько секций transport, endpoint должен явно указывать, какой использовать: transport=transport-udp. Иначе Asterisk берёт первый попавшийся, и external_media_address может не применяться.
Порты и firewall для Asterisk
SIP и RTP — разные порты. Оба нужны открытыми. Путаница здесь стоит часов дебага.
| Протокол | Порт | Назначение |
|---|---|---|
| SIP | 5060 UDP/TCP | Сигнализация |
| PJSIP TLS | 5061 TCP | Зашифрованная сигнализация |
| RTP | 10000–20000 UDP | Медиапоток (голос) |
Открываем через ufw:
ufw allow 5060/udp ufw allow 5060/tcp ufw allow 10000:20000/udp ufw allow 22/tcp ufw enable ufw status
Если используешь iptables:
iptables -A INPUT -p udp --dport 5060 -j ACCEPT iptables -A INPUT -p tcp --dport 5060 -j ACCEPT iptables -A INPUT -p udp --dport 10000:20000 -j ACCEPT
Вот тут важно: диапазон RTP должен совпадать с тем, что в /etc/asterisk/rtp.conf:
[general] rtpstart=10000 rtpend=20000
Dialplan: первый звонок в Asterisk
Dialplan — это скрипт маршрутизации. Каждая строка — это правило: если в контекст X пришёл вызов на номер N, выполни приложение A. Без понимания синтаксиса будешь гадать часами.
Синтаксис dialplan
Строка выглядит так:
exten => НОМЕР, ПРИОРИТЕТ, ПРИЛОЖЕНИЕ(параметры)
НОМЕР— конкретный (1001) или шаблон (_XXXX — 4 любые цифры)ПРИОРИТЕТ— 1 для первого шага,nдля следующегоПРИЛОЖЕНИЕ— что делать: Dial, Playback, Hangup, VoiceMail и т.д.
Шаблоны в номерах:
X— любая цифра 0–9Z— цифра 1–9N— цифра 2–9.— любое количество любых символов[135-9]— 1, 3, 5, 6, 7, 8 или 9
Открой /etc/asterisk/extensions.conf. Базовая конфигурация для внутренних звонков:
[general]
static=yes
writeprotect=no
[internal]
; Звонок на внутренний номер 1000
exten => 1000,1,Dial(PJSIP/1000,20)
exten => 1000,n,VoiceMail(1000@default)
exten => 1000,n,Hangup()
; Звонок на внутренний номер 1001
exten => 1001,1,Dial(PJSIP/1001,20)
exten => 1001,n,VoiceMail(1001@default)
exten => 1001,n,Hangup()
; Маска для всех 4-значных внутренних (чище)
; exten => _1XXX,1,Dial(PJSIP/${EXTEN},20)
; exten => _1XXX,n,Hangup()
; Тест: воспроизвести звук при наборе 9999
exten => 9999,1,Answer()
exten => 9999,n,Playback(hello-world)
exten => 9999,n,Hangup()
Dial(PJSIP/1001,20) — звонить на endpoint 1001, таймаут 20 секунд. ${EXTEN} — встроенная переменная, содержит набранный номер. Очень удобна в шаблонах.
Перезагрузи dialplan без рестарта сервиса:
asterisk -rx "dialplan reload"
Проверь, что правила загрузились:
asterisk -rx "dialplan show internal"
Зарегистрируй SIP-клиент (Zoiper, Linphone, MicroSIP) с реквизитами:
- Сервер: IP твоего сервера, порт 5060
- Username: 1000
- Password: SecurePass1000
- Transport: UDP
Зарегистрируй второй клиент как 1001. Набери с первого 1001 — должны услышать друг друга. Если нет звука — смотри раздел про NAT и RTP выше.
Полезные приложения dialplan
| Приложение | Что делает |
|---|---|
| Dial(PJSIP/1001,20) | Позвонить на endpoint, таймаут 20 с |
| Answer() | Поднять трубку (начать сессию) |
| Playback(звук) | Воспроизвести звуковой файл |
| Background(меню) | Воспроизвести и ждать ввода DTMF |
| WaitExten(5) | Ждать ввода номера 5 секунд |
| VoiceMail(1000@default) | Записать голосовое сообщение |
| Queue(sales) | Поставить в очередь |
| Hangup() | Завершить вызов |
| MixMonitor(record.wav) | Записать разговор |
| AGI(script.php) | Вызвать внешний скрипт |
SIP-транки в Asterisk: подключение к оператору телефонии
SIP-транк — это сессия между Asterisk и оператором (SIP provider). Через него ip телефония asterisk выходит наружу: входящие с городских номеров, исходящие на мобильные и городские. Без транка — только внутренняя сеть. Именно asterisk транки дают АТС «выход в мир».
Отличие транка от внутреннего номера: endpoint сотрудника регистрируется на Asterisk. Транк — это Asterisk, который регистрируется у провайдера. Направление регистрации обратное.
Архитектура звонка через SIP-транк

Путь исходящего звонка через sip trunk asterisk:
- Сотрудник набирает
9 + номерна телефоне - Телефон шлёт SIP INVITE на Asterisk
- Dialplan видит шаблон
_9XXXXXXXXXX, направляет вызов на endpoint транка - Asterisk шлёт SIP INVITE провайдеру через зарегистрированный транк
- SIP provider соединяет с PSTN-сетью или другим VoIP-оператором
- RTP-поток: телефон → Asterisk → провайдер (или напрямую, если
direct_media=yes)
Путь входящего звонка:
- Кто-то звонит на городской номер, арендованный у провайдера
- Провайдер шлёт SIP INVITE на Asterisk
- Asterisk смотрит в dialplan-контекст
from-trunk - Dialplan маршрутизирует: на конкретный номер, IVR, очередь
Настройка asterisk транка в PJSIP: полный конфиг с объяснением
Каждый asterisk транк в pjsip.conf состоит из четырёх объектов. Нельзя обойтись меньшим числом. Вот рабочий конфиг с пояснениями:
; ── 1. AUTH: учётные данные для регистрации у провайдера ── [provider-auth] type=auth auth_type=userpass username=ВАШ_ЛОГИН ; логин от личного кабинета провайдера password=ВАШ_ПАРОЛЬ ; пароль (не менее 12 символов) ; ── 2. AOR: куда звонить провайдеру ── [provider-aor] type=aor contact=sip:sip.provider.ru:5060 ; SIP-сервер провайдера ; ── 3. ENDPOINT: параметры соединения ── [provider-endpoint] type=endpoint context=from-trunk ; входящие звонки пойдут в этот контекст disallow=all allow=ulaw ; основной кодек — уточни у провайдера allow=alaw outbound_auth=provider-auth ; какой auth использовать для исходящих aors=provider-aor direct_media=no ; медиа через Asterisk (NAT-safe) from_user=ВАШ_НОМЕР ; номер, который видит провайдер в From: ; ── 4. REGISTRATION: Asterisk регистрируется у провайдера ── [provider-registration] type=registration outbound_auth=provider-auth server_uri=sip:sip.provider.ru ; SIP-сервер провайдера client_uri=sip:ВАШ_ЛОГИН@sip.provider.ru retry_interval=60 ; повтор при обрыве, секунды expiration=3600 ; время жизни регистрации
Вот тут важно: context=from-trunk в endpoint транка — это контекст для входящих звонков от провайдера. Он обязан отличаться от internal. Если поставишь internal — любой, кто знает SIP-адрес твоего сервера, сможет набрать внутренние номера через транк без пароля.
Dialplan: входящие звонки с транка
[from-trunk] ; Вариант 1: провайдер шлёт звонок без конкретного номера (exten = s) exten => s,1,Answer() exten => s,n,Dial(PJSIP/1000,20) exten => s,n,VoiceMail(1000@default,u) exten => s,n,Hangup() ; Вариант 2: DID — провайдер шлёт конкретный номер в To: exten => 74951234567,1,Answer() exten => 74951234567,n,Goto(ivr-main,s,1) exten => 74951234567,n,Hangup() ; Вариант 3: несколько DID-номеров → разные отделы exten => 74951234560,1,Dial(PJSIP/1000,20) ; директор exten => 74951234560,n,Hangup() exten => 74951234561,1,Goto(ivr-main,s,1) ; общий номер → IVR exten => 74951234561,n,Hangup()
Какой вариант использует твой провайдер — уточни в документации. Большинство российских SIP provider’ов поддерживают DID, но формат может отличаться: одни шлют 74951234567, другие — 4951234567 без кода страны.
Dialplan: исходящие звонки через транк
[internal]
; Набери 9 + 10-значный мобильный или городской
exten => _9XXXXXXXXXX,1,Dial(PJSIP/provider-endpoint/${EXTEN:1})
exten => _9XXXXXXXXXX,n,Congestion()
exten => _9XXXXXXXXXX,n,Hangup()
; Набери 8 + номер (альтернативный префикс)
exten => _8XXXXXXXXXX,1,Dial(PJSIP/provider-endpoint/${EXTEN:1})
exten => _8XXXXXXXXXX,n,Hangup()
; Экстренные службы (без префикса)
exten => 112,1,Dial(PJSIP/provider-endpoint/112)
exten => 112,n,Hangup()
${EXTEN:1} — срезает первый символ (префикс 9 или 8). Провайдеру уходит чистый номер в формате 79161234567.
Применить изменения:
asterisk -rx "pjsip reload" asterisk -rx "dialplan reload"
Проверка asterisk транка
; Статус регистрации asterisk -rx "pjsip show registrations" ; Состояние endpoint транка asterisk -rx "pjsip show endpoint provider-endpoint" ; Тестовый исходящий звонок из CLI asterisk -rx "channel originate PJSIP/79161234567@provider-endpoint application Playback hello-world"
Частые проблемы с SIP-транком
403 Forbidden. Провайдер отклоняет запрос. Причины: IP-адрес сервера не внесён в белый список у провайдера (многие требуют привязку IP), или неверный from_user, или провайдер не принимает данный кодек. Проверь личный кабинет провайдера — там обычно есть поле «разрешённые IP».
401 Unauthorized. Неверные логин или пароль в [provider-auth]. Проверь регистр — пароли чувствительны к регистру. Включи pjsip set logger on и смотри SIP-диалог: в ответе 401 будет поле WWW-Authenticate, по нему видно realm провайдера — он должен совпадать с тем, что Asterisk использует при ответе.
Нет входящих, исходящие работают. Asterisk зарегистрировался у провайдера, но входящие не приходят. Причины: провайдер шлёт DID-номер в To, а в диалплане только exten => s. Включи pjsip set logger on, позвони на номер извне — посмотри, что написано в поле To: входящего INVITE. Именно это значение должно быть в exten =>.
Регистрация отваливается каждые N минут. Провайдер присылает Expires: 0 или короткий таймер. Уменьши expiration в секции [provider-registration] до значения, которое меньше таймера провайдера. Или добавь max_retries=0 чтобы Asterisk обновлял регистрацию непрерывно.
FreePBX vs чистый Asterisk
FreePBX — это веб-GUI поверх Asterisk. Удобно для тех, кто не хочет трогать конфиги руками. Но есть нюансы.
| Параметр | Asterisk (чистый) | FreePBX |
|---|---|---|
| Контроль конфигов | Полный | Ограничен GUI |
| Кривая обучения | Высокая | Низкая |
| Гибкость dialplan | Максимальная | Средняя |
| Обновления | Ручные | Через GUI |
| Риск сломать | Ниже | Выше (GUI перезаписывает) |
| Поддержка на форумах | Отличная | Хорошая |
Бери FreePBX, если: нужно быстро развернуть для не-технарей, нет времени изучать dialplan, хочешь готовый call-центр из коробки.
Бери чистый Asterisk, если: нужен полный контроль, сложная логика маршрутизации, интеграция через AGI/ARI, или ты просто хочешь понять, как оно работает.
Проверка работы Asterisk
Подключись к консоли. -r — remote mode (подключиться к уже запущенному), vvv — уровень детализации:
asterisk -rvvv
Проверь статус endpoint’ов и контакты (факт регистрации SIP-клиентов):
pjsip show endpoints pjsip show contacts
Статус Reachable в колонке Status — всё хорошо. Unreachable или пусто — клиент не зарегистрирован или не отвечает на qualify-запросы.
Состояние транков к провайдеру:
pjsip show registrations
Смотришь на колонку State. Registered — транк активен. Rejected — проблема с авторизацией у провайдера. Trying — ждёт ответа, проверь доступность сервера провайдера.
Активные каналы (текущие звонки):
core show channels core show channels count
Список загруженных модулей:
module show
Посмотреть последние события в логе:
tail -f /var/log/asterisk/full
Включить детальное SIP-логирование прямо в консоль (выключается после reload):
pjsip set logger on
Теперь каждый SIP-пакет будет виден в консоли. Позвони с телефона — увидишь REGISTER, INVITE, 200 OK и т.д. Это главный инструмент диагностики. Когда не понимаешь, что происходит — включай и смотри.
Осложнения: типичные ошибки и решения
Расширенная отладка
# Включить SIP-логирование в консоли (выключается при reload) asterisk -rx "pjsip set logger on" # Уровень verbose (чем больше v — тем больше деталей, максимум vvvvv) asterisk -rvvvvv # Смотреть только ошибки и предупреждения grep -E "ERROR|WARNING" /var/log/asterisk/full | tail -50 # Тест dialplan без реального звонка asterisk -rx "dialplan test 1001 internal" # Статистика RTP по активному каналу asterisk -rx "rtp show stats"
Самый мощный способ дебага: pjsip set logger on, затем сделай звонок с проблемного телефона. Видишь весь SIP-диалог — REGISTER, INVITE, 100 Trying, 180 Ringing, 200 OK, ACK. Проблема видна мгновенно: нет 200 OK — сервер не ответил. Нет ACK — клиент не принял ответ. 403 Forbidden — проблема с авторизацией.
Альтернативные решения IP-телефонии
Asterisk не единственный вариант. Смотри по задаче:
- FreeSWITCH — мощнее в enterprise-сценариях, сложнее в настройке. Для WebRTC и видео — предпочтительнее.
- Kamailio — SIP-прокси, не АТС. Используй как фронт для Asterisk при высокой нагрузке.
- 3CX — коммерческая АТС с GUI. Бесплатна до 10 одновременных звонков. Быстрый старт, закрытый код.
- Yeastar / Grandstream — железные АТС с Asterisk внутри. Для офиса без своего сисадмина.
IVR — интерактивное голосовое меню. «Нажмите 1 для продаж, нажмите 2 для поддержки». Строится на двух приложениях: Background() воспроизводит файл и ждёт нажатия, WaitExten() ждёт ввода номера.
Сначала запиши или скачай аудиофайл приветствия и положи его в /var/lib/asterisk/sounds/ru/. Asterisk поддерживает форматы wav, gsm, ulaw. Для конвертации:
# Конвертировать wav в gsm (нужен sox) apt install sox sox welcome.wav -r 8000 -c 1 /var/lib/asterisk/sounds/ru/welcome.gsm
Добавь в extensions.conf:
[ivr-main] ; Входящий звонок → IVR exten => s,1,Answer() exten => s,n,Set(TIMEOUT(digit)=5) exten => s,n,Background(ru/welcome) exten => s,n,WaitExten(5) ; Нажал 1 → Отдел продаж (номер 1100) exten => 1,1,Dial(PJSIP/1100,20) exten => 1,n,Hangup() ; Нажал 2 → Техподдержка (номер 1200) exten => 2,1,Dial(PJSIP/1200,20) exten => 2,n,Hangup() ; Не нажал ничего (timeout) → повтор exten => t,1,Goto(s,1) ; Неверная цифра → повтор exten => i,1,Goto(s,1)
В from-trunk (входящий контекст провайдера) поменяй маршрут на IVR:
[from-trunk] exten => s,1,Goto(ivr-main,s,1)
asterisk -rx "dialplan reload"
Позвони с мобильного на городской номер — должно воспроизвестись приветствие и ждать нажатия.
Голосовая почта в Asterisk
Voicemail настраивается в двух местах: /etc/asterisk/voicemail.conf (ящики) и extensions.conf (когда переходить на запись).
В /etc/asterisk/voicemail.conf:
[general] format=wav49|gsm|wav <a href="/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="becddbccc8dbccdbd3dfd7d283cedcc6fec7d1cbccdad1d3dfd7d090cccb">[email protected]</a> maxmessage=300 maxsilence=10 [default] 1000 => 1234,Иван Иванов,<a href="/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="b4ddc2d5daf4cddbc1c6d0dbd9d5ddda9ac6c1">[email protected]</a> 1001 => 5678,Пётр Петров,<a href="/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="4434213036043d2b3136202b29252d2a6a3631">[email protected]</a>
Формат: номер => PIN,Имя,Email. Asterisk умеет слать запись на email — для этого нужен настроенный MTA (postfix, sendmail).
В extensions.conf добавь переход на voicemail, если не взяли трубку:
[internal] exten => 1000,1,Dial(PJSIP/1000,20) exten => 1000,n,VoiceMail(1000@default,u) exten => 1000,n,Hangup() ; Чтение сообщений: набери *1000 exten => *1000,1,VoiceMailMain(1000@default) exten => *1000,n,Hangup()
Параметр u в VoiceMail — играть «unavailable» приветствие. b — «busy». Перезагрузи и проверь: позвони на 1000, не бери трубку — через 20 секунд услышишь предложение оставить сообщение.
Профилактика: как не сломать снова
Бэкап конфигов
# Бэкап всех конфигов с датой tar czf /root/asterisk-conf-$(date +%Y%m%d).tar.gz /etc/asterisk/
Добавь в cron еженедельно. Конфиги маленькие — жадничать не нужно.
# Добавить в crontab (crontab -e) 0 3 * * 0 tar czf /root/asterisk-conf-$(date +\%Y\%m\%d).tar.gz /etc/asterisk/
Мониторинг
# Проверить что сервис жив systemctl is-active asterisk # Количество активных звонков asterisk -rx "core show channels count" # Uptime и версия asterisk -rx "core show version" asterisk -rx "core show uptime"
Для прода — подключи Zabbix или Prometheus с asterisk_exporter. Ключевые метрики: количество каналов, статус регистраций транков, задержка RTP. Если транк упал ночью и никто не следит — утром узнаешь от директора, а не от мониторинга.
Автозапуск и watchdog
systemctl enable asterisk
Добавь рестарт при падении. Открой юнит-файл:
systemctl edit asterisk
Вставь в открывшийся редактор:
[Service] Restart=on-failure RestartSec=5s
systemctl daemon-reload systemctl restart asterisk
Безопасность Asterisk
IP-телефония — лакомая цель. Сканеры SIP-портов работают непрерывно. Взломанная АТС — это несколько тысяч долларов звонков на премиум-номера за выходные. Не шутка.
Минимальный чеклист безопасности:
- Смени все пароли в pjsip.conf.
password=1234— это подарок сканерам. Минимум 16 символов, буквы+цифры+спецсимволы. - Поставь fail2ban. Готовый фильтр есть в
/etc/fail2ban/filter.d/asterisk.conf. Блокирует IP после N неудачных регистраций.
apt install fail2ban # Создай /etc/fail2ban/jail.d/asterisk.conf: [asterisk] enabled = true filter = asterisk action = iptables-allports[name=ASTERISK, protocol=all] logpath = /var/log/asterisk/full maxretry = 5 bantime = 3600
- Закрой порт 5060 для всех кроме белого списка IP (если возможно).
- Запрети международные направления в dialplan, если они не нужны. Шаблон
_9011.для США или_8.для России — убери, если не используешь. - Включи CDR-логирование и периодически смотри на аномалии: много коротких звонков на одно направление — тревожный сигнал.
FAQ
Почему после установки Asterisk нет звука при звонке?
Почти всегда — NAT и RTP. Телефон шлёт медиапакеты со своего внутреннего IP (например, 192.168.1.10), а сервер их не принимает, потому что ждёт с другого адреса. Или сервер сам за NAT и не может получить медиапоток.
Пошаговое исправление:
- В pjsip.conf для каждого endpoint:
direct_media=noиrtp_symmetric=yes - Если сервер за NAT: в секцию [transport-udp] добавь
external_media_address=ВНЕШНИЙ_IPиlocal_net=192.168.1.0/24 - Проверь, что порты 10000–20000/UDP открыты в файрволе
- Отключи SIP ALG на роутере если он включён
Как проверить, что SIP-клиент зарегистрировался на Asterisk?
asterisk -rx "pjsip show contacts"
В столбце Status должно быть Reachable. Если пусто — клиент не добрался до сервера. Проверь: правильный ли IP сервера в настройках клиента, открыт ли порт 5060/UDP на файрволе, правильный ли пароль.
Что если Asterisk упал и не поднимается?
journalctl -u asterisk -n 100 --no-pager tail -100 /var/log/asterisk/full
Ищи строку с ERROR — там будет файл и номер строки с проблемой. Чаще всего — синтаксическая ошибка в конфиге после ручного редактирования.
Asterisk или FreePBX — что проще для начала?
FreePBX проще для первого старта — есть GUI, мастер настройки, пошаговые формы. Но если хочешь понять, как IP-телефония работает изнутри — иди на чистый Asterisk. Знания переносятся: конфиги те же, dialplan тот же, только без GUI-прослойки.
Какой минимальный сервер нужен для Asterisk?
Для офиса до 20 одновременных звонков: 1 vCPU, 1 GB RAM, 10 GB диск. Транскодинг (конвертация кодеков) жрёт CPU. Если провайдер поддерживает ulaw/alaw и телефоны тоже — транскодинг не нужен, нагрузка минимальна. Для 100+ одновременных звонков — минимум 4 vCPU, 4 GB RAM, отдельный SSD.
Как обновить Asterisk до новой версии?
Asterisk обновляется пересборкой из исходников. Остановить сервис, скачать новый tarball, пересобрать теми же командами, запустить. Конфиги в /etc/asterisk/ не затрагиваются. Перед обновлением — обязательный бэкап конфигов.
systemctl stop asterisk cd /usr/src wget https://downloads.asterisk.org/pub/telephony/asterisk/asterisk-20-current.tar.gz tar xzf asterisk-20-current.tar.gz cd asterisk-20.*/ ./configure --with-jansson-bundled make -j$(nproc) && make install systemctl start asterisk asterisk -rx "core show version"
Почему нельзя просто apt install asterisk?
Можно, если тебе нужна версия 16 с ограниченным набором модулей. В репозиториях Ubuntu/Debian лежит старая сборка без актуального PJSIP, без нужных кодеков, с устаревшими зависимостями. Сборка из исходников занимает 15 минут, но ты получаешь свежую версию с полным контролем над модулями.
Безопасность Asterisk: почему АТС ломают за часы
Это не страшилка. Открытый порт 5060 на публичном IP — и через 10–20 минут начнут приходить SIP REGISTER-запросы от сканеров. SIP-сканеры непрерывно перебирают диапазоны IP в поисках открытых АТС. Взломанный Asterisk с простыми паролями — это toll fraud: несколько тысяч долларов звонков на премиум-номера за выходные, пока ты не смотришь в логи.
Реальный паттерн атаки: сканер находит порт 5060, перебирает стандартные username’ы (1000, 1001, admin, asterisk, test), подбирает пароль из словаря. Слабый пароль типа 1234 или asterisk ломается за секунды. После этого атакующий регистрирует свой SIP-клиент и делает тысячи звонков на платные номера — биллинг падает на тебя.
Как понять, что тебя уже атакуют:
; Смотреть на REGISTER-попытки с чужих IP
grep "Registration" /var/log/asterisk/full | grep -v "our IP" | tail -30
; Много AUTH_FAILURE от одного IP
grep "AUTH_FAILURE" /var/log/asterisk/full | awk '{print $NF}' | sort | uniq -c | sort -rn | head -10
; Аномально много активных каналов
asterisk -rx "core show channels count"
Если видишь десятки REGISTER-запросов с разных IP на несуществующие username’ы — сканеры уже работают. Если один IP генерирует сотни AUTH_FAILURE — brute-force в процессе.
Шаг 1: asterisk firewall — закрыть всё лишнее
Минимальный набор открытых портов для asterisk firewall:
; Сбросить лишние правила, добавить нужные ufw default deny incoming ufw default allow outgoing ; SSH — не забудь, иначе потеряешь доступ ufw allow 22/tcp ; SIP-сигнализация ufw allow 5060/udp ufw allow 5060/tcp ; TLS SIP (если используешь) ufw allow 5061/tcp ; RTP — медиапоток (голос) ufw allow 10000:20000/udp ufw enable ufw status numbered
На проде — ещё жёстче. Если знаешь IP всех SIP-клиентов и провайдеров — закрой 5060 для всего мира и открой только для них:
; Только для конкретного IP провайдера ufw allow from 185.45.152.0/24 to any port 5060 ; Только для офисного IP ufw allow from 203.0.113.50 to any port 5060
Шаг 2: Fail2ban для защиты Asterisk
Fail2ban читает логи и блокирует IP после N неудачных попыток. Для asterisk fail2ban уже есть готовый фильтр в поставке.
apt install fail2ban -y
Создай /etc/fail2ban/jail.d/asterisk.conf:
[asterisk] enabled = true port = 5060,5061 protocol = all filter = asterisk logpath = /var/log/asterisk/full maxretry = 5 findtime = 300 bantime = 3600 action = iptables-allports[name=ASTERISK, protocol=all]
Параметры: maxretry=5 — 5 неудачных попыток, findtime=300 — за 5 минут, bantime=3600 — бан на час. Для прода увеличь bantime до 86400 (сутки).
systemctl enable fail2ban systemctl restart fail2ban ; Проверить что jail работает fail2ban-client status asterisk ; Посмотреть заблокированные IP fail2ban-client status asterisk | grep "Banned IP"
Убедись, что asterisk fail2ban видит логи. По умолчанию Asterisk пишет в /var/log/asterisk/full — проверь, что файл существует и туда идут записи:
tail -5 /var/log/asterisk/full
Шаг 3: отключить анонимные звонки
По умолчанию Asterisk принимает вызовы от незарегистрированных пользователей. Это надо отключить явно. В /etc/asterisk/pjsip.conf:
[global] type=global endpoint_identifier_order=ip,username,anonymous ; Запретить анонимные звонки: default_inbound_trunk_endpoint= [anonymous] type=endpoint ; Все анонимные вызовы → в контекст-ловушку context=blocked-callers
В extensions.conf создай контекст-ловушку:
[blocked-callers]
exten => _.,1,Log(SECURITY, "Blocked anonymous call from ${CALLERID(all)} to ${EXTEN}")
exten => _.,n,Hangup()
Шаг 4: сильные пароли и смена SIP-порта
Генерируй пароли для каждого endpoint. Минимум 16 символов, буквы+цифры+спецсимволы:
; Генератор паролей прямо в терминале openssl rand -base64 18
Смена порта SIP с 5060 на нестандартный — простая мера, которая отсеивает массовые сканеры. В /etc/asterisk/pjsip.conf:
[transport-udp] type=transport protocol=udp bind=0.0.0.0:15060 ; нестандартный порт
; Обновить firewall ufw delete allow 5060/udp ufw allow 15060/udp
Минус: нужно будет указывать нестандартный asterisk port во всех SIP-клиентах и у провайдера. Некоторые провайдеры не поддерживают нестандартный порт на их стороне — уточни заранее.
Шаг 5: TLS + SRTP (продвинутый уровень)
TLS шифрует сигнализацию, SRTP — голос. Без них SIP-пакеты идут открытым текстом и можно прослушать разговоры через Wireshark в той же сети.
Кратко: генерируй сертификат (Let’s Encrypt или self-signed), добавь транспорт TLS в pjsip.conf, включи SRTP в endpoint. Это отдельная тема на 30 минут настройки — подробнее в разделе про продвинутую конфигурацию.
; Быстрая генерация self-signed сертификата openssl req -new -x509 -days 3650 -nodes \ -out /etc/asterisk/keys/asterisk.crt \ -keyout /etc/asterisk/keys/asterisk.key ; Транспорт TLS в pjsip.conf [transport-tls] type=transport protocol=tls bind=0.0.0.0:5061 cert_file=/etc/asterisk/keys/asterisk.crt priv_key_file=/etc/asterisk/keys/asterisk.key
Мониторинг безопасности Asterisk
Минимальный набор проверок, которые стоит запустить в cron раз в сутки:
#!/bin/bash
# /root/check-asterisk-security.sh
# Аномальное количество AUTH_FAILURE за последние 24 часа
FAILURES=$(grep "$(date +%b)" /var/log/asterisk/full | grep AUTH_FAILURE | wc -l)
if [ "$FAILURES" -gt 100 ]; then
echo "ALERT: $FAILURES AUTH_FAILURE в логах Asterisk" | <a class="wpil_keyword_link" href="https://it-apteka.com/tag/mail/" target="_blank" rel="noopener" title="mail" data-wpil-keyword-link="linked" data-wpil-monitor-id="1425">mail</a> -s "Asterisk Security Alert" admin@company.ru
fi
# Активные блокировки fail2ban
fail2ban-client status asterisk | grep "Banned IP" >> /var/log/asterisk/security-audit.log
Итог: когда стоит использовать Asterisk
Asterisk — правильный выбор, если нужен полный контроль над телефонной инфраструктурой без ежемесячных платежей за облачную АТС. Для команды из 10 человек разница может составить 200–500 долларов в месяц по сравнению с hosted-решениями.
| Плюсы | Минусы |
|---|---|
| Бесплатный open-source | Нужен сисадмин для настройки |
| Полный контроль конфигов | Кривая обучения 2–4 недели |
| Масштабируется до тысяч каналов | Обновления только вручную |
| Интеграция с любой CRM через AGI/ARI | Нет коробочного GUI |
| Огромное сообщество и документация | NAT-настройка требует времени |
Asterisk подходит, когда есть технический сотрудник, нужна кастомная логика звонков, IVR с очередями, запись разговоров, интеграция с внешними системами.
Не подходит, если нет никого технического вообще, нужно поднять за час без погружения, или масштаб слишком мал для выделенного сервера.
Что получил и что дальше
Ты собрал Asterisk из исходников, настроил PJSIP с внутренними номерами, открыл нужные порты, написал базовый dialplan и подключил транк провайдера. Сервер asterisk обрабатывает звонки. Это рабочий фундамент.
Дальше — IVR-меню через Background() и WaitExten(), очереди с равномерным распределением через Queue(), запись разговоров через MixMonitor(), интеграция с CRM через AGI-скрипты на Python или PHP. Каждая фича — отдельная тема, но базовая логика одна: endpoint в pjsip.conf, правило в extensions.conf.
Оставайтесь на связи
Рецепты от IT-боли. Без воды, без рекламы, без маркетинговой шелухи.
Подписаться на IT-Аптеку →


