Глава 9

Маршрутизация интернет-вызовов

There ain’t no such thing as a free lunch

(TANSTAAFL).

Не существует такой вещи, как бесплатный обед

-Robert Heinlein.

Одна из достопримечательностей VoIP — это концепция избегания использования PSTN в целом и маршрутизация всех вызовов непосредственно между конечными точками, использующими Интернет, практически без затрат. Хотя технология для этого уже давно существует, реальность такова, что большинство телефонных вызовов по-прежнему стоят денег, даже те, которые маршрутизируются через VoIP-услуги.

С технологической точки зрения все еще существует множество систем, которые не могут обрабатывать маршрутизацию VoIP-вызовов с использованием чего-либо, кроме клавиатуры на телефоне.

С культурной точки зрения мы все еще привыкли звонить друг другу, используя цифровую строку (ака номер телефона). С VoIP, идея иметь возможность звонить кому-то с помощью имя@домен (так же, как мы делаем с электронной почтой) имеет смысл, но есть несколько вещей, которые нужно рассмотреть, прежде чем мы сможем туда добраться.

Так что все держит?

freenum.org

Первые несколько разделов этой главы могут полностью отвлечь вас от всей идеи, поэтому мы хотим начать с того, что freenum.org предлагает временное решение для всего беспорядка, который настолько изящен, что мы не можем видеть причин, по которым все в сообществе VoIP не смогут его охватить.1 Основная идея freenum.org в том, что люди привыкли использовать цифровую клавиатуру на своем телефоне и потому, что в Интернете есть неиспользуемый RFC, описывающий то, что позволяет индивидуальные планы нумерации, почему бы не связать эти вещи вместе и предоставить DNS-совместимый план нумерации, который легко настраивается и работает с существующими технологиями? Это может показаться немного сложным, но это довольно просто.

DNS и SIP URI.

Система доменных имен (DNS) предназначена для того, чтобы люди могли локализовать ресурсы в Интернете. Хотя в конечном счете все соединения между конечными точками обрабатываются с помощью численных IP-адресов, это может быть очень полезно чтобы связать имя (например, www.google.com)с тем, что на самом деле может быть несколькими IP-адресами.

В случае VoIP использование доменного имени может выглядеть примерно [email protected] (внутренний_номер@сервер) и сделать его доступным как [email protected] (который выглядит гораздо более сексуально на визитной карточке).

SIP URI

SIP обычно выглядит как sip:[email protected]. В зависимости от вашего SIP-клиента вы можете набирать SIP URI каке [email protected] или даже точно так же, как endpoint (если у вас есть прокси-сервер и конечная точка, которую вы вызываете, является частью вашего домена).

Для телефона SIP, который часто имеет только цифровую клавиатуру, может быть проблематично набирать SIP URI по имени2, поэтому стало привычным использовать числовой набор для доступа к внешним ресурсам. Мы также используем «телефонные звонки» с использованием «телефонных номеров». Однако сам протокол SIP понимает только resource@address, поэтому все, что вы набираете, должно в конечном итоге быть преобразовано в этот формат, прежде чем SIP сможет что-либо с этим сделать. Обычно единственная причина, по которой вы можете набрать что-либо по «номеру телефона» с вашего телефона SIP — это то, что вы зарегистрированы на ресурсе, который понимает, как преобразовать числовые строки, которые вы набираете, в SIP URI.

В Asterisk часть URI resource (часть перед @) должна соответствовать расширению в диалплане.3 Часть address будет адресом (или именем хоста) самого сервера Asterisk. Итак, URI sip:[email protected] закончится на расширении 100, где-то в диалплане сервера, который предоставляет услугу SIP для shifteight.org.

То, что набирается (100), никоим образом не может относиться к фактическому идентификатору подключенной конечной точки. Например, у нас может быть пользователь по имени Leif, чей телефон может быть устройством, которое регистрируется по его MAC-адресу и поэтому может быть чем-то вроде [email protected]4. Значительная часть диалплана Asterisk заключается в упрощении адресации для пользователей и обработке сложностей различных протоколов, поддерживаемых Asterisk.

SRV записи

Service Record (SRV) представляет собой несколько новый тип DNS записи, которая предоставляет информацию о доступных услугах. Определенный в RFC 2782, он часто используется более новыми протоколами (одним из них является SIP). Если вы хотите поддерживать поиск SIP в своем домене, для правильного ответа вам потребуется соответствующая запись SRV.

Когда SIP-соединение выполняет поиск по [email protected], для целей SIP запись SRV может реагировать на то, что запрошенная услуга (SIP) фактически найдена на сервере pbx.shifteight.org (или, возможно, даже на полностью другом домене, таком как pbx.tothemoon.net).

Интернет хостинг-провайдеры обычно предлагают веб-интерфейс для настройки DNS-записей, но многие из них не обеспечивают хороший интерфейс для SRV записей (при условии что они предлагают что-либо вообще). Обычно вы можете легко настроить записи A и MX, но записи SRV могут быть более сложными. Если ваш хост не поддерживает записи SRV, вам нужно будет переместить свой DNS-хостинг другому провайдеру, если вы хотите иметь возможность поддерживать поисковые запросы SIP SRV для вашего домена.

Большинство DNS-серверов используют BIND (Berkeley Internet Name Daemon). Запись BIND для записи SRV для SIP будет выглядеть примерно так:

_sip._udp.shifteight.org. 86400 IN SRV 0 0 5060 pbx.shifteight.org.

Форма записи подробно описана в Таблице 12-1.

Таблица 12-1. Компоненты записи SIP SRV

Имя Описание Пример
Service Символьное имя службы _sip.
Proto Транспортный протокол _udp.
Name Доменное имя для этой записиa shifteight.org.
TTL Время жизни (в секундах) 86400
Class Поля класса DNS (всегда IN) IN
Priority Целевой приоритет хоста 0
Weight Относительный вес этой записи 0
Port TCP/UDP номер порта 5060
Target Имя хоста машины, предоставляющей эту услугу pbx.shifteight.org

a Обратите внимание на конечную точку.

Когда вы настраиваете запись SRV, вы можете протестировать ее со следующей командой Linux:

# dig SRV _sip._udp.shifteight.org

Результат будет содержать несколько компонентов, но интересующий вас раздел:

;; ANSWER SECTION:

_sip._udp.shifteight.org. 14210 IN SRV 0 0 5060 pbx.shifteight.org.

Это означает, что ваш DNS-сервер правильно отвечает на запрос SRV для SIP в вашего домена, отвечая именем хоста вашей АТС (в данном случае, pbx.shifteight.org).

Любые запросы SIP в ваш домен будут переданы на ваш сервер Asterisk, который будет отвечать за обработку входящих SIP-соединений.5

Если ваш диалплан не понимает часть имени/ресурса/конечной точки SIP URI, вызовы не будут выполняться. Это означает, что если вы хотите иметь возможность предлагать ресурсы в системе Asterisk по имени, вам понадобятся соответствующие записи диалплана.

Приём вызовов в вашу систему

Когда SIP URI входит в вашу систему Asterisk, часть ресурса URI будет поступать в диалплан как $⁠{EXTEN}. Так, например, [email protected] прибудет в диалплан в качестве leif внутри переменной канала ${EXTEN} в любом контексте, который вы используете для обработки неаутентифицированных SIP-вызовов (если вы строите свой диалплан, используя примеры в этой книге, это будет контекстом диалплана unauthenticated).

Изменение sip.conf

Как только вы знакомы с последствиями безопасности для разрешенных SIP-подключений без аутентификации, вам необходимо убедиться, что ваш файл sip.conf позволяет им. Хотя Asterisk позволяет их по умолчанию в предыдущих главах этой книги мы поручили отключить неаутентифицированные вызовы SIP. Логика для этого проста: если она вам не нужна, не включайте ее.

Поскольку мы теперь заинтересованы в разрешении звонков из Интернета, нам нужно будет разрешить неавторизованные вызовы SIP. Мы делаем это, установив общую переменную в файле /etc/asterisk/sip.conf, следующим образом:

[general]

context = unauthenticated ; контекст по умолчанию для входящих вызовов

allowguest = yes ; включить неаутентифицированные вызовы.

После внесения этого изменения не забудьте перезагрузить SIP, используя эту команду из командной строки:

$ sudo asterisk -rx “sip reload”

или из Asterisk CLI:

* CLI> sip reload

Вы можете проверить, что изменения применились, используя команду Asterisk CLI sip show settings. То, что вы хотите увидеть, это Allow unknown access: Yes под разделом Global Settings и Context: unauthenticated под заголовком Default Settings.

Стандартный диалплан

Чтобы обработать входящее имя, в вашем диалплане должно быть расширение, соответствующее этому имени.

Запись диалплана в системе pbx.shifteight.org может выглядеть так:

[unauthenticated]

exten => leif,1,Goto(PublicExtensions,100,1)

exten => jim,1,Goto(PublicExtensions,101,1)

exten => tilghman,1,Goto(PublicExtensions,102,1)

exten => russell,1,Goto(PublicExtensions,103,1)

Это, безусловно, самый простой способ реализации набора имен, но его также сложно поддерживать, особенно в системах с сотнями пользователей.

Чтобы более эффективно реализовать обработку имен, вы можете добавить что-то вроде следующего в файл extensions.conf. Обратите внимание, что некоторые строки были обернуты пробелами в этом примере из-за ограничений пространства. Эти строки должны отображаться в одной строке в диалплане. Все строки должны начинаться с exten =>, same => или индикатора комментария (;).

[unauthenticated]

exten => _[A-Za-z0-9].,1,Verbose(2,НЕСАНКЦИОНИРОВАННЫЙ ЗАПРОС К ${EXTEN} ОТ ${CALLERID(all)})

same => n,Set(FilteredExtension=${FILTER(A-Za-z0-9,${EXTEN})})

same => n,Set(CheckPublicExtensionResult=${DIALPLAN_EXISTS(PublicExtensions,

${FilteredExtension},1)})

same => n,GotoIf($[«${CheckPublicExtensionResult}» = «0»]?CheckEmailLookup)

same => n,Goto(PublicExtensions,${FilteredExtension},1)

; Это наш обработчик, когда кто-то набирает SIP URI с именем

same => n(CheckEmailLookup),GoSub(subEmailToExtensionLookup,start,1

(${TOLOWER(${FilteredExtension})}))

same => n,GotoIf($[«${GOSUB_RETVAL}» = «NoResult»]?i,1:PublicExtensions,

${GOSUB_RETVAL},1)

same => n,Goto(i,1)

; Это обрабатывает недействительные номера/имена

exten => i,1,Verbose(2,Входящий вызов от ${CALEERID(all)} в контексте ${CONTEXT} не найдено никакого результата)

same => n,Playback(silence/1&invalid)

same => n,Hangup()

; Это явные совпадения расширений (полезно для небольших систем)

exten => leif,1,Goto(PublicExtensions,100,1)

exten => jim,1,Goto(PublicExtensions,101,1)

exten => tilghman,1,Goto(PublicExtensions,102,1)

exten => russell,1,Goto(PublicExtensions,103,1)

Когда вызов входит в диалплан, он может совпадать в одном из двух мест: он может соответствовать нашему совпадению шаблонов в сверху, или он может соответствовать явным именованным расширениям ближе к нижней части нашего примера (например, leif, jim, tilghman или russell).

Если вызов явно не совпадает с нашими именованными расширениями, будет использоваться совпадение шаблонов. Наш шаблон совпадающий с _[A-Za-z0-9]. соответствует любой строке начинающейся с буквенно-цифрового символа, за которым следует ещё один или несколько других символов.

Входящую строку нужно сделать безопасной, поэтому мы используемфункцию FILTER() для удаления иных символов и присваиваем результат переменной канала FilteredExtension.

Функция DIALPLAN_EXISTS() будет использоваться, чтобы увидеть, соответствует ли запрос чему-либо в контексте PublicExtensions. Эта функция вернет либо 0 (если совпадение не найдено), либо 1 (если найдено совпадение) и присвоит результат переменной канала CheckPublicExtensionResult.

Следующая строка — GotoIf(), которая проверяет состояние переменной CheckPublicExtensionResult. Если результат был равен 0, диалплан будет продолжаться на метке приоритета CheckEmailLookup. Если результат был отличным от 0 (в этом случае результат может быть 1), будет выполнена следующая строка диалплана. Эта строка выполнит Goto() и продолжит выполнение в контексте PublicExtensions (предположительно, чтобы набрать конечную точку назначения).

Предполагая, что наша переменная CheckPublicExtensionResult была 0, наш диалплан будет продолжаться на метке приоритета CheckEmailLookup, где мы используем подпрограмму subEmailToExtensionLookup через GoSub().6 Мы передаем значение, содержащееся в переменной канала FilteredExtension в подпрограмму, но вы заметите, что мы завернули в функцию диалплана TOLOWER(), которая ожидает, что ваши адреса электронной почты будут сохранены в нижнем регистре, а не в смешанном).

По возвращении из подпрограммы subEmailToExtensionLookup мы проверяем переменную канала GOSUB_RETVAL (которая автоматически устанавливается при возврате из подпрограммы). Результат будет одним из двух: добавочный номер, который соответствует имени, переданному подпрограмме, или строке NoResult. Наш диалплан проверяет ${GOSUB_RETVAL}, и если она содержит NoResult, вызывающий передается в расширение i (недействителен), где мы информируем вызывающего абонента о том, что набранный номер недействителен. Если все будет хорошо, вызов продолжит выполнение в контексте PublicExtensions.

Разбор файлов

Этот небольшой трюк позволит вам использовать файл voicemail.conf для поиска действительных имен пользователей напротив их адреса электронной почты. Это может привести к тому, что будет дублирование, и для этого требуется, чтобы поле электронной почты в voicemail.conf было заполнено и содержало имя пользователя (перед символом @), которое вы будете поддерживать в своем диалплане, но его легко закодировать в диалплане, и если ничто другое не даст вам иных идей о том, как вы могли бы предоставить более автоматизированный способ связывания имен с внутренними номерами для набора SIP URI. Обратите внимание, что этот метод не позволит вам исключить некоторых людей из набора номера. Это все или ничего.

Мы написали это как подпрограмму, которая вызывается чтото вроде этого:

; где ‘name’ является именем пользователя, содержащееся в адресе email

GoSub(subEmailToExtensionLookup,start,1(name))

Подпрограмма выглядит следующим образом:

[subEmailToExtensionLookup]

exten => start,1,Verbose(2,проверка для пользователя в voicemail.conf)

same => n,Set(LOCAL(FilteredExtension)=${FILTER(a-z0-9,${ARG1})})

same => n,Set(LOCAL(Result)=${SHELL(grep»${LOCAL(FilteredExtension)}@»

/etc/asterisk/voicemail.conf)})

same => n,GotoIf($[${ISNULL(${LOCAL(Result)})}]?No_Result,1)

same => n,Set(LOCAL(ExtensionToDial)=${CUT(${LOCAL(Result)},=,1)})

same => n,Set(LOCAL(ExtensionToDial)=${FILTER(0-9,${LOCAL

(ExtensionToDial)})})

same => n,Return(${LOCAL(ExtensionToDial)})

exten => no_Result,1,Verbose(2,Пользователь ${ARG1} не найден в voicemail.conf)

same => n,Return(NoResult)

Хотя это может быть полезно для обозначения ${LOCAL(Result)} как локальной переменной, как только имя этой переменной было установлено как LOCAL() с помощью приложения Set() больше не нужно обращаться к нему через LOCAL(). Вы можете дополнительно задать имя переменной через Set() во второй раз (без префикса LOCAL()), и оно все еще ссылается на конструкцию LOCAL(), и она все равно исчезнет, когда возвращается из подпрограммы.

Давайте рассмотрим этот код, потому что есть некоторые полезные действия, которые вы можете применить к другим целям.

Сначала создается канальная переменная с именем FilteredExtension. Эта переменная локальна для подпрограммы:

Set(LOCAL(FilteredExtension)=${FILTER(a-z0-9,${ARG1})})

Функция FILTER() просматривает весь ${ARG1} и удаляет любые нецифробуквенные символы. Это прежде всего по соображениям безопасности. Мы передаем эту строку в оболочку, поэтому важно, чтобы она содержала только символы, которые мы ожидаем.

Следующий шаг — это место, где проходит холодок:

Set(LOCAL(Result)=${SHELL(grep «${LOCAL(FilteredExtension)}@»

/etc/asterisk/voicemail.conf)})

Оболочка вызывается для запуска приложения shell grep, которая будет искать в файле voicemail.conf, вернет все строки, содержащие имя@ и присвоит результат переменной ${Result}:

GotoIf($[${ISNULL(${LOCAL(Result)})}]?no_result,1)

Если строки не содержат искомую строку, мы вернем из подпрограммы значение NoResult (которое будет найдено в переменной канала ${GOSUB_RETVAL}). Раздел диалплана, который называется подпрограммой, должен будет обрабатывать это условие.

В качестве альтернативы вместо использования no_result,1 для вашего местоположения вы можете использовать same с произвольно высоким приоритетом, а также меткой приоритета, чтобы сделать эти вещи немного чище. Если вы это сделаете, то пункт назначения будет просто no_result (вместо no_result,1), и ваш пункт назначения будет выглядеть так:

same => 10000(no_result),Verbose(2,No user ${ARG1} found in voicemail.conf)

same => n,Return(NoResult)

Мы создали расширение с именем no_result для этой цели:

exten => no_result,1,Verbose(2,Пользователь ${ARG1} не найден в voicemail.conf)

same => n,Return(NoResult)

Если ${Result} не является нулевым, следующие шаги очистят ${Result}, чтобы извлечь добавочный номер7 пользователя с именем, переданным в ${ARG1}:

Set(LOCAL(ExtensionToDial)=${CUT(${LOCAL(Result)},=,1)})

Функция CUT() будет использовать символ = в качестве разделителя полей и присвоит значение из первого поля, найденного в ${Result}, новой переменной ExtensionToDial. Оттуда нам просто нужно обрезать любые конечные пробелы, фильтруя все нечетные символы:

Set(LOCAL(ExtensionToDial)=${FILTER(0-9,${LOCAL(ExtensionToDial)})})

Теперь мы можем вернуть имя добавочного номера, которое мы получили:

Return(${LOCAL(ExtensionToDial)})

Этот пример был тем, что мы взломали для иллюстрации некоторые методы, которые вы можете использовать для легкости сопоставления имен с внутренними номерами для набора SIP URI. Это отнюдь не лучший способ сделать это, но его довольно просто реализовать, и во многих случаях это может быть тем, что вам нужно.

Поиск в базе данных

Использование базы данных на сегодняшний день является лучшим способом обработки информации о пользователях в более крупных и сложных системах. Мы обсудим интеграцию Asterisk с базами данных более подробно в Главе 16, но здесь полезно ввести понятие.

База данных идеально подходит для обработки поиска имен, поскольку это упрощает обслуживание пользовательских данных (и интеграцию с внешними системами, такими как веб-интерфейсы). Однако для проектирования и реализации требуется немного больше усилий.

Пример, который мы будем использовать в этой главе, будет работать, но для производственной среды он, вероятно, слишком упрощен. Наша цель — просто дать вам достаточно информации, чтобы понять концепцию; более тесная интеграция является частью того, что описано в Главе 16.

Во-первых, нам понадобится таблица для обработки нашего сопоставления между именами. Это может быть отдельная таблица из главной пользовательской таблицы или она может быть обработана в главной пользовательской таблице, при условии, что она содержит поле, которое будет содержать точные строки, которые пользователи будут публиковать в качестве своих SIP URI (например, некоторые компании имеют правила относительно того, как выглядят адреса электронной почты, поэтому у Leif может быть URI, например, [email protected] или [email protected]).

Если вы серьезно относитесь к реализации этого примера в производственной системе, убедитесь, что вы знакомы с материалом Главы 16, так как в ней рассматриваются некоторые ключевые понятия, которые мы здесь опускаем.

Наша таблица NameMapping выглядит так, как показано в Таблице 12-2.

Таблица 12-2. NameMapping

Имя Номер Контекст
leif 100 publicExtensions
leif.madsen 100 publicExtensions
lmadsen 100 publicExtensions
jim 101 publicExtensions
reception 0 Servicesa
voicemail *98 Services

a Убедитесь что этот контекст существует в вашей системе.

Мы считаем, что использование отдельной таблицы, которая обрабатывает только сопоставление между именами и расширениями/контекстами, является наиболее полезным решением, поскольку эта таблица может использоваться для обработки не только пользователей с помощью телефонных аппаратов. Вам предлагается придумать другие способы решения этой проблемы, которые могут быть более подходящими для вашей среды.

В диалплане мы будем ссылаться на эту таблицу с помощью функции Asterisk func_odbc:

[subLookupNameInNameMappingTable]

exten => start,1,Verbose(2,Поиск ${ARG1})

; где ‘name’ — это имя пользователя, найденное в адресе электронной почты:

same => n,Set(ARRAY(CalleeExtension,CalleeContext)=${ODBC_NAME_LOOKUP

(${ARG1})})

same => n,GotoIf($[${ISNULL(${CalleeExtension})}]?No_result,1)

same => n,GotoIf($[${ISNULL(${CalleeContext})}?No_result,1)

same => n,Return() ; Вам нужно будет обрабатывать новые

; переменные CalleeExtension и CalleeContext в

; коде, который вызвал эту подпрограмму

exten => no_result,1,Verbose(2,Имя не было найдено в базе данных.)

same => n,Return(NoResult)

Файл /etc/asterisk/func_odbc.conf потребует следующую запись:

[NAME_LOOKUP](DB)

readsql=SELECT Extension,Context FROM NameMapping WHERE Name=’${SQL_ESC(${ARG1})}’

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

Подробности о том, как обрабатывать все это в вашем диалплане, выходят за рамки этой книги. Достаточно сказать, что в вашем диалплане вам все равно придется обрабатывать значения, которые создает или назначает ваша подпрограмма.

Набор SIP URI из Asterisk

Asterisk может набирать SIP URI так же легко, как и любой другой пункт назначения, но конечная точка (а именно, ваш телефон) в конечном итоге будет нести бремя составления адреса, и в этом заключается трудность.

Большинство SIP-телефонов позволят вам составить SIP URI с помощью клавиатуры набора. Сначала это звучит как отличная идея, но поскольку на телефоне нет клавиш пишущей машинки, чтобы набрать что-то вроде [email protected], то, что вам нужно было бы фактически ввести в телефон, было бы чем-то вроде строки:

5-444-6-*-888-2-66(пауза)-6-33-4(пауза)-4-33-555-33-66-#-7777-44(пауза)

-444-333-8-33-

444-(пауза)-4(пауза)-44-8-*-666-777-4

Чтобы поддержать это в своем диалплане, вам понадобится нечто подобное:8

exten => _[0-9a-zA-Z].,1,Verbose()

same => n,Set(FilteredExtension=${FILTER(0-9a-zA-Z@-_.,${EXTEN})})

same => n,Dial(SIP/${FilteredExtension})

Это просто, весело, и все работает! …?

Реальность такова, что до тех пор, пока все телефоны не будут поддерживать сложные и гибкие адресные книги, а также клавиатуру в стиле QWERTY (возможно, через сенсорный экран), набор SIP URI не будет взлетать.

Если у вас есть SIP URI который вы хотите набирать на регулярной основе (например, во время написания этой книги было много звонков между Джимом и Лейфом), вы можете добавить что-то вроде этого к вашему диалплану:

exten => 5343,1,Dial(SIP/[email protected]).

В этом диалплане вы можете набрать 5343 (LEIF) на своем телефоне, и диалплан Asterisk переведёт Вас на соответствующий SIP URI. Это не практично для большого количества URI, но для некоторых это может быть полезным ярлыком.

Но продолжайте читать, потому что есть очень полезные компоненты DNS, которые упрощают процесс набора непосредственно между системами без использования ТфОП.

ENUM и E.164

Хотя протокол SIP действительно не мыслит с точки зрения телефонных номеров, реальность такова, что телефонные номера не уйдут в ближайшее время, и если вы хотите правильно интегрировать систему VoIP с таким количеством телефонных сетей, вам понадобится обработать ТфОП в некотором роде.

ENUM сопоставляет телефонные номера в Системе доменных имен (DNS). Теоретически ENUM — отличная идея. Почему бы не отключить ТфОП полностью и просто направлять телефонные звонки непосредственно между конечными точками, используя тот же план нумерации? Мы не уверены, что эта идея когда-либо станет тем, что, возможно, станет новым сообществом телекоммуникаций. Причина? Никто не может сказать, кому принадлежат номера телефонов.

E.164 и ITU (МСЭ)

ITU — Международный союз электросвязи (МСЭ) является учреждением Организации Объединенных Наций, которое на самом деле старше, чем сама ООН. Он был основан в 1865 году как Международный телеграфный союз. МСЭ-Т сектор, известный на протяжении многих десятилетий как CCITT (международный консультационный комитет по телефонии и телеграфии), является органом стандартизации отвечает за все протоколы используемые ТфОП, а также многие, которые используются в VoIP. До появления VoIP, работа сектора ITU-T представляла небольшой интерес для среднего человека, и членство, как правило, ограничивалось отраслями и учреждениями, которые заинтересованы в телекоммуникационных стандартах.

Стандарты МСЭ, как правило, соответствуют формату буквенно-числовых номеров. Стандарты МСЭ-Т, о которых вы, возможно, слышали, включают H.323, H.264, G.711, G.729 и т.д.

E.164 является стандартом МСЭ-Т, который определяет международный план нумерации для ТфОП.

Если вы когда-либо пользовались телефоном, вы использовали адресацию E.164.

Каждой стране в мире присваивается код страны9, а контроль за обращением в этих странах осуществляется местными властями.

Номера E.164 ограничены 15 цифрами (исключая префикс).

В Asterisk нет ничего особенного в том, что нужно обрабатывать адресацию E.164, кроме того, чтобы ваш диалплан соответствовал потребностям любых ТфОП-совместимых каналов, которые у вас могут быть.

Например, если вы работаете в стране NANP, Вам, вероятно, придется иметь следующие шаблоны:

_NXXNXXXXXX

_1NXXNXXXXXX

_011X.

_N11

В Великобритании вам может понадобиться нечто большее:

_0[123789]XXXXXXXXX

_0[123789]XXXXXXXX

И в Австралии ваш диалплан может иметь следующие шаблоны:

_NXXXXXXX

_0XXXXXXXXX

Пожалуйста, не копируйте и не вставляйте эти совпадения шаблонов в свой диалплан. Особенности региональных диалпланов сложны и постоянно меняются. Одним из важных вопросов, которые необходимо тщательно рассмотреть, является номер для конкретного региона экстренного вызова, как описано в разделе «Экстренный набор» в Главе 7. Вы не хотите получать этот материал неправильно.

Североамериканский центр нумерации

На большей части Северной Америки используется Нормандский план нумерации (NANP). Всем странам в NANP присваивается код страны 1. Канада и США являются наиболее известными из этих стран, но NANP фактически включает около 24 различных стран и территорий (в основном в Карибском бассейне).

ENUM

Чтобы разрешить отображение номеров E.164 в пространство имен DNS, должен был быть разработан способ представления телефонных номеров в качестве имен DNS.

Эта концепция определена в RFC3761, с благосклонным названием «Приложение E.164 для унифицированных идентификаторов ресурсов (URI) для системы динамической децентрализации (DDDS) приложения (ENUM)». ENUM, как сообщается, означает Electronic NUmber Mapping (электронное отображение номера).

Согласно RFC, преобразование телефонного номера в ENUM-совместимый адрес требует следующего алгоритма:

1. Удалить все символы, за исключением цифр.

Например, первое хорошо известное правило создало ключ «+442079460148». Этот шаг просто удалит «+», оставив «442079460148».

2. Поместите точки («.») Между каждой цифрой. Пример:

4.4.2.0.7.9.4.6.0.1.4.8

3. Обратный порядок цифр. Пример:

8.4.1.0.6.4.9.7.0.2.4.4

4. Дополнить строку «.e164.arpa» до конца. Пример:

8.4.1.0.6.4.9.7.0.2.4.4.e164.arpa

Ясно как день?

ENUM не взлетел. Причины, по-видимому, носят преимущественно политический характер. Проблема связана с тем, что нет ни одной организации, которая контролирует нумерацию на ТфОП так, как это делает IANA для Интернета. Поскольку ни одна организация не имеет четкого мандата по управлению номерами E.164 во всем мире, задача сохранения точной и авторитетной базы данных для ENUM оказалась неуловимой.

Некоторые страны Европы хорошо зарекомендовали себя в предоставлении надежных баз данных ENUM, но в коде страны 1 (NANP), который содержит несколько стран и, следовательно, несколько регулирующих органов, ситуация стала нелогичной. Это неудивительно, так как провайдеры, которые контролируют адресацию E.164, не могут с полным основанием ожидать энтузиазма по поводу того, что вы можете обойти их сети. Организации, ответственные за внедрение ENUM в Северной Америке, как правило, работают над созданием сети ТфОП в Интернете, что может сэкономить им деньги, но не вам или мне.

Это совсем не то, что нужно. Зачем мне направлять VoIP-звонки из моей системы в сеть, которая хочет взимать плату за эту привилегию? SIP предназначен для маршрутизации вызовов между конечными точками и не имеет реального использования для концепции оператора.

Преимущество всего этого заключается в том, что при выполнении ENUM-поиска возвращается действительный SIP-URI.

Asterisk и ENUM

Asterisk может выполнять поиск по базам данных ENUM, используя либо ENUMLOOKUP() или комбинацию функций диалплана ENUMQUERY() и ENUMRESULT(). ENUMLOOKUP() возвращает только одно значение из поиска и полезно, когда вы знаете, что, вероятно, будет только одно возвращаемое значение (например, SIP URI, который вы хотите, чтобы набирала система), или если вы просто хотите получить количество доступных записей.

Статус ENUM во всем мире

В странах NANP (и многих других), официальная зона e164.arpa формально не была внедрена, и, следовательно нет никакого официального места для поиска ENUM для NANP.

Список статусов реализаций ENUM различных стран можно найти по адресу http://enumdata.org/. Для тех стран, которым посчастливилось иметь ENUM в производстве вы можете выполнять поиск ENUM непосредственно в своих e164.arpa зонах.

Для стран без e164.arpa зон существует несколько альтернативных мест для поиска, наиболее популярным в настоящее время является http://www.e164.org. Обратите внимание, что у этих организаций нет официального мандата на сохранение зон, которые они представляют. Это проекты на основе сообщества, проекты с наилучшими проектами, а данные, содержащиеся в них, часто будут устаревшими.

Поиск ENUM в диалплане может выглядеть так:

exten => _X.,1,Set(CurrentExten=${FILTER(0-9,${EXTEN})})

same => n,Set(LookupResult=${ENUMLOOKUP(${CurrentExten},sip,,,e164.arpa)})

same => n,GotoIf($[${EXISTS(${LookupResult})}]?HaveLocation,1)

same => n,Set(LookupResult=${ENUMLOOKUP(${CurrentExten},sip,,,e164.org)})

same => n,GotoIf($[${ISNULL(${LookupResult})}]?NormalCall,1:HaveLocation,1)

exten = > HaveLocation,1,Verbose(2,Возвращен ручной набор по SIP URI)

exten => …

exten => NormalCall,1,Verbose(2,Ручной набор по стандартному маршруту ТфОП)

exten => …

Код диалплана, на который мы только что посмотрели, будет набирать номер и передавать его функции ENUMLOOKUP(). Он запрашивает тип метода sip (мы хотим, чтобы SIP URI был возвращен), и поиск сначала выполнялся из списков в DNS, найденных в зоне e164.arpa, а затем из записей, найденных по адресу http://www.e164.org.

За пределами стран, которые его внедрили, слабое понимание об ENUM. Таким образом, многие запросы ENUM не вернут никаких результатов. Ожидается, что это не изменится в ближайшем будущем, и ENUM останется диковинкой до тех пор, пока оно не будет широко распространено.

ISN, ITAD и freenum.org

Наконец, мы перейдем к самой крутой части этой главы.

Самым большим недостатком ENUM является то, что он использует систему нумерации, которая не контролируется никакими интернет-провайдерами.10 Проект freenum.org решает эту проблему, используя схему нумерации, управляемую IANA. Это означает, что формальная глобально действительная, негеографическая система нумерации для VoIP может быть немедленно и легко реализована без потасовки в бюрократии и политике, которые обременяют систему нумерации E.164.

Цель проекта freenum.org

Джон Тодд, управляющий проектом отмечает что:

Freenum.org — это служба DNS, которая использует методы сопоставления типа ENUM, позволяющие преобразовать многие службы в строку, удобную для клавиатуры. Самый очевидный и широко используемый метод для этого — это подключение пользователей VoIP бесплатно, создавая легко запоминаемую строку набора, которая сопоставляется с SIP URI в фоновом режиме. Однако все, что может появиться в записи NAPTR (электронная почта, мессенджер, веб-адреса), можно сопоставить с адресом freenum.org в стиле ISN. Цель проекта — предоставить бесплатные числовые указатели на миллиарды телефонов, которые поддерживают только символы 0-9, * и # и позволяют этим устройствам общаться через VoIP или другие протоколы следующего поколения. Проект распространяется на более чем 30 DNS-серверах по всему миру.

Получили ISN?

Сердцем концепции freenum.org является ITAD Абонентский номер (ISN). ISN представляет собой числовую строку, состоящую из добавочного номера в вашей системе, разделителя символов звездочки (*)11 и номера, уникального для вашей организации, называемого номером административного домена IP-телефонии (ITAD). Преимущество ISN заключается в том, что его можно набирать с любого телефона. ISN будет выглядеть примерно так:

0*1273

который будет представлять собой внутренний номер ноль в ITAD 127312 и будет разрешен для sip:[email protected].

Вы управляете своими добавочными номерами (все что слева от *). Ваш ITAD назначается IANA (той же организацией, которая управляет IP-адресами и MAC-адресами).13

После того, как ваш ITAD назначен, вы сможете публиковать ISN на своем веб-сайте или на визитных карточках или где вы обычно публиковали телефонные номера.

В качестве консультантов мы недавно начали присваивать номера ITAD всем организациям, для которых мы выполняем развертывание. Многие компании не поймут для чего они могли бы использовать номера ISN, но это становится приятной особенностью, когда их списки контактов содержат свой собственный номер ISN для службы или они начинают взаимодействовать с другими организациями, имеющими ITAD. Лейф даже поставил его в офис жены, чтобы он мог бесплатно позвонить ей на обед.

Любая система, способная набирать ISN, позволит своим пользователям звонить вам, набрав ваш ISN. Вызовы будут направляться непосредственно между двумя системами, используя URI SIP, который возвращает freenum.org.

Абонентские номера ITAD(ISNs)

ISN не заменяет SIP URI, а дополняет его, разрешая набор номеров VoIP, используя только символы, найденные на стандартной телефонной клавиатуре. Чтобы перевести ISN в действительный URI, система DNS будет запрашивать ISN по домену в freenum.org. Любой поиск DNS по вашему ISN вернет URI, который определяет как ваша система ожидает получать звонки на этот ISN.14

Управление интернет-нумерацией

Орган, уполномоченный на присвоение номеров в Интернете (IANA), является органом, ответственным за управление любой системой нумерации, которая существует в результате RFC, для которой требуется численная база данных. Наиболее известная ответственность IANA — это делегирование IP-адресов пяти региональным интернет-регистраторам, которые контролируют все публичные IP-адреса на планете.15 Эти организации несут ответственность за присвоение IP-адресов в своих регионах.

Существует много других схем нумерации, которые были созданы в результате RFC. Другие управляемые IANA номера включают в себя MAC-адреса, конкретно, организационно-уникальный идентификатор (OUI) в пространстве адресации MAC.

Несколько лет назад был создан протокол TRIP (Telephony Routing over IP). Хотя этот протокол никогда не взлетит и вряд ли увидит какой-либо рост в будущем, он предложил нам одну невероятно полезную вещь: ITAD. Поскольку ITAD являются частью RFC, IANA уполномочено поддерживать базу данных ITAD. Именно это делает freenum.org возможным.

Административные домены IP-телефонии (ITAD)

Freenum.org использует ответственность IANA за ведение базы данных ITAD и позволяет нам создавать простые, основанные на стандартах, глобально релевантные и ориентированные на сообщества планы нумерации для VoIP.16 Вы можете найти список присвоенных в настоящее время номеров ITAD на веб-сайте IANA.

Вы можете получить свой собственный номер ITAD, отправив форму, расположенную по адресу http://www.iana.org/cgi-bin/assignments.pl.

Эта форма должна быть заполнена, как показано на Рисунке 12-1.

Рисунок 12-1. Форма запроса для присвоения

В форме требуется следующая информация:

  1. Имя лица, ответственного за это заявление.
  2. Адрес электронной почты указанного лица.
  3. ITAD (Административный домен IP-телефонии).
  4. Общий каталог IANA для списков номеров ITAD, см. http://www.iana.org/ assignments/trip-parameters.
  5. Участие в исследовании ISN (http://www.freenum.org).
  6. ITAD (Административный домен IP-телефонии) определены в разделе «Маршрутизация телефонии через IP (TRIP)» [RFC 3219].

Кроме того, обязательно укажите свой почтовый почтовый адрес, так как это требуется при регистрации ITAD.

Ваша заявка будет рассмотрена Real Human Being ™, и в течении нескольких дней вам будет назначен ITAD IANA. Через несколько дней вы также получите информацию для своей учетной записи freenum.org (в настоящее время существует простой процесс проверки, чтобы боты и спамеры не злоупотребляли системой). Затем вам нужно зайти на сайт freenum.org и определить параметры для вашего ITAD.

Создайте запись DNS для своего ITAD

В правом верхнем углу сайта freenum.org вы увидите ссылку «Sign in Here». Ваше имя пользователя — это адрес электронной почты, который вы зарегистрировали в IANA, и ваш пароль будет отправлен вам по электронной почте системой freenum.org.17

Вам будет представлен список ваших назначенных ITAD. Чтобы ваш новый ITAD работал, вам необходимо обеспечить, чтобы записи DNS были обновлены.

Существует два метода обработки DNS для вашего ITAD. Первым (и самым простым) является запись указателя имени (NAPTR), вставленная в зону freenum.org. Другой способ — создать зону для вашего ITAD и передать эту зону freenum.org на ваши серверы имен. Мы обсудим здесь первый метод, но если вы знакомы с администрированием NAPTR/ENUM для DNS-сервера, вы можете использовать второй метод.

Люди freenum.org создали автоматический инструмент самообслуживания Freenum (FASST), чтобы упростить запись DNS для вас. Основные поля уже заполнены. Единственное, что вам нужно изменить, находится в разделе формы «Настройка DNS»: укажите имя хоста вашей АТС и сохраните изменения. Средство FASST использует регулярное выражение для преобразования поиска ISN в SIP URI.

Для того, чтобы указать имя вашего компьютера, вам необходимо изменить примеры регулярных выражений, представленных FASST, изменяя образец имени хоста sip.yourdomain.com на имя хоста вашей АТС. Так, например, в нашем случае мы хотели бы изменить

:!^\\+*([^\\*]*)!sip:\\[email protected]!

на:

:!^\\+*([^\\*]*)!sip:\\[email protected]!

Другие поля в записи DNS не должны быть изменены, если вы не знаете, что делаете. Остальные поля в форме являются необязательными и могут быть заполнены по вашему усмотрению.

Использование делегированных зон для географически распределенных офисов

Джон Тодд отмечает:

для тех сайтов, которые имеют чрезвычайно сложные конфигурации или географически распределенные офисы с различными серверами SIP, обрабатывающие разные префиксы (например: 12xxx отправляется на сервер Asterisk во Франции, 13xxx на сервер Asterisk в Германии и т. д.), тогда есть более сложные методы, когда вы запускаете свою собственную делегированную зону из домаена freenum.org, но это выходит за рамки этой книги, но ее можно узнать на сайте freenum.org.

Тестирование ITAD

Как часто бывает с изменениями DNS, это может занять несколько дней для ваших изменений в системе. Чтобы проверить, вы можете использовать Google для «онлайн-инструмента поиска», чтобы найти инструмент поиска в Интернете, или использовать инструмент dig под Linux:

$ dig NAPTR 4.3.2.1.1273.freenum.org

Как только ваша запись будет обновлена в системе, результат будет содержать следующее:

;; ANSWER SECTION:

4.3.2.1.1273.freenum.org. 86400 IN NAPTR 100 10 «u» «E2U+sip»

«!^\\+*([^\\*]*)!sip:\\[email protected]!» .

Если секция ответа не содержит регулярное выражение, содержащее имя домена, записи не обновлены и вы должны подождать ещё несколько часов (или даже оставить его на один день).

Использование ISN в вашей системе Asterisk

Итак, теперь, когда у вас есть собственный ITAD (вы зарегистрировались, верно?), Вы захотите сделать его доступным для других, а также настроить свой диалплан, чтобы вы могли набирать другие ITAD.

В разделе [globals] вашего диалплана (/etc/asterisk/extensions.conf) добавьте глобальную переменную, содержащую ваш ITAD:

[globals]

ITAD = 1273 ; замените «1273» на свой собственный номер ITAD.

Чтобы разрешить вызов в ITAD из вашей системы, вам потребуется что-то вроде следующего кода диалплана:18

[OutgoingISN]

exten => _X*X!,1,GoSub(subFreenum,start,1(${EXTEN}))

exten => _XX*X!,1,GoSub(subFreenum,start,1(${EXTEN}))

exten => _XXX*X!,1,GoSub(subFreenum,start,1(${EXTEN}))

exten => _XXXX*X!,1,GoSub(subFreenum,start,1(${EXTEN}))

exten => _XXXXX*X!,1,GoSub(subFreenum,start,1(${EXTEN}))

; вам может понадобиться добавить еще несколько строк для обработки …

[subFreenum]

exten => start,1,Verbose(2,Выполнение поиска ISN)

same => n,Set(ISN=${FILTER(0-9*,${ARG1})})

same => n,Set(Result=${ENUMLOOKUP(${ISN},sip,s,,freenum.org)})

same => n,GotoIf($[${EXISTS(${Result})}]?call,1:no_result,1)

exten => call,1,Verbose(2,Размещение вызова ISN — ${ISN} — через ${Result})

same => n,Dial(SIP/${Result})

same => n,Return()

exten => no_result,1,Verbose(2,Поиск ISN: — ${ISN} — не вернул результат)

same => n,Playback(silence/1&invalid)

same => n,Return()

Мы добавили два новых контекста к нашему диалплану: OutgoingISN и subFreenum. Контекст OutgoingISN контролирует кто может набирать номера ISN из вашего диалплана. Если вы следовали нашим примерам в этой книге, у Вас должен быть контекст с именем LocalSets, который является контекстом, с которого все ваши телефоны входят в диалплан. Включение OutgoingISN в LocalSets позволяет набирать номера ISN:

[LocalSets]

include => OutgoingISN ; включить контекст, который позволяет набор

; номера ISN

include => external ; использовать подпрограмму чтобы определить

; что вы можете набрать

Мы поместили OutgoingISN выше external, потому что Asterisk будет выполнять согласование расширения в порядке следования включений (include), а поскольку external имеет более общий поиск шаблону, чем наш контекст OutgoingISN, нам нужно убедиться, что OutgoingISN отображается первым.

Магия для набора номеров ISN обрабатывается в контексте subFreenum. Наш контекст OutgoingISN будет передавать запрошенный номер (например, 1234*256) в подмаршрут subFreenum. После первого вызова Verbose() в первой строке подмаршрут будет отфильтровывать запрос на номера и символ звездочки (*), чтобы сделать расширение безопасным. Затем результат будет присвоен переменной канала ISN:

exten => start,n,Set(ISN=${FILTER(0-9*,${ARG1})})

Затем подпрограмма выполнит поиск ISN через DNS-систему с использованием функции диалплана ENUMLOOKUP(). Параметры, переданные функции ENUMLOOKUP(), включают в себя:

  • Номер ISN для поиска.
  • Тип метода для поиска и возврата (SIP).
  • Параметр s , который сообщает Asterisk о выполнении поиска в стиле ISN вместо стандартного поиска ENUM.
  • Суффикс зоны для выполнения поиска (мы будем использовать freenum.org, но по умолчанию это e164.arpa).

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

exten => start,n,Set(Result=${ENUMLOOKUP(${ISN},sip,s,,freenum.org)})

После поиска и сохранения результата в переменной канала ${Result} наш подмаршрут проверит, получили ли мы результат или нет:

exten => start,n,GotoIf($[${EXISTS(${Result})}]?call,1:no_result,1)

Если результат не получен, вызов будет обрабатываться в расширении no_result. Если результат получен из нашего поиска, выполнение будет продолжено в расширении call, где вызов будет совершен с использованием результата, сохраненного в переменной канала ${Result}.

Получение звонков на ваш ITAD

Прием звонков на ваш ITAD намного проще. Если ваша система поддерживает входящие SIP URI, ISN уже будут работать для вас.19 Мы показали конфигурацию, необходимую для приема вызовов в вашу систему в разделе «Приём вызовов в вашу систему».

Безопасность и идентификация.

Печально, что в Интернете есть несколько эгоистичных, жадных криминальных типов, которые не упустят попытки воспользоваться преимуществами людей ради собственной выгоды. В телекоммуникации это поведение представляет собой несколько рисков для вас.

В этом разделе мы сосредоточим внимание на проблемах безопасности, связанных с частями вашей системы, которые вы намерены сделать общедоступными через Интернет. Хотя было бы просто отказаться от каких-либо внешних подключений, реальность такова, что если вы хотите, чтобы люди могли звонить вам бесплатно из Интернета (например, если вы намереваетесь публиковать SIP URI вашей компании на своей веб-странице), вам нужно будет определить безопасное место в вашей системе, куда будут поступать эти вызовы. Защита ваших входящих VoIP-соединений концептуально аналогична реализации DMZ в традиционных сетях.20

В Asterisk определенным контекстам в вашем диалплане нельзя доверять. Это означает, что вам нужно будет тщательно изучить, какие ресурсы доступны для каналов, которые входят в систему через эти контексты, и обеспечить доступность только определенных сервисов и функций.

Мошенничество с оплатой

Мошенничество с оплатой является, безусловно, самым большим риском для вашей телефонной системы с точки зрения потенциальной потери стоимости. Не случайно мошенники в течение нескольких дней набирают десятки тысяч долларов на чужих телефонных звонках.

Мошенничество с оплатой не является новой вещью, существовавшей до VoIP; тем не менее, благоприятный характер VoIP позволяет мошенникам использовать преимущества незащищенных систем. Большинство провайдеров не будет брать на себя ответственность за эти расходы, и, таким образом, если ваша система будет скомпрометирована вы можете в очень большом счете за телефон. В то время как провайдеры становятся все лучше и лучше, предупреждая своих клиентов о подозрительной деятельности, это не освобождает вас от ответственности за то, чтобы ваша система была укреплена против этой очень реальной и очень опасной угрозой.

В вашей системе Asterisk жизненно важно, чтобы вы знали, какие ресурсы в вашей системе находятся во внешнем мире, и убедились, что эти ресурсы защищены.

Самая распространенная форма мошенничества с оплатой в эти дни достигается путем атаки брутфорсом. В этом случае воры имеют скрипт, который связывается с вашей системой и пытается зарегистрироваться как действительный пользователь. Если они могут зарегистрироваться в качестве телефона в вашей системе, начнется поток вызовов, и вы будете получите большой счет. Если вы используете простые добавочные номера и легко угадываемые пароли, и ваша система принимает регистрацию вне вашего брандмауэра, вы наверняка будете жертвой мошенничества с платной подпиской.

Атаки брутфорсом также могут вызвать проблемы с производительностью в вашей системе, так как один из этих сценариев может нагрузить ваш маршрутизатор и АТС огромным количеством попыток регистрации.

Следующая тактика оказалась успешной в минимизации риска мошенничества с платной почтой:

  1. Не используйте легкоподбираемые пароли. Пароли должны содержать не менее восьми символов и содержать комбинацию цифр, букв и символов. 8а$j03H% хороший пароль,21 1234 — нет.
  2. Не используйте внутренние номера для регистрации SIP в sip.conf. Вместо [1000] используйте что-то наподобие МАС-адреса (что-то вроде [0004f2123456] будет намного сложнее для сценария брутфорса).
  3. Используйте сценарий анализа, например fail2ban, чтобы настроить ваш внутренний брандмауэр, для блокировки IP-адреса, которые показывают грубое поведение, например массивные потоки пакетов.

Демон fail2ban становится популярным способом автоматического реагирования на угрозы безопасности. Мы обсудим это далее в Главе 26.

Спам по интернет-телефонии (SPIT)

VoIP-спам еще не принят, но будьте уверены, он это сделает. Спамеры во всем мире млеют от счастья на пути к возможности свободно нападать на всех и каждого с помощью телефонной системы с поддержкой Интернета.

Подобно электронной почте, VoIP влечет за собой определенный уровень доверия, поскольку он предполагает, что каждый телефонный звонок является законным. К сожалению, как и в случае спама по электронной почте, для всех нас требуется только несколько плохих яблок.

Сейчас многие организации и люди работают над тем, как решать проблему SPIT, прежде чем она станет проблемой. Некоторые разрабатываемые концепции включают сертификаты и «белые списки». В качестве окончательного решения не было найдено ни одного метода.

Хотя было бы просто заблокировать наши системы от мира, факт состоит в том, что интернет-телефония — это то, что каждый бизнес будет поддерживать в недалеком будущем. SPIT все чаще становится проблемой, поскольку все больше и больше сомнительных персонажей решают, что это новый путь к богатству.

Решение проблемы SPIT будет продолжаться: битва между нами и The Bad Guys ™.

Распределенные атаки на отказ в обслуживании

Атаки на отказ в обслуживании SIP уже происходят в Интернете. Облако EC2 от Amazon стало популярным местом для создания этих атак, а другие облачные или скомпрометированные системы станут популярными и для этих видов деятельности. Фактические атаки — это не строго отказ от атак службы (в том смысле, что они не намеренно пытаются задушить вашу систему); скорее, они являются атакующими кампаниями, которые обычно пытаются использовать брутфорс для обнаружения любых дыр в любых системах, которые они смогут найти. По мере того, как количество этих атак увеличивается, эффект на сеть будет аналогичен влиянию спама электронной почты.

Ранее упомянутый демон fail2ban может быть полезен для минимизации последствий этих атак. См. Главу 26 для получения подробностей.

Фишинг

Когда система VoIP была скомпрометирована, одним из популярных применений системы с нарушенным доступом является передача мошеннических кампаний с использованием идентичности скомпрометированной системы. Преступники, занимающиеся так называемыми фишинговыми экспедициями, будут совершать случайные звонки в списки номеров, пытаясь получить информацию о кредитной карте или другую конфиденциальную информацию, представлясь от имени вашей организации.

Безопасность — это непрерывный процесс.

В отличие от предыдущих выпусков, в этой книге мы попытались привести примеры и передовые методы, которые учитывают безопасность на всех этапах. Где бы вы ни работали, вы должны думать о безопасности. В то время как реализация хорошей безопасности требует больше усилий по проектированию, разработке и тестированию, это сэкономит вам время и деньги в долгосрочной перспективе.

Большинство дыр в безопасности происходят в результате чего-то, что было поспешно реализовано и не было заблокировано позже. «Я сейчас просто построю это, и почищу его позже» — это слова, которые вы никогда не хотите говорить (или слышать).

Вывод

Одна из фантазий VoIP заключалась в том, что она собиралась сделать бесплатные звонки. Спустя более десятилетия мы все еще платим за наши телефонные звонки. Технология существует в течение небольшого времени, но удобство использования там не было.

Не стоит регистрировать ваш ITAD и настраивать систему для обработки ISN. Если бы каждая развернутая система Asterisk имела ITAD, и люди начали публиковать свои ISN на веб-сайтах, картах и визитных карточках, вес сообщества Asterisk привел бы к принятию индустрии.

Необходимо учитывать соображения безопасности для VoIP, но мы ожидаем, что выгоды перевесят риски.

Наша коллективная мечта бесплатного интернет-вызова может быть ближе, чем мы думаем.

1Серьезно, получите доступ к freenum.org и получите свой ISN сегодня. Это просто и бесплатно, и скоро все крутые дети будут иметь его.

2Вы знаете, где находится символ @ на вашей телефонной цифровой клавиатуре?

3Имейте в виду, что расширение в Asterisk может быть любой буквенно-цифровой строкой, такой как leif или 100.

4Вы можете фактически набрать этот URI непосредственно с телефона, минуя сервер Asterisk, но вы можете увидеть как набрав 100 будет гораздо более простым чем пытаясь понять, как ввести [email protected] в вашем телефоне, используя только цифровую клавиатуру (кстати, это может быть сделано).

5Это может быть просто прокси-сервер или любой другой сервер, способный обрабатывать входящие SIP-соединения.

6Мы объясняем использование subEmailToExtensionLookup в следующем разделе.

7На самом деле то, что мы извлекаем, это номер ящика голосовой почты; однако это число, как правило, будет таким же, как внутренний внутренний добавочный номер пользователя. Если это не одно и то же, этот конкретный метод не будет выполнять поиск по имени расширения, и нужно будет найти другой способ.

8Технически, символы ! # $% & ‘* + / =? ^ `{ | } ~ также действительны как local-part часть адреса электронной почты; однако они необычны, и мы решили не допускать их в нашем примере диалплана.

9За исключением 24 стран и территорий в страновом коде 1, которые являются частью Североамериканского центра нумерации (NANPA).

10Более того, возможно, что номера E.164 контролируются слишком многими организациями, каждая из которых подчиняется различным правилам и имеет цели, которые не всегда совместимы с концепцией глобального бесплатного VoIP-вызова.

11Этот символ не имеет ничего общего с программным обеспечением, которое является предметом этой книги; он просто ссылается на *, который находится на клавиатуре набора каждого телефона. Интересно, что могло бы быть, если бы вместо Asterisk Марк Спенсер решил назвать его создание Octothorpe.

12ITAD 1273 присвоен shifteight.org.

13Если вы думаете о строке 0*1273 с точки зрения форматирования адреса электронной почты, то 0 — ваше имя, символ звездочки как символ символа адресов электронной почты @, а номер ITAD — как числовое представление имени домена вашей компании.

14Хотя freenum.org может обрабатывать ITAD, которые разрешают не-SIP URI, обработка нескольких протоколов выходит за рамки этой книги. На данный момент мы рекомендуем вам ограничить ваш ISN обработкой SIP URI.

15AfriNIC, APNIC, ARIN, LACNIC и RIPE NCC.

16Обратите внимание, что freenum.org консультировался с представителями IANA в отношении использования ITAD с протоколами, отличными от TRIP.

17Это может занять несколько дней, поэтому, если вы получили свой ITAD от IANA, но не получили пароль от freenum.org, подождите некоторое время.

18Если люди публикуют полные DID пользователей, а не их внутренние внутренние номера, совпадения шаблонов должны поддерживать до 15 цифр.

19Если вы правильно настроили свои ITAD и ISN, преобразование из строки набора ISN в SIP URI произойдет до того, как звонок поступит на ваш порог.

20DMZ — это любая часть вашей сети, которую вы публикуете в Интернете (например, ваш веб-сайт) и, следовательно, не можете полностью доверять. Организации нередко размещают АТС в пределах DMZ.

21Фактически, поскольку он опубликован в этой книге, это уже не хороший пароль, но вы поняли идею.

Остались вопросы?

Я - Виталий Шелест, менеджер компании Voxlink. Хотите уточнить детали или готовы оставить заявку? Укажите номер телефона, я перезвоню в течение 3-х секунд.

VoIP оборудование


ближайшие курсы

10 доводов в пользу Asterisk

Распространяется бесплатно.

Asterisk – программное обеспечение с открытым исходным кодом, распространяется по лицензии GPL. Следовательно, установив один раз Asterisk вам не придется дополнительно платить за новых абонентов, подключение новых транков, расширение функционала и прочие лицензии. Это приближает стоимость владения станцией к нулю.

Безопасен в использовании.

Любое программное обеспечение может стать объектом интереса злоумышленников, в том числе телефонная станция. Однако, сам Asterisk, а также операционная система, на которой он работает, дают множество инструментов защиты от любых атак. При грамотной настройке безопасности у злоумышленников нет никаких шансов попасть на станцию.

Надежен в эксплуатации.

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

Гибкий в настройке.

Зачастую возможности Asterisk ограничивает только фантазия пользователя. Ни один конструктор шаблонов не сравнится с Asterisk по гибкости настройки. Это позволяет решать с помощью Asterisk любые бизнес задачи, даже те, в которых выбор в его пользу не кажется изначально очевидным.

Имеет огромный функционал.

Во многом именно Asterisk показал какой должна быть современная телефонная станция. За многие годы развития функциональность Asterisk расширилась, а все основные возможности по-прежнему доступны бесплатно сразу после установки.

Интегрируется с любыми системами.

То, что Asterisk не умеет сам, он позволяет реализовать за счет интеграции. Это могут быть интеграции с коммерческими телефонными станциями, CRM, ERP системами, биллингом, сервисами колл-трекинга, колл-бэка и модулями статистики и аналитики.

Позволяет телефонизировать офис за считанные часы.

В нашей практике были проекты, реализованные за один рабочий день. Это значит, что утром к нам обращался клиент, а уже через несколько часов он пользовался новой IP-АТС. Безусловно, такая скорость редкость, ведь АТС – инструмент зарабатывания денег для многих компаний и спешка во внедрении не уместна. Но в случае острой необходимости Asterisk готов к быстрому старту.

Отличная масштабируемость.

Очень утомительно постоянно возвращаться к одному и тому же вопросу. Такое часто бывает в случае некачественного исполнения работ или выбора заведомо неподходящего бизнес-решения. С Asterisk точно не будет такой проблемы! Телефонная станция, построенная на Asterisk может быть масштабируема до немыслимых размеров. Главное – правильно подобрать оборудование.

Повышает управляемость бизнеса.

Asterisk дает не просто набор полезных функций, он повышает управляемость организации, качества и комфортности управления, а также увеличивает прозрачность бизнеса для руководства. Достичь этого можно, например, за счет автоматизации отчетов, подключения бота в Telegram, санкционированного доступа к станции из любой точки мира.

Снижает расходы на связь.

Связь между внутренними абонентами IP-АТС бесплатна всегда, независимо от их географического расположения. Также к Asterisk можно подключить любых операторов телефонии, в том числе GSM сим-карты и настроить маршрутизацию вызовов по наиболее выгодному тарифу. Всё это позволяет экономить с первых минут пользования станцией.