Самостоятельная настройка SIP сервера
Самостоятельная настройка SIP сервера
Если вам нужно подключить несколько SIP устройств в локальной сети или через интернет без использования коммерческого SIP сервера, вы можете это сделать на небольшом VPS или Raspberry Pi.
(Предполагается, что у вас уже есть VPS или Raspberry Pi и вы знаете, как пользоваться командной строкой)
Шаг 1. Установка
1 | sudo apt update |
Проверьте, что Asterisk запустился (Вы должны увидеть “active (running)”)
1 | sudo systemctl status asterisk |
Шаг 2. Настройка аккаунтов
В sudo nano /etc/asterisk/pjsip.conf
Добавьте конфигурацию:
1 |
|
Объяснение ключевых параметров:
type=endpoint- Определяет SIP конечную точкуcontext=internal- Какой контекст диалплана использоватьauth=1001- Ссылка на секцию аутентификацииaors=1001- Ссылка на AOR (Address of Record)max_contacts=1- Сколько устройств может одновременно зарегистрироватьсяremove_existing=yes- Заменяет старую регистрацию при новом входеdirect_media=no- Принудительная маршрутизация RTP через Asterisk (полезно для NAT)media_encryption=no- Шифрование
Опции media_encryption:
no- Без шифрованияsdes- SRTP с обменом ключами SDESdtls- SRTP с обменом ключами DTLS
Использование опционального шифрования:
1 | media_encryption=sdes |
Определите диалплан в /etc/asterisk/extensions.conf
(Например, любой пользователь может позвонить другому (например, 1001 → 1002).)
1 |
|
Перезагрузите Asterisk
1 | sudo asterisk -rx "reload" |
Для проверки пользователей
1 | sudo asterisk -rvvv |
RTP медиа-порты (Опционально)
Вы можете уменьшить количество портов для RTP
в /etc/asterisk/rtp.conf
1 | [general] |
Проверка логов
1 | sudo asterisk -rvvv |
На моём старом Ubuntu сервере мне потребовались дополнительные изменения для использования PJSIP вместо chan_sip (устаревший драйвер канала SIP). Без этих изменений настройки выше не будут работать (потому что настройки для chan_sip должны быть размещены в /etc/asterisk/sip.conf).
Настройка загрузки модуля PJSIP
в /etc/asterisk/modules.conf обновите список модулей для загрузки:
1 | [modules] |
STUN
В файле: /etc/asterisk/rtp.conf
добавьте:
1 | [general] |
Проверка клиентов:
1 | asterisk -rx "pjsip show endpoints" |
Отладка проблем медиа-согласования
1 | asterisk -rvvvvv |
Затем в CLI:
1 | pjsip set logger on |
Сделайте тестовый звонок и следите за:
1 | -- Called PJSIP/1002 |
Или:
1 | WARNING[xxxxx]: res_pjsip_sdp_rtp.c: No common codecs between endpoints |
Понимание полей статуса
- Avail - Устройство доступно (qualify успешен)
- Unavail - Устройство не ответило на ping qualify, но звонки всё равно могут работать
- NonQual - Qualify не настроен
- Unknown - Проверки qualify ещё не выполнялись
Важно: Статус влияет на решения по маршрутизации звонков только если вы используете qualify в логике диалплана. Для базовых звонков это не имеет значения!
Настройки безопасности PJSIP
В /etc/asterisk/pjsip.conf:
1 |
|
Отключите ненужные модули в /etc/asterisk/modules.conf
1 |
|
Защита Asterisk Manager Interface (AMI) в /etc/asterisk/manager.conf
1 |
|
Проверка подозрительной активности:
1 | # Проверить неудачные попытки регистрации |
SSL
Вариант A: Let’s Encrypt (Бесплатно и рекомендуется)
1 | # Установить Certbot |
Вариант B: Самоподписанный сертификат
1 |
|
Установка правильных прав доступа
1 | # Для сертификатов Let's Encrypt |
Настройка
В файле: /etc/asterisk/pjsip.conf
1 | [global] |
Перезагрузка:
1 | # Перезагрузка |
Вы должны увидеть вывод вроде:
1 | Transport: <TransportId........> <Type> <cos> <tos> <BindAddress.....................> |
Если вы не видите transport-tls, проверьте логи:
1 | tail -50 /var/log/asterisk/full | grep -i transport |
Если вы видите ошибку:
1 | ERROR[1069851] res_sorcery_config.c: Could not create an object of type 'transport' with id 'transport-tls' from configuration file 'pjsip.conf' |
Проверьте:
- Что путь к файлам сертификатов правильный
- Удалите или измените параметр cipher (у меня работает:
cipher=ADH-AES256-SHA,ADH-AES128-SHA)
Для самоподписанных сертификатов вам нужно отключить проверку сертификата на клиенте или добавить в /etc/asterisk/pjsip.conf:
1 | [transport-tls] |