Compare commits

...

2 Commits

Author SHA1 Message Date
Alexander Zhirov 33fc83b8d6 Синтаксические исправления asterisk 2022-06-14 15:54:23 +03:00
Alexander Zhirov 5acde57649 Добавлен asterisk мануал 2022-06-14 14:44:08 +03:00
63 changed files with 1386 additions and 0 deletions

View File

@ -1,4 +1,5 @@
# Мануалы
## [Asterisk](src/asterisk.md)
## [initrd (Initial RAM Disk)](src/initrd.md)
## [Базовая настройка подключения к серверу Samba](src/samba.md)

8
manuals/src/asterisk.md Normal file
View File

@ -0,0 +1,8 @@
# Asterisk
## [01. Подготовка сервера и нужного оборудования](asterisk/asterisk_01.md)
## [02. Видео - установка Asterisk из консоли](asterisk/asterisk_02.md)
## [03. Настройка с нуля через консоль](asterisk/asterisk_03.md)
## [04. Установка и настройка через FreePBX (GUI)](asterisk/asterisk_04.md)
## [05. Безопасность сервера Asterisk](asterisk/asterisk_05.md)
## [06. Траблшутинг Asterisk](asterisk/asterisk_06.md)

View File

@ -0,0 +1,135 @@
# Подготовка сервера и нужного оборудования
## Рассказываем про FXO и FXS
В процессе нашей работы, часто приходится сталкиваться с ситуациями, когда заказчик, при переходе от аналоговой телефонии (ТФОП Телефонная Сеть Общего Пользования) к VoIP не может отказаться от имеющегося у него аналогового оборудования. Это могут быть как аналоговые телефоны, факсимильные и модемные устройства так и вся аналоговая АТС. Причины могут быть абсолютно разные, но решение всегда одно - поставить специальные шлюзы c FXS/FXO интерфейсами, с помощью которых можно "подружить" аналоговый мир и мир IP.
Как можно догадаться FXS/FXO интерфейсы (порты) - это аналоговый мир и одно не может существовать без другого. Что же это за интерфейсы и как они работают - читайте в этом разделе.
## Предыстория
Традиционная аналоговая телефонная сеть это совокупность технических сооружений и аналоговых линий связи, обеспечивающих возможность осуществления телефонных соединений посредством аналоговых телефонных аппаратов. Подключение к телефонной сети общего пользования (`POTS` **Plain Old Telephone Service**) - это услуга, которую предоставляет местная телефонная компания из своих центральных офисов (`CO` **Central Office**) для домашних или офисных абонентов. Подключение осуществляется с помощью электрических проводов, состоящих из двух медных жил. Чтобы увеличить расстояние, на которое может быть передан сигнал и уменьшить электромагнитные помехи, жилы скручиваются вместе, такой метод называется «витая пара».
## Интерфейс FXS
Медные провода протягиваются до помещений конечных абонентов (квартиры и жилые дома для домашних абонентов, офисные здания и комнаты для офисных абонентов) и заканчиваются в виде телефонной розетки в стене, как правило, с разъёмом стандарта `RJ-11` (У кого то может быть ещё остались советские `​РТШК​`).
![asterisk_01](img/asterisk_01.png)
И это, дорогие друзья, и есть тот самый интерфейс или порт `FXS` **Foreign eXchange Subscriber**/**Station**, по которому местная телефонная компания предоставляет сервис POTS. В данный порт должны подключаться оконечные абонентские устройства, такие как телефон, факс или модем. Буква `S` - (`Subscriber` - абонент) в аббревиатуре FXS как бы подсказывает, что данный интерфейс будет ожидать подключения именно от абонентского устройства.
Основные функции, которые обеспечивает FXS порт это:
- `Зуммер` - непрерывный сигнал, который Вы слышите, когда снимаете трубку, означающий, что телефонная станция готова принимать номер. В англоязычной литературе Dial Tone;
- `Ток заряда батареи питания линии`;
- `Напряжение линии` - постоянное напряжение аналоговой телефонной линии, необходимое для осуществления звонка;
Итак, запомните к FXS всегда подключаем абонентские оконечные устройства, это то, что мы получаем от провайдера телефонной связи.
## Интерфейс FXO
Устройства `FXO` **Foreign eXchange Office**- это устройства, которые получают сервис POTS, то есть это оконечные устройства телефоны, факсы модемы и так далее. Эти устройства также имеют разъём стандарта RJ-11 и ожидают подключения со стороны телефонной станции (`CO` **Central Office**), о чем свидетельствует буква «O» - Office в аббревиатуре FXO.
Данный интерфейс обеспечивает функции определения поднятия трубки (on-hook/off-hook), то есть факт замыкания цепи, которая в свою очередь вызывает отправку Dial Tone со стороны телефонной станции.
Итак, запомните к FXO всегда подключаем линию от провайдера телефонной связи.
А теперь, закрепим усвоенное.
- `FXS порт` - это наша домашняя (или офисная) телефонная розетка, которую нам
предоставляет провайдер телефонных услуг. К ней мы подключаем абонентские
аппараты (телефоны, факсы и прочие);
- `FXO порт​` это разъем на нашем телефоне, его мы всегда подключаем к FXS, то
есть к телефонной станции провайдера услуг POTS;
![asterisk_02](img/asterisk_02.png)
**Совет.** *​Кстати, важно отметить, что нельзя подключить FXO устройство к другому FXO устройству, ну и FXS к FXS. Например, если вы напрямую соедините два телефона (FXO), то вы не сможете позвонить с одного на другой.*
## Аналоговые УАТС и FXS/FXO
Если в офисе используется старая аналоговая учрежденческая АТС (`УАТС`), то это немного меняет картину. УАТС должна иметь оба типа интерфейсов, как FXS, так и FXO.
Линии от провайдера телефонных услуг (FXS), должны подключаться к FXO интерфейсам аналоговой УАТС, обеспечивая Dial Tone и напряжение линии, а сами оконечные устройства телефонные аппараты, как устройства FXO, должны подключаться к FXS интерфейсам аналоговой УАТС и обеспечивать определения снятия трубки.
![asterisk_03](img/asterisk_03.png)
## VoIP и FXS/FXO
Как мы сказали в начале раздела, для того, чтобы «подружить» аналоговый мир и мир IP, необходимо использовать VoIP шлюзы. Однако то, какой именно использовать шлюз FXO или FXS зависит от ситуации. Как правило ситуаций всего две:
### Пример 1
У нас есть медные линии от местной телефонной компании, но отказываться мы от них не хотим. Планируем поставить в качестве офисной телефонной станции IP-АТС Asterisk.
В этом случае нам нужен FXO шлюз. Медные линии от провайдера (FXS) мы подключаем в FXO порты шлюза, а к Ethernet ​портам шлюза подключается IP-АТС Asterisk. FXO шлюз производит преобразование аналоговых сигналов от аналоговой станции нашей местной телефонной компании в цифровые сигналы, которые понимает IP-АТС Asterisk. Схема такая:
![asterisk_04](img/asterisk_04.png)
### Пример 2
У нас есть аналоговые телефоны и факс, отказываться от них мы не хотим. Однако отказались от старой аналоговой АТС и перешли на IP-АТС Asterisk
В этом случае, нам нужен FXS шлюз. Наши аналоговые телефоны это аппараты FXO, поэтому их мы подключаем к FXS портам шлюза, а к Ethernet порту подключаем IP-АТС Asterisk. FXS шлюз осуществляет преобразование аналоговых сигналов от аналоговых телефонов в цифровые сигналы, которые понимает Asterisk. Схема примерно такая:
![asterisk_05](img/asterisk_05.png)
## SIP против PRI сравнение и преимущества
Корпоративные системы телефонии давно отошли от использования обычных аналоговых линий в пользу АТС (автоматическая телефонная станция) в паре с подключением к ISDN по стандарту PRI. Но, не так давно, появился современный, более дешевый и гибкий вариант подключения офисных АТС, который называется «SIP транкинг». В этом разделе мы сравним подключение по PRI с подключение по SIP, отметим преимущества и недостатки.
`PRI` (**Primary Rate Interface**)​— стандартный интерфейс сети ISDN. В рамках данного интерфейса функционируют такие стандарты как `E1` и `T1`.
### Цифровая телефония
Важно понимать, что мы ведем разговор исключительно о цифровой передаче сигнала, не аналоговой. Оба стандарта PRI и SIP используют цифровую модель сигнала, с единственной разницей в том, что стандарт `ISDN PRI` - ​это формат с коммутацией каналов, а `SIP` - это коммутация пакетов.
### Функциональность
С точки зрения функциональности, при условии правильной настройки, обе системы демонстрируют высокие показатели. Почти все IP АТС на рынке поддерживают стандарты `PRI` ​и `SIP`. Основная идея интерфейса PRI (потоки E1 или T1) в том, что в рамках одной цифровой линии может передаваться 32 или 24 канала, по которым передаются как голосовые сообщения, так и информация о сигнализации и синхронизации. Интерфейс T1 состоит из 23 голосовых каналов и 1 канала для синхронизации. В свою очередь Е1 поддерживает 30 голосовых каналов и 2 канала выделяется для сигнализации.
### Масштабируемость PRI
Если вам требуется расширить число каналов, то есть сделать их больше 30, то необходимо добавить еще одну PRI линию. Ситуация, в которой у компании на АТС используется от 1 до 4 PRI линий (потоков Е1) является достаточно распространенной.
### SIP в корпоративной сети
Применение протокола SIP в корпоративных сетях расширяет инструментарий администратора. SIP - транк позволяет объединить два удаленных офиса так, будто их соединяет физическая линия. Одним из важнейших преимуществ SIP транков является возможность сосуществования трафика сети передачи данных и трафика от телефонии (`VoIP`) в одной сетевой среде передачи такая сеть называется `конвергентной`.
### Почему SIP?
«`SIP транки`​», как видно из названия, оперирует на базе протокола SIP (**Session Initiation Protocol**). По правилам протокола, телефонная сигнализация и голосовые сообщения формируются в пакеты и передаются в одной сети передачи данных. Использование протокола SIP предлагает более широкий по сравнению с ISDN PRI спектр возможностей, а также, позволяет расширить параметры отказоустойчивости к падению каналов передачи. Важно отметить, что выбор провайдера SIP телефонии является ответственной задачей, так как уровень обслуживания варьируется от `ISP` к `ISP` (**Internet Service Provider**).
### Внешние вызовы PRI
При высоких сетевых нагрузках имеет смысл подключать две отдельные линии для телефонии и передачи данных. Это уменьшает риск и позволяет использовать дешевые высокоскоростные каналы (без гарантии определенного уровня задержек и прочих параметров канала) вместе с использованием канала с максимально высоким качеством обслуживания. При этом все равно остается возможность совместить корпоративную сеть и дать АТС право маршрутизировать звонки, в том числе и внешние вызовы через PRI транк.
Но к чему использовать E1 PRI для подключения IP - телефона вместо использования на 100% возможностей VoIP? Самым простым объяснением является то, что в мире далеко не все используют VoIP или даже оператора интернет услуг (провайдера) ISP. На текущий момент, единственной, по-настоящему универсальной системой является ТфОП, через которую можно дозвониться до любого телефона в мире. Корпоративная VoIP АТС может дать хорошую экономию на внутренних звонках внутри вашей сети, более того, можно купить SIP - транк для подключения к телефонному оператору связи через интернет.
Но, что происходит при наборе внешнего номера через PRI? Правильно, вызов пойдет через ISDN PRI линии, которые подключены к публичной телефонной сети.
### Внешние вызовы SIP
Вместо использования PRI интерфейса, можно использовать SIP транк. В зависимости от кодеков, полосы пропускания и схемы подключения, в рамках подключения по SIP предоставляется возможность использовать намного больше каналов, чем в E1 (PRI), то есть больше тридцати. Вы можете подключить десятки телефонных аппаратов к своей АТС в зависимости от полосы пропускания канала к провайдеру.
### Качество обслуживания
Отметим, что в телефонной сети общего пользования, под телефонный вызов резервируется вся полоса пропускания канала передачи. В отличие от PRI, VoIP пакеты могут быть обслуживаться наравне с трафиком от других приложений. В данном случае, голосовые пакеты буду чувствительны к таким параметрам как задержка, потеря пакетов или джиттер. При ненадлежащем качестве обслуживания трафика VoIP, эффект может быть аналогичным ситуации, в которой наш мобильный имеет низкий уровень сигнала сотовой сети.
### Защищенность
Сама по себе концепция ISDN PRI предоставляет изолированный канал передачи данных от точки до точки. Конечно, SIP можно передавать по защищенным VPN ​сетям, но в базовой архитектуре, пакеты SIP передаются по открытой сети Интернет.
### Итоги
Безусловно, выбор всегда формируется под воздействием множества факторов, таких как требования к безопасности, количеству каналов, масштабируемости, бюджету и качеству обслуживания. Протокол SIP это современный и очень гибкий стандарт, обладающий большим количеством функций, в то время как ISDN PRI доказал свою надежность на протяжении 20 лет использования.
## Калькулятор сервера Asterisk
Теперь, когда вы знаете о главных интерфейсах смежного оборудования к Asterisk (FXO/FXS/SIP/PRI), пора посчитать свой собственный сервер для лабораторной инсталляции.
Посмотрите ​видео​:
[![asterisk_06](img/asterisk_06.png)](https://www.youtube.com/watch?v=oltu4CzSpBc)
Калькулятор находится по [ссылке](https://wiki.merionet.ru/asterisk-calculator/).

View File

@ -0,0 +1,7 @@
# Видео - установка Asterisk из консоли
Посмотрите видео о том, как установить Asterisk 14.6.0 на операционную систему CentOS 7. Из консоли. С нуля.
[![asterisk_07](img/asterisk_07.png)](https://www.youtube.com/watch?v=i9mNnaxAQXo)
Материал по ​установке Asterisk 14.6.0 на CentOS 7также можно прочитать в [статье](https://wiki.merionet.ru/ip-telephoniya/72/asterisk-nastrojka-s-nulya/) (включая нужные команды).

View File

@ -0,0 +1,573 @@
# Настройка с нуля через консоль
Сделаем базовую настройку Asterisk через конфигурационные файлы. Предполагается, что у нас уже установлена и первоначально настроена ОС, скачены и установлены модули `dahdi`, `libpri`, `iax2`, необходимые голосовые файлы и кодеки и проинсталирован Asterisk.
А еще вам понадобится ​установить [sngrep](https://wiki.merionet.ru/ip-telephoniya/50/sngrep-ustanovka-i-ispolzovanie/) для трассировки и отладки SIP-сообщений.
## Теория
Итак, приступаем к внедрению Asterisk. Структура используемых Астериском директорий следующая:
- `/usr/lib64/asterisk/modules` тут находятся загружаемые модули;
- `/var/log/asterisk` тут находятся лог-файлы, в том числе и лог звонков (если не настроено другое);
- `/var/spool/asterisk` тут находятся подпапки, в которых находятся бэкапы, записи разговоров, голосовая почта, факсы и так далее;
- `/var/lib/asterisk` тут находятся подпапки, в которых находятся звуковые файлы для музыки на удержании, звуковые файлы для выбранных языков (например для проигрывания голосовых сообщений в IVR), записанные голосовые сообщения для приветствия и так далее.
Конфигурационные файлы находятся в папке `/etc/asterisk`. Для работы каждого модуля Asterisk необходим конфигурационный файл. Эти файлы (с расширением `.conf`), содержат определения каналов, описывают различные внутренние сервисы, определяют местоположения других модулей, устанавливают связь с диалпланом. Необязательно настраивать все файлы. Требуют настройки только те, которые необходимы для вашей конфигурации.
Основные конфигурационные файлы:
- `asterisk.conf` - определяет глобальные параметры, директории и опции для запуска Asterisk;
- `cdr.conf` - определяет настройки для записи параметров вызовов в файл или базу данных;
- `sip.conf` определяет настройки для использования SIP-протокола (как общие, так и параметры для регистрации провайдеров, внутренних пользователей и так далее);
- `rtp.conf` определяет порты для голоса (RTP);
- `iax.conf` - определяет настройки для использования IAX-протокола (как общие, так и параметры для регистрации провайдеров, внутренних пользователей и так далее);
- `extensions.conf` основной файл, в котором описывается весь диалплан, то есть правила обработки всех вызовов;
- `features.conf` - описывает дополнительные функции (переадресации, парковка вызова, включение записи по запросу и так далее);
- `logger.conf` определяет тип и детальность сообщений, записываемых в файлы журналов;
- `modules.conf` определяет какие модули будут или наоборот не будут загружаться при запуске Asterisk;
- `musiconhold.conf` используется для конфигурации разных классов музыки, используемых в приложениях музыки во время ожидания, и их местоположений;
Напомним, что это только часть конфигурационных файлов. Необходимые файлы можно добавлять в любой момент по мере необходимости. Примеры и содержание таких файлов можно найти в [архиве](files/Samples_config.zip).
Сразу после установки asterisk, если не была выбрана установка базовой конфигурации, в ней нет ни одного файла.
![asterisk_08](img/asterisk_08.png)
Для подключения к asterisk в режиме командной строки необходимо ввести:
```sh
asterisk -rvvvvv
```
- `r` - подключение к уже запущенному процессу;
- `vvvvv` - уровень логирования, то есть вывода информации (от слова verbose - v). Чем больше v выставляем, тем более детальная информация будет выдаваться в командную строку;
![asterisk_09](img/asterisk_09.png)
## Создаем и редактируем необходимые файлы
Начнем с файла `asterisk.conf`:
![asterisk_10](img/asterisk_10.png)
- `[directories](!)` - указываем расположение необходимых директорий. Знаком `(!)` указывается признак шаблона. В шаблоне указываются общие настройки, на которые можно ссылаться дальше.
- `[options]` - указываем необходимые опции, одна из необходимых `maxcalls` указывает на количество одновременных вызовов, разрешенных на Asterisk;
- `transmit_silence_during_record = yes` - передавать тишину `SLINEAR` во время записи канала;
- `languageprefix = yes|no` - Должен ли код языка быть последним или первым компонентом имени звукового файла? Если выключен, поиск звуковых файлов ведется в формате `<путь>/<язык>/<файл>` Если включен, поиск ведется в формате `<язык>/<путь>/<файл>`;
- `execincludes = yes|no` - Разрешить записи `#exec` в конфигурационных файлах;
- `hideconnect = yes|no` - Показывать сообщение о подключении удаленных консолей;
- `dontwarn = yes|no` - Отключить предупреждения (*warning messages*);
- `debug = no` - Отладка: `No` или значение (`1-4`);
- `maxcalls = 10` - Максимальное число одновременных вызовов;
Приступаем к файлу `cdr.conf`. Комментарии к опциям в конфиге:
```sh
[general]
enable=yes
; включаем саму возможность логирования звонков
unanswered=no
; неотвеченные звонки не логируем
safeshutdown=yes
; при выключении сервера будем ждать, пока не допишутся ВСЕ логи
[csv]
usegmtime=yes ;лог date/time в формате GMT. По умолчанию NO
loguniqueid=yes
loguserfield=yes
```
Закончили. Теперь файл​ `features.conf`:
```sh
[general]
[featuremap] ; тут описываем используемые функции и их параметры
blindxfer => ## ; безусловный перевод
atxfer => *2 ; условный перевод
automon => *1
disconnect => **
parkext => 700 ; парковка
parkpos => 710-780 ; диапазон портов для парковки
context => parkedcalls ; контекст для обработки запаркованных звонков
parkingtime => 180 ; время парковки
comebacktoorigin => no ; возвращать звонок на инициатора, когда закончилось время парковки вызова
parkedplay => both ; кому играть courtesytone когда вызов снимается с парковки. Опции: callee, caller, both или no(по умолчанию)
parkedcalltransfers => caller ; Кто может сделать трансфер припаркованного вызова с помощью DTMF. Опции: callee, caller, both или no(по умолчанию)
parkedcallrepark => caller ; Кто может перепарковать, припаркованный вызов с помощью DTMF. Опции: callee, caller, both или no(по умолчанию)
parkedcallhangup => no ; Кто может закончить, припаркованный вызов с помощью DTMF Опции: callee, caller, both или no(по умолчанию)
parkedcallrecording => no ; Кто может инициировать запись, с помощью DTMF. Опции: callee, caller, both или no(по умолчанию)..
parkedmusicclass => default ; Класс музыки ожидания для припаркованного,
adsipark => no ; Передавать или нет ADSI инфо о припаркованном вызове тому кто припарковал
findslot => first
pickupexten => *8 ; перехват звонка
[applicationmap] ; тут описываем используемые приложения
sendsms => *99,peer/both,Macro,sendsms
pitch => *00,self/both,Macro,pitch
```
Теперь конфигурируем RTP в файле `rtp.conf`:
```sh
[general]
rtpstart=36600
rtpend=39999
```
Музыка на ожидании в здании. Открываем файл `musiconhold.conf`:
```sh
[default]
mode=files
directory=/var/lib/asterisk/moh/
```
Следом открываем файл `logger.conf`:
```sh
[general]
[logfiles]
console => notice,warning,error,dtmf,verbose(5) ; уровень детализации сообщений, выводимых в консоль
full => debug,notice,warning,error,verbose(9),dtmf,fax,security ; уровень детализации сообщений, выводимых в лог-файл
```
Для удобства работы рекомендуется ограничивать уровень детализации сообщений, выводимых в консоль, но для вывода в файл выставить максимальный уровень детализации.
И напоследок - файл `modules.conf`. Есть 2 варианта: либо читаем все модули и указываем те, которые не надо читать:
```sh
[modules]
autoload=yes
noload => codec_g723-ast110-gcc4-glibc-x86_64-core2-sse4.so
```
Либо указываем конкретные модули, которые необходимо прочитать и запрещаем чтение всех. В этом случае для удобства лучше поделить модули на секции. Ниже приведена часть такого варианта:
```sh
[modules]
autoload = no
; Applications
load = app_bridgewait.so
load = app_dial.so
load = app_playback.so
; Bridging
load = bridge_builtin_features.so
load = bridge_builtin_interval_features.so
load = bridge_holding.so
; Call Detail Records
load = cdr_custom.so
; Channel Drivers
load = chan_bridge_media.so
load = chan_sip.so
; Codecs
load = codec_gsm.so
load = codec_ulaw.so
load = codec_alaw.so
load = codec_g722.so
; Formats
load = format_gsm.so
load = format_pcm.so
load = format_wav_gsm.so
load = format_wav.so
; Functions
load = func_callerid.so
load = func_cdr.so
load = func_pjsip_endpoint.so
; Core/PBX
load = pbx_config.so
; Resources
load = res_musiconhold.so
load = res_pjproject.so
load = res_pjsip_acl.so
```
В данном разделе мы используем первый вариант. На этом с настройкой основных файлов закончим. В дальнейшем по мере необходимости в них можно вносить изменения. Все последующие настройки мы будем вносить в файлы `sip.conf` и `extensions.conf`. Погнали к созданию и регистрации внутренних абонентов.
## Создание и регистрация внутренних абонентов
В `sip.conf` указываем сначала общие параметры SIP для Asterisk:
```sh
[general]
bindaddr=0.0.0.0 ; указываем IP-адрес и порт, на котором будет приниматься
bindport=5060 ; SIP-трафик
language=ru ; используемый язык для голосовых сообщений
alwaysauthreject=yes
allowguest=no ; запрещаем принимать «гостевые» звонки, то есть вызовы от незарегистрированных пользователей
```
Так же в этой секции можно указать поддерживается ли видео, время регистрации, перечислить локальные сети, указываем внешний IP-адрес в случае использования NAT и так далее.
В случае, когда у нас есть разные группы абонентов (например, есть несколько отделов, подразделений либо другие какие-то признаки группировки абонентов или абонентов большое количество), рекомендуется использовать шаблоны, в которые можно выносить обобщенные настройки.
Имя шаблона берется в скобки `[]` и следом указывается `(!)`. В шаблоне можно указать контекст для этих абонентов, используемые кодеки, разрешенные/запрещенные сети для регистрации этих абонентов, использование NAT и так далее. Пример шаблона приведен ниже:
```sh
[office](!)
type=friend
deny=0.0.0.0/0.0.0.0
permit=192.168.10.0/255.255.255.0
host=dynamic
context=from-internal
nat=no
qualify=yes
directmedia=no
disallow=all
allow=alaw
allow=ulaw
dtmfmode=info
```
И таких шаблонов можно может быть несколько. Теперь для создания записи для регистрации абонентов нам достаточно указать только отличительные параметры, такие как внутренний номер, имя абонента, пароль для регистрации и так далее.
```sh
[НОМЕР](​ШАБЛОН​)
callerid=ИМЯ <НОМЕР>
secret=ПАРОЛЬ
callgroup=5 ; номер группы вызова
pickupgroup=1,2,3,4,5 ; номера групп перехвата вызовов
```
Пример настройки:
![asterisk_11](img/asterisk_11.png)
![asterisk_12](img/asterisk_12.png)
В результате, по команде `sip show peers` ​мы видим зарегистрированных пользователей:
![asterisk_13](img/asterisk_13.png)
Абоненты зарегистрировались, но позвонить даже между собой они пока не могут. Для того, чтобы они могли совершать и принимать звонки необходимо настроить маршрутизацию (или диалплан). Делать это мы будем в файле `extensions.conf`, там тоже есть своя структура. И тут мы снова немного погружаемся в теорию:
Диалплан состоит из следующих основных элементов:
- `контексты​`;
- `добавочные номера​`;
- `приоритеты​`;
- `приложения​`;
`Контекст` - часть (раздел) диалплана, описывающая алгоритм обработки вызова и изолированная от остального диалплана. Содержит дополнительные номера (`extension`). Дополнительные номера, определенные в одном контексте, полностью изолированы от добавочных номеров в другом контексте, если это не разрешено специально. Так же с помощью контекстов можно ограничивать доступ к различным функциям (например к междугородним или международным звонкам). Имя контекста заключается в квадратные скобки `[]`. Рекомендуется создавать разные контексты для внутренних абонентов и для транков.
В начале диалплана находятся два специальных контекста, `[general]` и `[globals]`:
- `[general]` - содержит список общих настроек диалплана;
- `[globals]` - содержит глобальные переменные;
Эти два контекста являются специальными. Контекст является одним из обязательных параметров как для абонента, так и для транка.
Asterisk определяет контекст для обработки по тому принципу откуда пришел вызов, а не куда он пришел, то есть если пришел вызов на мобильный номер от абонента, то применяться будет тот контекст, который прописан у конкретного абонента, а не указанный в транке.
`Добавочные номера` это широкое понятие, которое определяет уникальные последовательности шагов (каждый шаг включает приложение), которые Asterisk будет применять к вызову по этой линии. В каждом контексте может быть задано столько добавочных номеров, сколько требуется. При вызове конкретного добавочного номера (входящим или внутренним звонком) Asterisk будет выполнять шаги, определенные для этого добавочного номера. Поэтому именно добавочные номера определяют, что происходит со звонками при их обработке соответственно диалплану.
Полный добавочный номер состоит из трех компонентов:
- `Имени (или номера)`. В качестве имени может быть использованы любые комбинации цифр и букв;
- `Приоритета` (каждый добавочный номер может включать множество шагов; порядковый номер шага называется его приоритетом);
- `Приложения` (или команды), которое выполняет некоторое действие над вызовом;
Эти три компонента разделяются запятыми:
```sh
exten => имя,приоритет,приложение()
```
Есть ещё зарезервированные добавочные номера:
- `s` - когда в контекст поступают вызовы, для которых не указан конкретный добавочный номер, они передаются на добавочный номер `s`. (`s` - сокращение от **start** (начало), поскольку именно здесь начнется обработка вызова, если не передана информация о добавочном номере.;
- `i` - когда абонент нажимает не ту кнопку (не существующий добавочный номер), вызов направляется на добавочный номер `i`;
- `t` - если абонент слишком долго не нажимает кнопку после запуска приложения `WaitExten()`, вызовы направляются на добавочный номер `t` (время ожидания по умолчанию - 10 с);
- `h` - экстеншен обрабатываемый при завершении вызова. После того как медиаканал закрылся;
Иногда можно встретить использование `same` вместо `exten`. Это применяют в основном с автоматическим выставлением приоритета, то есть `same => n` и означает «тоже самое, продолжение предыдущего»
`Приоритеты` последовательность выполнения приложений. Каждый приоритет пронумерован последовательно, начиная с 1, и выполняет одно определенное приложение. В Asterisk есть еще приоритет `n`, что означает «следующий». Каждый раз, когда Asterisk встречает приоритет `n`, она берет номер предыдущего приоритета и добавляет 1. Это упрощает внесение изменений в диалплан, поскольку теперь не надо изменять номера всех шагов.
`Приложения` выполняет определенное действие в конкретном дополнительном номере (например воспроизведение звука, прием тонального ввода, вызов канала, разрыв соединения и так далее).
Для выполнения некоторых приложений, таких как `Answer()` и `Hangup()`, не требуется никаких дополнительных инструкций. Некоторым приложениям необходима дополнительная информация. Эти данные, называемые аргументами, могут передаваться в приложения, чтобы оказывать влияние на то, как они выполняют свои действия. Чтобы передать аргументы в приложение их указывают через запятую в круглых скобках, следующих за именем приложения.
Для внесения комментариев в файл `extensions.conf` используют `;` - вы уже могли об этом догадаться, судя по нашим комментариям прямо в конфигах.
Таким образом можно как делать пометки для себя, так и делать невыполнимыми строки конфигурации (например, во время отладки).
Теперь давайте вернемся к нашим созданным абонентам. Создадим контекст, который указан у абонентов (`context=from-internal`):
![asterisk_14](img/asterisk_14.png)
В нем мы прописали что при наборе номера (`ИМЯ`), с приоритетом 1 выполнить приложение Dial c параметрами `ПРОТОКОЛ/НОМЕР`. Когда номеров немного, то можно конечно и так описывать. Но более правильно и красиво сделать тоже самое, но с использованием «маски»:
![asterisk_15](img/asterisk_15.png)
То есть при наборе любого номера из диапазона 10хх (шаблон показан нижним подчеркиванием) выполнить вызов с приоритетом 1 через приложение Dial с параметрами `ПРОТОКОЛ/НАБРАННЫЙ_НОМЕР`, время вызова 60 секунд и можно использовать перевод звонка (transfer).
`Шаблон номера` - это уникальный набор цифр, который определяет использование этого номера. Если набранный номер соответствует этому шаблону, то последующие номера не рассматриваются. Формат заполнения шаблона:
- `X` - совпадение любой цифры от 0 - 9;
- `Z` - любая цифра от 1 до 9;
- `N` - совпадение любой цифры от 2 - 9;
- `[1237-9]` - соответствует любым цифрам или буквам и скобках (в этом
примере,1,2,3,7,8,9);
Перечитываем диалплан в консоли Asterisk командой `dialplan reload` и видим выполнение вызова.
![asterisk_16](img/asterisk_16.png)
Таким образом мы можем придумать и реализовать практически любой диалплан. Например для запрета вызовов на международную связь достаточно прописать 3 строчки:
![asterisk_17](img/asterisk_17.png)
То есть при наборе 810 будет проиграно сообщение destination-closed (если оно было загружено в Asterisk) и будет отправлен сигнал отбоя.
## Создание и регистрация транков
Ну, начнем с того, что IP-транки, используемые в Asterisk, бывают 2-х видов `SIP` и `IAX`.
`SIP-транки` в основном используются для подключения провайдеров, а `IAX-транки` для подключения других Asterisk. Транки могут быть с регистрацией (то есть когда провайдер выдает логин, пароль и адрес или домен для регистрации у него) и без регистрации (то есть когда подключение идет по IP-адресу без логина и пароля). В случае с регистрацией в файле `sip.conf` необходимо сразу после секции `[general]` указать строку регистрации в формате:
```sh
register => ЛОГИН:ПАРОЛЬ​@SIP-ПРОВАЙДЕР/НОМЕР
```
Тут:
- `SIP-ПРОВАЙДЕР` - указывается или IP-адрес провайдера или его домен;
- `ЛОГИН:ПАРОЛЬ​`- выдаются провайдером для подключения;
- `НОМЕР` - указывается городской номер, выданный провайдером для совершения звонков;
Рассмотрим создание SIP-транка с регистрацией. Опять же если у нас несколько (до 3-5) таких транков, то можно их описать каждый отдельно. А если из больше или в дальнейшем планируется увеличить их количество, то можно использовать шаблон для подключения к оператору.
```sh
[voip-provider](!) ; имя шаблона
type=peer ; тип подключения
context=from-trunk ; используемый контекст для обработки вызовов
disallow=all ; выключаем все кодеки
allow=alaw ; указываем используемые кодеки
allow=ulaw
insecure=invite,port ; не запрашивать авторизацию на входящие звонки
qualify=yes ; проверка доступности
directmedia=no ; запрещаем установление прямых соединений для передач голоса
dtmfmode=rfc2833 ; указываем используемый тип DTMF
```
Дальше достаточно описать конкретные настройки для конкретного оператора и указать какой шаблон использовать:
```sh
[ОПЕРАТОР-1](voip-provider)
defaultuser=ЛОГИН-1
fromuser=ЛОГИН-1
secret=ПАРОЛЬ-1
host=ДОМЕН-1 ИЛИ IP-АДРЕС ДЛЯ ПОДКЛЮЧЕНИЯ
fromdomain= ДОМЕН-1 ИЛИ IP-АДРЕС ДЛЯ ПОДКЛЮЧЕНИЯ
[ОПЕРАТОР-2](voip-provider)
defaultuser=ЛОГИН-2
fromuser=ЛОГИН-2
secret=ПАРОЛЬ-2
host=ДОМЕН-2 ИЛИ IP-АДРЕС ДЛЯ ПОДКЛЮЧЕНИЯ
fromdomain= ДОМЕН ИЛИ IP-АДРЕС ДЛЯ ПОДКЛЮЧЕНИЯ
```
Дальше указываем строки для регистрации у данных операторов:
```sh
register => ЛОГИН​-1:ПАРОЛЬ​-1@ДОМЕН​-1/НОМЕР-1
register => ЛОГИН​-2:ПАРОЛЬ​-2@ДОМЕН​-2/НОМЕР-2
```
Перечитываем файл `sip.conf` и проверяем регистрации:
![asterisk_18](img/asterisk_18.png)
В случае подключения транка без регистрации можно использовать тот же шаблон, а в настройках транка указать изменяемые параметры:
```sh
[AST10SIP](voip-provider)
type=friend ; для транка без регистрации указываем friend (то есть мы доверяем этому подключению)
port=5060 ; указываем порт для подключения
insecure=port,invite
host=IP-АДРЕСРОВАЙДЕРА
context=from-trunk-sip-AST10SIP ; если обработки вызовов через этот транк используется другой контекст, то указываем его тут.
```
Перечитываем файл `sip.conf` ​и проверяем регистрации:
![asterisk_19](img/asterisk_19.png)
Теперь рассмотрим создание IAX-транка. Для настройки IAX-транков используется файл `iax.conf`, который содержит всю информацию, необходимую Asterisk для создания и управления каналами, работающими по протоколу IAX. Структура его примерно такая же, как и у `sip.conf`:
```sh
[general] ; указываем глобальные параметры для протокола IAX
bindaddr=0.0.0.0
bindport=4569 ; по-умолчанию IAX-протокол использует порт 4569 можно оставить его, а можно и переопределить
language=ru ; указываем строки для регистрации транков
register => msk-spb:SuperPASS@10.10.10.10
[msk-spb]
username = msk-spb ; логин для регистрации на удаленной стороне
type = friend
trunk = yes
secret = SuperPASS ; пароль для регистрации
qualify = yes
host = 10.10.10.10 ; IP-адрес удаленной стороны
disallow= all
context = from-iax ; контекст для обработки вызовов, поступающих через этот транк
allow = alaw
allow = ulaw
```
Сохраняем файл `iax.conf`, перечитываем и проверяем регистрацию командой `iax2 show peers`:
![asterisk_20](img/asterisk_20.png)
Если есть абоненты, работающие по протоколу IAX, то их регистрацию описываем тоже в этом же файле аналогично SIP-регистрации.
Итак, сейчас мы имеем зарегистрированных абонентов, которые могут звонить друг другу, и зарегистрированные транки. Внутренних абонентов мы можем группировать по отделам:
```sh
exten => 500,1,Playback(it-otdel) ; проигрывается сообщение it-otdel
exten => 500,1,Dial(SIP/1001,5),Tt ; 5 секунд вызов идет на номер 1001
exten => 500,n,Dial(SIP/1002&SIP/1003) ; потом вызов идет одновременно на 1002 и 1003
```
Можем настраивать различные функции, запускать различные команды (в том числе и для выполнения через ОС), настраивать запись и прослушивание разговоров и так далее:
```sh
; ответить, подождать 2 секунды и положить трубку
exten => 060,1,Answer()
same => n,Wait(2)
same => n,Hangup()
; ответить, проиграть сообщение hello-world и положить трубку
exten => 061,1,Answer()
same => n,Playback(hello-world)
same => n,Hangup()
; записать сообщение в файл somefile.gsm и потом его проиграть
exten => 067,1,Record(/tmp/somefile.gsm,3,30)
same => n,Playback(/tmp/somefile)
```
Для совершения звонков через созданные и зарегистрированные транки SIP и IAX: Допустим через транк IAX у нас подключен другой Asterisk с внутренней нумерацией, начинающейся с 1, 2, 3. И для вызова этих абонентов мы будем использовать префикс (код выхода на маршрут) 2. Тогда строки настройки будут следующие:
```sh
exten => _2[1-3].,1,Dial(IAX2/msk-spb/${EXTEN:1},30,r)
exten => _2.,2,Hangup()
```
То есть при наборе, начинающемся с 21-23, будет осуществлен вызов через транк msk-spb по протоколу IAX набранного номера, предварительно «отрезав» 1 (первую) набранную цифру. Если в течение 30 секунд не будет получен ответ, то вызов будет прекращен.
Для выхода в город мы используем транк с оператором-1 и префикс выхода будем использовать 9:
```sh
exten => _9849[589]XXXXXXX,1,Dial(SIP/ОПЕРАТОР-1/${EXTEN:1})
;то есть при наборе, начинающемся с 9, будет осуществлен вызов через транк ОПЕРАТОР-1 по протоколу SIP набранного номера, предварительно «отрезав» 1 (первую) набранную цифру
```
Тут важно понимать, что все, что мы реализовываем для внутренних абонентов, должно быть описано в соответствующем контексте.
Теперь перейдем к транкам и входящим звонкам. Соответственно для того, чтобы принимать входящие вызовы, необходимо прописать маршрутизацию уже в контексте транка (`context=from-trunk` или `context = from-iax`).
Для возможности через транк осуществлять вызов нашего внутреннего абонента (например через транк со встречной АТС) необходимо в контекст транка вставить `exten => _10XX,1,Dial(SIP/${EXTEN},60,tTm`).
Давайте рассмотрим реализацию обработки входящего вызова от оператора (вызов на городской номер) через создание меню IVR и реализуем ещё определение рабочего и нерабочего времени. Схема обработки входящего вызова следующая:
Рабочее время у нас определено с 9:00 до 19:00 и с понедельника по пятницу. При поступлении звонка в нерабочее время после сообщения с приветствием (`01-hello`) проигрывается сообщение с указанием рабочего времени (`07-working-hours`). При поступлении звонка в рабочее время (проверка осуществляется в строке `GoToIfTime(09:00-19:00,mon-fri)`) после приветствия осуществляется переход в другой контекст (`[working-time]`), где предлагается выбрать необходимый пункт меню (0 вызов секретаря, 1 вызов на группу тех. поддержки, 2 переход в другое меню выбора (`GoTo(ivr-2,s,1)`), в котором по такому же принципу осуществляется выбор. В каждом меню реализован донабор внутренних номеров (`exten => _1xхx,1,NoOp`), обработка неправильного набора номера (`exten => i,1,NoOp`), обработка в случае, что если ничего не выбрали (`exten => t,1,NoOp`), вызов переводится на секретаря.
Естественно необходимо загрузить все используемые голосовые файлы в `/var/lib/asterisk/sound/ru` ​в случае использования русского языка. Тут давайте немного поподробнее.
Как мы уже указывали выше в системе мы определили какой основной язык у нас будет использоваться для голосовых файлов (в файле `sip.conf` параметр `language = ru`). Это значит, что Asterisk будет искать имена файлов, которые мы указываем, например, в меню `ivr` в папке `/var/lib/asterisk/sound/ru` (смотрим обозначения директорий при запуске asterisk в начале раздела). Если бы мы использовали в качестве основного языка английский, то папка была бы `/var/lib/asterisk/sound/en`. В каждой из этих папок находятся голосовые файлы выбранных языков и в выбранных форматах, указанных при компилировании asterisk. Если мы хотим записать свои сообщения (персональные приветствия, необходимые объявления, произносимые в создаваемых меню `ivr` и так далее), нам необходимо положить эти файлы в папку с соответствующим языком. Сами файлы при этом можно записать любой звукозаписывающей программой (хоть программой Звукозапись, входящей в стандартный дистрибутив любой версии Windows) и сохранить в формате `wav` (**​несжатый голос, 8кГц, 16 Бит, Моно​**).
Тут главное не перепутать имена файлов, находящихся в папке с голосовыми сообщениями, с именами, указанными в `ivr` меню, при этом в `ivr` меню имена указываются без расширения. Сам листинг приведен ниже:
```sh
[from-trunk]
exten => _X.,1,NoOp(Проверка времени: Если попали в диапазон - переходим в контекст working-time, если нет - продолжаем выполнение)
same => n,Answer()
same => n,Playback(01-hello)
same => n,GoToIfTime(09:00-19:00,mon-fri,*,*?working-time,s,1)
same => n,Playback(07-working-hours)
same => n,Hangup()
[working-time]
exten => s,1,Answer()
same => n,Background(01-ivr1)
same => n,StartMusicOnHold()
same => n,WaitExten(5)
;
exten => 0,1,NoOp(Если нажали "0" - звоним секретарю)
same => n,Playbacr(ostavaites-na-linii)
same => n,Dial(SIP/1005,30,mtT)
same => n,Hangup()
;
exten => 1,1,NoOp(Если нажали "1" - звоним на группу вызова: 1001+1002)
same => n,Playback(it-otdel)
same => n,Dial(SIP/1001&SIP/1002,30,mtT)
same => n,Hangup()
;
exten => 2,1,NoOp(Если нажали "2" - перенаправляем на ivr-2)
same => n,GoTo(ivr-2,s,1)
;
exten => _1xхx,1,NoOp(Прямой набор внутренних номеров)
same => n,Playback(ostavaites-na-linii)
same => n,Dial(SIP/${EXTEN}15,mtT)
same => n,Hangup()
;
exten => i,1,NoOp(Обработка ошибочного набора:i=illegal)
same => n,Playback(oshibka)
same => n,Dial(SIP/1005,30,r)
;
exten => t,1,NoOp(В случае, если не дождались нажатия)
same => n,Playback(ostavaites-na-linii)
same => n,Dial(SIP/1005,30,m)
;
[ivr-2]
exten => s,1,Background(02-ivr2)
same => n,StartMusicOnHold()
same => n,WaitExten(5)
;
exten => 1,1,NoOp(Если нажали "1" - звоним на 1001)
same => n,Dial(SIP/1001,30,mtT)
same => n,Hangup()
;
exten => 2,1,NoOp(Если нажали "2" - звоним на 1002)
same => n,Dial(SIP/1002,30,mtT)
same => n,Hangup()
;
exten => _1xхx,1,NoOp(Прямой набор внутренних номеров)
same => n,Dial(SIP/${EXTEN}15,mtT)
same => n,Hangup()
;
exten => i,1,NoOp(Обработка ошибочного набора:i=illegal)
same => n,Playback(oshibka)
same => n,Dial(SIP/1005,30,r)
;
```
После сохранения файла `extensions.conf` перечитываем диалплан в консоли (`dialplan reload`) и проверяем. На этом закончим с примерами.
Конфигурируя Asterisk ​через конфигурационные файлы, мы получаем возможность реализовать практически любую логику работы, проводить интеграции со сторонними сервисами, запускать и выполнять скрипты на уровне ОС и так далее.

View File

@ -0,0 +1,17 @@
# Установка и настройка через FreePBX (GUI)
## Видео - установка FreePBX Distro
Посмотрите видео о том, как установить дистрибутив Asterisk с графической оболочкой `FreePBX`:
[![asterisk_21](img/asterisk_21.png)](https://www.youtube.com/watch?v=WYGfSgmQaMg)
Материал ​по установке `FreePBX Distro` ​можно прочитать [тут](https://wiki.merionet.ru/ip-telephoniya/7/ustanovka-freepbxdistro/).
## Видео - настройка FreePBX
Посмотрите видео о том, как настроить `FreePBX` с нуля через графическую оболочку:
[![asterisk_22](img/asterisk_22.png)](https://www.youtube.com/watch?v=HB7wLDeXX8w)
Также [почитайте ​статью](https://wiki.merionet.ru/ip-telephoniya/13/freepbx-13-nastrojka-s-nulya/) по настройке `FreePBX` с нуля​, которая дублирует настройки в видео (для удобства).

View File

@ -0,0 +1,378 @@
# Безопасность сервера Asterisk
## Повышение безопасности Asterisk
О том, как защитить IP-АТС от несанкционированного доступа и дадим несколько простых советов, следуя которым, можно существенно повысить безопасность вашей телефонной станции. Примеры, которые будут приведены в данном разделе, относятся к IP-АТС на базе Asterisk, однако многие из них распространяются на все без исключения VoIP-АТС.
Для начала, давайте разберемся, чем же грозят "дыры" в безопасности и какие последствия грозят бизнесу, если злоумышленник получит доступ к IP-АТС.
## Угроза взлома
В отличие от взлома персонального компьютера или почты, взлом АТС - это бесплатные для взломщика звонки, за которые придется заплатить владельцу АТС. Известно немало случаев, когда хакеры тратили колоссальные суммы, проведя на взломанной АТС всего несколько часов.
Как правило, целями злоумышленников становятся IP-АТС, которые доступны из публичной сети. Используя различные SIP-сканнеры и исследуя системные уязвимости, они выбирают места для атаки. Дефолтные (default) пароли, открытые SIP-порты, неправильно управляемый firewall ​или его отсутствие - всё это может стать причиной несанкционированного доступа.
К счастью, все эти уязвимости можно устранить и причём совершенно бесплатно.
## Простые шаги к повышению безопасности
1. Первое правило, которое необходимо соблюдать - это не афишировать адрес своей IP-АТС и следить за тем, чтобы доступ к сети имели только авторизованные пользователи. Разумеется, это правило распространяется и на физический доступ к серверу, на котором установлена IP-АТС.
2. Второе и самое очевидное - не использовать дефолтные (default) пароли, которые будет легко подобрать или угадать - "1234", "admin", "password", название компании и так далее.
Одной из самых распространённых ошибок, является создание внутренних номеров (`Extension`), у которых и номер и пароль совпадают. В `sip.conf` ​это выглядит примерно так:
```sh
[101]
username=101
secret=101
host=dynamic
```
Допускать такого, категорически нельзя. Тем более что при создании внутреннего номера через интерфейс FreePBX, автоматически генерируется 32-значный надёжный пароль.
![asterisk_23](img/asterisk_23.png)
При настройке внутренних номеров также следует ограничивать IP-адреса, которые могут быть на них зарегистрированы вплоть до пула адресов локальной подсети. IP-АТС Asterisk имеет встроенные `ACL` (**Access Control List**), в настройке `sip.conf`. При помощи команд `permit/deny` можно разрешить лишь определенное количество IP-адресов для регистрации.
3. Другой важной мерой по усилению безопасности, является ограничение удаленного доступа к IP-АТС при помощи firewall. Будьте внимательны, так как в данном случае, главное грамотно настроить правила, по которым будет отрабатывать firewall. Убедитесь, что настройка не блокирует порты, которые использует ваша IP-АТС и не позволяет анонимно посылать ICMP запросы из публичной сети. Если вы планируете предоставлять удаленный доступ для авторизованных сотрудников, лучше всего организовать его при помощи VPN сервера (например, OpenVPN).
4. Если это возможно, то желательно использовать `NAT` (**Network Address Translation**). При помощи NATа, можно присвоить IP-АТС приватный IP-адрес и существенно усложнить доступ к ней из Интернета.
5. Еще одним очень важным фактором, является разделение входящих и исходящих маршрутов (`Inbound Routes` и `Outbound Routes`). Необходимо, чтобы каждый маршрут принадлежал собственному контексту обработки вызова.
6. Отключите каналы и сервисы, которые не используются. Например, если вы не используете протокол `MGCP` ​или `skinny`. Отключить эти модули можно в `/etc/modules.conf` как показано ниже:
```sh
noload => chan_mgcp.so
noload => chan_skinny.so
noload => chan_oss.so
```
7. Чтобы усложнить работу всевозможным SIP-сканерам, необходимо в настройках `sip.conf` выставить следующее условие - `alwaysauthreject=yes`. Это будет препятствовать получению информации об использующихся внутренних номерах на вашей IP-АТС.
8. Рекомендуем создавать отдельные маршруты на звонки за рубеж (по сути, международное направление 810). Ставьте ограничения на звонки в таких маршрутах или закрывайте их PIN - кодом, который могут знать только сотрудники вашей организации.
## Какие порты открыть для Asterisk/FreePBX
Расскажем про сетевые порты, которые необходимо открыть на вашем фаерволе для корректного пользовательского доступа и работы оконечных устройств. В разделе указаны дефолтные и порты, и, с точки зрения безопасности, мы рекомендуем их сменить на нестандартные.
### Доступ администратора системы
|Порт|Транспорт (UDP/TCP)|Назначение|Смена порта|Безопасность|Дополнительно|
|:-:|:-:|-|-|-|-|
|22|TCP|Подключение к SSH консоли|Может быть изменен только через Linux CLI|Не рекомендуется оставлять порт открытым в публичную сеть (не вызывающую доверия)|Порт используется для SSH подключения к АТС извне|
|80 `FreePB X` 2001 `PBXact`|TCP|Графический интерфейс по HTTP (не HTTPS)|Можно поменять через графический интерфейс по пути `System Admin` > `Port management`|Не рекомендуется оставлять порт открытым в публичную сеть (не вызывающую доверия)|Используется для пользовательского доступа к WEB-интерфейсу АТС|
|443|TCP|Графический интерфейс по HTTPS|Можно поменять через графический интерфейс по пути `System Admin` > `Port management`|Не рекомендуется оставлять порт открытым в публичную сеть (не вызывающую доверия)|Используется для пользовательского доступа к WEB-интерфейсу АТС. Использует SSL шифрование|
![asterisk_24](img/asterisk_24.png)
## Доступ для SIP/IAX устройств
|Порт|Транспорт (UDP/TCP)|Назначение|Смена порта|Безопасность|Дополнительно|
|:-:|:-:|-|-|-|-|
|5060|UDP|Порт получения телефонной сигнализацией модулем `chan_PJSIP`|Есть возможность изменить порт в рамках графического интерфейса АТС в модуле `SIP Settings`|Не рекомендуется оставлять порт открытым в публичную сеть (не вызывающую доверия)|Стандартный порт для сигнализации модуля `chan_PJSIP`|
|5061||Порт получения защищенной телефонной сигнализации модулем `chan_PJSIP`|Есть возможность изменить порт в рамках графического интерфейса АТС в модуле `SIP Settings`|Не рекомендуется оставлять порт открытым в публичную сеть (не вызывающую доверия)|Защищенный порт для сигнализации модуля `chan_PJSIP`|
|5160|UDP|Порт получения телефонной сигнализацией модулем `chan_SIP`|Есть возможность изменить порт в рамках графического интерфейса АТС в модуле `SIP Settings`|Не рекомендуется оставлять порт открытым в публичную сеть (не вызывающую доверия)|Стандартный порт для сигнализации модуля `chan_SIP`|
|5161||Порт получения защищенной телефонной сигнализации модулем `chan_SIP`|Есть возможность изменить порт в рамках графического интерфейса АТС в модуле `SIP Settings`|Не рекомендуется оставлять порт открытым в публичную сеть (не вызывающую доверия)|Защищенный порт для сигнализации модуля `chan_SIP`|
|10000-20000|UDP|Получение `RTP` потока в рамках SIP сессии|Есть возможность изменить порт в рамках графического интерфейса АТС в модуле `SIP Settings`|Можно открывать диапазон и, зачастую, это является требование SIP-провайдеров (RTP трафик зачастую приходит с различных IP-адресов)|Порты, необходимые для голосовой составляющей телефонного звонка|
|4569|UDP|Работа протокола `IAX`|Есть возможность изменить порт в рамках графического интерфейса АТС в модуле `SIP Settings`|Не рекомендуется оставлять порт открытым в публичную сеть (не вызывающую доверия)|Используется для транкового объединения серверов и оконечных устройств|
## Доступ к UCP (User Control Panel)
|Порт|Транспорт (UDP/TCP)|Назначение|Смена порта|Безопасность|Дополнительно|
|:-:|:-:|-|-|-|-|
|81|TCP|Графический интерфейс `UCP` по `HTTP` (не `HTTPS`)|Порт можно поменять через `FreePBX` в `System Admin` > `Port Management`|Не рекомендуется оставлять порт открытым в публичную сеть (не вызывающую доверия). Для удаленных пользователей используется `HTTPS`|Порт к пользовательской панеле `UCP`|
|4443|TCP|Графический интерфейс `UCP` по `HTTPS`|Порт можно поменять через `FreePBX` в `System Admin` > `Port Management`|Можно оставлять открытым в сеть, так как трафик зашифрован, а так же происходит аутентификация пользователей|Порт доступа к пользовательской панеле `UCP` с помощбю `SSL` шифрования|
|8088|TCP|Порт для `WebRTC` клиентов|Порт можно поменять через FreePBX в `Advanced Settings` > `Asterisk Builtin mini-HTTP` > `HTTP Bind Port`|Не рекомендуется оставлять порт открытым в публичную сеть (не вызывающую доверия). Для удаленных пользователей используется `HTTPS`|Необходим для реализации `WebRTC` звонков через `UCP` (звонок через браузер)|
|8089|TCP|Порт для шифрования `WebRTC` клиентов|Порт можно поменять через `FreePBX` в `Advanced Settings` > `Asterisk Builtin mini-HTTP` > `HTTP Bind Port`|Можно оставлять открытым в сеть, так как трафик зашифрован, а так же происходит аутентификация пользователей|Необходим для реализации `WebRTC` звонков с шифрованием через `UCP` (звонок через браузер)|
|8001|TCP|`Node Server` - получение информации в реальном времени в рамках `UCP`|Порт можно поменять через `FreePBX` в `Advanced Settings` > `UCP NodeJS Server` > `NodeJS Bind Port`|Не рекомендуется оставлять порт открытым в публичную сеть (не вызывающую доверия)|Процесс отвечает за *real-time* активности: всплывающая информация, чаты и прочее|
|8003|TCP|`Node Server` (защищенные подключения)|Порт можно поменять через `FreePBX` в `Advanced Settings` > `UCP NodeJS Server` > `NodeJS Bind Port`|Можно оставлять открытым в сеть, так как трафик зашифрован, а так же происходит аутентификация пользователей|Процесс отвечает за *real-time* активности: всплывающая информация, чаты и прочее|
Остальные порты зависят от ваших конкретных требований: наличие `RMS` ​компонента мониторинга, `Zulu`, функционала провижининга (`EPM`) и прочие.
## FreePBX - обнаружение слабых паролей
Как известно, сильный пароль - это очень важная составляющая безопасности любого актива, к которому, тем или иным образом можно получить доступ. Не даром все *best practices* начинаются с рекомендаций устанавливать сильный, устойчивый к взлому пароль. В данном разделе мы будем говорить о прописных истинах, поэтому её можно считать скорее «дружеским советом» для тех, кто только начинает своё знакомство с FreePBX.
Слабый пароль, неважно где - это большой риск, который нельзя оставлять без внимания и следует немедленно устранить.
### Обзор
Начиная с версии 13 во FreePBX появился модуль `Weak Password Detection` который автоматически детектирует и сообщает о том, что в системе имеется слабый пароль, а также указывает, где именно он обнаружен: на внутреннем номере (`Extension`), транке (`Trunks`), конференц - комнате (`Conferences`) и других модулях.
Чтобы проверить, имеется ли у вас в системе слабый пароль, откройте вкладку `Reports` > `Weak Password Detection`. Вот как должно выглядеть окно данного модуля у всех без исключения (окно нормального человека):
![asterisk_25](img/asterisk_25.png)
Данное сообщение говорит нам о том, что у нас в системе нет слабых паролей. А теперь, давайте-ка немножко похулиганим и создадим пару сущностей с очень слабыми паролями и посмотрим что из этого выйдет.
Наплевав на все *best practices*, создадим внутренний номер `1111` с паролем `1111`:
![asterisk_26](img/asterisk_26.png)
А ещё создадим транк с паролем `000`:
![asterisk_27](img/asterisk_27.png)
А теперь отправляемся в модуль `Weak Password Detection` и перед нами открывается «​окно курильщика​». Вот так не должно быть никогда:
![asterisk_28](img/asterisk_28.png)
Помимо этого, нам будут напоминать о слабых паролях в `Dashboard`'е:
![asterisk_29](img/asterisk_29.png)
Как только Вы настроите внутреннюю нумерацию, линии к провайдерам (транки), пользовательский доступ, не поленитесь, зайдите лишний раз в модуль `Weak Password Detectionи` если там будет уведомление о слабом пароле в системе - незамедлительно смените его! Но помните, что сильный пароль - это не гарантия безопасности, это всего лишь один из уровней, который должен применяться в комплексе с остальными мероприятиями по защите системы.
## Конфигурация Firewall в FreePBX
Рассмотрим модуль, который стал доступен во FreePBX только с версии 13 и который позволяет создать первичную низкоуровневую защиту нашей IP-АТС - Firewall. Нужно отметить, что попытки создать нечто подобное на ранних версиях FreePBX всё-таки были, но все они не увенчались успехом и заставляли пользователей так или иначе идти на компромиссы для сохранения доступности функционала IP-АТС. Модуль Firewall ​был разработан с глубоким пониманием существующих проблем и его основной целью является защита "​средней​", или другими словами, типовой инсталляции при обязательном сохранении VoIP сервисов.
Данный модуль отслеживает и блокирует атаки, пропуская при этом разрешенный трафик, а также непрерывно контролирует конфигурацию системы, автоматически открывая и закрывая порты для необходимых транков.
## Настройка модуля Firewall
Перейдем к настройке. Для того, чтобы попасть в модуль, нужно перейти по следующему пути: `Connectivity` > `Firewall`, откроется следующее окно:
![asterisk_30](img/asterisk_30.png)
Чтобы включить модуль, нажмите кнопку `Enable Firewall`. Обратите внимание, после включения модуля никакие правила еще не задействованы, их нужно настроить.
Первое о чём сообщает модуль, это то, что IP-адрес, под которым мы зашли на IP-АТС не является членом "зоны доверия" (Trusted Zone) и предлагает добавить его для исключения возможных блокировок:
![asterisk_31](img/asterisk_31.png)
Для наибольшего понимания, давайте разберёмся с понятием зоны (Zone), которым оперирует модуль Firewall.
Все сетевые соединения, поступающие на VoIP-сервер ​считаются частью зоны. Каждый сетевой интерфейс и данные, поступающие на него принадлежат к определенной зоне. Стандартные зоны делятся на следующие:
- `Reject` - Все соединения, относящиеся к данной зоне, запрещены. Обратите внимание, что эта зона по-прежнему принимает RTP трафик, но никакие другие порты по умолчанию не прослушиваются. Трафик данной зоны может быть обработан с помощью Responsive Firewall, о котором будет сказано далее.
- `External` - Позволяет только https соединения для доступа к интерфейсу управления и UCP порту, если они определены. Трафик данной зоны может также быть обработан с помощью Responsive Firewall.
- `Other` - Используется на доверенных внешних сетях, или других хорошо известных сетях. По умолчанию, позволяет получить доступ к UCP, а также обеспечивает нефильтрованный SIP и IAX.
- `Internal` - Используется на внутренних локальных сетях, по умолчанию позволяет получить доступ ко всем сервисам IP-АТС.
- `Trusted` - Все сетевые соединения данной зоны разрешены. Пропускается весь трафик от доверенной зоны. Именно сюда нам предложат добавить наш IP-адрес при первом включении модуля.
Итак, чтобы добавить наш IP-адрес в список доверенных, нужно нажать `You can add the host automatically here`.
![asterisk_32](img/asterisk_32.png)
Мы попадаем во вкладку `Preconfigured`. Предлагается два варианта, это добавление адреса хоста и добавление подсети `Add Hostи Add Network` соответственно:
![asterisk_33](img/asterisk_33.png)
Проверить, что адрес (или сеть) добавлены в список доверенных можно во вкладке `Zones` в разделе `Networks`:
![asterisk_34](img/asterisk_34.png)
В модуле `Firewall` ​есть также дополнительный элемент, который отслеживает сигнализационные запросы определенных сервисов и блокирует возможные атаки - `Responsive Firewall`. Такими запросами могут быть запросы протоколов сигнализации SIP или IAX, например, запросы авторизации или вызова. Когда Responsive включен, то любой сигнализационный пакет исходящий от хоста проходит через `Firewall`, если после некоторого количества таких пакетов, хост отправлявший их не прошёл успешную регистрацию, то весь трафик от этого хоста сбрасывается на короткий промежуток времени (60 сек). Если после данной блокировки хост продолжает слать пакеты с запросом регистрации и безуспешно пытается зарегистрироваться, то блокируется уже его IP-адрес на 24 часа. Кроме того, если на сервере настроен `fail2ban`, то система ещё и письмо отправит о данном событии.
Чтобы включить данный функционал, на вкладке `Responsive` ​нужно нажать на кнопку `Enable`:
![asterisk_35](img/asterisk_35.png)
Далее необходимо указать, для каких протоколов должен работать данный функционал:
![asterisk_36](img/asterisk_36.png)
Известные IP-адреса или даже целые подсети, которые проявляли подозрительную активность и которые не должны иметь доступа к IP-АТС можно заблокировать во вкладке `Zones` > `Blacklists`.
![asterisk_37](img/asterisk_37.png)
И последний по счёту, но не по значимости, функционал модуля `Firewall`, о котором хотелось бы рассказать - `Safe Mode`. Данный функционал позволяет получить доступ к IP-АТС если случайно была применена неправильная конфигурация, которая привела к потере доступа, а доступа к консоли у вас нет.
![asterisk_38](img/asterisk_38.png)
При включении модуля `Firewall`, `Safe Mode` уже доступен, но чтобы его активировать, необходимо ​дважды ​перезапустить систему. Сначала необходимо выполнить перезапуск один раз, дождаться, пока сервер полностью загрузится, а затем произвести вторую перезагрузку. После чего, система отложит загрузку правил `Firewall`'а, а вы сможете спокойно убрать ту конфигурацию, из-за которой потеряли доступ.
О том, что система находится в `Safe Mode`, будет говорить огромное уведомление в самом верху страницы, которое исчезнет через пять минут, тогда же запустятся правила `Firewall`:
![asterisk_39](img/asterisk_39.png)
## Настройка SSL в FreePBX
Для управлениями сертификатами SSL в графическом интерфейсе FreePBX создан специальный модуль - `Certificate Management`. Но, перед тем как перейти к его настройке, давайте вспомним, для чего же нужен сертификат и что же такое SSL в Asterisk?
### SSL и FreePBX
Сертификат SSL позволяет вашему FreePBX иметь уникальную цифровую подпись, с помощью которой, каждый раз при обращении к интерфейсу будет создаваться защищенное соединение между web - сервером и клиентским устройством. SSL сертификат включает в себя информацию о его владельце и открытый ключ. Выдачей SSL сертификатов занимается специальный центр сертификации (`Certification authority`), честность которого априори неоспорима.
Помимо этого, сертификат позволяет совершать звонки по защищенному транспортному протоколу TLS и шифровать голосовые потоки через SRTP.
## Генерация CSR
Приступаем к получению сертификата. Центр сертификации попросит вас предоставить сгенерированный CSR файл (Certificate Signing Request). Это является обязательной частью подачи заявления на сертификат, и содержит в себе различные данные об организации, такие как наименование, полное имя домена, код страны и прочие.
Перейдем во вкладку `Admin` > `Certificate Management`. В открывшемся окне модуля нажимаем `+ Generate CSR`. Откроется окно генерации CSR файла:
![asterisk_41](img/asterisk_41.png)
Разберемся поподробнее с каждым из пунктов:
- `Name` - имя для сгенерированного CSR файла. Когда файл будет сгенерирован, он будет иметь название, как указано в этом поле
- `Common Name (Host Name) (CN)`- полное имя домена
- `Organization Name (O)` - полное наименование организации, как указано в учредительных документах
- `Organization Unit (OU)`- наименование подразделения (отдела), на который выписывается данный сертификат
- `Country (C)` - код страны из двух букв. В нашем случае RU.
- `State/Province (ST)` - наименование области или края, в котором вы находитесь. В нашем случае мы оставили это поле пустым
- `City or Locality (L)` - укажите город. Мы указали Moscow
По окончанию настроек нажмите Generate CSR. После того, как CSR файл будет сгенерирован, он станет доступен для скачивания в главном интерфейсе модуля. Для его загрузки, нажмите на кнопку `Download CSR`. Сам файл представляет из себя ключ, заключенный в теги начала и окончания:
```sh
-----BEGIN CERTIFICATE REQUEST-----
MIIC0zCCAbsCAQAwgY0xFDASBgNVBAMTC21lcmlvbmV0LnJ1MRgwFgYDVQQKEw9N
ZXJpb24gTmV0d29ya3MxCzAJBgNVBAsTAklUMQswCQYDVQQGEwJSVTEMMAoGA1UE
CBMDUUxEMQ8wDQYDVQQHEwZNb3Njb3cxIjAgBgkqhkiG9w0BCQEWE2ludmFsaWRA
ZXhhbXBsZS5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDKvJYr==
-----END CERTIFICATE REQUEST-----
```
После этого, вам необходимо написать заявление в центр сертификации и приложить к нему этот файл, после чего вы сможете получить свой SSL сертификат.
### Загрузка сертификата
После того, как мы получили сертификат от сертификационного центра (CA), его необходимо загрузить на сервер. Нажимаем на кнопку `New Certificate` и выбираем `Upload Certificate`:
![asterisk_42](img/asterisk_42.png)
- `Name` - имя для сертификата
- `Description` - описание сертификата. Используется только внутри модуля и не влияет на импорт сертификата.
- `Passphrase` - кодовая фраза, то есть пароль. Необходима для доступа к сертификату и генерации сертификатов на стороне клиента. Если вы не укажете пароль в данном поле, то вам придется указывать его каждый раз, когда потребуется новый сертификат. К тому же, отсутствие пароля приводит к незащищенности приватного ключа сертификата.
- `CSR Reference` - в данном поле выберите сгенерированный CSR файл на предыдущем этапе.
- Поле `Certificate` - откройте файл сертификата, который вам предоставил сертификационный центр и полностью копируйте его в это поле, начиная от тэга `-----BEGIN CERTIFICATE-----` до `-----END CERTIFICATE-----`.
- Поле `Trusted Chain` - порой, центр сертификации (CA), помимо самого сертификата может предоставить вам целый набор файлов. Они называется Trusted Chain, то есть цепочки доверия. Последовательно откройте каждый из файлов и скопируйте их содержимое в это поле.
По окончанию настроек нажмите `Generate Certificate`. По окончанию настроек вы сможете увидеть ваш сертификат в общем списке. В процессе эксплуатации он доступен для редактирования:
![asterisk_43](img/asterisk_43.png)
### Бесплатный сертификат Lets Encrypt
Интерфейс FreePBX имеет встроенную возможность настройки бесплатного SSL сертификата с помощью сертификационного центра `Lets Encrypt`. Чтобы воспользоваться бесплатным сертификатом, у вашего сервера должно быть настроено доменное имя, и его оно должно резолвиться по его IP-адресу.
Помимо этого, следующие хосты должны быть добавлены в разрешенные в настройках фаервола:
1. outbound1.letsencrypt.org
2. outbound2.letsencrypt.org
3. mirror1.freepbx.org
4. mirror2.freepbx.org
## Лучшие практики по защите SSH подключения
`OpenSSH` ​позволяет выполнять удаленное подключение к серверу, производить манипуляции с файлами и управлять системой. Сегодня хотим рассказать про лучшие методы, которые позволяют увеличить безопасность системы на базе `OpenSSH`.
### Конфигурационные файлы
- `/etc/ssh/sshd_config` - файл конфигурации сервера OpenSSH;
- `/etc/ssh/ssh_config` - файл конфигурации клиентской части OpenSSH;
- `~/.ssh/` - директория, в которой хранятся пользовательские SSH настройки;
- `~/.ssh/authorized_keys` или `~/.ssh/authorized_keys` - список ключей (RSA или DSA), которые используются для подключения к пользовательским аккаунтам;
- `/etc/nologin` - если данный файл существует в системе, то `sshd` запретит подключаться всем пользователям кроме root в систему;
- `/etc/hosts.allow` и `/etc/hosts.deny` - система запрета (часть безопасности). Работает по аналогии с `ACL`;
- `SSH порт по умолчанию​` - 22
![asterisk_44](img/asterisk_44.png)
### Не нужен - выключай
Если вашему серверу не требуется удаленное подключение по SSH, то обязательно отключите его. В таких системах как CentOS/RHEL ​делается это так:
```sh
chkconfig sshd off
yum erase openssh-server
```
### Используйте SSH второй версии
Протокол SSH первой версии имеет проблемы с безопасностью, которые закрыты во второй версии. Поэтому, используйте вторую версию. Убедитесь, что в файле `/etc/ssh/sshd_config` указана опция `Protocol 2`.
### Ограничивайте SSH доступ
По умолчанию, все системные пользователи имеют возможность подключаться к системе по SSH. Рекомендуем ограничить SSH доступ в целях безопасности. Например, разрешить SSH для пользователей `root`, `merion` и `networks`:
```sh
AllowUsers root merion networks
```
С другой стороны, вы можете разрешить доступ всем пользователям, кроме указанных:
```sh
DenyUsers root merion networks
```
### Время неактивности
Важно указывать время, в течение которого, не активная сессия будет терминирована (завершена). Это можно сделать следующими опциями:
```sh
ClientAliveInterval 300
ClientAliveCountMax 0
```
В данной настройке мы указали время бездействия равным 300 секунд (5 минут).
### Про файлы `.rhosts`
Дело в том, что данный файл содержит список хостов и пользователей. Если в данном файле содержится комбинация хоста и юзера, то данный пользователь сможет подключиться к системе по SSH без запроса пароля. Рекомендуем отключить эту «замечательную» фичу:
```sh
IgnoreRhosts yes
```
### Никакой аутентификации на базе хоста!
Так называемая `Host-Based Authentication` позволяет пользователю с определенного хоста подключаться к серверу. Отключаем:
```sh
HostbasedAuthentication no
```
### Прямое подключение через root
Не нужно открывать `root`. Максимум, советуем использовать прямое `root` подключение на время проведения работ. Затем отключать. Лучше давать `su` (`sudo`) доступ для некоторых категория пользователей. Закрыть можно вот так:
```sh
PermitRootLogin no
```
### Сделайте баннер
Для каждого подключающегося [​сделайте](https://wiki.merionet.ru/servernye-resheniya/8/nastrojka-ssh-i-motd-bannera-v-centos/) баннер​, в котором можно угрожать злоумышленникам, которые пытаются совершить несанкционированный доступ. За настройку баннера отвечает параметр Banner.
### `22` порт только изнутри!
Сделайте доступ к `22` порту системы только через цепочку фаервол правил. Лучше всего, оставить доступ только изнутри `LAN`. Например, в `Iptables` можно дать доступ для `192.168.11.0/24`:
```sh
-A RH-Firewall-1-INPUT -s 192.168.11.0/24 -m state --state NEW -p tcp --dport 22 -j ACCEPT
```
### Где слушать
По умолчанию SSH слушает подключения на всех доступных интерфейсах. Мы рекомендуем сменить порт по умолчанию и указать IP-адрес, на котором необходимо ожидать подключения. Например, мы укажем порт `962` и IP-адрес `192.168.11.24`:
```sh
Port 962
ListenAddress 192.168.11.24
```
### Запретить пустые пароли
Бывают пользователи без паролей. Их доступ к SSH так же необходимо запретить с помощью опции:
```sh
Port 962
PermitEmptyPasswords no
```
### Анализируйте логи
Установите логирование событий в режим `INFO` ​или `DEBUG` - это позволит иметь расширенный контроль над системой:
```sh
LogLevel INFO
```
## Генератор устойчивых паролей
Для всех паролей, где подсистема генерации не подразумевает создание устойчивого к взлому пароля, мы разработали ​генератор устойчивых паролей​, который по одному клику сделает для вас устойчивый к взлому пароль.
![asterisk_45](img/asterisk_45.png)
Генератор доступен по [ссылке​](https://wiki.merionet.ru/onlajn-generator-ustojchivyx-parolej/). Добавьте его в закладки браузера - при генерации паролей для транков, внутренних номеров, SSH/FTP/WEB или иного доступа, воспользуйтесь им.

View File

@ -0,0 +1,267 @@
# Траблшутинг Asterisk
## Как снять логи с Asterisk с помощью FreePBX?
От проблем и неполадок не застраховано ничто и `IP-АТС Asterisk` - не исключение. Неправильная конфигурация, неудачное обновление, неполадки в сети, сбой у провайдера - всё это может тем или иным образом сказываться на работе Вашей системы IP-телефонии. Для того, чтобы решить эти проблемы или хотя бы найти правильный путь, в сторону которого следует “копать”, нужно собственно, услышать показания “пациента”, то есть - нашего сервера IP-АТС Asterisk. Говоря простым языком - нужно снять логи. А с помощью модуля FreePBX, о котором мы хотим рассказать в данном разделе, сделать это будет еще проще.
Итак, для того чтобы решить проблему нам нужна информация. Но слишком большое количество информации может быть так же бесполезно, как и её отсутствие. В разделе мы покажем, как собрать полезную и краткую информацию.
### Где Asterisk хранит логи?
Чтобы знать что “​лечить​”, нужно знать где искать. Информация, которую мы ищем содержится во множестве лог-файлов, которые хранит сервер.
**Важно​!** Обратите внимание, что в зависимости от используемого дистрибутива Linux, расположение лог-файлов у Вас может быть другим.
|Расположение|Описание|
|-|-|
|`/var/log/asterisk/fail2ban`|Журнал событий модуля `fail2ban`|
|`/var/log/asterisk/freepbx.log`|Журнал событий модулей `FreePBX`|
|`/var/log/asterisk/freepbx_security.log`|Журнал событий безопасности|
|`/var/log/asterisk/full`|Журнал событий `Asterisk` ​каждого уровня. Обычно используется для поиска трассировок старых звонков|
|`/var/log/dmesg`|Журнал событий уровня `​ядра`|
|`/var/log/httpd/access_log`|Журнал событий доступа к `Apache`|
|`/var/log/httpd/error_log`|Журнал ошибок web-сервера `Apache`|
|`/var/log/messages`|Системный журнал событий `Linux`|
|`/var/log/yum.log`|Журнал действий, выполненных через `yum`|
Названия файлов могут быть дополнены информацией о дате, за которую создан файл, указанную после (`.`) или (`-`).
### Фильтрация
Некоторые из этих файлов могут содержать тысячи записей, поэтому, если Вы знаете, какое событие ищете, то отфильтруйте лог по данному событию или хотя бы сократите его, например, оставьте только информацию за определённое время.
Чтобы найти нужную информацию, используйте утилиту grep, которая позволяет искать определённые шаблоны или части слов в большом количестве записей.
```sh
grep 10987 /var/log/asterisk/full
```
В примере выше мы ищем совпадение записей по числам `10987` ​в полном журнале событий Asterisk.
Если Вы хотите попросить помощи на общедоступных площадках, например, на форуме, то рекомендуем удалить или изменить всю приватную/ секретную информацию, которую может содержать лог, такую как номера телефонов, публичные IP-адреса, ваш account ID у провайдера, пароли и т.д.
### Модуль Support FreePBX
В версии 13 и 14 FreePBX, в модуле `System Admin` есть очень полезная секция - `Support`. Для того, чтобы попасть в неё необходимо перейти по следующему пути из дашборда кликнуть на вкладку `Admin` > `System Admin` > `Support` , перед Вами откроются доступные опции данной секции:
![asterisk_46](img/asterisk_46.png)
На этой странице, Вы можете скачать ZIP-файл, который будет содержать отчёт с необходимой системной информацией и логи для дальнейшего исследования или же для отправки в техническую поддержку.
Для включения информации в отчет используйте кнопки `Yes`/`No`. Рассмотрим каждый пункт, который можно включить в отчет:
- `FreePBX Versions` - Список всех установленных модулей и их версии
- `System Information` - Информация об операционной системе
- `Asterisk Logs` - Журналы событий Asterisk за последние 24 часа
- `Firewall Setting` - Вывод текущих настроек ip-tables
- `ASTDB Dump` - Полный дамп ASTBD (Не путать с MySQL)
- `License Information` - Информация о лицензировании и статусе сервера
- `Dialplan` - Полный дайл-план, созданный FreePBX (включая кастомные файлы _custom)
- `SIP Settings` - Настройки SIP (Может содержать секретную информацию)
- `PJSIP Settings` - Настройки PJSIP (Может содержать секретную информацию)
- `IAX Settings` - Настройки IAX (Может содержать секретную информацию)
Как только Вы выбрали какую информацию хотите включить в отчет, нажмите кнопку `Download` ​и сохраните ZIP файл на свой компьютер.
На этой странице, Вы также можете установить ssh, ключи, которые позволят сотрудникам технической поддержки Sangoma подключиться к Вашей системе без необходимости разглашать всякие пароли.
## Время хранения логов в Asterisk
По умолчанию, в дистрибутиве `FreePBX Distro` большинство лог - файлов Asterisk сконфигурированы на хранение в течение семи дней. Зачастую, пользователи жалуются на технические проблемы (недозвон, короткие гудки, обрыв и так далее) спустя недели, а порой и месяцы. Именно по этой причине, в разделе расскажем как настроить хранение лог - файлов на более длительное время и как добавить сжатие для них, чтобы сохранить место на жестких дисках.
### Настройка
За длительность хранения отвечает файл `/etc/logrotate.d/asterisk`. Давайте откроем его редактором `vim` ​и увеличим время хранения по нужным файла до 45 дней:
```sh
[root@asterisk ~]# vim /etc/logrotate.d/asterisk
```
И для файла `/var/log/asterisk/freepbx_dbug` ​меняем параметр `rotate` с 7 на 45:
```sh
/var/log/asterisk/freepbx_dbug {
daily
missingok
rotate 45 //меняем данное значение для увеличения времени хранения в днях;
notifempty
compress //добавляем параметр compress, для активации сжатия;
sharedscripts
create 0640 asterisk asterisk
}
```
**Важно​**: С увеличением времени хранения файлов, увеличивается и его объем, занимаемый на жестких дисках сервера. При добавлении параметра compress в конфигурационную секцию, файл будет сжиматься c помощью утилиты компрессии `gzip`.
Как можно увидеть в нашем примере, для лог - файла `/var/log/asterisk/freepbx_dbug` выставлен параметр `daily` (ежедневно), который регламентирует значение параметра `rotate`. Это означает, что значение 45 будет интерпретировано днями. Если вы хотите указывать значение параметра `rotate` в месяцах, то укажите здесь вместо `daily` `monthly` (ежемесячно).
По завершению настроек сохраните их нажатием `:x!` + `Enter` - изменения вступят в силу.
## Обзор модуля Asterisk Log
Существует встроенный модуль для FreePBX - `Asterisk Logfiles Module`, который позволяет просмотреть самые недавние события.
### Смотрит логи с помощью FreePBX
Модуль можно найти по следующему пути: `Reports` > `Asterisk Logfiles`.
![asterisk_47](img/asterisk_47.png)
Однако, данный модуль мало полезен, если требуется проверить не только недавние логи, но и недельной, а то и месячной давности. Если появилась такая нужда, требуется подключится к вашей АТС по SSH, например, используя терминальный клиент `PuTTy`. Кроме того, если есть физический доступ к серверу, можно использовать и его. Почему проще использовать терминальный клиент? Ответ прост - `PuTTy` поддерживает операции копировать\вставить, что многократно упрощает работу.
### Просмотр логов через консоль
Итак, порядок действий для доступа к логам Астериск:
1. Вход на АТС, используя рутовый логин и пароль. После успешного входа вводится команда `cd /var/log/asterisk`
2. Для вывода списка лог-файлов нужно ввести команду `ls -l`
Обычно, все файлы называются «full-DATE», где `DATE` - дата логирования.
Если требуется посмотреть и отсеять сегодняшний лог-файлы, нужно ввести​ `nano full`. Данная команда откроет лог-файл с помощью текстового редактора `nano`. `Nano` сразу же продемонстрирует список команд для управлением текстовым редактором:
![asterisk_48](img/asterisk_48.png)
Для просмотра можно использовать клавиши `Page Up` и `Page Down`, `CTRL-W` для поиска и `CTRL-X` для выхода. Соответственно, для открытия конкретного файла, нужно написать `nano full-20160629`.
Если вы случайно внесли изменения и пересохранили лог-файл, то Астериск прекратит логирование сегодняшнего дня. Для исправления данной проблемы необходимо запустить следующую команду `amportal restart`. Данная команда будет ждать 120 секунд для завершения текущих вызовов, и по прошествии 120 секунд все вызовы будут принудительно завершены.
Так же возможно использовать команду Linux grep, например для вывода в текущем лог-файле всех событий связанных с недоступным транком - `grep "is now" full`:
- Если результатов слишком много, есть возможность скопировать их в новый файл - `grep "is now" full > newlogfile`
- Для его просмотра можно использовать уже знакомый редактор `nano` - `nano newlogfile`
- Удалить данный файл можно командой - `rm tempfile`
- Так же есть возможность просматривать логи в реальном времени - `asterisk -r`
- Для выхода используется команда - `exit`
- И ещё один способ просмотра лог-файлов в реальном времени - `tail`. Делает это так: `cd /var/log/asterisk tail -f full`
Для выхода нужно нажать `CTRL-C`.
## Проблемы со слышимостью в Asterisk
Одной из распространенных проблем, с которыми сталкивается администратор `IP-АТС Asterisk` является проблема с аудио. Вы можете столкнуться как с односторонней слышимостью, так и с полным отсутствием аудио - потока. Как решить проблему с аудио в Asterisk с помощью FreePBX расскажем в разделе.
### Проблемы с NAT
В подавляющем большинстве случаев проблемы с односторонней слышимостью вызваны настройками `NAT` (**Network Address Translation**). Ниже указаны шаги, выполнение которых поможет вам избавиться от проблем с аудио.
### Динамический DNS
Если ваша компания не оплачивает провайдеру услугу статического IP - адреса, то ваш внешний IP будет периодически меняться. Причиной может быть перезагрузка маршрутизатора или, например, истечение срока аренды адреса по протоколу `DHCP` (**DHCP Lease Time**). Отличной альтернативной будет динамическая DNS запись. Данная запись позволяет серверу DNS периодически обновлять соответствующий доменному имени IP-адрес. Вне зависимости от смены IP вашим провайдером, маршрутизатор будет всегда доступен по его доменному имени. Такие услуги предоставляет такие сервисы как `dyndns`, `no-ip`, `hldns` и другие.
### Настройка NAT В FreePBX
Когда вы приобрели статический IP-адрес или сделали динамическую запись на DNS сервере, переходим к настройке NAT. Перейдите во вкладку `Settings` > `Asterisk SIP settings` > `Chan SIP Settings`:
![asterisk_49](img/asterisk_49.png)
На указанном выше примере, выбрана опция `Static IP`. Здесь, в выделенном красным поле необходимо указать ваш внешний IP-адрес. На примере ниже, указана опция настройки динамического DNS - выбрана кнопка `Dynamic IP`:
![asterisk_50](img/asterisk_50.png)
### Локальные сети
Перейдя во вкладку `General SIP Settings` ​того же раздела, необходимо настроить внутренние сети. Например, `192.168.13.0/255.255.255.0`. Это может быть отдельная сеть, в которой находятся IP-телефоны, или сеть, в которую вынесено все активное сетевое оборудование:
![asterisk_51](img/asterisk_51.png)
Не забывайте по окончанию настроек нажать `Submit` ​и `Apply Config`.
### Настройка RTP портов
Проверьте чтобы на вашем маршрутизаторе не были заблокированы `UDP` порты `5060` (`SIP`) и диапазон портов `10000-20000` (`RTP`). Помимо этого, вы можете сделать проброс этих портов прямо на ваш сервер `IP-АТС Asterisk`. Перепроверьте, что транспортным протоколом является именно `UDP`.
![asterisk_52](img/asterisk_52.png)
### Проблемы с настройкой кодеков
Каждый раз, когда вы совершаете вызов, обе стороны, инициирующая и принимающая вызов согласует ​телефонный кодек​. Например, одна из сторон может инициировать согласование кодека `g.711u`, который может не поддерживаться другой стороной. Это может являться причиной отсутствия аудио в разговоре. Мы рекомендуем всегда включать поддержку кодеков `G.711` `u`-закона и `a`-закона. Настроить телефонные кодеки можно следующими способами:
1. Настройка на конкретном телефонном аппарате
2. В настройка внутреннего номера (`Extension`) в `FreePBX`
Мы рекомендуем​не настраивать кодеки индивидуально на телефонном аппарате. В случае возникновения каких - либо проблем, на этапе ​«траблшутинга» ​вы можете потратить лишнее время просто забыв о данной настройке.
3. На этапе настройки SIP-транка в FreePBX. Разрешенные или запрещенные кодеки
определяются опцией `allow`/`disallow`
4. Глобальная настройка. В разделе `Settings` > `Asterisk SIP Settings` > `"General SIP Settings"`
![asterisk_53](img/asterisk_53.png)
### Проблема с воспроизведением аудио файлов
Если при звонке на голосовое меню (`IVR`) вы не слышите ожидаемую аудио - запись, проверьте, корректно ли был импортирован этот файл через модуль `System Recordings`. Помимо этого проверьте права этого файла. Владельцем этого файла (`owner`) должен быть пользователь `asterisk`. В рамках решения проблемы дайте команду `amportal chown`:
```sh
[root@localhost ~]# amportal chown
Please wait...
!!!!amportal is depreciated. Please use fwconsole!!!!
forwarding all commands to 'fwconsole'
Taking too long? Customize the chown command, See
http://wiki.freepbx.org/display/FOP/FreePBX+Chown+Conf
Setting Permissions...
37034/37034 [============================] 100%
Finished setting permissions
```
## Sngrep: установка и использование
Если кратко, то `sngrep` позволяет отображать потоки SIP-вызова (`sip flow`) прямо в консоли твоего сервера. Утилита покажет SIP-обмен сообщениями в удобной и читаемой форме. Скажем так: `sngrep` это `tcpdump` (или `wireshark` под `Linux`), но только для `VoIP`.
### Установка на CentOS
Рассмотрим быструю установку утилиты на операционной системе CentOS. Первым делом добавим `irontec` ​репозиторий. Для этого, создадим файл с именем `sngrep.repo` в директории `/etc/yum.repos.d`:
```sh
touch /etc/yum.repos.d/sngrep.repo
```
Добавляем в файл следующие строки:
```sh
[irontec]
name=Irontec RPMs repository
baseurl=http://packages.irontec.com/centos/$releasever/$basearch/
```
Затем импортируем публичный ключ от `irontec`:
```sh
rpm --import http://packages.irontec.com/public.key
```
Все готово к установке. Даем следующие команды:
```sh
yum update
yum install sngrep
```
По окончанию установки, в командной строке дайте команду `sngrep`. Теперь давайте разберемся с функционалом и тем как пользоваться утилитой.
### Использование `sngrep`
Как только вы попадете в меню управления утилитой, перед вами будет отражен список VoIP пакетов, которые обрабатывает Ваш сервер:
![asterisk_54](img/asterisk_54.png)
Нажав на `Enter` ​вы сможете более детально изучить каждое сообщение. Нажав `F5`, вы сможете удалить текущие сообщения. Для передвижения между сообщениями используйте стрелки на клавиатуре.
![asterisk_55](img/asterisk_55.png)
При детализации звонка, можно нажать `F2`/`F3` ​для получения `SDP`/`RTP` ​информации. Для выхода и возврата в предыдущее меню нажмите `Esc`. Если кратко, следующие опции доступны в базовом интерфейса `sngrep`:
- `F1` - открыть функциональный помощник;
- `F2` - сохранить собранный дамп в указанный файл;
- `F3` - отфильтровать данные по указанной строке;
- `F4` - показать выбранный расширенный `call-flow` (схема звонка, с указанием всех этапов его инициации);
- `F5` - удалить собранный дамп;
- `F6` - показать выбранный дамп в текстовом формате (без визуализации стрелочками, только сухие SIP-сообщения);
- `F7` - показать опции фильтрации (фильтровать можно по полю `From`/`To`, по источнику и назначению звонка, а так же по различным данным из информационного сегмента поля полезной нагрузки, то есть не из заголовка). Помимо прочего, есть возможность отмечать типы сообщения, такие как `REGISTER`, `INVITE`, `OPTIONS` и прочие;
- `F8` - показать настройки, среди который подсветка синтаксиса, фон и прочие;
- `F10` - настройка отображаемых параметров (такие как `From`/`To`, индекс, метод и прочие);
- `Esc` - выйти из sngrep/в предыдущее меню;
- `Enter` - посмотреть `call-flow` выбранного пакета;
- `Space` (пробел) - выделить нужный сегмент;
- `i`/`I`- фильтрация только по сообщения типа `INVITE`;
- `p` - поставить на паузу сбор пакетов;

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 134 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 41 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 646 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 567 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 284 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 74 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 195 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 120 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 69 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 638 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 907 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 215 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 404 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 142 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 130 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 92 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 164 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 90 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 351 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 497 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 497 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 537 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 387 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 364 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 382 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 232 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 481 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 351 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 154 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 411 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 172 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 246 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 110 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 324 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 798 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 754 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 158 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 174 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 172 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 105 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 276 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 644 KiB