LinuxСофт и ОС

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=30

6. Создаём 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 конфигурация сохраняет работоспособность.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *