В данной статье рассматриваются инструменты, советы с примерами по переходу от устаревшего канального драйвера chan_sip на новый chan_pjsip/res_pjsip, который был добавлен, начиная с версии Asterisk 12. По сути будет выполнена миграция SIP на PJSIP.
Скрипт преобразования
В загрузочном файле Asterisk содержится скрипт Python sip_to_pjsip.py, находящийся в подкаталоге contrib/scripts/sip_to_pjsip, который обеспечивает базовое преобразование конфигурации sip.conf в конфигурацию pjsip.conf (Миграция sip на pjsip). Он не предназначен для работы для каждого сценария или конфигурации. Для основных конфигураций это хороший пример того, как можно преобразовывать в конфигурацию для pjsip.conf.
Чтобы убедиться, что скрипт может читать любые файлы #include’d, запустите его из каталога /etc/asterisk или в другом месте с копией файла sip.conf и с включенными файлами. Входным файлом по умолчанию является sip.conf, а выходным файлом по умолчанию является pjsip.conf. Любые включенные файлы также будут преобразованы и записаны с префиксом pjsip_, если только они не были изменены с параметром –prefix = xxx.
Использование командной строки
# /path/to/asterisk/source/contrib/scripts/sip_to_pjsip/sip_to_pjsip.py –help
Usage: sip_to_pjsip.py [options] [input-file [output-file]]
input-file defaults to ‘sip.conf’
output-file defaults to ‘pjsip.conf’
Options:
-h, –help show this help message and exit
-p PREFIX, –prefix=PREFIX
output prefix for include files
Пример:
# cd /etc/asterisk
# /path/to/asterisk/source/contrib/scripts/sip_to_pjsip/sip_to_pjsip.py
Reading sip.conf
Converting to PJSIP…
Writing pjsip.conf
Примеры использования конфигураций sip.conf и pjsip.conf
Эти примеры содержат только конфигурацию, требуемую для sip.conf / pjsip.conf. Конфигурация для других файлов должна быть такой же, за исключением операторов Dial в вашем extensions.conf.
Важно знать, что синтаксис и формат конфигурации PJSIP более строг, чем более старый драйвер chan_sip. Если вы сомневаетесь, то старайтесь точно следовать инструкции в данной статье, избегайте лишних пробелов или странных заглавных букв. Всегда проверяйте свои журналы на наличие предупреждений или ошибок, если вы подозреваете, что что-то не так.
Пример конфигурации для SIP-аккаунта
В этом примере показана конфигурация, необходимая для:
- два SIP-телефона должны совершать звонки на Asterisk или через него, мы также хотим иметь возможность звонить на них из Asterisk;
- чтобы их можно было идентифицировать как пользователей (в старом chan_sip) или конечных точках (в новом res_sip / chan_pjsip);
- оба устройства должны использовать аутентификацию по имени пользователя и паролю;
- 6001 настроен для разрешения регистрации в Asterisk, а 6002 настроен для статического хоста.
sip.conf | pgsip.conf |
[general] udpbindaddr=0.0.0.0 [6001] type=friend host=dynamic disallow=all allow=ulaw context=internal secret=1234 [6002] type=friend host=192.0.2.1 disallow=all allow=ulaw context=internal secret=1234 | [simpletrans] type=transport protocol=udp bind=0.0.0.0 [6001] type = endpoint context = internal disallow = all allow = ulaw aors = 6001 auth = auth6001 [6001] type = aor max_contacts = 1 [auth6001] type=auth auth_type=userpass password=1234 username=6001 [6002] type = endpoint context = internal disallow = all allow = ulaw aors = 6002 auth = auth6002 [6002] type = aor contact = sip:6002@192.0.2.1:5060 [auth6002] type=auth auth_type=userpass password=1234 username=6001 |
Пример конфигурации для SIP-транка
Этот пример показывает конфигурацию для организации SIP-транка, который обычно предоставляется провайдером SIP-телефонии. Это регистрация на удаленном сервере, аутентификация на нем и настройка одноранговой / конечной точки для разрешения входящих вызовов от поставщика услуг.
- SIP-провайдер требует регистрации на своем сервере с именем пользователя «myaccountname» и паролем «1234567890»;
- SIP-провайдер требует регистрации на своем сервере по адресу 203.0.113.1:5060;
- SIP-провайдеру требуются исходящие вызовы на их сервер с тем же адресом регистрации, а также с использованием тех же данных аутентификации;
- SIP-провайдер позвонит на ваш сервер с именем пользователя «mytrunk». Их трафик будет приходить только с 203.0.113.1.
sip.conf | pjsip.conf |
[general] udpbindaddr=0.0.0.0 register => myaccountname:1234567890@203.0.113.1:5060 [mytrunk] type=friend secret=1234567890 username=myaccountname host=203.0.113.1 disallow=all allow=ulaw context=from-external | [simpletrans] type=transport protocol=udp bind=0.0.0.0 [mytrunk] type=registration outbound_auth=mytrunk server_uri=sip:myaccountname@203.0.113.1:5060 client_uri=sip:myaccountname@203.0.133.1:5060 [mytrunk] type=auth auth_type=userpass password=1234567890 username=myaccountname [mytrunk] type=aor contact=sip:203.0.113.1:5060 [mytrunk] type=endpoint context=from-external disallow=all allow=ulaw outbound_auth=mytrunk aors=mytrunk [mytrunk] type=identify endpoint=mytrunk match=203.0.113.1 |
Отключение res_pjsip и chan_sip
Возможно, вы захотите продолжать использовать chan_sip в течение короткого времени в Asterisk 12+, пока вы переходите на res_pjsip. В этом случае лучше отключить res_pjsip, если вы не понимаете, как настроить их вместе.
Есть несколько способов отключить или удалить модули в Asterisk. Какой метод лучше всего, зависит от ваших намерений.
Если вы создали Asterisk с модулями PJSIP, но не собираетесь использовать их в данный момент, вы можете рассмотреть следующие методы:
Метод 1
Шаг 1. Отредактируйте файл modules.conf в вашем каталоге конфигурации Asterisk. (обычно /etc/asterisk/)
noload => res_pjsip.so
noload => res_pjsip_pubsub.so
noload => res_pjsip_session.so
noload => chan_pjsip.so
noload => res_pjsip_exten_state.so
noload => res_pjsip_log_forwarder.so
Наличие noload для вышеупомянутых модулей должно (на момент написания этой статьи) предотвратить загрузку любых связанных с PJSIP модулей.
Шаг 2. Перезапустите Asterisk!
# systemctl restart asterisk.service
Метод 2
- Удалите все модули PJSIP из каталога модулей (обычно это /usr/lib/asterisk/modules)
- Удалить файл конфигурации (pjsip.conf)
- Удалите и переустановите Asterisk без модулей, связанных с PJSIP.
- Если вы хотите использовать chan_pjsip вместе с chan_sip, вы можете изменить порт или интерфейс привязки вашего транспорта chan_pjsip в pjsip.conf
Трансляция сетевых адресов (NAT)
При настройке с помощью chan_sip одноранговые узлы, которые расположены (относительно Asterisk) за NAT, настраиваются с использованием параметра nat . В версии 1.8 и выше Asterisk доступны следующие параметры nat:
Значение | Описание |
no | Не выполняется обработка NAT, отличная от RFC 3581 . |
force_rport | Если параметр rport отсутствует, ответы все равно будут отправлены на исходный IP-адрес и порт, как если бы присутствовал параметр rport. |
comedia | Отправка media на адрес и порт, с которого Asterisk получил его, независимо от того, где SDP указывает, что его следует отправить |
auto_force_rport | Автоматически разрешить отправку ответов на исходный IP-адрес и порт, как если бы присутствовал rport, если Asterisk обнаружит NAT. По умолчанию. |
auto_comedia | Автоматически отправлять носитель на порт, с которого Asterisk получил его. Независимо от того, где SDP указывает, что его следует отправить, если Asterisk обнаружит NAT. |
В chan_pjsip параметры endpoint, которые управляют поведением NAT:
- rtp_symmetric – отправляет media на адрес и порт, с которого Asterisk его получает. Независимо от того, где SDP указывает, что его следует отправить;
- force_rport – отправляет ответы на исходный IP-адрес и порт, как если бы порт присутствовал, даже если это не так;
- rewrite_contact – переписать SIP. Контакт с адресом источника и портом, чтобы последующие запросы перешли на этот адрес и порт.
Таким образом, аналогично следующее:
chan_sip (sip.conf) | chan_pjsip (pjsip.conf) |
[mypeer1] type=peer nat=yes ;… [mypeer2] type=peer nat=no ;… [mypeer3] type=peer nat=never ;… [mypeer4] type=peer nat=route ;… | [mypeer1] type=endpoint rtp_symmetric=yes force_rport=yes rewrite_contact=yes ;… [mypeer2] type=endpoint rtp_symmetric=no force_rport=no rewrite_contact=no ;… [mypeer3] type=endpoint rtp_symmetric=no force_rport=no rewrite_contact=no ;… [mypeer4] type=endpoint rtp_symmetric=no force_rport=yes rewrite_contact=yes ;… |
На этом миграция sip на pjsip выполнена.
Свежие комментарии