Подключаем Asterisk к другому SIP серверу

1

Статья опубликована в журнале Хакер

Дочитавших ждет видео.

Часто компания имеет несколько офисов удаленных друг от друга. Использовать только один сервер для VoIP в таком случае очень накладно. Хотя SIP клиенты и могут работать напрямую, в случае недоступности сервера, позвонить даже в соседний кабинет будет проблематично. Также существует достаточно сервисов предлагающих выход в телефонную сеть по приемлемым тарифам. Подключаясь к ним можно существенно сэкономить на междугородних телефонных переговорах и получить прямой номер. Нам предстоит научить сервер Asterisk подключаться к другим подобным сервисам.

Проблемы и протоколы

Значок * (астериск) который у программистов и администраторов ассоциируется с любой возможной последовательностью, полностью отражает подход разработчиков при создании одноименного сервера IP-телефонии. Как результат IP-PBX Asterisk действительно может быть применен практически в любом случае, где уместно упоминание о VoIP. Он может работать как автономный сервер обслуживая абонентов “своей” сети, используя платы расширения с его помощью просто организовать выход в обычную телефонную сеть, или подключаться к уже имеющейся VoIP сети.
Итак будем считать сервер Asterisk успешно установлен и абоненты уже звонят друг другу и сразу перейдем к настройке связки двух серверов. Первым делом следует побеспокоиться о наличии хорошего канала в Интернет обладающего достаточной пропускной способность. Трафик VoIP хотя и спокойно относится к потерям отдельных пакетов, но очень критичен к задержкам пакетов в сети, поэтому спутниковые каналы не подходят. Желательно иметь хотя бы с одной стороны постоянный IP-адрес, в этом случае проблем с настройками точно не будет.
Процедура установления связи в VoIP (и используемые термины тоже) зависят от протокола. Для связи двух серверов Asterisk можно использовать протоколы H.323, SIP или IAX/IAX2, был еще MGCP, но о нем вряд ли стоит сегодня говорить. Протокол H.323 считается уже устаревшим, первая версия благодаря стараниям ITU (International Telecommunications Union) появилась в 1996 году. И хотя его совершенствование идет постоянно, последние рекомендации на сайте ITU (www.itu.int/rec/T-REC-H.323-200606-I/en) датированы июнем 2006 года, большинство провайдеров перешли на более новый протокол SIP. Одним из популярных решений является OpenSource проект OpenH323 (openh323.org). Кроме этого ситуацию путает наличие нескольких драйверов H.323, которые могут быть несовместимы по некоторым функциям. Чтобы долго не рассказывать о различиях отсылаю к статье «Реализации H.323 для Asterisk» (www.voip-info.org/wiki/index.php?page=Asterisk+H323+channels). Более современный протокол SIP (Session Initiation Protocol, протокол управления сессиями) ориентирован изначально на Интернет, разрабатывался в недрах IETF MMUSIC Working Group. Предлагаемый ими стандарт позволяет устанавливать пользовательские сеансы включающие в том числе и передачу голоса, видео, мгновенные сообщения и даже онлайн игры. По сравнению с H.323 он более прост в реализации, независим от транспортного уровня (может работать по UDP, TCP, ATM и др). В нумерации версий SIP есть небольшая путаница. Первая версия стандарта, получившая обозначение SIP 2.0 определена в RFC 2543, в RFC 3261 (www.ietf.org/rfc/rfc3261.txt) он был уточнен, но номер версии так и остался 2.0. Многие сегодняшние решения основаны на промежуточных версиях стандарта. Протокол SIP чаще всего используется провайдерами VoIP, поэтому при подключении к сервисам вроде sipnet.ru придется использовать именно этот протокол. Протокол IAX (Inter-Asterisk eXchange) разработан как альтернативный протокол обмена VoIP данными между Asterisk. Первая версия протокола уже устарела и практически не применяется, поэтому обычно термины IAX и IAX2 обозначают именно вторую версию протокола. IAX позволяет совмещать множество голосовых потоков и передавать их внутри одного канала (транка), что уменьшает накладные расходы, связанные с передачей заголовков IP пакетов, что особенно ощутимо при большом количестве звонков. В отличие от H.323 и SIP он лучше приспособлен к работе через NAT. Чтобы связать два сервера Asterisk это наиболее простой и поэтому рекомендуемый вариант. Все протоколы в той или иной степени стандартизованы. Протоколы H.323 и IAX2 полностью, и являются замкнутыми системами, а для SIP стандартизована только сигнализирующая часть, сервисы же могут использовать свои стандарты и развиваться любыми группами разработчиков. Более полное описание и сравнение этих протоколов можно найти например на сайте www.en.voipforo.com/SIP.

 

Подключаемся к другому серверу

Итак так как у нас два сервера Asterisk, то для организации соединения между ними будем использовать протокол IAX2. Все настройки работы Asterisk по этому протоколу производится в файле iax.conf. Один сервер настраивается для исходящих звонков — peer, а другой принимает звонки – user. Если вызовы предполагается совершать с обоих направлениях, то в конфигурационном файле следует создать две учетные соответствующие записи. Можно использовать и тип пользователя friend, то есть разрешить совершать звонки в обоих направлениях, но в этом случае при наличии параметра host созданная учетная запись сможет принимать вызов только с указанного узла, а такой вариант не всегда приемлем. В том случае, когда один из хостов имеет динамический адрес или работает из-за NAT, он должен зарегистрироваться на втором сервере. Параметры определенные в секции general, будут действительны для всех клиентов, хотя большую часть из них, при необходимости можно переопределить в индивидуальных секциях.

$ sudo mcedit /etc/asterisk/iax.conf

[general]
;bindport=4569 ; порт на котором принимаются звонки
;bindaddr=192.168.0.1 ; IP-адрес интерфейса принимающего звонки, иначе прослушиваются все

;iaxcompat=yes
; полезный параметр, снижающий задержки при сложных диалпланах

;nochecksums=no
; отключение проверки контрольных сумм UDP пакетов

delayreject=yes
; вводим задержки при ошибочном вводе пароля, чтобы затруднить их подбор

language=ru

mohinterpret=default
mohsuggest=default
; мелодия при ожидании

bandwidth=high
; полоса пропускания low, medium или high, будет влиять на использованные кодеки

; при помощи директив «allow» и «disallow» указываем разрешенные
; и запрещенные кодеки, значение «all» соответствует всем форматам
; allow=all ; соответствует bandwidth=high
disallow=g723.1
disallow=lpc10
; allow=gsm

jitterbuffer=no
; буфер для входящих сообщений, который будет компенсировать задержки, не всегда нужный и полезный параметр
forcejitterbuffer=no
; принудительная активация jitter буфера
; maxjitterbuffer=1000
; максимальный размер jitter буфера
; maxjitterinterps=10
; некоторые клиенты не утруждают себя посылкой специальных CNG/DTX фреймов
; при паузе в разговоре, этот параметр создает такие паузы
; resyncthreshold=1000
; порог задержек

; trunkfreq=20
; trunktimestamps=yes
; отсылка отметок времени в транке и интервал в мс

; minregexpire = 60
; maxregexpire = 60
; минимальное и максимальное время для регистрации (в сек)

; authdebug=no
; после настройки журналирование параметров аутентификации можно отключить

tos= lowdelay
; установка байта Type of Service (TOS) в исходящих IP-пакетах
; для IAX в отличие от SIP значение устанавливается для всех видов связи
; все варианты можно подсмотреть в файле doc/ip_tos.txt

autokill=yes

; если в течение 2000 мс не получаем ответ, соединение прерывается
; вместо yes или no можно указать свое значение в мс

; codecpriority=host
; согласование (предпочтения) кодеков для входящих звонков:
; caller (вызывающая сторона имеет приоритет), host (наш узел, значение по умолчанию),
; disabled (отключено), reqonly (аналогично disabled, предпочтения указываются
; только если запрашиваемый кодек недоступен)

; register => user:pass@asteriskserver.com
; если один из серверов не имеет постоянный адрес, нужно чтобы
; он регистрировался на втором сервере, для этого используется параметр register
; формат — register <user>[:<password>] @ <remote_host> [:<port>]

; пользователь принимающий звонки
[incominguser]
type=user
auth= md5,plaintext,rsa
; описание чуть ниже
secret=password
; для type=user можно использовать несколько записей secret
context=incoming
;deny=0.0.0.0/0.0.0.0
; permit=192.168.1.20/255.255.255.0
; по умолчанию этот пользователь будет принимать звонки с любого адреса
; использовав deny и permit можно принимать звонки только с определенных адресов/сетей

; пользователь для исходящих звонков
[outgoinguser]
type=peer
host=hostname.com
; host=dynamic ; в этом случае требуется команда register
auth=md5
secret=secret_word
username=username
; последние два параметра могут быть включены в команду Dial

Теперь небольшое пояснение по поводу auth. В IAX авторизация пользователей возможна одним из трех методов. При md5 и plaintext пароль в файле хранится в открытом виде, но в первом случае по сети передается его хеш, что препятствует его перехвату. Вариант plaintext являестя самым незащищенным и поэтому не рекомендуется к использованию. При rsa, для авторизации используется связка публичного и приватного ключа. Это хотя и более сложный в настройке, но зато и самый защищенный вариант, так как расшифровать информацию, можно только получив приватный ключ. Список известных публичных ключей с расширением pub приводится через двоеточие в параметре «inkeys«, а приватный ключ в «outkey«. Если с абонентами выбранного узла возможно ведение одновременно нескольких разговоров, то следует добавить параметр trunk, установив его значение в yes.

Настройка диалплана

Также небольшое замечание по безопасности, по поводу использования контекстов, особенно тех к которым будут иметь доступы пользователи из вне. Если все пользователи определены в один контекст в том числе и с использованием директивы include, то любой звонящий сможет получить доступ не только ко внутренним номерам, серверу голосовой почты, но и другим сервисам, например возможности совершать исходящие междугородние звонки. Не всем и всегда это необходимо или положено, поэтому лучше все правила, относящиеся к звонкам извне или наружу вынести в отдельный контекст, например incoming. Теперь переходим к настройке плана набора. Вообще в самом простом случае в файле extensions.conf можно создать контекст incoming в который просто вписать пользователя принимающего звонки:

[incoming]
exten => grinder,1,Dial(IAX2/grinder)

А для исходящих создать свой контекст, вроде:

[outgoing]
exten => 4000,1,Dial(IAX2/outgoinguser/4000)

Но это можно использовать при небольшом количестве номеров. Иначе проще заставить сервер Asterisk автоматически получать контекст с удаленного сервера или перенаправлять вызовы к нему. Соответсвенно и реализовать это можно несколькими вариантами. Например, чтобы передать свой диалплан на удаленный сервер используем конструкцию вроде:

switch => IAX2/<username>:[<password>]@<myserver>/<mycontext>

При этом параметры username, password должны быть прописаны в контексте mycontext iax.conf на удаленном сервере (myserver). Екстеншены могут быть выражены цифрами и буквами, или заданы при помощи шаблона. Если екстеншен начинается с подчеркивания ‘_’, то он воспринимается как шаблон. В шаблоне можно использовать некоторые специальные символы. Например, X – соответствует числам от 0 до 9, Z – 1-9, N — 2-9, точка “.” соответствует одному или нескольким числам, а “!” – ни одному или более символов, если число заключено в скобке [1237], то будет принято совпадение с одним из них. Теперь, когда все пояснения даны пример:

$ sudo mcedit /etc/asterisk/extensions.conf

[general]
static=yes.
writeprotect=no
; при такой конфигурации можно сохранить диалплан командой “save dialplan”
[default]
exten => _5XXXХ,1,Goto,out|${EXTEN}|1
; описываем план набора для удаленного сервера
; 5 вначале это что-то типа выхода на межгород
[out]
exten => _5XXXХ,1,StripMSD,3
; StripMSD удаляет 1 символ (по умолчанию) с начала номера
exten => _XXXХ,2,Goto,1
switch => IAX2/outgoinguser: secretword@hostname.com/incominguser

[incoming]
exten => grinder,1,Dial(IAX2/grinder)

Чтобы проверить регистрацию на другом сервере необходимо ввести в CLI Asterisk комманду “iax2 show registry”.
Очень полезной при организации связки двух удаленных серверов является возможность ограничения по времени при помощи timing list. Для этого следует используя инструкцию include указать промежуток времени в формате:

<диапазон времени>|<день недели>|<дни месяца>|<месяц>

Например рабочее время с понедельника по пятницу:

include => daytime|9:00-18:00|mon-fri|*|*

Подключаемся к SIPNET.RU

Сегодня доступно большое количество сервисов позволяющих совершать звонки на станционарные и мобильные телефоны находящиеся в любой стране мира. Стоимость таких услуг в итоге на порядок меньше, чем предоставляемые телефонными компаниями. Кроме этого компания подключившись к одной из таких сетей как правило получает прямой номер во многих городах России и других странах, что очень удобно клиентам, а значит, повышается шанс, что позвонят именно в твой офис. Для примера научим сервер Asterisk подключаться к сети SIPNET.RU.
Перед настройкой сервера следует создать учетную запись. Заходим на сайт customer.sipnet.ru/cabinet/register и заводим новую учетную запись. Для чего необходимо будет заполнить все поля в появишемся окне, ввести контрольное число и нажать кнопку “Продолжить регистрацию”. После подтверждения регистрации в письме, которое придет на указанный e-mail, активируется учетная запись со статусом “Тестовый доступ”. Выбранным логином можно будет пользоваться в течение 30 дней, после чего следует пополнить счет или запись будет удалена. Тестовый доступ позволяет совершать завонки по бесплатным направлениям (стационарные телефоны в Москве и Петербурге) и абонентам SIPNET, последним можно отсылать мгновенные сообщения. Чтобы перейти на тарифный план «Абонентский доступ» и звонить за пределы России и на мобильные телефоны, достаточно положить на счет всего 3 у.е. Варианты пополнения счета можно выбрать в меню “Пополнения счета” зарегистрировавшись в своем аккаунте. При регистрации тебе будет выдан 7-ми значный номер SIP ID, плюс понадобятся указанные тобой логин и пароль. Предположим это 1234567, grinder и password. Теперь в файл sip.conf дописываем, такие строки:

$ sudo mcedit /etc/asterisk/sip.conf

[general]
videosupport=yes

useragent=SipPhone
register=grinder:password@sipnet.ru/1234567
[sipnet]
type=friend
username=grinder
secret=password
callerid=sipnet
host=sipnet.ru

nat=no
fromuser=sipnet
fromdomain=sipnet.ru
dtmfmode=rfc2833
insecure= invite
context=sipnet
disallow=all
allow=alaw

Большая часть параметров тебе уже должна быть знакома. Поэтому пару слов об остальных. Параметр “insecure=invite” позволяет подключаться из вне без ввода пароля. Для обозначения типа тонального набора DTMF (Dual Tone Multi Frequency) используется dtmfmode с возможными значениями rfc2833, info, inband и auto. Параметр fromdomain указывает, какой домен будет использоваться в заголовках (по умолчанию локальный — domain). Этот параметр не обязателен, но некоторые сервисы его требуют. Теперь переходим к настройке диалплана. Все городские номера используемые в SIPNET.RU можно просмотреть в customer.sipnet.ru/cabinet/do_showphones. Следует выбрать нужные и прописать их в extensions.conf.

$ sudo mcedit /etc/asterisk/extensions.conf

[Moscow]
exten => _7495XXXXXXX,1,SetCallerID(«SipPhone» <1234567>)
exten => _7495XXXXXXX,2,Dial(SIP/sipnet/${EXTEN},120)
exten => _7495XXXXXXX,3,HangUp

И подключаем этот экстеншен в выбранные группы абонентов при помощи записи:

include => Moscow

Аналогичным образом прописываются планы набора для других городов. Закончив редактирование файлов вводим в CLI команду reload. После перезапуска Asterisk в верхнем углу меню “Персональные данные” должна появиться информация о подключенном клиенте Asterisk PBX (или что написано в useragent файла sip.conf).

вывод информации о подключенных клиентах

Команда “sip show registry” также покажет, что подключение произведено нормально.

CLI> sip show registry
Host Username Refresh State Reg.Time
sipnet.ru:5060 grinder 105 Registered Tue, 16 Oct 2007 23:10:04

проверка подключения в консоли

Теперь можно звонить используя SIPNET.RU.

Правила IPTABLES

Не лишним будет указать некоторые полезные правила IPTABLES. Чтобы пакеты беспрепятственно проходили, через фильтр пишем. Для SIP на 5060 порт:
iptables -A INPUT -p udp -m udp —dport 5004:5082 -j ACCEPT
Для протокла IAX2 порт другой:
iptables -A INPUT -p udp -m udp —dport 4569 -j ACCEPT
Медиапотоки RTP:
iptables -A INPUT -p udp -m udp —dport 10000:20000 -j ACCEPT
Некоторые используют протокол MGCP (media gateway control protocol):
iptables -A INPUT -p udp -m udp —dport 2727 -j ACCEPT
Для установки TOS в исходящих пакетах используем (для SIP) такое правило:
iptables -A OUTPUT -t mangle -p udp -m udp —dport 5060 -j DSCP —set-dscp 0x28
iptables -A OUTPUT -t mangle -p udp -m udp —sport 10000:20000 -j DSCP —set-dscp 0x28

Видео — подключение к SIPNET.RU в AsteriskNOW

1 комментарий

  1. Андрей
    // Ответить

    А зачем SetCallerID в Moscow? Разве сипнет позволяет подставлять clid?

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

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