User Tools

Site Tools


communigate_pro_2020

Table of Contents

Communigate Pro 2020

Модуль 1. Установка, интерфейс администрирования и запуск CGP

Теория

Лабораторные работы

1.1 Схема стенда, настройка системы

# ifconfig eth0 inet 172.16.1.100+X/24
hostname: mail.corpX.un
ip/mask: 172.16.1.100+X/24
gate: 172.16.1.254
dns: 172.16.1.254

1.2 Установка сервера

Debian/Ubuntu

# wget http://www.communigate.ru/pub/CommuniGatePro/CGatePro-Linux_amd64.deb

# dpkg -i CGatePro*.deb

# service CommuniGate start

# cat /var/CommuniGate/ProcessID

1.3 Первоначальная настройка

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
    10.5.0.0/16

# cat /var/CommuniGate/Settings/WhiteHoles.data

1.4 Тестирование работоспособности почтовой подсистемы

# file /usr/bin/mail
/usr/bin/mail: symbolic link to /opt/CommuniGate/mail

# echo Hello | mail -s Hello postmaster@localhost

# cat /var/CommuniGate/Accounts/postmaster.macnt/INBOX.mbox

  или

# cat /var/CommuniGate/Accounts/postmaster.macnt/INBOX.mslc/data1

Вопросы

  1. Откуда берет название Stalker Software - компания разработчик Communigate? :)
  2. Какая функциональность, по утверждению разработчиков, должна присутствовать в системе, что бы на нее можно было портировать Communigate?
  3. Что необходимо сделать сразу после первого запуска только что установленного сервера Communigate?
  4. Какие форматы почтовых ящиков поддерживает Communigate, в чем их достоинства и недостатки?

Модуль 2. Управление учетными записями

Теория

Лабораторные работы

2.1 Иерархия параметров конфигурации Communigate

  • Можно показать для настройки Language, имен папок и интерфейса по умолчанию
  • Настройки по умолчанию: для сервера, для домена (основного и дополнительных), для шаблона, для пользователя
Users->Account Defaults->
  Settings->
    Password Encryption: A-crpt
  Mail Settings->
    Mailbox Storage: Mail Storage Limit: 3G
# cat /var/CommuniGate/Settings/DomainDefault.settings | grep MaxAccountSize

Users->Domains->corpX.un->Account Defaults->Mail Settings
  Mailbox Storage: Mail Storage Limit: 10G
# cat /var/CommuniGate/Accounts/Settings/domain.settings | grep AccountDefaults

Users->Domains->corpX.un->Objects->Template->Mail Settings
  Mailbox Storage: Mail Storage Limit: 30G
# cat /var/CommuniGate/Accounts/Settings/template.settings

Users->Domains->corpX.un->Objects->postmaster->Mail->Mail Settings
  Mailbox Storage: Mail Storage Limit: 50G
# cat /var/CommuniGate/Accounts/postmaster.macnt/account.settings

2.2 Создание учетной записи через интерфейс администратора

Users->Domains->corpX.un->Objects->

Create Account: user1
Real Name: Иван Иванович Иванов
CommuniGate Password: password1

# find /var/CommuniGate/Accounts/user1.macnt/

Задание: назначить учетной записи postmaster свое ФИО, должность, телефон …

2.3 Создание учетной записи через CLI

shell> telnet localhost 106

или

shell> nc localhost 106
USER postmaster

PASS Pa$$w0rd

NOTIMEOUT

LISTACCOUNTS
LISTACCOUNTS corpX.un

GETACCOUNTSETTINGS user1
GETACCOUNTSETTINGS user1@corpX.un

GETACCOUNTDEFAULTS
GETACCOUNTDEFAULTS corpX.un

GETACCOUNTEFFECTIVESETTINGS user1

GETACCOUNTINFO user1

CREATEACCOUNT user2 {Password = "password2";RealName = "Петр Петрович Петров";}

QUIT

2.4 Создание учетной записи из внешней программы

Примечание: демонстрирует преподаватель

2.5 Создание пользователей с помощью текстового файла

Примечание:

  1. использовать кодировку utf-8 и табуляцию между столбцами
  2. добавить символ новой строки в конце файла
  3. атрибут telephoneNumber убрать, появится в следующих лабораторных работах
  4. удалить пользователей по окончании работы
Name	RealName	Password	telephoneNumber
user3	Сидор Сидорович Сидоров	password3	403
user4	Василий Муркович Кошкин	password4	404

2.6 Управление дополнительным доменами в CGP

Настройка дополнительного ip адреса (ip alias) в ОС

Создаем новый домен

Users->Domains->CreateDomain->compX.un

Создаем пользователя в новом домене и назначаем ему права администратора

Users->Domains->compX.un->Objects->Create Account: user3

Real Name: Сидоров Сидор Сидорович
CommuniGate Password: password3

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

Для будущей поддержки SSL/TLS привязываем домены к разным адресам сервера

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]

Логинемся как user3 из домена compX.un и управляем доменом

http://172.16.1.200+X:8010/

Вопросы

  1. По какой причине учетная запись администратора Communigate называется postmaster?
  2. Перечислите способы создания учетных записей в Communigate.
  3. Перечислите уровни конфигурации на которых можно определить параметры учетной записи.
  4. Что нужно сделать, что бы делегировать права управления доменом отдельному администратору?

Модуль 3. Настройка интерфейсов пользователей

Теория

Лабораторные работы

3.1 Создание сертификата TLS для доменов

Настройка DNS

mail.corpX.un. A 172.16.1.100+X

mail.compX.un. A 172.16.1.200+X

Настройка алиасов доменов

Users->Domains->corpX.un->Domain Settings->Domain Aliases: mail.corpX.un

Users->Domains->compX.un->Domain Settings->Domain Aliases: mail.compX.un

Сертификат для домена corpX.un

Users->Domains->corpX.un->Security->SSL/TLS
PKI Services: Enable
Private Key 
Key Size: 1024
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

Сертификат для домена compX.un

Безопасность->SSL/TLS->Генератор Сертификатов->Имя-Идентификатор: mail.compX.un

3.2 Подключение почтовых клиентов

По протоколу POP3

По протоколам SMTP и IMAP

По протоколам MS Exchange и Active Sync

3.3 Подключение через web интерфейс

Базовая конфигурация веб интерфейсов

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

Выбор интерфейса и локализация пользователя

Примечание: при первом подключении установить само подписанный сертификат в базу данных доверенных сертификатов серверов в firefox

Users->Account Defaults->Preferences
Users->Domains->corpX.un->Account Defaults->Preferences
Users->Domains->corpX.un->Objects->postmaster->Preferences

Language: Russian
Layout: Basic|Crystal|mCrystal|Samovare

Пользователи->Домены->corpX.un->Объекты->postmaster->Настройки->Язык: ...(English)

Управление подключениями

Monitors->Access->Sessions

KILLACCOUNTSESSIONS user1

3.4 Согласование названий папок

USERS->DOMAINS->corpX.un->user1->PREFERENCES
  Folders: Save Sent Messages in: Sent

3.5 Использование общей адресной книги

В веб интерфейсе

Синхронизация
DIRECTORY->UNITS
  Main->SETTINGS
  Update
Отображение
USERS->ACCOUNT DEFAULTS->PREFERENCES
  Contacts:
    Name: Адресная книга corp9
    Search Base: $domain$

По протоколу LDAP

Через интерфейс администратора
Directory->Browser
Из командной строки

Примечание: демонстрирует преподаватель

Чтение данных с аутентификацией

# ldapsearch -x -D "user1@corpX.un" -W -b"cn=corpX.un" -H ldaps://mail.corpX.un:636 

Чтение данных без аутентификации

Directory->Access Rights

Name: ReadAll
Bind DN: anyone вместо uid=*
# ldapsearch -x -b"cn=corpX.un" -H ldap://mail.corpX.un:389
  • Добавление атрибутов
Directory->Units->Main->Schema

Users->Directory Integration
Public Info: telephoneNumber
Подключение адресной книги к почтовому клиенту

3.6 Персонализация интерфейса для компании

Заменяем логотип в basic (корневом) интерфейсе

На уровне сервера:
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

Заменяем логотип в Samoware интерфейсе

# find /opt/CommuniGate/WebSkins/ -type d

Named Skins: Create: Samoware

Upload File: logo-big-samoware.svg

# find /var/CommuniGate/Accounts/WebSkins/

Заменяем строку в тесте

# ls /var/CommuniGate/Accounts/WebSkins/russian.data
...
  LoginTag1		= "...";
  LoginTag2		= "...";
...

Дополнительное задание: Сделать то же самое через пользовательский интерфейс postmaster

Создаем свой skin и добавляем какую-нибудь совершенно новую ссылку в интерфейс

Users->Domains->corpX.un->Skins->Named Skins->Create: mySkin

# cat /var/CommuniGate/Accounts/WebSkins/mySkin/navigation.wssi
...
  <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>
...

Вопросы

  1. Что необходимо сделать для включения поддержки SSL/TLS в Communigate?
  2. Какие протоколы поддерживает Communigate для работы с почтовыми клиентами, какими особенностями они обладают?
  3. Какие способы работы с адресной книгой предоставляет Communigate для почтовых клиентов?
  4. Перечислите основные варианты Web интерфейсов для пользователей Communigate.
  5. В какой папке должны хранится элементы персонализации Web интерфейса компании?

Модуль 4. Маршрутизация почты и борьба со SPAMом

Теория

Лабораторные работы

4.1 Протокол SMTP

Настройка DNS

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.

Пример диалога

gate.isp.un$ mail postmaster@corpX.un

Почтовый relay для локальной сети

  • Продемонстрировать отправку письма без аутентификации из локальной сети на внешний ящик
# cat /var/CommuniGate/Settings/WhiteHoles.data

Settings->Network->Client IPs: 

!172.16.1.254
172.16.1.0/24
10.5.0.0/16

4.2 Использование встроенных средств CGP для борьбы со SPAMом

Настройка параметров приемника SMTP

Settings->Mail->SMTP->Receiving
Verify
  Return-Path for: ...
  Check SPF records: ...
Non-Client Sender
  Delay Prompt for: 10
gate.isp.un% mail user1@corpX.un

gate.isp.un% tail -f /var/log/maillog

Технология Honeypot

Settings->Router
...
<director> = spamtrap
...

gate.isp.un% mail user1@corpX.un director@corpX.un

Помощь пользователей

в файле strings.data в строках SpamFalseNegativeReportEmail и SpamFalsePositiveReportEmail можете указать адреса, куда перенаправлять неправильно определённые письма, тогда появятся кнопки для этого

4.3 Использование внешних фильтров для борьбы с вирусами и SPAMом

Развертывание антивируса

# usermod -G mail clamav

# service clamav-daemon restart

# clamdscan /var/CommuniGate/eicar.zip

Развертывание антиспама

# cat /etc/default/spamassassin
...
OPTIONS="-m 10 -x -q -u mail -i 127.0.0.1 -p 783"
...

Сборка программы Helper

# wget http://program.farit.ru/antivir/cgpav-1.5.tar.gz

# tar -xvf cgpav-1.5.tar.gz

# cd cgpav-1.5/

# ./configure --with-antivirus=clamav --with-spamassassin=yes --with-cgpro_dir=/var/CommuniGate

# make && make install

# cat /var/CommuniGate/Settings/cgpav.conf
...
# не добавляется, если письмо распознано как SPAM
add_not_infected_header = true
...
clamd_socket = /var/run/clamav/clamd.ctl
...
enable_spamassassin = true
...
spam_scan_local = true
...
spam_level_header = true
...
spam_level_char = X
...
spamassassin_socket_type = tcp
...
# /var/CommuniGate/cgpav
1 FILE eicar.zip
1 DISCARD

Подключение хелпера к CGP

Settings->General->Helpers->Content Filtering
Enabled: ClamSpam
Program Path: /var/CommuniGate/cgpav
# ps ax | grep cgpav

Включение хелпера с помощью глобальных правил обработки почты

Settings->Mail->Rules
Name: ClamSpam
Action: ExternalFilter
Parameter: ClamSpam

Использование простых правил управления спамом

  • Включает пользователь у себя в настройках

Пример настроек правил на уровне сервера, домена и пользователя через CLI

  • Для перемещения SPAM писем в папку администратора правило должно работать на уровне сервера, иначе, даже на уровне домена, не хватает прав (видимо, считается, что письмо перемещает пользователь …)
GETSERVERMAILRULES

SETSERVERMAILRULES ((5, ClamSpam, (), ((ExternalFilter, ClamSpam))), (3, MoveSpam,(("Header Field", in, "X-Junk-Score*XXXXXXXXXX*")),(("Store in", "~postmaster/Spam"), (Discard))))

SETSERVERMAILRULES ((5, ClamSpam, (), ((ExternalFilter, ClamSpam))))

GETDOMAINMAILRULES corpX.un

SETDOMAINMAILRULES corpX.un ((3, MoveSpam,(("Header Field", in, "X-Junk-Score*XXXXXXXXXX*")), (("Store in", "~/Junk"), (Discard))))

SETDOMAINMAILRULES corpX.un ()

GETACCOUNTMAILRULES user1

SETACCOUNTMAILRULES user1 ((3, MoveSpam,(("Header Field", in, "X-Junk-Score*XXXXXXXXXX*")), (("Store in", "~/Junk"), (Discard))))

Вопросы

  1. Что используется в протоколе SMTP для поиска IP адреса сервера назначения?
  2. Что означает термин relay в электронной почте?
  3. Перечислите технологии борьбы со SPAM, доступные в Communigate.
  4. Какой механизм используется для подключения внешних программ обработки писем в Communigate?

Модуль 5. Использование Communigate для совместной работы

Теория

Лабораторные работы

5.1 Организация групповых почтовых адресов

Использование списков рассылки и серверных правил

По окончании тестирования, удалить правила и список рассылки

  • Создаем группу group1 с пользователями user1 и user2
  Set Reply-To to Group: no
  • Создаем правила, меняющие заголовок для писем в группу, и заменяющие Reply-To для писем из группы
GETSERVERMAILRULES
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 в группу для всех ответов из группы"
  )
)

Использование общих папок и прав доступа к ним

  • Для user1:
+ Create Folder-> 
  Имя Папки: group1
  Folder location: Root


group1 *
  Открыть доступ к папке
    user2     Запись
  • user2:
Папки->Управление->Псевдонимы Папок

Имя Псевдонима: group1
Имя Папки: ~user1/group1

Использование расширеного формата почтовых адресов

gate.isp.un% mail group1#user1@corpX.un

mail.corpX.un# echo Hello | mail -s Hello group1#user1@corpX.un

Преобразование адресов правилами маршрутизации

Направление публичной почты в соответствующий ящик

По окончании тестирования, правило удалить

Settings->Router
...
<group1@corpX.un> = group1#user1@corpX.un
...

Применение пользовательских правил для управления почтой

  • Создание алиаса
Users->Domains-corpX.un->Objects->user1->Settings
Aliases: group1
  • От имени user1 создаем правила:
Управление Почтой
  Добавить Правило: Move to group1
  Изменить
    Любой Кому/Копия: равно *group1*
    Записать в: group1
    Выбросить

5.2 Электронная подпись и шифрование S/MIME

  • Устанавливаем в базу данных доверенных сертификатов серверов в Thunderbird само подписанный сертификат CGP

Пользователь user1 создает у себя в интерфейсе сертификат для подписи и шифрования и отправляет подписанное письмо по адресу postmaster@corpX.un

Подделать текст письма можно:

# vim /var/CommuniGate/Accounts/postmaster.macnt/INBOX.mbox

5.3 IM and Presence

5.4 Общие календари и задания

5.5 Использование облачного хранилища

5.6 Перлюстрация писем

Задача: Предоставить доступ администратора (postmaster) к ящикам пользователей

Folders->Management->Folder Aliases

Open Folder: ~user1/Sent Items

Задача: сохранять всю исходящую почту в особой папке у системного администратора или у сотрудника, отвечающего за безопасность.

Вопросы

  1. Перечислите способы организации групповых адресов в Communigate.
  2. Что можно использовать в Communigate для гарантии достоверности и шифрования сообщений?
  3. Какой протокол поддерживает Communigate для подключения внешних программных клиентов мгновенных сообщений и статуса абонента?
  4. Какой протокол поддерживает Communigate для подключения внешних программных клиентов для работы с календарями?

Модуль 6. Интеграция с внешними системами

Теория

Лабораторные работы

6.1 Внешняя аутентификация, скрипт для Microsoft AD

  • Добавляем в домен пользователей user100+X/Pa$$w0rd100+X (Sidor S. Sidorov, можно указать номер телефона)
  • Добавляем в AD DNS хост mail.corpX.un и, если нужно, autoconfig.corpX.un
  • Пример 5 CommuniGate Pro Perl Interface
  • Устанавливаем хелпер CommuniGate Pro External Authentication и необходимые компоненты
  • !!! Работает только при подключении через HTTPS
# ldapsearch -x -D "cn=Administrator,cn=Users,dc=corpX,dc=un" -W -h server -b "dc=corpX,dc=un" "sAMAccountName=user100+X"

# apt install libauthen-simple-ldap-perl

# wget http://www.communigate.ru/CGAUTH/authLDAPNewAD.pl
  • Настраиваем хелпер
# cat authLDAPNewAD.pl
...
my %domains=( # e-mail domains
  'corpX.un' => {
    address=>'ldap://server.corpX.un:389',
    timeout=>5,
    adminDN=>'CN=Administrator,CN=Users,DC=corpX,DC=un',
    adminPassword=>'Pa$$w0rd',
    searchBase=>'CN=Users,DC=corpX,DC=un',
    searchFilter=>'(&(sAMAccountName=<user>)(objectclass=*))',
    updatePasswords=>1,
  },
...
my $CGServerAddress =  '127.0.0.1';   # You should redefine these values
my $CLILogin = 'postmaster';
my $CLIPassword = 'Pa$$w0rd';
...
# chmod +x authLDAPNewAD.pl
  • Подключаем хелпер к CGP
Settings->General->Helpers->External Authentication

Program Path: /root/authLDAPNewAD.pl
или
Program Path: C:\Perl\bin\perl C:\var\CommuniGate\authLDAPNewAD.pl
# ps ax | grep authLDAPNewAD
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

6.2 Миграция почты пользователей

  • !!! Разделитель полей TAB !!!
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

6.3 SSO аутентификация в Microsoft AD

C:\>ktpass -princ imap/mail.corpX.un@CORPX.UN -mapuser cgateproimap -pass Pa$$w0rd -out cgateproimap.keytab -crypto RC4-HMAC-NT -ptype KRB5_NT_SRV_HST

C:\>ktpass -princ smtp/mail.corpX.un@CORPX.UN -mapuser cgateprosmtp -pass Pa$$w0rd -out cgateprosmtp.keytab -crypto RC4-HMAC-NT -ptype KRB5_NT_SRV_HST
  • Перенос ключа принципала в CGP (Users→Domains→corpX.un→Security→Kerberos)
  • Входим в домен как user100+X с рабочей станции client1

6.4 Использование CGP в качестве RADIUS сервера

Задача: Аутентификация доступа пользователей в Internet

  • Включаем и настраиваем сервис в CGP
Settings->Services->RADIUS
Password: testing123
Channels: 3
Listener
Port: 1812
  • Тестирование
# radtest user1 'password1' mail.corpX.un 0 testing123

Вопросы

  1. Какие безопасные методы аутентификации поддерживает Communigate?
  2. Как организовать использование в Communigate учетных записей из Microsoft Active Directory?
  3. Какую часть протокола RADIUS реализует Communigate?

Модуль 7. SIP, PBX, встроенные приложения, номерной план, пример своего приложения

Теория

Лабораторные работы

7.1 Локализация PBX

Users->Domains->corpX.un->PBX->Create Custom Enviroment

Languages->Create: russian

select russian
!!! Upload tar файлов из архива !!!

# ls CGateProSoftware/CommuniGate/PBXApps/

# ls /var/CommuniGate/Accounts/PBXApps

7.2 Таблица маршрутизации применительно к SIP, номерной план

Через таблицу маршрутизации

S:<6363@*> = gatewayincoming{pbx,media}#pbx

Организация внутреннего плана нумерации

Users->Domains->corpX.un->Objects->user2->Settings
Aliases: 402

Информация о регистрации SIP пользовательского оборудования

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;
  }
)

CDR

Settings->Real-Time->Signals
   Record Call CDRs: yes

# ls /var/CommuniGate/SystemLogs/CDRs/

7.3 Правила для голоса

Settings->Router
...
Signal:<311@*>  = echotest#pbx@localhost  ; testing address
...

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

7.4 Встроенные приложения

IVR

Users->Domains->corpX.un->Object->pbx->Real-Time->Advanced

Department Menu: Custom: techsupport conference
Directory Prefix: 4   - с какой цифры внутренний план нумерации
Directory Digits: 3   - длина номера внутреннего плана нумерации
пункт techsupport - можно заменить на свое название, например abcd
для озвучивания пункта необходимо загрузить файл forabcd.wav через
Users->Domains->corpX.un->PBX
Для пере направления вызова сотрудникам необходимо включить их в одноименную с пунктом меню группу.

Users->Domains->corpX.un->Objects->Create Group: techsupport
Members: user1
Members: user2

Голосовая почта

Пользователю необходимо позвонить на свой номер и записать приветствие, 
далее из своего веб интерфейса выполнить:

Управление Звонками->Голосовая Почта->После: 10 сек

Голосовые конференции

Вариант1: Позвонить на номер 200, создать конференцию, получить по почте номер конференции, разослать этот номер всем участникам, через номер 200 подключиться вместе со всеми.

GETACCOUNTINFO pbx KEY Meetings
...

Вариант2: Создать событие, у которого место проведения (Location) установлено в phone или conference, а в качестве участников перечислены аккаунты.

GETACCOUNTINFO user1 KEY Meetings
...

7.5 Пишем свое небольшое приложение

Hello World по номеру 301

Users->Domains-corpX.un->PBX->russian
  Upload File: sayhello.sppr

или

# cat /var/CommuniGate/Accounts/PBXApps/russian/sayhello.sppr
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;
Users->Domains-corpX.un
  Create Forwarder: 301
  Forward To: sayhello#pbx

pbx - имя аккаунта от которой запускается приложение sayhello

Тоже Hello World, но с CallBack

# cat /var/CommuniGate/Accounts/PBXApps/russian/sayhello_cb.sppr
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;
STARTPBXTASK pbx PROGRAM sayhello_cb PARAM ("401")

Перевод звонка без сопровождения (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). Для направления звонков в это приложение лучше использовать серверное сигнальное правило, потому что при направлении через запись в маршрутизаторе нужно будет вводить префиксы, чтобы не было зацикливания.

Серверное сигнальное правило может выглядить примерно так:

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

Здесь первые три условия стандартные, третье условие позволяет избежать зацикливания данного правила, так как оно не будет применяться для звонков, инициированных PBX приложением (то есть для вызова из исходящей ноги Caller приложения правило уже применяться не будет). Далее нужно прописать набор условий (например, Target Address), которые будут задавать набор адресов отправителей и получателей звонка, для которых должно запускаться это приложение с логикой перевода через DTMF. В примере выше правило будет запускаться для всех номеров получателей в домене domain.name. В логике скрипта можно дополнительно добавить проверку, чтобы пользоваться данными DTMF командами могли только локальные пользователи, а не внешние и т.п.

Скрипт приведен как пример, он тщательно не тестировался, но функционал трансфера проверили - работает. Если будут какие-либо ошибки или вопросы по его использованию, пожалуйста, обращайтесь.

// ================================================== //
//             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
}

7.6 Роутинг SIP-звонков

Добавление маршрута для номерного плана на SIP шлюз

Settings->Router
...
S:<1(2d)@*>     = 1*@192.168.1.3 ;smg1016 

S:<0X(3d)@*>    = *@mail.corpX.un
...

Организация исходящих вызовов в PSTN через voip провайдера с аутентификацией

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

Организация входящих вызовов из PSTN (регистрация на voip провайдере)

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

Вопросы

  1. Как привязываются телефонные номера абонентам Communigate?
  2. Для чего используется учетная запись pbx?
  3. Какой протокол сигнализации IP телефонии предлагает Communigate для подключения внешних телефонов?
  4. Что такое B2ВUA?
  5. Перечислите встроенные в Communigate голосовые приложения.
  6. Как организовать связь между абонентами Communigate и ТФОП(PSTN)?
  7. Какой язык программирования предлагает Communigate для разработки голосовых приложений?

Модуль 8. Использование CGP в качестве Web сервера

Лабораторные работы

8.1 Создание персональных страниц пользователей

Доступ: http://corpX.un/~user1

Местоположение и файл по умолчанию

# cat /var/CommuniGate/Accounts/user1.macnt/account.web/default.html

Доступ по имени http://user1.corpX.un (Доступ к Хранилищу Файлов по HTTP)

Settings->Router
...
<loginPage@user1.corpX.un> = user1@mail.corpX.un
<loginPage@autoconfig.corpX.un> = postmaster@mail.corpX.un
...

8.2 Разработка CGI приложений на CG/PL

Приложение Web Callback

STARTPBXTASK pbx PROGRAM rendezvous PARAM ("401","8916XXXXXXX")
Users->Skins->Upload File: webcallback.wcgp

или

# cat /var/CommuniGate/WebSkins/webcallback.wcgp
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;
http://mail.corpX.un/sys/webcallback.wcgp

8.3 Поддержка Provisioning для телефонных аппаратов

Вопросы

  1. Какой протокол предлагает Communigate для подключения внешних программ к приватному облачному хранилищу?
  2. Какой файл по умолчанию возвращает Communigate при подключении к учетной записи по протоколу HTTP?
  3. Какой язык программирования предлагает Communigate для разработки Web сценариев?
  4. Какие протоколы передачи файлов поддерживает Communigate?

Модуль 9. Разное

Анализ журналов

Monitors->Logs

# tail -f /var/CommuniGate/SystemLogs/`date '+%Y-%m-%d'`.log

Использование триггеров

HTTP SMS шлюзы

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

Параметр ^1 возвращает строку с пробелом, которая некорректно передается от CGP к NEXMO

Отправка SMS по SMPP

Надо прописать его в Settings → Real-Time → SMPP server smpp0.nexmo.com:8000, SystemID и Password - из аккаунта на nexmo (api_key и api_secret).

GETMODULE SMPP

Использование custom счетчиков

my $error = $cli->SendCommand('SetStatElement 1.3.6.1.4.1.5678.2.1.1000.1 SET '.$value);

Использование интерфейса SMNP для мониторинга

Cluster

Дополнительные материалы

Миграция с MS Exchange на CGP

-------- Перенаправленное сообщение --------
Тема: 	Re: SSO Kerberos в CGP - Case[ANRA0430-176SF]
Дата: 	Tue, 4 May 2021 14:19:22 +0300
От: 	Support <support@communigate.ru>
Кому: 	Вячеслав А. Лохтуров <val@bmstu.ru>


Здравствуйте,

0. Переносить пользователей лучше постепенно (всех сразу - будет затратно по времени).

    Т.е.:

    1) Создали пользователя (часть пользователей) на CommuniGate

    2) Перенесли данные

    3) Проверили, что всё перенеслось корректно

    4) Настроили аутентификацию со старым паролем пользователя

    5) Пересадили на CommuniGate

1. Перед тем, как переносить данные, на сервере CommuniGate нужно:

    1) Создать домен с таким же именем, как на Exchange

    2) Создать пользователей в домене

    Для переноса списка пользователей можно:

    а) Использовать утилиту ex2cgp: http://www.communigate.ru/CGFromExchange/russian.html

    б) Использовать скрипт LDAP-аутентификации authLDAPNewAD.pl: http://www.communigate.ru/CGAUTH/

    в) Если есть список пользователей и паролей можно использовать импорт: https://www.communigate.ru/CommuniGatePro/russian/Accounts.html#Loader

    Я бы рекомендовал 1-й вариант.

2. Чтобы пользователи могли входить в CommuniGate под паролями AD, можно настроить LDAP-аутентификацию в AD:

    а) Можно использовать встроенный механизм URI аутентификации

        http://www.communigate.ru/communigatepro/russian/Accounts.html#Passwords

    б) Можно использовать хелпер внешней аутентификации:

        http://www.communigate.ru/communigatepro/russian/Security.html#External

3. Когда пользователи CommuniGate созданы, можно переносить данные.

    Для переноса данных можно:

    а) Использовать утилиту ex2cgp

    б) Для переноса только почты можно использовать syncIMAPmail

    Замечание: ex2cgp работает значительно медленней, и в процессе её работы возникает больше ошибок.

    Я бы рекомендовал перенести почту утилитой syncIMAPmail, а непочтовые данные (Календарь, Контакты и т.п.) утилитой ex2cgp.

4. Когда данные пользователя (части пользователей) перенесены нужно настроить взаимодействие между серверами Exchange и CommuniGate.

    Чтобы почта для перенесённых пользователей приходила на CommuniGate, а для неперенесённых на Exchange.

    На Exchange:

     1) Переименовать (изменить основной e-mail адрес)  перенесенного пользователя - чтобы новая почта на него не приходила.

     2) Перенаправить почту "неизвестных" (перенесенных) пользователей на сервер CommuniGate (можно сделать через соединитель отправки) - чтобы новая почта с Exchange для перенесённых пользователей перенаправлялась на CommuniGate.

    На CommuniGate:

        Перенаправить почту тех пользователей, кто ещё остался на Exchange, на сервер Exchange: https://www.communigate.ru/CommuniGatePro/russian/HowTo.html#RelayUnknown


Для начала, рекомендуем сделать тестовую миграцию - на одном или нескольких пользователях, чтобы "обкатать" механизм, и проверить, как он работает.


-- 
Best regards,
Alexey Maximov

Пример web редиректа

> Здравствуйте.
>
> Подскажите, есть ли возможность средствами 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--> 

Не соответствие значений знимаемого места в интерфейсе CGP и на диске для учетной

Такое может произойти. если из директории аккаунта без ведома сервера были удалены почтовые папки. Проверьте соответствие списка папок в account.info куальному содержимому этого аккаунта. 

Можно просто удалить account.info (и, желательно, перезапустить сервер, потоьу что содержимое может кэшироваться в памяти) Сервер потом сам перечитает папки и воссоздаст строчки для них. 
communigate_pro_2020.txt · Last modified: 2021/06/08 07:37 by admin