├── .directory
├── .gitignore
├── LICENSE
├── README.md
├── _config.yml
├── about-the-authors.md
├── changelog.md
├── chapter-01.md
├── chapter-02.md
├── chapter-02_html_3be5e199378a3618.png
├── chapter-02_html_5d7740068e6bed33.png
├── chapter-02_html_a3840d58b3bba40d.png
├── chapter-05.md
├── chapter-06.md
├── chapter-10.md
├── colophon.md
├── foreword.md
├── glava-01.md
├── glava-02.md
├── glava-03.md
├── glava-04.md
├── glava-05.md
├── glava-06.md
├── glava-07.md
├── glava-08.md
├── glava-09.md
├── glava-10.md
├── glava-11.md
├── glava-12.md
├── glava-13.md
├── glava-14.md
├── glava-15.md
├── glava-16.md
├── glava-17.md
├── glava-18.md
├── glava-19.md
├── glava-20.md
├── glava-21.md
├── glava-22.md
├── glava-23.md
├── pics
├── 0 (1).png
├── 0 (9).png
├── 1 (6).png
├── 2 (2).png
├── 3.png
├── 4 (1).png
├── 4.png
├── aster5_1.jpg
├── note.png
├── oreilly.png
├── oreilly_black.png
├── pic13-1.png
├── pic15-1.png
├── pic17-1.png
├── pic17-1_.png
├── pic17-2.png
├── pic17-2_.png
├── pic17-3.png
├── pic17-3_.png
├── pic19-1.png
├── pic19-2.png
├── pic19-3.png
├── pic2-1.png
├── pic20-1.png
├── pic20-2.png
├── pic20-3.png
├── pic5-1.png
├── pic5-2.png
├── pic5-3.png
├── pic6-1.png
├── pic6-2.png
├── pic6-3.png
├── pic6-3_.png
├── pic7-1.png
├── pic7-2.png
├── pic7-3.png
├── pic7-4.png
├── pic7-5.png
├── pic8-1.png
├── pic8-1_1.png
├── pic8-2.png
├── pic9-1.png
├── pic9-2.png
├── pic9-3.png
├── pic9-4.png
├── pic9-5.png
├── tip.png
└── warning.png
├── preface.md
├── readme.md
└── summary.md
/.directory:
--------------------------------------------------------------------------------
1 | [Dolphin]
2 | Timestamp=2020,1,17,22,29,30
3 | Version=4
4 | ViewMode=2
5 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | Asterisk - Definitive Guide *
2 | book.*
3 | .~lock.*
4 | *.odt
5 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | Creative Commons Legal Code
2 |
3 | CC0 1.0 Universal
4 |
5 | CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE
6 | LEGAL SERVICES. DISTRIBUTION OF THIS DOCUMENT DOES NOT CREATE AN
7 | ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS
8 | INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES
9 | REGARDING THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS
10 | PROVIDED HEREUNDER, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM
11 | THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS PROVIDED
12 | HEREUNDER.
13 |
14 | Statement of Purpose
15 |
16 | The laws of most jurisdictions throughout the world automatically confer
17 | exclusive Copyright and Related Rights (defined below) upon the creator
18 | and subsequent owner(s) (each and all, an "owner") of an original work of
19 | authorship and/or a database (each, a "Work").
20 |
21 | Certain owners wish to permanently relinquish those rights to a Work for
22 | the purpose of contributing to a commons of creative, cultural and
23 | scientific works ("Commons") that the public can reliably and without fear
24 | of later claims of infringement build upon, modify, incorporate in other
25 | works, reuse and redistribute as freely as possible in any form whatsoever
26 | and for any purposes, including without limitation commercial purposes.
27 | These owners may contribute to the Commons to promote the ideal of a free
28 | culture and the further production of creative, cultural and scientific
29 | works, or to gain reputation or greater distribution for their Work in
30 | part through the use and efforts of others.
31 |
32 | For these and/or other purposes and motivations, and without any
33 | expectation of additional consideration or compensation, the person
34 | associating CC0 with a Work (the "Affirmer"), to the extent that he or she
35 | is an owner of Copyright and Related Rights in the Work, voluntarily
36 | elects to apply CC0 to the Work and publicly distribute the Work under its
37 | terms, with knowledge of his or her Copyright and Related Rights in the
38 | Work and the meaning and intended legal effect of CC0 on those rights.
39 |
40 | 1. Copyright and Related Rights. A Work made available under CC0 may be
41 | protected by copyright and related or neighboring rights ("Copyright and
42 | Related Rights"). Copyright and Related Rights include, but are not
43 | limited to, the following:
44 |
45 | i. the right to reproduce, adapt, distribute, perform, display,
46 | communicate, and translate a Work;
47 | ii. moral rights retained by the original author(s) and/or performer(s);
48 | iii. publicity and privacy rights pertaining to a person's image or
49 | likeness depicted in a Work;
50 | iv. rights protecting against unfair competition in regards to a Work,
51 | subject to the limitations in paragraph 4(a), below;
52 | v. rights protecting the extraction, dissemination, use and reuse of data
53 | in a Work;
54 | vi. database rights (such as those arising under Directive 96/9/EC of the
55 | European Parliament and of the Council of 11 March 1996 on the legal
56 | protection of databases, and under any national implementation
57 | thereof, including any amended or successor version of such
58 | directive); and
59 | vii. other similar, equivalent or corresponding rights throughout the
60 | world based on applicable law or treaty, and any national
61 | implementations thereof.
62 |
63 | 2. Waiver. To the greatest extent permitted by, but not in contravention
64 | of, applicable law, Affirmer hereby overtly, fully, permanently,
65 | irrevocably and unconditionally waives, abandons, and surrenders all of
66 | Affirmer's Copyright and Related Rights and associated claims and causes
67 | of action, whether now known or unknown (including existing as well as
68 | future claims and causes of action), in the Work (i) in all territories
69 | worldwide, (ii) for the maximum duration provided by applicable law or
70 | treaty (including future time extensions), (iii) in any current or future
71 | medium and for any number of copies, and (iv) for any purpose whatsoever,
72 | including without limitation commercial, advertising or promotional
73 | purposes (the "Waiver"). Affirmer makes the Waiver for the benefit of each
74 | member of the public at large and to the detriment of Affirmer's heirs and
75 | successors, fully intending that such Waiver shall not be subject to
76 | revocation, rescission, cancellation, termination, or any other legal or
77 | equitable action to disrupt the quiet enjoyment of the Work by the public
78 | as contemplated by Affirmer's express Statement of Purpose.
79 |
80 | 3. Public License Fallback. Should any part of the Waiver for any reason
81 | be judged legally invalid or ineffective under applicable law, then the
82 | Waiver shall be preserved to the maximum extent permitted taking into
83 | account Affirmer's express Statement of Purpose. In addition, to the
84 | extent the Waiver is so judged Affirmer hereby grants to each affected
85 | person a royalty-free, non transferable, non sublicensable, non exclusive,
86 | irrevocable and unconditional license to exercise Affirmer's Copyright and
87 | Related Rights in the Work (i) in all territories worldwide, (ii) for the
88 | maximum duration provided by applicable law or treaty (including future
89 | time extensions), (iii) in any current or future medium and for any number
90 | of copies, and (iv) for any purpose whatsoever, including without
91 | limitation commercial, advertising or promotional purposes (the
92 | "License"). The License shall be deemed effective as of the date CC0 was
93 | applied by Affirmer to the Work. Should any part of the License for any
94 | reason be judged legally invalid or ineffective under applicable law, such
95 | partial invalidity or ineffectiveness shall not invalidate the remainder
96 | of the License, and in such case Affirmer hereby affirms that he or she
97 | will not (i) exercise any of his or her remaining Copyright and Related
98 | Rights in the Work or (ii) assert any associated claims and causes of
99 | action with respect to the Work, in either case contrary to Affirmer's
100 | express Statement of Purpose.
101 |
102 | 4. Limitations and Disclaimers.
103 |
104 | a. No trademark or patent rights held by Affirmer are waived, abandoned,
105 | surrendered, licensed or otherwise affected by this document.
106 | b. Affirmer offers the Work as-is and makes no representations or
107 | warranties of any kind concerning the Work, express, implied,
108 | statutory or otherwise, including without limitation warranties of
109 | title, merchantability, fitness for a particular purpose, non
110 | infringement, or the absence of latent or other defects, accuracy, or
111 | the present or absence of errors, whether or not discoverable, all to
112 | the greatest extent permissible under applicable law.
113 | c. Affirmer disclaims responsibility for clearing rights of other persons
114 | that may apply to the Work or any use thereof, including without
115 | limitation any person's Copyright and Related Rights in the Work.
116 | Further, Affirmer disclaims responsibility for obtaining any necessary
117 | consents, permissions or other rights required for any use of the
118 | Work.
119 | d. Affirmer understands and acknowledges that Creative Commons is not a
120 | party to this document and has no duty or obligation with respect to
121 | this CC0 or use of the Work.
122 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Аннотация
2 |
3 | Разрабатывайте систему передачи голоса по IP \(VoIP\) или традиционную систему АТС с Asterisk, даже если у вас только базовые знания в области телекоммуникаций. Это руководство - путеводитель, который проведет вас от установки до настройки этого open source программного обеспечения, независимо от того, обновляете ли вы существующую телефонную систему или создаете с нуля.
4 |
5 | Это обновленное пятое издание, идеально подходящее для администраторов Linux, разработчиков и опытных пользователей, показывает, как настроить АТС на основе VoIP на предприятии. Вы познакомитесь с функциями в Asterisk 16 - актуальный, на данный момент, релиз с долгосрочной поддержкой от Digium. Эта книга также включает в себя новые главы по [WebRTC](glava-20.md) и [Asterisk Real-time Interface \(ARI\)](glava-19.md).
6 |
7 | * Узнайте как WebRTC предоставляет новое направление для Asterisk
8 | * Получите знания для постройки простой, но полноценной телефонной системы
9 | * Создайте интерактивный диалплан, используя лучшие практики для расширенных возможностей Asterisk
10 | * Узнайте как ARI стал предпочтительным API для взаимодействия языков веб-разработки с Asterisk
11 |
12 | 
13 |
14 | [Содержание книги](summary.md)
15 |
16 | [Электронную версию книги можно скачать здесь](https://disk.yandex.ru/i/-H3Z8UdH-Upggg)
17 |
18 | [](https://github.com/translaster/Definitive-Guide-5th-Edition/network) [](https://github.com/translaster/Definitive-Guide-5th-Edition/stargazers)
19 |
--------------------------------------------------------------------------------
/_config.yml:
--------------------------------------------------------------------------------
1 | theme: jekyll-theme-cayman
--------------------------------------------------------------------------------
/about-the-authors.md:
--------------------------------------------------------------------------------
1 | # Об авторах
2 |
3 | **Джим Ван Меггелен** является партнером-основателем и техническим директором компании Clearly Core Inc. - канадского поставщика решений для телефонии с открытым исходным кодом. Он имеет почти 30-летний опыт работы в сфере корпоративных телекоммуникаций, обладая обширными знаниями как в области устаревших телекоммуникаций, так и в области VoIP.
4 |
5 | **Рассел Брайант** - выдающийся инженер компании Red Hat, где он работает над проектами облачной инфраструктуры. До работы в Red Hat Рассел провел семь лет работая в Digium над проектом Asterisk. Роль Рассела в Digium началась как разработчика программного обеспечения и завершилась тем, что он стал руководителем проекта Asterisk и инженером-менеджером команды, занимающейся разработкой Asterisk.
6 |
7 | **Лейф Медсен** является архитектором обеспечения облачных услуг в команде CloudOps в Red Hat, где он руководит инженерными разработками по обеспечению гарантий обслуживания как телекоммуникационных, так и корпоративных компаний. Он впервые связался с сообществом Asterisk, когда искал решение для голосовой конференции. Как только он узнал, что официальной документации Asterisk не существует - он стал соучредителем проекта Asterisk Documentation Project.
8 |
--------------------------------------------------------------------------------
/changelog.md:
--------------------------------------------------------------------------------
1 | # Важные изменения
2 |
3 | ## 15.11.19
4 |
5 | Перевел [Главу 9](glava-09.md) - Интернационализация
6 |
7 | ## 23.10.19
8 |
9 | Перевел [Главу 22](glava-22.md) - Безопасность.
10 |
11 | ## 11.10.19
12 |
13 | Перевел [Главу 10](glava-10.md), не перечитывал - возможны неточности.
14 |
15 | ## 01.10.19
16 |
17 | Перевел [Главу 19 ARI](glava-19.md), но надо будет перечитать и если что поправить.
18 |
19 | ## 26.09.19
20 |
21 | Закончил перевод [1 главы](glava-01.md).
22 |
23 | ## 25.09.19
24 |
25 | Закончил перевод [7 главы](glava-07.md), пока никуда на сторонние ресурсы не заливал.
26 |
27 | Частично переведена 10 - продолжу с ней.
28 |
29 | ## 30.08.19
30 |
31 | Закончил перевод [6 главы](glava-06.md) - доступна на [atsip.ru](http://atsip.ru/pomoshch/kniga-asterisk-4-redaktsiya/354-glava-6-osnovy-dialplana).
32 |
33 | Возьмусь за 7 и остальные понемногу.
34 |
35 | ## 26.08.19
36 |
37 | Закончил перевод [5 главы](glava-05.md), доступно на [atsip.ru](http://atsip.ru/pomoshch/kniga-asterisk-4-redaktsiya/353-glava-5-konfiguratsiya-polzovatelskikh-ustrojstv)
38 |
39 | Берусь за перевод [6 главы](glava-06.md).
40 |
41 | ## 21.08.19
42 |
43 | Залито имеющееся содержимое книги.
44 |
45 | Начал перевод 5 главы.
46 |
47 | Уже переведены:
48 |
49 | * Глава 20 - WebRTC
50 | * Глава 4 - Сертификаты безопасности для конечных точек
51 |
--------------------------------------------------------------------------------
/chapter-01.md:
--------------------------------------------------------------------------------
1 | # Глава 1. Революция в телефонии
2 |
3 | > Мы - то, за чем они растут. Это истинное бремя всех мастеров.
4 | >
5 | > – Джедай Магистр Йода
6 |
7 | Когда мы впервые решили в 2004 году написать книгу об Asterisk (15 лет назад, считая от этого издания!), мы уверенно предсказывали, что Asterisk кардинально изменит телекоммуникационную отрасль. Сегодня революция, которую мы предсказали, является частью истории. Asterisk уже несколько лет является самой успешной управленческой автоматической телефонной станцией (УАТС) в мире и является признанной технологией в телекоммуникационной отрасли.
8 |
9 | Революция, столь же необходимая, как и для телекоммуникационной индустрии того времени-значительно затихла просто потому, что методы, с помощью которых люди любят общаться, изменились. В то время как 25 лет назад телефонные звонки были предпочтительным способом общения на расстоянии, нынешняя тенденция заключается в отправке сообщений или проведении видеоконференций. Телефонный звонок воспринимается как нечто мертвое, особенно будущими поколениями. Мы еще не совсем готовы к похоронам.
10 |
11 | Asterisk остается мощной технологией, и мы считаем, что она по-прежнему является одной из лучших надежд на какую-либо разумную интеграцию между телекоммуникационными и всеми другими технологиями, с которыми могут захотеть соединиться компании. Ему необходимо будет найти свое место в коммуникационной экосистеме, которая больше не ставит телефонные звонки в важное место. Мы ожидаем, что WebRTC, который обещает коммерциализировать веб-коммуникации1, появится в качестве замены для всех подражателей, закрытых и проприетарных продуктов “сотрудничества”, которые в настоящее время наводняют (и запутывают) рынок. Asterisk может сыграть свою роль в этом новом будущем, и сообщество Asterisk охотно и с энтузиазмом взяло на себя эту новую концепцию. Итак, может быть, вам говорят, что голос мертв, но любой, кто обратил внимание на любую научную фантастику любого рода, знает, что возможность разговаривать друг с другом на больших расстояниях не будет единственной областью тех, кто печатает на клавиатурах. Люди любят поговорить, и мы будем продолжать искать способы сделать это.
12 |
13 | Следует отметить, что существует также огромное поколение людей, чьи воспоминания предшествуют интернету, и для этих людей телефон по-прежнему является очень полезной технологией. Если кто-то хочет иметь с ними дело - ему лучше хорошо справляться с телефонными звонками. Эти люди уходят с работы, но их кошельки все еще имеют много влияния. Возможно, АТС - это умирающая вещь, но ее хвост очень длинный.
14 |
15 | В этой книге мы собираемся исследовать гайки и болты Asterisk. Это гибкий, открытый, отвечающий стандартам инструментарий, который, по нашему мнению, все еще очень актуален для бизнеса сегодня и будет оставаться полезным в течение многих лет. Сила Asterisk заключается в его гибкости. Он оказался очень полезным при связывании различных типов коммуникационных технологий вместе, и если он хочет иметь какое-либо будущее - ему нужно будет продолжать это делать. Новые технологии, такие как WebRTC, предлагают всяческие возможности для будущего общения, и сообщество Asterisk очень сосредоточено на этом сдвиге парадигмы.
16 |
17 | Замечательная гибкость Asterisk имеет свою цену: она не так проста для изучения или настройки. Это не потому, что она нелогична, запутана или загадочна; напротив, это очень разумно и практично. Глаза людей загораются, когда они впервые видят диалплан Asterisk и начинают осознавать возможности. Но когда есть буквально тысячи способов достижения результата, процесс, естественно, требует дополнительных усилий. Это можно сравнить со строительством дома: компоненты относительно легко понять, но человек, рассматривающий такую задачу, должен либо а) заручиться компетентной помощью, либо б) развить необходимые навыки посредством обучения, практики и хорошей книги по этому вопросу.
18 |
19 | ## Asterisk и VoIP: преодоление разрыва между традиционной и сетевой телефонией
20 |
21 | Иногда кажется, что мы забыли, что цель телефона - позволить людям общаться. На самом деле это простая цель, и мы должны иметь возможность сделать это гораздо более гибкими и творческими способами, чем доступны нам в настоящее время. Новые технологии всегда стремятся доминировать на рынке с помощью собственного предложения. Мало кому это удается. Коммуникационные технологии должны взаимодействовать, и такие технологии как Asterisk, снижают барьеры для входа для тех, кто хочет внедрять инновации.
22 |
23 | Именно по этой причине — коммуникация — мы считаем, что будущее все еще существует для проектов телефонии с открытым исходным кодом, таких как Asterisk. Да, люди могут больше не хотеть делать “телефонные звонки”, но мы считаем, что в разговорах все еще будет ценность. Технологии, которые могут облегчить эти разговоры, иногда развиваются, казалось бы, радикальными способами, но основное желание общаться остается тем же самым.
24 |
25 | Asterisk подключен к будущему, и у него есть длинный послужной список успешной интеграции коммуникационных технологий.
26 |
27 | ### Проект телефонии Zapata
28 |
29 | Когда проект Asterisk был запущен (в 1999 году), существовали и другие проекты телефонии с открытым исходным кодом. Тем не менее, Asterisk в сочетании с проектом Zapata Telephony смогла обеспечить интерфейсы телефонной сети общего пользования (ТфОП), что стало важной вехой в переходе программного обеспечения от чего-то чисто сетевого к чему-то более практичному в мире телекоммуникаций в то время, когда он был ориентирован на ТфОП.
30 |
31 | Проект телефонии Zapata был задуман Джимом Диксоном, инженером-консультантом по телекоммуникациям, который был вдохновлен невероятными достижениями в скорости процессора, которые компьютерная индустрия теперь воспринимает как должное. Диксон считал, что гораздо более экономичные системы телефонии можно было бы создать, если бы существовала карта, на которой не было бы ничего, кроме основных электронных компонентов, необходимых для взаимодействия с телефонной линией. Вместо того, чтобы иметь дорогие компоненты на карте, цифровая обработка сигналов (DSP)2 будет обрабатываться в процессоре с помощью программного обеспечения. Хотя это наложило бы огромную нагрузку на процессор, Диксон был уверен, что низкая стоимость процессоров по сравнению с их производительностью делает их гораздо более привлекательными, чем дорогие DSP, и, что более важно, что соотношение цены и производительности будет продолжать улучшаться по мере увеличения мощности процессоров.
32 |
33 | Как и многие провидцы, Диксон верил, что многие другие увидят эту возможность и ему просто нужно подождать, пока кто-то другой создаст то, что для него было очевидным улучшением. Через несколько лет он заметил, что не только никто не создавал эти карты, но и казалось маловероятным, что кто-то когда-нибудь собирался. В тот момент было ясно, что если он хочет революции, то должен начать ее сам. Так родился проект телефонии Zapata:
34 |
35 | > Поскольку эта концепция была настолько революционной, что наверняка вызвала бы много волн в индустрии, я выбрал мексиканский революционный мотив и назвал технологию и организацию в честь знаменитого мексиканского революционера Эмилиано Сапаты. Я решил назвать карту "tormenta“, что по-испански означает ”шторм”, но в контексте оно обычно используется для обозначения большого шторма, такого как ураган или что-то подобное.
36 |
37 | Возможно, нам следует называть себя Asteristas. Несмотря на это, мы должны поблагодарить Джима Диксона, частично за то, что он придумал это и частично за то, что довел до конца, но в основном за то, что дал результаты своих усилий сообществу с открытым исходным кодом. В результате вклада Джима появился двигатель ТфОП Asterisk. И благодаря этому сочетанию VoIP и ТфОП родилась телекоммуникационная революция с открытым исходным кодом!
38 |
39 | За прошедшие годы интерфейс телефонии Zapata в Asterisk был изменен и улучшен. Телефония Digium Asterisk Hardware Device Interface (DAHDI), используемая сегодня, является детищем вклада Джима Диксона.
40 |
41 | ## Массовые изменения требуют гибкости технологий
42 |
43 | Каждая существующая АТС страдает от недостатков. Независимо от того, насколько полнофункциональной она является, что-то всегда будет упущено, потому что даже самая многофункциональная АТС не сможет предвидеть творчество клиента. Небольшая группа пользователей захочет иметь странную маленькую функцию, о которой проектная группа либо не думала, либо не могла оправдать стоимость её создания, и, поскольку система закрыта - пользователи не смогут создать ее сами.
44 |
45 | Если бы интернет был таким образом затруднен регулированием и коммерческими интересами - сомнительно, что он получил бы широкое признание, которым пользуется в настоящее время. Открытость интернета означала, что любой желающий мог позволить себе принять в нем участие. Так что все так и сделали. Десятки тысяч умов, которые сотрудничали в создании интернета, принесли то, что ни одна корпорация в одиночку никогда не смогла бы получить3.
46 |
47 | Как и во многих других проектах с открытым исходным кодом (как Linux, так и множество важного программного обеспечения, работающего в интернете), разработка Asterisk была подпитана мечтами людей, которые знали, что должно быть что-то большее, чем то, что производят традиционные отрасли. Эти люди знали, что если бы можно было взять лучшие части различных АТС и разделить их на взаимосвязанные компоненты - подобно коробке с кирпичиками LEGO, можно было бы начать понимать вещи, которые не переживут традиционный корпоративный процесс анализа рисков.
48 |
49 | Сама Asterisk стала основой многих массово производимых творений. И все же, под капотом, душа этого проекта остается с открытым исходным кодом.
50 |
51 | ## Asterisk: хакерская УАТС
52 |
53 | Asterisk является основной АТС хакера. Термин _хакер_, был искажен средствами массовой информации в значении “злостный взломщик” для необразованных. Это прискорбно, потому что термин фактически существовал задолго до того, как СМИ испортили его значение. Хакеры создали сетевой движок, который стал интернетом. Хакеры создали Apple Macintosh и операционную систему Unix. Хакеры также строят свою следующую телекоммуникационную систему. Да, некоторые из этих людей являются злостными, но умы, которые управляют разработкой Asterisk, хорошо знают об этом, и вы обнаружите, что Asterisk позволяет создавать систему, которая способна довольно быстро реагировать на угрозы безопасности. Программное обеспечение с открытым исходным кодом не скрывает свои недостатки за корпоративными отделами. Грязь вытаскивают на открытое место, где с ней можно справиться. Вместо того чтобы ограничиваться сомнительной и часто плохой безопасностью закрытых систем - сообщество Asterisk быстро реагирует на меняющиеся тенденции в области безопасности, и вы сможете точно настроить свою телефонную систему в соответствии с корпоративной политикой и лучшими отраслевыми практиками.
54 |
55 | Как и другие системы с открытым исходным кодом, Asterisk сможет превратиться в гораздо более безопасную платформу, чем любая проприетарная система, несмотря на свои хакерские корни, а скорее даже благодаря им.
56 |
57 | ## Asterisk: профессиональная УАТС
58 |
59 | Asterisk - это технология поддержки, и, как и в случае с Linux, все реже можно найти предприятие, которое не запускает какую-либо версию Asterisk, в каком-то качестве в своей сети, решая проблему так, как может только Asterisk. Вы уже используете Asterisk, даже если об этом не знаете.
60 |
61 | ## Сообщество Asterisk
62 |
63 | Нет смысла ходить вокруг да около: сообщество Asterisk - это тень его прежнего "я". Десять лет назад Asterisk была самой крутой вещью с открытым исходным кодом. Сегодня большинство энтузиастов двинулись дальше. Однако остается опытное и проверенное в боях сообщество профессионалов, которые были там и сделали это.
64 |
65 | Не ждите от команды людей, готовых бесплатно работать над вашими проектами. Цена вступления в это сообщество - личная заинтересованность в развитии навыков. Если вы обратитесь к сообществу с наглостью - вам не понравятся ответы. Однако если вы проявите любопытство, энтузиазм и желание погрузиться в работу, запачкать руки и заняться ею, то найдете сообщество, более чем готовое поделиться с вами своими трудами и добытыми знаниями.
66 |
67 | Ниже приведены некоторые из мест, где обитает сообщество Asterisk.
68 |
69 | ### Дискусионный сайт сообщества Asterisk
70 |
71 | В 2015 году Asterisk переместила свои официальные форумы на [https://](https://community.asterisk.org/)[community.asterisk.org/](https://community.asterisk.org/). Похоже, что это самое активное сообщество сейчас, и отношение сигнал/шум отличное. Сотрудники Digium хорошо справляются с этой задачей, и некоторые из их старших и опытных людей принимают активное участие.
72 |
73 | Имейте в виду, что это не похоже на платную поддержку. От вас ожидают, что вы будете выполнять работу самостоятельно, но вы можете рассчитывать на получение хороших качественных советов, которые направят вас в правильном направлении.
74 |
75 | ### Списки рассылки Asterisk
76 |
77 | Активность в этих списках сократилась до минимума (с сотен сообщений в день до, возможно, дюжины потоков в месяц). Они, вероятно, наиболее полезны в качестве исторического архива, но, возможно, стоит туда обратиться когда вы сталкиваетесь с неразрешимой проблемой. Списки рассылки вы найдете по адресу [lists.digium.com](http://lists.digium.com/), эти два, вероятно, будут наиболее полезными:
78 |
79 | *Asterisk-Users*
80 |
81 | Этот список-тень его прежнего себя. В то время как раньше он генерировал несколько сотен сообщений в день, большая часть этого трафика переместилась на сайт сообщества Digium Asterisk (выше).
82 |
83 | *Asterisk-Dev*
84 |
85 | Разработчики Asterisk тусуются здесь. Целью и направленностью этого списка является обсуждение разработки программного обеспечения Asterisk, и участники активно защищают эту цель. Ожидайте много гнева, если опубликуете что-либо в этом списке, не относящееся конкретно к программированию или разработке базы кода Asterisk. Общие вопросы кодирования (такие как запросы о взаимодействии с AGI или AMI) должны быть направлены в список *Asterisk-Users*.
86 |
87 |
88 |
89 |
90 | Список Asterisk-Dev не является поддержкой второго уровня! Если вы прокрутите архивы списков рассылки, то увидите, что это строгое правило. Список рассылки Asterisk-Dev посвящен обсуждению основных разработок Asterisk, а вопросы по взаимодействию с внешними программами через AGI или AMI должны быть размещены в списке Asterisk-Users.
91 | |
92 |
93 |
94 |
95 | ### Сайт Asterisk Wiki
96 |
97 | Это не совсем тусовка сообщества, но она заслуживает упоминания. Digium поддерживает Вики для Asterisk по адресу [wiki.asterisk.org](http://wiki.asterisk.org/), этот сайт постоянно обновляется командой Digium, и автоматизированные скрипты экспортируют документацию на основе XML из источников Asterisk в саму Вики, что помогает гарантировать актуальность данных.
98 |
99 | Более старая Вики существует по адресу [www.voip-info.org](http://www.voip-info.org/), что в наши дни является своего рода историческим курьезом и источником большого просветления и путаницы. Хотя здесь содержится огромное количество информации, большая ее часть устарела. Мы включаем ссылку на неё здесь просто потому, что вы, вероятно, попадёте на неё в один прекрасный день и подумаете что попали в материнскую жилу, но то, что вы на самом деле нашли, больше похоже на музей исторических странностей: увлекательно, но необязательно актуально.
100 |
101 | ### IRC-каналы
102 |
103 | Сообщество Asterisk поддерживает каналы Internet Relay Chat (IRC) на _irc.freenode.net_. Двумя наиболее активными каналами являются _#asterisk_ и _#asterisk-dev_4. Чтобы сократить количество вторжений спам-ботов, оба этих канала требуют регистрации для присоединения. Чтобы зарегистрироваться, запустите `/msg nickserv help` при подключении к службе через ваш любимый IRC-клиент.
104 |
105 | ## Вывод
106 |
107 | Так с чего начать? Что ж, когда речь заходит об Asterisk, можно говорить гораздо больше, чем мы можем вписать в одну книгу. Эта книга может только заложить основы, но из этого фундамента вы сможете прийти к пониманию концепции Asterisk - и из этого, кто знает, что вы будете строить?
108 |
109 |
110 | - И, возможно, еще, учитывая, что WebRTC также революционизирует нативные приложения!
111 |
112 | - Термин DSP также означает цифровой сигнальный процессор, который представляет собой устройство (обычно чип), способное интерпретировать и изменять сигналы различных видов. В голосовой сети DSP в первую очередь отвечают за кодирование, декодирование и перекодирование аудиоинформации. Это может потребовать много вычислительных усилий.
113 |
114 | - Мы понимаем, что технология интернета сформировалась из государственных и академических институтов, но то, о чем мы здесь говорим - это не столько технология интернета, сколько культурный феномен его, который взорвался в начале 90-х годов.
115 |
116 | - Канал #asterisk-dev. предназначен для обсуждения изменений в базовой кодовой базе Asterisk и также не является поддержкой второго уровня. Обсуждения, связанные с программированием внешних приложений, которые взаимодействуют с Asterisk через AGI или AMI, должны быть в #asterisk.
117 |
118 |
119 | [Предисловие](preface.md) | [Содержание](summary.md) | [Глава 2. Архитектура Asterisk](chapter-02.md)
120 |
--------------------------------------------------------------------------------
/chapter-02_html_3be5e199378a3618.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/translaster/Definitive-Guide-5th-Edition/bb992f52da16d3fc91845b39aca65de175189294/chapter-02_html_3be5e199378a3618.png
--------------------------------------------------------------------------------
/chapter-02_html_5d7740068e6bed33.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/translaster/Definitive-Guide-5th-Edition/bb992f52da16d3fc91845b39aca65de175189294/chapter-02_html_5d7740068e6bed33.png
--------------------------------------------------------------------------------
/chapter-02_html_a3840d58b3bba40d.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/translaster/Definitive-Guide-5th-Edition/bb992f52da16d3fc91845b39aca65de175189294/chapter-02_html_a3840d58b3bba40d.png
--------------------------------------------------------------------------------
/colophon.md:
--------------------------------------------------------------------------------
1 | # Послесловие
2 |
3 | Животное на обложке _Asterisk: Окончательное руководство_ является морской звездой (_Asteroidea_), группа иглокожих (иглокожие беспозвоночные, встречающиеся только в море). Большинство морских звезд имеют пятикратную радиальную симметрию (плечи или лучи, ответвляющиеся от центрального диска тела кратны пяти), хотя некоторые виды имеют четыре или девять плеч. Существует более 1500 видов морских звезд.
4 |
5 | Морские звезды живут на морском дне и в приливных бассейнах, цепляясь за скалы и передвигаясь (медленно), используя сосудистую систему на водной основе, чтобы манипулировать сотнями крошечных трубчатых ног, называемых _подиями_. Маленькая луковица или _ампула_ в верхней части трубки сжимается, выталкивая воду и расширяя ногу морской звезды. Ампула расслабляется и нога втягивается. На кончике каждой ножки находится присоска, которая позволяет морской звезде вскрывать раковины моллюсков, устриц или мидий. Морские звезды - плотоядные животные, они едят кораллы, рыбу, двустворчатых моллюсков и улиток.
6 |
7 | Морские звезды могут сгибать и манипулировать своими руками, чтобы поместиться в небольших местах. В конце каждой руки находится глазок, примитивный датчик, который обнаруживает свет и помогает морской звезде определить направление. Морские звезды также обладают способностью регенерировать отсутствующую конечность. Некоторые виды могут даже вырастить полную, новую морскую звезду из отрубленной руки.
8 |
9 | Многие животные на обложках О'Рейли находятся под угрозой исчезновения; все они важны для мира. Иллюстрация обложки - Карен Монтгомери, основанная на черно-белой гравюре из _Дуврского живописного архива_. Шрифты обложки - Gilroy Semibold и Guardian Sans. Шрифт текста в Adobe Minion Pro; шрифт заголовка является Adobe Myriad Condensed; и шрифт кода Далтона Маага - Ubuntu Mono.
10 |
11 | [Об авторах](about-the-authors.md) | [Содержание](SUMMARY.md) |
--------------------------------------------------------------------------------
/foreword.md:
--------------------------------------------------------------------------------
1 | # Вступление
2 |
3 | Когда мы рассматривали предисловие к каждому изданию этой книги - у нас всегда было больше людей, от которых мы хотели бы получить вклад, чем страниц, которые мы могли бы выделить. В этом пятом издании мы снова попросили избранную группу людей из сообщества Asterisk написать несколько слов об Asterisk с их точки зрения.
4 |
5 | ## Джошуа Кольп (Старший разработчик программного обеспечения, Sangoma/Digium)
6 |
7 | Более 15 лет назад я загрузил Asterisk на свой ноутбук и сделал свой первый VoIP-звонок с помощью IAX2 на АТС Digium. Я затаил дыхание в предвкушении, ожидая услышать голос, пока, наконец, звук Эллисон не раздался из моего ноутбука. В этот момент я понял, что в Asterisk есть что-то особенное. Это зажгло во мне искру интереса и воображения: мой ноутбук действительно сделал звонок! Осознание того, что всего лишь с небольшим усилием я могу принимать звонки и делать с ними то, что захочу, вызывало привыкание и возбуждение — чувство, разделяемое многими и по сей день.
8 |
9 | Сегодня Asterisk сильно отличается от того, что было в то время. В прошлом она была в первую очередь ориентирован на то, чтобы быть АТС. Она обладала всеми этими особенностями и продолжала приобретать новые, чтобы продвинуться дальше в эту область. Однако со временем проект эволюционировал до такой степени, что Asterisk - это инструментарий, который можно использовать отдельно или в сочетании с другими проектами для создания вещей. Она существует для того, чтобы вызвать вопрос "Могу ли я это сделать?" - в твоем сознании и позволить тебе увидеть все до конца.
10 |
11 | Этот простой вопрос - то, что движет многими решениями, принятыми в отношении Asterisk и ее направления. “Правильно ли это для пользователей?", "Неужели это то, что действительно нужно людям?", “Разве это ломает вещи?" "и “Могут ли они построить то, что они хотят с этим?" Вместе эти вопросы помогают гарантировать, что люди смогут реализовать свои идеи. Что меня сегодня волнует в Asterisk — видеть, как люди используют инструменты для создания чего-то нового без помех.
12 |
13 | Я думаю, что в дальнейшем это будет продолжаться и для Asterisk. Она будет продолжать добавлять новые инструменты и функциональные возможности, для обеспечения большей гибкости и возможности для этих строительных вещей, уважая при этом свое наследие и то, как пользователи уже используют его. Она будет продолжать оставаться частью более крупных и лучших решений, некоторые из которых, возможно, даже не придут в голову сейчас. Мы сделали всего несколько шагов вперед и нам еще многое предстоит сделать.
14 |
15 | Я призываю новых и старых пользователей Asterisk пересмотреть то, что может сделать Asterisk, изучить новые функции, которые были добавлены, и создать что-то новое и захватывающее из вашего обычного набора навыков. Если вы попали в тупик, где Asterisk не может сделать то, что вам нужно - тогда участвуйте в проекте и вносите свой вклад. Помогите другим, кто, возможно, пытается сделать то же самое. Станьте не просто тем, кто использует Asterisk, но и тем, кто помогает другим реализовать свою мечту.
16 |
17 | ## Дэн Дженкинс (Основатель компании Nimble Ape Ltd)
18 |
19 | Asterisk был моей первой вылазкой в мир open source телефонии, и как веб-разработчик я обнаружил, что она сильно отличается от того, к чему я привык, исходя из веб-индустрии. С тех пор проект Asterisk продвинулся вперед, и теперь он включает в себя множество API и технологий, которые типичный веб-разработчик привык ожидать. Включение WebRTC и Asterisk Rest Interface имеет жизненно важное значение для интеграции с разработчиками, используемыми для построения веб-платформы. Asterisk — это то, вокруг чего я в конечном итоге построил свой бизнес - это действительно замечательная часть программного обеспечения, и у нее есть блестящее сообщество людей, которые её используют и улучшают. Мне было очень приятно быть частью этого сообщества и корректировать эту книгу для будущего сообщества.
20 |
21 | ## Джойс Уилмот (Старший веб-разработчик)
22 |
23 | Я познакомился с Asterisk в 2012 году, когда работал в Voicenation - компании, предоставляющей прямой автоответчик 24/7/365 для тысяч клиентов. В то время колл-центр быстро перерастал стороннее программное обеспечение, которое они использовали. Не найдя гибкого и экономичного решения для своего быстрорасширяющегося колл-центра, Voicenation решила что им необходимо создать собственное программное обеспечение для колл-центра. Мне была поставлена задача создания такого программного обеспечения, с которой началось мое путешествие с Asterisk. То, что начиналось как монументальная задача (поскольку у меня не было предыдущего опыта IP-телефонии), быстро стало очарованием Asterisk, когда я обнаружил, как она упростила нашу установку, не жертвуя мощностью и гибкостью.
24 |
25 | Перенесемся на девять лет вперед и десятки миллионов звонков спустя, а Asterisk по-прежнему верно и надежно управляет нашим колл-центром. Это было мое первое знакомство с программным обеспечением с открытым исходным кодом. Очевидно, что Asterisk - это история успеха open source, которая иллюстрирует, как программное обеспечение с открытым исходным кодом подпитывает предпринимательство — и как предпринимательство, в свою очередь, подпитывает развитие и совершенствование программного обеспечения с открытым исходным кодом. Я очень рад быть частью этого цикла и с нетерпением жду возможности стать частью сообщества, поскольку Asterisk постоянно развивается, чтобы идти в ногу с постоянно меняющимся миром телекоммуникаций.
26 |
27 | ## Мэтт Florell (Основатель VICIdial)
28 |
29 | Мое первое знакомство с open source телефонией еще в 2001 году было на самом деле не с Asterisk. Оно состоялось с другим программным пакетом и заняло у меня пару месяцев, чтобы начать работать, используя простой IVR для регистрации запросов на контакт с моим работодателем, в то время. Это была не простая система для работы или модификация, поэтому я не делал с ней ничего другого, кроме того первого проекта IVR. Два года спустя я получил от одного клиента просьбу построить гораздо более сложную телефонную систему, которая требовала бы взаимодействия пользователей через компьютер. Я знал, что платформа, которую я использовал, не будет работать для такого проекта, поэтому я посмотрел на коммерческие и открытые варианты. Именно тогда я узнал об Asterisk, которая выглядела как идеальная платформа для этого проекта. Я купил карту T1, с помощью которой можно было провести некоторые тесты и в течение двух часов после ее прибытия я настроил ее и смог воспроизвести старый проект, на создание которого у меня ушло два месяца. После этого я попался на крючок. Проект VICIdial Open-Source Contact Center вырос из этого проекта; на сегодняшний день более 100 000 систем Asterisk были установлены в составе кластеров VICIdial, и это только те, о которых мы знаем.
30 |
31 | Asterisk сильно отличался от большинства веб-пакетов с открытым исходным кодом, с которыми я работал в прошлом, и у него было довольно много причуд и ошибок в более ранние дни, которые нам приходилось обходить (иногда довольно творчески). Но более поздний опыт работы с веткой Asterisk 13 показал значительные улучшения как в производительности, так и в стабильности по сравнению с более ранними ветками. Кроме того, было добавлено много новых функций, позволивших нам добавить новые функциональные возможности в наш пакет VICIdial. Две из них - это возможность приостанавливать записи вызовов и добавление нескольких уровней регистрации нового носителя SIP.
32 |
33 | Еще в 2003 году, когда я начал использовать Asterisk, настоящих “релизов" не было. Вы должны были найти стабильную сборку из одной из последних версий CVS и протестировать ее. С течением времени развитие и обслуживание различных отраслей стало намного более стабильным, а использование Asterisk в производственных системах по всему миру резко возросло. Сегодня Asterisk - это телефонное ядро тысяч различных предложений услуг, через которое ежедневно проходят миллиарды телефонных звонков. Оно устанавливается на самые разнообразные аппаратные средства, от крошечных встроенных систем до серверных ферм с сотнями мощных машин. В настоящее время миллионы людей, ежедневно использующих Asterisk, понятия не имеют, что они взаимодействуют с частью программного обеспечения с открытым исходным кодом.
34 |
35 | Только среди нашей клиентской базы есть несколько компаний из списка Fortune 500, а также школьные округа, общественные клубы, политические организации, муниципальные службы экстренной помощи и, конечно же, тысячи различных видов коммерческих организаций. В то время как низкая стоимость приобретения является распространенной причиной для использования решения на основе Asterisk, мы часто слышим, что тот факт, что это открытый исходный код - является большим плюсом, а также отсутствие возможности блокировки источника. Один из наших крупных клиентов даже назвал использование программного обеспечения для телефонии с открытым исходным кодом “явным стратегическим преимуществом” по сравнению с конкурентами из-за гибкости систем и их способности самостоятельно управлять ими без необходимости полагаться на внешних источников. Судя по тому, что я видел до сих пор, будущее Asterisk - это постоянно растущая установленная база и постоянные усовершенствования. Я с нетерпением жду возможности поработать с ним еще как минимум 16 лет.
36 |
37 | ## Мэтт Фредриксон (Директор Asterisk Engineering, Sangoma/Digium)
38 |
39 | У меня была возможность работать с Asterisk в течение последних 18 лет и я видел, как он вырос из небольшого проекта с одним или двумя людьми в нечто, что имеет свою собственную жизнь с сотнями участников. Удивительно видеть, сколько разных мест он нарушил традиционные телекоммуникации - дома, в офисе и на предприятии. По мере того как традиционные модели коммуникации меняются, проект Asterisk продолжает оставаться там, где он делает это лучше всего — наводя мосты между старыми формами коммуникации и новыми и раздвигая границы того, что можно сделать с новыми. Эта книга поможет вам увидеть самое современное лицо Asterisk и узнать как лучше использовать его в своей телекоммуникационной инфраструктуре. Огромное спасибо Джиму Ван Меггелену за всю тяжелую работу по составлению этого самого последнего издания.
40 |
41 | [Аннотация](README.md) | [Содержание](SUMMARY.md) | [Предисловие](preface.md)
42 |
--------------------------------------------------------------------------------
/glava-01.md:
--------------------------------------------------------------------------------
1 | # Глава 1. Революция в телефонии
2 |
3 | > Мы - то, за чем они растут. Это истинное бремя всех мастеров.
4 | >
5 | > Джедай Магистр Йода
6 |
7 | Когда мы впервые решили в 2004 году написать книгу о Asterisk (15 лет назад, начиная с этого издания!), мы уверенно предсказывали, что Asterisk кардинально изменит телекоммуникационную отрасль. Сегодня революция, которую мы предсказали, является частью истории. Asterisk уже несколько лет является самой успешной частной отраслевой биржей (УАТС) в мире и является признанной технологией в телекоммуникационной отрасли.
8 |
9 | Революция—столь же необходимая, как и для телекоммуникационной индустрии того времени-значительно затихла просто потому, что методы, с помощью которых люди любят общаться, изменились. В то время как 25 лет назад телефонные звонки были предпочтительным способом общения на расстоянии, нынешняя тенденция заключается в отправке сообщений или проведении видеоконференций. Телефонный звонок воспринимается как нечто мертвое, особенно будущими поколениями. Мы еще не совсем готовы к похоронам.
10 |
11 | Asterisk остается мощной технологией, и мы считаем, что она по-прежнему является одной из лучших надежд на какую-либо разумную интеграцию между телекоммуникационными и всеми другими технологиями, с которыми могут захотеть соединиться компании. Ему необходимо будет найти свое место в коммуникационной экосистеме, которая больше не ставит телефонные звонки в важное место. Мы ожидаем, что WebRTC,который обещает коммерциализировать веб-коммуникации1, появится в качестве замены для всех подражателей, закрытых и проприетарных продуктов “сотрудничества”, которые в настоящее время наводняют \(и запутывают\) рынок. Asterisk может сыграть свою роль в этом новом будущем, и сообщество Asterisk охотно и с энтузиазмом взяло на себя эту новую концепцию. Итак, может быть, вам говорят, что голос мертв, но любой, кто обратил внимание на любую научную фантастику любого рода, знает, что возможность разговаривать друг с другом на больших расстояниях не будет единственной областью тех, кто печатает на клавиатурах. Люди любят поговорить, и мы будем продолжать искать способы сделать это.
12 |
13 | Следует отметить, что существует также огромное поколение людей, чьи воспоминания предшествуют интернету, и для этих людей телефон по-прежнему является очень полезной технологией. Если кто-то хочет иметь с ними дело, ему лучше хорошо справляться с телефонными звонками. Эти люди уходят с работы, но их кошельки все еще имеют много влияния. Возможно, АТС-это умирающая вещь, но ее хвост очень длинный.
14 |
15 | В этой книге мы собираемся исследовать гайки и болты Asterisk. Это гибкий, открытый, отвечающий стандартам инструментарий, который, по нашему мнению, все еще очень актуален для бизнеса сегодня и будет оставаться полезным в течение многих лет. Сила Asterisk заключается в его гибкости. Он оказался очень полезным при связывании различных типов коммуникационных технологий вместе, и если он хочет иметь какое-либо будущее, ему нужно будет продолжать это делать. Новые технологии, такие как WebRTC, предлагают всевозможные возможности для будущего общения, и сообщество Asterisk очень сосредоточено на этом сдвиге парадигмы.
16 |
17 | Замечательная гибкость Asterisk имеет свою цену: это не простая система для изучения или настройки. Это не потому, что это нелогично, запутанно или загадочно; напротив, это очень разумно и практично. Глаза людей загораются, когда они впервые видят диалплан Asterisk и начинают осознавать возможности. Но когда есть буквально тысячи способов достижения результата, процесс, естественно, требует дополнительных усилий. Возможно, это можно сравнить со строительством дома: компоненты относительно легко понять, но человек, рассматривающий такую задачу, должен либо а) заручиться компетентной помощью, либо б) развить необходимые навыки посредством обучения, практики и хорошей книги по этому вопросу.
18 |
19 | ## Asterisk и VoIP: преодоление разрыва между традиционной и сетевой телефонией
20 |
21 | Иногда кажется, что мы забыли, что цель телефона-позволить людям общаться. На самом деле это простая цель, и мы должны иметь возможность сделать это гораздо более гибкими и творческими способами, чем в настоящее время доступны нам. Новые технологии всегда стремятся доминировать на рынке с помощью собственного предложения. Мало кому это удается. Коммуникационные технологии должны взаимодействовать, и такие технологии, как Asterisk, снижают барьеры для входа для тех, кто хочет внедрять инновации.
22 |
23 | Именно по этой причине—коммуникация—мы считаем, что будущее все еще существует для проектов телефонии с открытым исходным кодом, таких как Asterisk. Да, люди могут больше не хотеть делать ”телефонные звонки", но мы считаем, что в разговорах все еще будет ценность. Технологии, которые могут облегчить эти разговоры, могут развиваться, казалось бы, радикальными способами, но основное желание общаться остается тем же самым.
24 |
25 | Asterisk подключен к будущему, и у него есть длинный послужной список успешной интеграции коммуникационных технологий.
26 |
27 | ### Проект телефонии Zapata
28 |
29 | Когда проект Asterisk был запущен (в 1999 году), существовали и другие проекты телефонии с открытым исходным кодом. Тем не менее, Asterisk в сочетании с проектом Zapata Telephony смогла обеспечить интерфейсы телефонной сети общего пользования (ТфОП), что стало важной вехой в переходе программного обеспечения от чего-то чисто сетевого к чему-то более практичному в мире телекоммуникаций в то время, когда он был ориентирован на ТфОП.
30 |
31 | Проект телефонии Zapata был задуман Джимом Диксоном, инженером-консультантом по телекоммуникациям, который был вдохновлен невероятными достижениями в скорости процессора, которые компьютерная индустрия теперь воспринимает как должное. Диксон считал, что гораздо более экономичные системы телефонии можно было бы создать, если бы существовала карта, на которой не было бы ничего, кроме основных электронных компонентов, необходимых для взаимодействия с телефонной линией. Вместо того, чтобы иметь дорогие компоненты на карте, цифровая обработка сигналов (DSP)2 будет обрабатываться в процессоре с помощью программного обеспечения. Хотя это наложило бы огромную нагрузку на процессор, Диксон был уверен, что низкая стоимость процессоров по сравнению с их производительностью делает их гораздо более привлекательными, чем дорогие DSP, и, что более важно, что это соотношение цены и производительности будет продолжать улучшаться по мере увеличения мощности процессоров.
32 |
33 | Как и многие провидцы, Диксон верил, что многие другие увидят эту возможность, и ему просто нужно подождать, пока кто-то другой создаст то, что для него было очевидным улучшением. Через несколько лет он заметил, что не только никто не создавал эти карты, но и казалось маловероятным, что кто-то когда-нибудь собирался. В тот момент было ясно, что если он хочет революции, то должен начать ее сам. Так родился проект телефонии Zapata:
34 |
35 | > Поскольку эта концепция была настолько революционной, что наверняка вызвала бы много волн в индустрии, я выбрал мексиканский революционный мотив и назвал технологию и организацию в честь знаменитого мексиканского революционера Эмилиано Сапаты. Я решил назвать карту "tormenta“, что по-испански означает” шторм", но в контексте оно обычно используется для обозначения большого шторма, такого как ураган или что-то подобное.
36 |
37 | Возможно, нам следует называть себя Asteristas. Несмотря на это, мы должны поблагодарить Джима Диксона, частично за то, что он придумал это и частично за то, что довел это до конца, но в основном за то, что дал результаты своих усилий сообществу с открытым исходным кодом. В результате вклада Джима появился двигатель ТфОП Asterisk. И благодаря этому сочетанию VoIP и ТфОП родилась телекоммуникационная революция с открытым исходным кодом!
38 |
39 | За прошедшие годы интерфейс телефонии Zapata в Asterisk был изменен и улучшен. Телефония Digium Asterisk Hardware Device Interface (DAHDI), используемая сегодня, является детищем вклада Джима Диксона.
40 |
41 | ## Массовые изменения требуют гибкости технологий
42 |
43 | Каждая существующая АТС страдает от недостатков. Независимо от того, насколько полнофункциональной она является, что-то всегда будет упущено, потому что даже самая многофункциональная АТС не сможет предвидеть творчество клиента. Небольшая группа пользователей захочет иметь странную маленькую функцию, о которой проектная группа либо не думала, либо не могла оправдать стоимость её создания, и, поскольку система закрыта, пользователи не смогут создать ее сами.
44 |
45 | Если бы интернет был таким образом затруднен регулированием и коммерческими интересами, сомнительно, что он получил бы широкое признание, которым пользуется в настоящее время. Открытость интернета означала, что любой желающий мог позволить себе принять в нем участие. Так что все так и сделали. Десятки тысяч умов, которые сотрудничали в создании интернета, принесли то, что ни одна корпорация в одиночку никогда не смогла бы получить3.
46 |
47 | Как и во многих других проектах с открытым исходным кодом (как Linux и так множество важного программного обеспечения, работающего в интернете), разработка Asterisk была подпитана мечтами людей, которые знали, что должно быть что-то большее, чем то, что производят традиционные отрасли. Эти люди знали, что если бы можно было взять лучшие части различных АТС и разделить их на взаимосвязанные компоненты - подобно коробке с кирпичиками LEGO, можно было бы начать понимать вещи, которые не переживут традиционный корпоративный процесс анализа рисков.
48 |
49 | Сама Asterisk стала основой многих массово производимых творений. И все же, под капотом, душа этого проекта остается с открытым исходным кодом.
50 |
51 | ## Asterisk: хакерская УАТС
52 |
53 | Asterisk является основной АТС хакера. Термин _хакер_, был искажен средствами массовой информации в значении “злостный взломщик” для необразованных. Это прискорбно, потому что термин фактически существовал задолго до того, как СМИ испортили его значение. Хакеры создали сетевой движок, который стал интернетом. Хакеры создали Apple Macintosh и операционную систему Unix. Хакеры также строят свою следующую телекоммуникационную систему. Да, некоторые из этих людей являются злостными, но умы, которые управляют разработкой Asterisk, хорошо знают об этом, и вы обнаружите, что Asterisk позволяет создавать систему, которая гораздо более способна быстро реагировать на угрозы безопасности. Программное обеспечение с открытым исходным кодом не скрывает свои недостатки за корпоративными отделами. Грязь вытаскивают на открытое место, где с ней можно справиться. Вместо того чтобы ограничиваться сомнительной и часто плохой безопасностью закрытых систем, сообщество Asterisk быстро реагирует на меняющиеся тенденции в области безопасности, и вы сможете точно настроить свою телефонную систему в соответствии с корпоративной политикой и лучшими отраслевыми практиками.
54 |
55 | Как и другие системы с открытым исходным кодом, Asterisk сможет превратиться в гораздо более безопасную платформу, чем любая проприетарная система, несмотря на свои хакерские корни, а скорее даже благодаря им.
56 |
57 | ## Asterisk: профессиональная УАТС
58 |
59 | Asterisk - это технология поддержки, и, как и в случае с Linux, все реже можно найти предприятие, которое не запускает какую-либо версию Asterisk, в каком-то качестве, где-то в сети, решая проблему так, как может только Asterisk. Вы уже используете Asterisk, даже если вы этого не знаете.
60 |
61 | ## Сообщество Asterisk
62 |
63 | Нет смысла ходить вокруг да около: сообщество Asterisk - это тень его прежнего "я". Десять лет назад Asterisk была самой крутой вещью с открытым исходным кодом. Сегодня большинство энтузиастов двинулись дальше. Однако остается опытное и проверенное в боях сообщество профессионалов, которые были там и сделали это.
64 |
65 | Не ждите от команды людей, готовых бесплатно работать над вашими проектами. Цена вступления в это сообщество - личная заинтересованность в развитии навыков. Если вы принесете чувство права в это сообщество - вам не понравятся ответамы. Однако если вы проявите любопытство, энтузиазм и желание погрузиться в работу, запачкать руки и заняться ею, то найдете сообщество, более чем готовое поделиться с вами своими трудами и добытыми знаниями.
66 |
67 | Ниже приведены некоторые из мест, где обитает сообщество Asterisk.
68 |
69 | ### Дискусионный сайт сообщества Asterisk
70 |
71 | В 2015 году Asterisk переместила свои официальные форумы на [https://community.asterisk.org/](https://community.asterisk.org/). Похоже, что это самое активное сообщество сейчас, и отношение сигнал/шум отличное. Сотрудники Digium хорошо справляются с этой задачей, и некоторые из их старших и опытных людей принимают активное участие.
72 |
73 | Имейте в виду, что это не похоже на платную поддержку. От вас ожидают, что вы будете выполнять работу самостоятельно, но вы можете рассчитывать на получение хороших качественных советов, которые направят вас в правильном направлении.
74 |
75 | ### Списки рассылки Asterisk
76 |
77 | Активность в этих списках сократилась до минимума (с сотен сообщений в день до, возможно, дюжины потоков в месяц). Они, вероятно, наиболее полезны в качестве исторического архива, но, возможно, стоит туда обратиться когда вы сталкиваетесь с неразрешимой проблемой. Списки рассылки вы найдете по адресу [lists.digium.com](http://lists.digium.com/), эти два, вероятно, будут наиболее полезными:
78 |
79 | _Asterisk-Users_
80 |
81 | Этот список-тень его прежнего себя. В то время как раньше он генерировал несколько сотен сообщений в день, большая часть этого трафика переместилась на сайт сообщества Digium Asterisk (выше).
82 |
83 | _Asterisk-Dev_
84 |
85 | Разработчики Asterisk тусуются здесь. Целью и направленностью этого списка является обсуждение разработки программного обеспечения Asterisk, и участники активно защищают эту цель. Ожидайте много гнева, если опубликуете что-либо в этом списке, не относящееся конкретно к программированию или разработке базы кода Asterisk. Общие вопросы кодирования (такие как запросы о взаимодействии с AGI или AMI) должны быть направлены в список _Asterisk-Users_.
86 |
87 |
88 |
89 |
90 | Список Asterisk-Dev не является поддержкой второго уровня! Если вы прокрутите архивы списков рассылки, то увидите, что это строгое правило. Список рассылки Asterisk-Dev посвящен обсуждению основных разработок Asterisk, а вопросы по взаимодействию с внешними программами через AGI или AMI должны быть размещены в списке Asterisk-Users.
91 | |
92 |
93 |
94 |
95 | ### Сайт Asterisk Wiki
96 |
97 | Это не совсем тусовка сообщества, но она заслуживает упоминания. Digium поддерживает Вики для Asterisk по адресу [wiki.asterisk.org](http://wiki.asterisk.org/), этот сайт постоянно обновляется командой Digium, и автоматизированные скрипты экспортируют документацию на основе XML из источников Asterisk в саму Вики, что помогает гарантировать актуальность данных.
98 |
99 | Более старая Вики существует по адресу [www.voip-info.org](http://www.voip-info.org/), что в наши дни является своего рода историческим курьезом и источником большого просветления и путаницы. Хотя здесь содержится огромное количество информации, большая ее часть устарела. Мы включаем ссылку на неё здесь просто потому, что вы, вероятно, попадёте на неё в один прекрасный день и подумаете, что попали в материнскую жилу, но то, что вы на самом деле нашли, больше похоже на музей исторических странностей: увлекательно, но необязательно актуально.
100 |
101 | ### IRC-каналы
102 |
103 | Сообщество Asterisk поддерживает каналы Internet Relay Chat (IRC) на _irc.freenode.net_. Двумя наиболее активными каналами являются _#asterisk_ и _#asterisk-dev_ 4. Чтобы сократить количество вторжений спам-ботов, оба этих канала требуют регистрации для присоединения. Чтобы зарегистрироваться, запустите `/msg nickserv help` при подключении к службе через ваш любимый IRC-клиент.
104 |
105 | ## Вывод
106 |
107 | Так с чего начать? Что ж, когда речь заходит об Asterisk, можно говорить гораздо больше, чем мы можем вписать в одну книгу. Эта книга может только заложить основы, но из этого фундамента вы сможете прийти к пониманию концепции Asterisk - и из этого, кто знает, что вы будете строить?
108 | ##
109 |
110 | - И, возможно, еще, учитывая, что WebRTC также революционизирует нативные приложения!
111 |
112 | - Термин DSP также означает цифровой сигнальный процессор, который представляет собой устройство (обычно чип), способное интерпретировать и изменять сигналы различных видов. В голосовой сети DSP в первую очередь отвечают за кодирование, декодирование и перекодирование аудиоинформации. Это может потребовать много вычислительных усилий.
113 |
114 | - Мы понимаем, что технология интернета сформировалась из государственных и академических институтов, но то, о чем мы здесь говорим - это не столько технология интернета, сколько культурный феномен его, который взорвался в начале 90-х годов.
115 |
116 | - Канал #asterisk-dev. предназначен для обсуждения изменений в базовой кодовой базе Asterisk и также не является поддержкой второго уровня. Обсуждения, связанные с программированием внешних приложений, которые взаимодействуют с Asterisk через AGI или AMI, должны быть в #asterisk.
117 |
118 |
119 | [Предисловие](preface.md) | [Содержание](SUMMARY.md) | [Глава 2. Архитектура Asterisk](glava-02.md)
120 |
--------------------------------------------------------------------------------
/glava-04.md:
--------------------------------------------------------------------------------
1 | # Глава 4. Сертификаты для безопасности конечных точек
2 |
3 | > _Нам должно повезти только один раз. Тебе должно везти каждый раз._
4 | >
5 | > - IRA к Маргарет Тэтчер после неудачной попытки убийства
6 |
7 | > _Если вы действительно хотите что-то сделать, вы найдете способ. Если вы этого не сделаете, вы найдете оправдание._
8 | >
9 | > - Джим Рон
10 |
11 | ## Неудобство безопасности
12 |
13 | Безопасность VoIP можно рассматривать как две отдельные (но взаимосвязанные) проблемы:
14 |
15 | * Защита система от мошенничества с платными услугами (что, как правило, является целью попыток атак на основе SIP)
16 | * Защита системы от перехвата вызовов (что касается конфиденциальности, а также улучшения защиты от мошенничества)
17 |
18 | Конечно, есть много других аспектов безопасности вашей системы, но большинство из них являются общими понятиями безопасности, не специфичными для VoIP.
19 |
20 | В этой главе мы сосредоточимся на области безопасности, которая слишком часто упускается из виду, а именно на создании и применении сертификатов и ключей для обеспечения безопасности связи между конечными точками и вашей системой. В SIP-связи шифрование является необязательным (и, к сожалению, не используется большую часть времени). В WebRTC это необходимо.
21 |
22 | Эта глава ни в коем случае не должна рассматриваться как последнее слово в защите вашей системы Asterisk; в Главе 22 будет рассмотрено больше. Однако мы надеемся, что это обеспечит вам прочную основу для построения безопасного решения.
23 |
24 | ## Безопасность SIP
25 |
26 | Если вы создадите какой-либо сервер, который доступен из интернета, и подождёте несколько часов после его включения, то вы заметите, что система уже привлекла зонды, пытающиеся определить, есть ли у нее какие-либо уязвимые службы SIP. Вскоре вы заметите, что все большее количество атак на сервер пытается поставить под угрозу безопасность учетной записи. Поздравляем — ваш сервер был автоматически добавлен в списки SIP-серверов, совместно используемых преступниками с целью мошенничества. Если одно из этих вторжений удастся, скомпрометированная платформа, скорее всего, станет частью организованной преступной сети, и вы оплатите счет за неотслеживаемые звонки в различные дорогостоящие пункты назначения.
27 |
28 |
29 |
30 |
31 |
32 | ПРЕДУПРЕЖДЕНИЕ
33 |
34 | Мы не шутим здесь; не пренебрегайте вашей безопасностью SIP или вы, вероятно, окажетесь жертвой очень дорогой атаки мошенничества.
35 | |
36 |
37 |
38 |
39 |
40 |
41 | ### Имена подписчиков
42 |
43 | Абонентская часть учетных данных SIP (userinfo часть URI) слишком часто устанавливается как добавочный номер. Эта практика хороша для целей адресации вызовов, но совсем не рекомендуется для целей аутентификации конечной точки. Имя подписчика конечных точек не должно иметь значения за пределами организации. MAC-адрес идеально подходит для этого. Без фактического адреса для исследования работа злоумышленника станет намного сложнее.
44 |
45 | Вы увидите множество УАТС типа SIP \(включая на основе Asterisk, к сожалению\), которые назначают добавочный номер учетным данным телефона. В этой книге вы увидите, что добавочный номер не является частью учетных данных телефона. В этом есть несколько преимуществ, но с точки зрения безопасности преимущество заключается в том, что если злоумышленник знает внутренний номер, он не имеет никаких знаний о том, как аутентифицировать вызов через систему.
46 |
47 | Таким образом, у вас может быть пользователь с SIP-адресом [100@shifteight.org](mailto:100@shifteight.org), которого система Asterisk свяжет с устройством по адресу [0000f3101010@yourpbx.com.](mailto:0000f3101010@yourpbx.com.) Когда вызов направлен на 100, он будет звонить на 0000f3101010, но вызывающий абонент никогда ничего не знает об этой конечной точке.
48 |
49 | На протяжении всей этой книги вы увидите, что мы установим связь между внутренним номером (расширением) (который, по нашему мнению, должен быть связан с пользователем или услугой) с идентификатором устройства (который может быть устройством SIP или номером телефона) и что простая таблица может использоваться для их связи (и впоследствии повысит как безопасность, так и гибкость).
50 |
51 | ### Безопасность SIP-сигнализации
52 |
53 | По умолчанию сообщения SIP передаются в открытом виде без эффективной защиты. При атаке человек посередине ([MITM](https://ru.wikipedia.org/wiki/%D0%90%D1%82%D0%B0%D0%BA%D0%B0_%D0%BF%D0%BE%D1%81%D1%80%D0%B5%D0%B4%D0%BD%D0%B8%D0%BA%D0%B0)) злоумышленник способен получить всевозможную информацию о Ваших звонках. Протокол защиты транспортного уровня (TLS) используется, чтобы минимизировать этот риск.
54 |
55 | О том, как настроить устройства на использование TLS, мы поговорим в следующей главе. Все, что нам нужно сделать сейчас — это создать сертификаты.
56 |
57 | Существует три распространенных способа создания сертификатов. Мы приведем примеры для двух из них \(самозаверенные - self-signed и LetsEncrypt\), но оставим осуществление получения официально выданных сертификатов читателю.
58 |
59 | ### **САМОЗАВЕРЕННЫЕ СЕРТИФИКАТЫ**
60 |
61 | Основное преимущество самозаверенного сертификата заключается в том, что его не нужно проверять с помощью внешнего объекта. Недостатком является то, что из-за этого, внешние объекты не будут доверять ему.
62 |
63 | Если вы защищаете устройства SIP только для использования в контролируемой сетевой среде, самозаверенный сертификат может быть тем, что вам нужно. Он не считается лучшим подходом, но в некоторых случаях этого может быть достаточно, и это, как правило, лучше чем ничего.
64 |
65 | В этом мире, полном автоматизированной преступности, многое можно узнать о конфиденциальности и безопасности, а также криптографии, необходимой для обоех сторон. Тем не менее, это книга об Asterisk, так что мы собираемся предоставить шаблон для создания необходимых компонентов, и вам необходимо продолжить исследование.
66 |
67 | Инструментарий openssl предоставляет инструмент, который сделает работу за нас.
68 |
69 | Мы запустим его следующим образом:
70 |
71 | ```text
72 | $ sudo su asterisk -
73 | $ mkdir /home/asterisk/certs
74 | $ openssl req -x509 -nodes -newkey rsa:2048 -days 3650 \
75 | -keyout /home/asterisk/certs/self-signed.key \
76 | -out /home/asterisk/certs/self-signed.crt
77 | ```
78 |
79 | Вам будет предложено предоставить некоторую информацию, а затем ваш ключ и сертификат будут записаны в папку _/home/asterisk/certs_.
80 |
81 | Вы можете добавить следующее в команду, чтобы обойти вопросы \(измените информацию в соответствии с вашей ситуацией\):
82 |
83 | ```text
84 | -subj "/C=CA/ST=Ontario/L=Toronto/O=ShiftEight/CN=shifteight.org"
85 | ```
86 |
87 | Полная команда будет выглядеть примерно так:
88 |
89 | ```text
90 | $ openssl req -x509 -nodes -newkey rsa:2048 -days 3650 \
91 | > -keyout /home/asterisk/certs/self-signed.key \
92 | > -out /home/asterisk/certs/self-signed.crt \
93 | > -subj "/C=CA/ST=Ontario/L=Toronto/O=ShiftEight/CN=shifteight.org"
94 | ```
95 |
96 | Это создаст самозаверенный сертификат и закрытый ключ и сохранит их в /home/asterisk/certs/. Мы сможем использовать их позже, когда будем настраивать наши конечные точки SIP.
97 |
98 | Вероятно, это хорошая идея, чтобы применить `chmod` к вашим сертификатам так, чтобы только соответствующий пользователь/группа могли получить к ним доступ:
99 |
100 | ```text
101 | $ chmod 640 /home/asterisk/certs/*
102 | ```
103 |
104 | Выйдите из аккаунта пользователя asterisk.
105 |
106 | ```text
107 | $ exit
108 | $ who am i # You should be astmin again.
109 | ```
110 |
111 | Существует альтернатива использованию самозаверенных сертификатов: если у вас есть доменное имя, назначенное вашему серверу, доступному из общедоступного интернета, вы можете создать проверенный сертификат с помощью LetsEncrypt. Читайте дальше.
112 |
113 | ### **СЕРТИФИКАТЫ LETSENCRYPT**
114 |
115 | Если вы заинтересованы в безопасной связи через общедоступный Интернет (которому вы будете доверять), то наличие сертификатов домена, предоставляемых Центром сертификации (ЦС) полезно.
116 |
117 | Проект LetsEncrypt предоставляет цифровые сертификаты бесплатной проверки домена (Domen Validation - DV). Бесплатный инструмент, предоставляемый Let's Encrypt Foundation под названием certbot, позволяет автоматизировать получение и обслуживание доверенных сертификатов.
118 |
119 | Как минимум, вашему серверу потребуется полное доменное имя ([FQDN](https://ru.wikipedia.org/wiki/FQDN)), которое сопоставляется с внешним IP-адресом, поступающим на компьютер. Любой брандмауэр между ними должен будет передавать трафик для этого имени хоста в систему, для которой вы получаете сертификат. Если вы не можете сделать это по какой-либо причине, получение доверенного сертификата становится более сложным \(и выходит за рамки этой книги\).
120 |
121 | `certbot` может быть установлен посредством yum следующим образом:
122 |
123 | ```text
124 | $ sudo yum -y install certbot
125 | ```
126 |
127 | После его установки Вам просто нужно выполнить следующее:
128 |
129 | ```text
130 | $ sudo certbot certonly
131 | How would you like to authenticate with the ACME CA?
132 | -------------------------------------------------------------------------------
133 | 1: Spin up a temporary webserver (standalone)
134 | 2: Place files in webroot directory (webroot)
135 | -------------------------------------------------------------------------------
136 | Select the appropriate number [1-2] then [enter] (press 'c' to cancel): 1
137 | ```
138 |
139 | Если у вас работает веб-сервер или вы уверены в Варианте 2, это нормально, но эти шаги предполагают, что у вас нет веб-сервера и, следовательно, вам необходимо/требуется использовать встроенный временный веб-сервер, который certbot будет использовать для аутентификации. Этот сервер используется для подтверждения управления доменом, для которого запрашивается сертификат.
140 |
141 | При необходимости ответьте на следующие вопросы, а затем вставьте имя хоста, назначенное IP-адресу сервера:
142 |
143 | ```text
144 | Please enter in your domain name(s) (comma and/or space separated) (Enter 'c'
145 | to cancel): asteriskbook.shifteight.org
146 | ```
147 |
148 | (замените _asteriskbook.shifteight.org_ на назначенное доменное имя).
149 |
150 | `certbot` будет выполнять свою магию, и если все прошло хорошо, вы должны получить сообщение похожее на следующее:
151 |
152 | ```text
153 | IMPORTANT NOTES:
154 | - Congratulations! Your certificate and chain have been saved at:
155 | /etc/letsencrypt/live/asteriskbook.shifteight.org/fullchain.pem
156 | Your key file has been saved at:
157 | /etc/letsencrypt/live/asteriskbook.shifteight.org/privkey.pem
158 | Your cert will expire on 2018-07-23. To obtain a new or tweaked
159 | version of this certificate in the future, simply run certbot
160 | again. To non-interactively renew *all* of your certificates, run
161 | "certbot renew"
162 | - Your account credentials have been saved in your Certbot
163 | configuration directory at /etc/letsencrypt. You should make a
164 | secure backup of this folder now. This configuration directory will
165 | also contain certificates and private keys obtained by Certbot so
166 | making regular backups of this folder is ideal.
167 | - If you like Certbot, please consider supporting our work by:
168 | Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate
169 | Donating to EFF: https://eff.org/donate-le
170 | ```
171 |
172 | Не забудьте сделать пожертвование Internet Security Research Group (ISRG) или Electronic Frontier Foundation (EFF); они выполняют важную работу и заслуживают нашей поддержки.
173 |
174 | Теперь у вас есть сертификаты, необходимые для включения различных служб TLS в вашей системе. Мы применим их в следующей главе.
175 |
176 | Не слишком сложно, а?
177 |
178 |
179 |
180 |
181 |
182 | ЗАМЕЧАНИЕ
183 | Имейте в виду, что большинство сертификатов, которые вы получаете из внешнего источника, будут иметь срок действия.
184 | В случае LetsEncrypt текущий срок действия составляет три месяца.
185 | Если вы собираетесь запустить сертификаты в продакшен, Вам нужно понять как ими управлять (например, автоматизировать обновление, где люди из LetsEncrypt проделали хорошую работу по упрощению).
186 | |
187 |
188 |
189 |
190 |
191 |
192 | ### **ПРИОБРЕТЕНИЕ СЕРТИФИКАТОВ В ОФИЦИАЛЬНОМ ЦЕНТРЕ СЕРТИФИКАЦИИ**
193 |
194 | Если сертификаты LetsEncrypt не обеспечивают требуемый уровень проверки (например, если вам нужна проверка организации (OV) или расширенная проверка (EV)), вам нужно будет получить услуги центра сертификации, который предоставляет такие вещи. Эти вопросы выходят за рамки данной книги.
195 |
196 | Если вы проработали примеры для разделов самозаверенных и LetsEncrypt сертификатов, у Вас будет хотя бы базовое представление о некоторых процессах получения сертификатов из центра сертификации, так как многие шаги будут аналогичны.
197 |
198 | ## Защита медиапотока
199 |
200 | Сертификаты, которые мы получили, могут быть использованы для защиты как нашей сигнализации, так и самой полезной нагрузки (т.е. того, что говорится или передаваемого видео). Обратите внимание, что механизмы для безопасности сигналов - это вещь протокола SIP, а механизмы обеспечения безопасности медиапотока - являются вещью протокола RTP. Имейте в виду, что шифрование сигнализации SIP не означает, что вы автоматически также шифруете медиатрафик (RTP).
201 |
202 | ## Шифрование RTP
203 |
204 | Шифрование протокола реального времени позволит достичь эффекта защиты наших медиа-потоков.
205 |
206 | Для обеспечения шифрования медиа обычно используются два механизма: SDES и DTLS-SRTP. SDES — это механизм шифрования мультимедиа, который доверяет безопасности сигнализации. Другими словами, если вы используете TLS для защиты сигнализации SIP, то SDES, вероятно, также обрабатывает шифрование мультимедиа.
207 |
208 | DTLS-SRTP, с другой стороны, не доверяет сигнализации. Это важно, потому что стандарт WebRTC требует чтобы медиапоток был зашифрован таким образом.
209 |
210 | Сертификаты, которые мы создали здесь, должны работать в обоих сценариях. В следующих главах, когда мы будем настраивать конечные точки SIP или WebRTC, мы рассмотрим более подробно как использовать сертификаты. На данный момент достаточно того, что мы сгенерировали сертификаты и сделали их доступными для использования.
211 |
212 | ## Вывод
213 |
214 | Не ошибитесь: безопасность все усложняет. В старые добрые времена вы могли запустить SIP-соединение с полудюжиной строк конфигурации и назвать это днем. Это больше не летает, и хотя этот тип конфигурации по-прежнему будет работать (просто используйте UDP вместо TLS, и все, что вам нужно — это пароль), мы решили что начиная с этого выпуска все примеры конфигурации будут выбирать более безопасные параметры где это возможно. Мы не претендуем на то, чтобы представить последнее слово о безопасности VoIP, но мы собираемся привести примеры, которые заплатят больше, чем на словах концепции.
215 |
216 | Далее мы обсудим, как настроить конечные точки в системе Asterisk (используя ключи и сертификаты, которые мы только что создали).
217 |
218 | [Глава 3. Установка Asterisk](glava-03.md) | [Содержание](SUMMARY.md) | [Глава 5. Конфигурация пользовательских устройств](glava-05.md)
219 |
--------------------------------------------------------------------------------
/glava-13.md:
--------------------------------------------------------------------------------
1 | # Глава 13. Состояния устройств
2 |
3 | > Среди беспорядка найдите простоту.
4 | >
5 | > --_Albert Einstein_
6 |
7 | Часто бывает полезно иметь возможность определить состояние устройств, подключенных к телефонной системе. Например, оператору в приемной может потребоваться видеть статусы всех сотрудников офиса, чтобы определить, может ли кто-то принять телефонный звонок. Сам Asterisk нуждается в такой же информации. В качестве другого примера, если вы создали очередь вызовов, как описано в [Главе 12](glava-15.md), Asterisk должен знать, когда агент становится доступен, чтобы можно было отправить другой вызов. В этой главе рассматриваются понятия состояний устройства в Asterisk, а также способы использования и доступа устройств и приложений к этой информации.
8 |
9 | ## Состояния устройств
10 |
11 | Существует две категории устройств, для которых Asterisk предоставляет информацию о состоянии: канальные устройства (такие как конечные точки PJSIP) и виртуальные (являющиеся встроенными службами, которые можно отслеживать, например конференц-залы).
12 |
13 | Чтобы ссылаться на состояние _канала_, Вы делаете это точно так же, как с `Dial()`, например `DEVICE_STATE(PJSIP/000f300B0B02)`, тогда как для ссылки на состояние _виртуального устройства_ используется формат `тип виртуального устройства:идентификатор`, например `DEVICE_STATE(ConfBridge:1234)`.
14 |
15 | Виртуальные устройства включают вещи, которые находятся внутри Asterisk, но предоставляют полезную информацию о состоянии (см. [Таблицу 13-1](13.%20Device%20States%20-%20Asterisk%20%20The%20Definitive%20Guide,%205th%20Edition.htm%22%20/l%20%22table-virtualDevices)\).
16 |
17 | Таблица 13-1. Устройства, для которых Asterisk может предоставлять информацию о состоянии
18 |
19 | | Устройство | Описание |
20 | | :--- | :--- |
21 | | `PJSIP/channel name` | Многие каналы позволяют контролировать их состояние, но канал PJSIP предлагает на сегодняшний день наибольшее количество полезных данных; таким образом, мониторинг SIP-устройств является наиболее распространенным использованием `DEVICE_STATE`. |
22 | | `ConfBridge:conference bridge` | Состояние конференц-моста MeetMe. Состояние будет отражать, имеются ли в настоящее время участники в конференц-зале. Более подробную информацию об использовании `MeetMe()` для конференц-связи можно найти в [Главе 11](glava-11.md). |
23 | | `Custom:custom name` | Пользовательские состояния устройств. Эти состояния имеют пользовательские имена и изменяются с помощью функции `DEVICE_STATE()`. Пример использования можно найти в разделе ["Использование пользовательских состояний устройств"](glava-13.md#Использование-пользовательских-состояний-устройств). |
24 | | `Park:exten@context` | Состояние слота парковки вызова. Информация о состоянии будет отражать, припаркован ли вызывающий абонент в данный момент на этом добавочном номере. Дополнительную информацию о парковке вызовов в Asterisk можно найти в ["Парковке вызовов"](glava-11.md#Парковка-вызовов). |
25 | | `Calendar:calendar name` | Состояние календаря. Asterisk будет использовать содержимое названного календаря, чтобы установить состояние `available` или `busy`. |
26 |
27 | ### Проверка состояний устройств
28 |
29 | Функция диалплана `DEVICE_STATE()` считывает текущее состояние устройства.
30 | ```
31 | exten => 7012,1,Answer()
32 | same => n,Set(DeviceIdent=PJSIP/000f300B0B02)
33 | same => n,Verbose(3,${DeviceIdent} is ${DEVICE_STATE($DeviceIdent})})
34 | same => n,Hangup()
35 | ```
36 | Если мы вызываем расширение 7012 с того же устройства, на котором проверяем состояние, в консоли Asterisk появляется следующее подробное сообщение:
37 | ```
38 | -- PJSIP/000f300B0B02 is INUSE
39 | ```
40 | ---
41 | #### Примечание
42 |
43 | В [Главе 17](glava-17.md) обсуждается Asterisk Manager Interface (AMI). Действие диспетчера `GetVar` можно использовать для получения значения состояния устройства из внешней программы. Вы можете использовать его для получения значения обычной переменной или для возврата значения из функции диалплана, например `DEVICE_STATE()`.
44 |
45 | ---
46 |
47 | Вот список значений, которые вернет функция `DEVICE_STATE()` (в зависимости, конечно, от того, что было найдено):
48 |
49 | * `UNKNOWN`
50 | * `NOT_INUSE`
51 | * `INUSE`
52 | * `BUSY`
53 | * `INVALID`
54 | * `UNAVAILABLE`
55 | * `RINGING`
56 | * `RINGINUSE`
57 | * `ONHOLD`
58 |
59 | Эта информация может затем использоваться в диалплане для принятия решений о потоке вызовов (например, локальный канал вызова агента может использовать эту информацию для определения того, что телефон агента находится на вызове по другой линии, и таким образом отклонить вызов, чтобы тот вернулся в очередь).
60 |
61 | ## Состояния расширения используя директиву hint
62 |
63 | Состояние расширения - это механизм диалплана, который Asterisk использует, чтобы разрешить SIP-устройствам подписываться на информацию о присутствии. Например, телефон в приемной может иметь модуль Busy Lamp Field (BLF), содержащий кнопки, которые будут использоваться для отображения состояний различных телефонов в офисе. Телефон с BLF будет отправлять запросы на подписку, чтобы сообщить Asterisk, с каких устройств он хочет получать информацию о присутствии. В диалплане мы используем директиву hint для определения сопоставления между расширением и одним или несколькими устройствами.
64 |
65 | ### Хинты
66 |
67 | Чтобы определить хинт в диалплане, вместо приоритета используется ключевое слово `hint`.
68 | ```
69 | [hints]
70 | ;exten = ,hint,[&
71 |
72 | exten => 100,hint,${UserA_DeskPhone}
73 |
74 | exten => 221,hint,ConfBridge:221
75 | ```
76 | Часто вы можете увидеть хинты, определенные в том же разделе диалплана, что и обычные расширения. Это может сделать диалплан немного визуально загроможденным, и это также предполагает, что хинт так или иначе связан с набираемым добавочным номером, что на самом деле не так.
77 | ```
78 | [sets]
79 |
80 | exten => 100,hint,${UserA_DeskPhone}
81 | exten => 100,1,Gosub(subDialUser,${EXTEN},1(${UserA_DeskPhone},${EXTEN},default,22))
82 | exten => 101,hint,${UserA_SoftPhone}
83 | exten => 101,1,Gosub(subDialUser,${EXTEN},1(${UserA_SoftPhone},${EXTEN},default,23))
84 | exten => 102,hint,${UserB_DeskPhone}
85 | exten => 102,1,Gosub(subDialUser,${EXTEN},1(${UserB_DeskPhone},${EXTEN},default,26))
86 | exten => 103,hint,${UserB_SoftPhone}
87 | exten => 103,1,Gosub(subDialUser,${EXTEN},1(${UserB_SoftPhone},${EXTEN},default,24))
88 |
89 | exten => 110,1,Dial(${UserA_DeskPhone}&${UserA_SoftPhone}&${UserB_SoftPhone})
90 | ```
91 | В нашем примере мы сделали прямую взаимосвязь между добавочным номером подсказки и набираемым добавочным номером, хотя этого не требуется.
92 |
93 | ### Проверка состояний внутреннего номера
94 |
95 | Самый простой способ проверить текущее состояние хинтов расширений - через CLI Asterisk. Команда `core show hints` отобразит все настроенные в данный момент хинты:
96 | ```
97 | *CLI> core show hints
98 | -= Registered Asterisk Dial Plan Hints =-
99 | 100@hints : PJSIP/0000f30A0A01 State:Unavailable Presence:not_set Watchers 0
100 | 101@hints : PJSIP/SOFTPHONE_A State:Unavailable Presence:not_set Watchers 0
101 | 102@hints : PJSIP/0000f30B0B02 State:Unavailable Presence:not_set Watchers 0
102 | 103@hints : PJSIP/SOFTPHONE_B State:Unavailable Presence:not_set Watchers 0
103 | 110@hints : PJSIP/0000f30A0A01&P State:Unavailable Presence:not_set Watchers 0
104 | 221@hints : ConfBridge:221 State:Unavailable Presence:not_set Watchers 0
105 | ----------------
106 | - 6 hints registered
107 | ```
108 | В дополнение к отображению состояния каждого хинта, вывод `core show hints` также выводит количество наблюдателей. _Наблюдатель_ - это объект, который подписался на получение обновлений о состоянии этого расширения. Если конечная точка SIP подписывается на состояние добавочного номера, количество наблюдателей будет увеличено.
109 |
110 | Состояние расширения также может быть получено с помощью функции диалплана `EXTENSION_STATE()`. Эта функция работает так же, как `DEVICE_STATE()`, описанная в предыдущем разделе. Добавьте следующий пример в файл _/etc/asterisk/extensions.conf_ как новое расширение сразу после 235:
111 |
112 | ```
113 | exten => 234,1,NoOp()
114 | same => n,Set(FEATURE(parkingtime)=60)
115 |
116 | exten => 235,1,Noop(The state of 100@hints is ${EXTENSION_STATE(100@hints)} )
117 | same => n,Hangup()
118 |
119 | exten => 321,1,NoOp()
120 | ```
121 | Когда это расширение вызывается из конечной точки с номером 100, в консоли Asterisk отобразится следующее сообщение:
122 | ```
123 | -- The state of 100@hints is INUSE
124 | ```
125 | В следующем списке перечислены возможные значения, которые могут быть возвращены функцией `EXTENSION_STATE()`:
126 |
127 | * `UNKNOWN`
128 | * `NOT_INUSE`
129 | * `INUSE`
130 | * `BUSY`
131 | * `UNAVAILABLE`
132 | * `RINGING`
133 | * `RINGINUSE`
134 | * `HOLDINUSE`
135 | * `ONHOLD`
136 |
137 | ## SIP-присутствие
138 |
139 | Asterisk дает устройствам возможность подписаться на состояние расширения с использованием протокола SIP. Эту функцию часто называют BLF (Busy Lamp Field); см. [Рисунок 13-1](13.%20Device%20States%20-%20Asterisk%20%20The%20Definitive%20Guide,%205th%20Edition.htm%22%20/l%20%22fig1301).
140 |
141 | 
142 |
143 | _Рисунок 13-1. Busy Lamp Field или боковая панель_
144 |
145 | Конфигурация модуля будет немного (или очень) отличаться для каждого производителя; однако информация о подписке, так или иначе, должна включать следующее:
146 | * Адрес сервера Asterisk (это может быть определено для каждой кнопки или может применяться ко всему телефону).
147 | * Контекст для подписки (в нашем примере диалплана он называется `[hints]`). Этот параметр определяется в поле `subscribe_context` таблицы `asterisk.ps_endpoints`.
148 | * Соответствующее расширение (100, 101, 102 и т.д.)[1](https://learning.oreilly.com/library/view/asterisk-the-definitive/9781492031598/ch13.html%22%20/l%20%22idm46178405538488)
149 |
150 | Один из самых простых и недорогих способов тестирования присутствия - использование opensource софтфона для Windows, MicroSIP[2](https://learning.oreilly.com/library/view/asterisk-the-definitive/9781492031598/ch13.html#idm46178405536680). Сначала вам нужно скачать MicroSIP и зарегистрировать его в вашей системе Asterisk. Затем на вкладке контактов софтфона вы можете щелкнуть правой кнопкой мыши в открытой области, чтобы добавить контакт. В разделе «Имя» вы можете указать все что пожелаете, но в разделе «Номер» вы должны ввести `extension@hints context`, который в нашем случае будет одним из `100@hints`, `101@hints`, `102@hints` или `103@hints`. Если вы настроили все в Asterisk согласно предыдущим примерам, то должны увидеть, как состояние ваших подписок меняется в зависимости от того, что делает устройство. Вы также можете отслеживать это с точки зрения Asterisk с помощью такой команды:
151 | ```
152 | $ watch -n 0.5 "sudo asterisk -rx 'core show hints'"
153 | ```
154 | Конфигурация присутствия на физических настольных телефонах по существу одинакова, но может быть сложнее понять конкретный синтаксис, который требуется каждому производителю. Наш совет - заставить его работать с MicroSIP (который вы сможете запустить на WINE под Linux или macOS). Это простая установка, и оттуда у вас будет отличная конфигурация, которой вы можете доверять, когда выбираете аналогичную конфигурацию для одного из ваших настольных телефонов.
155 |
156 | ## Использование пользовательских состояний устройств
157 |
158 | В дополнение к устройствам, которые Asterisk знает как внутренне контролировать (`PJSIP`, `ConfBridge`, `Park`, `Calendar`), Asterisk также предоставляет возможность создавать собственные состояния устройств, которые могут быть очень полезны при разработке некоторых интересных приложений.
159 |
160 | Пользовательские состояния устройства определяются с помощью префикса `Custom:`. Текст, который идет после префикса, может быть чем угодно. Чтобы установить или прочитать значение пользовательского состояния устройства, используйте функцию диалплана `DEVICE_STATE()`. Поместите это в свой файл _extensions.conf_ сразу после расширения 235:
161 | ```
162 | exten => 235,1,Noop(The state of 100@hints is ${EXTENSION_STATE(100@hints)} )
163 | same => n,Hangup()
164 |
165 | exten => 236,1,Noop(Set a custom status)
166 | same => n(blink),Set(DEVICE_STATE(Custom:rudolph)=UNAVAILABLE)
167 | same => n,Set(DEVICE_STATE(Custom:santa)=NOT_INUSE)
168 | same => n,Wait(0.75)
169 | same => n,Set(DEVICE_STATE(Custom:rudolph)=NOT_INUSE)
170 | same => n,Set(DEVICE_STATE(Custom:santa)=UNAVAILABLE)
171 | same => n,Wait(0.75)
172 | same => n,Goto(blink)
173 | ```
174 | Затем добавьте это себе в контекст `[hints]`:
175 | ```
176 | exten => 221,hint,ConfBridge:221
177 | exten => santa,hint,Custom:santa
178 | exten => rudolph,hint,Custom:rudolph
179 | ```
180 | Весело, да?
181 |
182 | ---
183 | #### Примечание
184 |
185 | Вы заметите, что когда вы повесите трубку, одно из пользовательских состояний устройств останется "Unavailable". Это важный момент: в системе нет ничего, что обновляло бы ваши пользовательские состояния устройства, если вы сами не внедрили что-то для этого.
186 |
187 | ---
188 |
189 | ## Вывод
190 |
191 | Функциональность состояний устройств в Asterisk может использоваться для отслеживания состояния различных ресурсов и доставки информации об этих состояниях различным подписчикам. Обычно (и традиционно) используется для BLF, пользовательское состояние устройства позволяет этому ресурсу быть гораздо более гибким, чем в традиционной УАТС.
192 |
193 | [1](https://learning.oreilly.com/library/view/asterisk-the-definitive/9781492031598/ch13.html#idm46178405538488-marker) Элементы 2 и 3 могут быть сформированы в виде одной строки, похожей на 100@hints или что-то подобное.
194 |
195 | [2](https://learning.oreilly.com/library/view/asterisk-the-definitive/9781492031598/ch13.html#idm46178405536680-marker) Который написан с использованием той же библиотеки PJSIP что использует Asterisk.
196 |
197 | [Глава 12. Automatic Call Distribution Queues](glava-12.md) | [Содержание](SUMMARY.md) | [Глава 14. Автосекретарь](glava-14.md)
198 |
--------------------------------------------------------------------------------
/glava-14.md:
--------------------------------------------------------------------------------
1 | # Глава 14. Автосекретарь
2 |
3 | > _Я не отвечаю на звонки. У меня всегда такое чувство, что на другом конце провода кто-то есть._
4 | >
5 | > -- Фред Коуплз
6 |
7 | Во многих УАТС, как правило, есть система меню для автоматического ответа на входящие вызовы, которая позволяет абонентам направлять себя на различные расширения и ресурсы в системе с помощью выбора меню. Эта система известна в телекоммуникационной отрасли как _автосекретарь_ (АС). АС, как правило, предоставляет следующие возможности:
8 |
9 | * Перевод на добавочный номер
10 | * Перевод на голосовую почту
11 | * Переход в очередь
12 | * Воспроизведение сообщения (например “наш адрес…”)
13 | * Подключение к подменю (например “для получения списка наших отделов...”)
14 | * Подключение к приемной
15 | * Повтор выбора
16 |
17 | Для всего остального, особенно если требуется внешняя интеграция, например поиск по базе данных, обычно требуется интерактивное голосовое меню (сокращенно на английском - IVR).
18 |
19 | ## АС это не IVR
20 |
21 | В open source телеком-сообществе вы часто услышите термин IVR, используемый для описания автосекретаря.1 Однако в телекоммуникационной отрасли в течение многих десятилетий до появления VoIP или УАТС с открытым исходным кодом IVR отличался от AС. По этой причине, когда вы говорите с кем-то, имеющим многолетний опыт работы в области телекоммуникаций, о любом виде телекоммуникационного меню, вы должны убедиться, что говорите об одном и том же. Для специалиста по телекоммуникациям термин _IVR_ подразумевает относительно комплексную и сложную в разработке (и последующе затратную), в то время как AС - это простая и недорогая вещь, которая является общей для большинства АТС.
22 |
23 | В этой главе мы поговорим о создании автосекретаря. IVR мы обсудим в [Главе 16](glava-16.md).2
24 |
25 | ## Проектирование вашего АС
26 |
27 | Самая распространенная ошибка новичков при проектировании АС - излишняя сложность. В то время как может быть много радости и чувства выполненного долга в создании многоуровневого AС с десятками отличных вариантов и кучами действительно интересных подсказок, ваши абоненты имеют другую повестку дня. Люди звонят по телефону в первую очередь потому, что хотят с кем-то поговорить. В то время как люди привыкли к реальности автосекретарей (и в некоторых случаях они могут ускорить процесс), по большей части люди предпочитают говорить с кем-то живым. Это означает, что есть два основных правила, которых должен придерживаться каждый АС:
28 |
29 | * Быть проще.
30 | * Убедитесь, что вы всегда делаете обработчик для людей, которые собираются нажимать 0, когда слышат меню. Если вы не хотите иметь опцию 0, имейте в виду, что многие люди будут оскорблены этим, они повесят трубку и не перезвонят. В бизнесе это вообще плохо.
31 |
32 | Прежде чем вы начнете кодировать свой AС, разумно его спроектировать. Вам нужно будет определить поток вызовов и необходимо будет указать подсказки, которые будут воспроизводиться на каждом шаге. Программные инструменты для построения диаграмм могут быть полезны для этого, но нет необходимости фантазировать. Таблица 14-1 предоставляет хороший шаблон для базового AС, который будет делать то, что вам нужно.
33 |
34 | _Таблица 14-1. Базовый автосекретарь_
35 |
36 | | Шаг или выбор | Образец приглашения | Примечание | Имя файлаa |
37 | | :------------ | :------------------ | :--------- | :----------------------------------- |
38 | | Приветствие - рабочее время | Спасибо,что позвонили в компанию ABC. | Дневное приветствие. Воспроизводится сразу после того, как система отвечает на вызов. | _daygreeting.wav_ |
39 | | Приветствие - нерабочеее время | Спасибо,что позвонили в компанию ABC. Наш офис сейчас закрыт. | Ночное приветствие. Как и выше, но играет в нерабочее время. | _nightgreeting.wav_ |
40 | | Главное меню | Если вы знаете внутренний номер оператора, с которым хотите связаться, пожалуйста, введите его сейчас. Для свзи с отделом продаж, пожалуйста, нажмите 1; для отдела обслуживания, нажмите 2; для нашего каталога компании, нажмите #. Для получения информации о нашем адресе и факсе нажмите кнопку 3. Чтобы повторить это сообщение - нажмите 9, или оставайтесь на линии, или нажмите 0, чтобы связаться с оператором. | Подсказка главного меню. Играет сразу после приветствия. Для вызывающего абонента приветствие и главное меню звучат как единое приглашение; однако в системе полезно держать эти подсказки раздельно. | _mainmenu.wav_ |
41 | | 1 | Пожалуйста, подождите пока мы переключим ваш звонок. | Перевод на очередь sales. | _holdwhileweconnect.wav_ |
42 | | 2 | Пожалуйста, подождите пока мы переключим ваш звонок. | Перевод на очередь support. | _holdwhileweconnect.wav_ |
43 | | # | n/a | Запуск приложения `Directory()` | n/a |
44 | | 3 | Наш адрес [address]. Наш номер факса [fax number], и тд. | Воспроизведение записи, содержащей информацию об адресе и факсе. Возврат вызывающего абонента к подсказке меню после завершения. | _faxandaddress.wav_ |
45 | | 0 | Соединяем со специалистом. Пожалуйста, подождите. | Перевод на приемную/оператора. | _transfertoreception.wav_ |
46 | | 9 | n/a | Повтор. Воспроизведение подсказки меню (но не приветствия). | n/a |
47 | | t | n/a | Тайм-аут. Если абонент не сделал выбора - считайте, что он набрал 0 (или в некоторых случаях повторите подсказку). | n/a |
48 | | i | Вы сделали неверный выбор. Пожалуйста, попробуйте еще раз. | Абонент нажал неверную цифру: воспроизведение подсказки меню (но не приветствия). | _invalid.wav_ |
49 | | \_XXXb | n/a | Перевод вызова на набранный номер. | _holdwhileweconnect.wav_ |
50 |
51 | aЭти файлы пока нигде не существуют. Мы используем их в качестве примеров.
52 | bЭто совпадение шаблонов должно соответствовать вашему диапазону расширений.
53 |
54 | ---
55 |
56 | Давайте рассмотрим различные компоненты этого шаблона. Затем мы покажем вам код диалплана, необходимый для его реализации, а также как создавать подсказки.
57 |
58 | ### Приветствие
59 |
60 | Первое, что слышит абонент - это на самом деле две подсказки.
61 |
62 | Первая подсказка - это приветствие. Единственное, что приветствие должно сделать - это поприветствовать абонента. Примером приветствия может быть “Спасибо, что позвонили Брайанту, Ван Меггелену и партнерам”, “Добро пожаловать в школу мудрости и дизайна футболок Лейфа" или "Вы позвонили в офисы адвокатов Дьюи, Читама и Хоуи.” Вот именно - выбор для звонящего придет позже. Это позволяет записывать различные приветствия без необходимости записывать все новое меню. Например, в течение нескольких недель каждый год вы можете делать, чтобы ваше приветствие говорило "приветствие сезона" или что-то еще, но ваше меню не нужно будет менять. Кроме того, если вы хотите воспроизвести другую запись в нерабочее время (“Спасибо за звонок. Наш офис сейчас закрыт.”), то можете использовать разные приветствия, но сердце меню останется прежним. Наконец, если вы хотите иметь возможность вернуть абонентов в меню из другой части системы, то не захотите, чтобы они снова услышали приветствие.
63 |
64 | ### Главное меню
65 |
66 | Приглашение главного меню - это место, где вы сообщаете своим абонентам о доступных им вариантах выбора. Вы должны проговаривать его как можно быстрее (без спешки или глупостей).3 Когда вы записываете выбор, всегда сообщайте пользователям о действии, которое будет предпринято, прежде чем дать им возможность выполнить это действие с помощью набора цифр. Поэтому не говорите "нажмите 1 для продаж“, а скорее скажите: "для продаж нажмите 1". Причина этого заключается в том, что большинство людей не обратят должного внимания на подсказку, пока не услышат интересующий их выбор. Как только они услышат свой выбор, то будут в полном внимании и им можно будет сообщить какую кнопку нажать, чтобы направить их туда, куда требуется.
67 |
68 | Еще один момент, который следует рассмотреть - это порядок, в котором следует разместить выбор. Типичный бизнес, например, захочет, чтобы продажи были первым пунктом меню и большинство абонентов также будут ожидать этого. Самое главное - думать о своих клиентах. Например, большинство людей не будут заинтересованы в адресной и факсимильной информации, поэтому не делайте их первыми пунктами.4 Подумайте о том, чтобы как можно быстрее соединить абонентов с местом их назначения, когда вы проектируете свой выбор. Безжалостно режьте все, что не является абсолютно необходимым.
69 |
70 | #### Выбор 1
71 |
72 | Вариант 1 в нашем примере будет простым переводом. Обычно это ресурс, расположенный в другом контексте, и он, как правило, имеет внутренний добавочный номер, так что внутренние пользователи могут также передавать вызовы на него. В этом примере мы будем использовать эту опцию для отправки абонентов в очередь `sales`, созданную в [Главе 12](glava-12.md).
73 |
74 | #### Выбор 2
75 |
76 | Вариант 2 будет технически идентичен варианту 1. Только место назначения будет другим. Этот выбор переместит абонентов в очередь `support`.
77 |
78 | #### Выбор `#`
79 |
80 | Хорошо иметь возможность выбора справочника как можно ближе к началу записи. Многие люди будут использовать каталог, если знают что тот существует, но им не требуется прослушивать все меню, чтобы узнать о нем. Нетерпеливые люди будут нажимать 0, поэтому чем раньше вы расскажете им о справочнике, тем больше шансов, что они им воспользуются, и тем самым уменьшится нагрузка на вашего секретаря.
81 |
82 | #### Выбор 3
83 |
84 | Если у вас есть опция, которая ничего не делает, кроме воспроизведения записи абоненту (например, адрес и факс), вы можете оставить весь код для неё в том же контексте, что и меню, и просто вернуть абонента в главное меню в конце записи. В общем, такие варианты не очень полезны, как нам хотелось бы думать, поэтому в большинстве случаев вы, вероятно, захотите оставить её.
85 |
86 | #### Выбор 9
87 |
88 | Очень важно дать звонящему возможность услышать подсказку еще раз. Многие люди не будут обращать внимания на все меню, и если вы не дадите им возможность услышать меню снова, они, скорее всего, нажмут 0.
89 |
90 | Обратите внимание, что вам не нужно воспроизводить приветствие снова, только подсказку главного меню.
91 |
92 | #### Выбор 0
93 |
94 | Как было сказано ранее, и нравится вам это или нет, это выбор, который предпочтут многие (возможно, большинство) ваши абоненты. Если вы действительно не хотите, чтобы кто-то отвечал на эти звонки, то можете отправлять вызовы в почтовый ящик, но мы не рекомендуем это делать. Если вы занимаетесь бизнесом, многие из ваших абонентов будут вашими клиентами. Вы же хотите, чтобы им было легко связаться с вами. Доверьтесь нам.
95 |
96 | ### Тайм-аут
97 |
98 | Многие люди будут звонить по номеру и не обращать слишком много внимания на то, что происходит. Они знают, что если будут просто ждать на линии, то в конце концов их переведут на оператора. Или, возможно, они находятся в автомобиле, и на самом деле не могут нажимать кнопки своих телефонов. В любом случае, сделайте им одолжение. Если они не делают никакого выбора, не преследуйте их и не заставляйте их делать этого. Соедините их с оператором.
99 |
100 | ### Invalid (Неверно)
101 |
102 | Люди совершают ошибки. Это нормально. Неверный обработчик сообщит им о том, что они выбрали, не является допустимым вариантом, и вернет их в приглашение меню, чтобы они могли повторить попытку выбора. Обратите внимание, что вы не должны воспроизводить приветствие снова, только приглашение главного меню.
103 |
104 | ### Вызов добавочного номера
105 |
106 | Если кто-то звонит в вашу систему и знает добавочный номер, который хочет набрать, ваш автосекретарь должен иметь код для обработки этого.
107 |
108 |
109 |
110 |
111 | Примечание
112 | Хотя Asterisk может обрабатывать перекрытие между вариантами меню и добавочными номерами (например, у вас может быть выбор меню `1` и расширения от 100 до 199), лучше избегать этого перекрытия. В противном случае диалплану всегда придется ожидать межразрядный тайм-аут всякий раз, когда кто-то нажимает `1`, потому что не будет знать, планируют ли набрать добавочный номер 123. Межразрядный тайм-аут - это задержка, которую система допускает между цифрами, прежде чем предполагает, что было введено все число. Этот таймер гарантирует, что абоненты имеют достаточно времени для набора многоразрядного расширения, но он также вызывает задержку в обработку одноразрядных вводов.
113 | |
114 |
115 |
116 |
117 | ## Создание вашего АС
118 |
119 | После того, как вы разработали свой АС, есть три вещи, которые вам нужно сделать, чтобы заставить его работать должным образом:
120 |
121 | * Запись подсказок.
122 | * Создание диалплана для меню.
123 | * Направление входящих каналов в контекст AС.
124 |
125 | Начнем с того, что поговорим о записях.
126 |
127 | ### Запись подсказок
128 |
129 | Запись подсказок для телефонной системы является критически важной задачей. Это то, что ваши абоненты будут слышать при взаимодействии с вашей системой, и качество и профессионализм этих записей отразится на вашей организации.
130 |
131 | Asterisk очень гибок в этом отношении и может работать со многими различными аудиоформатами. Мы обнаружили, что в целом наиболее лучшим форматом для использования является WAV. Файлы, сохраненные в этом формате, могут быть самыми разными, но только один тип WAV-файла будет работать с Asterisk: файлы должны быть закодированы в 16-битном, 8000 Гц, моно-формате.
132 |
133 |
134 |
135 |
136 | Рекомендуемый формат файла подсказки
137 | Формат WAV, который мы рекомендуем, удобен для системных подсказок, потому что он может быть легко преобразован в любой другой формат, который могут использовать ваши телефоны, без потери или искажения, и почти любой компьютер может воспроизводить его без специального программного обеспечения. Таким образом, Asterisk может не только легко обрабатывать файл, но и легко будет работать с ним на ПК (что может быть полезно). Asterisk может обрабатывать и другие форматы файлов, и в некоторых случаях они могут быть более подходящими для ваших нужд, но в целом мы считаем, что 16-битные 8 кГц WAV файлы являются самыми простыми в работе и, в большинстве случаев, наилучшего качества.
138 | |
139 |
140 |
141 |
142 | Есть два основных способа ввести подсказки в систему. Один из них заключается в записи звуковых файлов в студии или на ПК, а затем переместить эти файлы в систему. Второй способ заключается в записи подсказок непосредственно в системе с помощью телефонного аппарата. Мы предпочитаем второй способ.
143 |
144 | Наш совет таков: Не зацикливайтесь на сложностях записи звука через ПК или в студии.5 Это вообще не нужно. Телефон будет делать записи отличного качества, и причины этого просты: микрофон и электроника в телефоне тщательно проработаны для захвата человеческого голоса в формате, который идеально подходит для передачи по телефонным сетям, и поэтому телефон также идеально подходит для выполнения записи подсказок. Аппарат захватит звук в правильном формате, отфильтрует фоновый шум и нормализует уровень децибел.
145 |
146 |
147 |
148 |
149 | Примечание
150 | Да, правильно подготовленная подсказка в студии будет лучше подсказки, записанной по телефону, но если у вас нет оборудования или опыта, воспользуйтесь нашим советом и используйте телефон для записи, потому что плохо подготовленная подсказка в студии будет намного хуже, чем подсказка, записанная по телефону.
151 | |
152 |
153 |
154 |
155 | #### Использование диалплана для создания записей
156 |
157 | Самый простой способ записи подсказок-это использование приложения `Record()`.
158 |
159 | Добавьте эту новую подпрограмму в нижнюю часть вашего файла _extensions.conf_:
160 |
161 | ```
162 | [subRecordPrompt]
163 | exten => 500,1,Playback(vm-intro)
164 | same => n,Record(daygreeting.wav)
165 | same => n,Wait(2)
166 | same => n,Playback(daygreeting)
167 | same => n,Hangup
168 |
169 | exten => 501,1,Playback(vm-intro)
170 | same => n,Record(mainmenu.wav)
171 | same => ... etc ... (создайте код диалплана для каждой подсказки, которую необходимо записать)
172 | ```
173 |
174 |
175 |
176 |
177 | Примечание
178 | Чтобы использовать этот контекст, вам нужно будет включить его в контекст, в котором ваши устройства входят в диалплан. Поэтому в контекст [LocalSets] вы должны добавить строку include=>UserServices . В рабочей среде вам, вероятно, понадобится пароль, чтобы кто попало не записывали подсказки.
179 | |
180 |
181 |
182 |
183 | Эта подпрограмма воспроизводит запрос, издает звуковой сигнал, делает запись и воспроизводит эту запись.6 Примечательно, что приложение `Record()` принимает в качестве аргумента все имя файла, в то время как приложение `Playback()` исключает расширение типа файла (_.wav_, _.gsm_ и др.). Это происходит потому, что приложение `Record()` должно знать, в каком формате должна быть сделана запись, а `Playback()` - нет. Вместо этого `Playback()` автоматически выбирает наилучший доступный аудиоформат, основываясь на кодеке, используемом вашим телефоном, и форматах, доступных в папке _sounds_ (например, если у вас есть _daygreeting.wav_ и _daygreeting.gsm_ в папке _sounds_, `Playback(daygreeting)` выберет тот, который требует наименьших усилий процессора для воспроизведения вызывающему абоненту).
184 |
185 | Вам, вероятно, потребуется отдельное расширение для записи каждого из приглашений, возможно, скрытое от обычного набора расширений, чтобы предотвратить затирание любой из ваших текущих подсказок меню с помощью неправильно набранного расширения. Если количество подсказок у вас велико, повторение этого расширения с небольшими изменениями для каждого будет утомительным, но есть способы обойти это. Мы покажем вам, как сделать вашу быструю запись более разумной в [Главе 16](glava-16.md), но сейчас только что описанный метод будет служить нашим непосредственным потребностям.
186 |
187 | Вот диалплан (выделен жирным шрифтом), который создаст все наши подсказки. Поместите его туда, куда вы хотите, в контекст `[sets]`:
188 |
189 |
190 | exten => _4XX,1,Noop(User Dialed ${EXTEN})
191 | same => n,Answer()
192 | same => n,SayDigits(${EXTEN})
193 | same => n,Hangup()
194 |
195 | exten => 500,1,GoSub(subRecordPrompt,${EXTEN},1(daygreeting)
196 | exten => 501,1,GoSub(subRecordPrompt,${EXTEN},1(nightgreeting)
197 | exten => 502,1,GoSub(subRecordPrompt,${EXTEN},1(mainmenu)
198 | exten => 503,1,GoSub(subRecordPrompt,${EXTEN},1(holdwhileweconnect)
199 | exten => 504,1,GoSub(subRecordPrompt,${EXTEN},1(faxandaddress)
200 | exten => 505,1,GoSub(subRecordPrompt,${EXTEN},1(transfertoreception)
201 | exten => 506,1,GoSub(subRecordPrompt,${EXTEN},1(invalid)
202 | exten => 507,1,GoSub(subRecordPrompt,${EXTEN},1(holdwhileweconnect)
203 |
204 | exten => _555XXXX,1,Answer()
205 | same => n,SayDigits(${EXTEN})
206 | exten => _55512XX,1,Answer()
207 | same => n,Playback(tt-monkeys)
208 |
209 |
210 | Записи (они же подсказки) будут помещены в директорию _/var/lib/asterisk/sounds_. Вы можете поместить их в другое место, если вы укажете полный путь при записи и воспроизведении (и убедитесь, что каталог, в который вы их поместили, доступен пользователю `asterisk`). В производственной системе их следует размещать в другом месте, чтобы отделить пользовательские приглашения от общих. На данный момент мы не будем усложнять и поместим их в ту же директорию, что и системные подсказки.
211 |
212 | ### Диалплан
213 |
214 | Вот код, необходимый для создания АС, который мы разработали ранее. Мы часто используем пустые строки перед метками внутри расширения, чтобы облегчить чтение диалплана, но обратите внимание, что только потому, что есть пустая строка, не означает, что есть другое расширение.
215 |
216 | Вы можете поместить этот код в конце контекста `[TestMenu]`, прямо перед вашими подпрограммами:
217 |
218 | ```
219 | [MainMenu]
220 |
221 | exten => s,1,Verbose(1, Caller ${CALLERID(all)} has entered the auto attendant)
222 | same => n,Answer()
223 |
224 | ; this sets the inter-digit timer
225 | same => n,Set(TIMEOUT(digit)=2)
226 |
227 | ; wait one second to establish audio
228 | same => n,Wait(1)
229 |
230 | ; Если с Пн-Пт с 9-17 переход на метку daygreeting
231 | same => n,GotoIfTime(9:00-17:00,mon-fri,*,*?daygreeting:afterhoursgreeting)
232 |
233 | same => n(afterhoursgreeting),Background(nightgreeting) ; ПРИВЕТСТВИЕ НЕРАБОЧЕГО ВРЕМЕНИ
234 | same => n,Goto(menuprompt)
235 |
236 | same => n(daygreeting),Background(daygreeting) ; ДНЕВНОЕ ПРИВЕТСТВИЕ
237 | same => n,Goto(menuprompt)
238 |
239 | same => n(menuprompt),Background(mainmenu) ; ПОДСКАЗКА ГЛАВНОГО МЕНЮ
240 | same => n,WaitExten(4) ; более 4 секунд скорее всего
241 | ; слишком много
242 | same => n,Goto(0,1) ; Считайте, что вызывающий нажал '0'
243 |
244 | exten => 1,1,Verbose(1, Caller ${CALLERID(all)} has entered the sales queue)
245 | same => n,Goto(sets,610,1) ; Очередь sales - смотри Главу 12 для подробностей
246 |
247 | exten => 2,1,Verbose(1, Caller ${CALLERID(all)} has entered the service queue)
248 | same => n,Goto(sets,611,1) ; Очередь support - смотри Главу 12 для подробностей
249 |
250 | exten => 3,1,Verbose(1, Caller ${CALLERID(all)} has requested address and fax info)
251 | same => n,Background(faxandaddress) ; Информация об адресе и факсе
252 | same => n,Goto(s,menuprompt) ; Вернуть абонента к подсказке главного меню
253 |
254 | exten => #,1,Verbose(1, Caller ${CALLERID(all)} is entering the directory)
255 | same => n,Directory(default) ; Отправить абонента в каталог.
256 | ; Использовать InternalSets в качестве контекста набора
257 |
258 | exten => 0,1,Verbose(1, Caller ${CALLERID(all)} is calling the operator)
259 | same => n,Goto(sets,611,1) ; Очередь support - смотри Главу 12 для подробностей
260 |
261 | exten => i,1,Verbose(1, Caller ${CALLERID(all)} has entered an invalid selection)
262 | same => n,Playback(invalid)
263 | same => n,Goto(s,menuprompt)
264 |
265 | exten => t,1,Verbose(1, Caller ${CALLERID(all)} has timed out)
266 | same => n,Goto(0,1)
267 |
268 | ; Вы должны иметь шаблон соответствия для внутренних номеров,
269 | ; которые вы позволите набирать внешним абонентам
270 | ; НО НЕ ПРОСТО ВКЛЮЧИТЬ КОНТЕКСТ LocalSets
271 | ; ИНАЧЕ АБОНЕНТЫ СМОГУТ СОВЕРШАТЬ ЗВОНКИ ИЗ ВАШЕЙ СИСТЕМЫ.
272 |
273 | ; ЧТО БЫ ВЫ НИ ДЕЛАЛИ ЗДЕСЬ, ТЩАТЕЛЬНО ПРОВЕРЬТЕ, ЧТОБЫ УБЕДИТЬСЯ, ЧТО ВНЕШНИЕ АБОНЕНТЫ
274 | ; НЕ СМОГУТ СДЕЛАТЬ НИЧЕГО, КРОМЕ НАБОРА ВНУТРЕННИХ НОМЕРОВ
275 |
276 | exten => _1XX,1,Verbose(1,Call to an extension starting with '1')
277 | same => n,Goto(sets,${EXTEN},1)
278 | ```
279 |
280 | ### Доставка входящих звонков в АС
281 |
282 | Любой вызов, поступающий в систему, будет входить в диалплан в контексте, определенном для канала, на который поступает вызов. Во многих случаях это будет контекст с именем `[incoming]` или `[from-pstn]`, или что-то подобное. Вызовы будут поступать либо с добавочным номером (как в случае с DID), либо без него (как в случае с традиционной аналоговой линией).
283 |
284 | Как бы ни назывался контекст и как бы ни назывался добавочный номер, вы будете отправлять каждый входящий вызов в меню.
285 |
286 | ```
287 | [incoming] ; DID, приходящие в канал с
288 | ; context=incoming
289 | exten => 4169671111,1,Goto(MainMenu,s,1)
290 | ```
291 |
292 | В зависимости от того, как вы настраиваете входящие каналы, обычно будете использовать приложение `Goto()` для отправки вызова AС. Это гораздо аккуратнее, чем просто кодирование всего АС во входящем контексте.
293 |
294 | Поскольку у нас в лаборатории7 нет больше входящих линий, мы создадим простое расширение, которое доставит нас к нашему новому модному АС:
295 |
296 | ```
297 | exten => 613,1,Noop()
298 | same => n,Goto(MainMenu,s,1)
299 | same => n,Hangup()
300 | ```
301 |
302 | И это все! Простой автосекретарь, которым легко управлять, и который справится с ожиданиями большинства абонентов.
303 |
304 | ### IVR
305 |
306 | Мы рассмотрим интерактивное голосовое меню (IVR) более подробно в [Главе 16](glava-16.md), но прежде чем мы это сделаем поговорим о том, что важно для любого IVR. Интеграция баз данных является предметом следующей главы.
307 |
308 | ## Вывод
309 |
310 | Автосекретарь может предоставить очень полезную услугу для абонентов. Однако, если он не разработан и хорошо реализован, то также может стать барьером для ваших абонентов, который может отпугнуть их. Потратьте время, чтобы тщательно спланировать свой АС и держать его простым.
311 |
312 |
313 | - Это, скорее всего, потому, что "IVR" гораздо легче сказать, чем "автосекретарь".
314 | - Следует отметить, что Asterisk - это отличный инструмент для создания IVR. Но также отлично подходит и для создания автосекретаря.
315 | - При необходимости вы можете использовать программу редактирования звука, такую как Audacity, чтобы удалить тишину и даже немного ускорить запись.
316 | - На самом деле, мы обычно не рекомендуем это в AС, потому что это добавляется к тому, что абонент должен слушать, и большинство людей все равно пойдет на сайт для получения такого рода информации.
317 | - Если вы не являетесь экспертом в этих областях, в таком случае пойдите на это!
318 | - Подсказка vm-intro не идеальна (она просит вас оставить сообщение), но она достаточно близка для наших целей. Инструкции по использованию по крайней мере верны: нажмите #, чтобы завершить запись. После того, как вы научились записывать подсказки можете вернуться назад, записать пользовательское приглашение и изменить приоритет 1, чтобы отразить более подходящие инструкции для записи собственных приглашений.
319 | - А если Вы это делаете, то и в Вашей; поздравляю и, пожалуйста, будьте осторожны, плавая с акулами.
320 |
321 |
322 | [Глава 13. Состояния устройств](glava-13.md) | [Содержание](SUMMARY.md) | [Глава 15. Интеграция реляционной базы данных](glava-15.md)
323 |
--------------------------------------------------------------------------------
/glava-16.md:
--------------------------------------------------------------------------------
1 | # Глава 16. Введение в интерактивное голосовое меню
2 |
3 | > _Однажды Алиса подошла к развилке и увидела на дереве Чеширского кота. - По какой дороге мне пойти?- спросила она._
4 | > _“Куда ты хочешь пойти?- был его ответ._
5 | > _“Не знаю, - ответила Алиса._
6 | > _“Тогда, - сказал кот, - это не имеет значения.”_
7 | >
8 | > - Льюис Кэролл
9 |
10 | Термин интерактивое голосовое меню (на самом деле ответ) (IVR) часто неправильно используется для обозначения автосекретаря, но это очень разные вещи. Цель системы IVR состоит в том, чтобы принять входные данные от абонента, выполнить действие, основанное на этих входных данных (обычно, поиск данных во внешней системе, такой как база данных), и сообщить результат абоненту. Назначение автосекретаря (о котором мы говорили в [Главе 14](glava-14.md)) - маршрутизация вызовов. Первоначально IVR даже не должен был быть телефонной системой. Все, что принимало информацию от человека и выдавало на запрос результат, падало вместе с областью IVR. Традиционно системы IVR были сложными, дорогими и раздражающими в реализации. Asterisk все это изменил.
11 |
12 | ## Компоненты IVR
13 |
14 | Самые основные элементы IVR очень похожи на элементы автосекретаря, хотя цель и отличается. Нам нужно по крайней мере одно приветствие чтобы сообщить вызывающему, что ожидает IVR, метод получения входных данных от вызывающего, логику для проверки что ответ вызывающего является допустимым вводом, логику определения следующего шага IVR, и, наконец, механизм хранения ответов, если это применимо. Мы могли бы думать об IVR как о дереве решений, хотя оно не должно иметь никаких ветвей. Например, опрос может представлять точно такой же набор подсказок для каждого вызывающего абонента, независимо от того, какой выбор делают абоненты и единственная логика маршрутизации, включенная в опрос, заключается в том, являются ли полученные ответы допустимыми для вопросов.
15 |
16 | С точки зрения вызывающего абонента, каждый IVR должен начинаться с подсказки. Этот первоначальный запрос будет сообщать абоненту что он попал на IVR и попросит собеседника ввести первые данные. Мы обсуждали подсказки в автосекретаре в Главе 14. Позже мы создадим диалплан, который позволит вам лучше управлять несколькими голосовыми подсказками.
17 |
18 | Второй компонент IVR - это метод получения входных данных от вызывающего абонента. Напомним, что в Главе 14 мы обсуждали `Background()` и `WaitExten()` как метод получения нового расширения. Хотя вы можете создать IVR с помощью `Background()` и `WaitExten()` обычно проще и практичнее использовать приложение `Read()`, которое обрабатывает как приглашение, так и захват ответа. Приложение `Read()` было разработано специально для использования с системами IVR. Его синтаксис выглядит следующим образом:
19 |
20 | ```
21 | Read(variable[,filename[&filename2...]][,maxdigits][,option][,attempts][,timeout])
22 | ```
23 |
24 | Аргументы описаны в Таблице 16-1.
25 |
26 | *Таблица 16-1. Приложение Read()*
27 |
28 |
29 |
30 | Аргумент |
31 | Цель |
32 |
33 |
34 | variable |
35 | Переменная, в которой хранится ответ абонента. Рекомендуется присвоить каждой переменной в IVR имя, аналогичное приглашению, связанному с этой переменной. Это поможет позже, если по деловым соображениям или простоте использования вам потребуется изменить порядок шагов IVR. Присвоение имен переменным var1 , var2 и т.д. может показаться более простым в краткосрочной перспективе, но позже в вашем жизненном цикле это сделает исправление ошибок более трудным. |
36 |
37 |
38 | prompt |
39 | Файл (или список файлов, соединенных вместе с символом & ) для воспроизведения вызывающему абоненту, запрашивающий ввод. Не забудьте опустить расширение в конце каждого имени файла. |
40 |
41 |
42 | maxdigits |
43 | Максимальное количество символов, которые можно использовать в качестве входных данных. В случае вопросов "Да/нет" и "множественный выбор" рекомендуется ограничить это значение 1 . В случае более длинных значений вызывающий абонент всегда может прервать ввод, нажав клавишу # . |
44 |
45 |
46 | options |
47 | s (skip)
48 | Немедленно выйти, если канал не отвечает.
49 | i (indication)
50 | Вместо того чтобы воспроизводить подсказку, воспроизведите какой-либо сигнал индикации (например, сигнал набора номера).
51 | n (no answer)
52 | Считывание цифр от абонента, даже если на линию еще не ответили.
53 | attempts
54 | Количество раз для воспроизведения подсказки. Если вызывающий не вводит ничего, приложение Read() может автоматически запросить пользователя. По умолчанию используется одна попытка.
55 | timeout
56 | Количество секунд, в течение которых вызывающий должен совершить свой ввод. Значение по умолчанию в Asterisk равно 10 секундам, хотя его можно изменить для одного приглашения с помощью этой опции или для всего сеанса, назначив значение с помощью функции диалплана TIMEOUT(response) . |
57 |
58 |
59 |
60 | Как только входные данные получены, они должны быть проверены. Если вы не проверите входные данные, то с большей вероятностью обнаружите, что ваши абоненты жалуются на нестабильное приложение. Недостаточно обрабатывать ожидаемые входные данные; вам также нужно обрабатывать входные данные, которых вы не ожидаете. Например, абоненты могут быть разочарованы и набрать 0 в вашем IVR; если вы сделали хорошую работу, вы будете обращаться с этим деликатно и соедините их с кем-то, кто может помочь им или предоставить полезную альтернативу. Хорошо спроектированный IVR (как и любая программа) будет пытаться предвидеть все возможные входные данные и предоставлять механизмы для изящной их обработки.
61 |
62 | После проверки входных данных вы можете отправить их на внешний ресурс для обработки. Это может быть сделано с помощью запроса в базу данных, отправки в URI, программы AGI или многих других вещей. Это внешнее приложение должно выдать результат, который вы сможете передать обратно абоненту. Это может быть подробный результат такой как "Баланс вашего счета..." или простое подтверждение такое как "ваш счет был обновлен". Мы не можем придумать ни одного реального случая, когда не будет требоваться какой-то результат, возвращаемый звонящему.
63 |
64 | Иногда IVR может иметь несколько шагов, и поэтому результат может включать запрос дополнительной информации от вызывающего абонента для перехода к следующему шагу приложения IVR.
65 |
66 | Можно проектировать очень сложные системы IVR с десятками или даже сотнями возможных путей. Мы уже говорили об этом раньше и повторим еще раз: люди не любят разговаривать с вашей телефонной системой независимо от того насколько она умна. Держите ваше IVR простым для ваших абонентов и они гораздо более вероятно получат некоторую выгоду от него.
67 |
68 |
69 |
70 |
71 | Безупречно вкусное IVR
72 | Отличный пример IVR, который любят использовать люди - это тот, который используют многие компании по доставке пиццы: когда вы звоните, чтобы сделать заказ, IVR смотрит на Ваш CallerID и говорит: "Если вы хотите точно такой же заказ, как в прошлый раз, нажмите 1."
73 | Это все, что оно делает, и это прекрасно.
74 | Очевидно, что эти компании могли бы разработать массивно сложные IVR, которые позволили бы Вам выбрать каждую деталь вашего пирога ("для семизерновой корочки, нажмите 7"), но сколько нетрезвых, голодных клиентов могли бы успешно перемещаться по чему-то подобному в 3 часа ночи?
75 | Лучшее IVR - это те, которые требуют наименьшего количества входных данных от вызывающего абонента. Жми эту кнопку 1 и Ваша'ца уже в пути! Ура!
76 | |
77 |
78 |
79 |
80 | ## Конструктивные соображения IVR
81 |
82 | При разработке вашего собственного IVR, есть некоторые важные вещи, которые следует иметь в виду. Мы составили этот список вещей, которые нужно и не нужно делать в вашем IVR.
83 |
84 | Делать
85 | * Держать его простым.
86 | * Должна быть возможность набрать 0, чтобы связаться с живым человеком.
87 | * Корректно обрабатывать ошибки.
88 |
89 | Не делать
90 |
91 | * Подумать что IVR может полностью заменить людей.
92 | * Использовать ваше IVR, чтобы показать людям насколько вы умны.
93 | * Попробовать воспроизвести ваш сайт с помощью IVR.
94 | * Постараться построить IVR когда не можете принять числовой или устный ввод. Никто не хочет писать свое имя на клавиатуре телефона.1
95 | * Заставлять своих абонентов слушать рекламу. Помните, что они могут повесить трубку в любой момент, когда пожелают.
96 |
97 | ## Модули Asterisk для создания IVR
98 |
99 | "Фронтенд" IVR (части, которые взаимодействуют с абонентами) может обрабатываться в диалплане. Можно построить систему IVR, используя только диалплан (возможно, с использованием astdb для хранения и извлечения данных); однако, как правило, вам нужно будет взаимодействовать с чем-то внешним по отношению к Asterisk (“бэкенд” IVR).
100 |
101 | ### CURL()
102 |
103 | Функция диалплана `CURL()` в Asterisk позволяет охватить все веб-приложения одной строкой кода диалплана. Мы будем использовать его в нашем примере IVR в этой главе позже.
104 |
105 | Возможно вы найдете `CURL()` довольно простым в использовании, создание веб-приложения потребует опыта работы с веб-разработкой.
106 |
107 | ### func_odbc
108 |
109 | Используя `func_odbc` можно разрабатывать чрезвычайно сложные приложения в Asterisk, используя только код диалплана и поиск по базе данных. Если вы не являетесь сильным программистом, но очень хорошо разбираетесь в диалпланах Asterisk и базах данных, вы полюбите `func_odbc` так же, как и мы. Проверьте это в [Главе 15](glava-15.md).
110 |
111 | ### AGI
112 |
113 | Интерфейс Asterisk Gateway является настолько важной частью интеграции внешних приложений с Asterisk, что мы посвятили ему отдельную главу. Дополнительную информацию вы найдете в [Главе 18](glava-18.md).
114 |
115 | ### AMI
116 |
117 | Интерфейс Asterisk Manager - это интерфейс сокета, который можно использовать для получения информации о конфигурации и состоянии, запроса выполняемых действий и уведомления о событиях происходящих с вызовами. Мы также написали целую главу об АМИ. Дополнительную информацию вы найдете в [Главе 17](glava-17.md).
118 |
119 | ### ARI
120 |
121 | Интерфейс Asterisk REST основан на знаниях, полученных в течение многих лет о том, как интегрировать Asterisk с веб-приложениями текущего поколения. Это настолько важно, что да, еще раз, есть целая глава, посвященная ему. Если вы хотите построить сложное IVR с помощью Asterisk, более подробно рассмотрите ARI в [Главе 19](glava-19.md).
122 |
123 | ## Простое IVR с использованием CURL()
124 |
125 | Прежде чем приступить к написанию внешней программы для обработки чего-либо, мы всегда тщательно обдумываем, есть ли способ выполнить работу в диалплане. Один из мощных способов, которым Asterisk может взаимодействовать с внешними данными - это URL-адрес, что очень хорошо делает программа GNU/Linux cURL. В Asterisk функция `CURL()` является функцией диалплана.
126 |
127 | Мы собираемся использовать `CURL()` в качестве примера того, как может выглядеть чрезвычайно простое IVR. Мы запросим наш внешний IP-адрес у [https://ipinfo.io/ip](https://ipinfo.io/ip).2
128 |
129 |
130 |
131 |
132 | Примечание
133 | На самом деле, большинство приложений IVR будут намного сложнее. Даже большинство применений CURL() будет сложным, так как URI может возвращать массивный и сильно изменяющийся объем данных, подавляющее большинство из которых будет непонятно Asterisk. Дело в том, что IVR - это не только диалплан; это также очень много о внешних приложениях, которые запускаются диалпланом, которые выполняют реальную работу IVR.
134 | |
135 |
136 |
137 |
138 | Модуль `CURL()` был установлен во время нашего процесса установки несколько глав назад.
139 |
140 | ### Диалплан
141 |
142 | Диалплан для нашего примера IVR очень прост. Функция `CURL()` извлекает ваш IP-адрес из [https://ipinfo.io/ip](https://ipinfo.io/ip), а затем `SayAlpha()` озвучит результат вызывающему абоненту:
143 |
144 | ```
145 | exten => *764,1,Verbose(2, Run CURL to get IP address from whatismyip.org)
146 | same => n,Answer()
147 | same => n,Set(MyIPAddressIs=${CURL(https://ipinfo.io/ip)})
148 | same => n,SayAlpha(${MyIPAddressIs})
149 | same => n,Hangup()
150 | ```
151 |
152 | Простота этого до невозможности крута. В традиционной системе IVR на программирование такого рода может уйти несколько дней, если предположить, что это вообще возможно.
153 |
154 | ## A Prompt-Recording IVR Function
155 |
156 | В [Главе 14](glava-14.md) мы создали простой диалплан для записи подсказок. Он был довольно ограничен в том, что записывал только одно имя файла, и поэтому для каждого запроса требовалось отдельное расширение. Здесь мы расширим его чтобы создать полноценное меню для записи подсказок. Поскольку это сложная часть диалплана, а не подпрограмма или локальный канал, мы создадим новый раздел диалплана для различных функций и поместим туда такие вещи:
157 |
158 | ```
159 | ;FEATURES
160 | [prompts]
161 | exten => s,1,Answer
162 | exten => s,n,Set(step1count=0) ; Инициализация счетчиков
163 |
164 | ; If we get no response after 3 times, we stop asking
165 | same => n(beginning),GotoIf($[${step1count} > 2]?end)
166 | same => n,Read(which,prompt-instructions,3)
167 | same => n,Set(step1count=$[${step1count} + 1])
168 |
169 | ; All prompts must be 3 digits in length
170 | same => n,GotoIf($[${LEN(${which})} != 3]?beginning)
171 | same => n,Set(step1count=0) ; Запрос успешен; сброс счетчиков
172 | same => n,Set(step2count=0)
173 |
174 | same => n(step2),Set(step2count=$[${step2count} + 1])
175 | same => n,GotoIf($[${step2count} > 2]?beginning) ; Нет ответа после 3 попыток
176 |
177 | ; If the file doesn't exist, then don't ask whether to play it
178 | same => n,GotoIf($[${STAT(f,/var/lib/asterisk/sounds/${which}.wav)} = 0]?recordonly)
179 | same => n,Background(prompt-tolisten)
180 |
181 | same => n(recordonly),Background(prompt-torecord)
182 | same => n,WaitExten(10) ; Ожидаем 10 секунд ответа
183 | same => n,Goto(step2)
184 |
185 | same => n(end),Playback(goodbye)
186 | same => n,Hangup()
187 |
188 | exten => 1,1,Set(step2count=0)
189 | same => n,Background(/var/lib/asterisk/sounds/${which})
190 | same => n,Goto(s,step2)
191 |
192 | exten => 2,1,Set(step2count=0)
193 | same => n,Playback(prompt-waitforbeep)
194 | same => n,Record(${CHANNEL(uniqueid)}.wav)
195 |
196 | same => n(listen),Playback(${CHANNEL(uniqueid)})
197 | same => n,Set(step3count=0)
198 | same => n,Read(saveornot,prompt-1tolisten-2tosave-3todiscard,1,,2,3)
199 | same => n,GotoIf($["${saveornot}" = "1"]?listen)
200 | same => n,GotoIf($["${saveornot}" = "2"]?saveit)
201 | same => n,GotoIf($["${saveornot}" = "3"]?tossit)
202 | same => n,Goto(listen)
203 |
204 | same => n(tossit),System(rm -f /var/lib/asterisk/sounds/${CHANNEL(uniqueid)}.wav)
205 | same => n,Goto(s,beginning)
206 |
207 | same => n(saveit),Noop('Set' app used to shorten example)
208 | same => n,Set(PromptToSave=/var/lib/asterisk/sounds/${CHANNEL(uniqueid)}.wav
209 | same => n,Set(WhereToSave=/var/lib/asterisk/sounds/${which}.wav
210 | same => n,System(mv -f ${PromptToSave} ${WhereToSave})
211 | same => n,Playback(prompt-saved)
212 | same => n,Goto(s,beginning)
213 | ```
214 |
215 | В этой системе имя запроса больше не является описательным; вместо этого оно является числом. Это означает, что вы можете записывать гораздо большее разнообразие приглашений, используя один и тот же механизм, но компромисс заключается в том, что ваши приглашения больше не будут иметь описательных имен.
216 |
217 | Если вы хотите проверить его, вам нужно будет записать подсказки, которые использует эта функция IVR (это своего рода мета, но да, нашему создателю подсказок нужны подсказки).
218 |
219 | Поместите это в свой диалплан:
220 |
221 | ```
222 | exten => 510,1,GoSub(subRecordPrompt,${EXTEN},1(prompt-tolisten)) ; нажмите 1
223 | exten => 511,1,GoSub(subRecordPrompt,${EXTEN},1(prompt-torecord)) ; нажмите 2
224 | exten => 512,1,GoSub(subRecordPrompt,${EXTEN},1(prompt-instructions)) ;3-цифры (от 000 до 999)
225 | exten => 513,1,GoSub(subRecordPrompt,${EXTEN},1(prompt-waitforbeep)) ; ждите сигнала
226 | exten => 514,1,GoSub(subRecordPrompt,${EXTEN},1(prompt-1tolisten-2tosave-3todiscard))
227 | exten => 515,1,GoSub(subRecordPrompt,${EXTEN},1(prompt-saved))
228 | ```
229 |
230 | Затем позвоните им по одному и запишите по мере необходимости.
231 |
232 | После того, как вы записали подсказки, необходимые вашему создателю подсказок, вы должны быть в состоянии проверить их.
233 |
234 | ```
235 | exten => *742,1,Noop(Prompts)
236 | same => n,Goto(prompts,s,1)
237 | same => n,Hangup()
238 | ```
239 |
240 | С этого момента вы можете записывать приглашения, используя только числовой идентификатор. Вам понадобится способ отслеживать что говорит подсказка, но с точки зрения записи вам не нужно больше писать диалплан каждый раз, когда нужна подсказка.
241 |
242 | ## Распознавание речи и преобразование текста-в-речь
243 |
244 | Хотя традиционно и по-прежнему в большинстве случаев сегодня система IVR представляет предварительно записанные подсказки вызывающему абоненту и принимает ввод через панель набора номера, также возможно: а) искусственно генерировать подсказки, широко известные как преобразование текста-в-речь; и б) принимать устный ввод через механизм распознавания речи.
245 |
246 | В то время как концепция возможности вести интеллектуальный разговор с машиной - это то, что авторы научной фантастики обещают нам в течение многих лет, реальная наука об этом остается сложной и подверженной ошибкам. Несмотря на свои удивительные возможности, компьютеры плохо приспособлены к задаче оценки тонких нюансов человеческой речи.
247 |
248 | Тем не менее, следует отметить, что такие компании, как Google, достигли удивительных успехов как в преобразовании текста-в-речь так и в распознавании речи. Уже доступны API, которые могут проделать замечательную работу по осмыслению того, что им говорят. Google, конечно, выигрывает от наличия массивного бэкенда, который может выполнять почти чудесные трюки обработки; то, что ваш IVR не сможет полностью использовать.
249 |
250 | ### Преобразование текста-в-речь
251 |
252 | Преобразование текста-в-речь (также известное как синтез речи) требует, чтобы система была способна искусственно создавать фразы из сохраненных данных. Хотя было бы неплохо, если бы мы могли просто назначить звук букве и заставить компьютер воспроизводить каждый звук, когда он читает буквы, письменный язык часто не фонетичен и редко отражает нюансы речи (английский, возможно, один из худших языков в этом отношении).
253 |
254 | Существуют отличные API, доступные от Google (и других), которые сделают очень хорошую работу по чтению того, что было написано. На момент написания этой книги все еще очень очевидно, что речь идет о компьютере, но тем не менее можно генерировать системные подсказки на лету из текста, а не записывать их заранее. Полезность этого трудно оценить, так как люди все еще не заинтересованы в разговоре с вашими машинами; они позвонили потому что хотят поговорить с вами.
255 |
256 | ### Распознавание речи
257 |
258 | Поскольку нам удалось убедить наши компьютеры говорить с нами, мы, естественно, хотим иметь возможность говорить и с ними.3
259 |
260 | Распознавание речи раньше было сложным и дорогостоящим, но недавно Google выпустила API, который позволяет огромной мощности их возможностей распознавания речи быть доступной для внешних приложений.
261 |
262 | ## Вывод
263 |
264 | Asterisk является отличной платформой IVR. Вся эта книга, во многом, учит вас навыкам, которые могут быть применены для развития IVR. В то время как основные СМИ действительно уделяют внимание Asterisk только как “свободной УАТС”, реальность такова, что Asterisk является наиболее мощной, когда используется в качестве IVR. В любой солидной организации очень вероятно, что системные администраторы Linux используют Asterisk для решения телекоммуникационных проблем, которые ранее были либо неразрешимыми, либо невероятно дорогими для решения. Это скрытая революция, но не менее значимая из-за своей относительной неизвестности.
265 |
266 | Если вы занимаетесь IVR-бизнесом, вам обязательно нужно познакомиться с Asterisk.
267 |
268 | ---
269 |
270 |
271 | - Особенно если это что-то вроде Ван Меггелена.
272 | - Эти бесплатные сайты поиска IP-адресов, похоже, все время покупаются и превращаются в рекламные шлюзы, поэтому то, что работало при написании этой книги, может больше не работать. Вам нужен сайт который вернет ваш IP-адрес и ничего больше. Сегодня, например https://ipinfo.io/ip К тому времени, когда вы прочтете это может быть что-то другое.
273 | - Вообще-то, большинство из нас разговаривает с компьютерами, но это редко бывает вежливо.
274 |
275 |
276 | [Глава 15. Интеграция реляционной базы данных](glava-15.md) | [Содержание](SUMMARY.md) | [Глава 17. AMI и файлы вызовов](glava-17.md)
277 |
--------------------------------------------------------------------------------
/glava-19.md:
--------------------------------------------------------------------------------
1 | # Глава 19. Asterisk REST Interface
2 |
3 | > Люди, которые думаю, будто все знают, раздражают нас, людей, которые действительно все знают.
4 | >
5 | > -- Айзек Азимов
6 |
7 | Интерфейс Asterisk REST (ARI) был создан для устранения ограничений, присущих разработке внешних или расширенных функций вне Asterisk. В то время как AGI позволяет запускать внешние приложения, а AMI позволяет осуществлять наблюдение и контроль выполняемых вызовов, любая попытка интегрировать их в полное внешнее приложение быстро становится сложной и запутанной. ARI позволяет разработчикам создавать автономное и полное приложение, используя Asterisk в качестве базового движка.
8 |
9 | На момент написания этой статьи ARI требует очень простого диалплана для запуска приложения `Stasis()`, которое затем передает канал ARI. К тому времени, когда вы читаете это, очень вероятно, что это требование изменилось, поскольку сообщество разработчиков Asterisk активно работает над тем, чтобы позволить ARI появляться без какого-либо диалплана в середине.
10 |
11 | Использование внешнего интерфейса, такого как ARI, для управления Asterisk, не обязательно облегчит вашу жизнь. Навыки, необходимые для реализации и устранения неполадок приложений этого типа, требуют комплексного набора навыков не только на выбранном языке, но и в области системного администрирования Linux, администрирования Asterisk, устранения неполадок в сети и основных концепций телефонии. Для опытного разработчика ARI может дать необходимую мощь в приложениях, но для тех, кто учится, мы рекомендуем изучить диалплан прежде чем погружаться во внешние среды разработки. Диалплан является своеобразным, но он также полностью интегрирован, высокопроизводителен и относительно прост в освоении.
12 |
13 | Сказав это, давайте разберемся с ARI.
14 |
15 | ## ARI быстрый старт
16 |
17 | В этом разделе приведен простой рабочий пример ARI. Позже в этой главе мы рассмотрим все более подробно.1
18 |
19 |
20 |
21 |
22 | Предупреждение
23 | В этом разделе быстрого старта мы будем использовать очень простой уровень доступа HTTP. Вы должны быть очень осторожны при вводе такого рода конфигурации в продакшен. Если, например, вы собираетесь запустить приложение на отдельном компьютере и подключить его к Asterisk через сокет, то потребуется более безопасное соединение. То, что мы делаем в этом разделе, сродни парусному клубу, использующему шлюпки для обучения; полезно в качестве начинания, но глупо и опасно выходить в море на таком судне.
24 | |
25 |
26 |
27 |
28 | ### Базовая конфигурация Asterisk
29 |
30 | У вас уже должен быть запущен веб-сервер Asterisk, поэтому вам просто нужно проверить, что ваш файл _/etc/asterisk/http.conf_ выглядит следующим образом:
31 |
32 | ```text
33 | [general]
34 | enabled = yes
35 | bindaddr = 127.0.0.1
36 | ```
37 |
38 | Далее нужен простой файл _/etc/asterisk/ari.conf_:
39 |
40 | ```text
41 | [general]
42 | enabled = yes
43 | pretty = yes
44 | [asterisk]
45 | type = user
46 | read_only = no
47 | password = чтобывыниделалинеиспользуйтеэтотпароль
48 | ```
49 |
50 | Хорошо, давайте загрузим модуль `ari` сейчас:
51 |
52 | ```text
53 | $ sudo asterisk -rx 'module load res_ari.so'
54 | Loaded res_ari.so => (Asterisk RESTful Interface)
55 | ```
56 |
57 | Затем в файл _/etc/asterisk/extensions.conf_ необходимо добавить расширение для запуска приложения диалплана `Stasis()`:2
58 |
59 | ```text
60 | exten => 242,1,Noop()
61 | same => n,Stasis(zarniwoop)
62 | same => n,Hangup()
63 | ```
64 |
65 | Перезагрузите ваш диалплан с помощью:
66 |
67 | ```text
68 | $ sudo asterisk -rx 'dialplan reload'
69 | Dialplan reloaded.
70 | ```
71 |
72 | На этом этапе может быть стоит просто перезагрузить Asterisk:
73 |
74 | ```text
75 | $ sudo service asterisk restart
76 | ```
77 |
78 | Осталось всего несколько шагов, и вы готовы протестировать свою среду ARI.
79 |
80 | ### Тестирование вашей среды ARI
81 |
82 | Поскольку ARI зависит от WebSockets, нам понадобится инструмент, позволяющий тестировать из командной строки. Node.JS package manager (npm) позволит нам найти и установить инструмент сканирования, который мы будем использовать для наших тестов.
83 |
84 | ```text
85 | $ sudo yum -y install npm
86 | $ sudo npm install -g wscat
87 | /usr/bin/wscat -> /usr/lib/node_modules/wscat/bin/wscat
88 | /usr/lib
89 | +-- wscat@2.2.1
90 | +-- commander@2.15.1
91 | +-- read@1.0.7
92 | ¦ +-- mute-stream@0.0.8
93 | +-- ws@5.2.2
94 | +-- async-limiter@1.0.0
95 | ```
96 |
97 | Теперь давайте зажжем его и посмотрим, что получим!
98 |
99 | ```text
100 | $ wscat -c "ws://localhost:8088/ari/events?api_key= \
101 | asterisk:чтобывыниделалинеиспользуйтеэтотпароль&app=zarniwoop"
102 |
103 | connected (press CTRL+C to quit)
104 | >
105 | ```
106 |
107 | Пока все идет хорошо. Давайте сделаем звонок в наше приложение `Stasis()` и посмотрим что произойдет.
108 |
109 | Откройте новое окно SSH (оставьте предыдущее как есть, чтобы видеть что происходит в сеансе `wscat`). Подключитесь к CLI Asterisk в этом новом сеансе оболочки:
110 |
111 | ```text
112 | $ sudo asterisk -rvvvv
113 | ```
114 |
115 | Используя один из ваших лабораторных телефонов, позвоните на номер 242.
116 |
117 | В Asterisk CLI, вы должны увидеть это:
118 |
119 | ```text
120 | *CLI>
121 | == Setting global variable 'SIPDOMAIN' to '172.29.1.57'
122 | -- Executing [242@sets:1] NoOp("PJSIP/SOFTPHONE_A-00000001", "") in new stack
123 | -- Executing [242@sets:2] Stasis("PJSIP/SOFTPHONE_A-00000001", "zarniwoop") in new stack
124 | ```
125 |
126 | И в сеансе `wscat` вы должны увидеть это:
127 |
128 | ```text
129 | >
130 | < {
131 | "type": "StasisStart",
132 | "timestamp": "2019-01-27T21:43:43.720-0500",
133 | "args": [],
134 | "channel": {
135 | "id": "1548643423.2",
136 | "name": "PJSIP/SOFTPHONE_A-00000002",
137 | "state": "Ring",
138 | "caller": {
139 | "name": "101",
140 | "number": "SOFTPHONE_A"
141 | },
142 | "connected": {
143 | "name": "",
144 | "number": ""
145 | },
146 | "accountcode": "",
147 | "dialplan": {
148 | "context": "sets",
149 | "exten": "242",
150 | "priority": 2
151 | },
152 | "creationtime": "2019-01-27T21:43:43.709-0500",
153 | "language": "en"
154 | },
155 | "asterisk_id": "08:00:27:27:bf:0e",
156 | "application": "zarniwoop"
157 | }
158 | >
159 | ```
160 |
161 | Хорошо, теперь мы откроем еще один сеанс оболочки3, чтобы взаимодействовать с этим соединением, которое мы создали. Из этой новой оболочки выполните следующую команду:
162 |
163 | ```text
164 | $ curl -v -u asterisk:чтобывыниделалинеиспользуйтеэтотпароль -X POST \
165 | "http://localhost:8088/ari/channels/1548643423.2/play?media=sound:believe-its-free" sd
166 | ```
167 |
168 | Обратите внимание, что "`id` "из JSON, возвращаемый в сеансе `wscat`, должен использоваться после части `'channels/'` команды `curl`. Другими словами, вы должны сопоставить идентификатор канала в вашей команде с идентификатором канала, связанным с вашим вызовом. Таким образом, вы можете одновременно обрабатывать множество звонков.
169 |
170 | ### Работа с вашей средой ARI с использованием Swagger
171 |
172 | Asterisk's ARI был разработан, чтобы быть совместимым со спецификацией Open API (aka Swagger) и это означает, что многие инструменты, совместимые с этой спецификацией, будут работать с ARI. Например, вы можете взаимодействовать с установкой AIR с помощью Swagger-UI, который будет полезен как для отладки, так и в качестве источника документации.
173 |
174 | Во-первых, нам нужно будет открыть наш HTTP-сервер Asterisk в локальной сети (в настоящее время он разрешает только соединения с 127.0.0.1). В вашем файле _/etc/asterisk/http.conf_ мы привяжем HTTP-сервер к локальному IP-адресу машины "Asterisk":
175 |
176 | ```text
177 | $ sudo vim /etc/asterisk/http.conf
178 | ; Включите встроенный HTTP-сервер и прослушивайте только соединения на локальном хосте.
179 | [general]
180 | enabled = yes
181 | ;bindaddr = 127.0.0.1 ; закомментируйте это
182 | bindaddr = 172.29.1.57 ; LAN IP ВАШЕГО СЕРВЕРА ASTERISK
183 | ```
184 |
185 | Далее нам нужно добавить строку в ваш файл _/etc/asterisk/ari.conf_:
186 |
187 | ```text
188 | $ sudo vim /etc/asterisk/ari.conf
189 | [general]
190 | enabled = yes
191 | pretty = yes
192 | allowed_origins=http://ari.asterisk.org
193 | ...
194 | ```
195 |
196 | Сохраните и перезагрузите модули `http` and `ari` в Asterisk:
197 |
198 | ```text
199 | $ sudo asterisk -rx 'module reload http' ; sudo asterisk -rx 'module reload ari'
200 | ```
201 |
202 | Теперь на рабочем столе разработчика откройте браузер и перейдите в раздел [http://ari.asterisk.org](http://ari.asterisk.org/).
203 |
204 | Вы увидите страницу, похожую на Рисунок 19-1.
205 |
206 | 
207 |
208 | _Рисунок 19-1. Swagger UI для ARI_
209 |
210 | Замените `localhost` на LAN IP-адрес вашего сервера Asterisk, а в поле api\_key введите Ваш ARI _`user:password`_ из _/etc/asterisk/ari.conf_ (например, `asterisk:чтобывыниделалинеиспользуйтеэтотпароль`). Если у вас есть все настройки верны, то вы будете вознаграждены с результатами как на Рисунке 19-2.
211 |
212 | 
213 |
214 | _Рисунок 19-2. ARI Swagger_
215 |
216 | Вы видите полную документацию для вашего модуля ARI, и можете на самом деле так же передавать к нему запросы. Это очень полезно при отладке, и хвала людям Digium за это.
217 |
218 | В качестве примера того, для чего это нужно, выберите пункт `endpoints:Endpoint resources`, нажмите кнопку `GET` рядом с `/endpoints`, и вы увидите экран, показанный на Рисунке 19-3.
219 |
220 | 
221 |
222 | _Рисунок 19-3. Получение конечных точек_
223 |
224 | Ну, давай - жми на кнопку "Try it out!".
225 |
226 | Обратите внимание на "`id`" канала в сеансе `wscat`, который вы хотите скопировать для использования в Swagger UI (вы увидите несколько строк вывода JSON, связанных с вызовом).
227 |
228 | Выполните следующие действия по каналу через интерфейс Swagger UI: `POST: Answer` (ответ на канал), `POST: hold` (поставить вызов на удержание), `DELETE: hold` (принять вызов из режима ожидания). Обратите внимание на то, что происходит с каналом в каждом случае.
229 |
230 | Использование этого Swagger UI также документировано в [Asterisk wiki](https://wiki.asterisk.org/wiki/display/AST/Using+Swagger+to+Drive+ARI).
231 |
232 | Это значительно упростит процесс разработки и тестирования.
233 |
234 | Хорошо, это быстрый старт. Давайте нырнем поглубже в ARI.
235 |
236 | ## Строительные блоки ARI
237 |
238 | Есть три компонента, которые работают вместе для обеспечения ARI:
239 |
240 | * RESTful интерфейс, через который внешнее приложение взаимодействует с Asterisk.
241 | * WebSocket, который передает информацию обратно во внешнее приложение из Asterisk (в формате JSON).
242 | * Приложение диалплана `Stasis()`, которое соединяет управление каналом с внешним приложением.
243 |
244 | ### REST
245 |
246 | Термин _RESTful_ происходит от Representational State Transfer (REST), который является архитектурной моделью для веб-служб (в отличие, скажем, от протокола\). Термин RESTful обычно относится к любому API, который обеспечивает взаимодействие через URL-адреса с данными, представленными в формате JSON.4 Итак, все, что является "RESTfull", должно соответствовать ограничениям REST, но на практике может быть реализовано как более свободная интерпретация (которая, если выполнит свою работу, действительно может быть достаточно хорошей).
247 |
248 | ### WebSocket
249 |
250 | Соединение WebSocket - это механизм, который осуществляет связь между внутренними компонентами Asterisk и интерфейсом RESTful. В Asterisk могут происходить события, которые клиент не инициировал, и WebSocket позволяет Asterisk сигнализировать об этих изменениях клиенту.
251 |
252 | Встроенный HTTP-сервер Asterisk потенциально предоставляет другие сервисы через веб-интерфейс. Например, WebRTC также подключается через веб-сервер. Если вы вносите изменения или добавляете новые службы, убедитесь, что проверили не только элемент, над которым работаете, но и другие службы, работающие через тот же сервер, чтобы убедиться, что случайно не расстроили что-то другое.
253 |
254 | ### Stasis
255 |
256 | Шина сообщений Stasis позволяет ядру Asterisk связывать события с другими модулями и компонентами. Она как правило является внутренней для Asterisk; тем не менее, в случае ARI приложение диалплана с именем `Stasis()` позволяет диалплану передать управление вызовами внешнему приложению ARI.
257 |
258 | Само приложение `Stasis()` требуется для того, чтобы сигнализировать диалплану, что управление вызовами должно быть передано внешней программе через ARI.
259 |
260 |
261 |
262 |
263 | Начиная с Asterisk 16, больше нет необходимости писать код диалплана для определения соединения от входящего канала к клиентскому приложению ARI. Многие разработчики в сообществе Asterisk пишут всю свою логику управления вызовами во внешних приложениях, и необходимость писать несколько строк диалплана только для передачи каналов в свое приложение считалась сложной и запутанной. Они запросили (и разработали) механизм, с помощью которого Asterisk автоматически создает диалплан для обработки этой функции.
264 | При создании экземпляра API, ссылка на приложение в URL-адресе — например, наше приложение zarniwoop - инициирует автоматическое создание контекста диалплана, названного в соответствии с именем приложения (в данном случае [stasis-zarniwoop] ), включая расширение, шаблон которого соответствует всему. Затем это расширение будет передавать все вызовы, поступающие в этот контекст в Stasis(zarniwoop) . Вам нужно будет связать ваши каналы с правильным контекстом (context=stasis-zarniwoop ) в ваших таблицах конфигурации PJSIP (или другого канала), и в момент вызова этих каналов они будут автоматически подключены через Stasis() к клиентскому приложению.
265 | Если все это кажется запутанным, нет причин, по которым вам нужно прекратить использовать фактический диалплан для обработки этого, как мы делали ранее в нашем примере быстрого запуска.
266 | |
267 |
268 |
269 |
270 | Понимание работы `Stasis()` обычно не требуется, если вы не собираетесь разрабатывать сам продукт Asterisk (т.е. присоединиться к команде разработчиков Asterisk и создавать новые возможности в Asterisk).
271 |
272 | Как правило, после первых экспериментов с ARI вы захотите реализовать фреймворк для облегчения работ по разработке внешнего приложения.
273 |
274 | ## Фреймворки
275 |
276 | Производственное приложение, использующее ARI, выиграет от внедрения платформы для упрощения разработки, добавления уровня безопасности и обеспечения среды управления.
277 |
278 | Существует несколько таких библиотек. Какую из них вы выберете отчасти будет продиктовано тем, какой язык вы предпочитаете использовать, а также должны учитывать, имеет ли структура, в которой вы заинтересованы, активное сообщество и наличие активной поддержки.
279 |
280 | Те, которые описаны ниже, перечислены в Asterisk wiki. Мы рассмотрели репозиторий кода для каждого, и хотя некоторые проекты все еще активно поддерживаются, другие не обновлялись в течение довольно продолжительного времени. Если вы планируете реализовать один из этих фреймворков, вам нужно будет сделать собственную экспертизу, чтобы убедиться, что вы можете получить поддержку для него. Во многих случаях, возможно, стоит обратиться к разработчикам и определить их ставки за консультации, чтобы вы могли обеспечить приоритетный доступ к их времени, если вам это нужно.
281 |
282 | ### ari-py (и aioari) для Python
283 |
284 | Фреймворк [ari-py](https://github.com/asterisk/ari-py) была написана Digium в 2013-2014 годах и с тех пор она не обновлялась. Эта структура основана на клиенте Asterisk Swagger.py.
285 |
286 | Вскоре после выпуска ari-py он был разветвлен в [проект aioari](https://pypi.org/project/aioari/), который предоставляет асинхронную версию ari-py. С тех пор этот код постоянно обновляется (хотя на момент написания этой статьи он не обновлялся с начала 2018 года). Эта структура должна быть включена в вашу оценку структуры Python для ARI.
287 |
288 | Если вы хотите разрабатывать приложения ARI на Python, одна из этих двух платформ может быть тем, что вы ищете. Если хотите создать большое приложение ARI - вам необходимо убедиться, что вы тщательно проверили влияние производительности использования Python на то, что делаете.
289 |
290 | Digium предоставил образцы для этой структуры (и других) на [_https://github.com/asterisk/ari-examples_](https://github.com/asterisk/ari-examples).
291 |
292 | ### node-ari-client
293 |
294 | Для любителей JavaScript есть основанный на Node.js ARI-фреймворк, который был впервые выпущен в начале 2014 года, и на момент написания этой статьи все еще обновляется. Он основан на автоматически генерируемом API, который приходит из swagger-js.
295 |
296 | Для разработчиков JavaScript/Node, вы можете начать: [_https://github.com/asterisk/node-ari-client_](https://github.com/asterisk/node-ari-client).
297 |
298 | Digium предоставил образцы для этой структуры (и других) на [_https://github.com/asterisk/ari-examples_](https://github.com/asterisk/ari-examples).
299 |
300 | ### AsterNET.ARI
301 |
302 | Сторонники Windows так же не остались в стороне. Проект AsterNET.ARI предоставляет платформу для .NET, которая дополняет проект Masternet \(который также включает интеграцию с интерфейсами Asterisk FastAGI и AMI\).
303 |
304 | Вы можете найти репозиторий для AsterNET.ARI здесь: [_https://github.com/skrusty/AsterNET.ARI_](https://github.com/skrusty/AsterNET.ARI).
305 |
306 | Digium предоставил образцы для этой структуры (и других) на [_https://github.com/asterisk/ari-examples_](https://github.com/asterisk/ari-examples).
307 |
308 | ### ari4java
309 |
310 | Проект ari4java является одним из наиболее активно разрабатываемых фреймворков ARI, которые мы нашли. Он разрабатывался с 2013 года, и репозиторий получал коммиты одновременно с этой записью.
311 |
312 | Если Java - ваш язык, вы точно захотите проверить репозиторий ari4java по адресу [_https://github.com/l3nz/ari4java_](https://github.com/l3nz/ari4java).
313 |
314 | ### phpari
315 |
316 | Проект phpari предоставляет платформу ARI для сообщества PHP. Он разрабатывался с 2014 года, и на момент написания этой статьи репозиторий все еще обновлялся.
317 |
318 | Для поклонников PHP вы найдете репозиторий по адресу [_https://github.com/greenfieldtech-nirs/phpari_](https://github.com/greenfieldtech-nirs/phpari).
319 |
320 | ### aricpp
321 |
322 | Если вы привыкли писать на C++, есть даже проект ARI для вас. Платформа aricpp состоит только из файлов заголовков, так что вы можете встроить свои функции прямо в то, что разрабатываете. Эта библиотека также была протестирована на производительность с помощью SIPp, и хотя у нас нет цифр по этому поводу, нам кажется, что скомпилированная среда, которая была протестирована на производительность, очень стоит того, чтобы её попробовать, если у вас есть соответствующие навыки.
323 |
324 | Один из самых новых фреймворков ARI, этот проект получает регулярные обновления. Проверьте его [_https://github.com/daniele77/aricpp_](https://github.com/daniele77/aricpp).
325 |
326 | ### asterisk-ari-client
327 |
328 | Да, Ruby тоже имеет фреймворк ARI.
329 |
330 | Вы можете найти его по адресу [_https://github.com/svoboda-jan/asterisk-ari_](https://github.com/svoboda-jan/asterisk-ari).
331 |
332 | ## Вывод
333 |
334 | ARI предоставляет RESTful API текущего поколения, который может использоваться для разработки коммуникационных приложений с использованием популярных языков разработки. С его помощью опытный разработчик может использовать мощь самой успешной платформы АТС в истории. Это позволяет коммуникационным приложениям следующего поколения взаимодействовать с устаревшими телекоммуникационными протоколами и приложениями, что может оказаться очень полезным, поскольку мы все чаще призваны преодолевать разрыв между прошлым, настоящим и будущим коммуникационных технологий.
335 |
336 | ---
337 |
338 |
339 | - Хотя, честно говоря, в конфигурации нет особой сложности, если вы решите внедрить одну из платформ, что настоятельно рекомендуется для продакшена, и которую мы рассмотрим позже.
340 | - Мы назвали приложение "zarniwoop", потому что “hello-world” использовалось в Digium wiki для ARI, и нам показалось, что лучше избегать перекрытия. Вы, конечно, можете назвать его как угодно.
341 | - Если ваш компьютер имеет только один экран, то, вероятно, это то место, где вы задумаетесь, что неплохо было бы иметь их больше.
342 | - Строго говоря, REST - это гораздо больше, но на практике в наши дни не редкость предположить, что REST API будет основан на URL и JSON просто потому, что много сервисов представлены именно в этих форматах.
343 |
344 |
345 | [Глава 18. AGI](glava-18.md) | [Содержание](SUMMARY.md) | [Глава 20. WebRTC](glava-20.md)
346 |
--------------------------------------------------------------------------------
/glava-20.md:
--------------------------------------------------------------------------------
1 | # Глава 20. WebRTC
2 |
3 | > _Web, каким я его себе представлял, мы еще не видели. В будущем все еще намного больше, чем прошлом._
4 | >
5 | > -- Тим Бернерс-Ли
6 |
7 | ## **Браузер как телефон**
8 |
9 | В интернет-коммуникации назревает новая революция и, хотя она вряд ли наделает столько шума как революция телекоммуникаций с открытым исходным кодом, она определенно имеет потенциал чтобы тихо заменить сердце каждого текущего коммуникационного приложения.
10 |
11 | Сегодня интернет предлагает множество приложений для конференций с закрытым исходным кодом. Все они делают примерно одно и то же, и все же большинство из них требуют установки проприетарного программного обеспечения прежде, чем вы сможете их использовать \(что, конечно, поможет сохранить загрузку в памяти вашего компьютера\). Каждое из них не отличается от последнего приложения конференц-связи, которое вы были вынуждены установить \(для некоторых других встреч, на которых вы присутствовали\). Каждая из этих компаний надеется, что она станет выше других чтобы доминировать в пространстве. Между тем, WebRTC спокойно создает стандарт, который принудительно устраняет все концепции проприетарных мультимеа-коммуникаций, которые, как мы надеемся, устранят некоторые из этих узколобых, огороженных стеной мышления и откроют коммуникации для некоторых фактических инноваций.
12 |
13 | С тех самых пор, как существуют веб-браузеры, предпринимались попытки интегрировать мультимедиа в интернет. Это оказалось сложнее, чем ожидалось, так что сегодня телефон по-прежнему является отдельным приложением \(или, конечно, отдельным устройством в целом\).
14 |
15 | WebRTC обещает изменить все это.
16 |
17 | В этой главе мы познакомим вас с интерпретацией WebRTC, предложенной Asterisk. Ни в коем случае не следует считать это всеобъемлющим введением; все, на что у нас будет время — это провести вас через создание стандартного приложения для видеоконференций, которое, по сути, является приложением “Hello World”, которое все используют для начала работы с WebRTC. Это отличный способ пнуть шины, но важно понимать, что WebRTC будет намного больше.
18 |
19 | ## **Предварительное знание**
20 |
21 | Прежде чем погрузиться в WebRTC, есть некоторые базовые технологии, которые должны объединиться.
22 |
23 | Прежде всего: если вы серьезно относитесь к WebRTC — вам понадобится доступ к веб-разработчику, а в идеале к кому-то, кто имеет глубокие знания различных языков, протоколов и технологий, которые делают интернет работающим. WebRTC — это веб-разработка и это технология bleeding-edge, и вы столкнетесь с несовместимостью, проблемами браузера, нераскрытыми ошибками, неполной документацией и другими проблемами, присущими новой технологии. Если вы не являетесь разработчиком полного стека с твердыми сетевыми и Linux навыками, у вас будет очень крутая кривая обучения с WebRTC!
24 |
25 | > Вероятно, Цахи Левент-Леви сказал по этому поводу лучше всего:
26 | >
27 | > _WebRTC - это технология, которая является частью VoIP и частью Web. ... Для того, чтобы действительно быть профессиональным разработчиком WebRTC, вы должны быть в состоянии понять две очень разные технические области:_
28 | >
29 | > 1. _Вы должны знать, как работает VoIP. Как движется медиапоток по сети в режиме реального времени \(такие вещи, как RTP, RTCP, Jitter Buffer и множество других сокращений\)._
30 | > 2. _Вам нужно знать и понимать, как разрабатывать для web — frontend и backend \(любой разработчик полного стека?\). JavaScript - это данность. Бонусные очки за node.js._
31 |
32 | Итак, да, вы должны быть разработчиком полного стека, плюс гуру VoIP, если хотите комфортно погрузиться в WebRTC. Мы говорим это не для того, чтобы отпугнуть вас, а чтобы заверить, что если вы находите это сложным, то это не связано с каким-либо недостатком с вашей стороны, а просто потому, что это сложный, многослойный материал.
33 |
34 | Сказав все это, можно получить вкус WebRTC без всего этого и в этой главе мы собираемся настроить Asterisk для поддержки WebRTC и запустить предварительно построенное веб-приложение, которое продемонстрирует основные аудио/видео возможности реализации Asterisk WebRTC. У вас все еще будет эта крутая кривая обучения, но, надеюсь, мы создали фундамент, на котором можно строить.
35 |
36 | ## **Конфигурирование Asterisk для WebRTC**
37 |
38 | Для передачи вызовов через Asterisk с помощью WebRTC необходимо использовать драйвер канала PJSIP. Конфигурация будет аналогична конфигурации стандартных SIP-телефонов, но не идентична.
39 |
40 | Для этого нам понадобится тип транспорта, который мы добавим в файл _/etc/asterisk/pjsip.conf_:
41 |
42 | ```text
43 | [transport-udp]
44 | type=transport
45 | protocol=udp
46 | bind=0.0.0.0
47 | [transport-tls]
48 | type=transport
49 | protocol=tls
50 | bind=0.0.0.0
51 | cert_file=/home/asterisk/certs/self-signed.crt
52 | priv_key_file=/home/asterisk/certs/self-signed.key
53 | ```
54 |
55 | Это все для редактирования конфигурационного файла. Для остальных изменений PJSIP мы будем использовать базу данных.[1](https://learning.oreilly.com/library/view/asterisk-the-definitive/9781492031598/ch20.html#idm46178396562296)
56 |
57 | Мы создадим двух новых подписчиков с именами `WS_PHONE_A` и `WS_PHONE_B`. Клиент WebRTC будет использовать учетные данные для этих конечных точек для связи с драйвером канала PJSIP в Asterisk \(т.е. для совершения телефонных звонков\).
58 |
59 | В таблицу ps\_aors необходимо добавить две записи:
60 |
61 | ```text
62 | INSERT into asterisk.ps_aors
63 | (id, max_contacts)
64 | values ('WS_PHONE_A', 5),
65 | ('WS_PHONE_B', 5)
66 | ;
67 | ```
68 |
69 | Необходимы соответствующие записи ps_auth:
70 |
71 | ```text
72 | INSERT into asterisk.ps_auths
73 | (id, auth_type, password, username)
74 | values ('WS_PHONE_A','userpass','spiderwrench','WS_PHONE_A'),
75 | ('WS_PHONE_B','userpass','arachnoratchet','WS_PHONE_B')
76 | ;
77 | ```
78 |
79 | Затем мы создадим сами конечные точки:
80 |
81 | ```text
82 | INSERT INTO asterisk.ps_endpoints
83 | (id,aors,auth,context,
84 | transport,dtls_auto_generate_cert,webrtc,disallow,allow)
85 | VALUES
86 | ('WS_PHONE_A','WS_PHONE_A','WS_PHONE_A','sets',
87 | 'transporttls','yes','yes','all','vp8,opus,ulaw'),
88 | ('WS_PHONE_B','WS_PHONE_B','WS_PHONE_B','sets',
89 | 'transport-tls','yes','yes','all','vp8,opus,ulaw');
90 | ```
91 |
92 | В [Главе 4](glava-04.md) мы уже создали наши сертификаты, поэтому должны иметь возможность использовать их здесь.
93 |
94 | ```text
95 | $ ls -l /home/asterisk/certs/
96 | ```
97 |
98 | Мы должны позаботиться о конфигурации канала для нашего примера WebRTC.
99 |
100 | Теперь нам нужно настроить веб-сервер Asterisk для обработки HTTPS.
101 |
102 | ```text
103 | $ sudo vim /etc/asterisk/http.conf
104 | [general]
105 | enabled=yes
106 | bindaddr=0.0.0.0
107 | bindport=8088
108 | tlsenable=yes
109 | tlsbindaddr=0.0.0.0:8089
110 | tlscertfile=/home/asterisk/certs/self-signed.crt
111 | tlsprivatekey=/home/asterisk/certs/self-signed.key
112 | ```
113 |
114 | Сохранимся и перезапустим Asterisk.
115 |
116 | ```text
117 | $ sudo service asterisk restart
118 | ```
119 |
120 | Убедитесь, что Asterisk теперь работает не только на HTTP-сервере, но и на HTTPS:
121 |
122 | ```text
123 | *CLI> http show status
124 | HTTP Server Status:
125 | Server Enabled and Bound to 0.0.0.0:8088
126 | HTTPS Server Enabled and Bound to 0.0.0.0:8089
127 | Enabled URI's:
128 | /ws => Asterisk HTTP WebSocket
129 | ```
130 |
131 | Ищите в выходных данных `HTTPS`, чтобы проверить работоспособность сертификатов и также должны увидеть /ws, поскольку это указывает на загрузку компонентов WebSockets.
132 |
133 | ---
134 |
135 | Подсказка: если он не работает, всегда проверяйте _/var/log/messages_ для любых сообщений SELinux.
136 |
137 | ```text
138 | $ sudo grep sealert /var/log/messages
139 | ```
140 |
141 | ---
142 |
143 | Брандмауэр в настоящее время не настроен для этих портов, поэтому нам нужно добавить несколько правил для обработки:
144 |
145 | ```text
146 | $ sudo firewall-cmd --zone=public --add-port=8088/tcp
147 | $ sudo firewall-cmd --zone=public --add-port=8088/tcp --permanent
148 | $ sudo firewall-cmd --zone=public --add-port=8089/tcp
149 | $ sudo firewall-cmd --zone=public --add-port=8089/tcp --permanent
150 | $ sudo firewall-cmd --zone=public --add-port=5061/udp
151 | $ sudo firewall-cmd --zone=public --add-port=5061/udp --permanent
152 | ```
153 |
154 | На этом этапе вам нужно запустить веб-браузер и установить соединение. Ваш браузер будет жаловаться на соединение, если вы используете самоподписанный сертификат, но он позволит вам осуществить соединение. Это критический шаг, так как вы должны указать вашему браузеру хранить сертификат постоянно, так что WebRTC может использовать соединение WebSocket. Следующий URL-адрес соединит вас:
155 |
156 | ```text
157 | https://ip-of-asterisk-server:8089/ws
158 | ```
159 |
160 | Если вы получите сообщение `Upgrade Required` \(о необходимости обновления\), _это хорошо_. Это означает, что соединение хорошее и это просто протокол, говорящий вам, что для этого недостаточно технологии, чтобы это было фактическое соединение WebSocket. Мы там, где должны быть.
161 |
162 | Конечно, следующая вещь - фактически испытать сеанс WebRTC через ту среду, которую мы настроили; и для того, чтобы проверить все это, вам нужно будет запустить браузер и загрузить в нем какой-нибудь клиент WebRTC. Следующий раздел будет делать именно это.
163 |
164 | ## **Cyber Mega Phone**
165 |
166 | Для того, чтобы увидеть WebRTC в действии на вашей системе Asterisk вам нужно что-то, что работает в вашем браузере. Самый простой способ увидеть это в действии — взять _Cyber Mega Phone_ от Digium. Это позволит вам быстро настроить рабочий сеанс WebRTC с помощью Asterisk.
167 |
168 | Во-первых, так как WebRTC требует использования TLS \(что не является обязательным, как в случае с SIP\), мы собираемся заставить вас еще раз проверить установку ваших сертификатов. Если вы еще не сделали этого, сейчас самое время поработать над [Главой 4](glava-04.md), или есть скрипт, предоставляемый как часть исходного кода Asterisk, генерирующий ключи и сертификаты \(вы найдете его в исходниках Asterisk в каталоге _/home/astmin/src/asterisk-16.<TAB >/contrib/scripts/_. Скрипт называется _as_tls_cert_, и он задокументирован в wiki Asterisk.
169 |
170 | Хорошо, теперь нам нужен диалаплан для приема наших звонков WebRTC:
171 |
172 | ```text
173 | $ vim /etc/asterisk/extensions.conf
174 | exten => 246,1,Noop()
175 | same => n,Answer()
176 | same => n,Wait(0.5)
177 | same => n,StreamEcho(4)
178 | same => n,Hangup()
179 | ```
180 |
181 | Сам Cyber Mega Phone находится на GitHub под [аккаунтом Asterisk](https://github.com/asterisk/cyber_mega_phone_2k).
182 |
183 | Вы можете загрузить код и запустить его с локального компьютера или же можете загрузить его на веб-сервер и пользоваться им оттуда.
184 |
185 | Давайте воспользуемся им с нашего сервера Asterisk:
186 |
187 | ```text
188 | $ cd /var/lib/asterisk/static-http
189 | $ sudo git clone https://github.com/asterisk/cyber_mega_phone_2k.git
190 | $ sudo chown -R asterisk:asterisk cyber_mega_phone_2k ; sudo chmod 755 cyber_mega_phone_2k
191 | ```
192 |
193 | Нам понадобится небольшое изменение в конфигурации HTTP-сервера Asterisk, чтобы он мог обслуживать статический контент.
194 |
195 | ```text
196 | $ sudo vim /etc/asterisk/http.conf
197 | [general]
198 | enabled=yes
199 | bindaddr=0.0.0.0
200 | bindport=8088
201 | tlsenable=yes
202 | tlsbindaddr=0.0.0.0:8089
203 | tlscertfile=/home/asterisk/certs/asterisk.crt
204 | tlsprivatekey=/home/asterisk/certs/asterisk.key
205 | enablestatic=yes
206 | redirect=/cmp2k /static/cyber_mega_phone_2k/index.html
207 | ```
208 |
209 | Сохраните и перезагрузите http-модуль из консоли Asterisk:
210 |
211 | ```text
212 | *CLI> module reload http
213 | ```
214 |
215 | Теперь с помощью браузера можно перейти к новому клиентскому приложению WebRTC:
216 |
217 | https://your_asterisk_server:8089/cmp2k
218 |
219 | Если все пойдет по плану, вы увидите что-то вроде Рисунка 20-1.
220 |
221 | 
222 |
223 | _Рисунок 20-1. Cyber Mega Phone 2K_
224 |
225 | Нажмите кнопку Account и введите учетные данные пользователя WebRTC (см. Рисунок 20-2).
226 |
227 | 
228 |
229 | _Рисунок 20-2. Данные учетной записи WebRTC_
230 |
231 | После ввода сведений, относящихся к системе, нажмите X для сохранения и закрытия.
232 |
233 | Теперь вы можете нажать кнопку Connect и, если все прошло хорошо, ваш клиент WebRTC должен зарегистрироваться в Asterisk \(это хорошее время для мониторинга консоли Asterisk, чтобы увидеть, что происходит и есть ли какие-либо ошибки\).
234 |
235 | Если вы нажмете кнопку Call сейчас, то должны подключиться через WebRTC и увидеть два окна \([Рисунок 20-3](https://docs.google.com/document/d/13JVG7cvL-x3zXSA95VlHj4nEjCsZiGpuPRZkbjs75cQ/edit#bookmark=id.1fob9te)\). Одно из них — ваше локальное видео, а другое — отображает дальний конец \(т.е. он имитирует другого пользователя, повторяя то, что отправили Вы\). Если Ваше аудио также работает, то вы даже можете получить некоторый шум обратной связи!
236 |
237 | 
238 |
239 | _Рисунок 20-3. Приложение Echo с видео_
240 |
241 | Вы видите, что есть окно удаленного видео рядом с окном локального видео. Возможно, мы не достигли многого, чтобы хвастаться, но ваша система Asterisk обрабатывает WebRTC, поэтому улыбнитесь и сделайте перерыв. Вы это заслужили.
242 |
243 | ## **Подробнее об WebRTC**
244 |
245 | Экосистема WebRTC быстро развивается и то, что верно на момент написания этой статьи, может быть неверным в ближайшем будущем. Мы нашли следующие ресурсы, которые могут быть очень полезными:
246 |
247 | * Цахи Левант-Леви участвует во многих различных инициативах WebRTC, и он щедро делится знаниями о том, как познать WebRTC. Проверьте его сайт bloggeek.me. Подпишитесь на него.
248 | * Группа людей под руководством Kranky Geek выпустила несколько конференций об WebRTC и поделилась многими полезными видео на YouTube. На YouTube-канале [Kranky Geek](http://bit.ly/31DAGVx) вы найдете их.
249 | * Ознакомьтесь с различными протоколами сигнализации, которые популярны в WebRTC: SIP, VIRTO \(из проекта FreeSwitch\), XMPP и даже JSON.
250 | * Посмотрите различные библиотеки сигнализации WebRTC. В настоящее время к популярным относятся: sipML5 \(возможно, самая первая библиотека WebRTC\) и JsSIP \(плюс форк JsSIP с именем _SIP.js_\).
251 | * webrtc.org является официальным домом WebRTC и, безусловно, заслуживает некоторого внимания. Проверьте [домашнюю страницу](https://webrtc.org/start/) перед началом работы.
252 | * Онлайн-платформа обучения о'Рейли имеет несколько видео, которые стоит посмотреть. Для любых книг и видео следите за датой публикации, так как все, что старше года или двух, скорее всего, устарело — WebRTC все еще находится в стадии быстрого развития.
253 |
254 | Нам еще так много предстоит узнать, но у нас закончились страницы.
255 |
256 | ## **Вывод**
257 |
258 | WebRTC является захватывающим и важным и, вполне вероятно, что разработчики и интеграторы VoIP должны быть знакомы с этой технологией если хотят сохранить свои навыки актуальными. На момент написания этой статьи WebRTC все еще находится в стадии разработки. Как и в любом исследовании новых границ, те, кто прокладывает путь, должны быть творческими, настойчивыми, оптимистичными и жесткими.
259 |
260 | Asterisk может быть полезным компонентом в будущей VoIP-среде, служа, по крайней мере, мостом между продуктами WebRTC следующего поколения и телекоммуникациями старой школы.
261 |
262 | [1](https://learning.oreilly.com/library/view/asterisk-the-definitive/9781492031598/ch20.html#idm46178396562296-marker) Обратите внимание, что вы можете настроить драйвер канала PJSIP полностью с помощью файла конфигурации, но в этой книге мы делаем это только там, где это необходимо и, в противном случае, используем базу данных для конфигурации канала PJSIP
263 |
264 | [Глава 19. Asterisk REST Interface](glava-19.md) | [Содержание](SUMMARY.md) | [Глава 21. Системный мониторинг и журналирование](glava-21.md)
--------------------------------------------------------------------------------
/glava-22.md:
--------------------------------------------------------------------------------
1 | # Глава 22. Безопасность
2 |
3 | > _Мы тратим время на поиски безопасности и ненавидим, когда получаем ее._
4 | >
5 | > -- Джон Стейнбек
6 |
7 | Безопасность вашей системы Asterisk имеет решающее значение, особенно если система подключена к Интернету. Злоумышленники могут заработать много денег, используя системы для бесплатных телефонных звонков. В этой главе даются советы о том, как обеспечить более надежную защиту для вашего развертывания VoIP.
8 |
9 | ## Сканирование действительных учетных записей
10 |
11 | Если вы выставляете свою систему Asterisk в общедоступный Интернет, одна из вещей, которую вы почти наверняка увидите - это сканирование действительных учетных записей. Пример 22-1 содержит записи лога с одной из производственных систем Asterisk авторов.[1](https://learning.oreilly.com/library/view/asterisk-the-definitive/9781492031598/ch22.html%22%20/l%20%22idm46178396108536) Это сканирование началось с проверки различных общих имен пользователей, а затем перешло к сканированию числовых аккаунтов. Обычно пользователи называют учетные записи SIP так же, как и внутренние номера на АТС. Это сканирование использует этот факт.
12 |
13 | ---
14 |
15 | **Подсказка**
16 |
17 | Используйте нечисловые имена пользователей для своих учетных записей VoIP, чтобы их было сложнее угадать. Например, в этой книге мы используем MAC-адрес SIP-телефона в качестве имени учетной записи в Asterisk.
18 |
19 | ---
20 |
21 | #### Пример 22-1. Отрывок лога сканирования учетной записи
22 |
23 | ```text
24 | [Aug 22 15:17:15] NOTICE[25690] chan_sip.c: Registration from
25 | '"123"' failed for '203.86.167.220:5061' - No matching peer
26 | found
27 | [Aug 22 15:17:15] NOTICE[25690] chan_sip.c: Registration from
28 | '"1234"' failed for '203.86.167.220:5061' - No matching peer
29 | found
30 | [Aug 22 15:17:15] NOTICE[25690] chan_sip.c: Registration from
31 | '"12345"' failed for '203.86.167.220:5061' - No matching peer
32 | found
33 | ...
34 | [Aug 22 15:17:17] NOTICE[25690] chan_sip.c: Registration from
35 | '"100"' failed for '203.86.167.220:5061' - No matching peer found
36 | [Aug 22 15:17:17] NOTICE[25690] chan_sip.c: Registration from
37 | '"101"' failed for '203.86.167.220:5061' - No matching peer found
38 | ```
39 |
40 | В любой системе логи будут полны попыток вторжения. Это просто характер подключения систем к интернету. В этой главе мы обсудим некоторые способы настройки вашей системы таким образом, чтобы она имела надежные механизмы для решения этих проблем.
41 |
42 | ## Уязвимости аутентификации
43 |
44 | В первом разделе этой главы обсуждалось сканирование имен пользователей. Даже если у вас есть имена пользователей, которые трудно угадать, очень важно, чтобы у вас были надежные пароли. Если злоумышленник может получить действительное имя пользователя, он, скорее всего, попытается подобрать пароль. Надежные пароли делают это намного сложнее.
45 |
46 | Схема аутентификации по умолчанию SIP-протокола является слабой. Аутентификация выполняется с помощью механизма вызова и ответа MD5. Если злоумышленник может перехватить любой трафик, например SIP-вызов, выполненный с ноутбука в открытой беспроводной сети, ему будет намного проще работать с брутфорсом паролей, поскольку это не потребует запросов аутентификации у сервера.
47 |
48 | ---
49 |
50 | **Подсказка**
51 |
52 | Используйте надежные пароли. В Интернете доступно множество ресурсов, которые помогают определить, что представляет собой надежный пароль. Есть также много надежных генераторов паролей. Используй их!
53 |
54 | ---
55 |
56 | ## Fail2ban
57 |
58 | В предыдущих двух разделах рассматривались атаки, связанные со сканированием действительных имен пользователей и подбором паролей брутфорсом. [Fail2ban](http://www.fail2ban.org/wiki/index.php/Main_Page) - это приложение, которое может просматривать журналы Asterisk и обновлять правила брандмауэра, чтобы блокировать источник атаки в ответ на слишком большое количество неудачных попыток аутентификации.
59 |
60 | ---
61 |
62 | **Подсказка**
63 |
64 | Используйте Fail2ban при предоставлении услуг Voice over IP в ненадежных сетях. Оно автоматически обновит правила брандмауэра, чтобы заблокировать источники атак.
65 |
66 | ---
67 |
68 | ### Установка
69 |
70 | Fail2ban доступен в виде пакета во многих дистрибутивах. Кроме того, вы можете установить его из исходников, загрузив с веб-сайта Fail2ban. Чтобы установить Fail2ban на RHEL, необходимо включить репозиторий EPEL (который был рассмотрен в [Главе 3](glava-03.md)). Вы можете установить Fail2ban, выполнив следующую команду:
71 |
72 | ```text
73 | $ sudo yum install fail2ban
74 | ```
75 |
76 | ---
77 |
78 | **Примечание**
79 |
80 | Установка Fail2ban из пакета будет включать скрипт запуска, чтобы гарантировать запуск при загрузке компьютера. Если вы устанавливаете из исходных кодов, убедитесь, что вы предпринимаете необходимые шаги для гарантированной постоянной работы Fail2ban.
81 |
82 | ---
83 |
84 | ### Конфигурация
85 |
86 | Во-первых, мы хотим настроить журнал безопасности в Asterisk, который Fail2ban может использовать.
87 |
88 | ```text
89 | $ sudo vim /etc/asterisk/logger.conf
90 | ```
91 |
92 | Раскомментировать (или добавить) строку, которая разрешает чтение `security => security` и измените `dateformat` даты для понимания её в журнале fail2ban.
93 |
94 | ```text
95 | [general]
96 | exec_after_rotate=gzip -9 ${filename}.2;
97 | dateformat = %F %T
98 | [logfiles]
99 | ;debug => debug
100 | security => security
101 | ;console => notice,warning,error,verbose
102 | console => notice,warning,error,debug
103 | messages => notice,warning,error
104 | full => notice,warning,error,debug,verbose,dtmf,fax
105 | ```
106 |
107 | Затем перезагрузите logger Asterisk:
108 |
109 | ```text
110 | $ sudo asterisk -rx 'logger reload'
111 | ```
112 |
113 | Поскольку текущие версии Fail2ban уже поставляются с определением изолятора Asterisk, все, что нам нужно сделать, это включить его:
114 |
115 | Для этого рекомендуется создать файл _/etc/fail2ban/jail.local_ (технически вы можете поместить его в _/etc/fail2ban/jail.conf_, но он скорее всего будет перезаписан):
116 |
117 | ```text
118 | $ sudo vim /etc/fail2ban/jail.local
119 |
120 | [asterisk]
121 | enabled = true
122 | filter = asterisk
123 | action = iptables-allports[name=ASTERISK, protocol=all]
124 | sendmail[name=ASTERISK, dest=me@shifteight.org, sender=fail2ban@shifteight.org]
125 | logpath = /var/log/asterisk/messages
126 | /var/log/asterisk/security
127 | maxretry = 5
128 | findtime = 21600
129 | bantime = 86400
130 | ```
131 |
132 | Мы установили запрет на 24 часа, но вы можете сделать время больше или меньше, как пожелаете (время запрета определяется в секундах, так что его необходимо рассчитать). Поскольку большинство атакующих хостов меняются через несколько часов, нет никакого вреда в разблокировании IP-адреса через 24 часа. Если хост атакует снова, он снова будет заблокирован.
133 |
134 | О, вы также можете указать ему игнорировать ваш IP (или любые другие IP-адреса, с которых можно получать попытки подключения). Если вы случайно заблокировали себя, когда делали какую-то лабораторную работу и неправильно регистрировались, не волнуйтесь, вы в конечном итоге сделаете это с собой (если, конечно, не создадите список игнорирования для соответствующих IP-адресов).
135 |
136 | ```text
137 | [DEFAULT]
138 | ignoreip =
139 |
140 | [asterisk]
141 | enabled = true
142 | filter = asterisk
143 | action = iptables-allports[name=ASTERISK, protocol=all]
144 | sendmail[name=ASTERISK, dest=me@shifteight.org, sender=fail2ban@shifteight.org]
145 | logpath = /var/log/asterisk/messages
146 | /var/log/asterisk/security
147 | maxretry = 5
148 | findtime = 21600
149 | bantime = 86400
150 | ```
151 |
152 | Перезапустите Fail2ban и все будет хорошо.
153 |
154 | ```text
155 | $ sudo systemctl reload fail2ban
156 | ```
157 |
158 | Проверьте это, если можете, с IP-адреса, который вы не против заблокировать (например, дополнительный компьютер в вашей лаборатории, который может стать объектом тестирования в данном случае). Попытайтесь зарегистрироваться с использованием неверных учетных данных, и после пяти попыток (или любого другого значения, для которого вы установили `maxretry`) этот IP-адрес должен быть заблокирован.
159 |
160 | Вы можете увидеть, какие адреса блокирует Asterisk jail, с помощью команды:
161 |
162 | ```text
163 | $ sudo fail2ban-client status asterisk
164 | ```
165 |
166 | И если вы хотите разблокировать IP,[2](https://learning.oreilly.com/library/view/asterisk-the-definitive/9781492031598/ch22.html#idm46178396052456) следующая команда должна сделать это.
167 |
168 | ```text
169 | $ sudo fail2ban-client set asterisk unbanip
170 | ```
171 |
172 | Дополнительную информацию о Fail2ban можно найти на странице [Fail2ban wiki](http://www.fail2ban.org/wiki/index.php/Main_Page).
173 |
174 | ## Шифрование медиапотока
175 |
176 | В то время как мы приводили в этой книге примеры, которые использовали шифрование, имейте в виду, что вы можете настроить SIP так, что медиапоток будет отправляться в незашифрованном виде. В этом случае любой, кто перехватит RTP-трафик между двумя SIP-узлами, сможет использовать довольно простые инструменты для извлечения звука из этих вызовов.
177 |
178 | ## Уязвимости диалплана
179 |
180 | Диалплан Asterisk - это еще одна область, где важна безопасность. Диалплан можно разбить на несколько контекстов для обеспечения управления доступом к расширениям. Например, вы можете разрешить своим офисным телефонам совершать звонки через провайдера. Тем не менее, вы не захотите, чтобы анонимные абоненты, которые попадают в ваше главное меню компании, могли затем набрать номер через вашего провайдера. Используйте контексты, чтобы гарантировать доступ к услугам, которые стоят вам денег, только доверенным абонентам.
181 |
182 | ---
183 |
184 | **Подсказка**
185 |
186 | Создавайте контексты диалплана с большой осторожностью. Кроме того, избегайте размещения любых расширений, которые могут стоить вам денег в контексте `[default]`.
187 |
188 | ---
189 |
190 | Одна из последних уязвимостей диалплана Asterisk, обнаруженных и опубликованных - это идея инъекций диалплана. Уязвимость инъекций диалплана начинается с расширения, имеющего шаблон, который заканчивается символом соответствия всему - точкой. Возьмите это расширение в качестве примера:
191 |
192 | ```text
193 | exten => _X.,1,Dial(PJSIP/otherserver/${EXTEN},30)
194 | ```
195 |
196 | Шаблон для этого расширения соответствует всем расширениями (любой длины), которые начинаются с цифры. Такие шаблоны довольно распространены и удобны. Затем расширение отправляет этот вызов на другой сервер, используя протокол IAX2, с таймаутом набора 30 секунд. Обратите внимание на использование здесь переменной `${EXTEN}`. Вот где кроется уязвимость.
197 |
198 | В мире Voice over IP нет причин, по которым набираемый номер должен быть числовым. На самом деле, это довольно распространенное использование SIP, чтобы иметь возможность набрать кого-то по имени. Поскольку нечисловые символы могут быть частью набранного добавочного номера, что произойдет, если кто-то отправит вызов на такой добавочный номер?
199 |
200 | ```text
201 | 1234&DAHDI/g1/12565551212
202 | ```
203 |
204 | Подобный вызов является попыткой использования уязвимости инъекции диалплана. В предыдущем определении расширения, как только `${EXTEN}` был вычислен, фактический оператор `Dial()`, который будет исполняться, будет иметь вид:
205 |
206 | ```text
207 | exten => _X.,1,Dial(PJSIP/otherserver/1234&DAHDI/g1/12565551212,30)
208 | ```
209 |
210 | Если в системе настроена PRI, этот вызов совершит вызов через PRI на номер, выбранный злоумышленником, даже если вы явно не предоставили доступ к PRI этому абоненту. Эта проблема может стоить вам больших затрат.
211 |
212 | Существует несколько подходов к решению этой проблемы. Первый и самый простой подход - всегда использовать строгое сопоставление шаблонов. Если вы знаете длину ожидаемых расширений и ожидаете только числовые расширения, используйте строгое соответствие числовому шаблону. Например, такой шаблон будет работать, если вы ожидаете только четырехзначные числовые номера:
213 |
214 | ```text
215 | exten => _XXXX,1,Dial(PJSIP/otherserver/${EXTEN},30)
216 | ```
217 |
218 |
219 |
220 | Другой подход к смягчению уязвимостей инъекций диалплана заключается в использовании функции диалплана `FILTER()` . Возможно, вы хотели бы разрешить числовые расширения любой длины. `FILTER()` позволяет сделать это легко и безопасно:
221 |
222 | ```text
223 | exten => _X.,1,Set(SAFE_EXTEN=${FILTER(0-9A-F,${EXTEN})})
224 | same => n,Dial(PJSIP/otherserver/${SAFE_EXTEN},30)
225 | ```
226 |
227 | Дополнительные сведения о синтаксисе функции диалплана `FILTER()` см. в выводе данных команды _core show function FILTER_ в Asterisk CLI.
228 |
229 | Более комплексный (но и сложный) подход может заключаться в проверке всех набранных цифр функциями, не входящими в диалплан (например, запросы к базе данных, которые проверяют набранную строку на соответствие разрешениям пользователя, шаблонам маршрутизации, таблицам ограничений и т.д.). Это мощная концепция, но она выходит за рамки данной книги.
230 |
231 | ---
232 |
233 | **Подсказка**
234 |
235 | Будьте осторожны с уязвимостями инъекциями диалплана. Используйте строгое сопоставление шаблонов или используйте функцию диалплана `FILTER()` во избежание подобных проблем.
236 |
237 | ---
238 |
239 | ## Безопасность сетевых API Asterisk
240 |
241 | Чтобы защитить AGI, AMI и ARI, вам нужно будет тщательно рассмотреть следующие рекомендуемые методы:
242 |
243 | * Разрешить подключения непосредственно к API только из `localhost/127.0.0.1`.
244 | * Используйте соответствующую платформу между API Asterisk и вашим клиентским приложением,а также обрабатывайте безопасность соединения через фреймворк.
245 | * Контролируйте доступ к фреймворку и системе с помощью строгих правил брандмауэра.
246 |
247 | Кроме того, применяются те же правила безопасности и рекомендации, что и в любом критически важном веб-приложении.
248 |
249 | ## Другие меры по снижению риска
250 |
251 | В Asterisk есть и другие полезные функции, которые можно использовать для снижения риска атак. Первый заключается в использовании параметров `permit` и `deny` для создания списков управления доступом (ACL) для привилегированных учетных записей. Рассмотрим АТС, которая имеет SIP-телефоны в локальной сети, но также принимает SIP-вызовы через интернет. Такие вызовы получают доступ только к главному меню компании, в то время как локальные SIP-телефоны имеют возможность совершать исходящие вызовы, которые уже стоят денег. В этом случае рекомендуется настроить списки управления доступом, чтобы только устройства в локальной сети могли использовать учетные записи для телефонов.
252 |
253 | В таблице `ps_endpoints` параметры `permit` и `deny` позволяют указать IP-адреса, но также можно указать метку в файле `/etc/asterisk/acl.conf`. Фактически ACL принимаются почти везде, где настроены подключения к IP-службам. Например, еще одно полезное место для ACL находится в файле _/etc/asterisk/manager.conf_, для ограничения учетных записей AMI до одного хоста, который может использовать интерфейс менеджера.
254 |
255 | ACL можно определить в _/etc/asterisk/acl.conf_.
256 |
257 | ```text
258 | [named_acl_1]
259 | deny=0.0.0.0/0.0.0.0
260 | permit=10.1.1.50
261 | permit=10.1.1.55
262 |
263 | [named_acl_2] ; Именованные ACLs также поддерживают IPv6.
264 | deny=::
265 | permit=::1/128
266 |
267 | [local_phones]
268 | deny=0.0.0.0/0.0.0.0
269 | permit=192.168.0.0/255.255.0.0
270 | ```
271 |
272 | Когда именованные ACL были определены в _acl.conf_, попросите Asterisk загрузить их с помощью команды `reload acl`. После загрузки они должны быть доступны через интерфейс командной строки Asterisk:
273 |
274 | ```text
275 | *CLI> module reload acl
276 |
277 | *CLI> acl show
278 |
279 | acl
280 | ---
281 | named_acl_1
282 | named_acl_2
283 | local_phones
284 |
285 | *CLI> acl show named_acl_1
286 |
287 | ACL: named_acl_1
288 | ---------------------------------------------
289 | 0: deny - 0.0.0.0/0.0.0.0
290 | 1: allow - 10.1.1.50/255.255.255.255
291 | 2: allow - 10.1.1.55/255.255.255.255
292 | ```
293 |
294 | Теперь, вместо того, чтобы потенциально повторять одни и те же записи `permit` и `deny` в нескольких местах, вы можете применить ACL по его имени. Вы найдете поле `acl` в таблице `ps_endpoints`, которое можно использовать для указания на именованный ACL в файле _acl.conf_.
295 |
296 | ```text
297 | mysql> select id,transport,aors,context,disallow,allow,acl from ps_endpoints;
298 |
299 | |id |transport |aors |context|disallow|allow |acl |
300 | |0000f30A0A01|transport-udp|0000f30A0A01|sets |all |ulaw |NULL|
301 | |0000f30B0B02|transport-udp|0000f30B0B02|sets |all |ulaw |NULL|
302 | |SOFTPHONE_A |transport-udp|SOFTPHONE_A |sets |all |ulaw,h264,vp8|NULL|
303 | |SOFTPHONE_B |transport-udp|SOFTPHONE_B |sets |all |ulaw,h264,vp8|NULL|
304 |
305 | mysql> update ps_endpoints
306 | set acl='local_phones'
307 | where id in ('0000f30A0A01','0000f30B0B02','SOFTPHONE_A','SOFTPHONE_B')
308 | ;
309 |
310 | mysql> select id,transport,aors,context,disallow,allow,acl from ps_endpoints;
311 |
312 | |id |transport |aors |context|disallow|allow |acl |
313 | |0000f30A0A01|transport-udp|0000f30A0A01|sets |all |ulaw |local_phones|
314 | |0000f30B0B02|transport-udp|0000f30B0B02|sets |all |ulaw |local_phones|
315 | |SOFTPHONE_A |transport-udp|SOFTPHONE_A |sets |all |ulaw,h264,vp8|local_phones|
316 | |SOFTPHONE_B |transport-udp|SOFTPHONE_B |sets |all |ulaw,h264,vp8|local_phones|
317 | ```
318 |
319 | ---
320 |
321 | **Подсказка**
322 |
323 | Используйте ACL, когда это возможно, на всех привилегированных аккаунтах для сетевых служб.
324 |
325 | ---
326 |
327 | Ещё одним способом снижения риска безопасности является настройка лимитов вызовов. Рекомендуемый метод реализации ограничений вызовов - использование функций диалплана `GROUP()` и `GROUP_COUNT()`. Вот пример, который ограничивает количество вызовов от каждого узла SIP не более чем двумя одновременно:
328 |
329 | ```text
330 | exten => _X.,1,Set(GROUP(users)=${CHANNEL(endpoint)})
331 | same => n,NoOp(${CHANNEL(endpoint)} : ${GROUP_COUNT(${CHANNEL(endpoint)})} calls)
332 | same => n,GotoIf($[${GROUP_COUNT(${CHANNEL(endpoint)})} > 2]?denied:continue)
333 | same => n(denied),NoOp(There are too many calls up already. Hang up.)
334 | same => n,HangUp()
335 | same => n(continue),NoOp(continue processing call as normal here ...)
336 | ```
337 |
338 | ---
339 |
340 | **Подсказка**
341 |
342 | Используйте ограничения вызовов, для гарантии что если учетная запись скомпрометирована, ее нельзя использовать для совершения сотен телефонных звонков одновременно.
343 |
344 | ---
345 |
346 | ## Ресурсы
347 |
348 | Для устранения некоторых уязвимостей системы безопасности необходимо внести изменения в исходный код Asterisk. Когда эти проблемы обнаруживаются, команда разработчиков Asterisk выпускает новые релизы, содержащие только исправления для проблем безопасности, чтобы обеспечить быстрое и легкое обновление. В этом случае команда разработчиков Asterisk также публикует рекомендательный документ по безопасности, в котором обсуждаются сведения об уязвимости. Мы рекомендуем Вам подписаться на [список рассылки _asterisk-announce_](http://lists.digium.com/mailman/listinfo/asterisk-announce), чтобы убедиться, что вы узнаете об этих проблемах, когда они возникают.
349 |
350 | ---
351 |
352 | **Подсказка**
353 |
354 | Подпишитесь на список asterisk-announce, чтобы быть в курсе уязвимостей системы безопасности Asterisk.
355 |
356 | ---
357 |
358 | Одним из самых популярных инструментов для сканирования учетных записей SIP и взлома паролей является [SIPVicious](http://sipvicious.org/). Мы настоятельно рекомендуем вам взглянуть на него и использовать для аудита ваших собственных систем. Если ваша система доступна из интернета, другие, скорее всего, запустят SIPVicious против неё, поэтому убедитесь, что вы сделали это в первую очередь.
359 |
360 | ## Вывод—Лучший идиот
361 |
362 | В технологической индустрии есть принцип, который гласит: "Как только что-то станет идиотским, природа изобретет лучшего идиота." Суть этого заявления заключается в том, что никакие усилия в области развития не могут считаться завершенными. Всегда есть место для улучшения.
363 |
364 | Когда дело доходит до безопасности, вы всегда должны иметь в виду, что люди, которые хотят воспользоваться вашей системой, очень мотивированы. Независимо от того, насколько безопасна ваша система, кто-то всегда будет искать пути для её взлома.
365 |
366 | Мы не защищаем паранойю, но предполагаем, что то, что мы описали здесь, ни в коем случае не является последним словом о безопасности VoIP. Несмотря на то, что в этой книге мы постарались быть максимально всеобъемлющими, вы должны взять на себя ответственность за безопасность своей системы.
367 |
368 | Преступники упорно работают, чтобы найти слабые места и использовать их.
369 |
370 | [1](https://learning.oreilly.com/library/view/asterisk-the-definitive/9781492031598/ch22.html%22%20/l%20%22idm46178396108536-marker) Реальный IP-адрес был заменен на 127.0.0.1 в записях лога.
371 |
372 | [2](https://learning.oreilly.com/library/view/asterisk-the-definitive/9781492031598/ch22.html%22%20/l%20%22idm46178396052456-marker) Например, себя, потому что вы забыли определить `ignoreip`...
373 |
374 | [Глава 21. Системный мониторинг и журналирование](glava-21.md) | [Содержание](SUMMARY.md) | [Глава 23. Asterisk: Будущее телефонии](glava-23.md)
--------------------------------------------------------------------------------
/glava-23.md:
--------------------------------------------------------------------------------
1 | # Глава 23. Asterisk: Будущее телефонии
2 |
3 | > _Эй, я только что познакомился с тобой,_
4 | >
5 | > _И это безумие!_
6 | >
7 | > _Но вот мой номер телефона,_
8 | >
9 | > _Так что позвони мне, может быть?_
10 | >
11 | > --Carly Rae Jepsen
12 |
13 | Мы подошли к последней главе этой книги. Мы рассмотрели много (и эта книга была значительно доработана за эти годы), но надеемся что мы ясно дали понять, что лишь просто поцарапали поверхность Asterisk. Чтобы завершить работу, мы хотим потратить некоторое время на изучение того, что могли бы увидеть от Asterisk и open source телефонии в ближайшем будущем.
14 |
15 | Когда ещё писали первое издание _Asterisk: Будущее телефонии_ мы уверенно утверждали, что коммуникационные механизмы с открытым кодом, такие как Asterisk, вызовут сдвиг в мышлении, который трансформирует телекоммуникационную отрасль. Во многих отношениях наша вера была оказалась правильной; однако некоторые могут утверждать, что это была пустая победа, потому что то, что также произошло за это время - это сдвиг от телекоммуникаций как основного средства связи в реальном времени. Более молодые поколения почти не пользуются телефонными звонками и считают их разрушительными, раздражающими, а в некоторых случаях даже грубыми.
16 |
17 | Таким образом, несмотря на то, что Asterisk открыл новый век для телекоммуникационной индустрии, теперь он стал эталоном для технологий, которые, по мнению многих, так же хороши, как и мертвы.
18 |
19 | Хотя не может быть никаких сомнений в том, что телефон больше не является основной коммуникационной технологией в мире (далеко не случайно!), когда мы перегоняем коммуникации до их сути, мы обнаруживаем, что у этого материала еще может быть будущее.
20 |
21 | ## Телефон мертв (за исключением тех случаев, когда это не так)
22 |
23 | Хотя очевидно, что молодые поколения уже не так часто пользуются телефоном, верно также и то, что старшие поколения очень недовольны и разочарованы современными коммуникационными технологиями. Для них телефон представляет собой надежный, предсказуемый и простой в понимании способ связи, и они, вероятно, будут продолжать использовать его до конца своей жизни. Поскольку в этом мире ужасно много пожилых людей, и многие из них являются высшими руководителями, лицами, принимающими решения, и акционерами — не говоря уже о состоятельных клиентах, похоже, что сегодня хорошей стратегией для бизнеса является продолжение обеспечения того, с помощью чего их клиенты могли связаться с ними по телефону.
24 |
25 | Когда человек попробует все другие способы коммуникации, такие как электронная почта, веб-формы и, возможно, даже текстовые сообщения, он, наконец, возьмет телефон и позвонит. Похоже, что во многих случаях проблема, которая не могла быть решена никаким другим способом, наконец-то решится по телефону.
26 |
27 | Было бы также правильно сказать, что все более бедные рабочие компании, занимающиеся обработкой коммуникаций со своими клиентами, являются источником большого разочарования и путаницы. Однако, как всегда, там, где есть проблема, есть и возможность. Компании, которые сохраняют приверженность к превосходной телекоммуникационной инфраструктуре, могут оказаться с явным конкурентным преимуществом, не используя ничего более сложного, чем хорошее старомодное обслуживание клиентов. Если вы хотите обслуживать клиентов старше 50 лет, вы должны сделать все возможное, чтобы ваша телефонная система работала хорошо.
28 |
29 | Еще один интересный компонент традиционных телекоммуникационных сетей заключается в том, что, хотя мы никогда не можем быть уверены в том, что используем одно и то же программное обеспечение для конференц-связи (никогда в истории не было так много почти идентичных приложений, которые должны были быть установлены только для того, чтобы люди могли говорить друг с другом), мы можем быть разумно уверены, что если один из нас возьмет телефон и наберет номер телефона другого, успешный разговор будет возможен без каких-либо неисправностей или установки программного обеспечения. В эпоху, когда кажется, что никакая конференция не может начаться без того, чтобы кому-то не пришлось устранять неполадки в своем приложении, этот вид универсальной согласованности и надежности, вероятно, все еще имеет некоторое значение. Сегодняшнее горячее новое программное обеспечение для совместной работы в офисе - это завтрашняя забытая игрушка (куда ты, Skype?). Храбрые старые телефонные солдаты включились.
30 |
31 | Мы пока не уверены, что телефон мертв.
32 |
33 | ## Перегрузка связи
34 |
35 | Во многих отношениях способность к общению определяет наш вид. Да, другие существа способны сигнализировать друг другу базовыми способами, но наше увлечение созданием постоянно меняющихся и инновационных способов коммуникаций друг с другом - это не то, с чем бы сталкивалось любое другое существо.
36 |
37 | От почтового голубя до телеграфа, телефона и телевидения, каждая новая технология служила одной и той же цели: улучшению нашей способности общаться. Сегодня мы достигли самой замечательной вещи: теперь разумно ожидать мгновенного общения практически с любым человеком на планете.
38 |
39 | Проблема, которую мы никогда не предсказывали, заключается в том, что слишком много хорошего начало подавлять нас. Будет интересно посмотреть, как это происходит в культурном плане.
40 |
41 | ## Проблемы с разработкой открытого исходного кода
42 |
43 | Хотя Александр Грэм Белл больше всего известен как отец телефона1, реальность такова, что во второй половине 1800-х годов десятки умов работали над достижением цели передачи голоса по телеграфным линиям. Эти люди были в основном деловыми людьми, стремящимися создать продукт, с помощью которого они могли бы сделать свои состояния.
44 |
45 | Мы привыкли думать о традиционных телефонных компаниях как о монополиях, но это было не так в их первые дни. Ранняя история телефонных услуг проходила в очень конкурентной среде, с появлением новых компаний по всему миру, часто почти без уважения к патентам, которые они могли бы нарушить. Многие известные монополии получили свое начало через ведение (и победу) патентных войн.
46 |
47 | Интересно сравнить историю телефона с историей GNU Linux и Интернета. В то время как телефон был создан как коммерческое мероприятие, а телекоммуникационная индустрия была создана с помощью судебных процессов и корпоративных поглощений, Linux и Интернет возникли из академического сообщества, которое имело тенденцию ценить обмен знаниями над прибылью.
48 |
49 | К сожалению, в очередной раз слишком много хорошего стало захлестывать. То, что мы видели в последнее время - это потеря видения для разработки с открытым исходным кодом. Слишком мало разработчиков устали от требований слишком большого количества пользователей, не желающих вносить свой вклад. Большинство проектов с открытым исходным кодом должны были по необходимости оградить команду разработчиков от эгоистичных требований тех, кто намерен только брать и никогда не давать. Это злоупотребление разработчиками, к сожалению, даже распространилось на компании, которые построили высокодоходные бизнесы на проектах с открытым исходным кодом, в которые они никогда не вносили ни копейки. Многомиллиардный бизнес, получающий прибыль от усилий команды, едва способной оплачивать свои счета, не является моделью устойчивого развития. Остается посмотреть, как эта история будет развиваться, но программное обеспечение с открытым исходным кодом уже не то, что было 10 лет назад.
50 |
51 | Asterisk повезло в том, что он финансируется усилиями Sangoma/Digium - родителей проекта. Их задачей было и всегда будет выяснить, как воспитать продукт таким образом, чтобы требования бизнеса были совместимы с потребностями проекта. Это была непростая задача. Мы будем болеть за них. До этих пор они проделали замечательную работу.
52 |
53 | ## Будущее Asterisk
54 |
55 | Итак, есть ли у Asterisk будущее? Мы не видим, почему его не должно быть. Он продолжает делать то, что он всегда делал и также упорно работает, чтобы быть совместимым с подходящими технологиями, выходящими на поверхность. По крайней мере, Asterisk будет продолжать очень хорошо интегрироваться с телефонными технологиями и мы пока не готовы назвать эту историю полностью рассказанной.
56 |
57 | ### WebRTC
58 |
59 | Следите за WebRTC. Мы подозреваем, что если у open source и open-standards коммуникаций есть какое-то будущее, WebRTC выступает в качестве наиболее перспективного кандидата для достижения этого.
60 |
61 | Asterisk вряд ли будет в центре этой революции, но он будет играть определенную роль.
62 |
63 | ### Будущее телефонии
64 |
65 | Телефония может выглядеть мертвой, но мы все еще видим движение в хвосте, и это действительно длинный хвост.
66 |
67 | ---
68 |
69 | 1 Вы когда-нибудь слышали об Элише Грее или Антонио Меуччи?
70 |
71 | [Глава 22. Безопасность](glava-22.md) | [Содержание](SUMMARY.md) | [Об авторах](about-the-authors.md)
72 |
--------------------------------------------------------------------------------
/pics/0 (1).png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/translaster/Definitive-Guide-5th-Edition/bb992f52da16d3fc91845b39aca65de175189294/pics/0 (1).png
--------------------------------------------------------------------------------
/pics/0 (9).png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/translaster/Definitive-Guide-5th-Edition/bb992f52da16d3fc91845b39aca65de175189294/pics/0 (9).png
--------------------------------------------------------------------------------
/pics/1 (6).png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/translaster/Definitive-Guide-5th-Edition/bb992f52da16d3fc91845b39aca65de175189294/pics/1 (6).png
--------------------------------------------------------------------------------
/pics/2 (2).png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/translaster/Definitive-Guide-5th-Edition/bb992f52da16d3fc91845b39aca65de175189294/pics/2 (2).png
--------------------------------------------------------------------------------
/pics/3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/translaster/Definitive-Guide-5th-Edition/bb992f52da16d3fc91845b39aca65de175189294/pics/3.png
--------------------------------------------------------------------------------
/pics/4 (1).png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/translaster/Definitive-Guide-5th-Edition/bb992f52da16d3fc91845b39aca65de175189294/pics/4 (1).png
--------------------------------------------------------------------------------
/pics/4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/translaster/Definitive-Guide-5th-Edition/bb992f52da16d3fc91845b39aca65de175189294/pics/4.png
--------------------------------------------------------------------------------
/pics/aster5_1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/translaster/Definitive-Guide-5th-Edition/bb992f52da16d3fc91845b39aca65de175189294/pics/aster5_1.jpg
--------------------------------------------------------------------------------
/pics/note.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/translaster/Definitive-Guide-5th-Edition/bb992f52da16d3fc91845b39aca65de175189294/pics/note.png
--------------------------------------------------------------------------------
/pics/oreilly.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/translaster/Definitive-Guide-5th-Edition/bb992f52da16d3fc91845b39aca65de175189294/pics/oreilly.png
--------------------------------------------------------------------------------
/pics/oreilly_black.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/translaster/Definitive-Guide-5th-Edition/bb992f52da16d3fc91845b39aca65de175189294/pics/oreilly_black.png
--------------------------------------------------------------------------------
/pics/pic13-1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/translaster/Definitive-Guide-5th-Edition/bb992f52da16d3fc91845b39aca65de175189294/pics/pic13-1.png
--------------------------------------------------------------------------------
/pics/pic15-1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/translaster/Definitive-Guide-5th-Edition/bb992f52da16d3fc91845b39aca65de175189294/pics/pic15-1.png
--------------------------------------------------------------------------------
/pics/pic17-1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/translaster/Definitive-Guide-5th-Edition/bb992f52da16d3fc91845b39aca65de175189294/pics/pic17-1.png
--------------------------------------------------------------------------------
/pics/pic17-1_.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/translaster/Definitive-Guide-5th-Edition/bb992f52da16d3fc91845b39aca65de175189294/pics/pic17-1_.png
--------------------------------------------------------------------------------
/pics/pic17-2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/translaster/Definitive-Guide-5th-Edition/bb992f52da16d3fc91845b39aca65de175189294/pics/pic17-2.png
--------------------------------------------------------------------------------
/pics/pic17-2_.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/translaster/Definitive-Guide-5th-Edition/bb992f52da16d3fc91845b39aca65de175189294/pics/pic17-2_.png
--------------------------------------------------------------------------------
/pics/pic17-3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/translaster/Definitive-Guide-5th-Edition/bb992f52da16d3fc91845b39aca65de175189294/pics/pic17-3.png
--------------------------------------------------------------------------------
/pics/pic17-3_.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/translaster/Definitive-Guide-5th-Edition/bb992f52da16d3fc91845b39aca65de175189294/pics/pic17-3_.png
--------------------------------------------------------------------------------
/pics/pic19-1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/translaster/Definitive-Guide-5th-Edition/bb992f52da16d3fc91845b39aca65de175189294/pics/pic19-1.png
--------------------------------------------------------------------------------
/pics/pic19-2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/translaster/Definitive-Guide-5th-Edition/bb992f52da16d3fc91845b39aca65de175189294/pics/pic19-2.png
--------------------------------------------------------------------------------
/pics/pic19-3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/translaster/Definitive-Guide-5th-Edition/bb992f52da16d3fc91845b39aca65de175189294/pics/pic19-3.png
--------------------------------------------------------------------------------
/pics/pic2-1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/translaster/Definitive-Guide-5th-Edition/bb992f52da16d3fc91845b39aca65de175189294/pics/pic2-1.png
--------------------------------------------------------------------------------
/pics/pic20-1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/translaster/Definitive-Guide-5th-Edition/bb992f52da16d3fc91845b39aca65de175189294/pics/pic20-1.png
--------------------------------------------------------------------------------
/pics/pic20-2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/translaster/Definitive-Guide-5th-Edition/bb992f52da16d3fc91845b39aca65de175189294/pics/pic20-2.png
--------------------------------------------------------------------------------
/pics/pic20-3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/translaster/Definitive-Guide-5th-Edition/bb992f52da16d3fc91845b39aca65de175189294/pics/pic20-3.png
--------------------------------------------------------------------------------
/pics/pic5-1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/translaster/Definitive-Guide-5th-Edition/bb992f52da16d3fc91845b39aca65de175189294/pics/pic5-1.png
--------------------------------------------------------------------------------
/pics/pic5-2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/translaster/Definitive-Guide-5th-Edition/bb992f52da16d3fc91845b39aca65de175189294/pics/pic5-2.png
--------------------------------------------------------------------------------
/pics/pic5-3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/translaster/Definitive-Guide-5th-Edition/bb992f52da16d3fc91845b39aca65de175189294/pics/pic5-3.png
--------------------------------------------------------------------------------
/pics/pic6-1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/translaster/Definitive-Guide-5th-Edition/bb992f52da16d3fc91845b39aca65de175189294/pics/pic6-1.png
--------------------------------------------------------------------------------
/pics/pic6-2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/translaster/Definitive-Guide-5th-Edition/bb992f52da16d3fc91845b39aca65de175189294/pics/pic6-2.png
--------------------------------------------------------------------------------
/pics/pic6-3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/translaster/Definitive-Guide-5th-Edition/bb992f52da16d3fc91845b39aca65de175189294/pics/pic6-3.png
--------------------------------------------------------------------------------
/pics/pic6-3_.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/translaster/Definitive-Guide-5th-Edition/bb992f52da16d3fc91845b39aca65de175189294/pics/pic6-3_.png
--------------------------------------------------------------------------------
/pics/pic7-1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/translaster/Definitive-Guide-5th-Edition/bb992f52da16d3fc91845b39aca65de175189294/pics/pic7-1.png
--------------------------------------------------------------------------------
/pics/pic7-2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/translaster/Definitive-Guide-5th-Edition/bb992f52da16d3fc91845b39aca65de175189294/pics/pic7-2.png
--------------------------------------------------------------------------------
/pics/pic7-3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/translaster/Definitive-Guide-5th-Edition/bb992f52da16d3fc91845b39aca65de175189294/pics/pic7-3.png
--------------------------------------------------------------------------------
/pics/pic7-4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/translaster/Definitive-Guide-5th-Edition/bb992f52da16d3fc91845b39aca65de175189294/pics/pic7-4.png
--------------------------------------------------------------------------------
/pics/pic7-5.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/translaster/Definitive-Guide-5th-Edition/bb992f52da16d3fc91845b39aca65de175189294/pics/pic7-5.png
--------------------------------------------------------------------------------
/pics/pic8-1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/translaster/Definitive-Guide-5th-Edition/bb992f52da16d3fc91845b39aca65de175189294/pics/pic8-1.png
--------------------------------------------------------------------------------
/pics/pic8-1_1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/translaster/Definitive-Guide-5th-Edition/bb992f52da16d3fc91845b39aca65de175189294/pics/pic8-1_1.png
--------------------------------------------------------------------------------
/pics/pic8-2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/translaster/Definitive-Guide-5th-Edition/bb992f52da16d3fc91845b39aca65de175189294/pics/pic8-2.png
--------------------------------------------------------------------------------
/pics/pic9-1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/translaster/Definitive-Guide-5th-Edition/bb992f52da16d3fc91845b39aca65de175189294/pics/pic9-1.png
--------------------------------------------------------------------------------
/pics/pic9-2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/translaster/Definitive-Guide-5th-Edition/bb992f52da16d3fc91845b39aca65de175189294/pics/pic9-2.png
--------------------------------------------------------------------------------
/pics/pic9-3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/translaster/Definitive-Guide-5th-Edition/bb992f52da16d3fc91845b39aca65de175189294/pics/pic9-3.png
--------------------------------------------------------------------------------
/pics/pic9-4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/translaster/Definitive-Guide-5th-Edition/bb992f52da16d3fc91845b39aca65de175189294/pics/pic9-4.png
--------------------------------------------------------------------------------
/pics/pic9-5.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/translaster/Definitive-Guide-5th-Edition/bb992f52da16d3fc91845b39aca65de175189294/pics/pic9-5.png
--------------------------------------------------------------------------------
/pics/tip.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/translaster/Definitive-Guide-5th-Edition/bb992f52da16d3fc91845b39aca65de175189294/pics/tip.png
--------------------------------------------------------------------------------
/pics/warning.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/translaster/Definitive-Guide-5th-Edition/bb992f52da16d3fc91845b39aca65de175189294/pics/warning.png
--------------------------------------------------------------------------------
/preface.md:
--------------------------------------------------------------------------------
1 | # Предисловие
2 |
3 | Это книга для всех, кто использует Asterisk.
4 |
5 | Asterisk - это платформа конвергентной телефонии с открытым исходным кодом, которая предназначена в первую очередь для работы на Linux. Asterisk объединяет более чем 100-летние знания в области телефонии в надежный набор тесно интегрированных телекоммуникационных приложений. Сила Asterisk заключается в его настраиваемой природе, дополненной непревзойденным соответствием стандартам. Ни одна другая управленческая автоматизированная телефонная станция \(УАТС\) не может быть развернута таким множеством творческих способов.
6 |
7 | Такие приложения, как голосовая почта, конференции, очереди вызовов и агенты, музыка на удержании и парковка вызовов - все это стандартные функции, встроенные прямо в программное обеспечение. Кроме того, Asterisk может интегрироваться с другими бизнес-технологиями таким образом, о котором закрытые, проприетарные УАТС вряд ли могут мечтать.
8 |
9 | Asterisk может показаться довольно пугающим и сложным для нового пользователя, поэтому документация так важна для его роста. Документация снижает барьер для входа и помогает людям созерцать возможности.
10 |
11 | Выпущенный при щедрой поддержке O'Reilly Media, [Asterisk: Окончательное руководство](http://shop.oreilly.com/product/0636920025894.do) - это пятое издание того, что ранее называлось [Asterisk: Будущее телефонии](http://shop.oreilly.com/product/9780596510480.do).
12 |
13 | Эта книга была написана для участников сообщества Asterisk.
14 |
15 | ## Аудитория
16 |
17 | Эта книга предназначена для того, чтобы быть нежной к тем, кто новичок в Asterisk, но мы предполагаем, что вы знакомы с базовым администрированием Linux, сетью и другими ИТ-дисциплинами. Если нет, мы рекомендуем вам изучить обширную и замечательную библиотеку книг, которые O'Reilly публикует по этим темам. Мы также предполагаем, что вы пока новичок в телекоммуникациях \(как традиционная коммутируемая Телефония, так и новый мир Voice over IP\).
18 |
19 | Однако эта книга будет полезна и более опытному администратору Asterisk. Мы сами используем книгу в качестве ссылки на функции, которые мы не использовали в течение некоторого времени.
20 |
21 | ## Программное обеспечение
22 |
23 | Эта книга сосредоточена на документировании версии 16 Asterisk; однако многие соглашения и большая часть информации в этой книге являются агностическими версиями. Linux - это операционная система, в которой мы запускали и тестировали Asterisk, и мы задокументировали инструкции по установке для CentOS \(Red Hat Enterprise Linux или RHEL\).
24 |
25 | ## Условные обозначения используемые в книге
26 |
27 | В этой книге используются следующие типографские условные обозначения:
28 |
29 | _Курсив_
30 |
31 | Обозначает новые термины, URL-адреса, адреса электронной почты, имена файлов, расширения файлов, пути, каталоги и имена пакетов, а также утилиты Unix, команды, модули, параметры и аргументы.
32 |
33 | `Моноширинный`
34 |
35 | Используется для отображения примеров кода, содержимого файлов, взаимодействий командной строки, команд базы данных, имен библиотек и параметров.
36 |
37 | **`Моноширинный полужирный`**
38 |
39 | Обозначает команды или другой текст, который должен быть набран буквально пользователем. Также используется для акцентирования в коде.
40 |
41 | _`Моноширинный курсив`_
42 |
43 | Показывает текст, который должен быть заменен пользовательскими значениями.
44 |
45 | _`[ Keywords and other stuff ]`_
46 |
47 | Указывает необязательные ключевые слова и аргументы.
48 |
49 | _`{ вариант-1 | вариант-2 }`_
50 |
51 | Означает _`вариант-1`_ или _`вариант-2`_.
52 |
53 |
54 |
55 |
56 | Этот элемент означает подсказку или предложение.
57 | |
58 |
59 |
60 |
61 |
62 |
63 |
64 | Этот элемент обозначает общую заметку.
65 | |
66 |
67 |
68 |
69 |
70 |
71 |
72 | Этот элемент указывает на предупреждение или предостережение.
73 | |
74 |
75 |
76 |
77 | ## Онлайн обучение O’Reilly
78 |
79 |
80 |
81 |
82 | На протяжении почти 40 лет [O'Reilly Media](http://oreilly.com/) предоставляет технологии и бизнес-тренинги, знания и понимание, чтобы помочь компаниям добиться успеха.
83 | |
84 |
85 |
86 |
87 | Наша уникальная сеть экспертов и новаторов делится своими знаниями и опытом с помощью книг, статей, конференций и нашей онлайн-обучающей платформы. Платформа онлайн-обучения o'Reilly предоставляет вам по запросу доступ к живым учебным курсам, углубленным учебным путям, интерактивным средам кодирования и обширной коллекции текста и видео от O'Reilly и более чем 200 других издателей. Для получения дополнительной информации, пожалуйста, посетите [_http://oreilly.com_](http://www.oreilly.com/).
88 |
89 | ## Как с нами связаться
90 |
91 | Пожалуйста, направляйте комментарии и вопросы, касающиеся этой книги, издателю:
92 |
93 | * O'Reilly Media, Inc.
94 | * 1005 Gravenstein Highway North
95 | * Sebastopol, CA 95472
96 | * 800-998-9938 (в США или Канаде)
97 | * 707-829-0515 (международный или местный)
98 | * 707-829-0104 (факс)
99 |
100 | У нас есть веб-страница для этой книги, где мы перечисляем ошибки, примеры и любую дополнительную информацию. Вы можете получить доступ к этой странице по адресу [_https://oreil.ly/asterisk_tdg_5E_](https://oreil.ly/asterisk_tdg_5E).
101 |
102 | Чтобы прокомментировать или задать технические вопросы об этой книге, отправьте электронное письмо по адресу [_bookquestions@oreilly.com_](mailto:bookquestions@oreilly.com).
103 |
104 | Для получения дополнительной информации о наших книгах, курсах, конференциях и новостях смотрите наш веб-сайт по адресу [_http://www. oreilly.com_](http://www.oreilly.com/).
105 |
106 | Facebook: [_http://facebook.com/oreilly_](http://facebook.com/oreilly)
107 |
108 | Следуйте за нами в Twitter: [_http://twitter.com/oreillymedia_](http://twitter.com/oreillymedia)
109 |
110 | Смотрите нас на YouTube: [_http://www.youtube.com/oreillymedia_](http://www.youtube.com/oreillymedia)
111 |
112 | ## Благодарности от Джима Ван Меггелена
113 |
114 | Дэвиду Даффетту спасибо за главу об интернационализации, в которой он правильно рассматривает эту технологию с более глобальной точки зрения.
115 |
116 | Спасибо Лейфу Мэдсену, Джареду Смиту и Расселу Брайанту за Ваш вклад в предыдущие издания этой книги. Это было весело летать в одиночку, но я не могу отрицать, что скучал по вам, ребята!
117 |
118 | Особая благодарность Мэтту Фредриксону и Мэтту Джордану из Digium, которые щедро делились со мной своим временем и знаниями, и без которых я был бы потерян. Спасибо, ребята!
119 |
120 | Спасибо моему редактору Джеффу Блейлу за то, что он держит меня в курсе событий и помогает принимать важные решения о содержании и темпе работы над книгой.
121 |
122 | А также благодаря остальным невоспетым героям из производственного отдела О'Рейли. Это те люди, которые берут книгу и делают ее книгой О'Рейли.
123 |
124 | Особенно я благодарен Джойс Уилмот и Дэну Дженкинсу, моей команде технического рецензирования за то, что они нашли время для работы над книгой и предоставили необходимую обратную связь.
125 |
126 | Томас Камерон из RedHat щедро поделился со мной своими знаниями о Selinux и помог демистифицировать компонент Linux, который слишком часто остается отключенным.
127 |
128 | Все участники сообщества Asterisk также должны поблагодарить покойного Джима Диксона за создание первых аппаратных интерфейсов телефонии с открытым исходным кодом, начало революции и предоставление его творений сообществу в целом.
129 |
130 | Наконец, и это самое главное, спасибо Марку Спенсеру, оригинальному автору Asterisk и основателю Digium, за Asterisk, за [Pidgin](http://www.pidgin.im/), а также за вклад его творений в сообщество с открытым исходным кодом. Asterisk - это ваше наследие!
131 |
--------------------------------------------------------------------------------
/readme.md:
--------------------------------------------------------------------------------
1 | # Аннотация
2 |
3 | Разрабатывайте систему передачи голоса по IP \(VoIP\) или традиционную систему АТС с Asterisk, даже если у вас только базовые знания в области телекоммуникаций. Это руководство - путеводитель, который проведет вас от установки до настройки этого open source программное обеспечение, независимо от того, обновляете ли вы существующую телефонную систему или создаете с нуля.
4 |
5 | Это обновленное пятое издание, идеально подходящее для администраторов Linux, разработчиков и опытных пользователей, показывает, как настроить АТС на основе VoIP на предприятии. Вы познакомитесь с функциями в Asterisk 16 - актуальный, на данный момент, релиз с долгосрочной поддержкой от Digium. Эта книга также включает в себя новые главы по [WebRTC](glava-20.md) и [Asterisk Real-time Interface \(ARI\)](glava-19.md).
6 |
7 | * Узнайте как WebRTC предоставляет новое направление для Asterisk
8 | * Получите знания для постройки простой, но полноценной телефонной системы
9 | * Создайте интерактивный диалплан, используя лучшие практики для расширенных возможностей Asterisk
10 | * Узнайте как ARI стал предпочтительным API для взаимодействия языков веб-разработки с Asterisk
11 |
12 | 
13 |
14 | [Содержание книги](SUMMARY.md)
15 |
16 | [](https://github.com/translaster/Definitive-Guide-5th-Edition/network) [](https://github.com/translaster/Definitive-Guide-5th-Edition/stargazers)
17 |
--------------------------------------------------------------------------------
/summary.md:
--------------------------------------------------------------------------------
1 | # Содержание
2 |
3 | * [Аннотация](README.md)
4 | * [Вступление](foreword.md)
5 | * [Предисловие](preface.md)
6 | * [Глава 1. Революция в телефонии](chapter-01.md)
7 | - [Asterisk и VoIP: преодоление разрыва между традиционной и сетевой телефонией](chapter-01.md#asterisk-и-voip-преодоление-разрыва-между-традиционной-и-сетевой-телефонией)
8 | - [Массовые изменения требуют гибкости технологий](chapter-01.md#массовые-изменения-требуют-гибкости-технологий)
9 | * [Глава 2. Архитектура Asterisk](glava-02.md)
10 | * [Глава 3. Установка Asterisk](glava-03.md)
11 | * [Глава 4. Сертификаты для безопасности конечных точек](glava-04.md)
12 | * [Глава 5. Конфигурация пользовательских устройств](chapter-05.md)
13 | - [Концепции именования телефонов](chapter-05.md#концепции-именования-телефонов)
14 | - [Телефоны, софтфоны и телефонные адаптеры](chapter-05.md#телефоны-софтфоны-и-телефонные-адаптеры)
15 | * [Глава 6. Основы диалплана](chapter-06.md)
16 | - [Синтаксис диалплана](chapter-06.md#синтаксис-диалплана)
17 | - [Контексты](chapter-06.md#контексты)
18 | - [Extensions (Расширения)](chapter-06.md#extensions-расширения)
19 | - [Приоритеты](chapter-06.md#приоритеты)
20 | - [Приложения](chapter-06.md#приложения)
21 | - [Приложения Answer(), Playback() и Hangup()](chapter-06.md#приложения-answer-playback-и-hangup)
22 | - [Базовый прототип диалплана](chapter-06.md#базовый-прототип-диалплана)
23 | - [Простой диалплан](chapter-06.md#простой-диалплан)
24 | - [Hello World](chapter-06.md#hello-world)
25 | - [Создание интерактивного диалплана](chapter-06.md#создание-интерактивного-диалплана)
26 | - [Приложения Goto(), Background() и WaitExten()](chapter-06.md#приложения-goto-background-и-waitexten)
27 | - [Обработка неверных значений и тайм-аутов](chapter-06.md#обработка-неверных-значений-и-тайм-аутов)
28 | - [Использование приложения Dial](chapter-06.md#использование-приложения-dial)
29 | - [Использование переменных](chapter-06.md#использование-переменных)
30 | - [Совпадения по шаблонам](chapter-06.md#совпадения-по-шаблонам)
31 | - [Включения (Includes)](chapter-06.md#включения-includes)
32 | * [Глава 7. Внешние подключения](glava-07.md)
33 | * [Глава 8. Голосовая почта](glava-08.md)
34 | * [Глава 9. Интернационализация](glava-09.md)
35 | * [Глава 10. Погружение в диалплан](chapter-10.md)
36 | - [Выражения и манипуляции с переменными](chapter-10.md#выражения-и-манипуляции-с-переменными)
37 | - [Базовые выражения](chapter-10.md#базовые-выражения)
38 | - [Операторы](chapter-10.md#операторы)
39 | - [Функции диалплана](chapter-10.md#функции-диалплана)
40 | - [Синтаксис](chapter-10.md#синтаксис)
41 | - [Примеры функций диалплана](chapter-10.md#примеры-функций-диалплана)
42 | - [Условное ветвление](chapter-10.md#условное-ветвление)
43 | - [Приложение GotoIf](chapter-10.md#приложение-gotoif)
44 | - [Условное ветвление по времени с GotoIfTime](chapter-10.md#условное-ветвление-по-времени-с-gotoiftime)
45 | - [GoSub](chapter-10.md#gosub)
46 | - [Определение подпрограмм](chapter-10.md#определение-подпрограмм)
47 | - [Возврат из подпрограммы](chapter-10.md#возврат-из-подпрограммы)
48 | - [Локальные (Local) каналы](chapter-10.md#локальные-local-каналы)
49 | - [Использование базы данных Asterisk](chapter-10.md#использование-базы-данных-asterisk)
50 | - [Хранение данных в AstDB](chapter-10.md#хранение-данных-в-astdb)
51 | - [Получение данных из AstDB](chapter-10.md#получение-данных-из-astdb)
52 | - [Удаление данных из AstDB](chapter-10.md#удаление-данных-из-astdb)
53 | - [Использование AstDB в диалплане](chapter-10.md#использование-astdb-диалплане)
54 | - [Полезные функции Asterisk](chapter-10.md#полезные-функции-asterisk)
55 | - [Концеренц-связь с ConfBridge()](chapter-10.md#конференц-связь-с-confbridge)
56 | - [Полезные функции диалплана](chapter-10.md#полезные-функции-диалплана)
57 | - [CALLERID](chapter-10.md#callerid)
58 | - [CHANNEL](chapter-10.md#channel)
59 | - [CURL](chapter-10.md#curl)
60 | - [CUT](chapter-10.md#cut)
61 | - [IF и STRFTIME](chapter-10.md#if-и-strftime)
62 | - [LEN](chapter-10.md#len)
63 | - [REGEX](chapter-10.md#regex)
64 | - [STRFTIME](chapter-10.md#strftime)
65 | * [Глава 11. Функции АТС, включая парковку, пейджинг и конференц-связь](glava-11.md)
66 | * [Глава 12. Automatic Call Distribution Queues](glava-12.md)
67 | * [Глава 13. Состояния устройств](glava-13.md)
68 | * [Глава 14. Автосекретарь](glava-14.md)
69 | * [Глава 15. Интеграция реляционной базы данных](glava-15.md)
70 | * [Глава 16. Введение в интерактивное голосовое меню](glava-16.md)
71 | * [Глава 17. AMI и файлы вызовов](glava-17.md)
72 | * [Глава 18. AGI](glava-18.md)
73 | * [Глава 19. Asterisk REST Interface](glava-19.md)
74 | * [Глава 20. WebRTC](glava-20.md)
75 | * [Глава 21. Системный мониторинг и журналирование](glava-21.md)
76 | * [Глава 22. Безопасность](glava-22.md)
77 | * [Глава 23. Asterisk: Будущее телефонии](glava-23.md)
78 | * [Об авторах](about-the-authors.md)
79 | * [Послесловие](colophon.md)
80 |
--------------------------------------------------------------------------------