Миграция с chan_sip на chan_pjsip

Миграция с chan_sip на chan_pjsip

В данной статье рассматриваются инструменты, советы с примерами по переходу от устаревшего канального драйвера chan_sip на новый chan_pjsip/res_pjsip, который был добавлен, начиная с версии Asterisk 12.

Скрипт преобразования

В загрузочном файле Asterisk содержится скрипт Python sip_to_pjsip.py, находящийся в подкаталоге contrib/scripts/sip_to_pjsip, который обеспечивает базовое преобразование конфигурации sip.conf в конфигурацию pjsip.conf. Он не предназначен для работы для каждого сценария или конфигурации; для основных конфигураций он должен предоставить хороший пример того, как преобразовать его в конфигурацию для 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 pjsip.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
;...