Asterisk SIP-АТС для офиса на PJSIP: установка и настройка с нуля
Ниже — минимальная рабочая SIP-АТС на Asterisk с двумя внутренними номерами 6001 и 6002. Мы установим Asterisk, сохраним исходные конфиги, настроим PJSIP, сделаем внутренний dialplan, зарегистрируем телефоны и проверим вызов. Только после этого имеет смысл добавлять trunk провайдера.
Важно: не используйте пароли из примера в рабочей сети. SIP-АТС, доступная из интернета со слабыми паролями и открытым 5060/UDP, быстро становится целью перебора и toll fraud.
1. Устанавливаем Asterisk
На Debian/Ubuntu сначала обновите индекс пакетов и установите Asterisk из репозитория дистрибутива:
apt update
apt install asterisk
systemctl enable --now asterisk
systemctl status asterisk --no-pagerПроверяем установленную версию и доступность CLI:
asterisk -V
asterisk -rx 'core show version'
asterisk -rx 'module show like pjsip'В выводе должны присутствовать модули res_pjsip. Для новой установки не строим конфигурацию на устаревшем chan_sip.
2. Сохраняем исходные конфиги
mkdir -p /root/asterisk-backup
cp -a /etc/asterisk /root/asterisk-backup/asterisk-$(date +%F-%H%M)Перед каждым крупным изменением полезно сохранять именно рабочее состояние /etc/asterisk, а не надеяться на память.
3. Проверяем, какой SIP-порт уже слушается
ss -lunp | grep -E ':(5060|5061)\b'
asterisk -rx 'pjsip show transports'Если 5060 уже занят другим сервисом или второй копией Asterisk, сначала устраните конфликт.
4. Минимальный pjsip.conf: transport и номер 6001
Откройте /etc/asterisk/pjsip.conf. Если файл уже содержит рабочую конфигурацию, не затирайте её — добавьте секции осмысленно.
[transport-udp]
type=transport
protocol=udp
bind=0.0.0.0:5060
[6001]
type=endpoint
transport=transport-udp
context=office-internal
disallow=all
allow=alaw
allow=ulaw
auth=auth6001
aors=6001
direct_media=no
[auth6001]
type=auth
auth_type=userpass
username=6001
password=CHANGE_ME_6001_LONG_RANDOM_PASSWORD
[6001]
type=aor
max_contacts=1
remove_existing=yes
qualify_frequency=30В PJSIP один внутренний номер обычно связывает несколько объектов: endpoint, auth и aor. Именно AOR хранит контакты зарегистрированного телефона.
5. Добавляем номер 6002
[6002]
type=endpoint
transport=transport-udp
context=office-internal
disallow=all
allow=alaw
allow=ulaw
auth=auth6002
aors=6002
direct_media=no
[auth6002]
type=auth
auth_type=userpass
username=6002
password=CHANGE_ME_6002_ANOTHER_RANDOM_PASSWORD
[6002]
type=aor
max_contacts=1
remove_existing=yes
qualify_frequency=306. Создаём dialplan для внутренних звонков
В /etc/asterisk/extensions.conf добавьте:
[office-internal]
exten => 6001,1,NoOp(Call to 6001)
same => n,Dial(PJSIP/6001,30)
same => n,Hangup()
exten => 6002,1,NoOp(Call to 6002)
same => n,Dial(PJSIP/6002,30)
same => n,Hangup()
exten => 100,1,Answer()
same => n,Echo()
same => n,Hangup()Номер 100 запускает Echo-приложение и удобен для первого теста аудио/RTP.
7. Проверяем конфигурацию до звонков
asterisk -rx 'pjsip reload'
asterisk -rx 'dialplan reload'
asterisk -rx 'pjsip show transports'
asterisk -rx 'pjsip show endpoints'
asterisk -rx 'dialplan show office-internal'Для отдельного номера:
asterisk -rx 'pjsip show endpoint 6001'
asterisk -rx 'pjsip show aor 6001'Если endpoint не появился, смотрите журнал и ошибки парсинга конфигурации.
8. Настраиваем SIP-телефон
- сервер/registrar: IP или DNS-имя Asterisk;
- порт: 5060/UDP для нашего примера;
- username/auth ID: 6001;
- password: пароль из
auth6001; - transport: UDP.
На втором телефоне используйте 6002 и его собственный пароль.
9. Проверяем регистрацию телефонов
asterisk -rx 'pjsip show endpoints'
asterisk -rx 'pjsip show contacts'
asterisk -rx 'pjsip show aor 6001'
asterisk -rx 'pjsip show aor 6002'У зарегистрированного телефона должен появиться Contact. Если Contact отсутствует — до dialplan вы ещё не дошли: проверяйте сеть, порт, username/password и PJSIP transport.
10. Включаем подробный SIP-лог только на время диагностики
asterisk -rvvvВ CLI:
pjsip set logger onПосле диагностики отключите:
pjsip set logger offПостоянный SIP debug создаёт много логов и может раскрывать технические данные.
11. Первый тест: Echo
С телефона 6001 наберите 100. Вы должны услышать свой голос с небольшой задержкой. Если SIP-вызов устанавливается, но звук отсутствует, проблема чаще всего находится в RTP/NAT/firewall.
12. Второй тест: 6001 → 6002
Наберите 6002 с первого телефона. В CLI можно смотреть активные каналы:
asterisk -rx 'core show channels verbose'
asterisk -rx 'pjsip show contacts'13. Какие порты нужны в локальной сети
Порт SIP зависит от transport, а RTP-диапазон — от rtp.conf. Сначала проверьте фактическую конфигурацию:
grep -Ev '^($|;|#)' /etc/asterisk/rtp.conf
ss -lunp | grep asteriskТипичный диапазон RTP Asterisk — 10000–20000/UDP, но firewall нужно строить по вашему реальному rtp.conf, а не по статье из интернета.
14. Если Asterisk находится за NAT
Для transport можно указать локальные сети и внешний адрес. Пример:
[transport-udp]
type=transport
protocol=udp
bind=0.0.0.0:5060
local_net=192.168.1.0/24
external_signaling_address=203.0.113.10
external_media_address=203.0.113.10Для удалённых endpoint за NAT часто используются:
rewrite_contact=yes
force_rport=yes
rtp_symmetric=yes
direct_media=noТранспортные параметры требуют аккуратности: после их изменения надёжнее проверить, применились ли они, и при необходимости перезапустить Asterisk в согласованное окно.
15. Диагностика «телефон не регистрируется»
systemctl status asterisk --no-pager
ss -lunp | grep ':5060'
asterisk -rx 'pjsip show transports'
asterisk -rx 'pjsip show endpoint 6001'
asterisk -rx 'pjsip show contacts'
journalctl -u asterisk --since '15 min ago' --no-pagerПроверяйте по порядку: IP/DNS → маршрут → firewall → transport → auth → AOR → endpoint.
16. Диагностика «звонок есть, звука нет»
asterisk -rvvvВ CLI временно:
rtp set debug onПосле теста:
rtp set debug off- проверьте RTP-диапазон firewall;
- проверьте
external_media_addressиlocal_net; - убедитесь, что маршрутизатор не переписывает SIP через проблемный SIP ALG;
- проверьте, есть ли RTP-пакеты в обе стороны;
- проверьте совпадение кодеков.
17. Только теперь добавляем trunk
Не существует одного универсального pjsip.conf для всех операторов. Одни провайдеры используют registration + auth, другие доверяют IP. До настройки trunk сохраните рабочую конфигурацию внутренних вызовов:
cp -a /etc/asterisk /root/asterisk-backup/before-trunk-$(date +%F-%H%M)После добавления провайдера проверяйте:
asterisk -rx 'pjsip show registrations'
asterisk -rx 'pjsip show endpoints'
asterisk -rx 'pjsip show contacts'18. Минимальная защита
- случайные уникальные SIP-пароли;
- не публикуйте 5060 во весь интернет без необходимости;
- ограничивайте trunk IP-адресами провайдера, когда это возможно;
- не давайте внутренним endpoint доступ к лишним dialplan-context;
- ограничьте платные и международные направления;
- следите за неудачными регистрациями и расходами;
- Fail2ban используйте как дополнительный слой, а не вместо firewall.
19. Как откатиться
Если после изменения конфигурации связь сломалась, восстановите каталог из последней копии и перезапустите Asterisk:
# укажите конкретную сохранённую копию
cp -a /root/asterisk-backup/asterisk-YYYY-MM-DD-HHMM/. /etc/asterisk/
systemctl restart asterisk
systemctl status asterisk --no-pagerКритерий успеха: 6001 и 6002 отображаются в pjsip show endpoints, оба телефона имеют Contacts, вызов 6001↔6002 проходит в обе стороны, Echo 100 передаёт звук, а после перезагрузки Asterisk конфигурация сохраняет работоспособность.