Asterisk autoprovision Yealink ч.1

Задача, настроить на сервер Asterisk, autoprovision для телефонов Yealink в моем случае это будет модель T23G.
Перво на перво нам понадобятся знания о том что из себя представляет конфигурационный файлы, для этого обратимся к официальной источниками и данным:
Ссылка на офф.сайт
— Конфигурационные файлы с официального сервера или не с официального
— Инструкция с официального сайта.

Файл с название Common.cfg содержит общие настройки для всех телефонных аппаратом, например такие как Часовой пояс, NTP сервер, и прочее.
Файл с названием MAC.cfg содержит настройки для каждого отдельно взятого телефонного аппарата. Вместо MAC — вписывается mac адрес телефонного аппарат. В данном файле содержатся такие настройки как: логин, пароль, номер линии и прочее.

Autoprovision для данного вендера работает на различных протоколах передачи данных (таких как HTTP, FTP, HTTPS), мы будем использовать TFTP. Для начала нам потребуется установить TFTP сервер. Устанавливать будем на ту же машину на которой у нас крутится сервер Asterisk, под управлением Ubuntu 14.04. Установка:

sudo apt-get install openbsd-inetd tftpd tftp

После этого уже можно использовать TFTP сервер, но лучше проверить файл.

sudo nano /etc/inetd.conf

В этом файле найдем строку вида.

tftp        dgram   udp wait    nobody  /usr/sbin/tcpd  /usr/sbin/in.tftpd /srv/tftp

Тут указано, что файлы для загрузки будут находится в директории /srv/tftp, если вас это не устраивает, измените последний параметр.
Так же следует на папку, где будут лежать файлы изменить права доступа

udo chown -R nobody /srv/tftp

Перезапустим службу inetd

sudo /etc/init.d/openbsd-inetd restart

Проверим работу TFTP сервера. Для начала установим TFTP клиент, чтобы можно было подключаться к TFTP северу. Для установки TFTP клиента выполните в терминале команду:

sudo apt-get install tftp

Теперь создадим на сервере в директории /srv/tftp какой-нибудь файл, например, myfile. Для создания файла myfile и записи в него текста «This is my file» выполните в терминале команду:

echo This is my file > /srv/tftp/myfile

Теперь мы можем запустить TFTP клиент командой tftp. Команда tftp принимает в качестве параметра IP адрес сервера. Если вы запускаете клиент на локальном компьютере, то укажите IP адрес 127.0.0.1, если же на удаленном компьютере, то укажите IP адрес сервера.

tftp 127.0.0.1

Когда клиент запустится, вы попадете в режим ввода команд для клиента TFTP. Выполните команду get myfile, которая означает получить файл с именем myfile с сервера.

tftp> get myfile

В случае, если вы все сделали правильно, файл myfile загрузится с TFTP сервера. Для выхода из TFTP клиента введите команду quit.

Так же для Autoprovision требуется DHCP сервер с включенной опцией 66 и внесенным в неё параметром адреса TFTP сервера.

TFTP сервер установлен, DHCP настроен, теперь можно заняться Autoprovision.
Переименуем файл Common.cfg в y000000000044.cfg, загрузим его на сервер в директорию /srv/tftp/ и внесем изменения.

sudo nano y000000000044.cfg

Укажем адрес сервера Auto provision (tftp)

auto_provision.server.url = 192.168.120.200

Больше пока ни чего не надо.

Переименуем файл MAC.cfg в мак адрес вашего телефонного аппарата 001565abcdef.cfg, загрузим его на сервер в директорию /srv/tftp/ и внесем изменения.

sudo nano 001565abcdef.cfg

Параметр указывает отключаем или включаем учетную запись, в нашем случае включаем.

account.1.enable = 1

Указывает имя отображаемое на дисплее

account.1.auth_name = 4201

Указывает имя авторизации (login)

account.1.user_name = 4201

Указывает пароль пользователя

account.1.password = pass4201

Указываем адрес SIP сервера

account.1.sip_server.1.address = 192.168.120.200

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

Ссылка 1

Ubuntu и как установить средства интеграции с Hyper-V 2012

Доброго дня.

Сегодня разберем вопрос интеграции служб Hyper-V на виртуальную машину Ubuntu 14.04.
Перво на перво обновим нашу информацию об установленных пакетах.

sudo apt-get update

После обновим сами пакеты

sudo apt-get upgrade

Установим отдельно обновления безопасности

sudo unattended-upgrade
sudo apt-get install unattended-upgrades

Перезагрузим ОС

sudo reboot

В нашем случае для установки пакетов интеграции Hyper-V требуется ядро не ниже 3.16, проверяем:

uname -r
3.13.0-77-generic

Данное ядро нам не подходит, попробуем обновить:

sudo apt-get install --install-recommends linux-generic-lts-vivid

После, обновим загрузчик GRUB

sudo update-grub

Перезапустим нашу систему

sudo reboot

После запуска снова проверяем версию ядра

uname -r
3.19.0-49-generic

То что нужно. Запомним эти данные и продолжим.
Найдем пакеты соответствующий нашему ядру и начнем их установку:

sudo aptitude install hv-kvp-daemon-init linux-tools-3.19.0-49-generic
sudo aptitude install linux-cloud-tools-3.19.0.49-generic

Перезагружаем

sudo reboot

После запуска системы нужно проверить корректно ли запустились службы интеграции Hyper-V

cat /var/log/boot.log | grep Hyper
* Starting Hyper-V VSS Protocol Daemon  [ OK ]
* Starting Hyper-V KVP Protocol Daemon  [ OK ]
* Stopping Hyper-V VSS Protocol Daemon  [ OK ]
* Stopping Hyper-V KVP Protocol Daemon  [ OK ]

Убеждаемся в том, что дополнительно установленные сервисы, в частности VSS, запущены:

ps -ef | egrep "hv.*daemon"
root  1323  1  0 20:23 ?   00:00:00 /usr/lib/linux-tools/3.13.0-27-generic/hv_vss_daemon
root  1341  1  0 20:23 ?   00:00:04 /usr/lib/linux-tools/3.13.0-27-generic/hv_kvp_daemon

Статьи:
Ссылка 1

Ironport C170 блокируем архив с исполняемым файлом

Доброго дня.

Требуется оградить пользователей от разного рода вирусов в почтовых сообщениях. Часто пользователи запускают вирус получая его в почту в виде архива.
И так, имеется железка CISCO Ironport C170. Заходим в Mail Policies — Incoming Content Filters — Add Filter….
Новому фильтру Выставляем имя новому фильтру.
Добавляем условие по которому мы будем проверять сообщения — Add Conditions …
В условии выставляем, что мы будем выбирать письма которые содержат прикрепленные данные в виде архива File type is — Compressed
132408022016
Теперь требуется предпринять какие-то действия с этим письмом, для этого добавляем Add Action …
В разделе Strip Attachment by File Info в пункте File type is: выставляем Executables
132808022016
Так же в пункт Replacement Message можно добавить от себя сообщение для пользователя о том, что содержимое было заблокировано.

Exchange восстановление удаленного письма

Для того чтобы востановить письма, нужно находиться в Группе управлением обнаружением (Discovery Management). Введем команду

Add-RoleGroupMember -Identity "Discovery Management" -Member User1

Перезапускам EMS
Восстанавливаем удаленные письма, в том числе и удаленные из папки «удаленные»

Search-Mailbox "исходный ящик" -TargetMailbox целевой ящик -TargetFolder RECOVER

Исходный ящик» это тот, из которого письма удалили, целевой — тот, в который они будут восстановлены. Соответственно, всё что будет восстановлено, появится в целевом ящике в папке RECOVER. Указывать один и тот же ящик в роли исходного и целевого нельзя.
Если надо восстанавливать на все письма, а письма только с определённой темой, то синтаксис может быть таким:

Search-Mailbox "Исходный ящик" -SearchQuery subject:"Тема письма" -TargetMailbox Целевой ящик -TargetFolder Соответствующая папка

Есть один момент, когда у вас Русский Exchange то при указании параметров на английском, выходит ошибка. Покажу на примере

[PS] C:\Windows\system32>Search-Mailbox ivanov -SearchQuery "from:sidorov@gmail.com" -TargetMailbox petrov -TargetFolder RECOVER
Ключевое слово property не поддерживается.
    + CategoryInfo          : InvalidArgument: (:) [], ParserException
    + FullyQualifiedErrorId : 73EC546F

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

[PS] C:\Windows\system32>Search-Mailbox ivanov -SearchQuery "Откого:sidorov@gmail.com" -TargetMailbox petrov -TargetFolder RECOVER

Ссылка 1

NTP

По сути когда у вас домен, время должно распространятся от корневого контролера — вниз до обычных хостов.
Корневой PDC может синхронизировать свое время как со внешним источником, так и с самим собой, последнее задано конфигурацией по умолчанию и является абсурдом, о чем периодически намекают ошибки в системном журнале.
Синхронизация клиентов корневого PDC может осуществятся как с его внутренних часов, так и с внешнего источника. В первом случае сервер времени корневого PDC объявляет себя как «надежный» (reliable).

Конфигурация NTP-сервера на корневом PDC
Конфигурирование сервера времени (NTP-сервера) может осуществляться как с помощью утилиты командной строки w32tm, так и через реестр. Где возможно, я приведу оба варианта.
Открываем ветку реестра:

HKLM\System\CurrentControlSet\services\W32Time\Parameters

Здесь в первую очередь нас интересует параметр Type, который задает тип синхронизации. Он может принимать следующие значения:
NoSync— Служба времени не синхронизируется с другими источниками.
NTP— Служба времени выполняет синхронизацию с серверами, указанными в записи реестра NtpServer.
NT5DS— Служба времени выполняет синхронизацию на основе иерархии домена.
AllSync— Служба времени использует все доступные механизмы синхронизации.

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\Parameters]
"Type"="NTP"
w32tm /config /syncfromflags:manual

В параметре NtpServer указываются NTP-сервера, с которыми будет синхронизировать время данный сервер. По умолчанию в этом параметре прописан NTP-сервер Microsoft (time.windows.com, 0?1), при необходимости можно добавить еще несколько NTP-серверов, введя их DNS имена или IP адреса через пробел. В конце каждого имени можно добавлять флаг (напр. ,0?1) который определяет режим для синхронизации с сервером времени.

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\Parameters]
"NtpServer"="server1,0x8 server2,0x8"
w32tm /config /manualpeerlist:"server1,0x8 server2,0x8"

Допускаются следующие значения режима:
0?1 – SpecialInterval, использование временного интервала опроса;
0?2 – режим UseAsFallbackOnly;
0?4 – SymmetricActive, симметричный активный режим;
0?8 – Client, отправка запроса в клиентском режиме.

Объявление NTP-сервера в качестве надежного

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\Config]
"AnnounceFlags"=dword:0000000a
w32tm /config /reliable:yes

Включение NTP-сервера

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\TimeProviders\NtpServer]
"Enabled"=dword:00000001

Задание интервала синхронизации с внешним источником
Время в секундах между опросами источника синхронизации, по умолчанию 900с = 15мин. Работает только для источников, помеченных флагом 0?1.

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\TimeProviders\NtpClient]
"SpecialPollInterval"=dword:00000384

Установка минимальной положительной и отрицательной коррекции
Максимальная положительная и отрицательная коррекция времени (разница между внутренними часами и источником синхронизации) в секундах, при превышении которой синхронизация не происходит. Рекомендую значение 0xFFFFFFFF, при котором коррекция сможет производиться всегда.

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\Config]
"MaxPosPhaseCorrection"=dword:FFFFFFFF
"MaxNegPhaseCorrection"=dword:FFFFFFFF

После настройки необходимо обновить конфигурацию сервиса. Сделать это можно командой

w32tm /config /update.

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

w32tm /monitor /computers:time.nist.gov

можно заставить компьютер синхронизироваться с используемым им сервером времени.

w32tm /resync

показывает разницу во времени между текущим и удаленным компьютером. Команда w32tm /stripchart /computer:time.nist.gov /samples:5 /dataonly произведет 5 сравнений с указанным источником и выдаст результат в текстовом виде.

w32tm /stripchart

основная команда, используемая для настройки службы NTP. С ее помощью можно задать список используемых серверов времени, тип синхронизации и многое другое. Например, переопределить значения по умолчанию и настроить синхронизацию времени с внешним источником, можно командой w32tm /config /syncfromflags:manual /manualpeerlist:time.nist.gov /update

w32tm /config

показывает текущие настройки службы. Например команда w32tm /query /source покажет текущий источник времени, а w32tm /query /configuration выведет все параметры службы.

w32tm /query

net stop w32time — останавливает службу времени, если запущена.
w32tm /unregister — удаляет службу времени с компьютера.
w32tm /register – регистрирует службу времени на компьютере. При этом создается заново вся ветка параметров в реестре.
net start w32time — запускает службу.

Особенности виртуализированных контроллеров домена

Контроллеры домена, работающие в виртуализированной среде, требуют к себе особенного отношения.
Средства синхронизации времени виртуальной машины и хостовой ОС должны быть выключены. Во всех адекватных системах виртуализации (Microsoft, vmWare и т. д.) присутствуют компоненты интеграции гостевой ОС с хостовой, которые значительно повышают производительность и управляемость гостевой системой. Среди этих компонентов всегда есть средство синхронизации времени гостевой ОС с хостовой, которое очень полезно для рядовых машин, но противопоказано для контроллеров домена. Потому как в этом случае весьма вероятен цикл, при котором контроллер домена и хостовая ОС будут синхронизировать друг друга. Последствия печальны.
Для корневого PDC синхронизация с внешним источником должна быть настроена всегда. В виртуальной среде часы не настолько точны как в физической, потому как виртуальная машина работает с виртуальным процессором и прерываниями, для которых характерно как замедление, так и ускорение относительно «обычной» частоты. Если не настроить синхронизацию виртуализированного корневого PDC с внешним источником, время на всех компьютерах предприятия может убегать/отставать на пару часов в сутки. Не трудно представить неприятности, которые может принести такое поведение.

Источник1,Источник 2

Exchange, каждому своя адресная книга.

Бывает что в одном домене несколько организаций. И все пользуются едиными сервером Exchange, но с разными доменами получателей. И как сделать так, чтобы одина организация не видела почтовые адреса другой организации в своей адресной книге?.

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

И так есть сервер. На котором много доменов. И из адресной книги одной организации нам нужно исключить несколько доменов. Запускаем EMS и вводим такую простую команду:

Get-AddressList  -Identity BookOrg1 | Set-AddressList -RecipientFilter {((((-not(EmailAddresses -like '*excample1.com')) -and (-not(EmailAddresses -like '*excample2.com')) -and (-not(EmailAddresses -like '*excample3.com')))) -and (Alias -ne$null))}

В данном примере мы взяли существующую книгу адресов и добавили в нее правило, которое исключает из данной книги все адреса в которых присутствуют указанные три домена.
Еще пример. Предположим мы завели контакты (contact) в AD (не через Exchange). И теперь хотим их отобразить в отдельной адресной книге (группе). Для понимания предстоящего решения прочтем
https://technet.microsoft.com/ru-ru/library/cc164375(v=exchg.141).aspx,тут и тут.
Т.к. контакты «не родные» для Exchange они их отображать не будет. Потребуется написать фильтр отбора данных. Для этого определимся по какому критерию мы будем делать выборку данных. В своем случае я взял имя компании. В каждом контакте в разделе Company я заполнил одну и туже информацию «Называние компании». И попытался по этому атрибуту получить список.

New-AddressList -Name BookOrg2 -RecipientFilter {(Company -like 'Называние компании')}

Еще пример, укажем контейнер где должны браться данные

>New-AddressList -Name BookOrg2 -RecipientContainer "domain.local/Accounts/Users/Отдел"

Решение проблем с Outlook Address Book

Не забываем обновить данные в Exchange

Update-AddressList BookOrg2

pfSense блокирование социальных сетей и других сайтов

Требуется ограничить доступ сотрудников к опеределенным интернет ресурсам, социальных сетей и прочее. Для решения данной задачи будем использовать такую технологию как Layer 7, на сколько мне известно, данная технология считываем первые 2 килобайта в пакете, в котором ищет указаное вхождение. Если найдено, то выполняются указанные действия.
Заходим через SSH на pfSense. Переходим в деррикторию

cd /usr/local/share/protocols/

В данном каталоге находятся паттерны, через которые идет отлов пакетов. Но нас интересует социальные сети, для них паттера нет — решаем. Для начала создадим файл с раширением .pat в который буде записано правило.

ee antisocial.pat

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

# Protocol name
antisocial
# Pattern
^.+(vk.com|vkontakte|odnoklassniki|odnoklasniki|facebook).*$

Сохраняем.
Переходим к web-интерфейсу pfsense. В раздел Firewall: Traffic Shaper: Layer7. В данном разделе создаем новое правило Create new l7 rules group. Если в предыдущих пунктах все было сделано правильно, то в списке протоколов появится новый пункт antisocial.
120520150804
Теперь требуется применить это ограничение к группе адресов. В разделе правил маршрутизации создаем правило. И в пункте Layer7 выбираем наше ограничение.
120520150814
Применяем новое правило. И проверяем.

Пользователи у нас хитрые. И пытаються использовать такую богомерзкую программу как TOR, но и на это у pfsense есть достойный ответ.
Для этого установим такой инструмент как pfBlocker. После установки, находим его в разделе Firewall.
Делаем настройки как на рисунке. В разделе Inbound Interface(s) выставляем WAN интерфейс, в разделе Outbound Interface(s) указываем LAN.
Под каждым интерфейсом выставляем параметр Block
22092015

Далее в разделе Lists, указываем URL откуда будем брать списки TOR серверов, я использую для этого эту http://list.iblocklist.com/?list=tor ссылку. Вставляем ее в указаное поле, выставляем обновлять список каждый час. Сохраняем.155022092015

Все, после этого у меня ТОР перестал работать.

Asterisk, отправка факса на email

Перерыл кучу интернета, дабы добраться до истины, но ни где не нашел достойного и подробного описания с объяснением до момента «взлетела». Попробую исправить это упущение.
И так, у нас есть Ubuntu 14.04.1, Asterisk 12. Требуется настроить его на принятие факсов. Не будем использовать решение от Digium, а будем использовать spandsp в ходящее в поставку Asterisk. Но т.к. мы собирали Asterisk сами, то данный модуль у нас отсутствует. Скачаем его и пересоберем Asterisk по новой.
Скачиваем пакет spandsp

wget http://soft-switch.org/downloads/spandsp/spandsp-0.0.6.tar.gz

Разархивируем его

tar -xzvf spandsp-0.0.6.tar.gz

Для работы нам понадобиться библиотека libtiff , установим ее. Сначала пропишем новый репозиторий и обновим

echo 'deb http://cz.archive.ubuntu.com/ubuntu saucy main universe' >> /etc/apt/sources.list.d/extra.list
apt-get update

Теперь установим библиотеку

apt-get install libtiff4 libtiff4-dev

Библиотека установлена, теперь перейдем не посредственно к установке spandsp. Переходим в каталог с spandsp и собираем его.

cd spandsp-0.0.6
./configure --prefix=/usr/local
make
make install

Далее нужно указать пути библиотек для системы, вносим некоторые изменения

/etc/ld.so.conf.d/spandsp.conf << EOF
/usr/local
/usr/local/lib
EOF

Собираем Asterisk с поддержкой spandsp модуля. Обратимся к статье Установка Asterisk. Для начала выполним очистку

make distclean

По новой проверим все

./configure

Перейдем не посредственно к меню добавления модулей

make menuselect

В разделе Resource Modules необходимо убедится что выбрано два модуля. res_fax и res_fax_spandsp
Сохраняем конфигурацию и пересобираем Asterisk по новой

make
make install

После запускаем новый Asterisk

service asterisk start

Заходим в консоль

asterisk -rvv

И проверяем подключены ли модули

fax show capabilities

В нормальном случае должно выглядеть так

Registered FAX Technology Modules:

Type : Spandsp
Description : Spandsp FAX Driver
Capabilities : SEND RECEIVE T.38 G.711 GATEWAY

1 registered modules

Проверим еще вот таким образом какие модули у нас загружены

module show like fax

В нормальном случае должно выглядеть так

Module                         Description                              Use Count  Status
res_fax.so                     Generic FAX Applications                 1          Running
res_fax_spandsp.so             Spandsp G.711 and T.38 FAX Technologies  0          Running
2 modules loaded

Если чуда не произошло то пытаемся перезапустить и загрузить данные модули

CLI> module reload res_fax.so
CLI> modeule load res_fax_spandsp.so

Если Asterisk выдал ошибку

Error loading module 'res_fax_psandsp.so' : libspandsp.so.2 cannot open shared object file: No such file or directory

То выходим из консоли Asterisk и вводим следующую команду

 ln /usr/local/lib/libspandsp.so.2.0.0  /lib/libspandsp.so.2

Модули подключили, а как же принять факс, и сохранить его в файл на сервере? Для этого отредактируем файл конфигурации диалплана в разделе [incoming_calls]

[incoming_calls]
exten => _X.,1,Verbose(1,Получен звонок с внешней линии 2)
exten => _X.,n,answer()
exten => _X.,n,ReceiveFAX(/home/user/fax/rr.tif,f)

Перезапустим диалплан.

sudo asterisk -rcvv
Asterisk*CLI> dialplan reload

Пробуем отправить факс. Проверяем наличие файла в указанной директории. Идем дальше. Теперь требуется отправить данный файл на email.
Для начала установим пакет говорящий сам за себя sendemail

sudo apt-get install sendemail

Попробуем тестово отправить наше сообщение из консоли по smtp протоколу через какой нибудь сервер. Для этого нужно чтобы уже на этом сервере у нас была заведена учетная запись и пароль. В моем случае я назвал учетку fax

sendemail -f sender@local.host -t dest@example.com -u test -m "test test" -s mail.example.com:25 -o tls=auto -xu fax -xp p@s$w0rd -a "/home/user/fax/rr.tif"

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

[general]

[globals]

[default]

[incoming_calls]
exten => _X.,1,Verbose(1,Получен звонок с внешней линии 2)
exten => _X.,n,Goto(fax-rx,receive,1)    ;переводим вызов на "процедуру" принятия факса

[outgoing_calls]
exten => _X.,1,Verbose(Совершается исходящий вызов)
exten => _X.,n,answer()
exten => _X.,n,Dial(SIP/Operator_SIP/${EXTEN})

[phones]
include => outgoing_calls

[fax-rx]
exten => receive,1,NoOP(------------------- FAX from ${CALLERID(number)} ------------------)
 same => n,Answer()     ;подымаем трубку
 same => n,Set(DT=${TIMESTAMP}-${CALLERIDNUM}-${UNIQUEID})      ;загоняем в переменную время номер звонящего и еще какую то херь
 same => n,Set(FAXOPT(headerinfo)=Received by ${CALLERID(number)} ${STRFTIME(${EPOCH},,%Y-%m-%d %H-%M)})
; same => n,Set(FAXOPT(localstationid)=Name)
; same => n,Set(FAXOPT(maxrate)=14400)
; same => n,Set(FAXOPT(minrate)=2400)
 same => n,NoOp(FAXOPT(ecm) : ${FAXOPT(ecm)})
 same => n,NoOp(FAXOPT(headerinfo) : ${FAXOPT(headerinfo)})
 same => n,NoOp(FAXOPT(localstationid) : ${FAXOPT(localstationid)})
 same => n,NoOp(FAXOPT(maxrate) : ${FAXOPT(maxrate)})
 same => n,NoOp(FAXOPT(minrate) : ${FAXOPT(minrate)})
 same => n,NoOp(**** RECEIVING FAX : ${DT} ****)
 same => n,ReceiveFAX(/home/user/fax/${FAXOPT(headerinfo)}.tif,f)
 same => n,System(sendemail -f sender@local.host -t dest@example.com -u test -m "test test" -s mail.example.com:25 -o tls=auto -xu fax -xp p@s$w0rd -a "/home/severin/fax/${FAXOPT(headerinfo)}.tif")
 same => n,HangUp()

Сохраняем. Перезапускаем диалплан.

sudo asterisk -rcvv
Asterisk*CLI> dialplan reload

Проверяем работспособность.

Ссылки на статьи которые я использовал:
Ссылка 1
Ссылка 2
Ссылка 3
Ссылка 4

Asterisk, совершаем первый вызов на городскую линию.

И так, Asterisk у нас работает на входящие звонки, но не работает на исходящие. Надо решать.
Для того чтобы совершать и принимать звонки (да, то что мы описывали в предыдущей статье в разделе [default] тоже работает, но после внесения изменений описанных здесь, потребность и возможность в использовании этого раздела для приема звонков отпадет) добавим конфигурацию для нашего оператора.
Т.к. у нас оператор связи работает по SIP протоколу, обратимся для редактирования к файлу sip.conf

 sudo nano /etc/asterisk/sip.conf

И внесем данные об операторе

[Operator_SIP]
type=peer               ;указываем что при получении INVITE(вызов) будем сравнивать не имя поставщика сервисов а его IP адрес
host=sipprovaider.ru    ;указываем от кого мы должны получать/отправлять INVITE
fromuser=8800000        ;имя пользователя для аутентификации
defaultuser= 8800000
secret=p@ssword$
context=incoming_calls  ;задаем контекст, на него же будем принимать звонки
dtmfmode=rfc2833        ;метод генерации тонального DTFM-кода
disallow=all            ;запрещаем все кодеки
allow=gsm               ;разрешаем кодек GSM
allow=ulaw              ;разрешаем кодек
insecure=invite         ;

Далее нам требуется отредактировать диалплан.

 sudo nano /etc/asterisk/extensions.conf

Отредактируем его до такого вида

[general]

[globals]

[default]

[incoming_calls]
exten => _X.,1,Verbose(Получен вызов с внешней линии)
exten => _X.,n,Dial(SIP/100)

Как видно в контекст

[incoming_calls]

который мы описали в sip.conf поступает звонок и мы его сразу переводим на номер 100.
Перезапустим в Asterisk конфигурационные файлы.

sudo asterisk -rcvv
AsteriskGARS*CLI> dialplan reload
AsteriskGARS*CLI> sip reload

И попробуем совершить звонок с городского номера на телефонный аппарат.
Теперь требуется совершить звонок с внутреннего номера на городской. Для этого снова отредактируем файл диалплана

 sudo nano /etc/asterisk/extensions.conf

Следующим образом. Создадим раздел [outgoing_calls].

[outgoing_calls]
exten => _X.,1,Verbose(Совершается исходящий вызов)
exten => _X.,n,Dial(SIP/Operator_SIP/${EXTEN})

${EXTEN} — переменная которая содержит набранный вами номер.
Еще один важный момент, т.к. у нас телефонный аппарат находится в контексте phones, а метод вызова находится в контексте outgoing_calls, то они между собой не связаны, для того чтобы связать между собой эти два контекста воспользуемся выражением include. Добавим в фаил extensions.conf вот такие строки

[phones]
include => outgoing_calls

Сохраняем пере запускаем конфиги и пробуем дозвониться на городские линии.

sudo asterisk -rcvv
AsteriskGARS*CLI> dialplan reload

Все должно работать.

Принимаем первый внешний звонок на внутренний номер.

И так, телефон подключен к Asterisk, а Asterisk подключен к оператору связи, теперь как бы дозвониться нам до абонента 100, с внешнего мира? Нужен Dialplan. В данном случае, мы на прямую пробросим наш городской номер на телефонный аппарат.Переименуем дефолтный файл диалплана extensions.conf

 sudo mv /etc/asterisk/extensions.conf /etc/asterisk/extensions.conf.backup

Создадим новый файл extensions.conf.

sudo nano /etc/asterisk/extensions.conf

Диалплан состоит из контекстов (это очень важно), кто знаком с программированием, то это сравнимо с процедурами. По умолчанию всегда имеются три контекста [general] [globals] и [default](не указывается явно).
Для решения наших целей нам нужен контекст default, добавим в него такие действия. Поступает звонок, АТС беред трубку, проигрывает звуковой файл, кладет трубку:

[general]

[globals]

[default]
exten => _X.,1,Verbose(1,Получен звонок с внешней линии)        ;передаем произвольный текст в детальный вывод
exten => _X.,n,Answer()                                         ;поднимаем трубку
exten => _X.,n,Playback(hello-world)                            ;проигрываем звуковой файл
exten => _X.,n,Hangup()                                         ;ложим трубку

Сохраняем, перезапустим диалплан и проверим.

sudo asterisk -rcvv
dialplan reload

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

Проверили, послушали приветствие, убедились что звонки с внешних линий к нам проходят. Теперь усложним: будем сразу поступающие звонки перенаправлять на внутренний номер 100. Для этого воспользуемся приложением Dial. Данное приложение пытается соединить каналы. Правим наш диалпан, заменим строчку в которой идет проигрыш звукового сигнала, на Dial.

[general]

[globals]

[default]
exten => _X.,1,Verbose(1,Получен звонок с внешней линии)        ;передаем произвольный текст в детальный вывод
exten => _X.,n,Answer()                                         ;поднимаем трубку
exten => _X.,n,Dial(SIP/100)                                    ;переводим вызов на абонента 100
exten => _X.,n,Hangup()                                         ;ложим трубку

Сохраняем, перезапустим диалплан и проверим.

sudo asterisk -rcvv
dialplan reload

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