- PVSM.RU - https://www.pvsm.ru -
В статье рассказывается о децентрализованной реализации протокола IP-телефонии ENUM [1]на базе блокчейна криптовалюты Emercoin [2]. Дано описание ситемы ENUMER, её отличие от других реализаций ENUM. Также приведены инструкции по разворачиванию узла ENUMER и дан пример конфигурации VOIP АТС FreeSWITCH для работы с ENUMER.
В мире всё большее применение находит IP-телефония, которая обладает рядом преимуществ по сравнению с классической. IP-решения как правило дешевле классических и обладают большей функциональностью. В настоящее время IP ATC находят применение в различных организациях, но основные телефонные сети продолжают использовать классические решения, пусть даже и на базе цифровых АТС. В результате такого положения вещей, связь даже между двумя IP ATC происходит через обычную телефонную сеть, PSTN. Рассмотрим пример:
Пусть у нас есть организация «Покупатель», и другая организация, «Продавец». Обе организации используют для своих внутренних нужд IP ATC (также называемые PBX). Пусть сотрудник Покупателя нашёл в рекламе объявление Продавца, которое его заинтересовало. Покупатель решил позвонить Продавцу, и набирает его номер. Вызов происходит следующим образом:
При этом звонке, происходит соединение двух IP ATC через цепочку PSTN [3]-провайдеров, и соответственно покупатель платит за звонок провайдеру, который перенаправляет звонок из VOIP-сети в PSTN-сеть (приземляет звонок). Ну а далее идут взаимозачёты между PSTN-провайдерами, которые нас не интересуют.
Если бы IP_ATC_покупателя «знала бы дорогу», она могла бы через Интернет напрямую соединиться с IP_ATC_продавца, и тем избавила бы покупателя от платежа PSTN-приземлятелю, и звонок бы вышел бесплатным:
Да и надёжность и качество соединения было бы значительно выше, так как в такой цепочке и меньше промежуточных элементов, и перекодирований голосового трафика.
Понятно, что «знать все дороги», то есть поддерживать всевозможную карту прямых IP-соединений весьма трудоёмко, и был разработан сетевой протокол преобразования номера телефона в «дорогу», то есть в URI, который назвали ENUM.
Протокол ENUM (rfc6116 [4]) работает как распределённая адресная книга, и позволяет по номеру телефона «найти дорогу» к соответствующей IP ATC, которая обслуживает этот номер. Описание протокола: https://en.wikipedia.org/wiki/Telephone_number_mapping [5]
Идея использования протокола состоит в следующем:
Использование ENUM даёт выгоду как для инициатора, так и для получателя звонка. Для них это:
Протокол ENUM прост и легковесен, технически эффективен, и все наиболее популярные IP ATC его поддерживают. Тем не менее, широкого распространения от не получил, и тому есть ряд причин организационно-экономического характера, ставшими проблемами для широкого внедрения. Рассмотрим их подробнее.
Вышеназванные причины «провала» имеют организационно-технический характер, проистекающий из централизованной организации сервиса и непрозрачности алгоритма разрешения запроса. Действительно, централизованная реализация ENUM, как и любого сетевого сервиса, зависит от работоспособности сайта, который обслуживает создание ENUM-записей и поддержку их актуальными, а также соответствующего DNS-сервера, который разрешает ENUM-запросы. Иными словами, доверие к такой ENUM-системе не может превышать доверия к организации, которая управляет этой системой. Доверие также снижает тот факт, что совершенно неизвестен алгоритм и критерии, по которым тот или иной централизованный сервис разрешает ENUM-запросы. Так, например, сегодня он может работать как надо, а завтра – перенаправлять куда следует звонки на некий номер, интересующий компетентных товарищей (которым дело до всего). Например, на промежуточный VOIP-узел, который в свою очередь может сделать с трафиком всякое. Почему вдруг перенаправлять? Ну может быть, владелец номера играет джаз…
Соответственно, выход из строя такого сервиса приводит к одномоментному останову всей сети. Оба эти недостатка в полной мере продемонстрировал e164.org: сначала перенаправлял toll-free звонки не на зарегистрированные номера, а на своего провайдера-приземлятеля, потом вообще отвечал пустыми ответами, а в завершение эпопеи вышел из бизнеса, со всеми базами.
Для решения указанных выше проблем мы разработали децентрализованную систему ENUM на базе блокчейна Emercoin. Проект получил название «ENUMER», произошедшее от слов «ENUM» и «Emer». Кратко говоря: ENUM+EMER=ENUMER.
Криптовалюты являются трендом современной финансовой индустрии, и в настоящее время активно развиваются. Основой же всех криптовалют, включая Emercoin, является блокчейн – распределённая доверенная публичная база данных платёжных операций.
Особенностью Emercoin является NVS [8](Name-Value Storage) – распределённое доверенное хранилище информации общего назначения. То есть каждый участник сети имеет достоверную локальную копию всего блокчейна, и следовательно – всего содержимого NVS, а доверие к содержимому NVS, также как и всему блокчейну, создаётся посредством консолидированных усилий майнеров доказательства работы POW [9]и доказательства доли POS [10].
На базе этого хранилища уже созданы и эксплуатируются системы безопасности emcSSH [11]/emcSSL [12], а также неуязвимая децентрализованная система доменных имён EmerDNS [13].
Данный проект децентрализованного ENUM основан на системе EmerDNS, и обладает следующими преимуществами перед классической централизованной реализацией ENUM:
В результате, получаем систему:
Но при таких впечатляющих преимуществах, децентрализованный ENUM имеет и свои специфические проблемы, связанные с публичной доступностью инфраструктуры. Так, кто угодно может создать запись с любым содержимым, и захватить запись, соответствующую чужому телефонному номеру, и её содержимым либо заблокировать ENUM-доступ для истинного хозяина телефона, либо того хуже – перенаправить звонок куда-либо не туда. Звонишь, например, в прачечную, а попадаешь в министерство культуры…
Для предотвращения подобных злоупотреблений, в системе предусмотрены верификаторы. Это агенты, которые проверяют, что та или иная ENUM-запись действительно принадлежит владельцу соответствующего номера, и после этого передают владельцу ENUM-записи подпись – вердикт того, что запись верная, и ею можно пользоваться. Также с целью пресечения злоупотреблений система ENUMER работает только с индивидуальными телефонными номерами. То есть невозможно одной ENUM-записью отхватить изрядный кусок номерного пространства.
Владелец IP ATC, желающий получать звонки с использованием ENUM, должен вначале настроить свою IP ATC таким образом, чтобы иметь возможность получать входящие звонки на SIP URI «из мира». Детали настройки зависят от конкретной IP АТС (PBX) и сетевого окружения, и ничем не отличаются от обычный настройки PBX без блокчейна.
После этого надо разместить в EmerCoin NVS верифицированную ENUM-запись, которой и будут пользоваться звонящие. Для этого надо предпринять следующие действия:
Кошелёк (узел) Emercoin является клиентской программой распределённой ENUM-сети (да и не только ENUM), и чем-то вроде «личного кабинета», где пользователь может создать свои ENUM-записи и потом обновлять их по мере необходимости. Кошелёк можно скачать с http://emercoin.com/#download [15]
Для управления записями рекомендуем использовать GUI-кошелёк для Вашей ОС.
После скачивания и запуска, подождите, пока кошелёк не синхронизирует локальную копию блокчейна. Это может занять несколько часов.
Далее, надо где-то приобрести монет EMC, необходимых для загрузки и обновления записей в NVS. Их можно приобрести на одной из бирж [16], либо же обратиться к разработчикам [17].
Для резервирования одной записи на 10 лет и нескольких последующих обновлений требуется примерно 0.05EMC, что по текущему курсу составляет $0.06. В общем, цена вполне приемлема. А если принять во внимание, что в скором времени цена на NVS-запись будет снижена в 100 раз [18], можно считать расходы на обслуживание ENUMER-записи близкими к нулю.
Адрес, куда получать монеты, находится в меню “File/Receiving Addresses”, и выглядит примерно так: ERFJfQGwmZEomHQHGZsRFLZEyBxaWsCHTo.
Для хранения ENUM-записей используется доверенное децентрализованное хранилище — EmerCoin NVS [19] (Name-Value Storage). Доступ к записям NVS делается либо через GUI кошелька в табе “Manage Names”, либо командами JSON API, приведёнными в документации. NVS-запись, как явствует из названия, состоит из Имени (Name) и значения (Value).
Для подсистемы ENUM имена записей имеют следующий вид:
enum:phone_num:N
Здесь:
Например:
enum:18009359935:0
Если про префикс сервиса и номер и так всё понятно, то назначение параметра N нуждается в разъяснении. Это число нужно, чтобы защитить истинного владельца номера от скваттеров, которые могут захватить ENUM-запись, соответствующую чужому номеру, и посредством неё пробовать делать всякие нехорошие вещи. Использовать засквоченную запись они по любому не смогут (см. про верификацию ниже), но при отсутствии номера попытки N у настоящего хозяина номера не будет возможности внести свою запись. В случае же использования номера N реальный хозяин телефонного номера может создать запись с первым свободным значением N. Например предположим, что Вы хотите создать ENUM-запись для телефонного номера 18009359935, а приведённое в примере выше – уже захватил какой-то скваттер. Не беда, создайте имя «enum:18009359935:1», и после верификации система будет верить именно Вашему имени, а скваттеру останется любоваться бесполезной записью, в которой он сжёг свои монеты. Если и это имя засквочено – попробуйте создать запись с номером N=2, и так далее.
Поле Value cостоит из нескольких строк. Строки – либо U-директивы NAPTR (rfc3402 [21]) ENUM [5] (начинаются с E2U), либо подписи верификаторов (начинаются с SIG). Одна ENUM-запись может иметь как несколько директив, так и несколько подписей от различных верификаторов. Пример value, включающий U-директирву и подпись:
E2U+sip=100|10|!^(.*)$!sip:17772325555@in.callcentric.com! SIG=ver:enum|IC00zMELlEwmMHLpQs8=
У Вас пока нет подписей (строки подписей Вас предоставят верификаторы), поэтому при создании записи внесите только U-директивы (хотя бы одну), которые и обеспечат направление звонков на Вашу IP ATC. Структура директив следующая:
Service=Priority|Preference|Regex
В примере выше:
Смысл полей и их названия соответствуют стандартам [22]классического ENUM. Для тех, кому лень читать документацию, краткая инструкция для начинающих:
Почти всегда сервис – это как в примере выше, E2U+sip для SIP IP ATC. Возможны другие варианты, например E2U+iax или что-либо подобное. Как упоминалось выше, в ENUM-записи может присутствовать несколько U-директив.
Priority, Preference – оставьте как в примере для начала. Не рекомендуется их сильно уменьшать.
Самое главное – это Regex. Это правило, по которому телефонный номер преобразовывается в SIP URI. Разделителем выступает “!”. В первой части – regex накладывается на телефонный номер, а во второй – этот номер подставляется вместо 1, и тем самым формируется SIP URI.
Ещё хороший пример использования regex: !^+?441865332(.*)$!sip:1@nominet.org.uk!
Итак, ENUM запись создана, и блокчейн её принял. Она уже всем доступна. Но IP ATC звонящих её дружно игнорируют, так как в ней нет подписей верификаторов, которым они верят. И это – правильно. Ибо мало ли кто создал запись с Вашим телефонным номером? И что, теперь весь трафик отправлять куда там указано, не глядя? Нет, трафик будут отправлять только на основе верифицированных записей, содержащих подпись верификатора.
В настоящее время ещё не сделана система автоматической верификации, но в планах стоит её изготовление и ввод в эксплуатацию. Если Вы желаете поучаствовать в партнёрстве по созданию и эксплуатации подсистемы автоматической верификации, свяжитесь с нами: enumer@emercoin.com. Покамест же верификация происходит через человека-оператора.
Для получения подписи напишите e-mail на адрес enumer@emercoin.com. В письме укажите NVS-имя Вашей записи ENUMER, например: enum:18009359935:0.
В течение нескольких дней оператор проверит наличие записи, и сделает тестовый звонок на соответствующий номер, чтобы убедиться, что хозяин номера в курсе запроса и согласен использовать ENUMER. После успешной верификации мы отправим ответ, содержащий подпись, которую Вы и внесёте в Вашу NVS-запись. После внесения подписи, Ваша запись станет доверенной, и другие пользователи смогут её использовать для прямых звонков в Ваш PBX.
Внеся эту подпись в Вашу ENUM-запись и выполнив NAME_UPDATE, Вы доказываете всем владение номером, и звонящие (клиенты ENUMER-а), которые верят данному верификатору, будут отправлять звонки не на PSTN, а на SIP URI Вашей IP ATC.
В ЕNUM-записи подписей может быть несколько, от разных верификаторов. Клиент пользуется ENUM-записью, если там присутствует хотя бы одна подпись от одного из тех верификаторов, которым он верит.
После добавления подписи – Ваша ENUM-запись активна, и клиенты ENUMER-а могут звонить Вам напрямую, не используя PSTN-сети.
Теперь, после того, как запись о Вашей IP ATC внесена в ENUMER, осталось начать пользоваться системой на благо себя и других абонентов. Для этого надо сделать, чтобы Ваша IP ATC посылала ENUM-запросы в Emercoin NVS.
Мы создали публичный шлюз в ENUMER, и любой пользователь PBX безо всяких настроек блокчейна и тп может им пользоваться в своей АТС. Для этого надо послать ENUM-запрос в DNS: на резолвер enum.enumer.org. Пример тестового запроса из командной строки и ответа:
$ dig -t naptr +short 53995390081.enum.enumer.org 100 10 "u" "E2U+sip" "!^(.*)$!sip:\1@tollfree.alcazarnetworks.com!" .
Но при использовании нашего шлюза, Вы потенциально получаете все рассмотренные выше проблемы, связанные с централизацией и использованием внешнего сервера. Поэтому основным назначением нашего шлюза является предоставление тестовой среды, и не более того. Мы настоятельно не рекомендуем использовать наш шлюз для практического применения в системе под эксплуатацией, а развернуть собственный шлюз в EmerDNS, как будет рассказано ниже.
Наиболее правильный, быстрый и безопасный вариант – поставить у себя демон-кошелёк EmerCoin, и развернуть шлюз в emcDNS в локальной сети или даже на сервере, где работает IP ATC. Документация по разворачиванию такого шлюза – тут [23]. Смотрите раздел «Integration into a regular DNS tree».
В конфиг BINDa (или другого DNS-proxy) необходимо будет добавить ссылку на пятую зону «enum» по аналогии с четырьмя уже имеющимися от EmerDNS.
Кроме того, в конфиге кошелька emercoin.conf необходимо добавить «$enum» к списку обслуживаемых зон, как в примере ниже. Использование знака «$» вместо точки указывает кошельку, что эта зона будет обслуживаться по правилам ENUM rfc6116. Кроме того, в конфиг кошелька необходимо добавить два параметра, специфичных для ENUM:
В примере ниже, в качестве такого списка выступает ссылка на NVS-запись enum:tollfree, которая в настоящее время содержит правила для приземления toll-free звонков в США, Францию и Польшу. Мы будем поддерживать актуальность этой записи, и добавлять пути на другие страны по мере появления соответствующих приземлятелей.
Таким образом, в конфигурационный файл emercoin.conf [24] надо добавить следующие строки:
emcdnsallowed=$enum|.coin|.emc|.lib|.bazar # Allowed TLDs, including ENUM enumtrust=ver:enum|olegh enumtollfree=@enum:tollfree
Для тестирования настроек, попробуйте вручную послать ENUM-запрос в DNS:
$ dig -t naptr +short 53995390081.enum localhost [25]
Ответ должен быть примерно таким:
100 10 "u" "E2U+sip" "!^(.*)$!sip:\1@tollfree.alcazarnetworks.com!" .
Если не работает что-то – попробуйте послать запрос непосредственно в кошелёк, на порт 5335
$ dig -t naptr +short 53995390081.enum localhost [25] –p 5335
И локализовать место сбоя. Но при правильной настройке – всё работает сразу и без проблем.
Это проще всего. В dialplan-e IP ATC надо указать, что после разрешения внутренних и корпоративных номеров, но перед переходом к PSTN-провайдерам, делаем запрос в ENUMER. Естественно, перед запросом надо привести искомый номер к формату ITU-T E164.
Ниже приведён пример фрагмента dialplan-a для FreeSWITCH, который сначала приводит номер к формату E164 без лидирующего плюса, а потом делает запрос в ENUMER, добавляя плюс при запросе. Если ENUMER не может помочь – делается запрос в e164.arpa. Ну и если и там ничего нет – то dialplan переходит к PSTN-приземлятелям. Аналогичный фрагмент dialplan-a можно создать для другой IP ATC, поддерживающей ENUM (Asterisk, Yate, etc).
<!-- Normalize numbers to ITU-T E164 without PLUS --> <extension name="Normalize to ITU-T E164 without PLUS"> <condition field="destination_number" expression="^(?:+|011|00)(d{7,})$" break="on-true"> <action application="transfer" data="$1"/> </condition> <condition field="destination_number" expression="^(d{10})$" break="on-true"> <action application="transfer" data="1$1"/> </condition> <condition field="destination_number" expression="^(d{7})$" break="on-true"> <action application="transfer" data="1${home_code}$1"/> </condition> </extension> <!-- Lookup E164 with PLUS in the ENUMER and e164.arpa --> <extension name="Lookup ENUM" continue="true"> <condition field="destination_number" expression="^(d{7,})$" break="on-true"> <action application="ring_ready"/> <action application="set" data="hangup_after_bridge=true"/> <action application="set" data="continue_on_fail=true"/> <action application="set" data="effective_caller_id_name=+15553550000"/> <action application="set" data="effective_caller_id_number=+15553550000"/> <action application="enum" data="+$1 enum"/> <action application="bridge" data="${enum_auto_route}"/> <action application="enum" data="+$1 e164.arpa"/> <action application="bridge" data="${enum_auto_route}"/> </condition> </extension>
Автор: olegarch
Источник [26]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/telefoniya/263396
Ссылки в тексте:
[1] ENUM : http://www.voip-info.org/wiki/view/ENUM
[2] Emercoin: http://emercoin.com/
[3] PSTN: https://en.wikipedia.org/wiki/Public_switched_telephone_network
[4] rfc6116: https://tools.ietf.org/html/rfc6116
[5] https://en.wikipedia.org/wiki/Telephone_number_mapping: https://en.wikipedia.org/wiki/Telephone_number_mapping
[6] DNS-Spoofing: https://en.wikipedia.org/wiki/DNS_spoofing
[7] DNS-hijacking: https://en.wikipedia.org/wiki/DNS_hijacking
[8] NVS : https://wiki.emercoin.com/en/Emercoin_NVS
[9] POW : https://en.wikipedia.org/wiki/Proof-of-work_system
[10] POS: https://en.wikipedia.org/wiki/Proof-of-stake
[11] emcSSH: https://cryptor.net/kriptovalyuty/pod-kapotom-emercoin-chast-3-emcssh-infrastruktura-publichnyh-klyuchey-vsemirnogo
[12] emcSSL: https://habrahabr.ru/post/257605/
[13] EmerDNS: https://habrahabr.ru/company/emercoin/blog/334304/
[14] Github: https://github.com/Emercoin
[15] http://emercoin.com/#download: http://emercoin.com/#download
[16] одной из бирж: http://coinmarketcap.com/currencies/emercoin/#markets
[17] обратиться к разработчикам: http://emercoin.com/contact
[18] снижена в 100 раз: https://habrahabr.ru/company/emercoin/blog/335630/
[19] EmerCoin NVS: http://wiki.emercoin.com/en/Emercoin_NVS
[20] E164: https://en.wikipedia.org/wiki/E.164
[21] rfc3402: https://tools.ietf.org/html/rfc3402
[22] стандартам : https://tools.ietf.org/html/rfc5483
[23] тут : https://wiki.emercoin.com/en/EMCDNS
[24] emercoin.conf: http://olegh.ftp.sh/emercoin/emercoin.conf.txt
[25] localhost: https://habrahabr.ru/users/localhost/
[26] Источник: https://habrahabr.ru/post/337034/
Нажмите здесь для печати.