This shows you the differences between two versions of the page.
Both sides previous revision Previous revision | |||
communigate_pro_new [2020/05/07 11:17] val удалено |
— (current) | ||
---|---|---|---|
Line 1: | Line 1: | ||
- | ====== Communigate Pro New ====== | ||
- | * [[http://www.communigate.com/ru/|Официальный сайт]] | ||
- | * [[https://www.communigate.ru/CommuniGatePro/russian/|Документация к платформе CommuniGate Pro и руководство Администратора]] | ||
- | * [[http://wiki.rsu.edu.ru/wiki/Communigate_Pro|Полнофункциональная система унифицированных коммуникаций (почта+телефония+IM) с защитой от вирусов, спама и нежелательного контента, с возможностью обучения фильтра пользователями]] | ||
- | ===== Модуль 1. Установка, интерфейс администрирования и запуск CGP ===== | ||
- | |||
- | ===== Теория ===== | ||
- | |||
- | * [[https://ru.wikipedia.org/wiki/CommuniGate_Pro|CommuniGate Pro - Википедия]] | ||
- | * [[http://ru.wikipedia.org/wiki/Унифицированные_коммуникации|Унифицированные коммуникации]] | ||
- | * Примеры больших клиентов ([[http://www.connect.ru/newsdetail.asp?id=6605|Tele2]], [[http://www.amby.ru/news-24.01.2006.html|SIPnet]]) | ||
- | * [[http://www.communigate.com/CommuniGatePro/russian/|Документация]] | ||
- | |||
- | ===== Лабораторные работы ===== | ||
- | |||
- | ==== 1.1 Схема стенда, настройка системы ==== | ||
- | |||
- | * 1Gb ОЗУ | ||
- | * [[Настройка стендов слушателей]] | ||
- | <code> | ||
- | hostname: mail.corpX.un | ||
- | ip/mask: 172.16.1.100+X/24 | ||
- | gate: 172.16.1.254 | ||
- | dns: 172.16.1.254 | ||
- | </code> | ||
- | |||
- | * [[Сервис NTP#Локализация временной зоны]] | ||
- | |||
- | ==== 1.2 Установка сервера ==== | ||
- | * [[http://www.communigate.ru/main/purchase/download.html|Скачать дистрибутив]] | ||
- | * [[ftp://ftp.communigate.ru/pub/CommuniGatePro/]] | ||
- | |||
- | === Debian/Ubuntu === | ||
- | <code> | ||
- | # wget http://www.communigate.ru/pub/CommuniGatePro/CGatePro-Linux_amd64.deb | ||
- | |||
- | # dpkg -i CGatePro*.deb | ||
- | |||
- | # service CommuniGate start | ||
- | |||
- | # cat /var/CommuniGate/ProcessID | ||
- | </code> | ||
- | |||
- | === Для любого Linux === | ||
- | <code> | ||
- | # wget ftp://www.communigate.com/pub/CommuniGatePro/6.1/CGatePro-Linux-Intel-616.tgz | ||
- | |||
- | # tar -xvf CGatePro-Linux-Intel.tgz | ||
- | |||
- | # mv CGateProSoftware/ /opt | ||
- | |||
- | # CGateProSoftware/CommuniGate/CGServer-static --Base /var/CommuniGate --LogAll | ||
- | |||
- | # cat /var/CommuniGate/ProcessID | ||
- | </code> | ||
- | |||
- | * [[Управление сервисами в Linux#Пример файла конфигурации для запуска/остановки сервиса]] | ||
- | |||
- | <code> | ||
- | # service communigate start | ||
- | </code> | ||
- | |||
- | ==== 1.3 Первоначальная настройка ==== | ||
- | |||
- | * [[http://172.16.1.100+X:8010]] | ||
- | |||
- | <code> | ||
- | Postmaster Password: xxxxxx | ||
- | Main Domain Name: corpX.un | ||
- | Time Zone: Europa/Moscow | ||
- | Interface: Expert | ||
- | |||
- | # cat /var/CommuniGate/Settings/Main.settings | ||
- | |||
- | Settings->Network->Blacklisted IPs->UnBlacklistable (White Hole) IP Addresses: 172.16.1.0/24 | ||
- | |||
- | # cat /var/CommuniGate/Settings/WhiteHoles.data | ||
- | </code> | ||
- | |||
- | ==== 1.4 Тестирование работоспособности почтовой подсистемы ==== | ||
- | |||
- | <code> | ||
- | # file /usr/bin/mail | ||
- | /usr/bin/mail: symbolic link to /opt/CommuniGate/mai | ||
- | |||
- | # echo Hello | mail -s Hello postmaster@localhost | ||
- | |||
- | # cat /var/CommuniGate/Accounts/postmaster.macnt/INBOX.mbox | ||
- | |||
- | или | ||
- | |||
- | # cat /var/CommuniGate/Accounts/postmaster.macnt/INBOX.mslc/data1 | ||
- | </code> | ||
- | |||
- | ===== Вопросы ===== | ||
- | |||
- | - Откуда берет название Stalker Software - компания разработчик Communigate? :) | ||
- | - Какая функциональность, по утверждению разработчиков, должна присутствовать в системе, что бы на нее можно было портировать Communigate? | ||
- | - Что необходимо сделать сразу после первого запуска только что установленного сервера Communigate? | ||
- | - Какие форматы почтовых ящиков поддерживает Communigate, в чем их достоинства и недостатки? | ||
- | |||
- | ===== Модуль 2. Управление учетными записями ===== | ||
- | |||
- | ===== Теория ===== | ||
- | |||
- | * [[https://ru.wikipedia.org/wiki/%D0%A3%D1%87%D1%91%D1%82%D0%BD%D0%B0%D1%8F_%D0%B7%D0%B0%D0%BF%D0%B8%D1%81%D1%8C|Учётная запись - Википедия]] | ||
- | * Форматы почтовых ящиков: [[https://ru.wikipedia.org/wiki/Mbox|Mbox]], [[https://ru.wikipedia.org/wiki/Maildir|Maildir]] | ||
- | * [[http://www.communigate.com/cgatepro/russian/Mailboxes.html|Папки Communigate]] | ||
- | * [[http://www.stalker.com/CommuniGatePro/russian/CLI.html|Интерфейс Командной Строки / API]] | ||
- | |||
- | ===== Лабораторные работы ===== | ||
- | |||
- | ==== 2.1 Иерархия параметров конфигурации Communigate ==== | ||
- | |||
- | * Можно показать для настройки Language | ||
- | * Настройки по умолчанию: для сервера, для домена (основного и дополнительных), для шаблона, для пользователя | ||
- | <code> | ||
- | Users->Account Defaults->Mail Settings->Mailbox Storage->New Mailbox Format: Sliced | ||
- | # cat /var/CommuniGate/Settings/DomainDefault.settings | ||
- | |||
- | Users->Domains->corpX.un->Account Defaults->Mail Settings->Mailbox Storage->New Mailbox Format: Sliced | ||
- | # cat /var/CommuniGate/Accounts/Settings/domain.settings | ||
- | |||
- | Users->Domains->corpX.un->Objects->Template->Mail Settings->Mailbox Storage->New Mailbox Format: Sliced | ||
- | # cat /var/CommuniGate/Accounts/Settings/template.settings | ||
- | |||
- | Users->Domains->corpX.un->Objects->postmaster->Mail->Mailbox Storage->New Mailbox Format: Sliced | ||
- | # cat /var/CommuniGate/Accounts/postmaster.macnt/account.settings | ||
- | </code> | ||
- | |||
- | ==== 2.2 Создание учетной записи через интерфейс администратора ==== | ||
- | |||
- | <code> | ||
- | Users->Domains->corpX.un->Objects-> | ||
- | |||
- | Create Account: user1 | ||
- | Real Name: Иван Иванович Иванов | ||
- | CommuniGate Password: cpassword1 | ||
- | |||
- | # ls /var/CommuniGate/Accounts/user1.macnt/ | ||
- | </code> | ||
- | |||
- | Задание: назначить учетной записи postmaster свое ФИО, должность, телефон ... | ||
- | |||
- | ==== 2.3 Создание учетной записи через CLI ==== | ||
- | |||
- | * [[http://communigate.com/communigatepro/russian/CLI.html|Интерфейс Командной Строки / API]] | ||
- | |||
- | <code> | ||
- | shell> telnet localhost 106 | ||
- | |||
- | или | ||
- | |||
- | shell> nc localhost 106 | ||
- | </code><code> | ||
- | USER postmaster | ||
- | |||
- | PASS Pa$$w0rd | ||
- | |||
- | NOTIMEOUT | ||
- | |||
- | LISTACCOUNTS corpX.un | ||
- | |||
- | GETACCOUNTSETTINGS user1 | ||
- | |||
- | GETACCOUNTDEFAULTS corpX.un | ||
- | |||
- | GETACCOUNTEFFECTIVESETTINGS user1 | ||
- | |||
- | GETACCOUNTINFO user1 | ||
- | |||
- | CREATEACCOUNT user2 {Password = "cpassword2";RealName = "Петр Петрович Петров";} | ||
- | |||
- | QUIT | ||
- | </code> | ||
- | |||
- | ==== 2.4 Создание учетной записи из внешней программы ==== | ||
- | |||
- | **Примечание**: демонстрирует преподаватель | ||
- | |||
- | * Perl [[Язык программирования Perl#Пример 5]] | ||
- | |||
- | ==== 2.5 Создание пользователей с помощью текстового файла ==== | ||
- | |||
- | **Примечание**: | ||
- | - использовать кодировку utf-8 и табуляцию между столбцами | ||
- | - удалить пользователей по окончании работы | ||
- | - добавить символ новой строки в конце файла | ||
- | <code> | ||
- | Name RealName Password | ||
- | user3 Сидор Сидорович Сидоров cpassword3 | ||
- | user4 Василий Муркович Кошкин cpassword4 | ||
- | </code> | ||
- | |||
- | ==== 2.6 Управление дополнительным доменами в CGP ==== | ||
- | |||
- | === Настройка дополнительного ip адреса (ip alias) в ОС === | ||
- | |||
- | * [[Настройка сети в Linux#Статическая настройка параметров]] (потребуется перезапуск CGP) | ||
- | |||
- | === Создаем новый домен === | ||
- | <code> | ||
- | Users->Domains->CreateDomain->compX.un | ||
- | |||
- | Users->Domains->compX.un->Domain Settings->Domain Aliases: mail.compX.un | ||
- | </code> | ||
- | |||
- | === Создаем пользователя в новом домене и назначаем ему права администратора === | ||
- | <code> | ||
- | Users->Domains->compX.un->Objects->Create Account: user3 | ||
- | |||
- | Real Name: Сидоров Сидор Сидорович | ||
- | CommuniGate Password: cpassword3 | ||
- | |||
- | Users->Domains->compX.un->Objects->user3->Settings-> | ||
- | Access Rights->Can Modify This Domain and its Accounts Settings | ||
- | !!!И Все галочки TABом и пробелом!!! | ||
- | |||
- | # less /var/CommuniGate/Domains/compX.un/Settings/access.settings | ||
- | |||
- | GETACCOUNTINFO user3@compX.un | ||
- | </code> | ||
- | |||
- | === Для будущей поддержки SSL/TLS привязываем домены к разным адресам сервера === | ||
- | <code> | ||
- | Users->Domains->compX.un->Domain Settings->Assigned IP Addresses->[172.16.1.200+X] | ||
- | |||
- | Users->Domains->corpX.un->Domain Settings->Assigned IP Addresses->[172.16.1.100+X], [127.0.0.1] | ||
- | </code> | ||
- | |||
- | === Логинемся как user3 из домена compX.un и управляем доменом === | ||
- | <code> | ||
- | http://172.16.1.200+X:8010/ | ||
- | </code> | ||
- | |||
- | ===== Вопросы ===== | ||
- | |||
- | - По какой причине учетная запись администратора Communigate называется postmaster? | ||
- | - Перечислите способы создания учетных записей в Communigate. | ||
- | - Перечислите уровни конфигурации на которых можно определить параметры учетной записи. | ||
- | - Что нужно сделать, что бы делегировать права управления доменом отдельному администратору? | ||
- | |||
- | ===== Модуль 3. Настройка интерфейсов пользователей ===== | ||
- | |||
- | ===== Теория ===== | ||
- | |||
- | * [[https://ru.wikipedia.org/wiki/%D0%A2%D0%BE%D0%BB%D1%81%D1%82%D1%8B%D0%B9_%D0%BA%D0%BB%D0%B8%D0%B5%D0%BD%D1%82|Толстый клиент - Википедия]] | ||
- | * Протоколы доступа к почтовым ящикам: [[https://ru.wikipedia.org/wiki/POP3|POP3]] и [[https://ru.wikipedia.org/wiki/IMAP|IMAP]] | ||
- | * Протокол доступа к каталогам данных [[https://ru.wikipedia.org/wiki/LDAP|LDAP]] | ||
- | * Протокол для работы с почтой/календарями/контактами/задачами [[https://ru.wikipedia.org/wiki/ActiveSync|ActiveSync]] | ||
- | |||
- | * [[https://ru.wikipedia.org/wiki/%D0%92%D0%B5%D0%B1-%D0%BF%D1%80%D0%B8%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5|Веб-приложение - Википедия]] | ||
- | * [[https://www.communigate.com/Communigatepro/russian/WebApp.html|Веб Приложения Communigate]] | ||
- | * [[http://www.communigate.com/ru/guide/HTTP.html|HTTP Модули Communigate]] | ||
- | * Универсальный протокол для работы с сервером Communigate [[https://en.wikipedia.org/wiki/XIMSS|XIMSS]] | ||
- | |||
- | ===== Лабораторные работы ===== | ||
- | |||
- | ==== 3.1 Создание сертификата TLS для доменов ==== | ||
- | |||
- | === Настройка DNS === | ||
- | <code> | ||
- | mail.corpX.un. A 172.16.1.100+X | ||
- | |||
- | mail.compX.un. A 172.16.1.200+X | ||
- | </code> | ||
- | |||
- | === Сертификат для домена corpX.un === | ||
- | <code> | ||
- | Users->Domains->corpX.un->Security->SSL/TLS | ||
- | </code><code> | ||
- | PKI Services: Enable | ||
- | </code><code> | ||
- | Private Key | ||
- | Key Size: 1024 | ||
- | </code><code> | ||
- | Generate Key | ||
- | Certificate Generator | ||
- | Common Name: mail.corpX.un | ||
- | Country: RU | ||
- | State/Province: Moscow region | ||
- | City: Mosсow | ||
- | Organization: cko | ||
- | Unit: noc | ||
- | Contact: postmaster@corpX.un | ||
- | </code><code> | ||
- | Generate Self Signed | ||
- | </code> | ||
- | |||
- | === Сертификат для домена compX.un === | ||
- | <code> | ||
- | Безопасность->SSL/TLS->Генератор Сертификатов->Имя-Идентификатор: mail.compX.un | ||
- | </code> | ||
- | |||
- | ==== 3.2 Подключение почтовых клиентов ==== | ||
- | |||
- | === По протоколу POP3 === | ||
- | |||
- | * [[Протокол POP3]] | ||
- | |||
- | === По протоколам SMTP и IMAP === | ||
- | |||
- | * Развернуть систему client1 | ||
- | * [[https://mail.bmstu.ru/~val@bmstu.ru/5.Dostup_k_serveru_s_ispol'zovaniem_pochtovogo_klienta_Mozilla_Thunderbird.pdf|Доступ к серверу с использованием почтового клиента Mozilla Thunderbird]] | ||
- | * [[Thunderbird#Назначение папок]] | ||
- | |||
- | === По протоколам MS Exchange и Active Sync === | ||
- | |||
- | * Работу выполнять на host системе | ||
- | * Имя пользователя указывать полностью, с доменом | ||
- | * [[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]] | ||
- | |||
- | ==== 3.3 Использование общей адресной книги по протоколу LDAP ==== | ||
- | |||
- | === Через интерфейс администратора === | ||
- | <code> | ||
- | Directory->Browser | ||
- | </code> | ||
- | |||
- | === Из командной строки === | ||
- | |||
- | **Примечание**: демонстрирует преподаватель | ||
- | |||
- | Чтение данных с аутентификацией | ||
- | |||
- | * [[Авторизация с использованием LDAP сервера#Установка сертификатов]] | ||
- | |||
- | <code> | ||
- | # ldapsearch -x -D "user1@corpX.un" -W -b"cn=corpX.un" -H ldaps://mail.corpX.un:636 | ||
- | </code> | ||
- | |||
- | Чтение данных без аутентификации | ||
- | |||
- | <code> | ||
- | Directory->Access Rights | ||
- | |||
- | Name: ReadAll | ||
- | Bind DN: anyone вместо uid=* | ||
- | </code><code> | ||
- | # ldapsearch -x -b"cn=corpX.un" -H ldap://mail.corpX.un:389 | ||
- | </code> | ||
- | |||
- | * Добавление атрибутов | ||
- | <code> | ||
- | Directory->Units->Main->Schema | ||
- | |||
- | Users->Directory Integration | ||
- | Public Info: telephoneNumber | ||
- | </code> | ||
- | |||
- | === Подключение адресной книги к почтовому клиенту === | ||
- | |||
- | * [[Thunderbird#Получение списка контактов через LDAP]] | ||
- | |||
- | ==== 3.4 Подключение через web интерфейс ==== | ||
- | |||
- | === Базовая конфигурация веб интерфейсов === | ||
- | <code> | ||
- | Users->Domains->corpX.un->Domain Settings->Domain Aliases: mail.corpX.un | ||
- | |||
- | Settings->Services->HTTPU->Listener | ||
- | Port 80 Init SSL/TLS Off | ||
- | Port 443 Init SSL/TLS On | ||
- | |||
- | # cat /var/CommuniGate/Settings/HTTPU.settings | ||
- | </code> | ||
- | |||
- | === Выбор интерфейса и локализация пользователя === | ||
- | |||
- | **Примечание**: при первом подключении установить само подписанный сертификат в базу данных доверенных сертификатов серверов в firefox | ||
- | |||
- | <code> | ||
- | Users->Account Defaults->Preferences | ||
- | Users->Domains->corpX.un->Account Defaults->Preferences | ||
- | Users->Domains->corpX.un->Objects->postmaster->Preferences | ||
- | |||
- | Language: Russian | ||
- | Layout: Basic|Crystal|Pronto Flash(Pronto4)|hPronto(Pronto) | ||
- | |||
- | Пользователи->Домены->corpX.un->Объекты->postmaster->Настройки->Язык: ...(English) | ||
- | </code> | ||
- | |||
- | ==== 3.5 Управление подключениями ==== | ||
- | <code> | ||
- | Monitors->Access->Sessions | ||
- | |||
- | KILLACCOUNTSESSIONS user1 | ||
- | </code> | ||
- | |||
- | ==== 3.6 Персонализация интерфейса для компании ==== | ||
- | |||
- | === Заменяем логотип в basic (корневом) интерфейсе === | ||
- | <code> | ||
- | На уровне сервера: | ||
- | Users->Skins | ||
- | |||
- | На уровне домена: | ||
- | Users->Domains->corpX.un->Skins | ||
- | |||
- | Create Custom Unnamed Skin | ||
- | |||
- | Upload File: logo.gif | ||
- | |||
- | # ls /opt/CommuniGate/WebSkins/ | ||
- | |||
- | # ls /var/CommuniGate/WebSkins/logo.gif | ||
- | # ls /var/CommuniGate/Accounts/WebSkins/logo.gif | ||
- | </code> | ||
- | |||
- | === Заменяем логотип в hpronto интерфейсе === | ||
- | <code> | ||
- | # find /opt/CommuniGate/WebSkins/ -type d | ||
- | |||
- | Named Skins: Create: hPronto- | ||
- | |||
- | Upload File: logo-big-fresh.png | ||
- | </code> | ||
- | |||
- | === Заменяем строку в тесте === | ||
- | <code> | ||
- | # ls /var/CommuniGate/Accounts/WebSkins/russian.data | ||
- | </code><code> | ||
- | ... | ||
- | LoginTag1 = "..."; | ||
- | LoginTag2 = "..."; | ||
- | ... | ||
- | </code> | ||
- | |||
- | **Дополнительное задание**: Сделать то же самое через пользовательский интерфейс postmaster | ||
- | |||
- | === Создаем свой skin и добавляем какую-нибудь совершенно новую ссылку в интерфейс === | ||
- | <code> | ||
- | Users->Domains->corpX.un->Skins->Named Skins->Create: mySkin | ||
- | |||
- | # cat /var/CommuniGate/Accounts/WebSkins/mySkin/navigation.wssi | ||
- | </code><code> | ||
- | ... | ||
- | <td nowrap="nowrap"><a href="mailbox.wssp?mailbox=INBOX&">%%HTML:SETTINGS("InboxDisplay")%%</a></td> | ||
- | <td nowrap="nowrap"><a href="mailbox.wssp?mailbox=Sent Items&">Sent Items</a></td> | ||
- | ... | ||
- | </code> | ||
- | |||
- | ===== Вопросы ===== | ||
- | |||
- | - Что необходимо сделать для включения поддержки SSL/TLS в Communigate? | ||
- | - Какие протоколы поддерживает Communigate для работы с почтовыми клиентами, какими особенностями они обладают? | ||
- | - Какие способы работы с адресной книгой предоставляет Communigate для почтовых клиентов? | ||
- | - Перечислите основные варианты Web интерфейсов для пользователей Communigate. | ||
- | - В какой папке должны хранится элементы персонализации Web интерфейса компании? | ||
- | |||
- | ===== Модуль 4. Маршрутизация почты и борьба со SPAMом ===== | ||
- | |||
- | ===== Теория ===== | ||
- | |||
- | * [[https://ru.wikipedia.org/wiki/%D0%AD%D0%BB%D0%B5%D0%BA%D1%82%D1%80%D0%BE%D0%BD%D0%BD%D0%B0%D1%8F_%D0%BF%D0%BE%D1%87%D1%82%D0%B0|Электронная почта - Википедия]] | ||
- | * [[https://ru.wikipedia.org/wiki/SMTP|SMTP - Википедия]] | ||
- | * [[https://ru.wikipedia.org/wiki/Спам|Спам - Википедия]] | ||
- | |||
- | |||
- | * [[http://ru.wikipedia.org/wiki/Серый_список]] | ||
- | * RFC 2821 4.5.4.1 ([[http://rfc.com.ru/rfc2821.htm]]) | ||
- | |||
- | ===== Лабораторные работы ===== | ||
- | |||
- | ==== 4.1 Протокол SMTP ==== | ||
- | |||
- | === Настройка DNS === | ||
- | <code> | ||
- | mail.corpX.un. A 172.16.1.100+X | ||
- | |||
- | corpX.un. MX 10 mail.corpX.un. | ||
- | |||
- | mail.corpX.un. A 172.16.1.200+X | ||
- | |||
- | compX.un. MX 10 mail.corpX.un. | ||
- | </code> | ||
- | |||
- | === Пример диалога === | ||
- | |||
- | * [[Сервис MTA#Протокол SMTP]] | ||
- | <code> | ||
- | $ gate.isp.un$ mail postmaster@corpX.un | ||
- | </code> | ||
- | |||
- | === Почтовый relay для локальной сети === | ||
- | |||
- | * Продемонстрировать отправку письма в thunderbird без аутентификации из локальной сети на внешний ящик | ||
- | |||
- | <code> | ||
- | # cat /var/CommuniGate/Settings/WhiteHoles.data | ||
- | |||
- | Settings->Network->Client IPs: | ||
- | |||
- | !172.16.1.254 | ||
- | 172.16.1.0/24 | ||
- | </code> | ||
- | |||
- | ==== 4.2 Использование встроенных средств CGP для борьбы со SPAMом ==== | ||
- | |||
- | * [[http://systemzone.ru/misc/sommunigate/522-ispolzovanie-vstroennyx-vozmozhnostej-communigate-pro-dlya-borby-so-spamom.html|Использование встроенных возможностей CommuniGate Pro для борьбы со спамом]] | ||
- | |||
- | === Настройка параметров приемника SMTP === | ||
- | <code> | ||
- | Settings->Mail->SMTP->Receiving | ||
- | Verify | ||
- | Return-Path for: ... | ||
- | Check SPF records: ... | ||
- | Non-Client Sender | ||
- | Delay Prompt for: 10 | ||
- | </code><code> | ||
- | gate.isp.un% mail user1@corpX.un | ||
- | |||
- | gate.isp.un% tail -f /var/log/maillog | ||
- | </code> | ||
- | |||
- | === Технология Honeypot === | ||
- | <code> | ||
- | Settings->Router | ||
- | ... | ||
- | <director> = spamtrap | ||
- | ... | ||
- | |||
- | gate.isp.un% mail user1@corpX.un director@corpX.un | ||
- | </code> | ||
- | |||
- | ==== 4.3 Использование внешних фильтров для борьбы с вирусами и SPAMом ==== | ||
- | |||
- | Сейчас, если вы используете какой-нибудь из наших плагинов (Cloudmark иди SpamCatcher), то в файле hPronto-/strings.data в строках SpamFalseNegativeReportEmail и SpamFalsePositiveReportEmail можете указать адреса, куда перенаправлять неправильно определённые письма, например как в <http://www.communigate.com/CGPSpamCatcher/#rprt> | ||
- | Тогда в hPronto появятся кнопки для этого. | ||
- | |||
- | * [[http://program.farit.ru/doc/cgpav-rus.html|Clamav, SpamAssassin внешний фильтр для CommuniGate Pro]] | ||
- | |||
- | === Развертывание антивируса === | ||
- | * [[Сервис Clamav]] | ||
- | * [[http://media.kaspersky.com/utilities/ConsumerUtilities/eicar.zip|eicar.zip]] | ||
- | <code> | ||
- | # usermod -G mail clamav | ||
- | |||
- | # service clamav-daemon restart | ||
- | |||
- | # clamdscan /var/CommuniGate/eicar.zip | ||
- | </code> | ||
- | |||
- | === Развертывание антиспама === | ||
- | |||
- | * [[Защита почты от вирусов и SPAMа#Технология взвешенной оценки]] на принадлежность письма к SPAMу | ||
- | |||
- | <code> | ||
- | # cat /etc/default/spamassassin | ||
- | </code><code> | ||
- | ... | ||
- | OPTIONS="-m 10 -x -q -u mail -i 127.0.0.1 -p 783" | ||
- | ... | ||
- | </code> | ||
- | |||
- | === Сборка программы Helper === | ||
- | |||
- | * Управление ПО в Linux, [[Управление ПО в Linux#Работа с исходными текстами]] | ||
- | <code> | ||
- | # wget http://program.farit.ru/antivir/cgpav-1.4.tar.gz | ||
- | |||
- | # tar -xvf cgpav-1.4.tar.gz | ||
- | |||
- | # cd cgpav-1.4/ | ||
- | |||
- | # ./configure --with-antivirus=clamav --with-spamassassin=yes --with-cgpro_dir=/var/CommuniGate | ||
- | |||
- | # make && make install | ||
- | |||
- | # cat /var/CommuniGate/Settings/cgpav.conf | ||
- | </code><code> | ||
- | ... | ||
- | # не добавляется, если письмо распознано как SPAM | ||
- | add_not_infected_header = true | ||
- | ... | ||
- | clamd_socket = /var/run/clamav/clamd.ctl | ||
- | ... | ||
- | enable_spamassassin = true | ||
- | ... | ||
- | spam_scan_local = true | ||
- | ... | ||
- | spamassassin_socket_type = tcp | ||
- | ... | ||
- | </code><code> | ||
- | # /var/CommuniGate/cgpav | ||
- | 1 FILE eicar.zip | ||
- | 1 DISCARD | ||
- | </code> | ||
- | |||
- | === Подключение хелпера к CGP === | ||
- | <code> | ||
- | Settings->General->Helpers->Content Filtering | ||
- | Enabled: ClamSpam | ||
- | Program Path: /var/CommuniGate/cgpav | ||
- | </code><code> | ||
- | # ps ax | grep cgpav | ||
- | </code> | ||
- | |||
- | === Включение хелпера с помощью глобальных правил обработки почты === | ||
- | <code> | ||
- | Settings->Mail->Rules | ||
- | Name: ClamSpam | ||
- | Action: ExternalFilter | ||
- | Parameter: ClamSpam | ||
- | </code> | ||
- | |||
- | === Настройка правила для перемещения SPAM писем в папку администратора домена === | ||
- | |||
- | !!! Заработало только на уровне сервера, поправить !!! | ||
- | |||
- | <code> | ||
- | GETSERVERMAILRULES | ||
- | |||
- | SETDOMAINMAILRULES corp1.un ((5,spam,(("Header Field", is, "X-Spam-Status: Yes*")),(("Store in", "~postmaster/spam"), (Discard)))) | ||
- | |||
- | GETDOMAINMAILRULES corpX.un | ||
- | </code><code> | ||
- | 200 data follow | ||
- | ( | ||
- | ( | ||
- | 5, | ||
- | spam, | ||
- | (("Header Field", is, "X-Spam-Status: Yes*")), | ||
- | (("Store in", "~postmaster/spam"), (Discard)) | ||
- | ) | ||
- | ) | ||
- | </code> | ||
- | ==== 4.4 Использование CGP в качестве пограничного сервера ==== | ||
- | |||
- | Для домена compX пользователи которого заведены на сервере преподавателя | ||
- | |||
- | <code> | ||
- | Settings->Router | ||
- | ... | ||
- | <*@compX.un> = *%compX.un@mail.isp.un.25.via | ||
- | ... | ||
- | </code> | ||
- | |||
- | ===== Вопросы ===== | ||
- | |||
- | - Что используется в протоколе SMTP для поиска IP адреса сервера назначения? | ||
- | - Что означает термин relay в электронной почте? | ||
- | - Перечислите технологии борьбы со SPAM, доступные в Communigate. | ||
- | - Какой механизм используется для подключения внешних программ обработки писем в Communigate? | ||
- | ===== Модуль 5. Использование Communigate для совместной работы ===== | ||
- | |||
- | ===== Теория ===== | ||
- | |||
- | * [[https://ru.wikipedia.org/wiki/%D0%9F%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%BD%D0%BE%D0%B5_%D0%BE%D0%B1%D0%B5%D1%81%D0%BF%D0%B5%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81%D0%BE%D0%B2%D0%BC%D0%B5%D1%81%D1%82%D0%BD%D0%BE%D0%B9_%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%8B|Программное обеспечение совместной работы - Википедия]] | ||
- | * [[https://ru.wikipedia.org/wiki/%D0%A1%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D0%B0_%D0%BC%D0%B3%D0%BD%D0%BE%D0%B2%D0%B5%D0%BD%D0%BD%D0%BE%D0%B3%D0%BE_%D0%BE%D0%B1%D0%BC%D0%B5%D0%BD%D0%B0_%D1%81%D0%BE%D0%BE%D0%B1%D1%89%D0%B5%D0%BD%D0%B8%D1%8F%D0%BC%D0%B8|Система мгновенного обмена сообщениями - Википедия]] | ||
- | * Протокол обмена сообщениями и информацией о присутствии [[https://ru.wikipedia.org/wiki/XMPP|XMPP - Википедия]] | ||
- | * Протокол для поддержки удаленной работы с файлами (в том числе с календарями и задачами) на серверах [[https://ru.wikipedia.org/wiki/WebDAV|WebDAV - Википедия]] | ||
- | |||
- | |||
- | ===== Лабораторные работы ===== | ||
- | |||
- | ==== 5.1 Организация групповых почтовых адресов ==== | ||
- | |||
- | === Использование списков рассылки и серверных правил === | ||
- | |||
- | По окончании тестирования, удалить правила и список рассылки | ||
- | |||
- | * Создаем группу group1 с пользователями user1 и user2 | ||
- | <code> | ||
- | Set Reply-To to Group: no | ||
- | </code> | ||
- | |||
- | * Создаем правила, меняющие заголовок для писем в группу, и заменяющие Reply-To для писем из группы | ||
- | |||
- | <code> | ||
- | GETSERVERMAILRULES | ||
- | </code><code> | ||
- | 200 data follow | ||
- | ( | ||
- | ( | ||
- | 6, | ||
- | mark_to_group1, | ||
- | ((Subject, "is not", "*[group1]*"), ("Any To or Cc", is, "*group1@corpX*")), | ||
- | (("Tag Subject", "[group1] ")), | ||
- | "Помечаем тему всех писем, идущих в группу" | ||
- | ), | ||
- | ( | ||
- | 4, | ||
- | replace_from_group1, | ||
- | ((Subject, is, "*[group1]*"), (To, "is not", "*group1@corpX*")), | ||
- | (("Add Header", "Reply-To: group1@corpX.un")), | ||
- | "Устанавливаем Reply-To в группу для всех ответов из группы" | ||
- | ) | ||
- | ) | ||
- | </code> | ||
- | |||
- | === Использование общих папок и прав доступа к ним === | ||
- | |||
- | * user1: | ||
- | <code> | ||
- | Папки->Создать->Почтовый Ящик->group1 | ||
- | |||
- | Папки->pubic1->Управление Папкой | ||
- | |||
- | Идентификатор->user2->Все галочки (задание для слушателей - найти описание прав в справке) | ||
- | </code> | ||
- | |||
- | * user2: | ||
- | <code> | ||
- | Папки->Управление->Псевдонимы Папок | ||
- | |||
- | Имя Псевдонима: group1 | ||
- | Имя Папки: ~user1/group1 | ||
- | </code> | ||
- | |||
- | === Использование расширеного формата почтовых адресов === | ||
- | <code> | ||
- | gate.isp.un% mail group1#user1@corpX.un | ||
- | |||
- | mail.corpX.un# echo Hello | mail -s Hello group1#user1@corpX.un | ||
- | </code> | ||
- | |||
- | === Преобразование адресов правилами маршрутизации === | ||
- | |||
- | Направление публичной почты в соответствующий ящик | ||
- | |||
- | По окончании тестирования, правило удалить | ||
- | <code> | ||
- | Settings->Router | ||
- | ... | ||
- | <group1@corpX.un> = group1#user1@corpX.un | ||
- | ... | ||
- | </code> | ||
- | |||
- | === Применение пользовательских правил для управления почтой === | ||
- | |||
- | * Создание алиаса | ||
- | |||
- | <code> | ||
- | Users->Domains-corpX.un->Objects->user1->Settings | ||
- | Aliases: group1 | ||
- | </code> | ||
- | |||
- | * От имени user1 создаем правила: | ||
- | |||
- | <code> | ||
- | Управление Почтой | ||
- | Добавить Правило: Move to group1 | ||
- | Изменить | ||
- | Любой Кому/Копия: равно *group1* | ||
- | Записать в: group1 | ||
- | Выбросить | ||
- | </code> | ||
- | ==== 5.2 Электронная подпись и шифрование S/MIME ==== | ||
- | |||
- | * Устанавливаем в базу данных доверенных сертификатов серверов в Thunderbird само подписанный сертификат CGP | ||
- | |||
- | Пользователь user1 создает у себя в интерфейсе сертификат для подписи и шифрования и отправляет подписанное письмо по адресу postmaster@corpX.un | ||
- | |||
- | Подделать текст письма можно: | ||
- | <code> | ||
- | # vim /var/CommuniGate/Accounts/postmaster.macnt/INBOX.mbox | ||
- | </code> | ||
- | |||
- | ==== 5.3 IM and Presence ==== | ||
- | |||
- | * [[Thunderbird#Настройка учетной записи XMPP]] в Thunderbird | ||
- | |||
- | ==== 5.4 Общие календари и задания ==== | ||
- | |||
- | ==== 5.5 Использование облачного хранилища ==== | ||
- | |||
- | * Settings->Services->HTTPU->Request Size Limit: unlimited | ||
- | * [[https://mail.bmstu.ru/~val/7.Ispolzovanie_setevogo_diska.pdf|Использование облачного хранилища]] | ||
- | |||
- | ==== 5.6 Перлюстрация писем ==== | ||
- | |||
- | Задача: Предоставить доступ администратора (postmaster) к ящикам пользователей | ||
- | <code> | ||
- | Folders->Management->Folder Aliases | ||
- | |||
- | Open Folder: ~user1/Sent Items | ||
- | </code> | ||
- | |||
- | Задача: сохранять всю исходящую почту в особой папке у системного администратора или у сотрудника, отвечающего за безопасность. | ||
- | |||
- | * [[http://www.communigate.com/CommuniGatePro/russian/HowTo.html#StoreAll]] | ||
- | |||
- | ===== Вопросы ===== | ||
- | |||
- | - Перечислите способы организации групповых адресов в Communigate. | ||
- | - Что можно использовать в Communigate для гарантии достоверности и шифрования сообщений? | ||
- | - Какой протокол поддерживает Communigate для подключения внешних программных клиентов мгновенных сообщений и статуса абонента? | ||
- | - Какой протокол поддерживает Communigate для подключения внешних программных клиентов для работы с календарями? | ||
- | |||
- | ===== Модуль 6. Интеграция с внешними системами ===== | ||
- | |||
- | ===== Теория ===== | ||
- | |||
- | * Протоколы идентификации пользователей ([[https://ru.wikipedia.org/wiki/Аутентификация|Аутентификация]], [[https://ru.wikipedia.org/wiki/Авторизация|Авторизация]]) | ||
- | * [[https://ru.wikipedia.org/wiki/LDAP|Протокол доступа к каталогам - LDAP]] | ||
- | * [[https://ru.wikipedia.org/wiki/%D0%A2%D0%B5%D1%85%D0%BD%D0%BE%D0%BB%D0%BE%D0%B3%D0%B8%D1%8F_%D0%B5%D0%B4%D0%B8%D0%BD%D0%BE%D0%B3%D0%BE_%D0%B2%D1%85%D0%BE%D0%B4%D0%B0|Технология единого входа]] | ||
- | * [[https://ru.wikipedia.org/wiki/Kerberos|Сетевой протокол аутентификации Kerberos]] | ||
- | * [[https://ru.wikipedia.org/wiki/RADIUS|Сетевой протокол аутентификации RADIUS]] | ||
- | |||
- | ===== Лабораторные работы ===== | ||
- | |||
- | ==== 6.1 Внешняя аутентификация, скрипт для Microsoft AD ==== | ||
- | |||
- | * [[Развертывание Active Directory]] (ip: 172.16.1.X) | ||
- | * Добавляем в домен пользователей user100+X/Pa$$w0rd100+X (Sidor S. Sidorov) | ||
- | * Добавляем в AD DNS хост mail.corpX.un | ||
- | * Устанавливаем хелпер и необходимые компоненты | ||
- | <code> | ||
- | # ldapsearch -x -D "cn=Administrator,cn=Users,dc=corpX,dc=un" -W -h server -b "dc=corpX,dc=un" "sAMAccountName=user100+X" | ||
- | |||
- | # wget http://www.stalker.com/CGPerl/CLI.pm | ||
- | |||
- | # mv CLI.pm /etc/perl/ | ||
- | |||
- | # apt install libauthen-simple-ldap-perl | ||
- | |||
- | # wget http://www.communigate.com/CGAUTH/authLDAPNewAD.pl | ||
- | </code> | ||
- | |||
- | * Настраиваем хелпер | ||
- | <code> | ||
- | # cat authLDAPNewAD.pl | ||
- | </code><code> | ||
- | ... | ||
- | my %domains=( # e-mail domains | ||
- | 'corpX.un' => { | ||
- | address=>'ldap://pdc.valtest.bmstu.ru:389', #the URI or address of LDAP server | ||
- | timeout=>5, # timeout in seconds, 20 by default | ||
- | adminDN=>'CN=Administrator,CN=Users,DC=corpX,DC=un', # the DN for admin bind | ||
- | adminPassword=>'Pa$$w0rd', | ||
- | |||
- | searchBase=>'CN=Users,DC=corpX,DC=un', | ||
- | searchFilter=>'(&(sAMAccountName=<user>)(objectclass=*))', | ||
- | updatePasswords=>1, #if need to update CommuniGate internal password | ||
- | }, | ||
- | ); | ||
- | |||
- | my $CGServerAddress = '127.0.0.1'; # You should redefine these values | ||
- | my $CLILogin = 'postmaster'; | ||
- | my $CLIPassword = 'Pa$$w0rd'; | ||
- | ... | ||
- | </code><code> | ||
- | |||
- | # chmod +x authLDAPNewAD.pl | ||
- | </code> | ||
- | |||
- | * Подключаем хелпер к CGP | ||
- | <code> | ||
- | Settings->General->Helpers->External Authentication | ||
- | |||
- | Program Path: /root/authLDAPNewAD.pl | ||
- | или | ||
- | Program Path: C:\Perl\bin\perl C:\var\CommuniGate\authLDAPNewAD.pl | ||
- | </code><code> | ||
- | # ps ax | grep authLDAPNewAD | ||
- | </code><code> | ||
- | Users->Domains->corpX.ru->Domain Settings | ||
- | Consult External for Unknown: Yes | ||
- | Consult External on Provision: Yes | ||
- | |||
- | Users->Domains->corpX.un->Account Defaults->Settings | ||
- | External Password: Enabled | ||
- | </code> | ||
- | |||
- | ==== 6.2 Миграция почты пользователей ==== | ||
- | <code> | ||
- | cat /root/AccountList.txt | ||
- | Name Password | ||
- | user100+X Pa$$w0rd100+X | ||
- | |||
- | cd /opt/CommuniGate/Migration/ | ||
- | |||
- | ./MoveAccounts --IMAP /root/AccountList.txt 172.16.1.254 127.0.0.1 | ||
- | </code> | ||
- | |||
- | ==== 6.3 SSO аутентификация в Microsoft AD ==== | ||
- | |||
- | * [[https://www.communigate.com/communigatepro/Security.html]] | ||
- | * Включение в домен Windows client1 ([[Развертывание Active Directory#Включение в домен Windows клиентов]]) !!! указать DNS 172.16.1.X | ||
- | * Создание принципала для протокола IMAP | ||
- | <code> | ||
- | C:\>ktpass -princ imap/mail.corpX.un@CORPX.UN -mapuser cgatepro -pass Pa$$w0rd -out keytab.data -crypto RC4-HMAC-NT -ptype KRB5_NT_SRV_HST | ||
- | </code> | ||
- | |||
- | * Перенос ключа принципала в CGP (Users->Domains->corpX.un->Security->Kerberos) | ||
- | * Входим в домен как user100+X с рабочей станции client1 | ||
- | * [[Thunderbird#Авто конфигурация клиента]] Thunderbird (IMAP GSSAPI) | ||
- | |||
- | ==== 6.4 Использование CGP в качестве RADIUS сервера ==== | ||
- | |||
- | **Задача: Аутентификация доступа пользователей в Internet** | ||
- | |||
- | * Включаем и настраиваем сервис в CGP | ||
- | <code> | ||
- | Settings->Services->RADIUS | ||
- | Password: testing123 | ||
- | Channels: 3 | ||
- | Listener | ||
- | Port: 1812 | ||
- | </code> | ||
- | |||
- | * Тестирование | ||
- | <code> | ||
- | # radtest user1 'cpassword1' mail.corpX.un 0 testing123 | ||
- | </code> | ||
- | |||
- | * Использование в SQUID [[Аутентификация доступа к SQUID|RADIUS basic аутентификация]] | ||
- | |||
- | ===== Вопросы ===== | ||
- | |||
- | - Какие безопасные методы аутентификации поддерживает Communigate? | ||
- | - Как организовать использование в Communigate учетных записей из Microsoft Active Directory? | ||
- | - Какую часть протокола RADIUS реализует Communigate? | ||
- | ===== Модуль 7. SIP, PBX, встроенные приложения, номерной план, пример своего приложения ===== | ||
- | |||
- | ===== Теория ===== | ||
- | |||
- | * [[https://ru.wikipedia.org/wiki/IP-%D1%82%D0%B5%D0%BB%D0%B5%D1%84%D0%BE%D0%BD%D0%B8%D1%8F|IP-телефония]] и протокол [[https://ru.wikipedia.org/wiki/SIP|SIP]] | ||
- | * [[http://mx.demos.su/lists/cgp-russian/2013_06/17732.html|Односторонняя слышимость при переводе звонка]] | ||
- | * [[https://www.communigate.com/CommunigatePro/russian/NAT.html|Прохождение NAT]] | ||
- | ===== Лабораторные работы ===== | ||
- | |||
- | * [[ZoIPer]] user3 | ||
- | * [[SIP Phone Panasonic KX-HDVXXX]] 401 | ||
- | |||
- | ==== 7.1 Локализация PBX ==== | ||
- | |||
- | <code> | ||
- | Users->Domains->corpX.un->PBX->Create Custom Enviroment | ||
- | |||
- | Languages->Create: Russian | ||
- | |||
- | select russian | ||
- | </code> | ||
- | * [[ftp://ftp.stalker.com/pub/stuff/noarch/pbx_russian_files_51.zip]] | ||
- | <code> | ||
- | !!! Upload tar файлов из архива !!! | ||
- | |||
- | # ls CGateProSoftware/CommuniGate/PBXApps/ | ||
- | |||
- | # ls /var/CommuniGate/Accounts/PBXApps | ||
- | </code> | ||
- | |||
- | ==== 7.2 Таблица маршрутизации применительно к SIP, номерной план ==== | ||
- | |||
- | === Через таблицу маршрутизации === | ||
- | <code> | ||
- | S:<6363@*> = gatewayincoming{pbx,media}#pbx | ||
- | </code> | ||
- | |||
- | === Организация внутреннего плана нумерации === | ||
- | <code> | ||
- | Users->Domains->corpX.un->Objects->user2->Settings | ||
- | Aliases: 402 | ||
- | </code> | ||
- | |||
- | === Информация о регистрации SIP пользовательского оборудования === | ||
- | <code> | ||
- | Users->Domains->corpX.un->Objects->user1->Status | ||
- | |||
- | или | ||
- | |||
- | GETACCOUNTINFO user1 KEY SIPContacts | ||
- | 200 data follow | ||
- | ( | ||
- | { | ||
- | "" = "sip:user1@195.19.35.219:5060"; | ||
- | @regdata = { | ||
- | Allow = (ACK, BYE, CANCEL, INFO, INVITE, NOTIFY, OPTIONS, REFER); | ||
- | CSeq = #68190; | ||
- | Call-ID = 3498b62-d4014eab@195.19.35.219; | ||
- | Supported = (x-sipura); | ||
- | User-Agent = "Linksys/SPA3102-3.3.6(GW)"; | ||
- | }; | ||
- | Expires = #T14-10-2014_05:30:41; | ||
- | } | ||
- | ) | ||
- | </code> | ||
- | |||
- | === CDR === | ||
- | <code> | ||
- | Settings->Real-Time->Signals | ||
- | Record Call CDRs: yes | ||
- | |||
- | # ls /var/CommuniGate/SystemLogs/CDRs/ | ||
- | </code> | ||
- | |||
- | ==== 7.3 Правила для голоса ==== | ||
- | |||
- | <code> | ||
- | Settings->Router | ||
- | ... | ||
- | Signal:<echotest@*> = echotest#pbx@localhost ; testing address | ||
- | ... | ||
- | </code> | ||
- | |||
- | pbx - пользователь | ||
- | |||
- | <code> | ||
- | 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> | ||
- | |||
- | ==== 7.4 Встроенные приложения ==== | ||
- | |||
- | === IVR === | ||
- | <code> | ||
- | Users->Domains->corpX.un->Object->pbx->Real-Time->Advanced | ||
- | |||
- | Department Menu: Custom: techsupport conference | ||
- | Directory Prefix: 4 - с какой цифры внутренний план нумерации | ||
- | Directory Digits: 3 - длина номера внутреннего плана нумерации | ||
- | </code> | ||
- | <code> | ||
- | пункт techsupport - можно заменить на свое название, например abcd | ||
- | для озвучивания пункта необходимо загрузить файл forabcd.wav через | ||
- | Users->Domains->corpX.un->PBX | ||
- | </code> | ||
- | <code> | ||
- | Для пере направления вызова сотрудникам необходимо включить их в одноименную с пунктом меню группу. | ||
- | |||
- | Users->Domains->corpX.un->Objects->Create Group: techsupport | ||
- | Members: user1 | ||
- | Members: user2 | ||
- | </code> | ||
- | |||
- | === Голосовая почта === | ||
- | <code> | ||
- | Пользователю необходимо позвонить на свой номер и записать приветствие, | ||
- | далее из своего веб интерфейса выполнить: | ||
- | |||
- | Управление Звонками->Голосовая Почта->После: 10 сек | ||
- | </code> | ||
- | |||
- | |||
- | === Голосовые конференции === | ||
- | |||
- | **Вариант1**: Позвонить на номер 200, создать конференцию, получить по почте номер конференции, разослать этот номер всем участникам, через номер 200 подключиться вместе со всеми. | ||
- | |||
- | <code> | ||
- | GETACCOUNTINFO pbx KEY Meetings | ||
- | ... | ||
- | </code> | ||
- | |||
- | **Вариант2**: Создать событие, у которого место проведения (Location) установлено в phone или conference, а в качестве участников перечислены аккаунты. | ||
- | |||
- | <code> | ||
- | GETACCOUNTINFO user1 KEY Meetings | ||
- | ... | ||
- | </code> | ||
- | |||
- | |||
- | ==== 7.5 Пишем свое небольшое приложение ==== | ||
- | |||
- | * [[http://www.communigate.com/CommuniGatePro/russian/CGPL.html|Язык Программирования CommuniGate Pro (CG/PL)]] | ||
- | |||
- | === Hello World по номеру 301 === | ||
- | |||
- | <code> | ||
- | Users->Domains-corpX.un->PBX->russian | ||
- | Upload File: sayhello.sppr | ||
- | |||
- | или | ||
- | |||
- | # cat /var/CommuniGate/Accounts/PBXApps/russian/sayhello.sppr | ||
- | </code><code> | ||
- | entry main is | ||
- | var errCode = AcceptCall(); | ||
- | if isString(errCode) then | ||
- | syslog("Failed to accept the call: " + errCode); | ||
- | else | ||
- | PlayFile("blank", 500); // 0.5 sec of silence | ||
- | PlayFile("Welcome"); | ||
- | end if; | ||
- | end entry; | ||
- | </code><code> | ||
- | Users->Domains-corpX.un | ||
- | Create Forwarder: 301 | ||
- | Forward To: sayhello#pbx | ||
- | </code> | ||
- | |||
- | pbx - имя аккаунта от которой запускается приложение sayhello | ||
- | |||
- | === Тоже Hello World, но с CallBack === | ||
- | |||
- | <code> | ||
- | # cat /var/CommuniGate/Accounts/PBXApps/russian/sayhello_cb.sppr | ||
- | </code><code> | ||
- | entry main is | ||
- | var data = Vars().startParameter[0]; | ||
- | syslog("Will call to " + ObjectToString(data)); | ||
- | var errCode = StartCall(EmailToSIPURI(data)); | ||
- | if isString(errCode) then | ||
- | syslog("Call failed: " + errCode); | ||
- | stop; | ||
- | end if; | ||
- | loop | ||
- | data = ReadInput(10); | ||
- | exitif isCallCompletedEvent(data); | ||
- | end loop; | ||
- | if isConnected() then | ||
- | PlayFile("blank", 500); | ||
- | PlayFile("welcome"); | ||
- | PlayFile("blank", 500); | ||
- | PlayFile("goodbye"); | ||
- | end if; | ||
- | end entry; | ||
- | </code><code> | ||
- | STARTPBXTASK pbx PROGRAM sayhello_cb PARAM ("401") | ||
- | </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)@*> = +7*@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> | ||
- | |||
- | ===== Вопросы ===== | ||
- | |||
- | - Как привязываются телефонные номера абонентам Communigate? | ||
- | - Для чего используется учетная запись pbx? | ||
- | - Какой протокол сигнализации IP телефонии предлагает Communigate для подключения внешних телефонов? | ||
- | - Что такое B2ВUA? | ||
- | - Перечислите встроенные в Communigate голосовые приложения. | ||
- | - Как организовать связь между абонентами Communigate и ТФОП(PSTN)? | ||
- | - Какой язык программирования предлагает Communigate для разработки голосовых приложений? | ||
- | |||
- | ===== Модуль 8. Использование CGP в качестве Web сервера ===== | ||
- | |||
- | ===== Лабораторные работы ===== | ||
- | |||
- | ==== 8.1 Создание персональных страниц пользователей ==== | ||
- | |||
- | Доступ: http://corpX.un/~user1 | ||
- | |||
- | Местоположение и файл по умолчанию | ||
- | <code> | ||
- | # cat /var/CommuniGate/Accounts/user1.macnt/account.web/default.html | ||
- | </code> | ||
- | |||
- | Доступ по имени http://user1.corpX.un ([[http://www.communigate.com/CommuniGatePro/russian/HowTo.html|WebURL]]) | ||
- | <code> | ||
- | Settings->Router | ||
- | ... | ||
- | mail.corpX.un = corpX.un | ||
- | |||
- | *.corpX.un = *@fict | ||
- | <LoginPage%*@fict> = * | ||
- | </code> | ||
- | |||
- | |||
- | ==== 8.2 Разработка CGI приложений на CG/PL ==== | ||
- | |||
- | Приложение Web Callback | ||
- | |||
- | <code> | ||
- | STARTPBXTASK pbx PROGRAM rendezvous PARAM ("401","8916XXXXXXX") | ||
- | </code><code> | ||
- | Users->Skins->Upload File: webcallback.wcgp | ||
- | |||
- | или | ||
- | |||
- | # cat /var/CommuniGate/WebSkins/webcallback.wcgp | ||
- | </code><code> | ||
- | entry sysEntry is | ||
- | |||
- | SetHTTPResponseType("text","html"); | ||
- | SetHTTPResponseCode(200); | ||
- | |||
- | var phone = GetHTTPParameter("phone"); | ||
- | var operatorphone = "401"; | ||
- | var data = ""; | ||
- | var cmd = ""; | ||
- | | ||
- | if not isString(phone) | ||
- | then | ||
- | data = "<h1>Enter phone number</h1><form action=webcallback.wcgp><input name=phone><input type=submit></form>"; | ||
- | else | ||
- | cmd = "STARTPBXTASK pbx PROGRAM rendezvous PARAM(\"" + phone + "\",\"" + operatorphone + "\")"; | ||
- | data = "<h1>Waiting call on phone " + phone + "</h1>"; | ||
- | var errCode = ExecuteCLI(cmd); | ||
- | end if; | ||
- | |||
- | SetHTTPResponseData(data); | ||
- | end entry; | ||
- | </code><code> | ||
- | http://mail.corpX.un/sys/webcallback.wcgp | ||
- | </code> | ||
- | |||
- | ==== 8.3 Поддержка Provisioning для телефонных аппаратов ==== | ||
- | |||
- | * [[Сервис DHCP]] | ||
- | * tftp: Settings->Access->TFTP->Listener | ||
- | * [[SIP Phone Panasonic KX-HDVXXX]] | ||
- | |||
- | ===== Вопросы ===== | ||
- | |||
- | - Какой протокол предлагает Communigate для подключения внешних программ к приватному облачному хранилищу? | ||
- | - Какой файл по умолчанию возвращает Communigate при подключении к учетной записи по протоколу HTTP? | ||
- | - Какой язык программирования предлагает Communigate для разработки Web сценариев? | ||
- | - Какие протоколы передачи файлов поддерживает Communigate? | ||
- | ===== Модуль 9. Разное ===== | ||
- | |||
- | ==== Анализ журналов ==== | ||
- | <code> | ||
- | Monitors->Logs | ||
- | |||
- | # tail -f /var/CommuniGate/SystemLogs/`date '+%Y-%m-%d'`.log | ||
- | </code> | ||
- | |||
- | ==== Использование триггеров ==== | ||
- | |||
- | === HTTP SMS шлюзы === | ||
- | |||
- | <code> | ||
- | Settings->General->Triggers | ||
- | Events | ||
- | httpAdminAuthFailed: ... | ||
- | failedAUTHs: ... | ||
- | Handlers | ||
- | Send URL: https://rest.nexmo.com/sms/json?api_key=e5610a90&api_secret=1d98ff2a&from=NEXMO&to=79164115716&text=mail.corpX.un+par+^0+val+=+^2 | ||
- | </code> | ||
- | |||
- | Параметр ^1 возвращает строку с пробелом, которая некорректно передается от CGP к NEXMO | ||
- | |||
- | === Отправка SMS по SMPP === | ||
- | |||
- | Надо прописать его в Settings -> Real-Time -> SMPP | ||
- | server smpp0.nexmo.com:8000, SystemID и Password - из аккаунта на nexmo (api_key и api_secret). | ||
- | |||
- | <code> | ||
- | GETMODULE SMPP | ||
- | </code> | ||
- | |||
- | ==== Использование custom счетчиков ==== | ||
- | <code> | ||
- | my $error = $cli->SendCommand('SetStatElement 1.3.6.1.4.1.5678.2.1.1000.1 SET '.$value); | ||
- | </code> | ||
- | |||
- | ==== Использование snmp ==== | ||
- | |||
- | * [[https://github.com/pdacity/cgp_snmp_zabbix|pdacity/cgp_snmp_zabbix]] | ||
- | |||
- | |||
- | ===== Cluster ===== | ||
- | |||
- | * [[http://www.communigate.com/ru/main/solutions/cluster.html]] | ||
- | |||
- | ===== Дополнительные материалы ===== | ||
- | |||
- | ==== Пример web редиректа ==== | ||
- | <code> | ||
- | > Здравствуйте. | ||
- | > | ||
- | > Подскажите, есть ли возможность средствами CGP перенаправлять подключения пользователей к | ||
- | > | ||
- | > http://student.bmstu.ru | ||
- | > | ||
- | > на | ||
- | > | ||
- | > https://student.bmstu.ru | ||
- | |||
- | Да, конечно. Страничку login.wssp в дефолтном скине домена надо подправить, добавить что-то типа | ||
- | |||
- | <!--%%IF NOT(REQUESTSECURE() | "YES") --><META HTTP-EQUIV="Refresh" CONTENT="0; URL=https://%%domainName%%"><!--%%ENDIF--> | ||
- | |||
- | Со стандартным вариантом login.wssp можно поступить так: | ||
- | |||
- | <!--%%IF secureChannel --> | ||
- | the standard login.wssp data | ||
- | <!--%%ELSE --> | ||
- | <HTML> | ||
- | <HEAD> | ||
- | <META HTTP-EQUIV=REFRESH CONTENT="0; url=https://%%domainName%%/"> | ||
- | <TITLE>Redirecting to secure interface</TITLE> | ||
- | </HEAD> | ||
- | </HTML> | ||
- | <!--%%ENDIF--> | ||
- | </code> | ||
- | |||
- | ==== Не соответствие значений знимаемого места в интерфейсе CGP и на диске для учетной ==== | ||
- | <code> | ||
- | Такое может произойти. если из директории аккаунта без ведома сервера были удалены почтовые папки. Проверьте соответствие списка папок в account.info куальному содержимому этого аккаунта. | ||
- | |||
- | Можно просто удалить account.info (и, желательно, перезапустить сервер, потоьу что содержимое может кэшироваться в памяти) Сервер потом сам перечитает папки и воссоздаст строчки для них. | ||
- | </code> |