This shows you the differences between two versions of the page.
|
communigate_pro_2020 [2021/06/08 07:37] admin created |
communigate_pro_2020 [2026/06/25 08:44] (current) val |
||
|---|---|---|---|
| Line 1: | Line 1: | ||
| - | ====== Communigate Pro 2020 ====== | + | ====== Communigate Pro 2025 ====== |
| * [[https://www.communigate.ru/|Официальный сайт]] | * [[https://www.communigate.ru/|Официальный сайт]] | ||
| * [[https://www.communigate.ru/CommuniGatePro/russian/|Документация к платформе CommuniGate Pro и руководство Администратора]] | * [[https://www.communigate.ru/CommuniGatePro/russian/|Документация к платформе CommuniGate Pro и руководство Администратора]] | ||
| * [[http://wiki.rsu.edu.ru/wiki/Communigate_Pro|Полнофункциональная система унифицированных коммуникаций (почта+телефония+IM) с защитой от вирусов, спама и нежелательного контента, с возможностью обучения фильтра пользователями]] | * [[http://wiki.rsu.edu.ru/wiki/Communigate_Pro|Полнофункциональная система унифицированных коммуникаций (почта+телефония+IM) с защитой от вирусов, спама и нежелательного контента, с возможностью обучения фильтра пользователями]] | ||
| + | * Разобраться: в чем особенности The 4th Version Mailbox (.mb4) Format | ||
| ===== Модуль 1. Установка, интерфейс администрирования и запуск CGP ===== | ===== Модуль 1. Установка, интерфейс администрирования и запуск CGP ===== | ||
| + | * [[https://youtu.be/8gEMcyh1OkA|Communigate - импортзамещение по настоящему]] | ||
| ===== Теория ===== | ===== Теория ===== | ||
| * [[https://ru.wikipedia.org/wiki/CommuniGate_Pro|CommuniGate Pro - Википедия]] | * [[https://ru.wikipedia.org/wiki/CommuniGate_Pro|CommuniGate Pro - Википедия]] | ||
| * [[http://ru.wikipedia.org/wiki/Унифицированные_коммуникации|Унифицированные коммуникации]] | * [[http://ru.wikipedia.org/wiki/Унифицированные_коммуникации|Унифицированные коммуникации]] | ||
| - | * Примеры больших клиентов ([[http://www.connect.ru/newsdetail.asp?id=6605|Tele2]], [[http://www.amby.ru/news-24.01.2006.html|SIPnet]]) | + | * Примеры больших клиентов ([[https://www.communigate.ru/Papers/Initial_installation.pdf|TELE2, Beeline, AT&T, Tmobile]], [[http://www.amby.ru/news-24.01.2006.html|SIPnet]]) |
| * [[http://www.communigate.com/CommuniGatePro/russian/|Документация]] | * [[http://www.communigate.com/CommuniGatePro/russian/|Документация]] | ||
| Line 17: | Line 19: | ||
| ==== 1.1 Схема стенда, настройка системы ==== | ==== 1.1 Схема стенда, настройка системы ==== | ||
| + | * !!! Используем **Debian 11** !!! | ||
| * 2Gb ОЗУ (clamav) | * 2Gb ОЗУ (clamav) | ||
| * [[Настройка стендов слушателей]] | * [[Настройка стендов слушателей]] | ||
| Line 32: | Line 35: | ||
| </code> | </code> | ||
| - | * [[Локализация системы#Локализация временной зоны]] | + | * Настраиваем подключение и подключаемся через PuTTY, тестируем работу сети |
| - | ==== 1.2 Установка сервера ==== | + | <code> |
| - | * [[http://www.communigate.ru/main/purchase/download.html|Скачать дистрибутив]] | + | root@server:~# ping ya.ru |
| - | * [[ftp://ftp.communigate.ru/pub/CommuniGatePro/]] | + | |
| + | root@server:~# apt update | ||
| + | </code> | ||
| + | ==== 1.2 Развертывание инфраструктуры Microsoft AD и CA ==== | ||
| + | |||
| + | - Импорт системы MS Server 2016 server.corpX.un (включение в сеть класса) | ||
| + | - Импорт системы MS Windows 10 clientN | ||
| + | - Переименование MS Server 2016 в server | ||
| + | - Установка [[http://gate.isp.un/unix/Microsoft/SW_DVD5_Office_Professional_Plus_2016_64Bit_Russian_MLF_X20-42453.ISO|MS Office]] в Windows 10 | ||
| + | - Установка [[https://www.google.com/chrome/|Chrome]], [[https://www.thunderbird.net/en-US/|Thunderbird]] в Windows 10 | ||
| + | - Назначение роли AD corpX.un (лучше перед этим назначить IP 172.16.1.X) | ||
| + | - Назначение роли CA (после AD!!!) | ||
| + | - Назначение IP 172.16.1.X/24 MS Server 2016 | ||
| + | - Настройка DNS clientN на server | ||
| + | - Включение clientN в домен | ||
| + | - Добавление в DNS на server записи mail.corpX.un (!!! Это все понадобится уже в 3-м модуле) | ||
| + | - [[Материалы по Windows#Установка русского Language pack в Windows Server 2016]] (не обязательно, и может быть уже произведена) | ||
| + | - Добавление в домен user1/Pa$$w0rd1 (возможно, не понадобится) | ||
| + | |||
| + | ==== 1.3 Установка CGP сервера ==== | ||
| + | |||
| + | * [[https://communigatepro.ru/server|Скачать дистрибутив с communigatepro.ru]] | ||
| === Debian/Ubuntu === | === Debian/Ubuntu === | ||
| <code> | <code> | ||
| - | # wget http://www.communigate.ru/pub/CommuniGatePro/CGatePro-Linux_amd64.deb | + | # wget https://doc.communigatepro.ru/packages/CGatePro-Linux_6.5-5_amd64.deb |
| # dpkg -i CGatePro*.deb | # dpkg -i CGatePro*.deb | ||
| + | |||
| + | # dpkg -l | grep cgatepro-linux | ||
| # service CommuniGate start | # service CommuniGate start | ||
| Line 50: | Line 76: | ||
| - | ==== 1.3 Первоначальная настройка ==== | + | ==== 1.4 Первоначальная настройка ==== |
| - | + | ||
| - | * [[http://172.16.1.100+X:8010]] | + | |
| <code> | <code> | ||
| + | http://172.16.1.100+X:8010 | ||
| + | </code><code> | ||
| Postmaster Password: xxxxxx | Postmaster Password: xxxxxx | ||
| Main Domain Name: corpX.un | Main Domain Name: corpX.un | ||
| Line 70: | Line 96: | ||
| </code> | </code> | ||
| - | ==== 1.4 Тестирование работоспособности почтовой подсистемы ==== | + | ==== 1.5 Тестирование работоспособности почтовой подсистемы ==== |
| <code> | <code> | ||
| Line 77: | Line 103: | ||
| # echo Hello | mail -s Hello postmaster@localhost | # echo Hello | mail -s Hello postmaster@localhost | ||
| - | |||
| - | # cat /var/CommuniGate/Accounts/postmaster.macnt/INBOX.mbox | ||
| - | |||
| - | или | ||
| # cat /var/CommuniGate/Accounts/postmaster.macnt/INBOX.mslc/data1 | # cat /var/CommuniGate/Accounts/postmaster.macnt/INBOX.mslc/data1 | ||
| Line 109: | Line 131: | ||
| <code> | <code> | ||
| Users->Account Defaults-> | Users->Account Defaults-> | ||
| - | Settings-> | ||
| - | Password Encryption: A-crpt | ||
| Mail Settings-> | Mail Settings-> | ||
| Mailbox Storage: Mail Storage Limit: 3G | Mailbox Storage: Mail Storage Limit: 3G | ||
| Line 118: | Line 138: | ||
| Mailbox Storage: Mail Storage Limit: 10G | Mailbox Storage: Mail Storage Limit: 10G | ||
| # cat /var/CommuniGate/Accounts/Settings/domain.settings | grep AccountDefaults | # cat /var/CommuniGate/Accounts/Settings/domain.settings | grep AccountDefaults | ||
| + | |||
| + | # cat /var/CommuniGate/Domains/compX.un/Settings/domain.settings | grep AccountDefaults | ||
| Users->Domains->corpX.un->Objects->Template->Mail Settings | Users->Domains->corpX.un->Objects->Template->Mail Settings | ||
| Line 145: | Line 167: | ||
| * [[https://communigate.ru/communigatepro/russian/CLI.html|Интерфейс Командной Строки / API]] | * [[https://communigate.ru/communigatepro/russian/CLI.html|Интерфейс Командной Строки / API]] | ||
| + | * [[Настройка терминалов]] | ||
| <code> | <code> | ||
| Line 176: | Line 199: | ||
| QUIT | QUIT | ||
| </code> | </code> | ||
| + | |||
| ==== 2.4 Создание учетной записи из внешней программы ==== | ==== 2.4 Создание учетной записи из внешней программы ==== | ||
| + | |||
| * [[https://pypi.org/project/CGPCLI/|CGPCLI is Python libary that allows you to reach CGP servers and execute CLI commands from your Python code.]] | * [[https://pypi.org/project/CGPCLI/|CGPCLI is Python libary that allows you to reach CGP servers and execute CLI commands from your Python code.]] | ||
| Line 183: | Line 208: | ||
| **Примечание**: демонстрирует преподаватель | **Примечание**: демонстрирует преподаватель | ||
| + | * Программирование диалогов expect [[Программирование диалогов expect#Communigate CLI]] | ||
| * Perl [[Язык программирования Perl#Пример 5]] | * Perl [[Язык программирования Perl#Пример 5]] | ||
| - | ==== 2.5 Создание пользователей с помощью текстового файла ==== | + | ==== 2.5 Импорт информации о пользователях из текстового файла ==== |
| **Примечание**: | **Примечание**: | ||
| - использовать кодировку utf-8 и табуляцию между столбцами | - использовать кодировку utf-8 и табуляцию между столбцами | ||
| - | - добавить символ новой строки в конце файла | + | - добавить символ новой строки в конце файла, но, без лишних пустых строк |
| - атрибут telephoneNumber убрать, появится в следующих лабораторных работах | - атрибут telephoneNumber убрать, появится в следующих лабораторных работах | ||
| - удалить пользователей по окончании работы | - удалить пользователей по окончании работы | ||
| Line 200: | Line 226: | ||
| ==== 2.6 Управление дополнительным доменами в CGP ==== | ==== 2.6 Управление дополнительным доменами в CGP ==== | ||
| - | |||
| - | === Настройка дополнительного ip адреса (ip alias) в ОС === | ||
| - | |||
| - | * [[Настройка сети в Linux#Статическая настройка параметров]] (потребуется перезапуск CGP) | ||
| === Создаем новый домен === | === Создаем новый домен === | ||
| Line 212: | Line 234: | ||
| === Создаем пользователя в новом домене и назначаем ему права администратора === | === Создаем пользователя в новом домене и назначаем ему права администратора === | ||
| <code> | <code> | ||
| + | Права в основном домене | ||
| + | # less /var/CommuniGate/Accounts/Settings/access.settings | ||
| + | |||
| Users->Domains->compX.un->Objects->Create Account: user3 | Users->Domains->compX.un->Objects->Create Account: user3 | ||
| Line 226: | Line 251: | ||
| </code> | </code> | ||
| - | === Для будущей поддержки SSL/TLS привязываем домены к разным адресам сервера === | + | === Настройка DNS === |
| <code> | <code> | ||
| - | Users->Domains->compX.un->Domain Settings->Assigned IP Addresses->[172.16.1.200+X] | + | mail.corpX.un. A 172.16.1.100+X |
| - | Users->Domains->corpX.un->Domain Settings->Assigned IP Addresses->[172.16.1.100+X], [127.0.0.1] | + | mail.compX.un. A 172.16.1.100+X |
| + | </code> | ||
| + | |||
| + | === Настройка алиасов доменов === | ||
| + | <code> | ||
| + | Users->Domains->corpX.un->Domain Settings->Domain Aliases: mail.corpX.un | ||
| + | |||
| + | Users->Domains->compX.un->Domain Settings->Domain Aliases: mail.compX.un | ||
| </code> | </code> | ||
| === Логинемся как user3 из домена compX.un и управляем доменом === | === Логинемся как user3 из домена compX.un и управляем доменом === | ||
| <code> | <code> | ||
| - | http://172.16.1.200+X:8010/ | + | http://mail.compX.un:8010/ |
| </code> | </code> | ||
| Line 261: | Line 293: | ||
| ===== Лабораторные работы ===== | ===== Лабораторные работы ===== | ||
| + | * !!! Для корректной работы с сертификатом достаточно ввести windows clientN в домен, подключаемся локальной учетной записью до лабораторной работы с GSSAPI | ||
| ==== 3.1 Создание сертификата TLS для доменов ==== | ==== 3.1 Создание сертификата TLS для доменов ==== | ||
| - | === Настройка DNS === | ||
| - | <code> | ||
| - | mail.corpX.un. A 172.16.1.100+X | ||
| - | |||
| - | mail.compX.un. A 172.16.1.200+X | ||
| - | </code> | ||
| - | |||
| - | === Настройка алиасов доменов === | ||
| - | <code> | ||
| - | Users->Domains->corpX.un->Domain Settings->Domain Aliases: mail.corpX.un | ||
| - | |||
| - | Users->Domains->compX.un->Domain Settings->Domain Aliases: mail.compX.un | ||
| - | </code> | ||
| === Сертификат для домена corpX.un === | === Сертификат для домена corpX.un === | ||
| <code> | <code> | ||
| Line 283: | Line 303: | ||
| </code><code> | </code><code> | ||
| Private Key | Private Key | ||
| - | Key Size: 1024 | + | Key Size: 2048 |
| </code><code> | </code><code> | ||
| Generate Key | Generate Key | ||
| Certificate Generator | Certificate Generator | ||
| Common Name: mail.corpX.un | Common Name: mail.corpX.un | ||
| + | Alternative Name: mail.corpX.un !!!Для Chrome | ||
| Country: RU | Country: RU | ||
| State/Province: Moscow region | State/Province: Moscow region | ||
| Line 298: | Line 319: | ||
| * Либо Generate Self Signed либо [[Материалы по Windows#Windows CA для Linux сервисов]] | * Либо Generate Self Signed либо [[Материалы по Windows#Windows CA для Linux сервисов]] | ||
| - | |||
| - | === Сертификат для домена compX.un === | ||
| - | <code> | ||
| - | Безопасность->SSL/TLS->Генератор Сертификатов->Имя-Идентификатор: mail.compX.un | ||
| - | </code> | ||
| ==== 3.2 Подключение почтовых клиентов ==== | ==== 3.2 Подключение почтовых клиентов ==== | ||
| Line 313: | Line 329: | ||
| === По протоколам SMTP и IMAP === | === По протоколам SMTP и IMAP === | ||
| - | * Развернуть систему client1 | + | * [[Протокол IMAP]] |
| + | * [[Сервис MTA#Протокол SMTP]] | ||
| + | * Ввести систему clientN в домен, если используется сертификат, подписанный Microsoft CA | ||
| * [[https://mail.bmstu.ru/~postmaster/5.Dostup_k_serveru_s_ispol'zovaniem_pochtovogo_klienta_Mozilla_Thunderbird.pdf|Доступ к серверу с использованием почтового клиента Mozilla Thunderbird]] | * [[https://mail.bmstu.ru/~postmaster/5.Dostup_k_serveru_s_ispol'zovaniem_pochtovogo_klienta_Mozilla_Thunderbird.pdf|Доступ к серверу с использованием почтового клиента Mozilla Thunderbird]] | ||
| === По протоколам MS Exchange и Active Sync === | === По протоколам MS Exchange и Active Sync === | ||
| - | * [[https://www.communigate.ru/pub/client/]] (проверенная версия CGatePro-MAPI-AMD64-1.54.12.35.msi.zip) | + | |
| - | * Работу выполнять на host системе, через Панель Управления->Mail | + | |
| * Имя пользователя указывать полностью, с доменом | * Имя пользователя указывать полностью, с доменом | ||
| - | * [[http://wiki.rsu.edu.ru/wiki/%D0%9D%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0_Microsoft_Outlook_2007|Настройка Microsoft Outlook 2007 для сервера rsu.edu.ru]], [[https://mail.bmstu.ru/~postmaster/6.Dostup_k_serveru_s_ispol'zovaniem_pochtovogo_klienta_Microsoft_Outlook.pdf|Доступ к серверу mail.bmstu.ru с использованием почтового клиента Microsoft Outlook]] | + | |
| + | * https://communigatepro.ru/plugins#mapi | ||
| + | * [[https://mail.bmstu.ru/~postmaster/6.Dostup_k_serveru_s_ispol'zovaniem_pochtovogo_klienta_Microsoft_Outlook.pdf|Доступ к серверу mail.bmstu.ru с использованием почтового клиента Microsoft Outlook]] | ||
| ==== 3.3 Подключение через web интерфейс ==== | ==== 3.3 Подключение через web интерфейс ==== | ||
| Line 336: | Line 355: | ||
| === Выбор интерфейса и локализация пользователя === | === Выбор интерфейса и локализация пользователя === | ||
| - | |||
| - | **Примечание**: при первом подключении установить само подписанный сертификат в базу данных доверенных сертификатов серверов в firefox | ||
| <code> | <code> | ||
| Line 350: | Line 367: | ||
| </code> | </code> | ||
| - | === Управление подключениями === | + | === Локализация сообщений === |
| + | |||
| + | <code> | ||
| + | Master->Settings->Strings | ||
| + | |||
| + | # cat /var/CommuniGate/Settings/Strings.settings | ||
| + | </code> | ||
| + | |||
| + | === Управление подключениями и блокировками === | ||
| <code> | <code> | ||
| Monitors->Access->Sessions | Monitors->Access->Sessions | ||
| KILLACCOUNTSESSIONS user1 | KILLACCOUNTSESSIONS user1 | ||
| + | |||
| + | GETTEMPBLACKLISTEDIPS | ||
| + | ... | ||
| + | |||
| + | TEMPBLACKLISTIP 10.5.N.M DELETE | ||
| </code> | </code> | ||
| Line 371: | Line 401: | ||
| == Синхронизация == | == Синхронизация == | ||
| + | |||
| + | <code> | ||
| + | попробуйте на всех нодах удалить - создать все записи | ||
| + | в разделе центральный справочник, вот по этому пути: Пользователи -> Домены -> domain.name -> Установки Домена | ||
| + | |||
| + | USERS->DOMAINS->corpX.un->DOMAIN SETTINGS->Directory Integration | ||
| + | </code> | ||
| <code> | <code> | ||
| Line 382: | Line 419: | ||
| USERS->ACCOUNT DEFAULTS->PREFERENCES | USERS->ACCOUNT DEFAULTS->PREFERENCES | ||
| Contacts: | Contacts: | ||
| - | Name: Адресная книга corp9 | + | Name: Адресная книга |
| Search Base: $domain$ | Search Base: $domain$ | ||
| </code> | </code> | ||
| Line 403: | Line 440: | ||
| <code> | <code> | ||
| + | # less /var/CommuniGate/Directory/Main.data | ||
| + | |||
| # ldapsearch -x -D "user1@corpX.un" -W -b"cn=corpX.un" -H ldaps://mail.corpX.un:636 | # ldapsearch -x -D "user1@corpX.un" -W -b"cn=corpX.un" -H ldaps://mail.corpX.un:636 | ||
| + | </code><code> | ||
| + | USERS->DOMAINS-corpX.un->Domain Settings | ||
| + | Directory Integration->Delete All | ||
| + | |||
| + | USERS->Directory Integration->Regular Domains->Passwords | ||
| + | |||
| + | DIRECTORY->Units->Main | ||
| + | Remove Unit | ||
| + | |||
| + | DIRECTORY->Units | ||
| + | Create Local Unit->Unit Name: Main | ||
| + | | ||
| + | USERS->DOMAINS-corpX.un->Domain Settings | ||
| + | Directory Integration->Insert All | ||
| + | </code><code> | ||
| + | # ldapsearch -x -D "uid=user1,cn=corpX.un" ... | ||
| </code> | </code> | ||
| Line 417: | Line 472: | ||
| </code> | </code> | ||
| - | * Добавление атрибутов | + | === Добавление атрибутов === |
| <code> | <code> | ||
| Directory->Units->Main->Schema | Directory->Units->Main->Schema | ||
| + | ... | ||
| + | telephoneNumber | ||
| + | ... | ||
| Users->Directory Integration | Users->Directory Integration | ||
| Line 425: | Line 483: | ||
| </code> | </code> | ||
| - | == Подключение адресной книги к почтовому клиенту == | + | === Подключение адресной книги к почтовому клиенту === |
| * [[Thunderbird#Получение списка контактов через LDAP]] в Thunderbird | * [[Thunderbird#Получение списка контактов через LDAP]] в Thunderbird | ||
| Line 449: | Line 507: | ||
| </code> | </code> | ||
| - | === Заменяем логотип в Samoware интерфейсе === | + | === Заменяем логотип в Pronto интерфейсе === |
| - | + | ||
| - | * [[http://val.bmstu.ru/unix/CGP/logo-big-samoware.svg]] | + | |
| <code> | <code> | ||
| # find /opt/CommuniGate/WebSkins/ -type d | # find /opt/CommuniGate/WebSkins/ -type d | ||
| - | Named Skins: Create: Samoware | + | Named Skins: Create: hPronto- |
| - | Upload File: logo-big-samoware.svg | + | Upload File: logo-big.png |
| # find /var/CommuniGate/Accounts/WebSkins/ | # find /var/CommuniGate/Accounts/WebSkins/ | ||
| Line 516: | Line 572: | ||
| corpX.un. MX 10 mail.corpX.un. | corpX.un. MX 10 mail.corpX.un. | ||
| - | |||
| - | mail.corpX.un. A 172.16.1.200+X | ||
| - | |||
| - | compX.un. MX 10 mail.corpX.un. | ||
| </code> | </code> | ||
| Line 531: | Line 583: | ||
| === Почтовый relay для локальной сети === | === Почтовый relay для локальной сети === | ||
| - | * Продемонстрировать отправку письма без аутентификации из локальной сети на внешний ящик | + | * Можно продемонстрировать отправку письма без аутентификации из локальной сети на внешний ящик |
| <code> | <code> | ||
| Line 545: | Line 597: | ||
| ==== 4.2 Использование встроенных средств CGP для борьбы со SPAMом ==== | ==== 4.2 Использование встроенных средств CGP для борьбы со SPAMом ==== | ||
| - | * [[http://systemzone.ru/misc/sommunigate/522-ispolzovanie-vstroennyx-vozmozhnostej-communigate-pro-dlya-borby-so-spamom.html|Использование встроенных возможностей CommuniGate Pro для борьбы со спамом]] | + | * [[http://system-administrators.info/?p=1893|Использование встроенных возможностей CommuniGate Pro для борьбы со спамом]] |
| === Настройка параметров приемника SMTP === | === Настройка параметров приемника SMTP === | ||
| Line 572: | Line 624: | ||
| === Помощь пользователей === | === Помощь пользователей === | ||
| - | |||
| - | * [[https://www.communigate.ru/main/purchase/scriptrepository.html|Библиотека скриптов для CommuniGate Pro (бесплатно)]] | ||
| в файле strings.data в строках SpamFalseNegativeReportEmail и SpamFalsePositiveReportEmail можете указать адреса, куда перенаправлять неправильно определённые письма, тогда появятся кнопки для этого | в файле strings.data в строках SpamFalseNegativeReportEmail и SpamFalsePositiveReportEmail можете указать адреса, куда перенаправлять неправильно определённые письма, тогда появятся кнопки для этого | ||
| + | [[https://val.bmstu.ru/unix/CGP/Scripts.zip|Библиотека скриптов для CommuniGate Pro (бесплатно)]] содержит [[https://val.bmstu.ru/unix/CGP/sweepMailboxes.pl|программу для массового удаления вредоносных писем]] | ||
| ==== 4.3 Использование внешних фильтров для борьбы с вирусами и SPAMом ==== | ==== 4.3 Использование внешних фильтров для борьбы с вирусами и SPAMом ==== | ||
| Line 584: | Line 635: | ||
| === Развертывание антивируса === | === Развертывание антивируса === | ||
| - | * !!! Тестировать с client1 отключив через поиск Параметры Защитника Windows и наблюдая clamav.log | ||
| * [[Сервис Clamav]] | * [[Сервис Clamav]] | ||
| * Модуль AppArmor [[Модуль AppArmor#Определение наличия и правка профилей для служб]] | * Модуль AppArmor [[Модуль AppArmor#Определение наличия и правка профилей для служб]] | ||
| * [[http://media.kaspersky.com/utilities/ConsumerUtilities/eicar.zip|eicar.zip]] | * [[http://media.kaspersky.com/utilities/ConsumerUtilities/eicar.zip|eicar.zip]] | ||
| <code> | <code> | ||
| + | # wget -O /var/CommuniGate/eicar.zip http://media.kaspersky.com/utilities/ConsumerUtilities/eicar.zip | ||
| + | |||
| # usermod -G mail clamav | # usermod -G mail clamav | ||
| Line 620: | Line 672: | ||
| # ./configure --with-antivirus=clamav --with-spamassassin=yes --with-cgpro_dir=/var/CommuniGate | # ./configure --with-antivirus=clamav --with-spamassassin=yes --with-cgpro_dir=/var/CommuniGate | ||
| + | ... | ||
| + | 3 Without database support | ||
| # make && make install | # make && make install | ||
| Line 663: | Line 717: | ||
| Parameter: ClamSpam | Parameter: ClamSpam | ||
| </code> | </code> | ||
| + | |||
| + | === Тестирование === | ||
| + | |||
| + | * Вирусы - файл eicar с client1, отключив через поиск "Параметры Защитника Windows" и наблюдая clamav.log | ||
| + | * Спам - отравкой сообщения с одним словом, можно как при тестровании в п.1.5 и наблюдая syslog | ||
| === Использование простых правил управления спамом === | === Использование простых правил управления спамом === | ||
| Line 688: | Line 747: | ||
| GETACCOUNTMAILRULES user1 | GETACCOUNTMAILRULES user1 | ||
| + | !!! Это пример, лучше включить Junk Mail Control для учетной записи пользователя в интерфейсе администрирования !!! | ||
| SETACCOUNTMAILRULES user1 ((3, MoveSpam,(("Header Field", in, "X-Junk-Score*XXXXXXXXXX*")), (("Store in", "~/Junk"), (Discard)))) | SETACCOUNTMAILRULES user1 ((3, MoveSpam,(("Header Field", in, "X-Junk-Score*XXXXXXXXXX*")), (("Store in", "~/Junk"), (Discard)))) | ||
| </code> | </code> | ||
| Line 719: | Line 779: | ||
| <code> | <code> | ||
| Set Reply-To to Group: no | Set Reply-To to Group: no | ||
| + | E-mails from Members Only: no | ||
| + | Hide in Directory: no | ||
| </code> | </code> | ||
| - | * Создаем правила, меняющие заголовок для писем в группу, и заменяющие Reply-To для писем из группы | + | * Создаем правила, меняющие заголовок для писем в группу, и заменяющие Reply-To для писем из группы |
| + | * !!! Если создавать через CLI SETSERVERMAILRULES, надо все оформить одной строкой и _убрать_ коментарии на русском !!! | ||
| + | * Правило replace_from_group1 подразумевает указание в поле To только адрес того, кому отвечаем, адрес группы надо указвать в поле Cc. Возможно, удобенее не использовать это правило, а отвечать, указывая группу в качестве обратного адреса | ||
| <code> | <code> | ||
| Line 731: | Line 795: | ||
| 6, | 6, | ||
| mark_to_group1, | mark_to_group1, | ||
| - | ((Subject, "is not", "*[group1]*"), ("Any To or Cc", is, "*group1@corpX*")), | + | ((Subject, "is not", "*[group1]*"), ("Any To or Cc", is, "group1@*")), |
| (("Tag Subject", "[group1] ")), | (("Tag Subject", "[group1] ")), | ||
| "Помечаем тему всех писем, идущих в группу" | "Помечаем тему всех писем, идущих в группу" | ||
| Line 738: | Line 802: | ||
| 4, | 4, | ||
| replace_from_group1, | replace_from_group1, | ||
| - | ((Subject, is, "*[group1]*"), (To, "is not", "*group1@corpX*")), | + | ((Subject, is, "*[group1]*"), (To, "is not", "*group1@*")), |
| (("Add Header", "Reply-To: group1@corpX.un")), | (("Add Header", "Reply-To: group1@corpX.un")), | ||
| "Устанавливаем Reply-To в группу для всех ответов из группы" | "Устанавливаем Reply-To в группу для всех ответов из группы" | ||
| Line 747: | Line 811: | ||
| === Использование общих папок и прав доступа к ним === | === Использование общих папок и прав доступа к ним === | ||
| - | * Для user1: | + | * Для postmaster: |
| <code> | <code> | ||
| + Create Folder-> | + Create Folder-> | ||
| Имя Папки: group1 | Имя Папки: group1 | ||
| Folder location: Root | Folder location: Root | ||
| - | |||
| group1 * | group1 * | ||
| Открыть доступ к папке | Открыть доступ к папке | ||
| + | user1 Запись | ||
| user2 Запись | user2 Запись | ||
| </code> | </code> | ||
| - | * user2: | + | * user1 и user2 |
| <code> | <code> | ||
| Папки->Управление->Псевдонимы Папок | Папки->Управление->Псевдонимы Папок | ||
| Имя Псевдонима: group1 | Имя Псевдонима: group1 | ||
| - | Имя Папки: ~user1/group1 | + | Имя Папки: ~postmaster/group1 |
| </code> | </code> | ||
| - | === Использование расширеного формата почтовых адресов === | + | === Использование расширенного формата почтовых адресов === |
| <code> | <code> | ||
| - | gate.isp.un% mail group1#user1@corpX.un | + | # echo Hello | mail -s Hello group1#postmaster@corpX.un |
| - | + | ||
| - | mail.corpX.un# echo Hello | mail -s Hello group1#user1@corpX.un | + | |
| </code> | </code> | ||
| Line 782: | Line 844: | ||
| Settings->Router | Settings->Router | ||
| ... | ... | ||
| - | <group1@corpX.un> = group1#user1@corpX.un | + | <group1@corpX.un> = group1#postmaster@corpX.un |
| ... | ... | ||
| </code> | </code> | ||
| Line 791: | Line 853: | ||
| <code> | <code> | ||
| - | Users->Domains-corpX.un->Objects->user1->Settings | + | Users->Domains-corpX.un->Objects->postmaster->Settings |
| Aliases: group1 | Aliases: group1 | ||
| </code> | </code> | ||
| - | * От имени user1 создаем правила: | + | * [[https://doc.communigatepro.ru/russian/development/Rules.html]] |
| + | * [[https://doc.communigatepro.ru/admin/mail/QueueRules.html]] | ||
| + | * Операции условий равно ( is ) и не равно обрабатывают параметры как "шаблоны" строки: символы звёздочка (*) | ||
| + | * Операции условий среди ( in ) и не среди обрабатывают параметры как наборы из одной или нескольких "шаблонов", разделённых символами запятой (,) | ||
| + | * От имени postmaster создаем правила: | ||
| <code> | <code> | ||
| Line 801: | Line 867: | ||
| Добавить Правило: Move to group1 | Добавить Правило: Move to group1 | ||
| Изменить | Изменить | ||
| - | Любой Кому/Копия: равно *group1* | + | Любой Кому/Копия: равно group1@* |
| Записать в: group1 | Записать в: group1 | ||
| Выбросить | Выбросить | ||
| Line 807: | Line 873: | ||
| ==== 5.2 Электронная подпись и шифрование S/MIME ==== | ==== 5.2 Электронная подпись и шифрование S/MIME ==== | ||
| - | * Устанавливаем в базу данных доверенных сертификатов серверов в Thunderbird само подписанный сертификат CGP | + | === Активация функциональности === |
| - | Пользователь user1 создает у себя в интерфейсе сертификат для подписи и шифрования и отправляет подписанное письмо по адресу postmaster@corpX.un | + | <code> |
| + | USERS->DOMAINS-corpX.un->SECURITY->S/MIME | ||
| + | Создаем самоподписанный сертификат (будет работать как коневой УЦ) | ||
| + | </code> | ||
| + | |||
| + | === Использование в Samoware === | ||
| + | |||
| + | Пользователи user1 создает у себя в интерфейсе сертификат для подписи и расшифровки и отправляет _подписанное_ письмо user2 | ||
| Подделать текст письма можно: | Подделать текст письма можно: | ||
| <code> | <code> | ||
| - | # vim /var/CommuniGate/Accounts/postmaster.macnt/INBOX.mbox | + | # vim /var/CommuniGate/Accounts/user2.macnt/INBOX.mslc/data1 |
| </code> | </code> | ||
| + | |||
| + | === Использование в Thunderbird === | ||
| + | |||
| + | * Устанавливаем в базу данных доверенных сертификатов серверов в Thunderbird само подписанный сертификат УЦ CGP, свой сертификат и закрытый ключ и ВСЕ сертификаты респондентов, короче, не очень удобно ) | ||
| ==== 5.3 IM and Presence ==== | ==== 5.3 IM and Presence ==== | ||
| + | * Выяснить в службе поддержки, куда девается ФИО при добавлении в "Друзья" ? | ||
| * [[Thunderbird#Настройка учетной записи XMPP]] в Thunderbird | * [[Thunderbird#Настройка учетной записи XMPP]] в Thunderbird | ||
| ==== 5.4 Общие календари и задания ==== | ==== 5.4 Общие календари и задания ==== | ||
| + | * По аналогии с общими почтовыми папками | ||
| ==== 5.5 Использование облачного хранилища ==== | ==== 5.5 Использование облачного хранилища ==== | ||
| * Settings->Services->HTTPU->Request Size Limit: unlimited | * Settings->Services->HTTPU->Request Size Limit: unlimited | ||
| * [[https://mail.bmstu.ru/~postmaster/7.Ispolzovanie_cloud_diska.pdf|Использование облачного хранилища]] | * [[https://mail.bmstu.ru/~postmaster/7.Ispolzovanie_cloud_diska.pdf|Использование облачного хранилища]] | ||
| + | * https://mail.bmstu.ru/filebrowser.wcgp?subDir=~логин_сотрудника | ||
| ==== 5.6 Перлюстрация писем ==== | ==== 5.6 Перлюстрация писем ==== | ||
| Line 868: | Line 948: | ||
| * !!! Работает **только** при подключении через HTTPS | * !!! Работает **только** при подключении через HTTPS | ||
| <code> | <code> | ||
| - | # ldapsearch -x -D "cn=Administrator,cn=Users,dc=corpX,dc=un" -W -h server -b "dc=corpX,dc=un" "sAMAccountName=user100+X" | + | # ldapsearch -x -D "cn=Administrator,cn=Users,dc=corpX,dc=un" -W -H ldap://server -b "dc=corpX,dc=un" "sAMAccountName=user100+X" |
| + | |||
| + | # ldapsearch -x -D "user100+X@corp2.un" -W -H ldap://server -b "dc=corpX,dc=un" | ||
| # apt install libauthen-simple-ldap-perl | # apt install libauthen-simple-ldap-perl | ||
| - | # wget http://www.communigate.ru/CGAUTH/authLDAPNewAD.pl | + | # wget https://val.bmstu.ru/unix/CGP/authLDAPNewAD.pl |
| </code> | </code> | ||
| Line 923: | Line 1005: | ||
| <code> | <code> | ||
| - | cat /root/AccountList.txt | + | Users->DOMAINS->corpX.un->Account Defaults->Settings-> |
| + | Password Encryption: clear | ||
| + | |||
| + | # cat /var/CommuniGate/Accounts/user101.macnt/account.settings | ||
| + | |||
| + | # cat /root/AccountList.txt | ||
| Name Password | Name Password | ||
| user100+X Pa$$w0rd100+X | user100+X Pa$$w0rd100+X | ||
| - | cd /opt/CommuniGate/Migration/ | + | # cd /opt/CommuniGate/Migration/ |
| ./MoveAccounts --IMAP /root/AccountList.txt 172.16.1.254 127.0.0.1 | ./MoveAccounts --IMAP /root/AccountList.txt 172.16.1.254 127.0.0.1 | ||
| Line 945: | Line 1032: | ||
| * Перенос ключа принципала в CGP (Users->Domains->corpX.un->Security->Kerberos) | * Перенос ключа принципала в CGP (Users->Domains->corpX.un->Security->Kerberos) | ||
| * Входим в домен как user100+X с рабочей станции client1 | * Входим в домен как user100+X с рабочей станции client1 | ||
| - | * [[Thunderbird#Авто конфигурация клиента]] Thunderbird (IMAP GSSAPI) | + | * [[https://www.communigate.ru/CommuniGatePro/russian/MAPI.html|MAPI-Коннектор]] Kerberos GSSAPI |
| + | * [[#Модуль 8. Использование CGP в качестве Web сервера]] | ||
| + | * [[Thunderbird#Авто конфигурация клиента]] Thunderbird (IMAP/SMTP GSSAPI) | ||
| ==== 6.4 Использование CGP в качестве RADIUS сервера ==== | ==== 6.4 Использование CGP в качестве RADIUS сервера ==== | ||
| Line 972: | Line 1061: | ||
| - Как организовать использование в Communigate учетных записей из Microsoft Active Directory? | - Как организовать использование в Communigate учетных записей из Microsoft Active Directory? | ||
| - Какую часть протокола RADIUS реализует Communigate? | - Какую часть протокола RADIUS реализует Communigate? | ||
| + | |||
| ===== Модуль 7. SIP, PBX, встроенные приложения, номерной план, пример своего приложения ===== | ===== Модуль 7. SIP, PBX, встроенные приложения, номерной план, пример своего приложения ===== | ||
| Line 981: | Line 1071: | ||
| ===== Лабораторные работы ===== | ===== Лабораторные работы ===== | ||
| - | * [[ZoIPer]] user3 | + | ==== 7.1 Внутренняя телефония ==== |
| - | * [[SIP Phone Panasonic KX-HDVXXX]] 401 | + | |
| - | ==== 7.1 Локализация PBX ==== | + | === Звонки из интерфейса Samoware === |
| - | <code> | + | * !!! Подключаться через https, вебинаристам по IP адресу с домашнего компьютера |
| - | Users->Domains->corpX.un->PBX->Create Custom Enviroment | + | * Тестовый звонок на номер **echotest** |
| - | Languages->Create: russian | + | === Подключение телефонных аппаратов и внутренний план нумерации === |
| - | select russian | + | <code> |
| + | Users->Domains->corpX.un->Objects->userN->Settings | ||
| + | Aliases: 40N | ||
| + | Alt SIP Password: tpassword40N | ||
| </code> | </code> | ||
| - | * [[http://ftp.communigate.ru/pub/stuff/noarch/pbx_russian_files_51.zip]] | + | |
| + | * [[ZoIPer]] или [[PhonerLite]] user2/402 | ||
| + | * [[SIP Phone Panasonic KX-HDVXXX]] 402 | ||
| + | |||
| + | === Информация о регистрации SIP пользовательского оборудования === | ||
| <code> | <code> | ||
| - | !!! Upload tar файлов из архива !!! | + | Users->Domains->corpX.un->Objects->user1->Status |
| - | # ls CGateProSoftware/CommuniGate/PBXApps/ | + | или |
| - | # ls /var/CommuniGate/Accounts/PBXApps | + | GETACCOUNTINFO user1 KEY SIPContacts |
| + | ... | ||
| </code> | </code> | ||
| - | ==== 7.2 Таблица маршрутизации применительно к SIP, номерной план ==== | ||
| - | === Через таблицу маршрутизации === | + | ==== 7.2 Распространение IP телефонии за пределы офиса ==== |
| + | |||
| + | === Пользователь pbx === | ||
| <code> | <code> | ||
| - | S:<6363@*> = gatewayincoming{pbx,media}#pbx | + | Users->Domains->corpX.un->Objects->pbx->Settings->Access Rights |
| + | |||
| + | Can Modify This Domain and its Accounts Settings | ||
| + | Can Access All Files | ||
| + | Can Impersonate | ||
| + | Can Administer Other Domains | ||
| </code> | </code> | ||
| - | === Организация внутреннего плана нумерации === | + | === Добавление служебных номеров === |
| <code> | <code> | ||
| - | Users->Domains->corpX.un->Objects->user2->Settings | + | Settings->Router |
| - | Aliases: 402 | + | ... |
| + | Signal:<311@*> = echotest#pbx@localhost ; testing address | ||
| + | ... | ||
| </code> | </code> | ||
| - | === Информация о регистрации SIP пользовательского оборудования === | + | === Звонки в соседний офис === |
| <code> | <code> | ||
| - | Users->Domains->corpX.un->Objects->user1->Status | + | Settings->Router |
| + | ... | ||
| + | <000(3d)@*> = *@telnum | ||
| + | ... | ||
| + | Signal:telnum = pstn ; unknown telnum -> PSTN | ||
| + | Signal:<*@pstn> = gatewaycaller{*}#pbx ; start 'gatewaycaller' app | ||
| - | или | + | или сразу |
| - | GETACCOUNTINFO user1 KEY SIPContacts | + | ;Signal:<000(3d)@*> = gatewaycaller{*}#pbx |
| + | <000(3d)@*> = gatewaycaller{*}#pbx | ||
| + | |||
| + | Users->Account Defaults->PSTN | ||
| + | или | ||
| + | Users->Domains->corpX.un->Account Defaults->PSTN | ||
| + | или | ||
| + | Users->Domains->corpX.un->Objects->user1->Real-Time->PSTN->CLASS_OF_SERVICE_TELEPHONY | ||
| + | |||
| + | Gateway Domain: server.corp.un | ||
| + | |||
| + | |||
| + | Users->Domains->corpX.un->Objects->user1->Real-Time->PSTN | ||
| + | |||
| + | Caller ID: 00X401 | ||
| + | </code> | ||
| + | |||
| + | === Организация исходящих вызовов в PSTN через voip провайдера с аутентификацией === | ||
| + | <code> | ||
| + | Settings->Router | ||
| + | ... | ||
| + | <8(10d)@*> = 8*@telnum | ||
| + | <+7(10d)@*> = 8*@telnum | ||
| + | |||
| + | ;<+(7-20d)@*> = +*@telnum ; +nnnnn calls -> to telnum | ||
| + | ;... | ||
| + | ... | ||
| + | |||
| + | Users->Account Defaults->PSTN | ||
| + | или | ||
| + | Users->Domains->corpX.un->Account Defaults->PSTN | ||
| + | или | ||
| + | Users->Domains->corpX.un->Objects->user1->Real-Time->PSTN | ||
| + | |||
| + | Gateway Domain: voip1.un | ||
| + | Name for Gateway: 00000X | ||
| + | Password for Gateway: spasswordX | ||
| + | </code> | ||
| + | |||
| + | === Организация входящих вызовов из PSTN (регистрация на voip провайдере) === | ||
| + | <code> | ||
| + | Users->Domains->corpX.un->Objects->pbx->Real-Time->RSIP | ||
| + | Name: voip1 | ||
| + | Register Every: 5 min | ||
| + | Account: 00000X | ||
| + | at Host: voip1.un | ||
| + | Authentication Name: 00000X | ||
| + | Password: spasswordX | ||
| + | Target: логин пользователя, если оставить пустой, будет IVR | ||
| + | |||
| + | GETACCOUNTRSIPS pbx | ||
| 200 data follow | 200 data follow | ||
| - | ( | + | { |
| - | { | + | sipnet = { |
| - | "" = "sip:user1@195.19.35.219:5060"; | + | authName = 00000X; |
| - | @regdata = { | + | domain = voip1.un; |
| - | Allow = (ACK, BYE, CANCEL, INFO, INVITE, NOTIFY, OPTIONS, REFER); | + | fromName = 00000X; |
| - | CSeq = #68190; | + | password = spasswordX; |
| - | Call-ID = 3498b62-d4014eab@195.19.35.219; | + | period = 5m; |
| - | Supported = (x-sipura); | + | }; |
| - | User-Agent = "Linksys/SPA3102-3.3.6(GW)"; | + | } |
| - | }; | + | |
| - | Expires = #T14-10-2014_05:30:41; | + | |
| - | } | + | Users->Domains->corpX.un->Objects->pbx->Real-Time->Incoming Call Rules->Edit |
| - | ) | + | Redirect To is #pbx |
| </code> | </code> | ||
| Line 1046: | Line 1209: | ||
| </code> | </code> | ||
| - | ==== 7.3 Правила для голоса ==== | + | ==== 7.3 Локализация PBX ==== |
| <code> | <code> | ||
| - | Settings->Router | + | Users->Domains->corpX.un->PBX->Create Custom Enviroment |
| - | ... | + | |
| - | Signal:<311@*> = echotest#pbx@localhost ; testing address | + | |
| - | ... | + | |
| - | </code> | + | |
| - | pbx - пользователь | + | Languages->Create: russian |
| + | select russian | ||
| + | </code> | ||
| + | * [[http://ftp.communigate.ru/pub/stuff/noarch/pbx_russian_files_51.zip]] | ||
| <code> | <code> | ||
| - | Users->Domains->corpX.un->Objects->pbx->Settings->Access Rights | + | !!! Upload tar файлов из архива !!! |
| - | Can Modify This Domain and its Accounts Settings | + | # ls CGateProSoftware/CommuniGate/PBXApps/ |
| - | Can Access All Files | + | |
| - | Can Impersonate | + | # ls /var/CommuniGate/Accounts/PBXApps |
| - | Can Administer Other Domains | + | |
| </code> | </code> | ||
| + | |||
| ==== 7.4 Встроенные приложения ==== | ==== 7.4 Встроенные приложения ==== | ||
| Line 1077: | Line 1239: | ||
| </code> | </code> | ||
| <code> | <code> | ||
| - | пункт techsupport - можно заменить на свое название, например abcd | + | можно добавить свое название, например group1 |
| - | для озвучивания пункта необходимо загрузить файл forabcd.wav через | + | для озвучивания пункта необходимо загрузить файл forgroup1.wav через |
| Users->Domains->corpX.un->PBX | Users->Domains->corpX.un->PBX | ||
| + | |||
| + | Файл можно записать через голосовую почту, содержание примерно: "что бы позвонить в наш отдел" | ||
| </code> | </code> | ||
| <code> | <code> | ||
| Line 1117: | Line 1281: | ||
| ==== 7.5 Пишем свое небольшое приложение ==== | ==== 7.5 Пишем свое небольшое приложение ==== | ||
| - | * [[http://www.communigate.com/CommuniGatePro/russian/CGPL.html|Язык Программирования CommuniGate Pro (CG/PL)]] | + | * [[http://www.communigate.ru/CommuniGatePro/russian/CGPL.html|Язык Программирования CommuniGate Pro (CG/PL)]] |
| === Hello World по номеру 301 === | === Hello World по номеру 301 === | ||
| Line 1142: | Line 1306: | ||
| Create Forwarder: 301 | Create Forwarder: 301 | ||
| Forward To: sayhello#pbx | Forward To: sayhello#pbx | ||
| + | | ||
| + | или | ||
| + | |||
| + | SETTINGS-ROUTER | ||
| + | ... | ||
| + | Signal:<301@*> = sayhello#pbx@localhost | ||
| + | ... | ||
| </code> | </code> | ||
| Line 1174: | Line 1345: | ||
| </code> | </code> | ||
| - | === Перевод звонка без сопровождения (blind transfer) === | ||
| - | В приложении пример скрипта, реализующего b2bua в режиме бриджа (не миксера) и позволяющего с помощью DTMF команд выполнить перевод звонка без сопровождения (blind transfer). Данный скрипт воспринимает DTMF команды, посланные как SIP INFO запросы, а не в медиа канале (например, в hPronto на странице Preferences -> Dialer опцию "Sending Method" нужно установить в signal). | ||
| - | Если нужно, чтобы DTMF команды работали и в том случае, когда они посылаются в голосовом канале (rfc2833 или inband), то нужно подключать стороны через миксер, а не через бридж, для этого нужно немного модифицировать часть скрипта до вызова процедуры bridgedCallLoop(). | ||
| - | Пожалуйста, дайте нам знать, если потребуется помощь в модификации скрипта для подключения сторон с использованием миксера (чтобы обрабатывать DTMF, отправленные как inband или rfc2833). | ||
| - | |||
| - | Сам механизм перевода следующий. При установлении соединения каждый из участников может набрать #nnnn (4-значный номер), чтобы дать сигнал для перевода партнера на 4-значный номер nnnn. После удачного перевода инициатор перевода будет отсоединен. На набор каждой цифры номера дается не более 5 секунд. Если за это время не было введена цифра, то перевод не осуществляется и нужно будет заново набирать #nnnn для осуществления попытки перевода (см. комментарии в скрипте). Также в процессе набора номера, если уже ошиблись, можно набрать *, чтобы начать набор #nnnn заново. | ||
| - | |||
| - | Логику меню набора номера для перевода можно адаптировать. | ||
| - | |||
| - | Приложение b2bua-transfer.sppr нужно закачать в PBX окружение (в WebAdmin -> Users -> PBX). | ||
| - | Для направления звонков в это приложение лучше использовать серверное сигнальное правило, потому что при направлении через запись в маршрутизаторе нужно будет вводить префиксы, чтобы не было зацикливания. | ||
| - | |||
| - | Серверное сигнальное правило может выглядить примерно так: | ||
| - | |||
| - | <code> | ||
| - | Data | ||
| - | Operation IS INVITE | ||
| - | Call Type IS AV | ||
| - | Submit Address IS NOT LOCAL [0.0.0.0]* | ||
| - | Target Address IS sip:*@domain.name | ||
| - | |||
| - | Action | ||
| - | Redirect To b2bua-transfer#pbx@domain.name | ||
| - | Discard Rules | ||
| - | </code> | ||
| - | |||
| - | Здесь первые три условия стандартные, третье условие позволяет избежать зацикливания данного правила, так как оно не будет применяться для звонков, инициированных PBX приложением (то есть для вызова из исходящей ноги Caller приложения правило уже применяться не будет). | ||
| - | Далее нужно прописать набор условий (например, Target Address), которые будут задавать набор адресов отправителей и получателей звонка, для которых должно запускаться это приложение с логикой перевода через DTMF. В примере выше правило будет запускаться для всех номеров получателей в домене domain.name. | ||
| - | В логике скрипта можно дополнительно добавить проверку, чтобы пользоваться данными DTMF командами могли только локальные пользователи, а не внешние и т.п. | ||
| - | |||
| - | Скрипт приведен как пример, он тщательно не тестировался, но функционал трансфера проверили - работает. Если будут какие-либо ошибки или вопросы по его использованию, пожалуйста, обращайтесь. | ||
| - | |||
| - | <code> | ||
| - | // ================================================== // | ||
| - | // simple B2BUA application // | ||
| - | // supporting DTMF commands // | ||
| - | // ================================================== // | ||
| - | |||
| - | entry Caller forward; | ||
| - | procedure bridgedCallLoop(peerLeg) forward; | ||
| - | function transferTo(numDigits) forward; | ||
| - | procedure doSysLog(str) {SysLog("B2BUA: " + str);} | ||
| - | |||
| - | // | ||
| - | // ingress task entry | ||
| - | // | ||
| - | entry Main { | ||
| - | var callParams = NewDictionary(); | ||
| - | callParams.("") = LocalURI(); | ||
| - | callParams.fromName = RemoteRealName(); | ||
| - | callParams.From = RemoteURI(); | ||
| - | callParams.("Call-ID") = PendingRequestData("Call-ID") + ".b2b"; | ||
| - | callParams.("Max-Forwards") = PendingRequestData("Max-Forwards")-1; | ||
| - | callParams.customIdentity = ""; | ||
| - | |||
| - | doSysLog("callParams: " + callParams.objectToString()); | ||
| - | var peerLeg = spawn Caller(callParams); | ||
| - | if(!IsTask(peerLeg)) { | ||
| - | doSysLog("failed to spawn Caller task"); | ||
| - | RejectCall(peerLeg); stop; | ||
| - | } | ||
| - | |||
| - | var errorCode = StartBridge(peerLeg); | ||
| - | if(errorCode != null) { | ||
| - | void(SendEvent(peerLeg,"stop",errorCode)); | ||
| - | doSysLog("call failed: " + errorCode.string()); | ||
| - | RejectCall(errorCode); stop; | ||
| - | } | ||
| - | |||
| - | bridgedCallLoop(peerLeg); | ||
| - | stop; | ||
| - | } | ||
| - | |||
| - | // | ||
| - | // egress task entry | ||
| - | // | ||
| - | entry Caller { | ||
| - | var peerLeg = Vars().parent, callParams = Vars().startParameter, bridgeEvent,input,errorCode; | ||
| - | |||
| - | void(Impersonate(SIPURIToEmail(callParams.From))); | ||
| - | void(SignalOption("refer","peer")); | ||
| - | void(SignalOption("bridgeBreak","disconnect")); | ||
| - | |||
| - | bridgeEvent = ReadInput(10); | ||
| - | if(!IsStartBridgeEvent(bridgeEvent) || bridgeEvent.sender != peerLeg) {doSysLog("unexpected start event: " + bridgeEvent.objectToString()); stop;} | ||
| - | errorCode = StartBridgedCall(callParams,bridgeEvent); | ||
| - | | ||
| - | if(errorCode) {RejectBridge(bridgeEvent,errorCode); stop;} | ||
| - | |||
| - | while(true) { | ||
| - | input = ReadInput(3600); | ||
| - | exitif !IsCallProvisionEvent(input); | ||
| - | } | ||
| - | |||
| - | if((IsDictionary(input) && input.what == "stop") || IsBreakBridgeEvent(input)) {stop;} | ||
| - | if(!IsCallCompletedEvent(input)) { | ||
| - | doSysLog("unexpected event: " + input.objectToString()); | ||
| - | errorCode = "unexpected event"; | ||
| - | } elif(input.parameter != null) { | ||
| - | doSysLog("call failed: " + input.parameter); | ||
| - | errorCode = input.parameter; | ||
| - | } | ||
| - | if(errorCode) {RejectBridge(bridgeEvent,errorCode); stop;} | ||
| - | |||
| - | bridgedCallLoop(peerLeg); | ||
| - | stop; | ||
| - | } | ||
| - | |||
| - | // | ||
| - | // Main loop: processing events and DTMF commands in the connected state | ||
| - | // | ||
| - | procedure bridgedCallLoop(peerLeg) { | ||
| - | if(!IsTask(peerLeg)) {return;} | ||
| - | |||
| - | while(IsConnected()) { | ||
| - | var input = ReadInput(60); | ||
| - | doSysLog("main loop INPUT: " + (input.string() || "NULL")); | ||
| - | |||
| - | if(input == "#") { | ||
| - | input = transferTo(4); // after "#" enter 4-digit number to transfer the call to | ||
| - | if(IsString(input)) { | ||
| - | void(SendEvent(peerLeg,"peerTransfer",input + "@" + MyDomain())); | ||
| - | input = null; | ||
| - | } | ||
| - | } | ||
| - | | ||
| - | if(input == null) { | ||
| - | null; | ||
| - | | ||
| - | } elif(IsDictionary(input) && input.sender == peerLeg && input.what == "peerTransfer" && IsString(input.parameter)) { | ||
| - | var transferError = TransferCall(input.parameter); | ||
| - | if(transferError == null) { | ||
| - | doSysLog("call transferred to: " + input.parameter); | ||
| - | Disconnect(); | ||
| - | } else { | ||
| - | doSysLog("transfer failed: " + transferError.string()); | ||
| - | } | ||
| - | |||
| - | } elif(IsDisconnectEvent(input) || IsBreakBridgeEvent(input)) { | ||
| - | void(SendEvent(peerLeg,"stop","disconnected")); | ||
| - | Disconnect(); | ||
| - | |||
| - | } elif(IsDictionary(input) && input.what == "stop") { | ||
| - | Disconnect(); | ||
| - | |||
| - | } elif(IsString(input)) { | ||
| - | void(SendEvent(peerLeg,"dtmf",input)); | ||
| - | |||
| - | } elif(IsCallInfoEvent(input)) { | ||
| - | doSysLog("relaying INFO received: " + input.objectToString()); | ||
| - | void(SendEvent(peerLeg,"info",input.parameter)); | ||
| - | |||
| - | } elif(IsDictionary(input) && input.what == "dtmf") { | ||
| - | void(SendDTMF(input.parameter)); | ||
| - | |||
| - | } elif(IsDictionary(input) && input.what == "info") { | ||
| - | void(SendCallInfo(input.parameter)); | ||
| - | |||
| - | } else { | ||
| - | doSysLog("unknown event: " + input.objectToString()); | ||
| - | } | ||
| - | } | ||
| - | return; | ||
| - | } | ||
| - | |||
| - | // | ||
| - | // Entering a number with 'numDigits' digits, 5-second timeout to enter one digit. | ||
| - | // If entered number has less than 'numDigits' digits, do nothing and return back to the main loop. | ||
| - | // If '*' is entered, return back to the main loop immediately without waiting of 5-second timeout. | ||
| - | // After returning to mail loop one can enter the '#' again and make another attempt to enter the number to transfer the call. | ||
| - | // | ||
| - | function transferTo(numDigits) { | ||
| - | var buffer = ""; | ||
| - | if(!IsNumber(numDigits) || numDigits <= 0) {return null;} | ||
| - | for(var i = 0; i < numDigits; i += 1) { | ||
| - | var input = ReadInput(5); | ||
| - | doSysLog("transfer INPUT: " + (input.string() || "NULL")); | ||
| - | if(input == null || input == "*") { // return to the mail loop where one can make another attempt to enter #nnnn | ||
| - | return null; | ||
| - | } elif(IsDigit(input)) { | ||
| - | buffer += input; | ||
| - | } else { // unexpected event, for example, Disconnect or BreakBridge event | ||
| - | return input; | ||
| - | } | ||
| - | } | ||
| - | return buffer; // return the entered number with 'numDigits' digits | ||
| - | } | ||
| - | </code> | ||
| - | |||
| - | ==== 7.6 Роутинг SIP-звонков ==== | ||
| - | |||
| - | === Добавление маршрута для номерного плана на SIP шлюз === | ||
| - | <code> | ||
| - | Settings->Router | ||
| - | ... | ||
| - | S:<1(2d)@*> = 1*@192.168.1.3 ;smg1016 | ||
| - | |||
| - | S:<0X(3d)@*> = *@mail.corpX.un | ||
| - | ... | ||
| - | </code> | ||
| - | |||
| - | === Организация исходящих вызовов в PSTN через voip провайдера с аутентификацией === | ||
| - | <code> | ||
| - | Settings->Router | ||
| - | ... | ||
| - | |||
| - | <8(10d)@*> = 8*@telnum | ||
| - | <+7(10d)@*> = 8*@telnum | ||
| - | |||
| - | ;<+(7-20d)@*> = +*@telnum ; +nnnnn calls -> to telnum | ||
| - | ;... | ||
| - | ... | ||
| - | Signal:telnum = pstn ; unknown telnum -> PSTN | ||
| - | Signal:<*@pstn> = gatewaycaller{*}#pbx ; start 'gatewaycaller' app | ||
| - | ... | ||
| - | |||
| - | Users->Account Defaults->PSTN | ||
| - | или | ||
| - | Users->Domains->corpX.un->Account Defaults->PSTN | ||
| - | или | ||
| - | Users->Domains->corpX.un->Objects->user1->Real-Time->PSTN | ||
| - | |||
| - | Gateway Domain: voip1.un | ||
| - | Name for Gateway: 00000X | ||
| - | Password for Gateway: spasswordX | ||
| - | </code> | ||
| - | |||
| - | === Организация входящих вызовов из PSTN (регистрация на voip провайдере) === | ||
| - | <code> | ||
| - | Users->Domains->corpX.un->Objects->pbx->Real-Time->RSIP | ||
| - | Name: voip1 | ||
| - | Register Every: 5 min | ||
| - | Account: 00000X | ||
| - | at Host: voip1.un | ||
| - | Authentication Name: 00000X | ||
| - | Password: spasswordX | ||
| - | Target: | ||
| - | |||
| - | GETACCOUNTRSIPS pbx | ||
| - | 200 data follow | ||
| - | { | ||
| - | sipnet = { | ||
| - | authName = 00000X; | ||
| - | domain = voip1.un; | ||
| - | fromName = 00000X; | ||
| - | password = spasswordX; | ||
| - | period = 5m; | ||
| - | }; | ||
| - | } | ||
| - | |||
| - | |||
| - | Users->Domains->corpX.un->Objects->pbx->Real-Time->Incoming Call Rules->Edit | ||
| - | Redirect To is #pbx | ||
| - | </code> | ||
| ===== Вопросы ===== | ===== Вопросы ===== | ||
| Line 1476: | Line 1393: | ||
| # cat /var/CommuniGate/WebSkins/webcallback.wcgp | # cat /var/CommuniGate/WebSkins/webcallback.wcgp | ||
| + | |||
| + | !!! Только на уровне сервера !!! | ||
| </code><code> | </code><code> | ||
| entry sysEntry is | entry sysEntry is | ||
| Line 1552: | Line 1471: | ||
| </code> | </code> | ||
| - | ==== Использование интерфейса SMNP для мониторинга ==== | + | ==== Использование интерфейса SNMP для мониторинга ==== |
| * [[https://github.com/pdacity/cgp_snmp_zabbix|pdacity/cgp_snmp_zabbix]] | * [[https://github.com/pdacity/cgp_snmp_zabbix|pdacity/cgp_snmp_zabbix]] | ||
| Line 1563: | Line 1482: | ||
| ===== Дополнительные материалы ===== | ===== Дополнительные материалы ===== | ||
| + | ==== Русификация сообщений ==== | ||
| + | |||
| + | * https://www.communigate.ru/CommuniGatePro/russian/SysAdmin.html#Strings | ||
| ==== Миграция с MS Exchange на CGP ==== | ==== Миграция с MS Exchange на CGP ==== | ||
| <code> | <code> | ||
| Line 1685: | Line 1607: | ||
| Можно просто удалить account.info (и, желательно, перезапустить сервер, потоьу что содержимое может кэшироваться в памяти) Сервер потом сам перечитает папки и воссоздаст строчки для них. | Можно просто удалить account.info (и, желательно, перезапустить сервер, потоьу что содержимое может кэшироваться в памяти) Сервер потом сам перечитает папки и воссоздаст строчки для них. | ||
| </code> | </code> | ||
| + | |||
| + | ==== Перевод звонка без сопровождения (blind transfer) ==== | ||
| + | |||
| + | В приложении пример скрипта, реализующего b2bua в режиме бриджа (не миксера) и позволяющего с помощью DTMF команд выполнить перевод звонка без сопровождения (blind transfer). Данный скрипт воспринимает DTMF команды, посланные как SIP INFO запросы, а не в медиа канале (например, в hPronto на странице Preferences -> Dialer опцию "Sending Method" нужно установить в signal). | ||
| + | Если нужно, чтобы DTMF команды работали и в том случае, когда они посылаются в голосовом канале (rfc2833 или inband), то нужно подключать стороны через миксер, а не через бридж, для этого нужно немного модифицировать часть скрипта до вызова процедуры bridgedCallLoop(). | ||
| + | |||
| + | Пожалуйста, дайте нам знать, если потребуется помощь в модификации скрипта для подключения сторон с использованием миксера (чтобы обрабатывать DTMF, отправленные как inband или rfc2833). | ||
| + | |||
| + | Сам механизм перевода следующий. При установлении соединения каждый из участников может набрать #nnnn (4-значный номер), чтобы дать сигнал для перевода партнера на 4-значный номер nnnn. После удачного перевода инициатор перевода будет отсоединен. На набор каждой цифры номера дается не более 5 секунд. Если за это время не было введена цифра, то перевод не осуществляется и нужно будет заново набирать #nnnn для осуществления попытки перевода (см. комментарии в скрипте). Также в процессе набора номера, если уже ошиблись, можно набрать *, чтобы начать набор #nnnn заново. | ||
| + | |||
| + | Логику меню набора номера для перевода можно адаптировать. | ||
| + | |||
| + | Приложение b2bua-transfer.sppr нужно закачать в PBX окружение (в WebAdmin -> Users -> PBX). | ||
| + | Для направления звонков в это приложение лучше использовать серверное сигнальное правило, потому что при направлении через запись в маршрутизаторе нужно будет вводить префиксы, чтобы не было зацикливания. | ||
| + | |||
| + | Серверное сигнальное правило может выглядить примерно так: | ||
| + | |||
| + | <code> | ||
| + | Data | ||
| + | Operation IS INVITE | ||
| + | Call Type IS AV | ||
| + | Submit Address IS NOT LOCAL [0.0.0.0]* | ||
| + | Target Address IS sip:*@domain.name | ||
| + | |||
| + | Action | ||
| + | Redirect To b2bua-transfer#pbx@domain.name | ||
| + | Discard Rules | ||
| + | </code> | ||
| + | |||
| + | Здесь первые три условия стандартные, третье условие позволяет избежать зацикливания данного правила, так как оно не будет применяться для звонков, инициированных PBX приложением (то есть для вызова из исходящей ноги Caller приложения правило уже применяться не будет). | ||
| + | Далее нужно прописать набор условий (например, Target Address), которые будут задавать набор адресов отправителей и получателей звонка, для которых должно запускаться это приложение с логикой перевода через DTMF. В примере выше правило будет запускаться для всех номеров получателей в домене domain.name. | ||
| + | В логике скрипта можно дополнительно добавить проверку, чтобы пользоваться данными DTMF командами могли только локальные пользователи, а не внешние и т.п. | ||
| + | |||
| + | Скрипт приведен как пример, он тщательно не тестировался, но функционал трансфера проверили - работает. Если будут какие-либо ошибки или вопросы по его использованию, пожалуйста, обращайтесь. | ||
| + | |||
| + | <code> | ||
| + | // ================================================== // | ||
| + | // simple B2BUA application // | ||
| + | // supporting DTMF commands // | ||
| + | // ================================================== // | ||
| + | |||
| + | entry Caller forward; | ||
| + | procedure bridgedCallLoop(peerLeg) forward; | ||
| + | function transferTo(numDigits) forward; | ||
| + | procedure doSysLog(str) {SysLog("B2BUA: " + str);} | ||
| + | |||
| + | // | ||
| + | // ingress task entry | ||
| + | // | ||
| + | entry Main { | ||
| + | var callParams = NewDictionary(); | ||
| + | callParams.("") = LocalURI(); | ||
| + | callParams.fromName = RemoteRealName(); | ||
| + | callParams.From = RemoteURI(); | ||
| + | callParams.("Call-ID") = PendingRequestData("Call-ID") + ".b2b"; | ||
| + | callParams.("Max-Forwards") = PendingRequestData("Max-Forwards")-1; | ||
| + | callParams.customIdentity = ""; | ||
| + | |||
| + | doSysLog("callParams: " + callParams.objectToString()); | ||
| + | var peerLeg = spawn Caller(callParams); | ||
| + | if(!IsTask(peerLeg)) { | ||
| + | doSysLog("failed to spawn Caller task"); | ||
| + | RejectCall(peerLeg); stop; | ||
| + | } | ||
| + | |||
| + | var errorCode = StartBridge(peerLeg); | ||
| + | if(errorCode != null) { | ||
| + | void(SendEvent(peerLeg,"stop",errorCode)); | ||
| + | doSysLog("call failed: " + errorCode.string()); | ||
| + | RejectCall(errorCode); stop; | ||
| + | } | ||
| + | |||
| + | bridgedCallLoop(peerLeg); | ||
| + | stop; | ||
| + | } | ||
| + | |||
| + | // | ||
| + | // egress task entry | ||
| + | // | ||
| + | entry Caller { | ||
| + | var peerLeg = Vars().parent, callParams = Vars().startParameter, bridgeEvent,input,errorCode; | ||
| + | |||
| + | void(Impersonate(SIPURIToEmail(callParams.From))); | ||
| + | void(SignalOption("refer","peer")); | ||
| + | void(SignalOption("bridgeBreak","disconnect")); | ||
| + | |||
| + | bridgeEvent = ReadInput(10); | ||
| + | if(!IsStartBridgeEvent(bridgeEvent) || bridgeEvent.sender != peerLeg) {doSysLog("unexpected start event: " + bridgeEvent.objectToString()); stop;} | ||
| + | errorCode = StartBridgedCall(callParams,bridgeEvent); | ||
| + | | ||
| + | if(errorCode) {RejectBridge(bridgeEvent,errorCode); stop;} | ||
| + | |||
| + | while(true) { | ||
| + | input = ReadInput(3600); | ||
| + | exitif !IsCallProvisionEvent(input); | ||
| + | } | ||
| + | |||
| + | if((IsDictionary(input) && input.what == "stop") || IsBreakBridgeEvent(input)) {stop;} | ||
| + | if(!IsCallCompletedEvent(input)) { | ||
| + | doSysLog("unexpected event: " + input.objectToString()); | ||
| + | errorCode = "unexpected event"; | ||
| + | } elif(input.parameter != null) { | ||
| + | doSysLog("call failed: " + input.parameter); | ||
| + | errorCode = input.parameter; | ||
| + | } | ||
| + | if(errorCode) {RejectBridge(bridgeEvent,errorCode); stop;} | ||
| + | |||
| + | bridgedCallLoop(peerLeg); | ||
| + | stop; | ||
| + | } | ||
| + | |||
| + | // | ||
| + | // Main loop: processing events and DTMF commands in the connected state | ||
| + | // | ||
| + | procedure bridgedCallLoop(peerLeg) { | ||
| + | if(!IsTask(peerLeg)) {return;} | ||
| + | |||
| + | while(IsConnected()) { | ||
| + | var input = ReadInput(60); | ||
| + | doSysLog("main loop INPUT: " + (input.string() || "NULL")); | ||
| + | |||
| + | if(input == "#") { | ||
| + | input = transferTo(4); // after "#" enter 4-digit number to transfer the call to | ||
| + | if(IsString(input)) { | ||
| + | void(SendEvent(peerLeg,"peerTransfer",input + "@" + MyDomain())); | ||
| + | input = null; | ||
| + | } | ||
| + | } | ||
| + | | ||
| + | if(input == null) { | ||
| + | null; | ||
| + | | ||
| + | } elif(IsDictionary(input) && input.sender == peerLeg && input.what == "peerTransfer" && IsString(input.parameter)) { | ||
| + | var transferError = TransferCall(input.parameter); | ||
| + | if(transferError == null) { | ||
| + | doSysLog("call transferred to: " + input.parameter); | ||
| + | Disconnect(); | ||
| + | } else { | ||
| + | doSysLog("transfer failed: " + transferError.string()); | ||
| + | } | ||
| + | |||
| + | } elif(IsDisconnectEvent(input) || IsBreakBridgeEvent(input)) { | ||
| + | void(SendEvent(peerLeg,"stop","disconnected")); | ||
| + | Disconnect(); | ||
| + | |||
| + | } elif(IsDictionary(input) && input.what == "stop") { | ||
| + | Disconnect(); | ||
| + | |||
| + | } elif(IsString(input)) { | ||
| + | void(SendEvent(peerLeg,"dtmf",input)); | ||
| + | |||
| + | } elif(IsCallInfoEvent(input)) { | ||
| + | doSysLog("relaying INFO received: " + input.objectToString()); | ||
| + | void(SendEvent(peerLeg,"info",input.parameter)); | ||
| + | |||
| + | } elif(IsDictionary(input) && input.what == "dtmf") { | ||
| + | void(SendDTMF(input.parameter)); | ||
| + | |||
| + | } elif(IsDictionary(input) && input.what == "info") { | ||
| + | void(SendCallInfo(input.parameter)); | ||
| + | |||
| + | } else { | ||
| + | doSysLog("unknown event: " + input.objectToString()); | ||
| + | } | ||
| + | } | ||
| + | return; | ||
| + | } | ||
| + | |||
| + | // | ||
| + | // Entering a number with 'numDigits' digits, 5-second timeout to enter one digit. | ||
| + | // If entered number has less than 'numDigits' digits, do nothing and return back to the main loop. | ||
| + | // If '*' is entered, return back to the main loop immediately without waiting of 5-second timeout. | ||
| + | // After returning to mail loop one can enter the '#' again and make another attempt to enter the number to transfer the call. | ||
| + | // | ||
| + | function transferTo(numDigits) { | ||
| + | var buffer = ""; | ||
| + | if(!IsNumber(numDigits) || numDigits <= 0) {return null;} | ||
| + | for(var i = 0; i < numDigits; i += 1) { | ||
| + | var input = ReadInput(5); | ||
| + | doSysLog("transfer INPUT: " + (input.string() || "NULL")); | ||
| + | if(input == null || input == "*") { // return to the mail loop where one can make another attempt to enter #nnnn | ||
| + | return null; | ||
| + | } elif(IsDigit(input)) { | ||
| + | buffer += input; | ||
| + | } else { // unexpected event, for example, Disconnect or BreakBridge event | ||
| + | return input; | ||
| + | } | ||
| + | } | ||
| + | return buffer; // return the entered number with 'numDigits' digits | ||
| + | } | ||
| + | </code> | ||
| + | |||