Настройка SIP в Asterisk - sip.conf
Файл 'sip.conf' отвечает за настройку внутренних и внешних каналов SIP в Asterisk. Объекты конфигурации - пиры, описываются в отдельных секциях, которые обозначаются именами в [квадратных скобках]. Действует принцип наследования, как и в большинстве конфигов Asterisk: все что задано после имени в квадратных скобках, относится к одному объекту, пока не будет объявлен следующий.
Предопределенная категория - [general], задает глобальные настройки драйвера SIP Asterisk, которые распространяются на все объекты, но могут быть переопределены для отдельных пиров в их категориях.
Asterisk SIP trunk
SIP транк в Asterisk, это совокупность объектов для совершения исходящих и приема входящих вызовов по протоколу SIP. Выделим три основных объекта настроек транков в Asterisk:
- register - формирует запрос SIP REGISTER для аутентификации на сервере провайдера.
- peer - SIP объект, через который совершаются вызовы. Формирует запросы OPTIONS, INVITE и тд.
- user - SIP объект для создания канала входящего вызова , его аутентификации и определения контекста транка.
Соединение обозначенное как user, это определение любой системы или оконечной точки (endpoint), которой мы разрешаем входящие вызовы на наш сервер Asterisk. Соединение type=user не обозначает никакого пользователя, а только создает канал и указывает контекст, для входа в диалплан аутентифицированных входящих вызовов.
Через соединение обозначенное как peer совершаются исходящие вызовы.
Asterisk Register String
Register string - строка регистрации определяющая параметры SIP запроса REGISTER.
В секции [general] добавьте определение register:
register ⇒ sipuser[:secret[:authuser]]@host[:port][/extension]
- sipuser - идентификатор пользователя на SIP сервере провайдера.
- authuser - не обязательное имя пользователя для авторизации на SIP сервере
- secret - пароль пользователя.
- host - домен или ip адрес SIP сервера.
- port - на какой порт посылать запросы регистрации серверу host. Если не задано, то по умолчанию - 5060
- /extension - расширение для обработки вызовов в диалплане Asterisk. Extension - подставляется в SIP заголовок <contact>. Это значение используется удаленным SIP сервером, когда ему необходимо совершить вызов в сторону Asterisk. Задайте в контексте транка соответствующее расширение, для обработки входящих вызовов, например: exten ⇒ _1234567,1,Queue(queuename), где 1234567 - extension.
- Если данный параметр не указан в строке регистрации, удаленный SIP сервер, вероятнее всего, использует параметр sipuser в качестве идентификатора вызова.
Вышеприведенный пример, упрощенный вариант строки регистрации. Полный вариант содержит больше информации:
register => [peer?][transport://]user[@domain][:secret[:authuser]]@host[:port][/extension][~expiry]
Обратите внимание на параметр transport, например tls:
register => tls://user:password@host
Строка регистрации имеет напрямую связанные с ней параметры [general]:
- registertimeout=20 - повторять попытки регистрации каждые 20 секунд (по умолчанию)
- registerattempts=10 - кол-во неудачных попыток регистрации. По умолчанию - 0 (т.е. продолжать бесконечно)
Для контроля SIP сообщений, статуса пиров и регистраций удобно использовать команды Asterisk CLI.
Вот некоторые из них:
- sip show peers - Отобразить все пиры и их статус.
- sip show peer <имя пира> - Показать конфигурацию определенного пира.
- sip show registry - Отобразить статус регистраций на удаленном UAS.
- sip set debug on - Показывать все SIP сообщения.
- sip reload - Перечитать конфигурационный файл.
- sip show settings - Показать текущую конфигурацию chan_sip.
Для получения подробной информации о командах смотрите Asterisk CLI - интерфейс командной строки.
Пример вывода команды sip show registry в консоли Asterisk:
#asterisk -rx 'sip show registry' Host dnsmgr Username Refresh State Reg.Time sip.server:5060 N 1234567 105 Registered Mon, 19 Dec 2016 11:48:03
Возможные состояния (state):
- Registered - зарегистрирован.
- Request Sent - запрос отправлен, ожидает ответа.
- No Authentication - ответ отрицательный, регистрация отвергнута.
Регистрация необходима, чтобы принимать входящие вызовы от провайдера, если используется SIP транк с аутентификацией. Как правило, это касается услуг связи предоставляемых через публичную сеть. Но могут быть и другие варианты SIP транков, без аутентификации, через серую сеть провайдера, например. Или для связи двух доверенных серверов Asterisk в корпоративной сети. В этом случае регистрация не требуется, аутентификация, обычно, происходит по ip адресу. Для такого транка достаточно создать пир friend с минимумом параметров. Например:
[siptrunk-no-auth] host=172.16.0.1 type=friend disallow=all allow=alaw allow=opus context=from-trunk qualify=yes
Asterisk SIP peer
Для совершения исходящих вызовов должен быть создан объект type=peer.
Конфигурация пиров осуществляется при помощи текстовых блоков, отделенных друг от друга квадратными скобками. Имя в квадратных скобках может совпадать с параметром 'defaultuser', но не обязательно.
[имя_пира] type=peer, user или friend параметр1=значение параметр2=значение
Где имя_пира - это произвольное имя SIP устройства, на которое можно ссылаться из других конфигурационных файлов. Параметр type может принимать одно из трех значений: type = value
- peer: SIP объект, через который совершаются исходящие вызовы.
- user: SIP объект, через который принимаются входящие Asterisk .
- friend: Запись, которая одновременно и user и peer. Этот тип, как правило, задается телефонам и другим оконечным устройствам. Для SIP пользователей этого типа Asterisk создаёт два объекта, один type=peer и один type=user, с одинаковыми именами.
Приведенный пример, являет собой типовой, самый распространенный вариант конфигурации sip транка с регистрацией через публичную сеть:
[siptrunk] type=friend ;peer и user в одном флаконе host=sip.server.tld ;sip сервер провайдера port=5060 ;порт сигнализации sip сервера transport=udp ;транспорт для sip протокола defaultuser=sipuser ;имя пользователя secret=password ;пароль fromuser=sipuser ;переопределяет user в sip заголовке From: <sip:user@domain>; fromdomain=sip.server.tld ;переопределяет domain в sip заголовке From: <sip:user@domain>; insecure=port,invite ;port - не требовать совпадения порта в инвайте ;invite - не требовать аутентификации в инвайте nat=force_rport,comedia ;политики работы через nat canreinvite=no ;не соединять медиа потоки peer-to-peer в обход сервера directmedia=nonat ;тоже что canreinvite в новой редакции dtmfmode=rfc2833 ;использовать спецификацию rfc2833 для передачи DTMF сигналов context=from-siptrunk ;контекст обработки входящих вызовов в extensions.conf. disallow=all ;запретить использование всех кодеков, чтобы затем разрешить определенные. allow=alaw allow=ulaw allow=g729
В приведенном выше примере, для простоты, использован type=friend. Как уже было сказано, в этом случае будут созданы два SIP объекта peer и user с одинаковыми именами и одинаковыми общими параметрами. Для объекта user два ключевых параметра, это host и context.
В некоторых случаях, хост пира через который совершаются исходящие вызовы,через провайдера и хост user, через который принимаются вызовы, могут отличаться.
В этом случае требуется создавать два типа объектов - peer и user соответственно, для одного транка. Но в большинстве случаев, можно использовать тип friend.
Параметры host и port те же, что и в строке регистрации, если провайдером не оговорено другое.
Транспорт, как правило UDP, задан по умолчанию в секции [general]. Укажите только если требуется задать специфический транспорт.
defaultuser и secret параметры аутентификации для исходящих вызовов, обычно те же, что и userid и password в строке регистрации.
Параметры fromuser и fromdomain принудительно подставляют в поле From: исходящего инвайта, указанные значения, что позволяет избежать отправки в сторону провайдера данных из инвайта пользователя.
Параметр insecure выключает аутентификацию входящих вызовов. В большинстве случаев, провайдер не посылает параметры аутентификации в инвайте, поэтому надо указывать insecure=invite.
Если сервер Asterisk находится за NAT, а сервер провайдера в публичной сети интернет, то требуется указать тип nat=force_rport,comedia, чтобы Asterisk указывал в качестве обратного адреса параметры назначенные в [general] - externip. Смотрите подробнее: NAT, SIP и Asterisk
Спецификация dtmfmode должна совпадать со стороной провайдера.
В указанном контексте будет определено, куда поступают входящие вызовы. Рассмотрим маршрутизацию вызовов в следующем разделе.
Входящая и исходящая маршрутизация sip транка в диалплане Asterisk
В диалплане (extensions.conf ) можно использовать разнообразный синтаксис для вызова (dial ) SIP устройств.
SIP/devicename SIP/username@domain (SIP uri) SIP/username[:password[:md5secret[:authname[:transport]]]]@host[:port] SIP/devicename/extension SIP/devicename/extension/IP или Host SIP/username@domain/IP или Host
В файле extensions.conf, для совершения исходящих вызовов, у Вас должно присутствовать правило набора, примерно такого вида:
exten => _9.,1,Dial(SIP/${EXTEN:1}@siptrunk-peer-name,30,r)
Где siptrunk-peer-name имя SIP пира, назначенное транку. Переменная ${EXTEN:1} получает номер екстеншена и удаляет первую цифру- '9'. Подробная информация приведена в Asterisk Dialplan - extensions.conf.
Пример контекста для входящих вызовов в файле 'extensions.conf':
[from-siptrunk] exten => _1234567,1,Dial(SIP/100&SIP101,180,tr) ; вызвать внутренние номера 100 и 101 одновременно. exten => _1234568,1,Queue(queuename) ; поместить вызов в очередь exten => _1234569,1,Dial(PJSIP/89219981138@pjsiptrunk,60,tr) ; перенаправить вызов на внешний номер
Где from-siptrunk контекст заданный user или friend объекту.
Настройка SIP пира для регистрации внутренних абонентов
Как уже отмечалось Asterisk не делает особых различий между транками и абонентами, поэтому конфиг телефона будет похож на SIP транк, но все же немного другой.
[777] host=dynamic type=friend secret=**password** qualify=yes nat=no port=5061 directmedia=no context=from-internal disallow=all allow-alaw allow=ulaw alow=gsm deny=0.0.0.0/0.0.0.0 permit=192.168.0.0/255.255.0.0 username=777 fromuser=777 dial=SIP/777 mailbox=777@device call-limit=2 callcounter=yes faxdetect=no callgroup=1 pickupgroup=1
Рассмотрим некоторые опции:
- host - dynamic или ip адрес с которого подключается абонент.
- type - для абонентского пира это обычно friend
- secret - пароль, использование сложных паролей убережет вас от многих неприятностей, даже если вы считаете сеть безопасной, в дальнейшем все может измениться и ваша предусмотрительность окажется очень кстати.
- qualify - посылать SIP запросы OPTIONS для проверки доступности устройства (возможно это является избыточным, т.к. большинство устройств сами обновляют регистрацию, через заданный в настройках интервал)
- nat - если телефон находится в локальной сети то 'no', если регистрируется из интернет или другой интра сети, то 'force_rport'
- nat = no - без NAT RFC3581
- nat = force_rport - использовать rport, даже если его нет
- nat = comedia - отправить медиа поток на порт Asterisk 12, независимо от указаний SDP.
- nat = auto_force_rport - установить 'force_rport' параметр если Asterisk обнаружил NAT (по умолчанию)
- nat = auto_comedia - установить 'comedia' параметр если Asterisk обнаружил NAT
- directmedia - направлять медиа поток (RTP трафик) через сервер или напрямую между каналами (пирами).
см. также по теме:NAT, SIP и Asterisk
- port - порт SIP сигнализации устройства (не путайте c bindport asterisk, который для данного драйвера SIP в Asterisk может быть только один, 5060 по умолчанию, но для нового драйвера Asterisk pjsip.conf, может, или даже должен, быть назначен уникальный порт для каждого транспорта)
- deny - сети из которых запрещено подключение
- permit - сети из которых разрешено подключение (если абонент находится в локальной сети, назначьте ему параметр permit=192.168.1.0/255.255.255.0 и регистрация на этом пире будет разрешена только из этой подсети. ACL очень действенная мера безопасноcти. См. также Asterisk:acl.conf
- call-limit -сколько одновременных вызовов (concurrent calls) может производится через данный канал. Хорошая идея, как для локальных так и для удаленных абонентов. Если пир взломан, злоумышленники не смогут пропустить через канал больше указанного кол-ва вызовов зараз(ы).
'call-limit' опция признана устаревшей и заменена на 'callcounter'. Установить ограничение одновременных вызовов теперь можно переменной канала function 'GROUP_COUNT'
пример использования данного метода можно помотреть здесь:
Ограничение количества одновременных вызовов по набранному номеру.
- callgroup - Группа вызова
- pickupgroup - Группа перехвата. Назначьте одинаковый номер группы для телефонов, которые должны перехватывать вызовы друг у друга при помощи featurecode - pickupexten, назначенного в features.conf
Настройка нескольких SIP пиров по шаблону
Если у вас множество SIP пиров, которые имеют общие настройки и отличаются например, только 'username' и 'secret', можно создать шаблон.
Для этого надо создать шаблонный пир, а рядом с его именем в квадратных скобках, написать восклицательный знак в круглых скобках и задать общие настройки:
[local_pattern](!) host=dynamic type=friend context=from-internal nat=no disallow=all allow=ulaw allow=alaw
А затем определить уникальные свойства пиров, добавив рядом с именем каждого пира, имя общего шаблона в круглых скобках:
[776](local_pattern) username=776 secret=super_puper_secret_1 callerid=8123216111 [777](local_pattern) username=777 secret=super_puper_secret_2 callerid=8121234567