Общие сведения

В данном разделе содержится описание функций пограничного контроллера сессий ESBC и примеры их настройки для обеспечения передачи SIP-сигнализации и медиапотоков RTP между разными направлениями.

Переход в режим конфигурирования функционала ESBC осуществляется следующими командами CLI:

vesbc# configure 
vesbc(config)# esbc 
vesbc(config-esbc)#

Максимальное количество объектов конфигурации ESBC каждого типа:

ОбъектКоличество
sip transport500
trunk500
user-interface500
trunk-group250
sip profile500
route table500
rule32000 на всю систему
condition(route-table)8 на правило rule
media profile 1000
media resource1000
mod-table500
mod32000 на всю систему
condition(mod-table)8 на модификатор mod
prefix-group2000
prefix(number)250000 на всю систему
cause-list64
crypto profile64
flood filter250
security-profile500
aaa profile64
radius profile64
radius server8 на radius profile
credential profile64
number2500 на credential profile
stun server external64
stun server local64


Не рекомендуется использовать максимальное количество объектов конфигурации одновременно, это может повлиять на работоспособность системы.

Расчет максимального количества контактов зарегистрированных абонентов для vESBC:  

Объем оперативной памяти (RAM) vESBC, GB

Количество контактов

3

4500

≥4

20000*(объем RAM - 3)


ESBC-3200 поддерживает до 420000 зарегистрированных абонентов.

Настройка абонентских интерфейсов

Абонентский интерфейс представляет собой направление для приёма и маршрутизации запросов SIP-абонентов. В конфигурации не задаётся адрес и порт удалённой стороны, для аутентификации используется механизм SIP-регистрации. Регистрация на вышестоящем сервере осуществляется через связанный SIP-транк.

Для создания абонентского интерфейса необходимо настроить:

Эти настройки являются обязательными. Описание конфигурирования и базовой схемы применения представлено в разделе Примеры настройки ESBC.

Помимо этого абонентский интерфейс содержит набор следующих настроек:

По умолчанию вызовы с абонентского интерфейса без предварительной регистрации запрещены.

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


Подробное описание параметров всех настроек можно найти в разделе Настройки абонентского интерфейса справочника команд CLI.

Локальная обработка регистрации

Использование локальной обработки регистрации позволяет снизить нагрузку на сервер регистрации за счет локального ответа на повторный запрос регистрации.

Данная функция позволяет управлять параметром заголовка Expires при регистрации абоненента через ESBC, что позволяет снизить нагрузку на сервер регистрации и дает возможность контролировать доступность зарегистрированного абонента.

По умолчанию локальная обработка регистрации на абонентском интерфейсе отключена.

Подробное описание команд для настройки локальной обработки регистраций на ESBC представлено в настройках user-interface в CLI.

При записи информации о зарегистрированных абонентах на ESBC всегда используется Expires пришедший с сервера регистрации.

Локальная обработка повторной регистрации разрешена, если соблюдаются все нижеперечисленные требования:

  1. Абонент уже зарегистрирован;
  2. Контакт абонента не изменились;
  3. Адрес и порт абонента не изменились;
  4. Абонент не регистрирует новые контакты. 

Логика первичной регистрации:

  1. В сторону сервера регистрации отправляем REGISTER с Expires, пришедшим от абонента; 
  2. В сторону абонента отправляем 200 OK с Expires из ответа от сервера регистраций.




Логика работы локальной обработки повторной регистрации для зарегистрированного абонента:

1. Если в REGISTER, полученном от абонента, Expires в поле Contact + 34 секунды больше, чем оставшееся время регистрации (Expires) на ESBC, то отправляем REGISTER на сервер регистрации со значением Expires, описанным пунктом выше.

2. Если в REGISTER, полученном от абонента, Expires в поле Contact + 34 секунды меньше, чем оставшееся время регистрации (Expires) на ESBC, то регистрация будет обработана локально путем отправки абоненту 200 OK с Expires, пришедшим от него же самого. 

При разрегистрации абонента логика локальной регистрации не используется.

Пример настройки локальной обработки регистраций в конфигурации абонентского интерфейса:

vesbc# configure 
vesbc(config)# esbc  
vesbc(config-esbc)# user-interface sip ABONENT
vesbc(config-esbc-user-interface-sip)# sip transport ABONENT_TRANSPORT
vesbc(config-esbc-user-interface-sip)# media resource 0 ABONENT_MEDIA
vesbc(config-esbc-user-interface-sip)# route-table TO_SSW
#Включение локальной обработки регистраций:
vesbc(config-esbc-user-interface-sip)# registration simulation enable 

#Применение и подтверждение изменений:
vesbc(config-esbc-user-interface-sip)# do commit 
Configuration has been successfully applied and saved to flash. Commit timer started, changes will be reverted in 600 seconds.
vesbc(config-esbc-user-interface-sip)# do confirm
Configuration has been confirmed. Commit timer canceled.

На абонентский интерфейс ESBC приходит запрос REGISTER от абонента 23001 с Expires 3600, который пересылается на сервер регистрации SSW. После получения 200 OK от сервера регистрации, ESBC отправляет 200 OK абоненту, содержащий Expires 3600:

На ESBC создается запись зарегистрированного абонента с Expires 3600:

vesbc#
vesbc# show esbc users sip 23001@192.168.126.217 detailed 
 User AOR:       23001@192.168.126.217
 User type:      SIP
 Contact count:  1

IN User contact             IP address of     User         Trunk name        IP address of     OUT Trunk contact           Status          Expires        
                            user              interface                      registrar                                                                    
                                              name                                                                                                        
-------------------------   ---------------   ----------   ---------------   ---------------   -------------------------   -------------   ------------   
<sip:23001@192.168.126.21   192.168.126.210   ABONENT      SSW               192.168.126.212   <sip:23001@192.168.126.21   Uncontrolled    3554/3600     
0:12300;transport=UDP>                                                                         7:5071;line=9e538107d8068                                  
                                                                                               2246c8eed958f91da89>  

Спустя время от абонента приходит запрос REGISTER с Expires 1200 для перерегистрации. Так как оставшееся время регистрации (1523) больше, чем пришедший Expires (1200), то запрос будет обработан локально с отправкой 200 OK абоненту, содержащий Expires 1200:

На ESBC запись зарегистрированного абонента не изменяется:

vesbc#
vesbc# show esbc users sip 23001@192.168.126.217 detailed 
 User AOR:       23001@192.168.126.217
 User type:      SIP
 Contact count:  1

IN User contact             IP address of     User         Trunk name        IP address of     OUT Trunk contact           Status          Expires        
                            user              interface                      registrar                                                                    
                                              name                                                                                                        
-------------------------   ---------------   ----------   ---------------   ---------------   -------------------------   -------------   ------------   
<sip:23001@192.168.126.21   192.168.126.210   ABONENT      SSW               192.168.126.212   <sip:23001@192.168.126.21   Uncontrolled    1523/3600     
0:12300;transport=UDP>                                                                         7:5071;line=9e538107d8068                                  
                                                                                               2246c8eed958f91da89>                                        

Минимальное время регистрации (Expires) на сервере

Функция настройки парамерта заголовка Expires передаваемого в сообщении REGISTER в сторону регистратора, позволяет снизить нагрузку на сервер, путем уменьшения количества запросов REGISTER при большом количестве зарегистрированных абонентов.

Работает только при включенной локальной обработке регистраций.

Подробное описание команд для настройки минимального времени регистрации на сервере при включенной локальной обработкой регистраций на ESBC представлено в настройках user-interface в CLI.

Может работать вместе с максимальным временем регистрации абонента. Подробнее в разделе ниже.

Логика работы первичной регистрации при использовании минимального времени регистрации на сервере:

  1. В сторону сервера регистрации отправляем REGISTER с наибольшим Expires, пришедшим от абонента, и минимальным временем регистрации на сервере;
  2. В сторону абонента отправляем 200 OK с наименьшим Expires из ответа от сервера регистраций и пришедшего от абонента.

Логика работы локальной обработки повторной регистрации при использовании минимального времени регистрации на сервере для зарегистрированного абонента:

1. Если в REGISTER, полученном от абонента, Expires в поле Contact + 34 секунды больше, чем оставшееся время регистрации (Expires) на ESBC, то отправляем REGISTER на сервер регистрации со значением Expires, описанным пунктом выше.

2. Если в REGISTER, полученном от абонента, Expires в поле Contact + 34 секунды меньше, чем оставшееся время регистрации (Expires) на ESBC, то регистрация будет обработана локально путем отправки абоненту 200 OK с Expires, пришедшим от него же самого. 

Если абонент не перерегистрируется согласно тому Expires который он получил при регистрации от ESBC, то такой абонент будет считаться недоступным. Все вызовы на этого абонента будут завершаться с причиной 480 Temporarily Unavailable.

Абонент станет доступен только после перерегистрации.

Пример настройки локальной обработки регистраций с использованием минимального времени регистрации на сервере в конфигурации абонентского интерфейса:

vesbc# configure 
vesbc(config)# esbc  
vesbc(config-esbc)# user-interface sip ABONENT
vesbc(config-esbc-user-interface-sip)# sip transport ABONENT_TRANSPORT
vesbc(config-esbc-user-interface-sip)# media resource 0 ABONENT_MEDIA
vesbc(config-esbc-user-interface-sip)# route-table TO_SSW
#Включение локальной обработки регистраций:
vesbc(config-esbc-user-interface-sip)# registration simulation enable 
#Использование минимального времени регистрации на сервере:
vesbc(config-esbc-user-interface-sip)# registration simulation min-reg-expires 10800

#Применение и подтверждение изменений:
vesbc(config-esbc-user-interface-sip)# do commit 
Configuration has been successfully applied and saved to flash. Commit timer started, changes will be reverted in 600 seconds.
vesbc(config-esbc-user-interface-sip)# do confirm
Configuration has been confirmed. Commit timer canceled.

На абонентский интерфейс ESBC приходит запрос REGISTER от абонента 23001 с Expires 3600, который пересылается на сервер регистрации SSW со значением Expires 10800. После получения 200 OK от сервера регистрации со значением Expires 10800, ESBC отправляет 200 OK абоненту, содержащий Expires 3600:

На ESBC создается запись зарегистрированного абонента с Expires 10800:

vesbc#
vesbc# show esbc users sip 23001@192.168.126.217 detailed 
 User AOR:       23001@192.168.126.217
 User type:      SIP
 Contact count:  1

IN User contact             IP address of     User         Trunk name        IP address of     OUT Trunk contact           Status          Expires        
                            user              interface                      registrar                                                                    
                                              name                                                                                                        
-------------------------   ---------------   ----------   ---------------   ---------------   -------------------------   -------------   ------------   
<sip:23001@192.168.126.21   192.168.126.210   ABONENT      SSW               192.168.126.212   <sip:23001@192.168.126.21   Available       10693/10800    
0:12300;transport=UDP>                                                                         7:5071;line=9e538107d8068                                  
                                                                                               2246c8eed958f91da89>                                       

Спустя время приходит запрос REGISTER с Expires 3600 для перерегистрации. Так как оставшееся время регистрации (Expires) (8978) больше, чем пришедший Expires (3600), то запрос будет обработан локально с отправкой 200 OK абоненту, содержащий Expires 3600:

vesbc#
vesbc# show esbc users sip 23001@192.168.126.217 detailed 
 User AOR:       23001@192.168.126.217
 User type:      SIP
 Contact count:  1

IN User contact             IP address of     User         Trunk name        IP address of     OUT Trunk contact           Status          Expires        
                            user              interface                      registrar                                                                    
                                              name                                                                                                        
-------------------------   ---------------   ----------   ---------------   ---------------   -------------------------   -------------   ------------   
<sip:23001@192.168.126.21   192.168.126.210   ABONENT      SSW               192.168.126.212   <sip:23001@192.168.126.21   Available       8978/10800    
0:12300;transport=UDP>                                                                         7:5071;line=9e538107d8068                                  
                                                                                               2246c8eed958f91da89>                                       

Если спустя время запрос REGISTER для перерегистрации не поступил, то абонент становится недоступным. Все вызовы на этого абонента будут завершаться с причиной 480 Temporarily Unavailable.

vesbc#
vesbc# show esbc users sip 23001@192.168.126.217 detailed 
 User AOR:       23001@192.168.126.217
 User type:      SIP
 Contact count:  1

IN User contact             IP address of     User         Trunk name        IP address of     OUT Trunk contact           Status          Expires        
                            user              interface                      registrar                                                                    
                                              name                                                                                                        
-------------------------   ---------------   ----------   ---------------   ---------------   -------------------------   -------------   ------------   
<sip:23001@192.168.126.21   192.168.126.210   ABONENT      SSW               192.168.126.212   <sip:23001@192.168.126.21   Not available   322/10800    
0:12300;transport=UDP>                                                                         7:5071;line=9e538107d8068                                  
                                                                                               2246c8eed958f91da89>                                       

Максимальное время регистрации (Expires) абонента

Функция настройки парамерта заголовка Expires передаваемого в сообщении 200 OK на регистрацию в сторону абонента, позволяет управлять частотой обновления регистрации абонента (без дополнительной нагрузки на сервер регистрации), тем самым позволяет более гибко контролировать доступность абонента. 

Работает только при включенной локальной обработке регистраций.

Подробное описание команд для настройки максимального времени регистрации абонента при включенной локальной обработки регистраций на ESBC представлено в настройках user-interface в CLI.

Может работать вместе с минимальным временем регистрации на сервере. Подробнее в разделе ниже.

Логика работы первичной регистрации при использовании максимального времени регистрации абонента:

  1. В сторону сервера регистрации отправляем REGISTER с Expires, пришедшим от абонента;
  2. В сторону абонента отправляем 200 OK с минимальным Expires из ответа от сервера регистраций и настроенным максимальным временем регистрации абонента.

Логика работы локальной обработки повторной регистрации при использовании максимального времени регистрации абонента для зарегистрированного абонента:

1. Если в REGISTER, полученном от абонента, Expires в поле Contact + 34 секунды больше, чем оставшееся время регистрации (Expires) на ESBC, то отправляем REGISTER на сервер регистрации со значением Expires, описанным пунктом выше.

2. Если в REGISTER, полученном от абонента, Expires в поле Contact + 34 секунды меньше, чем оставшееся время регистрации (Expires) на ESBC, то регистрация будет обработана локально путем отправки абоненту 200 OK с Expires, пришедшим от него же самого. 

Если абонент не перерегистрируется согласно тому Expires который он получил при регистрации от ESBC, то такой абонент будет считаться недоступным. Все вызовы на этого абонента будут завершаться с причиной 480 Temporarily Unavailable.

Абонент станет доступен только после перерегистрации.

Пример настройки локальной обработки регистраций с использованием максимального времени регистрации абонента в конфигурации абонентского интерфейса:

vesbc# configure 
vesbc(config)# esbc  
vesbc(config-esbc)# user-interface sip ABONENT
vesbc(config-esbc-user-interface-sip)# sip transport ABONENT_TRANSPORT
vesbc(config-esbc-user-interface-sip)# media resource 0 ABONENT_MEDIA
vesbc(config-esbc-user-interface-sip)# route-table TO_SSW
#Включение локальной обработки регистраций:
vesbc(config-esbc-user-interface-sip)# registration simulation enable 
#Использование максимального времени регистрации абонента:
vesbc(config-esbc-user-interface-sip)# registration simulation max-user-expires 1200

#Применение и подтверждение изменений:
vesbc(config-esbc-user-interface-sip)# do commit 
Configuration has been successfully applied and saved to flash. Commit timer started, changes will be reverted in 600 seconds.
vesbc(config-esbc-user-interface-sip)# do confirm
Configuration has been confirmed. Commit timer canceled.

На абонентский интерфейс ESBC приходит запрос REGISTER от абонента 23001 с Expires 3600, который пересылается на сервер регистрации SSW со значением Expires 3600. После получения 200 OK от сервера регистрации со значением Expires 3600, ESBC отправляет 200 OK абоненту , содержащему Expires 1200:

На ESBC создается запись зарегистрированного абонента с Expires 3600:

vesbc#
vesbc# show esbc users sip 23001@192.168.126.217 detailed 
 User AOR:       23001@192.168.126.217
 User type:      SIP
 Contact count:  1

IN User contact             IP address of     User         Trunk name        IP address of     OUT Trunk contact           Status          Expires        
                            user              interface                      registrar                                                                    
                                              name                                                                                                        
-------------------------   ---------------   ----------   ---------------   ---------------   -------------------------   -------------   ------------   
<sip:23001@192.168.126.21   192.168.126.210   ABONENT      SSW               192.168.126.212   <sip:23001@192.168.126.21   Available       3550/3600      
0:12300;transport=UDP>                                                                         7:5071;line=9e538107d8068                                  
                                                                                               2246c8eed958f91da89>                                        

Спустя время приходит запрос REGISTER с Expires 1200 для перерегистрации. Так как оставшееся время регистрации (Expires) больше (3501), чем пришедший Expires (1200), то запрос будет обработан локально с отправкой 200 OK абоненту, содержащий Expires 1200:

vesbc#
 vesbc# show esbc users sip 23001@192.168.126.217 detailed 
 User AOR:       23001@192.168.126.217
 User type:      SIP
 Contact count:  1

IN User contact             IP address of     User         Trunk name        IP address of     OUT Trunk contact           Status          Expires        
                            user              interface                      registrar                                                                    
                                              name                                                                                                        
-------------------------   ---------------   ----------   ---------------   ---------------   -------------------------   -------------   ------------   
<sip:23001@192.168.126.21   192.168.126.210   ABONENT      SSW               192.168.126.212   <sip:23001@192.168.126.21   Available       2501/3600      
0:12300;transport=UDP>                                                                         7:5071;line=9e538107d8068                                  
                                                                                               2246c8eed958f91da89>                                   

Если спустя время запрос REGISTER для перерегистрации не поступил, то абонент становится недоступным. Все вызовы на этого абонента будут завершаться с причиной 480 Temporarily Unavailable.

vesbc#
 vesbc# show esbc users sip 23001@192.168.126.217 detailed 
 User AOR:       23001@192.168.126.217
 User type:      SIP
 Contact count:  1

IN User contact             IP address of     User         Trunk name        IP address of     OUT Trunk contact           Status          Expires        
                            user              interface                      registrar                                                                    
                                              name                                                                                                        
-------------------------   ---------------   ----------   ---------------   ---------------   -------------------------   -------------   ------------   
<sip:23001@192.168.126.21   192.168.126.210   ABONENT      SSW               192.168.126.212   <sip:23001@192.168.126.21   Not available   1984/3600      
0:12300;transport=UDP>                                                                         7:5071;line=9e538107d8068                                  
                                                                                               2246c8eed958f91da89>                                   

Одновременное использование минимального времени регистрации на сервере и максимального времени регистрации абонента

Работает только при включенной локальной обработке регистраций.

Логика первичной регистрации при использовании минимального времени регистрации на сервере и максимального времени регистрации абонента:

  1. В сторону сервера регистрации отправляем REGISTER с наибольшим Expires, пришедшим от абонента, и минимальным временем регистрации на сервере;
  2. В сторону абонента отправляем 200 OK с наименьшим Expires из ответа от сервера регистраций, пришедшего от абонента и максимальным временем регистрации абонента.

Логика работы локальной обработки повторной регистрации при использовании минимального времени регистрации на сервере и максимального времени регистрации абонента для зарегистрированного абонента:

1. Если в REGISTER, полученном от абонента, Expires в поле Contact + 34 секунды больше, чем оставшееся время регистрации (Expires) на ESBC, то отправляем REGISTER на сервер регистрации со значением Expires, описанным пунктом выше.



2. Если в REGISTER, полученном от абонента, Expires в поле Contact + 34 секунды меньше, чем оставшееся время регистрации (Expires) на ESBC, то регистрация будет обработана локально путем отправки абоненту 200 OK с Expires, пришедшим от него же самого. 

Если абонент не перерегистрируется согласно тому Expires который он получил при регистрации от ESBC, то такой абонент будет считаться недоступным. Все вызовы на этого абонента будут завершаться с причиной 480 Temporarily Unavailable.

Абонент станет доступен только после перерегистрации.

Пример настройки локальной обработки регистраций с использованием минимального времени регистрации на сервере и максимального времени регистрации абонента в конфигурации абонентского интерфейса:

vesbc# configure 
vesbc(config)# esbc  
vesbc(config-esbc)# user-interface sip ABONENT
vesbc(config-esbc-user-interface-sip)# sip transport ABONENT_TRANSPORT
vesbc(config-esbc-user-interface-sip)# media resource 0 ABONENT_MEDIA
vesbc(config-esbc-user-interface-sip)# route-table TO_SSW
#Включение локальной обработки регистраций:
vesbc(config-esbc-user-interface-sip)# registration simulation enable 
#Использование минимального времени регистрации на сервере:
vesbc(config-esbc-user-interface-sip)# registration simulation min-reg-expires 10800
#Использование максимального времени регистрации абонента:
vesbc(config-esbc-user-interface-sip)# registration simulation max-user-expires 1200

#Применение и подтверждение изменений:
vesbc(config-esbc-user-interface-sip)# do commit 
Configuration has been successfully applied and saved to flash. Commit timer started, changes will be reverted in 600 seconds.
vesbc(config-esbc-user-interface-sip)# do confirm
Configuration has been confirmed. Commit timer canceled.

На абонентский интерфейс ESBC приходит запрос REGISTER от абонента 23001 с Expires 3600, который пересылается на сервер регистрации SSW со значением Expires 10800. После получения 200 OK от сервера регистрации со значением Expires 10800, ESBC отправляет 200 OK абоненту, содержащий Expires 1200:

На ESBC создается запись зарегистрированного абонента с Expires 10800:

vesbc#
vesbc# show esbc users sip 23001@192.168.126.217 detailed 
 User AOR:       23001@192.168.126.217
 User type:      SIP
 Contact count:  1

IN User contact             IP address of     User         Trunk name        IP address of     OUT Trunk contact           Status          Expires        
                            user              interface                      registrar                                                                    
                                              name                                                                                                        
-------------------------   ---------------   ----------   ---------------   ---------------   -------------------------   -------------   ------------   
<sip:23001@192.168.126.21   192.168.126.210   ABONENT      SSW               192.168.126.212   <sip:23001@192.168.126.21   Available       10775/10800      
0:12300;transport=UDP>                                                                         7:5071;line=9e538107d8068                                  
                                                                                               2246c8eed958f91da89>                                        

Спустя время приходит запрос REGISTER с Expires 1200 для перерегистрации. Так как оставшееся время регистрации (Expires) (9402) больше, чем пришедший Expires (1200), то запрос будет обработан локально с отправкой 200 OK абоненту , содержащему Expires 1200:

vesbc#
 vesbc# show esbc users sip 23001@192.168.126.217 detailed 
 User AOR:       23001@192.168.126.217
 User type:      SIP
 Contact count:  1

IN User contact             IP address of     User         Trunk name        IP address of     OUT Trunk contact           Status          Expires        
                            user              interface                      registrar                                                                    
                                              name                                                                                                        
-------------------------   ---------------   ----------   ---------------   ---------------   -------------------------   -------------   ------------   
<sip:23001@192.168.126.21   192.168.126.210   ABONENT      SSW               192.168.126.212   <sip:23001@192.168.126.21   Available       9402/10800      
0:12300;transport=UDP>                                                                         7:5071;line=9e538107d8068                                  
                                                                                               2246c8eed958f91da89>                                   

Если спустя время запрос REGISTER для перерегистрации не поступил, то абонент становится недоступным. Все вызовы на этого абонента будут завершаться с причиной 480 Temporarily Unavailable.

vesbc#
 vesbc# show esbc users sip 23001@192.168.126.217 detailed 
 User AOR:       23001@192.168.126.217
 User type:      SIP
 Contact count:  1

IN User contact             IP address of     User         Trunk name        IP address of     OUT Trunk contact           Status          Expires        
                            user              interface                      registrar                                                                    
                                              name                                                                                                        
-------------------------   ---------------   ----------   ---------------   ---------------   -------------------------   -------------   ------------   
<sip:23001@192.168.126.21   192.168.126.210   ABONENT      SSW               192.168.126.212   <sip:23001@192.168.126.21   Not available   988/10800      
0:12300;transport=UDP>                                                                         7:5071;line=9e538107d8068                                  
                                                                                               2246c8eed958f91da89>                                   

Сброс регистрации абонента на регистраторе

Функция сброса регистрации абонента на регистраторе служит для очистки записи о регистрации абонента на вышестоящем сервере. При активной функции, если на ESBC будет удалена запись о регистрации абонента или он перерегистрируется на другом сервере, то в сторону регистратора направится запрос REGISTER с данными абонента и параметром Expires=0. Также запрос разрегистрации будет отправлен на регистратор в случае недоступности абонента, которая контролируется локальной обработкой регистрации. 

Функция включается на абонентском интерфейсе командой registration forced-unregistration enable.

Пример сброса регистрации абонента на регистраторе при ручном удалении регистрации на ESBC:

При ручном удалении регистрации абонента на ESBC будет отправлен запрос REGISTER с данными абонента и параметром Expires=0 на тот регистратор, где он зарегистрирован.

Схема:

На ESBC настроена конфигурация с интерфейсами, смотрящими в сторону SIP‑абонентов и SSW, с IP‑адресами 192.168.126.231 и 192.168.1.231 соответственно. Также есть абонентский интерфейс и транк, смотрящий в сторону SSW.

Пример настройки абонентского интерфейса:

vesbc# configure 
vesbc(config)# esbc  
vesbc(config-esbc)# user-interface sip ABONENT
vesbc(config-esbc-user-interface-sip)# sip transport ABONENT_TRANSPORT
vesbc(config-esbc-user-interface-sip)# media resource 0 ABONENT_MEDIA
vesbc(config-esbc-user-interface-sip)# route-table TO_SSW

#Включение разрегистрации абонентов на регистраторе:
vesbc(config-esbc-user-interface-sip)# registration forced-unregistration enable 

#Применение и подтверждение изменений:
vesbc(config-esbc-user-interface-sip)# do commit 
Configuration has been successfully applied and saved to flash. Commit timer started, changes will be reverted in 600 seconds.
vesbc(config-esbc-user-interface-sip)# do confirm
Configuration has been confirmed. Commit timer canceled.                         

Теперь при удалении регистраций, прошедших через этот абонентский интерфейс, в сторону SSW будут отправлены запросы REGISTER с данными удалённых абонентов с параметром Expires=0.

Схема прохождения запросов:

Пример ручного удаления регистрации через CLI:

#Вывод всех зарегистрированных абонентов:
vesbc# show esbc users sip
 Total AORs:       1
 Total Contacts:   1

User AOR                         User       Contact    
                                 type       count      
------------------------------   --------   --------   
100@192.168.126.230              SIP        1          

#Вывод детальной информации абонента с AOR 100@192.168.126.230:
vesbc# show esbc users sip 100@192.168.126.230 detailed 
 User AOR:       100@192.168.126.230
 User type:      SIP
 Contact count:  1
IN User contact             IP address of     User         Trunk name        IP address of     OUT Trunk contact           Status          Expires        
                            user              interface                      registrar                                                                    
                                              name                                                                                                        
-------------------------   ---------------   ----------   ---------------   ---------------   -------------------------   -------------   ------------   
<sip:100@192.168.126.230:   192.168.126.230   ABONENT      TO_SSW            192.168.1.232     <sip:100@192.168.1.231:50   Uncontrolled    980/1000       
5060>                                                                                          60;line=7d296a72328c2d1d5                                  
                                                                                               042ec9ad4db2bc6>     
                                                                         
#Удаление регистрации абонента с AOR 100@192.168.126.230:
vesbc# clear esbc registration pattern-aor 100@192.168.126.230
Following records will be deleted:                                              
-------------------------------------   -------------------------------------   
100@192.168.126.230                                                             
Do you really want to clear user registrations with pattern? (y/N): y
vesbc#                     

Также, если от абонента пришёл запрос регистрации с аутентификационными данными, они будут подставлены в запрос разрегистрации. В большинстве случаев сервер регистрации на такой запрос регистрации будет отправлять запрос аутентификации, но в некоторых случаях это позволит избежать 401 и 407 ответа.

Схема прохождения запросов с аутентификационными данными:

Пример сброса регистрации абонента при смене регистратора:

При регистрации абонента на другом направлении будет отправлен запрос REGISTER с данными абонента и параметром Expires=0 на тот регистратор, где он был зарегистрирован.

На ESBC настроена конфигурация с интерфейсами, смотрящими в сторону SIP‑абонентов и SSW, с IP‑адресами 192.168.126.231 и 192.168.1.231 соответственно. Также есть абонентский интерфейс и два транка, смотрящие в сторону SSW_1 и SSW_2. Транки находятся в транковой группе с балансировкой round robin. Поэтому сервер регистрации абонента будет чередоваться между SSW_1 и SSW_2.

Пример настройки абонентского интерфейса:

vesbc# configure 
vesbc(config)# esbc  
vesbc(config-esbc)# user-interface sip ABONENT
vesbc(config-esbc-user-interface-sip)# sip transport ABONENT_TRANSPORT
vesbc(config-esbc-user-interface-sip)# media resource 0 ABONENT_MEDIA
vesbc(config-esbc-user-interface-sip)# route-table TO_TRUNK_GROUP

#Включение разрегистрации абонентов на регистраторе:
vesbc(config-esbc-user-interface-sip)# registration forced-unregistration enable 

#Применение и подтверждение изменений:
vesbc(config-esbc-user-interface-sip)# do commit 
Configuration has been successfully applied and saved to flash. Commit timer started, changes will be reverted in 600 seconds.
vesbc(config-esbc-user-interface-sip)# do confirm
Configuration has been confirmed. Commit timer canceled.                         

Схема таблицы маршрутизации:

Алгоритм прохождения запросов:

1. Абонент регистрируется на SSW_1:

2. Абонент перерегистрируется, и запрос согласно таблице маршрутизации направляется на SSW_2:

3. В сторону SSW_1 будет отправлен запрос разрегистрации, так как абонент сменил сервер регистрации на SSW_2:

Пример сброса регистрации при недоступности абонента:

При недоступности абонента будет отправлен запрос REGISTER с данными абонента и параметром Expires=0 на тот регистратор, где он зарегистрирован. Контроль доступности абонента работает при включении локальной обработки регистраций.

Схема:

На ESBC настроена конфигурация с интерфейсами, смотрящими в сторону SIP‑абонентов и SSW, с IP‑адресами 192.168.126.231 и 192.168.1.231 соответственно. Также есть абонентский интерфейс и транк, смотрящий в сторону SSW.

Пример настройки абонентского интерфейса:

vesbc# configure 
vesbc(config)# esbc  
vesbc(config-esbc)# user-interface sip ABONENT
vesbc(config-esbc-user-interface-sip)# sip transport ABONENT_TRANSPORT
vesbc(config-esbc-user-interface-sip)# media resource 0 ABONENT_MEDIA
vesbc(config-esbc-user-interface-sip)# route-table TO_SSW

#Включение разрегистрации абонентов на регистраторе:
vesbc(config-esbc-user-interface-sip)# registration forced-unregistration enable 

#Включение локальной обработки регистраций:
vesbc(config-esbc-user-interface-sip)# registration simulation enable 

#Использование минимального времени регистрации на сервере:
vesbc(config-esbc-user-interface-sip)# registration simulation min-reg-expires 6000

#Использование максимального времени регистрации абонента:
vesbc(config-esbc-user-interface-sip)# registration simulation max-user-expires 60

#Применение и подтверждение изменений:
vesbc(config-esbc-user-interface-sip)# do commit 
Configuration has been successfully applied and saved to flash. Commit timer started, changes will be reverted in 600 seconds.
vesbc(config-esbc-user-interface-sip)# do confirm
Configuration has been confirmed. Commit timer canceled.                         

Алгоритм работы:

1. Абонент отправляет запрос регистрации на ESBC со своим временем регистрации. Если оно меньше 6000, то ESBC автоматически подставит Expires=6000 в отправленный на SSW запрос REGISTER. А в ответе 200 OK, который приходит к абоненту от ESBC, будет подставлен Expires=60, из‑за чего абонент будет чаще перерегистрироваться.

2. Если от абонента не пришла регистрация в течение 60 секунд, такой абонент считается недоступным, и отправляется разрегистрация на SSW.

Инициация перерегистрации абонента через SIP-NOTIFY

SIP‑телефоны и другие пользовательские агенты могут управляться удалённо с помощью SIP‑метода NOTIFY. Для управления устройством применяются специальные события «Event», которые позволяют серверу инициировать действия на SIP‑телефоне. На ESBC существует функция отправки управляющих NOTIFY для инициации обновления регистрации абонента при недоступности транка или ручном удалении регистрации.

Примеры инициации перерегистрации абонента через передачу SIP-NOTIFY.

Для инициации обновления регистрации абонента используется SIP‑метод NOTIFY. Для разных устройств могут быть использованы свои значения заголовка «Event».

Для ввода значения заголовка «Event» с использованием пробела используйте двойные кавычки, например:  

vesbc(config-esbc-user-interface-sip)# sip notify-unavailable event 'reg;id="software client"'

Передача SIP сообщения NOTIFY в случае недоступности сервера регистрации:

В случае недоступности сервера регистрации зарегистрированному абоненту будет отправлено SIP‑сообщение NOTIFY с назначенным значением заголовка «Event».

По умолчанию установлено значение: "check-sync".

Схема:

На ESBC настроена конфигурация с интерфейсами, смотрящими в сторону SIP‑абонентов и SSW, с IP‑адресами 192.168.126.231 и 192.168.1.231 соответственно. Также есть абонентский интерфейс и транк, смотрящий в сторону SSW. На транке настроен SIP-профиль с контролем доступности направления.

Пример настройки абонентского интерфейса:

vesbc# configure 
vesbc(config)# esbc  
vesbc(config-esbc)# user-interface sip ABONENT
vesbc(config-esbc-user-interface-sip)# sip transport ABONENT_TRANSPORT
vesbc(config-esbc-user-interface-sip)# media resource 0 ABONENT_MEDIA
vesbc(config-esbc-user-interface-sip)# route-table TO_SSW

#Включение отправки сообщения NOTIFY с заголовком "Event: check-sync;reboot=true" в случае недоступности сервера регистрации:
vesbc(config-esbc-user-interface-sip)# sip notify-unavailable enable event
vesbc(config-esbc-user-interface-sip)# sip notify-unavailable event "check-sync;reboot=true"

#Применение и подтверждение изменений:
vesbc(config-esbc-user-interface-sip)# do commit 
Configuration has been successfully applied and saved to flash. Commit timer started, changes will be reverted in 600 seconds.
vesbc(config-esbc-user-interface-sip)# do confirm
Configuration has been confirmed. Commit timer canceled.                         

Теперь при недоступности сервера SSW зарегистрированному абоненту будет отправлен NOTIFY с заголовком «Event: check‑sync;reboot=true».

Схема прохождения запросов:

Передача сообщения NOTIFY при ручном удалении регистрации абонента:

При ручном удалении регистрации абонента для отправки SIP‑сообщения NOTIFY с определённым значением заголовка «Event» нужно ввести его значение.

Схема:

На ESBC настроена конфигурация с интерфейсами, смотрящими в сторону SIP‑абонентов и SSW, с IP‑адресами 192.168.126.231 и 192.168.1.231 соответственно. Также есть абонентский интерфейс и транк, смотрящий в сторону SSW.

Пример ручного удаления регистрации c отправкой NOTIFY через CLI:

#Вывод всех зарегистрированных абонентов:
vesbc# show esbc users sip
 Total AORs:       1
 Total Contacts:   1

User AOR                         User       Contact    
                                 type       count      
------------------------------   --------   --------   
100@192.168.126.230              SIP        1          

#Вывод детальной информации абонента с AOR 100@192.168.126.230:
vesbc# show esbc users sip 100@192.168.126.230 detailed 
 User AOR:       100@192.168.126.230
 User type:      SIP
 Contact count:  1
IN User contact             IP address of     User         Trunk name        IP address of     OUT Trunk contact           Status          Expires        
                            user              interface                      registrar                                                                    
                                              name                                                                                                        
-------------------------   ---------------   ----------   ---------------   ---------------   -------------------------   -------------   ------------   
<sip:100@192.168.126.230:   192.168.126.230   ABONENT      TO_SSW            192.168.1.232     <sip:100@192.168.1.231:50   Uncontrolled    2950/3000       
5060>                                                                                          60;line=6d29aa7232hg789d5                                  
                                                                                               0412dwad4ds2bc6>     
                                                                         
#Удаление регистрации абонента с AOR 100@192.168.126.230 с отправкой NOTIFY с заголовком "Event: check-sync":
vesbc# clear esbc registration pattern-aor 100@192.168.126.230 send notify "check-sync"
Following records will be deleted:                                              
-------------------------------------   -------------------------------------   
100@192.168.126.230                                                             
Do you really want to clear user registrations with pattern? (y/N): y
vesbc#                     

Схема прохождения запросов:


Передача сообщения NOTIFY для устройств Cisco в случае недоступности сервера регистрации:

В случае недоступности сервера регистрации зарегистрированному абоненту Cisco будет отправлено SIP‑сообщение NOTIFY с заголовком «Event: service‑control» и телом с сообщением «action=restart» или «action=reset».

Схема:

На ESBC настроена конфигурация с интерфейсами, смотрящими в сторону SIP‑абонентов и SSW, с IP‑адресами 192.168.126.231 и 192.168.1.231 соответственно. Также есть абонентский интерфейс и транк, смотрящий в сторону SSW. На транке настроен SIP-профиль с контролем доступности направления.

Пример настройки абонентского интерфейса:

vesbc# configure 
vesbc(config)# esbc  
vesbc(config-esbc)# user-interface sip ABONENT
vesbc(config-esbc-user-interface-sip)# sip transport ABONENT_TRANSPORT
vesbc(config-esbc-user-interface-sip)# media resource 0 ABONENT_MEDIA
vesbc(config-esbc-user-interface-sip)# route-table TO_SSW

#Включение отправки сообщения NOTIFY для устройств CISCO с заголовком "Event: service-control" в случае недоступности сервера регистрации:
vesbc(config-esbc-user-interface-sip)# sip notify-unavailable enable cisco-service-control

#Назначение параметра "action=reset" в тело сообщения NOTIFY для устройств CISCO в случае недоступности сервера регистрации:
vesbc(config-esbc-user-interface-sip)# sip notify-unavailable cisco-service-control reset 

#Применение и подтверждение изменений:
vesbc(config-esbc-user-interface-sip)# do commit 
Configuration has been successfully applied and saved to flash. Commit timer started, changes will be reverted in 600 seconds.
vesbc(config-esbc-user-interface-sip)# do confirm
Configuration has been confirmed. Commit timer canceled.                         

Теперь при недоступности сервера SSW зарегистрированному абоненту будет отправлен NOTIFY с заголовком «Event: service-control» и телом со значением «action=reset».

Схема прохождения запросов:

Пример сообщения NOTIFY:

Session Initiation Protocol (NOTIFY)
    Request-Line: NOTIFY sip:100@192.168.126.230:5060;transport=udp SIP/2.0
    Message Header
        Via: SIP/2.0/UDP 192.168.126.231:5060;rport;branch=z9hG4bKPjebbcb9c2-9484-4d61-8d30-5cfa71fc3b06
        Max-Forwards: 70
        From: <sip:100@192.168.126.231>;tag=a2d23820-d7f8-44bc-9ab0-b5824cefbd31
        To: <sip:100@192.168.126.231>
        Call-ID: fb7dbd3675a6cb8111a9a0d611ba4cae
        [Generated Call-ID: fb7dbd3675a6cb8111a9a0d611ba4cae]
        CSeq: 9607 NOTIFY
        Event: service-control
        Content-Type: text/plain
        Content-Length:    69

    Message Body
        Line-based text data: text/plain (2 lines)
            action=reset\r\n
            RegisterCallId={a5cda0d8-98a1-1200-e8a8-6813e20921bf}\r\n

Передача сообщения NOTIFY для устройств Cisco при ручном удалении регистрации абонента:

При ручном удалении регистрации абонента Cisco можно отправить SIP‑сообщение NOTIFY с заголовком «Event: service‑control» и телом с сообщением «action=restart» или «action=reset». 

Схема:

На ESBC настроена конфигурация с интерфейсами, смотрящими в сторону SIP‑абонентов и SSW, с IP‑адресами 192.168.126.231 и 192.168.1.231 соответственно. Также есть абонентский интерфейс и транк, смотрящий в сторону SSW.

Пример ручного удаления регистрации c отправкой NOTIFY через CLI:

#Вывод всех зарегистрированных абонентов:
vesbc# show esbc users sip
 Total AORs:       1
 Total Contacts:   1

User AOR                         User       Contact    
                                 type       count      
------------------------------   --------   --------   
100@192.168.126.230              SIP        1          

#Вывод детальной информации абонента с AOR 100@192.168.126.230:
vesbc# show esbc users sip 100@192.168.126.230 detailed 
 User AOR:       100@192.168.126.230
 User type:      SIP
 Contact count:  1
IN User contact             IP address of     User         Trunk name        IP address of     OUT Trunk contact           Status          Expires        
                            user              interface                      registrar                                                                    
                                              name                                                                                                        
-------------------------   ---------------   ----------   ---------------   ---------------   -------------------------   -------------   ------------   
<sip:100@192.168.126.230:   192.168.126.230   ABONENT      TO_SSW            192.168.1.232     <sip:100@192.168.1.231:50   Uncontrolled    2950/3000       
5060>                                                                                          60;line=6d29aa7232hg789d5                                  
                                                                                               0412dwad4ds2bc6>     
                                                                         
#Удаление регистрации абонента с AOR 100@192.168.126.230 с отправкой NOTIFY с заголовком "Event: service-control" и "action=restart" в теле сообщения:
vesbc# clear esbc registration pattern-aor 100@192.168.126.230 send cisco-service-control restart
Following records will be deleted:                                              
-------------------------------------   -------------------------------------   
100@192.168.126.230                                                             
Do you really want to clear user registrations with pattern? (y/N): y
vesbc#                     

Схема прохождения запросов:

Пример сообщения NOTIFY:

Session Initiation Protocol (NOTIFY)
    Request-Line: NOTIFY sip:100@192.168.126.230:5060;transport=udp SIP/2.0
    Message Header
        Via: SIP/2.0/UDP 192.168.126.231:5060;rport;branch=z9hG4bKPj362e9c4a-f201-4c55-86c8-af862ab6df9b
        Max-Forwards: 70
        From: <sip:100@192.168.126.231>;tag=559d013f-ece6-444f-a239-8c5ecab73392
        To: <sip:100@192.168.126.231>
        Call-ID: fb7dbd3675a6cb8111a9a0d611ba4cae
        [Generated Call-ID: fb7dbd3675a6cb8111a9a0d611ba4cae]
        CSeq: 9607 NOTIFY
        Event: service-control
        Content-Type: text/plain
        Content-Length:    71
    Message Body
        Line-based text data: text/plain (2 lines)
            action=restart\r\n
            RegisterCallId={a5cda0d8-98a1-1200-e8a8-6813e20921bf}\r\n

При включении двух типов работы NOTIFY, ESBC отправит сначала обычный «Event». Если ответ будет отличен от 200 или его не будет вовсе, запрос завершится таймаутом, и ESBC отправит NOTIFY с «Event: service-control».

Настройка SIP-транков

SIP-транк представляет собой интерфейс для подключения к вышестоящему SIP-устройству (IP АТС/ SIP-proxy/Удаленный SSW и др.) или группе вышестоящих устройств при включении динамического режима работы транка. При включении динамического режима работы в конфигурации необходимо задать адрес и порт удалённой стороны или диапазон адресов и портов. Эти параметры используются для идентификации источника запроса.

На транке запрещена обработка входящих запросов REGISTER.

Для создания SIP-транка необходимо настроить:

Эти настройки являются обязательными. Описание конфигурирования и базовой схемы применения представлено в разделе Примеры настройки ESBC. 

Помимо этого SIP-транк содержит набор следующих настроек:

Подробное описание параметров всех настроек можно найти в разделе Настройки SIP-транка справочника команд CLI. 

Cоздание транков с одинаковым SIP-транспортом и IP:Port разрешено только в случае, если отличается SIP-домен.

С целью повышения безопасности, входящие запросы OPTIONS, поступающие в транк будут игнорироваться. Для изменения поведения см. раздел Игнорирование OPTIONS.

Динамический режим транка

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

В текущей версии ПО в качестве внешнего сервиса могут выступать DNS и RADIUS.

Схема применения:


Описание:

SIP-абоненты (IP-телефон/VoIP-шлюз/Мобильный SIP-клиент и т. д.) отправляют SIP-запросы на IP-адрес 192.168.20.120 порт 5060.
ESBC должен смаршрутизировать запрос в зависимости от домена в hostname части RURI (или заголовка To), полученного от абонента. Вызовы/регистрации могут быть смаршрутизированы на один из трёх Softswitch (IP АТС/SIP-proxy и т. д), на каждом из них настроено несколько доменов.

Алгоритм поиска домена для определения адреса динамического транка:

  1. Если в Request-URI указан домен, то он будет использоваться для определения адреса транка;
  2. Если в Request-URI указан адрес, то проверяется значение в заголовке To:
    1. Если в To указан домен, то он будет использоваться для определения адреса транка;
    2. Если в To указан адрес, то произойдёт отбой вызова.

Для реализации данной схемы общий алгоритм настройки следующий:

1.  Настроить IP-адрес на интерфейсе в сторону SSW:

vesbc# configure
vesbc(config)# interface gigabitethernet 1/0/1
vesbc(config-if-gi)# description "SSW"
vesbc(config-if-gi)# ip address 192.168.16.113/24
vesbc(config-if-gi)# ip firewall disable

2. Настроить IP-адрес на внешнем интерфейсе в сторону абонентов:

vesbc# configure
vesbc(config)# interface gigabitethernet 1/0/2
vesbc(config-if-gi)# description "ABONENTS"
vesbc(config-if-gi)# ip address 192.168.20.120/24

3. Создать SIP-транспорт в сторону SSW: 

vesbc#
vesbc# configure
vesbc(config)# esbc
vesbc(config-esbc)# sip transport TRANSPORT_SSW
vesbc(config-esbc-sip-transport)# ip address 192.168.16.113
vesbc(config-esbc-sip-transport)# port 5061

4. Создать SIP-транспорт в сторону абонентов:

vesbc#
vesbc# configure
vesbc(config)# esbc
vesbc(config-esbc)# sip transport TRANSPORT_ABONENTS
vesbc(config-esbc-sip-transport)# ip address 192.168.20.120

5. Создать медиаресурсы для согласования и передачи голоса на плече SSW --- ESBC:

vesbc#
vesbc# configure
vesbc(config)# esbc
vesbc(config-esbc)# media resource MEDIA_SSW
vesbc(config-esbc-media-resource)# ip address 192.168.16.113

#Указать диапазон портов, который будет выделяться на ESBC для передачи голоса. Данная команда необязательная. Если ее не указывать, будет использоваться диапазон портов 8000–65535.
vesbc(config-esbc-media-resource)# port-range 1024-65535

6. Создать медиаресурсы для согласования и передачи голоса на плече ESBC --- Абонентский шлюз/SIP-абоненты:

vesbc#
vesbc# configure
vesbc(config)# esbc
vesbc(config-esbc)# media resource MEDIA_ABONENTS
vesbc(config-esbc-media-resource)# ip address 192.168.20.120

7. Создать абонентский интерфейс в сторону абонентов:

vesbc#
vesbc# configure
vesbc(config)# esbc
vesbc(config-esbc)# user-interface sip ABONENTS
vesbc(config-esbc-trunk-sip)# sip transport TRANSPORT_ABONENTS
vesbc(config-esbc-trunk-sip)# media resource 0 MEDIA_ABONENTS

#Если абоненты находятся за NAT, выполнить команду:
vesbc(config-esbc-user-interface-sip)# nat comedia-mode on

8. Настроить внешний сервис, создать SIP-транк в динамическом режиме и настроить маршрутизацию.

DNS

1. Настроить DNS:

vesbc(config)# domain lookup enable
vesbc(config)# domain nameserver 192.168.16.200
vesbc(config)# 

Описание всех доступных настроек DNS приведено в разделе Настройка DNS Справочника команд CLI.

2. Создать динамический SIP-транк, в качестве адреса указать подсеть, в которой находятся SSW:

vesbc#
vesbc# configure
vesbc(config)# esbc
vesbc(config-esbc)# trunk sip SSW_DYNAMIC
vesbc(config-esbc-trunk-sip)# sip transport TRANSPORT_SSW
vesbc(config-esbc-trunk-sip)# remote address 192.168.16.0/24
vesbc(config-esbc-trunk-sip)# remote port 5060
vesbc(config-esbc-trunk-sip)# dynamic-mode dns
vesbc(config-esbc-trunk-sip)# media resource 0 MEDIA_SSW

3. Создать таблицу маршрутизации и добавить туда правила, по которым вызовы, приходящие с абонентов будут маршрутизироваться на SIP-транк с динамическим режимом:

vesbc# 
vesbc# configure 
vesbc(config)# esbc 
vesbc(config-esbc)# route-table TO_SSW
vesbc(config-esbc-route-table)# rule 0
vesbc(config-esbc-route-table-rule)# action direct-to-trunk SSW_DYNAMIC

4. Привязать созданную таблицу маршрутизации к абонентскому интерфейсу:

vesbc# 
vesbc# configure 
vesbc(config)# esbc 
vesbc(config-esbc)# user-interface sip ABONENTS 
vesbc(config-esbc-user-interface-sip)# route-table TO_SSW

5. Применить конфигурацию и подтвердить изменения:

vesbc# commit
vesbc# confirm

Пример:

SIP-абонент отправляет сообщение REGISTER, в hostname RURI указывает ssw125_2.domain. ESBC отправляет запрос на DNS-сервер (192.168.16.200) для определения адреса назначения, внешний сервис в ответ присылает адрес SIP-сервера (192.168.16.125), на который нужно отправить запрос. ESBC отправляет регистрацию на указанный адрес, подставляя в заголовки To и From ssw125_2.domain, последующие запросы с этого абонента при указании того же домена будут отправляться в транк 192.168.16.125 без предварительного обращения к внешнему сервису.

Исходящий запрос на динамический транк будет отправлен на тот же порт, что указан в RURI входящего запроса. Если порт явно не указан, то запрос отправится на стандартный порт 5060.

Для определения входящего запроса из транка с динамическим режимом используется адрес/маска подсети из remote address и порт/диапазон портов из remote port.

RADIUS

1. Настроить RADIUS-сервер.

Пример конфигурации freeradius:

Файл clients.conf:
client ESBC {
#Адрес интерфейса ESBC, с которого будут отправляться запросы на RADIUS-сервер:
    ipaddr = 192.168.16.113 
#Ключ для аутентификации клиента:
    secret = password 
}

Файл users:
#Обязательный пароль при использовании динамического режима:
ssw125_2.domain Cleartext-Password := "domain_resolve" 
#Адрес, который сервер отправит в ответе на Access-Request с User-Name: ssw125_2.domain:
    Framed-IP-Address = 192.168.16.125 

2. Задать параметры RADIUS-сервера на ESBC:

vesbc(config)# radius-server host 192.168.16.250
#Пароль, который должен совпадать с secret на сервере:
vesbc(config-radius-server)# key ascii-text password
vesbc(config-radius-server)# usage voip
#Адрес интерфейса, с которого будут отправляться запросы:
vesbc(config-radius-server)# source-address 192.168.16.113 

Описание всех доступных настроек RADIUS-сервера приведено в разделе Настройка AAA Справочника команд CLI.

3. Создать RADIUS-профиль, добавить в его конфигурацию RADIUS-сервер: 

vesbc(config)# esbc
vesbc(config-esbc)# radius profile RADIUS_PROFILE
vesbc(config-radius-profile)# radius-server host 192.168.16.250

Описание всех доступных настроек RADIUS-профиля приведено в разделе Настройка ESBC Справочника команд CLI.

4. Создать динамический SIP-транк, в качестве адреса указать подсеть, в которой находятся SSW:

vesbc#
vesbc# configure
vesbc(config)# esbc
vesbc(config-esbc)# trunk sip SSW_DYNAMIC
vesbc(config-esbc-trunk-sip)# sip transport TRANSPORT_SSW
vesbc(config-esbc-trunk-sip)# remote address 192.168.16.0/24
vesbc(config-esbc-trunk-sip)# remote port 5060
vesbc(config-esbc-trunk-sip)# dynamic-mode radius RADIUS_PROFILE
vesbc(config-esbc-trunk-sip)# media resource 0 MEDIA_SSW

5. Создать таблицу маршрутизации и добавить туда правила, по которым вызовы, приходящие с абонентов будут маршрутизироваться на SIP-транк с динамическим режимом:

vesbc# 
vesbc# configure 
vesbc(config)# esbc 
vesbc(config-esbc)# route-table TO_SSW
vesbc(config-esbc-route-table)# rule 0
vesbc(config-esbc-route-table-rule)# action direct-to-trunk SSW_DYNAMIC

6. Привязать созданную таблицу маршрутизации к абонентскому интерфейсу:

vesbc# 
vesbc# configure 
vesbc(config)# esbc 
vesbc(config-esbc)# user-interface sip ABONENTS 
vesbc(config-esbc-user-interface-sip)# route-table TO_SSW

7. Применить конфигурацию и подтвердить изменения:

vesbc# commit
vesbc# confirm

Пример:

SIP-абонент отправляет сообщение REGISTER, в hostname RURI указывает ssw125_2.domain. ESBC для определения адреса назначения отправляет запрос (Access-Request) на RADIUS-сервер (192.168.16.250) c атрибутом User-Name, в котором содержится домен ssw125_2.domain.
RADIUS-сервер присылает Access-Accept с адресом SIP-сервера (192.168.16.125) в атрибуте Framed-IP-Address.  
ESBC отправляет регистрацию на указанный адрес, подставляя в заголовки To и From ssw125_2.domain, последующие запросы с этого абонента при указании того же домена будут отправляться в транк 192.168.16.125 без предварительного обращения к внешнему сервису.

Исходящий запрос на динамический транк будет отправлен на тот же порт, что указан в RURI входящего запроса. Если порт явно не указан, то запрос отправится на стандартный порт 5060.

Для определения входящего запроса из транка с динамическим режимом используется адрес/маска подсети из remote address и порт/диапазон портов из remote port.

Настройка транковых групп

Транк-группа представляет собой набор транков различного типа (в текущей версии поддерживается только SIP-транк) и алгоритм балансировки нагрузки между ними. В текущей версии балансировка вызовов осуществляется алгоритмами round robin и weighted round robin.

Помимо этого группа содержит набор следующих настроек:

Логика работы:

Все перечисленные в предыдущем пункте настройки являются общими для всех транков, включенных в состав транковой группы. Это значит, что при отсутствии у транка, входящего в состав транковой группы, какой-либо из перечисленных настроек, будет использоваться настройка из транковой группы. Такой подход позволяет создавать множество транков с минимальным набором настроек, и, объединяя их в транковую группу, производить донастройку через нее. При необходимости можно изменить какие-либо параметры отдельно взятых транков из группы через индивидуальную настройку транков.

Пример работы общих настроек:

Схема:

На ESBC настроена транковая группа TG_SSW, в состав которой входят 2 транка TRUNK_SSW1 и TRUNK_SSW2, также настроен еще один транк TRUNK_IN, который не входит в состав транковой группы. Требуется настроить схему таким образом, чтобы вызовы, которые пришли с TRUNK_IN, маршрутизировались на TG_SSW, и наоборот, вызовы, которые пришли с TRUNK_SSW1 и TRUNK_SSW2, маршрутизировались на TRUNK_IN.

Решение:

1. Создать SIP-транспорт в сторону TRUNK_SSW1 и TRUNK_SSW2:

vesbc#
vesbc# configure
vesbc(config)# esbc
vesbc(config-esbc)# sip transport TRANSPORT_SSW
vesbc(config-esbc-sip-transport)# ip address 192.168.16.113
vesbc(config-esbc-sip-transport)# port 5065

2. Создать SIP-транспорт в сторону TRUNK_IN: 

vesbc#
vesbc# configure
vesbc(config)# esbc
vesbc(config-esbc)# sip transport TRANSPORT_TRUNK_IN
vesbc(config-esbc-sip-transport)# ip address 192.168.20.120
vesbc(config-esbc-sip-transport)# port 5067

3. Создать медиаресурсы для согласования и передачи голоса на плече TRUNK_IN --- ESBC:

vesbc#
vesbc# configure
vesbc(config)# esbc
vesbc(config-esbc)# media resource MEDIA_TRUNK_IN
vesbc(config-esbc-media-resource)# ip address 192.168.20.120

4. Создать медиаресурсы для согласования и передачи голоса на плече ESBC --- TG_SSW:

vesbc#
vesbc# configure
vesbc(config)# esbc
vesbc(config-esbc)# media resource MEDIA_TG_SSW
vesbc(config-esbc-media-resource)# ip address 192.168.16.113

5. Создать SIP-транк в сторону TRUNK_IN:

vesbc#
vesbc# configure
vesbc(config)# esbc
vesbc(config-esbc)# trunk sip TRUNK_IN
vesbc(config-esbc-trunk-sip)# sip transport TRANSPORT_TRUNK_IN
vesbc(config-esbc-trunk-sip)# remote address 192.168.20.99
vesbc(config-esbc-trunk-sip)# remote port 5060
vesbc(config-esbc-trunk-sip)# media resource 0 MEDIA_TRUNK_IN

6. Создать SIP-транк в сторону TRUNK_SSW1 и TRUNK_SSW2:

vesbc#
vesbc# configure
vesbc(config)# esbc
vesbc(config-esbc)# trunk sip TRUNK_SSW1
vesbc(config-esbc-trunk-sip)# sip transport TRANSPORT_SSW
vesbc(config-esbc-trunk-sip)# remote address 192.168.16.115
vesbc(config-esbc-trunk-sip)# remote port 5060
vesbc(config-esbc-trunk-sip)# exit
vesbc(config-esbc)# trunk sip TRUNK_SSW2
vesbc(config-esbc-trunk-sip)# sip transport TRANSPORT_SSW
vesbc(config-esbc-trunk-sip)# remote address 192.168.16.116
vesbc(config-esbc-trunk-sip)# remote port 5060

7. Создать транковую группу TG_SSW и добавить туда транки TRUNK_SSW1 и TRUNK_SSW2:

vesbc#
vesbc# configure
vesbc(config)# esbc

#Создание и переход в настройки транковой группы TG_SSW:
vesbc(config-esbc)# trunk-group TG_SSW

#Добавление в состав транковой группы транков TRUNK_SSW1 и TRUNK_SSW2:
vesbc(config-esbc-trunk-group)# trunk 0 TRUNK_SSW1
vesbc(config-esbc-trunk-group)# trunk 1 TRUNK_SSW2

#Добавление медиаресурсов:
vesbc(config-esbc-trunk-group)# media resource 0 MEDIA_TG_SSW

8. Создать таблицу маршрутизации и добавить туда правила, по которым вызовы, приходящие с транка TRUNK_IN, будут маршрутизироваться в транковую группу TG_SSW:

vesbc# 
vesbc# configure 
vesbc(config)# esbc 
vesbc(config-esbc)# route-table TO_TG_SSW
vesbc(config-esbc-route-table)# rule 0
vesbc(config-esbc-route-table-rule)# action direct-to-trunk-group TG_SSW

9. Создать таблицу маршрутизации и добавить туда правила, по которым вызовы, приходящие с TG_SSW, будут маршрутизироваться в транк TRUNK_IN:

vesbc# 
vesbc# configure 
vesbc(config)# esbc 
vesbc(config-esbc)# route-table TO_TRUNK_IN
vesbc(config-esbc-route-table)# rule 0
vesbc(config-esbc-route-table-rule)# action direct-to-trunk TRUNK_IN

10. Привязать созданные таблицы маршрутизации к транку TRUNK_IN и транковой группе TG_SSW:

vesbc# 
vesbc# configure 
vesbc(config)# esbc 
vesbc(config-esbc)# trunk sip TRUNK_IN
vesbc(config-esbc-trunk-sip)# route-table TO_TG_SSW
vesbc(config-esbc-trunk-sip)# exit
vesbc(config-esbc)# trunk-group TG_SSW
vesbc(config-esbc-trunk-sip)# route-table TO_TRUNK_IN

11. Применить конфигурацию и подтвердить изменения:

vesbc# commit
vesbc# confirm

На шаге 6 при создании транков, в конфигурацию транков не были добавлены медиаресурсы и таблица маршрутизации. Но эти настройки есть в транковой группе TG_SSW, куда включены оба транка. Поэтому при поступлении вызовов с этих транков они будут маршрутизироваться по таблице маршрутизации, которая привязана к TG_SSW, медиаресурсы для согласования и передачи RTP также будут браться из транковой группы TG_SSW.

В случае если необходимо, чтобы один из транков, входящих в состав транковой группы, при поступлении на него входящих вызовов маршрутизировался по другой таблице маршрутизации или использовал другие медиаресурсы, нужно добавить соответствующие настройки в данный транк. Настройки транковой группы при этом не меняются, т. к. настройки транка в приоритете.  

Логика работы транковой группы для распределения вызовов на транки, входящие в ее состав

1. Распределение вызовов без использования алгоритма балансировки:

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

Пример:

На ESBC настроена транковая группа TRUNK_GROUP, в состав которой входят 3 транка (TRUNK_1, TRUNK_2 и TRUNK_3). Приходит вызов и по правилу маршрутизации уходит на эту транковую группу. В результате ESBC совершает попытку вызова в первый транк в составе транковой группы (TRUNK_1), если транк недоступен, то происходит попытка позвонить во второй транк (TRUNK_2). Если попытка вызова также неуспешна, то будет попытка позвонить в последний транк (TRUNK_3). Если попытка также неуспешна, то вызов на первом плече отбивается. Если на каком-то из транков пришел ответ 200ОК, то вызов устанавливается.

Все последующие вызовы также будут сначала отправлены в TRUNK_1, и только в случае неудачи будут попытки позвонить в TRUNK_2 и TRUNK_3.

2. Распределение вызовов без использования алгоритма балансировки, но с включенной опцией pick-once:

Все исходящие вызовы, маршрутизируемые через транковую группу, используют первый транк в группе. В случае недоступности транка или при совпадении ответа с маской из списка причин отбоя, вызов НЕ будет направлен через следующий транк в группе, вызов на первом плече сразу отбивается.

Опцию pick-once можно включить в настройках таблицы маршрутизации при выборе действия direct-to-trunk-group:

vesbc# 
vesbc# configure 
vesbc(config)# esbc 
vesbc(config-esbc)# route-table TO_TG_SSW
vesbc(config-esbc-route-table)# rule 0

#Включение опции pick-once при создании правила маршрутизации на транковую группу TG_SSW:
vesbc(config-esbc-route-table-rule)# action direct-to-trunk-group TG_SSW pick-once

3. Распределение вызовов с использованием алгоритма балансировки round-robin (опция pick-once выключена):

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

Пример:

На ESBC настроена транковая группа TRUNK_GROUP, в состав которой входят 3 транка (TRUNK_1, TRUNK_2 и TRUNK_3). Приходит вызов и по правилу маршрутизации уходит на эту транковую группу. В результате ESBC совершает попытку вызова в первый транк в составе транковой группы (TRUNK_1), если вызов неуспешный (транк недоступен или ответ совпал с маской из списка причин отбоя), то происходит попытка позвонить во второй транк (TRUNK_2). Если попытка вызова также неуспешна, то будет попытка позвонить в последний транк (TRUNK_3). Если попытка также неуспешна, то вызов на первом плече отбивается. Если на каком-то из транков пришел ответ 200ОК, то вызов устанавливается. 

Второй вызов, который смаршрутизировался на данную транковую группу, сначала уйдет на TRUNK_2. Если вызов неуспешный, то ESBC совершит попытку позвонить в TRUNK_3 и потом в TRUNK_1. Если попытки неуспешны, то вызов на первом плече отбивается. По такому же принципу третий вызов сначала распределится в TRUNK_3, четвертый вызов — в TRUNK_1 и т. д. 

Опция балансировки round-robin включается в настройках транковой группы:

vesbc#
vesbc# configure
vesbc(config)# esbc

#Создание и переход в настройки транковой группы TRUNK_GROUP:
vesbc(config-esbc)# trunk-group TRUNK_GROUP

#Добавление в состав транковой группы транков TRUNK_1, TRUNK_2 и TRUNK_3:
vesbc(config-esbc-trunk-group)# trunk 0 TRUNK_1
vesbc(config-esbc-trunk-group)# trunk 1 TRUNK_2
vesbc(config-esbc-trunk-group)# trunk 2 TRUNK_3

#Активация режима балансировки round-robin на траковой группе:
vesbc(config-esbc-trunk-group)# balancing round-robin

4. Распределение вызовов с использованием алгоритма балансировки round-robin (опция pick-once включена):

Каждый последующий исходящий вызов, маршрутизируемый через транковую группу, использует следующий транк в группе. В случае недоступности транка или при совпадении ответа с маской из списка причин отбоя вызов НЕ будет направлен через следующий транк в группе, вызов на первом плече сразу отбивается.

Пример:

В схеме из п. 3 первый вызов распределяется в TRUNK_1, если он отбивается, то первое плечо вызова сразу отбивается, попыток позвонить в TRUNK_2, TRUNK_3 нет. Второй вызов распределяется в TRUNK_2, третий — в TRUNK_3, четвертый — в TRUNK_1 и т. д.

5. Распределение вызовов с использованием алгоритма балансировки weighted round-robin (опция pick-once выключена):

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

Пример:

На ESBC настроена транковая группа TRUNK_GROUP, в состав которой входят 3 транка (TRUNK_1, TRUNK_2 и TRUNK_3) с весами 50, 70 и 80 соответственно. Приходит вызов и по правилу маршрутизации уходит на эту транковую группу. В результате ESBC будет распределять вызовы, согластно выставленным весам. Например из 100 вызовов направленных через транковую группу в транк TRUNK_1 с весом 50 направится 25 вызовов, в транк TRUNK_2 направится 35 вызовов и в TRUNK_3 направится 40 вызовов.  

Веса транков и опция балансировки weighted round-robin назначаются в настройках транковой группы:

vesbc#
vesbc# configure
vesbc(config)# esbc

#Создание и переход в настройки транковой группы TRUNK_GROUP:
vesbc(config-esbc)# trunk-group TRUNK_GROUP

#Добавление в состав транковой группы транков TRUNK_1 с весом 50, TRUNK_2 с весом 70 и TRUNK_3 с весом 80:
vesbc(config-esbc-trunk-group)# trunk 0 TRUNK_1 weight 50
vesbc(config-esbc-trunk-group)# trunk 1 TRUNK_2 weight 70
vesbc(config-esbc-trunk-group)# trunk 2 TRUNK_3 weight 80

#Активация режима балансировки weighted round-robin на траковой группе:
vesbc(config-esbc-trunk-group)# balancing weighted-round-robin

6. Распределение вызовов с использованием алгоритма балансировки weighted round-robin (опция pick-once включена):

Каждые последующие исходящие вызовы, маршрутизируемые через транковую группу, распределяются согласно настроенным весам на транках в этой группе. В случае недоступности транка или при совпадении ответа с маской из списка причин отбоя вызов НЕ будет направлен через следующий транк в очереди, вызов на первом плече сразу отбивается.

Настройка SIP-транспортов

SIP-транспорт представляет точку входа/выхода сигнализации, т. е. это IP-адрес и порт, с которого ESBC будет отправлять и на который будет принимать сигнальные сообщения. 

Возможно использование IP-адреса, полученного по DHCP.

Пример:

Требуется, чтобы ESBC для передачи/приема сигнальных сообщений на встречную сторону использовал IP-адрес 192.168.16.113, порт 5065.

Решение:

Перейти к настройкам модуля управления конфигурацией ESBC:

vesbc# 
vesbc# configure 
vesbc(config)# esbc 

Создать и настроить соответствующим образом SIP-транспорт:  

#Создание/переход в настройки SIP-транспорта NEW_TRANSPORT:
vesbc(config-esbc)# sip transport NEW_TRANSPORT

#Назначить IP-адрес 192.168.16.113 для использования SIP-транспортом:
vesbc(config-esbc-sip-transport)# ip address 192.168.16.113

#Назначить порт 5065 для использования SIP-транспортом:
vesbc(config-esbc-sip-transport)# port 5065

#Выбрать протокол транспортного уровня, используемый для приема/передачи сообщений SIP:
vesbc(config-esbc-sip-transport)# mode udp-prefer

После привязки созданного SIP-транспорта к какому-либо направлению (транку или абонентскому интерфейсу) он будет использоваться для передачи/получения сигнальных SIP-сообщений на выбранных направлениях.

Поддержано несколько режимов работы с протоколами транспортного уровня, конфигурируется командой mode из примера выше. Режимы работы следующие: 

При использовании типа транспорта tls или wss возможно использование пользовательских сертификатов. Подробнее о пользовательских сертификатах см. в разделе Настройка криптопрофилей.

Пример настройки SIP-абонентов, использующих WebRTC есть в разделе Примеры настройки ESBC.

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

Медиаресурсы представляют собой диапазоны UDP-портов и IP-адресов, используемых ESBC для передачи/получения потоков RTP. 

Возможно использование IP-адреса, полученного по DHCP.

При указании диапазона портов для RTP, необходимо чтобы начальный порт был четным а конечный порт нечетным. 

Минимальный начальный номер порта - 1024, минимальный конечный номер порта - 1027, максимальный конечный номер порта - 65535.

Т.о. минимальный диапазон портов не может быть менее 4-х.

По-умалчанию используется диапазон портов с 8000 по 65535

Пример:

Требуется, чтобы ESBC для передачи медиатрафика использовал IP-адрес 192.168.16.113 и порты с 20000 до 29999.

Решение:

Перейти к настройкам модуля управления конфигурацией ESBC:

vesbc# 
vesbc# configure 
vesbc(config)# esbc 

Создать и настроить соответствующим образом медиаресурс: 

#Создание/переход в настройки медиаресурса MEDIA_1:
vesbc(config-esbc)# media resource MEDIA_1

#Назначить IP-адрес 192.168.16.113 для использования в медиаресурсах:
vesbc(config-esbc-media-resource)# ip address 192.168.16.113

#Настроить диапазон UDP-портов с 20000 до 29999 для использовании в медиаресурсах:
vesbc(config-esbc-media-resource)# port-range 20000-29999

После привязки созданного медиаресурса к какому-либо направлению (транку, транковой группе или абонентскому интерфейсу), он будет использоваться для передачи/получения потоков RTP на выбранных направлениях.

При использовании одинакового IP-адреса для разных медиаресурсов не допускается пересечение диапазонов портов между этими ресурсами. 

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

Механизм тегирования предназначен для оптимизации и упрощения таблиц маршрутизации и увеличения гибкости модификации SIP-сообщений. Вместо создания множества отдельных правил для каждого телефонного префикса, маршрутизация строится на основе текстовых меток (тегов), которые динамически присваиваются вызову на этапе анализа SIP-сообщения.

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

Для добавления и  удаления тегов используются Общие модификаторы (common). 

Тег является виртуальным параметром, который используется только логикой взаимодействаия объектов ESBC (Таблицы маршрутизации, Таблицы модификации) и  не добавляется в сообщения предаваемые через ESBC.

Примеры использовании тегов находятся вразделах Настройка таблиц маршрутизации и Настройка модификаторов

Настройка таблиц маршрутизации

Схема осуществления маршрутизации SIP-сообщения:

Таблица маршрутизации представляет собой набор правил и действий, по которым обрабатывается входящий вызов и указывается исходящий транк (или транк-группа) или переход на другую таблицу маршрутизации для формирования исходящего вызова.

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

Таблица состоит из правил (RULE), правило обязательно должно содержать действие (ACTION), и, опционально, — условия (CONDITION), которые должны быть соблюдены для выполнения данного действия маршрутизации. Если условия отсутствуют, действия совершаются безусловно.
Действие — это операция, результатом которой будет являться конкретное направление или переход на другую таблицу маршрутизации.
В текущей версии в качестве направлений могут выступают транки и транк-группы.

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

Также порядок выбора правила для исходящих вызовов может составляться исходя из алгоримов балансировки round robin и weighted round robin. 

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

В общем, этот алгоритм можно описать так: проход по всем направлениям, всех правил маршрутизации, пока сессия не будет согласована, или не будет рассмотрено последнее правило.
Исключением является правило Reject — отбой входящей сессии. Это правило завершает проход по таблице маршрутизации. Для него можно выбрать SIP код отбоя которым будет отбиваться входящее сообщение. 

Выбор следующего направления будет происходить:

Пример перебора правил:

В таблице маршрутизации два правила, первое направляет вызов в TRUNK_GROUP, второе направляет вызов в TRUNK_3, условия нигде не настроены. Приходит вызов и начинает маршрутизироваться по данной таблице маршрутизации. В результате вызов уходит на TRUNK_GROUP и оттуда в TRUNK_1, в случае если вызов через TRUNK_1 не установился (например, транк недоступен), то маршрутизация продолжает выполняться, вызов отправляется в TRUNK_2. Если попытка вызова в TRUNK_2 также завершилась неудачно, ESBC переходит к RULE_2 и отправляет вызов в TRUNK_3. Если и здесь попытка установить вызов также оказалась неуспешной, то первое плечо отбивается, и вызов завершается, т. к. больше правил в таблице маршрутизации нет. Если попытка установить вызов успешна, то вызов устанавливается.

vesbc# 
vesbc# configure 
vesbc(config)# esbc 
vesbc(config-esbc)# route-table ROUTE_TABLE

#Добавление первого правила с действием отправить вызов в транковую группу TRUNK_GROUP:
vesbc(config-esbc-route-table)# rule 1
vesbc(config-esbc-route-table-rule)# action direct-to-trunk-group TRUNK_GROUP
vesbc(config-esbc-route-table-rule)# exit

#Добавление второго правила с действием отправить вызов в транк TRUNK_3:
vesbc(config-esbc-route-table)# rule 2
vesbc(config-esbc-route-table-rule)# action direct-to-trunk TRUNK_3

Балансировка правил таблицы маршрутизации

Пример балансировки правил по алгоритму round robin

При настроенной балансировке правил таблицы маршрутизации по алгоритму round robin каждый последующий вызов будет направляться на следующее правило в таблице маршрутизации.

Схема:

В таблице маршрутизации три правила, первое направляет вызов в TRUNK_GROUP, второе направляет вызов в TRUNK_3, третье отбивает любой запрос, условия нигде не настроены.

Приходит вызов и начинает маршрутизироваться по данной таблице маршрутизации. В результате вызов по правилу RULE_1 уходит на TRUNK_GROUP и оттуда в TRUNK_1, в случае если вызов через TRUNK_1 не установился (например, транк недоступен), то маршрутизация продолжает выполняться, вызов отправляется в TRUNK_2. Если попытка вызова в TRUNK_2 также завершилась неудачно, ESBC переходит к RULE_2 и отправляет вызов в TRUNK_3. Если и здесь попытка установить вызов также оказалась неуспешной, то ESBC переходит к RULE_3 и первое плечо отбивается, вызов завершается, т. к. устрановлено правило Reject. 

Cледующий вызов будет направлен по правилу RULE_2 в транк TRUNK_3. Если попытка вызова завершилась неудачно, то ESBC переходит к RULE_3 и первое плечо отбивается, вызов завершается, т. к. устрановлено правило Reject. 

Третий вызов будет направлен по правилу RULE_3 и будет отбит, т.к. установлено правило Reject.

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

Опция балансировки round-robin включается в настройках таблицы маршрутизации:

vesbc# 
vesbc# configure 
vesbc(config)# esbc 
vesbc(config-esbc)# route-table ROUTE_TABLE

#Добавление первого правила с действием отправить вызов в транковую группу TRUNK_GROUP:
vesbc(config-esbc-route-table)# rule 1
vesbc(config-esbc-route-table-rule)# action direct-to-trunk-group TRUNK_GROUP
vesbc(config-esbc-route-table-rule)# exit

#Добавление второго правила с действием отправить вызов в транк TRUNK_3:
vesbc(config-esbc-route-table)# rule 2
vesbc(config-esbc-route-table-rule)# action direct-to-trunk TRUNK_3

#Добавление второго правила с действием отбить входящий вызов:
vesbc(config-esbc-route-table)# rule 3
vesbc(config-esbc-route-table-rule)# action reject

#Активация режима балансировки правил таблицы маршрутизации по алгоритму round robin:
vesbc(config-esbc-route-table)# balancing round-robin 
vesbc(config-esbc-route-table)# 

Пример балансировки правил по алгоритму weighted round robin

Каждые последующие исходящие вызовы, маршрутизируемые по таблице маршрутизации с включённой балансировкой weighted round robin, распределяются согласно весам, присвоенных правилам в этой таблице. То есть чем больше вес правила, относительно весов других правил, тем больше запросов будет маршрутизироваться по нему. В случае недоступности направления вызов будет смаршрутизирован по следующему правилу в очереди.

Схема:

На ESBC настроена таблица маршрутизации ROUTE_TABLE в состав которой входят правила (RULE_1, RULE_2 и RULE_3) с весами 2, 3 и 5 соответственно.  ESBC будет применять правила маршрутизации к запросам, согластно выставленным весам. Например из 100 запросов маршрутизируемых по этой таблице правило RULE_1 с весом 2 применится к 20 вызовам, правило RULE_2 с весом 3 применится к 30 вызовам и правило RULE_3 с весом 5 применится к 50 вызовам. 

Веса правил и опция балансировки weighted round robin назначаются в настройках таблицы маршрутизации:

vesbc#
vesbc# configure
vesbc(config)# esbc

#Создание и переход в настройки таблицы маршрутизации ROUTE_TABLE:
vesbc(config-esbc)# route-table ROUTE_TABLE 

#Создание правила с маршрутизацией в транк TRUNK_1 и весом 2: 
vesbc(config-esbc-route-table)# rule 1 weight 2
vesbc(config-esbc-route-table-rule)# action direct-to-trunk TRUNK_1
vesbc(config-esbc-route-table-rule)# exit

#Создание правила с маршрутизацией в транк TRUNK_2 и весом 3:  
vesbc(config-esbc-route-table)# rule 2 weight 3
vesbc(config-esbc-route-table-rule)# action direct-to-trunk TRUNK_2
vesbc(config-esbc-route-table-rule)# exit

#Создание правила с маршрутизацией в транк TRUNK_3 и весом 5:  
vesbc(config-esbc-route-table)# rule 3 weight 5
vesbc(config-esbc-route-table-rule)# action direct-to-trunk TRUNK_2
vesbc(config-esbc-route-table-rule)# exit

#Активация режима балансировки правил таблицы маршрутизации по алгоритму weighted round robin:
vesbc(config-esbc-route-table)# balancing weighted-round-robin 

Код отбоя для правила Reject

Для правила Reject можно выбрать код SIP ответа, которым будут отбиваться входящие сообщения.  По умолчанию установлен код 403.

В текущей версии ПО поддержано изменение кода только для сигнализации SIP. 

Пример:

Устройства Cisco могут отправлять регистрации для контроля доступности направления. Чтобы направление считалось доступным на эти запросы должен приходить ответ 200 OK.  Для того, чтобы отвечать на такие регистрации можно использовать правило отбоя с кодом 200 и условие в таблице маршрутизации для Cisco keepalive REGISTER.

vesbc# configure 
vesbc(config)# esbc

#Создание таблицы маршрутизации ROUTE_TABLE и добавление правила для отбоя запросов с номеров, которые начинаются с буквы:
vesbc(config-esbc)# route-table ROUTE_TABLE
vesbc(config-esbc-route-table)# rule 5
vesbc(config-esbc-route-table-rule)# action reject sip 200
vesbc(config-esbc-route-table-rule)# condition 0 sip-message ";cisco-keep-alive"
vesbc(config-esbc-route-table-rule)# exit
vesbc(config-esbc-route-table)# exit

Запросы в которых есть строка ";cisco-keep-alive" будут отбиваться ответом 200 OK. Таким образом устройство Cisco будет считать, что направление доступно и не переключится на резервное направление.  

При изменении кода отбоя меняется только Status-Line сообщения, остальные заголовки и тело сообщения не изменяются. Поэтому при выборе кода 200 или 401 не будет создан диалог или отправлен запрос аутентификации.

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

В конфигурации таблицы маршрутизации реализована команда switch-route-table <route-table-name> для продолжения маршрутизации SIP-запроса через другую таблицу маршрутизации.

Использование каскадного принципа таблиц маршрутизации позволяет гибко настраивать маршрутизацию между направлениями.

Примеры использования каскадных таблиц маршрутизации

Допускается использовать каскадный переход из нескольких таблиц маршрутизации, например:

vesbc# configure 
vesbc(config)# esbc

#Создание таблицы маршрутизации ROUTE_TABLE_1 и добавление правила с действием сменить таблицу маршрутизации на ROUTE_TABLE_2:
vesbc(config-esbc)# route-table ROUTE_TABLE_1
vesbc(config-esbc-route-table)# rule 5
vesbc(config-esbc-route-table-rule)# action switch-route-table ROUTE_TABLE_2
vesbc(config-esbc-route-table-rule)# exit
vesbc(config-esbc-route-table)# exit

#Создание таблицы маршрутизации ROUTE_TABLE_2 и добавление правила с действием сменить таблицу маршрутизации на ROUTE_TABLE_3:
vesbc(config-esbc)# route-table ROUTE_TABLE_2
vesbc(config-esbc-route-table)# rule 5
vesbc(config-esbc-route-table-rule)# action switch-route-table ROUTE_TABLE_3
vesbc(config-esbc-route-table-rule)# exit
vesbc(config-esbc-route-table)# exit

#Создание таблицы маршрутизации ROUTE_TABLE_3 и добавление правила с действием сменить таблицу маршрутизации на ROUTE_TABLE_4:
vesbc(config-esbc)# route-table ROUTE_TABLE_3
vesbc(config-esbc-route-table)# rule 5
vesbc(config-esbc-route-table-rule)# action switch-route-table ROUTE_TABLE_4
vesbc(config-esbc-route-table-rule)# exit
vesbc(config-esbc-route-table)# exit

#Создание таблицы маршрутизации ROUTE_TABLE_4 и добавление правила с действием отправить вызов в транк TRUNK_1:
vesbc(config-esbc)# route-table ROUTE_TABLE_4
vesbc(config-esbc-route-table)# rule 5
vesbc(config-esbc-route-table-rule)# action direct-to-trunk TRUNK_1

Запрещено указывать в правиле action switch-route-table название той таблицы, в которой указывается данное правило.

Пример:

route-table MAIN
  rule 5
     action switch-route-table MAIN
  exit
exit

Маршрутизация на разные направления через общую таблицу маршрутизации

Для всех транков (например, TRUNK_1, TRUNK_2, TRUNK_3) указать одну таблицу маршрутизации (например, MAIN). Все правила и условия для маршрутизации в конкретный транк указаны в отдельной таблице маршрутизации для этого транка (таблицы маршрутизации RT_1, RT_2, RT_3).  При добавлении транков в конфигурации необходимо создать соответствующую таблицу маршрутизации и добавить новое правило в таблицу MAIN.


Пример конфигурации:

route-table MAIN
   rule 0
     action switch-route-table RT_1
   exit
   rule 1
     action switch-route-table RT_2
   exit
   rule 2
     action switch-route-table RT_3
   exit
 exit
 route-table RT_1
   rule 0
     action direct-to-trunk TRUNK_1
     condition 0 cdpn pattern "100"
   exit
 exit
 route-table RT_2
   rule 0
     action direct-to-trunk TRUNK_2
     condition 0 cdpn pattern "200"
   exit
 exit
 route-table RT_3
   rule 0
     action direct-to-trunk TRUNK_3
     condition 0 cdpn pattern "300"
   exit
 exit
   trunk sip TRUNK_1
   route-table MAIN
   ...
 exit
   trunk sip TRUNK_2
   route-table MAIN
   ...
 exit
   trunk sip TRUNK_3
   route-table MAIN
   ...
 exit

В таком случае маршрутизация любого вызова из любого направления будет осуществляться по всем правилам всех таблиц маршрутизации до первого совпадения CdPN. Если совпадение не будет найдено, то вызов завершится кодом SIP 404 "Not Found".

Маршрутизация на разные направления через последовательный каскад таблиц маршрутизации

Правила для маршрутизации добавляются в одну таблицу маршрутизации, при достижении ограничения количества правил (128) в качестве последнего правила добавляется переход на следующую таблицу маршрутизации.


Пример конфигурации:

route-table RT_1
    rule 0
      action direct-to-trunk TRUNK_1
      condition 0 cdpn pattern "100"
    exit
    rule 1
      action direct-to-trunk TRUNK_2
      condition 0 cdpn pattern "200"
    exit
    rule 2
      action direct-to-trunk TRUNK_3
      condition 0 cdpn pattern "300"
    exit
    ...
     rule 127
      action switch-route-table RT_2
    exit   
  exit
  route-table RT_2
    rule 0
      action direct-to-trunk TRUNK_4
      condition 0 cdpn pattern "400"
    exit
    rule 1
      action direct-to-trunk TRUNK_5
      condition 0 cdpn pattern "500"
    exit
    ...
    rule 127
      action switch-route-table RT_3
    exit   
  exit
  route-table RT_3
    ...
  exit
 ...
    trunk sip TRUNK_1
    route-table RT_1
    ...
  exit
    trunk sip TRUNK_2
    route-table RT_1
    ...
  exit
    trunk sip TRUNK_3
    route-table RT_1
    ...
  exit
    trunk sip TRUNK_4
    route-table RT_1
    ...
  exit
    trunk sip TRUNK_5
    route-table RT_1
    ...
  exit

Обработка вызова также как и в предыдущем примере будет осуществляться последовательно по всем правилам всех таблиц маршрутизации. Если совпадение не будет найдено, то вызов завершится кодом SIP 404 "Not Found".

Логика обработки SIP-запроса при использовании каскада таблиц маршрутизации

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

При проверке правил ESBC сохраняет информацию о всех пройденных объектах (транки, транк-группы, таблицы маршрутизации) с целью исключения петли маршрутизации.

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

Пример 1:

Настроена маршрутизация через три таблицы. Осуществляется вызов на номер 200. При осуществлении маршрутизации, в соответствии с правилом rule 0 таблицы RT_1 происходит переход к таблице RT_2. В таблице RT_2 также первым правилом указан переход на таблицу RT_3. В таблице RT_3 нет правил маршрутизации, поэтому осуществляется переход к предыдущей таблице (RT_2) к следующему по порядку правилу (rule1). Т. к. это правило не подходит для направления вызова в транк TRUNK (CdPN 200 !== CdPN 100), то осуществляется переход к предыдущей таблице (RT_1) к следующему по порядку правилу (rule1). Последнее правило в этой таблице — reject, вызов будет завершен кодом SIP 403 "Forbidden".


Пример 2:

Сценарий аналогичный примеру 1, за исключением того, что в таблице RT_3 настроено правило перехода к таблице RT_1. В данном случае логика обработки запроса будет аналогична примеру выше, т. к. при маршрутизации RT_1 уже была пройдена и повторный возврат к правилу rule 0 этой таблицы привел бы к зацикливанию вызова. 

Настройка "закрепления" регистрации

В конфигурации таблицы маршрутизации реализована команда refresh-registration для закрепления регистрации на одном направлении. Используется для обновления активной регистрации абонента на том транке, на котором он был зарегистрирован ранее. Если пользователь ранее не регистрировался, правило пропускается.

Пример:

Нужно настроить конфигурацию так, чтобы абоненты регистрировались на основном транке, а при его недоступности регистрации распределялись по резервным транкам.

Схема:

В конфигурации ESBC настроено 4 транка: MAIN_TRUNK, TRUNK_1, TRUNK_2 и TRUNK_3.  Транки TRUNK_1, TRUNK_2 и TRUNK_3 находятся в транковой группе, на которой настроена балансировка round-robin, поэтому все запросы регистрации, приходящие на эту группу, будут распределяться по транкам согласно балансировке. В таком случае, чтобы закрепить регистрацию абонента на одном транке, нужно добавить правило refresh-registration в таблицу маршрутизации. При прохождении этого правила первой регистрации абонента оно пропускается, и запрос направится в транк согласно следующим правилам маршрутизации. Но если у абонента уже есть регистрация и приходит её обновление, то оно направится в тот транк, на котором он уже зарегистрирован.


Схема таблицы маршрутизации:

 

Пример конфигурации:

vesbc# config
vesbc(config)# esbc 

#Создание медиаресурса для транков:
vesbc(config-esbc)# media resource MEDIA 
vesbc(config-esbc-media-resource)# ip address 192.168.126.220
vesbc(config-esbc-media-resource)# port-range 5000-10001
vesbc(config-esbc-media-resource)# exit

#Создание транспорта для транка MAIN_TRUNK:
vesbc(config-esbc)# sip transport TRANSPORT_MAIN_TRUNK
vesbc(config-esbc-sip-transport)# ip address 192.168.126.220
vesbc(config-esbc-sip-transport)# port 5060
vesbc(config-esbc-sip-transport)# exit

#Создание транспорта для транка TRUNK_1:
vesbc(config-esbc)# sip transport TRANSPORT_TRUNK_1
vesbc(config-esbc-sip-transport)# ip address 192.168.126.220
vesbc(config-esbc-sip-transport)# port 5070
vesbc(config-esbc-sip-transport)# exit

#Создание транспорта для транка TRUNK_2:
vesbc(config-esbc)# sip transport TRANSPORT_TRUNK_2
vesbc(config-esbc-sip-transport)# ip address 192.168.126.220
vesbc(config-esbc-sip-transport)# port 5080
vesbc(config-esbc-sip-transport)# exit

#Создание транспорта для транка TRUNK_3:
vesbc(config-esbc)# sip transport TRANSPORT_TRUNK_3
vesbc(config-esbc-sip-transport)# ip address 192.168.126.220
vesbc(config-esbc-sip-transport)# port 5090
vesbc(config-esbc-sip-transport)# exit

#Создание транка MAIN_TRUNK:
vesbc(config-esbc)# trunk sip MAIN_TRUNK
vesbc(config-esbc-trunk-sip)# media resource 0 MEDIA 
vesbc(config-esbc-trunk-sip)# sip transport TRANSPORT_MAIN_TRUNK 
vesbc(config-esbc-trunk-sip)# remote address 192.168.126.230
vesbc(config-esbc-trunk-sip)# remote port 5060
vesbc(config-esbc-trunk-sip)# exit

#Создание транка TRUNK_1:
vesbc(config-esbc)# trunk sip TRUNK_1
vesbc(config-esbc-trunk-sip)# media resource 0 MEDIA 
vesbc(config-esbc-trunk-sip)# sip transport TRANSPORT_TRUNK_1
vesbc(config-esbc-trunk-sip)# remote address 192.168.126.231
vesbc(config-esbc-trunk-sip)# remote port 5060
vesbc(config-esbc-trunk-sip)# exit

#Создание транка TRUNK_2:
vesbc(config-esbc)# trunk sip TRUNK_2
vesbc(config-esbc-trunk-sip)# media resource 0 MEDIA 
vesbc(config-esbc-trunk-sip)# sip transport TRANSPORT_TRUNK_2
vesbc(config-esbc-trunk-sip)# remote address 192.168.126.232
vesbc(config-esbc-trunk-sip)# remote port 5060
vesbc(config-esbc-trunk-sip)# exit

#Создание транка TRUNK_3:
vesbc(config-esbc)# trunk sip TRUNK_3
vesbc(config-esbc-trunk-sip)# media resource 0 MEDIA 
vesbc(config-esbc-trunk-sip)# sip transport TRANSPORT_TRUNK_3
vesbc(config-esbc-trunk-sip)# remote address 192.168.126.233
vesbc(config-esbc-trunk-sip)# remote port 5060
vesbc(config-esbc-trunk-sip)# exit

#Создание транковой группы TRUNK_GROUP с транками TRUNK_1, TRUNK_2 и TRUNK_3 с балансировкой round-robin:
vesbc(config-esbc)# trunk-group TRUNK_GROUP
vesbc(config-esbc-trunk-group)# trunk 0 TRUNK_1
vesbc(config-esbc-trunk-group)# trunk 1 TRUNK_2
vesbc(config-esbc-trunk-group)# trunk 2 TRUNK_3
vesbc(config-esbc-trunk-group)# balancing round-robin 
vesbc(config-esbc-trunk-group)# exit

#Создание таблицы маршрутизации ROUTE_TABLE и добавление в неё правил:
vesbc(config-esbc)# route-table ROUTE_TABLE
vesbc(config-esbc-route-table)# rule 5
vesbc(config-esbc-route-table-rule)# action direct-to-trunk MAIN_TRUNK 
vesbc(config-esbc-route-table-rule)# exit
vesbc(config-esbc-route-table)# rule 10
vesbc(config-esbc-route-table-rule)# action refresh-registration 
vesbc(config-esbc-route-table-rule)# exit
vesbc(config-esbc-route-table)# rule 15
vesbc(config-esbc-route-table-rule)# action direct-to-trunk-group TRUNK_GROUP 
vesbc(config-esbc-route-table-rule)# exit
vesbc(config-esbc-route-table)# exit

#Создание медиаресурса MEDIA_USER для абонентского интерфейса:
vesbc(config-esbc)# media resource MEDIA_USER
vesbc(config-esbc-media-resource)# ip address 192.168.50.50
vesbc(config-esbc-media-resource)# port-range 20000-30001
vesbc(config-esbc-media-resource)# exit

#Создание транспорта для абонентского интерфейса:
vesbc(config-esbc)# sip transport TRANSPORT_USER
vesbc(config-esbc-sip-transport)# ip address 192.168.50.50
vesbc(config-esbc-sip-transport)# port 5060
vesbc(config-esbc-sip-transport)# exit

#Создание транспорта абонентского интерфейса USER_INTERFACE с таблицей маршрутизации ROUTE_TABLE:
vesbc(config-esbc)# user-interface sip USER_INTRFACE 
vesbc(config-esbc-user-interface-sip)# media resource 0 MEDIA_USER_USER 
vesbc(config-esbc-user-interface-sip)# sip transport TRANSPORT_USER 
vesbc(config-esbc-user-interface-sip)# route-table ROUTE_TABLE 
vesbc(config-esbc-user-interface-sip)# exit

#Применить и подтвердить изменения:
vesbc(config-esbc)# do commit
vesbc(config-esbc)# do confirm

При такой конфигурации регистрации абонентов будут отправляться в основной транк MAIN_TRUNK.

При недоступности транка MAIN_TRUNK следующим правилом в таблице маршрутизации стоит refresh-registration, и так как на системе нет активной регистрации этого абонента, то оно пропускается и запрос направляется на следующее направление, то есть в транковую группу TRUNK_GROUP. В транковой группе настроена балансировка round-robin, поэтому запрос смаршрутизируется на один из транков, входящих в эту группу. При этом в системе появится запись о том, что данный абонент зарегистрирован на конкретном транке.


Теперь при обновлении регистрации абонента, если основной транк не будет доступен, запрос регистрации смаршрутизируется на правило refresh-registration. И так как на ESBC есть запись о том, что абонент зарегистрирован на конкретном направлении, то регистрация направится сразу в этот транк.  

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

После восстановления доступа к основному транку MAIN_TRUNK запросы регистрации будут отправляться на него согласно таблице маршрутизации.

Правило маршрутизации refresh-registration работает только для запросов REGISTER.

Использование условий в таблице маршрутизации

Условия маршрутизации:

Каждое правило может содержать до 8 условий.

Пример работы условий:


В таблице маршрутизации два правила, у обоих есть условия. Например, приходит вызов, у которого номер А=23000, номер Б=24000, и кастомный заголовок "Trunk: For trunk_1". ESBC заходит в RULE_1 и анализирует условие CONDITION_1, условие истинно, далее происходит анализ условия из CONDITION_2, ESBC проверяет список префиксов из префикс-группы "To_Trunk_1", находит префикс "24.*", который совпадает с CdPN – условие истинно, далее происходит анализ условия из CONDITION_3, условие также истинно. Значит правило RULE_1 подходит для маршрутизации, и вызов отправляется в TRUNK_1.

Рассмотрим вызов с номерами, которые подходят под условия из RULE_2.

Приходит вызов, у которого номер А=25000, номер Б=24000 и кастомный заголовок "Trunk: For trunk_2". ESBC заходит в RULE_1 и анализирует условие CONDITION_1, условие ложно. Значит правило не подходит (правило подходит, только если все условия внутри правила истинны). Далее ESBC переходит к RULE_2, анализирует условие CONDITION_4, ESBC проверяет список префиксов из префикс группы "To_Trunk_1", не найдено префиксов, совпадающих с CgPN – условие истинно, далее происходит анализ условия из CONDITION_5, условие истинно, далее происходит анализ условия из CONDITION_6, ESBC проверяет теги сессии, которые могут быть добавлены с помощью common-модификаторов, найден тег "Trunk_2" – условие также истинно. Значит правило RULE_2 подходит для маршрутизации, и вызов отправляется в TRUNK_2. 

Если приходит вызов, который не подходит ни под одно правило, то такой вызов отбивается.

vesbc# 
vesbc# configure 
vesbc(config)# esbc 

#Префикс-группа "To_Trunk_1" с типом "Список префиксов"
vesbc(config-esbc)# prefix-group prefix-list To_Trunk_1
vesbc(esbc-prefix-group)# prefix 0 "3\\d{4}"
vesbc(esbc-prefix-group)# prefix 1 "24.*"
vesbc(esbc-prefix-group)# prefix 2 "555"
vesbc(esbc-prefix-group)# exit

# Таблица common-модификаторов, привязанная к направлению, с которого поступил второй вызов
vesbc(config-esbc)# mod-table common ADD_TAG
vesbc(esbc-mod-table-common)# mod 0
vesbc(esbc-mod-table-common-modification)# action 0 add-tag Trunk_2
vesbc(esbc-mod-table-common-modification)# exit
vesbc(esbc-mod-table-common)# exit

vesbc(config-esbc)# route-table ROUTE_TABLE

#Добавление первого правила с условиями CONDITION_1, CONDITION_2, CONDITION_3 и действием отправить вызов в TRUNK_1:
vesbc(config-esbc-route-table)# rule 0
vesbc(config-esbc-route-table-rule)# condition 0 cgpn pattern ^23000$
vesbc(config-esbc-route-table-rule)# condition 1 cdpn in-prefix-group To_Trunk_1
vesbc(config-esbc-route-table-rule)# condition 2 sip-message "For trunk_1"
vesbc(config-esbc-route-table-rule)# action direct-to-trunk TRUNK_1
vesbc(config-esbc-route-table-rule)# exit

#Добавление второго правила с условиями CONDITION_4, CONDITION_5, CONDITION_6 и действием отправить вызов в TRUNK_2:
vesbc(config-esbc-route-table)# rule 1
vesbc(config-esbc-route-table-rule)# condition 0 cgpn not-in-prefix-group To_Trunk_1
vesbc(config-esbc-route-table-rule)# condition 1 cdpn pattern ^24000$
vesbc(config-esbc-route-table-rule)# condition 2 tag all Trunk_2
vesbc(config-esbc-route-table-rule)# action direct-to-trunk TRUNK_2

Логика применения условий

По умолчанию все условия применяются с логикой "И", то есть действие правила выполнится только при успешной проверке всех условий, если хотя бы одно условие не выполняется, то ESBC переходит к обработке следующего правила.

Есть возможность с помощью выражения задавать логику применения условий, доступные логические операторы:

Для обращения к условию необходимо использовать его индекс. В выражении можно использовать скобки для группировки условий.

Пример изменения логики применения условий:


vesbc# 
vesbc# configure 
vesbc(config)# esbc 

vesbc(config-esbc)# route-table ROUTE_TABLE

#Добавление правила с условиями CONDITION_1, CONDITION_2, CONDITION_3 и действием отправить вызов в TRUNK_1:
vesbc(config-esbc-route-table)# rule 0
vesbc(config-esbc-route-table-rule)# condition 0 cgpn pattern ^23000$
vesbc(config-esbc-route-table-rule)# condition 1 cdpn pattern ^24000$
vesbc(config-esbc-route-table-rule)# condition 2 sip-message "For trunk_1"
vesbc(config-esbc-route-table-rule)# action direct-to-trunk TRUNK_1
vesbc(config-esbc-route-table-rule)# do commit
vesbc(config-esbc-route-table-rule)# do confirm

В таблице маршрутизации есть правило с тремя условиями. Например, приходит вызов, у которого номер А=25000, номер Б=26000, и кастомный заголовок "Trunk: For trunk_1". ESBC заходит в RULE_1 и анализирует условие CONDITION_1, условие ложно. Со стандартной логикой применения условий это значит, что правило не подходит и вызов не смаршрутизируется в указанный транк.

Рассмотрим пример с изменением логики применения условий:

vesbc# 
vesbc# configure 
vesbc(config)# esbc 

vesbc(config-esbc)# route-table ROUTE_TABLE

#Добавление правила с условиями CONDITION_1, CONDITION_2, CONDITION_3, логическим выражением и действием отправить вызов в TRUNK_1:
vesbc(config-esbc-route-table)# rule 0
vesbc(config-esbc-route-table-rule)# condition 0 cgpn pattern ^23000$
vesbc(config-esbc-route-table-rule)# condition 1 cdpn pattern ^24000$
vesbc(config-esbc-route-table-rule)# condition 2 sip-message "For trunk_1"
vesbc(config-esbc-route-table-rule)# action direct-to-trunk TRUNK_1
vesbc(config-esbc-route-table-rule)# condition expression "(0&1)|2"
vesbc(config-esbc-route-table-rule)# do commit
vesbc(config-esbc-route-table-rule)# do confirm

Рассмотрим пример с таким же вызовом.  Номер А=25000, номер Б=26000, и кастомный заголовок "Trunk: For trunk_1". ESBC заходит в RULE_1 и анализирует условие CONDITION_1, условие ложно, далее ESBC переходит к CONDITION_2, условие ложно, далее ESBC переходит к CONDITION_3, текст шаблона найден в сообщении – условие истинно. Согласно выражению "(0&1)|2" , успешной проверки условия с индексом 2 достаточно для выполнения действия, несмотря на то, что условия с индексами 0 и 1 не прошли проверку. Значит правило подходит для маршрутизации, и вызов отправляется в TRUNK_1. 

Синтаксис для написания условий

Для написания условий используются регулярные выражения PCRE. 

Регулярное выражение для условия по номеру или тегу применяется с логикой полного совпадения(exact match). Например, необходимо написать шаблон, который будет соответствовать номеру "20405". В данном случае шаблон "^20.*" будет корректным, а шаблон "20" - нет.

Регулярное выражение для условия по значению SIP-сообщения применяется с логикой частичного совпадения(match).

При вводе выражения в одинарных и двойных кавычках различается логика экранирования символа обратного слеша - «\». 

При вводе регулярного выражения в одинарных кавычках символы обратного слеша и двойные кавычки экранируются обратным слешем автоматически.

Пример ввода шаблона:

vesbc(config-esbc-route-table-rule)# condition 0 cdpn pattern '\d'

Пример отображения шаблона в выводе конфигурации:

  route-table ROUTE_TABLE
    rule 0
      condition 0 cdpn pattern "\\d"
    exit
  exit

В данном случае будет использоваться поиск совпадения по метасимволу «\d», то есть по совпадению с любой цифрой.

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

1. Пример ввода шаблона c одним обратным слешем:

 vesbc(config-esbc-route-table-rule)# condition 0 cdpn pattern "\d"

Пример отображения шаблона в выводе конфигурации:

  route-table ROUTE_TABLE
    rule 0
      condition 0 cdpn pattern "d"
    exit
  exit

В данном случае будет использоваться поиск совпадения по букве «d».

2.  Пример ввода шаблона c двумя обратными слешами:

  vesbc(config-esbc-route-table-rule)# condition 0 cdpn pattern "\\d"

Пример отображения шаблона в выводе конфигурации:

  route-table ROUTE_TABLE
    rule 0
      condition 0 cdpn pattern "\\d"
    exit
  exit

В данном случае будет использоваться поиск с использованием метасимвола «\d», то есть по совпадению с любой цифрой.

Настройка модификаторов

ESBC поддерживает два типа модификаторов — common и sip.

Модификаторы common позволяют модифицировать параметры сессии без привязки к протоколу сигнализации. Параметры, доступные для модификации:

Модификаторы sip позволяют модифицировать любые заголовки сообщений SIP.

В одном модификаторе может быть до 8 модификаций.

Таблицы модификаций применяются в транках, транковых группах и абонентских интерфейсах. Их можно подключить, как out — тогда правила будут применяться при отправке сообщения или, и как in — тогда правила применяются при получении сообщения. Таблица модификаций, используемая для транковой группы, будет использоваться только в том случае, если в транке, входящем в эту транковую группу, не настроена своя таблица.

В таблицах модификации для отбора значений (header pattern, header value, response-pattern, value-pattern, и др.) используются регулярные выражения PCRE. 

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

Регулярное выражение для:

  • method pattern
  • response-pattern
  • value-pattern(mod-table sip → mod(no-transit, transit))

применяется с логикой полного совпадения(exact match). Например, необходимо написать шаблон, который будет соответствовать значению"20405". В данном случае шаблон "^20.*" будет корректным, а шаблон "20" - нет.

Регулярное выражение для value-pattern(mod-table common → action replace и mod-table sip → mod(copy, replace)) применяется с логикой частичного совпадения(match).

Допускается использование следующей конструкции при составлении регулярных выражений PCRE для помещения значений в локальные переменные (от 0 до 9) с помощью цифр, экранированных обратной чертой ("\\1-9"). "\\0" — весь текст:

value-pattern "(some)-(value)"
#Значения some и value заносятся в локальные переменные pcre 1 и 2 соответственно
 "\\2-\\1"
#Значения переменных меняются местами

Результат замены: value-some

Данные переменные используются в рамках одной модификации. Для использования переменных в разных модификациях одной таблицы модификаций используется модификатор типа copy.

При применении на транке/абонентском интерфейсе модификаторов обоих типов одновременно, используется следующий порядок их обработки в зависимости от направления модификации:

  • IN — сначала применяется модификатор sip, затем — модификатор common;
  • OUT — сначала применяется модификатор common, затем — sip.

Общие модификаторы

Модификаторы common позволяют модифицировать параметры сессии без привязки к протоколу сигнализации. Параметры, доступные для модификации:

В текущей версии ПО поддерживается только протокол SIP. Учитывая это, при использовании модификаторов в транках и абонентских интерфейсов, модификаторами CdPN можно изменять user part Request-URI и SIP URI заголовка To. Модификатором CgPN можно изменить user-part SIP URI заголовков Contact, From.
Модификаторы common позволяют добавлять и удалять теги. Тег – это один из параметров сессии, который представляет собой символьную строку. Тег можно использовать при модификации и маршрутизации.

Модификаторы common, настроенные в качестве IN, могут влиять на результат маршрутизации при использовании в route-table условий (condition), т. к. правила route-table обрабатываются после применения модификации. Модификаторы, настроенные в качестве OUT, не влияют на результат маршрутизации.

Модификатор замены номера (replace)

Схема вызова:

На ESBC настроена следующая конфигурация:

  route-table TO_UAS
    rule 0
      action direct-to-trunk UAS
    exit
  exit
  mod-table common COMMON_MOD
    mod 0
      action 0 replace cgpn
		value-pattern "2(.+)"
      	#Осуществляется выбор номеров, начинающихся с 2. Остальная часть номера сохраняется в локальную переменную 1
      	replacement "8\\1"
      	#Выполняется замена 2 на 8, и добавляется значение из переменной 1
      exit
      action 5 replace cdpn
        value-pattern "23002"
        #Осуществляется выбор номера 23002
        replacement "22222"
        #Выполняется замена номера 23002 на 22222
      exit
    exit
  exit
  trunk sip UAC
    remote address 192.168.80.26
    remote port 5070
    sip transport UAC
    route-table TO_UAS
    mod-table common in COMMON_MOD
    media resource 0 MEDIA
  exit
  trunk sip UAS
    remote addr 192.168.80.26
    remote port 5080
    sip transport UAS
    media resource 0 MEDIA
  exit

На транк UAC приходит INVITE:

INVITE sip:24001@192.168.80.129:5080;line=76196f92c8f42f97c3b78125dd1b842c SIP/2.0
Via: SIP/2.0/UDP 192.168.80.26:5070;rport;branch=z9hG4bK-294378-1-1
From: <sip:24001@192.168.80.26:5070>;tag=1
To: <sip:23002@192.168.80.129:5070>
Call-ID: 1-294378@192.168.80.26
Cseq: 1 INVITE
Contact: <sip:24001@192.168.80.26:5070>
Max-Forwards: 70
Allow: INVITE, ACK, BYE, CANCEL, UPDATE, SUBSCRIBE
Content-Type: application/sdp
Content-Length:   174

[SDP]...

В результате применения модификатора COMMON_MOD в транке UAC, из транка UAS будет отправлен INVITE:

INVITE sip:22222@192.168.80.26:5080 SIP/2.0
Via: SIP/2.0/UDP 192.168.80.129:5080;rport;branch=z9hG4bKPjWDx0A5VQhCqmg7Sf-wS7Huya0dESxrro
Max-Forwards: 70
From: <sip:84001@192.168.80.129>;tag=epoMSc5qF1.Pfc5pcypn80ONBKHCaO-x
To: <sip:22222@192.168.80.26>
Contact: <sip:84001@192.168.80.129:5080>
Call-ID: 326c0035a257a9f76185383b49df705f
CSeq: 9446 INVITE
Allow: PRACK, SUBSCRIBE, NOTIFY, REFER, INVITE, ACK, BYE, CANCEL, UPDATE
Supported: 100rel, replaces
Content-Type: application/sdp
Content-Length:   177

[SDP]...

В результате действия action 0 replace cgpn выполнена модификация CgPN 24001 на 84001, в результате action 5 replace cdpn — модификация CdPN 23002 на 22222.

При использовании модификатора CgPN, помимо заголовка From, изменяется user part SIP URI заголовка Contact. При использовании модификатора CdPN, помимо заголовка To, изменяется user part SIP в Request-URI. 
При модификации запросов REGISTER, CgPN влияет на значение user part SIP URI в заголовке From, CdPN на значение user part SIP URI в заголовках To и Contact.

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

Модификатор ротации номера (number-rotation)

Схема вызова:

На ESBC настроена следующая конфигурация:

  route-table TO_UAS
    rule 0
      action direct-to-trunk UAS
    exit
  exit
  mod-table common COMMON_MOD
    mod 0
      action 0 number-rotation cgpn
		number-list NUMBER_LIST_CGPN
      	#Выбор списка, номера из которого будут использованы при ротации
      exit
       action 5 number-rotation cdpn
		number-list NUMBER_LIST_CDPN
      	#Выбор списка, номера из которого будут использованы при ротации
		rotation-type random-from-pool
		#Номера из списка будут выбираться случайным образом
      exit
    exit
  exit
  trunk sip UAC
    remote addr 192.168.80.26
    remote port 5070
    sip transport UAC
    route-table TO_UAS
    mod-table common in COMMON_MOD
    media resource 0 MEDIA
  exit
  trunk sip UAS
    remote addr 192.168.80.26
    remote port 5080
    sip transport UAS
    media resource 0 MEDIA
  exit
  prefix-group number-list NUMBER_LIST_CDPN
    number 0 "2331"
    number 5 "2332"
    number 10 "2333"
  exit
  prefix-group number-list NUMBER_LIST_CGPN
    number 5 "8111"
    number 10 "8112"
    number 15 "8113"
  exit

На транк UAC приходит INVITE:

INVITE sip:24001@192.168.80.129:5080;line=76196f92c8f42f97c3b78125dd1b842c SIP/2.0
Via: SIP/2.0/UDP 192.168.80.26:5070;rport;branch=z9hG4bK-294378-1-1
From: <sip:24001@192.168.80.26:5070>;tag=1
To: <sip:23002@192.168.80.129:5070>
Call-ID: 1-294378@192.168.80.26
Cseq: 1 INVITE
Contact: <sip:24001@192.168.80.26:5070>
Max-Forwards: 70
Allow: INVITE, ACK, BYE, CANCEL, UPDATE, SUBSCRIBE
Content-Type: application/sdp
Content-Length:   174

[SDP]...

В результате применения модификатора COMMON_MOD в транке UAC, из транка UAS будет отправлен INVITE:

INVITE sip:2333@192.168.80.26:5080 SIP/2.0
Via: SIP/2.0/UDP 192.168.80.129:5080;rport;branch=z9hG4bKPjWDx0A5VQhCqmg7Sf-wS7Huya0dESxrro
Max-Forwards: 70
From: <sip:8111@192.168.80.129>;tag=epoMSc5qF1.Pfc5pcypn80ONBKHCaO-x
To: <sip:2333@192.168.80.26>
Contact: <sip:8111@192.168.80.129:5080>
Call-ID: 326c0035a257a9f76185383b49df705f
CSeq: 9446 INVITE
Allow: PRACK, SUBSCRIBE, NOTIFY, REFER, INVITE, ACK, BYE, CANCEL, UPDATE
Supported: 100rel, replaces
Content-Type: application/sdp
Content-Length:   177

[SDP]...

В результате модификации CgPN 24001 был заменён на номер 8111 – номер с индексом 5(наименьший) в списке "NUMBER_LIST_CGPN". CdPN 23002 был заменён на номер 2333 – случайный номер из списка "NUMBER_LIST_CDPN".

При следующем вызове CgPN будет заменён на 8112 – следующий в списке "NUMBER_LIST_CGPN". CdPN будет заменён на случайный номер из списка "NUMBER_LIST_CDPN".

Для ротации номера можно использовать только префикс-группу с типом "Список номеров" (number-list). Префикс-группы с типом "Список префиксов" (prefix-list) могут использоваться только в условиях.

При использовании модификатора CgPN, помимо заголовка From, изменяется user part SIP URI заголовка Contact. При использовании модификатора CdPN, помимо заголовка To, изменяется user part SIP в Request-URI.
При модификации запросов REGISTER, CgPN влияет на значение user part SIP URI в заголовке From, CdPN на значение user part SIP URI в заголовках To и Contact.

Модификатор добавления тэга (add-tag)

Схема вызова:

На ESBC настроена следующая конфигурация:

  route-table TO_UAS
    rule 0
      action direct-to-trunk UAS
    exit
  exit
  mod-table sip SIP_MOD
    mod 5 add
      method type Invite
      #Тип запроса, в котором необходима модификация
      header name "Source"
      #Название нового заголовка
      header value "UAC"
      #Значение нового заголовка
      condition 0 tag any "From_UAC"
      #Условие для модификации
    exit
  exit
  mod-table common COMMON_MOD
    mod 0
      action 0 add-tag "From_UAC"
    exit
  exit
  trunk sip UAC
    remote addr 192.168.80.26
    remote port 5070
    sip transport UAC
    route-table TO_UAS
    mod-table common in COMMON_MOD
    media resource 0 MEDIA
  exit
  trunk sip UAS
    remote addr 192.168.80.26
    remote port 5080
    sip transport UAS
    mod-table sip out SIP_MOD
    media resource 0 MEDIA
  exit

На транк UAC приходит INVITE, ESBC добавляет к этой сессии тег "From_UAC":

INVITE sip:24001@192.168.80.129:5080;line=76196f92c8f42f97c3b78125dd1b842c SIP/2.0
Via: SIP/2.0/UDP 192.168.80.26:5070;rport;branch=z9hG4bK-294378-1-1
From: <sip:24001@192.168.80.26:5070>;tag=1
To: <sip:23002@192.168.80.129:5070>
Call-ID: 1-294378@192.168.80.26
Cseq: 1 INVITE
Contact: <sip:24001@192.168.80.26:5070>
Max-Forwards: 70
Allow: INVITE, ACK, BYE, CANCEL, UPDATE, SUBSCRIBE
Content-Type: application/sdp
Content-Length:   174

[SDP]...

Так как тег добавлен(условие выполнено), то выполняется модификация SIP_MOD и в транк UAS будет отправлен INVITE с новым заголовком:

INVITE sip:23002@192.168.80.26:5080 SIP/2.0
Via: SIP/2.0/UDP 192.168.80.129:5080;rport;branch=z9hG4bKPjWDx0A5VQhCqmg7Sf-wS7Huya0dESxrro
Max-Forwards: 70
From: <sip:24001@192.168.80.129>;tag=epoMSc5qF1.Pfc5pcypn80ONBKHCaO-x
To: <sip:23002@192.168.80.26>
Contact: <sip:24001@192.168.80.129:5080>
Call-ID: 326c0035a257a9f76185383b49df705f
CSeq: 9446 INVITE
Allow: PRACK, SUBSCRIBE, NOTIFY, REFER, INVITE, ACK, BYE, CANCEL, UPDATE
Supported: 100rel, replaces
Source: UAC
Content-Type: application/sdp
Content-Length:   177

[SDP]...

Если вызов придёт с направления, к которому не привязана таблица модификации COMMON_MOD, то тег "From_UAC" к сессии добален не будет и в исходящем INVITE не будет заголовка "Source: UAC".

Теги можно использовать в условиях при конфигурации модификаторов или правил маршрутизации.

Модификатор удаления тэга (remove-tag)

Схема вызова:

Есть транковая группа UAS, в которую входят 2 транка - UAS_MAIN и UAS_RESERVE. В транковой группе настроена исходящая таблица SIP-модификаторов, которые добавляют заголовок Destination, значение заголовка зависит от того, куда направлен вызов. В транке UAC настроена таблица общих модификаторов, которая добавляет тег MAIN, у транка UAS_RESERVE настроена таблица общих модификаторов, которая удаляет тег MAIN и добавляет тег RESERVE. Конфигурация ESBC выглядит следующим образом:

esbc
  media resource MEDIA
    ip address 192.168.126.195
  exit
  sip transport SIP_TRANSPORT
    ip address 192.168.126.195
  exit
  route-table TO_UAS
    rule 0
      action direct-to-trunk-group UAS
    exit
  exit
  trunk-group UAS
    mod-table sip out SIP_MOD
    trunk 5 UAS_MAIN
    trunk 10 UAS_RESERVE
  exit
  mod-table sip SIP_MOD
    mod 5 add
      method type Invite
      header name "Destination"
      header value "Main"
      condition 0 tag all "MAIN"
    exit
    mod 10 add
      method type Invite
      header name "Destination"
      header value "Reserve"
      condition 0 tag all "RESERVE"
    exit
  exit
  mod-table common COMMON_UAS_MAIN
    mod 0
      action 0 add-tag "MAIN"
    exit
  exit
  mod-table common COMMON_UAS_RESERVE
    mod 0
      action 0 add-tag "RESERVE"
      action 1 remove-tag "MAIN"
    exit 
  exit
  trunk sip UAC
    sip transport SIP_TRANSPORT
    route-table TO_UAS
    mod-table common in COMMON_UAS_MAIN 
    media resource 0 MEDIA
    remote address 192.168.126.190
    remote port 5061
  exit
  trunk sip UAS_MAIN
    sip transport SIP_TRANSPORT
    media resource 0 MEDIA
    remote address 192.168.126.190
    remote port 5064
  exit
  trunk sip UAS_RESERVE
    sip transport SIP_TRANSPORT
    mod-table common out COMMON_UAS_RESERVE
    media resource 0 MEDIA
    remote address 192.168.126.190
    remote port 5063
  exit

На транк UAC приходит INVITE, ESBC добавляет к этой сессии тег "MAIN":

INVITE sip:23002@192.168.126.195:5060 SIP/2.0
Via: SIP/2.0/UDP 192.168.126.190:5061;rport;branch=z9hG4bK-453702-1-1
From: "24001" <sip:24001@192.168.126.195>;tag=1
To: "23002" <sip:23002@192.168.126.195:5060>
Call-ID: 1-453702@192.168.126.190
Cseq: 1 INVITE
Contact: <sip:24001@192.168.126.190:5061>
Max-Forwards: 70
Allow: INVITE, ACK, BYE, CANCEL
Content-Type: application/sdp
Content-Length:   142

[SDP]...

В транк UAS_MAIN отправляется INVITE с заголовком Destination: Main:

INVITE sip:23002@192.168.126.190:5064 SIP/2.0
Via: SIP/2.0/UDP 192.168.126.195:5060;rport;branch=z9hG4bKPj16765696-c913-4ffc-9f10-f92beca0c0d0
Max-Forwards: 70
From: "24001" <sip:24001@192.168.126.195>;tag=b6899be4-af2c-490e-bcf0-a8802cff7276
To: "23002" <sip:23002@192.168.126.190>
Contact: <sip:24001@192.168.126.195:5060;transport=udp>
Call-ID: 50e31c6d5ad746a0eb4a9db3e8543adb
CSeq: 31819 INVITE
Allow: INVITE, ACK, BYE, CANCEL
Supported: 100rel, replaces, ice
Destination: Main
Content-Type: application/sdp
Content-Length:   143

[SDP]...

Из транка UAS_MAIN не поступило ответа, вызов отправляется в следующий транк в транковой группе - UAS_RESERVE, из сессии удаляется тег MAIN, добавляется тег RESERVE.

Так как в сессии остался только тег "RESERVE", то согласно таблице модификаций SIP_MOD в запрос INVITE добавляется заголовок Destination: Reserve.

INVITE sip:23002@192.168.126.190:5063 SIP/2.0
Via: SIP/2.0/UDP 192.168.126.195:5060;rport;branch=z9hG4bKPj40877976-9faa-4950-99e2-507a8176160a
Max-Forwards: 70
From: "24001" <sip:24001@192.168.126.195>;tag=3b1a257a-9167-4d11-b200-caa26358f2e5
To: "23002" <sip:23002@192.168.126.190>
Contact: <sip:24001@192.168.126.195:5060;transport=udp>
Call-ID: 50e31c6d5ad746a0eb4a9db3e8543adb
CSeq: 17681 INVITE
Allow: INVITE, ACK, BYE, CANCEL
Supported: 100rel, replaces, ice
Destination: Reserve
Content-Type: application/sdp
Content-Length:   143

[SDP]...

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

В ESBC поддержано использование условий в общих модификаторах:

Каждая модификация может содержать до 8 условий.

Если в настройках модификатора задано условие, то перед применением модификации параметры сессии проверяются на соответствие условию. Если условий несколько, то для применения модификации необходимо выполнение всех условий.

Пример работы условий приведен в разделе Настройка таблиц маршрутизации. Настройка условий для таблиц маршрутизации и таблиц общих модификаторов идентична.

Логика применения условий

По умолчанию все условия применяются с логикой "И", то есть модификация выполнится только при успешной проверке всех условий, если хотя бы одно условие не выполняется, то ESBC переходит к обработке следующего модификатора.

Есть возможность с помощью выражения задавать логику применения условий, доступные логические операторы:

Для обращения к условию необходимо использовать его индекс. В выражении можно использовать скобки для группировки условий.

Пример настройки логики применения условий приведен в разделе Настройка таблиц маршрутизации.

Синтаксис для написания условий

Для написания условий используются регулярные выражения PCRE. 

Регулярное выражение для условия по номеру или тегу применяется с логикой полного совпадения(exact match). Например, необходимо написать шаблон, который будет соответствовать номеру "20405". В данном случае шаблон "^20.*" будет корректным, а шаблон "20" - нет.

Регулярное выражение для условия по значению SIP-сообщения применяется с логикой частичного совпадения(match).

Описание всех команд для настройки общих модификаторов приведено в разделе Настройки общих модификаторов.  

При вводе выражения в одинарных и двойных кавычках различается логика экранирования символа обратного слеша - «\». 

При вводе регулярного выражения в одинарных кавычках символы обратного слеша и двойные кавычки экранируются обратным слешем автоматически.

Пример ввода шаблона:

vesbc(config-esbc-mod-table-common-modification)# condition 0 cgpn pattern '\d'

Пример отображения шаблона в выводе конфигурации:

  mod-table common MOD
    mod 0
      condition 0 cgpn pattern "\\d"
    exit
  exit

В данном случае будет использоваться поиск совпадения по метасимволу «\d», то есть по совпадению с любой цифрой.

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

1. Пример ввода шаблона c одним обратным слешем:

 vesbc(config-esbc-mod-table-common-modification)# condition 0 cgpn pattern "\d"

Пример отображения шаблона в выводе конфигурации:

  mod-table common MOD
    mod 0
      condition 0 cgpn pattern "d"
    exit
  exit

В данном случае будет использоваться поиск совпадения по букве «d».

2.  Пример ввода шаблона c двумя обратными слешами:

  vesbc(config-esbc-mod-table-common-modification)# condition 0 cgpn pattern "\\d"

Пример отображения шаблона в выводе конфигурации:

  mod-table common MOD
    mod 0
      condition 0 cgpn pattern "\\d"
    exit
  exit

В данном случае будет использоваться поиск совпадения c использованием метасимвола «\d», то есть по совпадению с любой цифрой.

Модификаторы SIP

Данный тип модификации позволяет изменять любые заголовки сообщений SIP. 

Процесс модификации заголовков отличается в зависимости от режима использования модификатора IN или OUT.

Существуют ограничения на модификацию основных заголовков SIP, к которым относятся: Call-ID, From, To, Via, CSeq, Contact, Max-Forwards, Route, Record-Route, Content-Type, Content-Lenght, Require, Supported.

После применения к сообщению модификатора IN и использования модификаций основных заголовков, дальнейшая обработка диалога sip будет осуществляться в соответствии с модифицированным сообщением, т. к. в ядро системы попадает модифицированное сообщение. В результате в ответных сообщениях будут использоваться данные, которые могут отличаться от исходного сообщения. Модификация IN также влияет на дальнейшую маршрутизацию сообщения.

Применение к сообщению модификатора OUT и использования модификаций основных заголовков, изменяет только значения заголовков непосредственно перед отправкой, но не влияет на последующие сообщения в диалоге, т. к. исходное сообщение формируется ядром системы до применения модификаторов OUT.

Применение модификаторов к основным заголовкам SIP может привести к нарушению обработки сообщений.

Логика обработки сообщения SIP при использовании IN-модификации:


Логика обработки сообщения SIP при использовании OUT-модификации:

Модификаторы SIP позволяют гибко осуществлять выбор требуемого метода (Request) или ответного сообщения (Response) по конкретному коду. Для этого используются команды:

Команда method type аналогична команде method pattern и может использоваться в случае, когда модификацию требуется осуществлять только в одном из шести вышеуказанных методов. При использовании этой команды нет необходимости использовать pattern для написания регулярного выражения, достаточно выбрать метод из списка. Команды method type и method pattern являются взаимоисключающими.

При использовании pattern имейте в виду, что по умолчанию синтаксис PCRE является регистрозависимым. Поэтому, например, шаблон "method pattern INVITE" не эквивалентен шаблону "method pattern invite" и отбор метода INVITE не будет осуществляться при использовании выражения "method pattern invite". 

Помимо работы с заголовками, SIP-модификаторы позволяют взаимодействовать с Request-URI и Status-Line. Для этого необходимо задать соответствующий шаблон при указании header name-pattern.

При настройке модификатора обязательно следует указывать командами выше, для каких методов и кодов ответа он будет применяться. Иначе модификация не будет применена ни к одному сообщению.

Примеры отбора сообщений SIP для модификации:

Требуется применять модификатор, который добавляет заголовок Test_header cо значением test_value только в сообщение INVITE:

mod-table sip SIP_MOD
  mod 1 add
#Т.к. по условию требуется добавлять заголовок только в сообщения INVITE, можно воспользоваться командой method type:
    method type Invite
    header name Test_header
    header value test_value 
  exit

Требуется применять модификатор, который добавляет заголовок Test_header cо значением test_value только в сообщения INVITE, BYE и в ответы 200 OK:

mod-table sip SIP_MOD
  mod 1 add
#Т.к. по условию требуется добавлять заголовок в INVITE и BYE, надо воспользоваться командой "method pattern":
    method pattern INVITE|BYE
#Для добавления заголовка в ответы 200 OK следует добавить команду "response-pattern"
    response-pattern 200
    header name Test_header
    header value test_value
  exit

Требуется применять модификатор, который добавляет заголовок Test_header cо значением test_value во все запросы и ответы:

mod-table sip SIP_MOD
  mod 1 add
#Т.к. по условию требуется добавлять заголовок во все методы, используется отбор любых значений:
    method pattern .+
#Т.к. по условию требуется добавлять заголовок во все ответы, используется отбор любых значений:
    response-pattern .+
    header name Test_header
    header value test_value
  exit

Требуется применять модификатор, который добавляет заголовок Test_header cо значением test_value только в предварительные ответы 100–199:

mod-table sip SIP_MOD
  mod 1 add
#Т.к. по условию требуется добавлять заголовок во все ответы от 100 до 199, используется, например, регулярное выражение "1\\d{2}"
    response-pattern "1\\d{2}"
    header name Test_header
    header value test_value
  exit

Поддерживаемые модификации

Поддерживаются следующие типы модификации:

Порядок применения модификаций в таблице

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

В результате если какой-либо заголовок был добавлен модификацией add, а затем этот же заголовок был указан в правиле no-transit, то в исходящем сообщении этот заголовок не будет передан. 

Пример: 

Таблица модификации SIP_MOD используется в качестве OUT:

mod-table sip SIP_MOD
  mod 1 add
    method pattern ".+"
    response-pattern ".+"
    header name Test_header
    header value Test_value
  exit
  mod 2 no-transit
    header name-pattern "Test_header"
    method pattern ".+"
    response-pattern ".+"
    value-pattern "Test_value"
  exit

Заголовок Test_header не будет передан.

Описание всех команд для настройки общих модификаторов приведено в разделе Настройки SIP-модификаторов.

Модификатор добавления заголовка (add)

Схема:


В конфигурации есть два транка, настроена маршрутизация. Вызов, который приходит из TRUNK_IN, уходит в TRUNK_OUT. Требуется, чтобы в запросе INVITE, который отправляется в TRUNK_OUT, был добавлен заголовок Test_header со значением example string.

vesbc# 
vesbc# configure 
vesbc(config)# esbc 

#Создание таблицы модификаторов MODTABLE_IN:
vesbc(config-esbc)# mod-table sip MODTABLE_IN
vesbc(esbc-mod-table-sip)# 

#Добавление в таблицу модификаторов правила на добавление заголовка:
vesbc(esbc-mod-table-sip)# mod 0 add
vesbc(esbc-mod-table-sip-modification)# 

#Выбор запроса, в котором будет добавлен заголовок (в данном случае INVITE):
vesbc(esbc-mod-table-sip-modification)# method type Invite 

#Указать название заголовка, который необходимо вставить (в данном случае Test_header):
vesbc(esbc-mod-table-sip-modification)# header name Test_header

#Указать содержимое заголовка, которое необходимо вставить (в данном случае example string):
vesbc(esbc-mod-table-sip-modification)# header value "example string"

vesbc(esbc-mod-table-sip-modification)# exit
vesbc(esbc-mod-table-sip)# exit

#Привязать таблицу модификаторов к входящему транку TRUNK_IN:
vesbc(config-esbc)# trunk sip TRUNK_IN 
vesbc(config-esbc-trunk-sip)# mod-table sip in MODTABLE_IN 

#Применить и подтвердить изменения:
vesbc(config-esbc-trunk-sip)# do commit 
Configuration has been successfully applied and saved to flash. Commit timer started, changes will be reverted in 600 seconds.
vesbc(config-esbc-trunk-sip)# do confirm 
Configuration has been confirmed. Commit timer canceled.

После внесения изменений в конфигурацию с TRUNK_IN приходит следующий INVIITE:

INVITE sip:24000@192.168.114.130:5461 SIP/2.0
Via: SIP/2.0/UDP 192.168.114.129:5461;branch=z9hG4bK-372660-1-5
From: "Simple UAC send bye" <sip:24001@192.168.114.130;cpc=priority>;tag=1372660
To: "24000" <sip:24000@192.168.114.130>
Call-ID: 1-372660@192.168.114.129
CSeq: 1 INVITE
Contact: <sip:24001@192.168.114.129:5461>
Max-Forwards: 70
Content-Type: application/sdp
Content-Length: 149

v=0
o=tester 1256 654321 IN IP4 192.168.114.129
s=A conversation
c=IN IP4 192.168.114.129
t=0 0
m=audio 8338 RTP/AVP 8
a=rtpmap:8 PCMA/8000

На TRUNK_OUT отправляется уже модифицированный INVITE с добавленным заголовком: 

INVITE sip:24000@192.168.114.129:5460 SIP/2.0
Via: SIP/2.0/UDP 192.168.114.130:5460;rport;branch=z9hG4bKPj-fvzSQlwN2zoMaGUR5JCLMkjmkBV3Vz1
Max-Forwards: 70
From: "Simple UAC send bye" <sip:24001@192.168.114.130>;tag=l2jkRSMeumV03IdhjPntOt7l0XBKy-Ln
To: "24000" <sip:24000@192.168.114.129>
Contact: <sip:24001@192.168.114.130:5460;transport=udp>
Call-ID: P-W.2oee.2vJw0JoaFbNkRDvnxY40FoP
CSeq: 30738 INVITE
Allow: PRACK, SUBSCRIBE, NOTIFY, REFER, INVITE, ACK, BYE, CANCEL, UPDATE
Supported: timer, 100rel, replaces
Session-Expires: 1800
Min-SE: 90

#Добавленный через таблицу модификаторов заголовок:
Test_header: example string 
Content-Type: application/sdp
Content-Length: 157

v=0
o=tester 3927594021 3927594021 IN IP4 192.168.114.130
s=A conversation
c=IN IP4 192.168.114.130
t=0 0
m=audio 8062 RTP/AVP 8
a=rtpmap:8 PCMA/8000


Модификатор передачи заголовка (transit)

Схема: 

В конфигурации настроено два транка и настроена маршрутизация из транка TRUNK_IN в TRUNK_OUT. Требуется передать заголовок "User-Agent" из входящего INVITE, только если в нем указано значение "TestUA". 

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

Решение:

Создаем таблицу модификации MODTABLE_IN:

vesbc# 
vesbc# configure 
vesbc(config)# esbc 

#Создание таблицы модификаторов MODTABLE_IN: 
vesbc(config-esbc)# mod-table sip MODTABLE_IN
vesbc(esbc-mod-table-sip)# 

#Добавление в таблицу модификаторов правила для транзита заголовков:
vesbc(esbc-mod-table-sip)# mod 0 transit
vesbc(esbc-mod-table-sip-modification)# 

#Выбор метода, в котором будет осуществляться поиск заголовка (по условиям задачи — INVITE):
vesbc(esbc-mod-table-sip-modification)# method type Invite

#Указать шаблон для выбора названия заголовка, который необходимо передавать (по условиям задачи — User-Agent):
vesbc(esbc-mod-table-sip-modification)# header name-pattern User-Agent

#Указать содержимое заголовка, при совпадении с которым заголовок будет передан (по условиям задачи — TestUA):
vesbc(esbc-mod-table-sip-modification)# header value-pattern TestUA
vesbc(esbc-mod-table-sip-modification)# exit
vesbc(esbc-mod-table-sip)# exit

Используем созданную таблицу в качестве IN для транка TRUNK_IN:

vesbc(config-esbc)# trunk sip TRUNK_IN
vesbc(config-esbc-trunk-sip)# mod-table sip in MODTABLE_IN 
vesbc(config-esbc-trunk-sip)# do commit 
vesbc(config-esbc-trunk-sip)# do confirm 

В результате, когда в транке TRUNK_IN  будет получен INVITE, содержащий заголовок "User-Agent" со значением "TestUA", в исходящем INVITE также будет присутствовать этот заголовок:  

#INVITE, полученный в TRUNK_IN:
INVITE sip:23002@192.168.23.199:5070 SIP/2.0
Via: SIP/2.0/UDP 192.168.23.200:5070;rport;branch=z9hG4bK-17639-1-1
From: sipp <sip:24001@192.168.23.200:5070>;tag=1
To: sut <sip:23002@192.168.23.199:5070>
Call-ID: 1-17639@192.168.23.200
Cseq: 1 INVITE
Contact: <sip:24001@192.168.23.200:5070>
Max-Forwards: 70
Subject: Performance Test
Allow: INVITE, ACK, BYE, CANCEL, PRACK, REGISTER, INFO, REFER, NOTIFY, OPTIONS, SUBSCRIBE, MESSAGE, UPDATE, PUBLISH
Content-Type: application/sdp
User-Agent: TestUA
Content-Length:   240

[SDP]

#INVITE, отправленный c TRUNK_OUT:
INVITE sip:23002@192.168.80.26:5080 SIP/2.0
Via: SIP/2.0/UDP 192.168.80.129:5080;rport;branch=z9hG4bKPj88572ec4-0af0-4323-abc6-fe1db1ea6e37
Max-Forwards: 70
From: "sipp" <sip:24001@192.168.80.129>;tag=7da4c833-38da-4523-89d7-adc88b581397
To: "sut" <sip:23002@192.168.80.26>
Contact: <sip:24001@192.168.80.129:5080;transport=udp>
Call-ID: d21bdedb499dbfe992a939a27255c536
CSeq: 6199 INVITE
Allow: INVITE, ACK, BYE, CANCEL, PRACK, REGISTER, INFO, REFER, NOTIFY, OPTIONS, SUBSCRIBE, MESSAGE, UPDATE
Supported: 100rel, replaces, ice
User-Agent: TestUA
Content-Type: application/sdp
Content-Length:   241

[SDP]

Данный модификатор сработает только в случае, когда значение заголовка User-Agent будет "TestUA". Если значение отличается, то заголовок User-Agent не будет передаваться на второе плечо. Для передачи заголовка с любым значением не следует использовать команду header value-pattern в модификаторе, требуется указать в ней все возможные варианты, например, header value-pattern .*

Модификатор удаления заголовка (no-transit)  

Схема: 

В конфигурации есть два транка, настроена маршрутизация. Вызов, который приходит из TRUNK_IN, уходит в TRUNK_OUT. В TRUNK_OUT отправляется запрос INVITE, в теле которого есть заголовок Test_header. Требуется, чтобы в запросе INVITE, который отправляется в TRUNK_OUT, вырезался заголовок Test_header, если в его содержимом есть "example string".

По умолчанию все необязательные и пользовательские заголовки удаляются на входящем плече и не передаются на исходящее плечо. В данном примере демонстрируется модификация только для исходящего плеча (TRUNK_OUT), поэтому подразумевается что на входящем плече (TRUNK_IN) настроен модификатор transit для заголовка Test_header.

При применении no-transit к Request-URI и Status-Line отменятся их модификации, но сами они не удалятся.  

vesbc# 
vesbc# configure 
vesbc(config)# esbc 

#Создание таблицы модификаторов MODTABLE_OUT:
vesbc(config-esbc)# mod-table sip MODTABLE_OUT
vesbc(esbc-mod-table-sip)# 

#Добавление в таблицу модификаторов правила на удаление заголовка:
vesbc(esbc-mod-table-sip)# mod 0 no-transit
vesbc(esbc-mod-table-sip-modification)# 

#Выбор запроса, в котором будет удален заголовок (в данном случае INVITE):
vesbc(esbc-mod-table-sip-modification)# method type Invite

#Указать название заголовка, который необходимо удалить (в данном случае Test_header):
vesbc(esbc-mod-table-sip-modification)# header name-pattern Test_header

#Указать содержимое заголовка, при совпадении с которым заголовок будет удален (в данном случае example string):
vesbc(esbc-mod-table-sip-modification)# header value-pattern "example string"

vesbc(esbc-mod-table-sip-modification)# exit
vesbc(esbc-mod-table)# exit

#Привязать таблицу модификаторов к исходящему транку TRUNK_OUT:
vesbc(config-esbc)# trunk sip TRUNK_OUT 
vesbc(config-esbc-trunk-sip)# mod-table sip out MODTABLE_OUT 

#Применить и подтвердить изменения:
vesbc(config-esbc-trunk-sip)# do commit 
Configuration has been successfully applied and saved to flash. Commit timer started, changes will be reverted in 600 seconds.
vesbc(config-esbc-trunk-sip)# do confirm 
Configuration has been confirmed. Commit timer canceled.

До внесения изменений в конфигурацию в TRUNK_OUT отправлялся следующий INVIITE:

INVITE sip:24000@192.168.114.129:5460 SIP/2.0
Via: SIP/2.0/UDP 192.168.114.130:5460;rport;branch=z9hG4bKPjjju.7u4O03Aty93vQq0Q1huigSIqGVIr
Max-Forwards: 70
From: "Simple UAC send bye" <sip:24001@192.168.114.130>;tag=CW.53L5FPJAUBsiRspMYqtjTtOTzZxHg
To: "24000" <sip:24000@192.168.114.129>
Contact: <sip:24001@192.168.114.130:5460;transport=udp>
Call-ID: V4OOROjNahUbinXtA648s9eI2kjE5cCI
CSeq: 18905 INVITE
Allow: PRACK, SUBSCRIBE, NOTIFY, REFER, INVITE, ACK, BYE, CANCEL, UPDATE
Supported: timer, 100rel, replaces
Session-Expires: 1800
Min-SE: 90
#Заголовок, который должен быть удален:
Test_header: example string
Content-Type: application/sdp
Content-Length:   157

v=0
o=tester 39275952 39275952 IN IP4 192.168.114.130
s=A conversation
c=IN IP4 192.168.114.130
t=0 0
m=audio 8066 RTP/AVP 8
a=rtpmap:8 PCMA/8000

После внесения изменений в конфигурацию в TRUNK_OUT отправляется следующий INVITE (заголовок Test_header отсутствует):

INVITE sip:24000@192.168.114.129:5460 SIP/2.0
Via: SIP/2.0/UDP 192.168.114.130:5460;rport;branch=z9hG4bKPjz8Y5BfoTrBQlqecLCuTIyYn-6rX5dH
Max-Forwards: 70
From: "Simple UAC send bye" <sip:24001@192.168.114.130>;tag=qTwcY3ZHvA6SHvuRsoo7w40r9yXzjEEp
To: "24000" <sip:24000@192.168.114.129>
Contact: <sip:24001@192.168.114.130:5460;transport=udp>
Call-ID: yHvNLSIvp0DQYSRFPRpfgVUv9U0uKEHT
CSeq: 10147 INVITE
Allow: PRACK, SUBSCRIBE, NOTIFY, REFER, INVITE, ACK, BYE, CANCEL, UPDATE
Supported: timer, 100rel, replaces
Session-Expires: 1800
Min-SE: 90
Content-Type: application/sdp
Content-Length:   157

v=0
o=tester 3927597375 3927597375 IN IP4 192.168.114.130
s=A conversation
c=IN IP4 192.168.114.130
t=0 0
m=audio 8070 RTP/AVP 8
a=rtpmap:8 PCMA/8000

В случае если в заголовке Test_header будет содержимое, отличное от "example string", заголовок будет отправлен в TRUNK_OUT:

INVITE sip:24000@192.168.114.129:5460 SIP/2.0
Via: SIP/2.0/UDP 192.168.114.130:5460;rport;branch=z9hG4bKPj8e1WEAvAy16Bk8Vrj-VZiFK-bNOjnjY9
Max-Forwards: 70
From: "Simple UAC send bye" <sip:24001@192.168.114.130>;tag=R83mrTm4KQsFL1Bk87hTOB8e182yCSJ.
To: "24000" <sip:24000@192.168.114.129>
Contact: <sip:24001@192.168.114.130:5460;transport=udp>
Call-ID: eQueXFpyDZESB.hXK.uCGn7XL7TBUdmQ
CSeq: 8831 INVITE
Allow: PRACK, SUBSCRIBE, NOTIFY, REFER, INVITE, ACK, BYE, CANCEL, UPDATE
Supported: timer, 100rel, replaces
Session-Expires: 1800
Min-SE: 90

#Заголовок Test_header с содержимым, отличным от "example string", не удаляется:
Test_header: new string
Content-Type: application/sdp
Content-Length:   157

v=0
o=tester 3927597832 3927597832 IN IP4 192.168.114.130
s=A conversation
c=IN IP4 192.168.114.130
t=0 0
m=audio 8074 RTP/AVP 8
a=rtpmap:8 PCMA/8000

Модификатор транзита и замены заголовка (replace)

Схема:


В конфигурации есть два транка, настроена маршрутизация. Вызов, который приходит из TRUNK_IN, уходит в TRUNK_OUT. Из TRUNK_IN приходит INVITE с заголовком Test_header: 123. Требуется, чтобы в TRUNK_OUT отправился INVITE с заголовком Test_header: 123456.

vesbc# 
vesbc# configure 
vesbc(config)# esbc 

#Создание таблицы модификаторов MODTABLE_IN:
vesbc(config-esbc)# mod-table sip MODTABLE_IN
vesbc(esbc-mod-table-sip)# 

#Добавление в таблицу модификаторов правила на замену заголовка:
vesbc(esbc-mod-table-sip)# mod 1 replace

#Выбор запроса, в котором будут заменяться заголовки:
vesbc(esbc-mod-table-sip-modification)# method type Invite

#Указать название заголовка, содержимое которого необходимо заменить:
vesbc(esbc-mod-table-sip-modification)# header name-pattern Test_header

#Указать место в содержимом заголовка, которое необходимо заменить (конец строки исходного содержимого заголовка):
vesbc(esbc-mod-table-sip-modification)# header value-pattern $

#Добавить правило для подмены содержимого заголовка (к концу строки исходного содержимого заголовка добавляется 456):
vesbc(esbc-mod-table-sip-modification)#  456

vesbc(esbc-mod-table-sip-modification)# exit
vesbc(esbc-mod-table-sip)# exit

#Привязать таблицу модификаторов к входящему транку TRUNK_IN:
vesbc(config-esbc)# trunk sip TRUNK_IN
vesbc(config-esbc-trunk-sip)# mod-table sip in MODTABLE_IN 

#Применить и подтвердить изменения:
vesbc(config-esbc-trunk-sip)# do commit 
Configuration has been successfully applied and saved to flash. Commit timer started, changes will be reverted in 600 seconds.
vesbc(config-esbc-trunk-sip)# do confirm 
Configuration has been confirmed. Commit timer canceled.

После внесения изменений в конфигурацию с TRUNK_IN приходит следующий INVIITE:

INVITE sip:24000@192.168.114.130:5461 SIP/2.0
Via: SIP/2.0/UDP 192.168.114.129:5461;branch=z9hG4bK-375510-1-5
From: "Simple UAC send bye"  <sip:24001@192.168.114.130;cpc=priority>;tag=1375510
To: "24000" <sip:24000@192.168.114.130>
Call-ID: 1-375510@192.168.114.129
CSeq: 1 INVITE
Contact: <sip:24001@192.168.114.129:5461>
Max-Forwards: 70

#Заголовок, который необходимо протранзитить и заменить:
Test_header: 123
Content-Type: application/sdp
Content-Length:   149

v=0
o=tester 123456 654321 IN IP4 192.168.114.129
s=A conversation
c=IN IP4 192.168.114.129
t=0 0
m=audio 7624 RTP/AVP 8
a=rtpmap:8 PCMA/8000

На TRUNK_OUT отправляется уже модифицированный INVITE с измененным заголовком:

INVITE sip:24000@192.168.114.129:5460 SIP/2.0
Via: SIP/2.0/UDP 192.168.114.130:5460;rport;branch=z9hG4bKPjIbcILUaVB0cQTFaGLLb7ccpnbTQIRvV3
Max-Forwards: 70
From: "Simple UAC send bye" <sip:24001@192.168.114.130>;tag=toP8wIO79wo47ChSYy69MFOyd4vhGRNF
To: "24000" <sip:24000@192.168.114.129>
Contact: <sip:24001@192.168.114.130:5460;transport=udp>
Call-ID: dLsiFI4-aD2faceSTLZu.-kuHfN.pJtG
CSeq: 22556 INVITE
Allow: PRACK, SUBSCRIBE, NOTIFY, REFER, INVITE, ACK, BYE, CANCEL, UPDATE
Supported: timer, 100rel, replaces
Session-Expires: 1800
Min-SE: 90

#Измененный заголовок:
Test_header: 123456
Content-Type: application/sdp
Content-Length:   157

v=0
o=tester 3927607871 3927607871 IN IP4 192.168.114.130
s=A conversation
c=IN IP4 192.168.114.130
t=0 0
m=audio 8090 RTP/AVP 8
a=rtpmap:8 PCMA/8000

Пример использования локальных переменных pcre в модификации replace (схема та же): 

vesbc# 
vesbc# configure 
vesbc(config)# esbc 

#Создание таблицы модификаторов MODTABLE_IN:
vesbc(config-esbc)# mod-table sip MODTABLE_IN
vesbc(esbc-mod-table-sip)# 

#Добавление в таблицу модификаторов правила на замену заголовка:
vesbc(esbc-mod-table-sip)# mod 1 replace

#Выбор запроса, в котором будут заменяться заголовки:
vesbc(esbc-mod-table-sip-modification)# method type Invite

#Указать название заголовка, содержимое которого необходимо заменить:
vesbc(esbc-mod-table-sip-modification)# header name-pattern Date

#Указать место в содержимом заголовка, которое необходимо заменить (шаблон — дата в формате "год-месяц-число"):
vesbc(esbc-mod-table-sip-modification)# header value-pattern "(\\d{4})-(\\d{2})-(\\d{2})"

#Добавить правило для подмены содержимого заголовка (меняем формат даты на "месяц/число/год"):
vesbc(esbc-mod-table-sip-modification)#  "\\2/\\3/\\1"

vesbc(esbc-mod-table-sip-modification)# exit
vesbc(esbc-mod-table-sip)# exit

#Привязать таблицу модификаторов к входящему транку TRUNK_IN:
vesbc(config-esbc)# trunk sip TRUNK_IN
vesbc(config-esbc-trunk-sip)# mod-table sip in MODTABLE_IN 

#Применить и подтвердить изменения:
vesbc(config-esbc-trunk-sip)# do commit 
Configuration has been successfully applied and saved to flash. Commit timer started, changes will be reverted in 600 seconds.
vesbc(config-esbc-trunk-sip)# do confirm 
Configuration has been confirmed. Commit timer canceled.

После внесения изменений в конфигурацию с TRUNK_IN приходит следующий INVIITE:

INVITE sip:135@10.25.72.151:5060 SIP/2.0
Via: SIP/2.0/UDP 10.25.72.35:5063;rport;branch=z9hG4bK-1104631-1-0
From: <sip:134@10.25.72.151:5060;user=phone>;tag=1
To: <sip:135@10.25.72.151:5060;user=phone>
Call-ID: 1-1104631@10.25.72.35
CSeq: 1 INVITE
Max-Forwards: 70
Supported: replaces, timer
Contact: <sip:134@10.25.72.35:5063>

#Заголовок, который необходимо протранзитить и изменить:
Date: 2024-09-10
Content-Type: application/sdp
Content-Length:   153

На TRUNK_OUT отправляется уже модифицированный INVITE с измененным заголовком:

Via: SIP/2.0/UDP 10.25.72.151:5060;rport;branch=z9hG4bKPjc5kLf-R0rh5Stla2eTvpoVAxOc0Jr.kX
Max-Forwards: 70
From: <sip:134@10.25.72.151>;tag=lMWgbj2x66hzNDHhP8ef8tWvB2HT2DwH
To: <sip:135@192.168.23.140>
Contact: <sip:134@10.25.72.151:5060;transport=udp>
Call-ID: c09c3761560702267daaee76eb769a9c
CSeq: 5021 INVITE
Allow: PRACK, SUBSCRIBE, NOTIFY, REFER, INVITE, ACK, BYE, CANCEL, UPDATE
Supported: 100rel, replaces

#Измененный заголовок:
Date: 09/10/2024
Content-Type: application/sdp
Content-Length:   163

Пример 2.

Схема:


В конфигурации есть два транка, настроена маршрутизация. Вызов, который приходит из TRUNK_IN, уходит в TRUNK_OUT. При отправке сообщения INVITE, полученного из TRUNK_IN в TRUNK_OUT, в host-part заголовков To и From будут использоваться IP-адрес, настроенный в качестве remote address в транке TRUNK_OUT, и IP-адрес sip-транспорта для TRUNK_OUT соответственно (при условии, что в транке TRUNK_OUT не настроен домен). 

Требуется при отправке INVITE заменять эти адреса на testdomain.loc.  

Решение:

Конфигурация ESBC до использования модификаторов:

esbc
  media resource MEDIA_IN
    ip address 192.168.23.199
  exit
  media resource MEDIA_OUT
    ip address 192.168.80.129
  exit
  sip transport IN
    ip address 192.168.23.199
    port 5070
  exit
  sip transport OUT
    ip address 192.168.80.129
    port 5080
  exit
  route-table TO_TRUNK_OUT
    rule 0
      action direct-to-trunk TRUNK_OUT
    exit
  exit
  trunk sip TRUNK_IN
    sip transport IN
    route-table TO_TRUNK_OUT
    media resource 0 MEDIA_IN
    remote address 192.168.23.200
    remote port 5070
  exit
  trunk sip TRUNK_OUT
    sip transport OUT
    media resource 0 MEDIA_OUT
    remote address 192.168.80.26
    remote port 5080
  exit
exit

Т. к. в транке TRUNK_OUT не настроен домен, то в host-part заголовков To и From сообщения INVITE будут указаны IP-адреса в соответствии с конфигурацией:

INVITE sip:23002@192.168.80.26:5080 SIP/2.0
Via: SIP/2.0/UDP 192.168.80.129:5080;rport;branch=z9hG4bKPj11eb899a-a1c3-4659-b78d-4bba6bdc17ce
Max-Forwards: 70
From: "sipp" <sip:24001@192.168.80.129>;tag=c090d50d-4b15-4db1-94ac-3ea77fe3dd7d
To: "sut" <sip:23002@192.168.80.26>
Contact: <sip:24001@192.168.80.129:5080;transport=udp>
Call-ID: db38ba3ff093153f38b412372a1bed35
CSeq: 20022 INVITE
Allow: INVITE, ACK, BYE, CANCEL, PRACK, REGISTER, INFO, REFER, NOTIFY, OPTIONS, SUBSCRIBE, MESSAGE, UPDATE
Supported: 100rel, replaces, ice
Content-Type: application/sdp
Content-Length:   241

[SDP]

Настраиваем модификатор MOD_TABLE для замены IP-адресов на testdomain.loc:

vesbc# configure 
vesbc(config)# esbc 
vesbc(config-esbc)# mod-table sip MOD_TABLE
#Создаем модификатор замены:
vesbc(esbc-mod-table-sip)# mod 1 replace

#С помощью шаблона выбираем заголовки, в которых необходимо выполнить замену:
vesbc(esbc-mod-table-sip-modification)# header name-pattern "(From|To)"

#Указываем метод, в котором необходимо выполнить замену:
vesbc(esbc-mod-table-sip-modification)# method pattern "INVITE"

#Выбираем часть заголовка, которая начинается с символа @, содержит любое количество любых символов и заканчивается символом >. Под это выражение попадает host-part заголовков:
vesbc(esbc-mod-table-sip-modification)# header value-pattern "@.*>"

#Указываем, что требуется заменить то, что мы получили в предыдущем правиле на @testdomain.loc>:
vesbc(esbc-mod-table-sip-modification)#  "@testdomain.loc>"
vesbc(esbc-mod-table-sip-modification)# exit
vesbc(esbc-mod-table-sip)# exit
vesbc(config-esbc)# 

Используем это правило в TRUNK_OUT в качестве OUT:

vesbc# 
vesbc# configure 
vesbc(config)# esbc 
vesbc(config-esbc)# trunk sip TRUNK_OUT 
vesbc(config-esbc-trunk-sip)# mod-table sip out MOD_TABLE 
vesbc(config-esbc-trunk-sip)# do commit 
vesbc(config-esbc-trunk-sip)# do confirm 

Теперь в результате модификации в host-part заголовков To и From сообщения INVITE будет указан домен testdomain.loc: 

INVITE sip:23002@192.168.80.26:5080 SIP/2.0
Via: SIP/2.0/UDP 192.168.80.129:5080;rport;branch=z9hG4bKPje431c80c-619a-43cc-a631-9ad3be4e6679
Max-Forwards: 70
From: "sipp" <sip:24001@testdomain.loc>;tag=0a5f2f31-e27e-4f7c-a3f8-70ca1d5a9f22
To: "sut" <sip:23002@testdomain.loc>
Contact: <sip:24001@192.168.80.129:5080;transport=udp>
Call-ID: 81a874656978d43e11d57e3662996fde
CSeq: 26399 INVITE
Allow: INVITE, ACK, BYE, CANCEL, PRACK, REGISTER, INFO, REFER, NOTIFY, OPTIONS, SUBSCRIBE, MESSAGE, UPDATE
Supported: 100rel, replaces, ice
Content-Type: application/sdp
Content-Length:   241

[SDP]

Модификатор копирования (copy)

Работа с переменными модификатора

Значения переменных, полученных в модификаторе copy, можно использовать в модификаторах replace (поле ) и add (поле header value) в рамках одной SIP-сессии.

Значения переменных синхронизируются между плечами вызова, например, если переменная используется в модификаторах copy и add (replace) на обоих плечах, то при изменении переменной на одном из плеч, новое значение переменной будет передано на другое плечо.

Подстроки ${name_perem} будут заменены на значение соответствующей переменной. Длина переменной — до 128 символов. 

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

vesbc(esbc-mod-table-sip-modification)# header value-pattern "(.*)"

Пример 1.

Схема: 


В конфигурации есть два транка, настроена маршрутизация. Вызов, который приходит из TRUNK_IN, уходит в TRUNK_OUT. В TRUNK_OUT отправляется запрос INVITE, в теле которого есть заголовок Diversion (предварительно следует настроить таблицу модификации на IN транка TRUNK_IN для транзита заголовка Diversion на второе плечо). Требуется, чтобы в запросе INVITE, который отправляется в TRUNK_OUT, вырезался заголовок Diversion, а его значение из user part было добавлено в display name заголовка From.

vesbc# 
vesbc# configure 
vesbc(config)# esbc 

#Создание таблицы модификаторов MODTABLE_OUT:
vesbc(config-esbc)# mod-table sip MODTABLE_OUT
vesbc(esbc-mod-table-sip)# 

#Добавление в таблицу модификаторов правила copy для копирования значения user part в переменную user_part:
vesbc(esbc-mod-table-sip)# mod 0 copy
vesbc(esbc-mod-table-sip-modification)# 

#Выбор запроса, в котором будет использоваться модификатор copy (в данном случае INVITE):
vesbc(esbc-mod-table-sip-modification)# method type Invite

#Указать название заголовка, из которого необходимо копировать значение (в данном случае Diversion):
vesbc(esbc-mod-table-sip-modification)# header name-pattern Diversion

#Указать содержимое заголовка, при совпадении с которым будет выполнено копирование в переменную. В переменную будет скопирована та часть отбора, которая указана в скобках:
vesbc(esbc-mod-table-sip-modification)# header value-pattern "<sip:(.+)@"

#Указать переменную, в которую будет скопировано значение, указанное в скобках, в примере - (.+):
vesbc(esbc-mod-table-sip-modification)# variable-str "user_part"
vesbc(esbc-mod-table-sip-modification)# exit

#Добавление в таблицу модификаторов правила replace для замены заголовка From:
vesbc(esbc-mod-table-sip)# mod 1 replace

#Указать название заголовка, в котором будет осуществляться замена:
vesbc(esbc-mod-table-sip-modification)# header name-pattern "From"

#Выбор запроса, в котором будет использоваться модификатор replace (в данном случае INVITE):
vesbc(esbc-mod-table-sip-modification)# method type Invite

#Указать часть содержимого заголовка, которую необходимо заменить:
vesbc(esbc-mod-table-sip-modification)# header value-pattern ".+ <sip:"

#Указать переменную user_part, которая содержит значение, полученное в модификации copy:
vesbc(esbc-mod-table-sip-modification)# replacement "${user_part} <sip:$"
vesbc(esbc-mod-table-sip-modification)# exit

#Добавление в таблицу модификаторов правила no-transit для удаления заголовка Diversion:
vesbc(esbc-mod-table-sip)# mod 2 no-transit
vesbc(esbc-mod-table-sip-modification)# header name-pattern "Diversion"
vesbc(esbc-mod-table-sip-modification)# method type Invite
vesbc(esbc-mod-table-sip-modification)# exit
vesbc(esbc-mod-table-sip)# exit

#Привязать таблицу модификаторов к исходящему транку TRUNK_OUT:
vesbc(config-esbc)# trunk sip TRUNK_OUT 
vesbc(config-esbc-trunk-sip)# mod-table sip out MODTABLE_OUT 

#Применить и подтвердить изменения:
vesbc(config-esbc-trunk-sip)# do commit 
Configuration has been successfully applied and saved to flash. Commit timer started, changes will be reverted in 600 seconds.
vesbc(config-esbc-trunk-sip)# do confirm 
Configuration has been confirmed. Commit timer canceled.

После внесения изменений в конфигурацию с TRUNK_IN приходит следующий INVIITE:

INVITE sip:24001@192.168.80.129:5080 SIP/2.0
Via: SIP/2.0/UDP 192.168.80.26:5070;rport;branch=z9hG4bK-473191-1-1
From: test <sip:24001@192.168.80.26:5070>;tag=1
To: sut <sip:23002@192.168.80.129:5070>
Call-ID: 1-473191@192.168.80.26
Cseq: 1 INVITE
Contact: <sip:24001@192.168.80.26:5070>
Max-Forwards: 70
Diversion: <sip:11111@test.loc>;reason=time-of-day
Subject: Performance Test
Allow: INVITE, ACK, BYE, CANCEL, UPDATE, SUBSCRIBE
Content-Type: application/sdp
Content-Length:   118

[SDP]...

На TRUNK_OUT отправляется уже модифицированный INVITE с измененным заголовком From и без заголовка Diversion:

INVITE sip:23002@192.168.80.26:5080 SIP/2.0
Via: SIP/2.0/UDP 192.168.80.129:5080;rport;branch=z9hG4bKPjbURYAQZxa2m1zsT6x.s6RQ28ONE4EifS
Max-Forwards: 70
From: "11111" <sip:24001@192.168.80.129>;tag=Jfl7n8XBMrh6vjCcB036Ogz6QX4BTDCo
To: "sut" <sip:23002@192.168.80.26>
Contact: <sip:24001@192.168.80.129:5080>
Call-ID: bbf5db1c228015eecddfe0d7079ce876
CSeq: 8798 INVITE
Allow: PRACK, SUBSCRIBE, NOTIFY, REFER, INVITE, ACK, BYE, CANCEL, UPDATE
Supported: 100rel, replaces
Content-Type: application/sdp
Content-Length:   119

[SDP]...

Пример 2. Хранение переменных в течение сессии

Схема:


В конфигурации есть два транка, настроена маршрутизация. Вызов, который приходит из TRUNK_IN, уходит в TRUNK_OUT. Из TRUNK_IN приходит INVITE с заголовком Route. Требуется, чтобы значение заголовка Route из INVITE было добавлено в заголовок INVITE_Route запроса BYE.

vesbc# 
vesbc# configure 
vesbc(config)# esbc 

#Создание таблицы модификаторов MODTABLE_IN:
vesbc(config-esbc)# mod-table sip MODTABLE_IN
vesbc(esbc-mod-table-sip)# 

#Добавление в таблицу модификаторов правила copy для копирования значения заголовка Route в переменную route:
vesbc(esbc-mod-table-sip)# mod 0 copy
vesbc(esbc-mod-table-sip-modification)# 

#Выбор запроса, в котором будет использоваться модификатор copy (в данном случае INVITE):
vesbc(esbc-mod-table-sip-modification)# method type Invite

#Указать название заголовка, из которого необходимо копировать значение (в данном случае Route):
vesbc(esbc-mod-table-sip-modification)# header name-pattern Route

#Указать содержимое заголовка, при совпадении с которым будет выполнено копирование в переменную. В переменную будет скопирована та часть отбора, которая указана в скобках:
vesbc(esbc-mod-table-sip-modification)# header value-pattern "(.+)"

#Указать переменную, в которую будет скопировано значение, указанное в скобках, в примере - (.+):
vesbc(esbc-mod-table-sip-modification)# variable-str "route"
vesbc(esbc-mod-table-sip-modification)# exit

#Добавление в таблицу модификаторов правила add для добавления заголовка INVITE_Route в BYE:
vesbc(esbc-mod-table-sip)# mod 1 add

#Выбор запроса, в котором будет использоваться модификатор add (в данном случае BYE):
vesbc(esbc-mod-table-sip-modification)# method type Bye

#Название добавляемого заголовка:
vesbc(esbc-mod-table-sip-modification)# header name INVITE_Route

#Указать значение заголовка (переменная route):
vesbc(esbc-mod-table-sip-modification)# header value "${route}"
vesbc(esbc-mod-table-sip-modification)# exit
vesbc(esbc-mod-table-sip)# exit

#Привязать таблицу модификаторов к входящему транку TRUNK_IN:
vesbc(config-esbc)# trunk sip TRUNK_IN 
vesbc(config-esbc-trunk-sip)# mod-table sip in MODTABLE_IN

#Применить и подтвердить изменения:
vesbc(config-esbc-trunk-sip)# do commit 
Configuration has been successfully applied and saved to flash. Commit timer started, changes will be reverted in 600 seconds.
vesbc(config-esbc-trunk-sip)# do confirm 
Configuration has been confirmed. Commit timer canceled.

После внесения изменений в конфигурацию с TRUNK_IN приходит следующий INVIITE:

INVITE sip:23002@192.168.113.195:5060 SIP/2.0
Via: SIP/2.0/UDP 192.168.113.190:5061;rport;branch=z9hG4bK-1142789-1-1
From: "24001" <sip:24001@192.168.113.195>;tag=1
To: "23002" <sip:23002@192.168.113.195:5060>
Call-ID: 1-1142789@192.168.113.190
Cseq: 1 INVITE
Contact: <sip:24001@192.168.113.190:5061>
Max-Forwards: 70
Subject: Performance Test
Allow: INVITE, ACK, BYE, CANCEL
Content-Type: application/sdp
Test_header: string old_value
Test2_header: another string
Test2_header: t"et
Test2_header: t"et
Test2_header: 1234
Test3_header: temporary data
Route: <sip:192.168.113.195>
Supported: timer
Content-Length:   142

[SDP]...

Модифицированный запрос BYE, отправленный с TRUNK_IN на TRUNK_OUT, содержит заголовок INVITE_Route со значением заголовка Route из запроса INVITE:

BYE sip:23002@192.168.113.190:5063;transport=UDP SIP/2.0
Via: SIP/2.0/UDP 192.168.113.195:5060;rport;branch=z9hG4bKPja999d007-7d87-46f7-98ca-dcc40ee3188e
Max-Forwards: 70
From: "24001" <sip:24001@192.168.113.195>;tag=a25bc557-78fd-4a9c-871d-87099fbfc9ce
To: "23002" <sip:23002@192.168.113.190>;tag=14
Call-ID: 38a3fddd817f6b738707b21ee5fe1c7d
CSeq: 10588 BYE
Allow: INVITE, ACK, BYE, CANCEL
INVITE_Route: <sip:192.168.113.195>
Content-Length:  0

[SDP]...

Пример 3. Синхронизация переменных между плечами вызова

Схема:


В конфигурации есть два транка, настроена маршрутизация. Вызов, который приходит из TRUNK_IN, уходит в TRUNK_OUT. Из TRUNK_IN приходит INVITE с заголовком Test_header. Требуется, используя только переменную var1, скопировать значение заголовка Test_header из INVITE на первом плече, вставить его в заголовок Test_header_INVITE в ответе 180 на втором плече, скопировать значение заголовка Test_header из ответа 200 на втором плече и вставить его в заголовок Test_header_200 в запрос BYE на первом плече.

vesbc# 
vesbc# configure 
vesbc(config)# esbc 

#Создание таблицы модификаторов MODTABLE_IN_TRUNK_IN для модификаций на первом плече:
vesbc(config-esbc)# mod-table sip MODTABLE_IN_TRUNK_IN
vesbc(esbc-mod-table-sip)# 

#Добавление в таблицу модификаторов правила copy для копирования значения заголовка Test_header в переменную var1:
vesbc(esbc-mod-table-sip)# mod 0 copy
vesbc(esbc-mod-table-sip-modification)# 

#Выбор запроса, в котором будет использоваться модификатор copy (в данном случае INVITE):
vesbc(esbc-mod-table-sip-modification)# method type Invite

#Указать название заголовка, из которого необходимо копировать значение (в данном случае Test_header):
vesbc(esbc-mod-table-sip-modification)# header name-pattern Test_header

#Указать содержимое заголовка, при совпадении с которым будет выполнено копирование в переменную. В переменную будет скопирована та часть отбора, которая указана в скобках:
vesbc(esbc-mod-table-sip-modification)# header value-pattern "(.+)"

#Указать переменную, в которую будет скопировано значение, указанное в скобках, в примере - (.+):
vesbc(esbc-mod-table-sip-modification)# variable-str "var1"
vesbc(esbc-mod-table-sip-modification)# exit

#Добавление в таблицу модификаторов правила add для добавления заголовка Test_header_180 в BYE:
vesbc(esbc-mod-table-sip)# mod 1 add

#Выбор запроса, в котором будет использоваться модификатор add (в данном случае BYE):
vesbc(esbc-mod-table-sip-modification)# method type Bye

#Название добавляемого заголовка:
vesbc(esbc-mod-table-sip-modification)# header name Test_header_200

#Указать значение заголовка (переменная var1):
vesbc(esbc-mod-table-sip-modification)# header value "${var1}"
vesbc(esbc-mod-table-sip-modification)# exit
vesbc(esbc-mod-table-sip)# exit

#Привязать таблицу модификаторов к входящему транку TRUNK_IN:
vesbc(config-esbc)# trunk sip TRUNK_IN 
vesbc(config-esbc-trunk-sip)# mod-table sip in MODTABLE_IN_TRUNK_IN
vesbc(config-esbc-trunk-sip)# exit

#Создание таблицы модификаторов MODTABLE_IN_TRUNK_OUT для модификаций на втором плече:
vesbc(config-esbc)# mod-table sip MODTABLE_IN_TRUNK_OUT
vesbc(esbc-mod-table-sip)# 

#Добавление в таблицу модификаторов правила copy для копирования значения заголовка Test_header в переменную var1:
vesbc(esbc-mod-table-sip)# mod 0 copy
vesbc(esbc-mod-table-sip-modification)# 

#Выбор ответа, в котором будет использоваться модификатор copy (в данном случае 200):
vesbc(esbc-mod-table-sip-modification)# response-pattern 200

#Указать название заголовка, из которого необходимо копировать значение (в данном случае Test_header):
vesbc(esbc-mod-table-sip-modification)# header name-pattern Test_header

#Указать содержимое заголовка, при совпадении с которым будет выполнено копирование в переменную. В переменную будет скопирована та часть отбора, которая указана в скобках:
vesbc(esbc-mod-table-sip-modification)# header value-pattern "(.+)"

#Указать переменную, в которую будет скопировано значение, указанное в скобках, в примере - (.+):
vesbc(esbc-mod-table-sip-modification)# variable-str "var1"
vesbc(esbc-mod-table-sip-modification)# exit

#Добавление в таблицу модификаторов правила add для добавления заголовка Test_header_INVITE в 180:
vesbc(esbc-mod-table-sip)# mod 1 add

#Выбор ответа, в котором будет использоваться модификатор add (в данном случае 180):
vesbc(esbc-mod-table-sip-modification)# response-pattern "180"

#Название добавляемого заголовка:
vesbc(esbc-mod-table-sip-modification)# header name Test_header_INVITE

#Указать значение заголовка (переменная var1):
vesbc(esbc-mod-table-sip-modification)# header value "${var1}"
vesbc(esbc-mod-table-sip-modification)# exit
vesbc(esbc-mod-table-sip)# exit

#Привязать таблицу модификаторов к входящему транку TRUNK_OUT:
vesbc(config-esbc)# trunk sip TRUNK_OUT 
vesbc(config-esbc-trunk-sip)# mod-table sip in MODTABLE_IN_TRUNK_OUT

#Применить и подтвердить изменения:
vesbc(config-esbc-trunk-sip)# do commit 
Configuration has been successfully applied and saved to flash. Commit timer started, changes will be reverted in 600 seconds.
vesbc(config-esbc-trunk-sip)# do confirm 
Configuration has been confirmed. Commit timer canceled.

После внесения изменений в конфигурацию с TRUNK_IN приходит следующий INVIITE, значение заголовка Test_header копируется в переменную var1:

INVITE sip:23002@192.168.113.195:5060 SIP/2.0
Via: SIP/2.0/UDP 192.168.113.190:5061;rport;branch=z9hG4bK-1151121-1-1
From: "24001" <sip:24001@192.168.113.195>;tag=1
To: "23002" <sip:23002@192.168.113.195:5060>
Call-ID: 1-1151121@192.168.113.190
Cseq: 1 INVITE
Contact: <sip:24001@192.168.113.190:5061>
Max-Forwards: 70
Subject: Performance Test
Allow: INVITE, ACK, BYE, CANCEL
Content-Type: application/sdp
Test_header: INVITE
Supported: timer
Content-Length:   142

[SDP]...

Модифицированный ответ 180 Ringing, отправленный с TRUNK_OUT на TRUNK_IN, содержит заголовок Test_header_INVITE со значением из переменной var1: 

SIP/2.0 180 Ringing
Via: SIP/2.0/UDP 192.168.113.190:5061;rport=5061;received=192.168.113.190;branch=z9hG4bK-1152099-1-1
Call-ID: 1-1152099@192.168.113.190
From: "24001" <sip:24001@192.168.113.195>;tag=1
To: "23002" <sip:23002@192.168.113.195>;tag=e782be58-9527-409a-8c9f-de4f32d8fdb2
CSeq: 1 INVITE
Contact: <sip:23002@192.168.113.195:5060;transport=udp>
Allow: INVITE, ACK, BYE, CANCEL, UPDATE
Warning: warning
Test_header_INVITE: INVITE
Content-Length:  0

[SDP]...

Далее с TRUNK_OUT на TRUNK_IN приходит ответ 200 OK, значение заголовка Test_header копируется в переменную var1:

SIP/2.0 200 OK
Via: SIP/2.0/UDP 192.168.113.195:5060;rport;branch=z9hG4bKPjf8b5024e-425d-434c-83ea-e315a365644a
From: "24001" <sip:24001@192.168.113.195>;tag=9ca5b465-69ee-4d19-8891-6d99cc8d7b2c
To: "23002" <sip:23002@192.168.113.190>;tag=1
Call-ID: e5e140176f2119a643b0504e9afa69bb
CSeq: 1446 INVITE
Contact: <sip:23002@192.168.113.190:5063;transport=UDP>
Allow: INVITE, ACK, BYE, CANCEL, UPDATE
Test_header: 200 OK
Warning: warning
Min-Expires: 300
Supported: 100rel, timer, replaces, qwe
Require: 100rel, answermode
Content-Type: application/sdp
Content-Length:   166

[SDP]...

Модифицированный запрос, отправленный с TRUNK_IN на TRUNK_OUT, содержит заголовок Test_header_200 со значением из переменной var1:

BYE sip:23002@192.168.113.190:5063;transport=UDP SIP/2.0
Via: SIP/2.0/UDP 192.168.113.195:5060;rport;branch=z9hG4bKPj091e9a98-54a1-4631-a024-6fe968fa0ba5
Max-Forwards: 70
From: "24001" <sip:24001@192.168.113.195>;tag=9ca5b465-69ee-4d19-8891-6d99cc8d7b2c
To: "23002" <sip:23002@192.168.113.190>;tag=1
Call-ID: e5e140176f2119a643b0504e9afa69bb
CSeq: 1447 BYE
Allow: INVITE, ACK, BYE, CANCEL
Test_header_200: 200 OK
Content-Length:  0

[SDP]...

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

В ESBC поддержано использование системных переменных в модификаторах replace (поле) и add (поле header value).

Список системных переменных, которые можно использовать при модификации:

Синтаксис обращения к системным переменным:

${VAR_NAME}

Схема: 


В конфигурации есть два транка, настроена маршрутизация. Вызов, который приходит из TRUNK_IN, уходит в TRUNK_OUT.  Требуется, чтобы в запросе INVITE, который отправляется в TRUNK_OUT, добавлялся заголовок Call-Info с информацией об имени транка, на который отправляется запрос, и версией ESBC.

vesbc# 
vesbc# configure 
vesbc(config)# esbc 

#Создание таблицы модификаторов MODTABLE_OUT:
vesbc(config-esbc)# mod-table sip MODTABLE_OUT
vesbc(esbc-mod-table-sip)# 

#Создание модификатора add для добавления заголовка Call-Info:
vesbc(esbc-mod-table-sip)# mod 0 add
vesbc(esbc-mod-table-sip-modification)# 

#Выбор запроса, в котором будет использоваться модификатор add (в данном случае INVITE):
vesbc(esbc-mod-table-sip-modification)# method type Invite

#Указать название заголовка, который будет добавлен:
vesbc(esbc-mod-table-sip-modification)# header name "Call-Info"

#Указать содержимое заголовка с использованием системных переменных:
vesbc(esbc-mod-table-sip-modification)# header value "call to ${IFACE_NAME}; ESBC version: ${VERSION}"
vesbc(esbc-mod-table-sip-modification)# exit

#Привязать таблицу модификаторов к исходящему транку TRUNK_OUT:
vesbc(config-esbc)# trunk sip TRUNK_OUT 
vesbc(config-esbc-trunk-sip)# mod-table sip out MODTABLE_OUT 

#Применить и подтвердить изменения:
vesbc(config-esbc-trunk-sip)# do commit 
Configuration has been successfully applied and saved to flash. Commit timer started, changes will be reverted in 600 seconds.
vesbc(config-esbc-trunk-sip)# do confirm 
Configuration has been confirmed. Commit timer canceled.

После внесения изменений в конфигурацию с TRUNK_IN приходит следующий INVIITE:

INVITE sip:23002@192.168.80.135:5060 SIP/2.0
Via: SIP/2.0/UDP 192.168.80.27:5061;rport;branch=z9hG4bK-2122485-1-1
From: "24001" <sip:24001@192.168.80.27:5061>;tag=1
To: "23002" <sip:23002@192.168.80.135:5060>
Call-ID: 1-2122485@192.168.80.27
Cseq: 1 INVITE
Contact: <sip:24001@192.168.80.27:5061>
Max-Forwards: 70
Subject: Performance Test
Allow: INVITE, ACK, BYE, CANCEL
Content-Type: application/sdp
Content-Length:   138

[SDP]...

На TRUNK_OUT отправляется уже модифицированный INVITE с заголовком Call-Info, который содержит имя вызываемой стороны и версию ESBC:

INVITE sip:23002@192.168.80.27:5063 SIP/2.0
Via: SIP/2.0/UDP 192.168.80.135:5060;rport;branch=z9hG4bKPj69d21930-f472-4e64-8555-6b68a532deae
Max-Forwards: 70
From: "24001" <sip:24001@192.168.80.135>;tag=f3db1c01-0c06-45cf-8b4d-a233070ae693
To: "23002" <sip:23002@192.168.80.27>
Contact: <sip:24001@192.168.80.135:5060;transport=udp>
Call-ID: 977eea09afecfc44932d4d9c1b2eeb15
CSeq: 6757 INVITE
Allow: INVITE, ACK, BYE, CANCEL
Supported: 100rel, replaces, ice, timer
Call-Info: call to TRUNK_OUT; ESBC version: 1.6.0.0085
Content-Type: application/sdp
Content-Length:   141

[SDP]...

Использование условий в SIP-модификаторах 

В ESBC поддержано использование условий во всех типах SIP-модификаторов.

Условия можно задать в настройках модификатора. Поддержано 2 типа условий:

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

Пример работы условий по значению заголовка:

Схема: 


В конфигурации есть 2 транка. Вызов, поступающий с TRUNK_IN, маршрутизируется в TRUNK_OUT. Требуется скопировать последнюю цифру номера из From и вставить её в заголовок X-Test-Header при условии, что 2-ая цифра в номере из To равна 8.

vesbc# 
vesbc# configure 
vesbc(config)# esbc 

#Создание таблицы модификаторов MODTABLE_OUT:
vesbc(config-esbc)# mod-table sip MODTABLE_OUT
vesbc(esbc-mod-table-sip)# 

#Создание модификатора copy для копирования последней цифры из заголовка From в переменную:
vesbc(esbc-mod-table-sip)# mod 0 copy
vesbc(esbc-mod-table-sip-modification)# 

#Выбор запроса, где будет производиться поиск заголовка и копирование значения (любой запрос):
vesbc(esbc-mod-table-sip-modification)# method pattern ".*"

#Указать заголовок, содержимое которого будет скопировано:
vesbc(esbc-mod-table-sip-modification)# header name-pattern "From"

#Указать содержимое заголовка, которое нужно скопировать в переменную (последняя цифра номера):
vesbc(esbc-mod-table-sip-modification)# header value-pattern "(.)@"

#Указать название переменной, в которой будет храниться скопированное значение:
vesbc(esbc-mod-table-sip-modification)# variable-str "var"
vesbc(esbc-mod-table-sip-modification)# exit

#Создание модификатора add для добавления заголовка X-Test-Header:
vesbc(esbc-mod-table-sip)# mod 1 add
vesbc(esbc-mod-table-sip-modification)# 

#Выбор запроса, в котором будет использоваться модификатор add (любой запрос):
vesbc(esbc-mod-table-sip-modification)# method pattern ".*"

#Указать название заголовка, который будет добавлен:
vesbc(esbc-mod-table-sip-modification)# header name X-Test-Header

#Указать содержимое заголовка с использованием системных переменных:
vesbc(esbc-mod-table-sip-modification)# header value "${var}"

#Создать условие модификации:
vesbc(esbc-mod-table-sip-modification)# condition 0 header

#Указать заголовок, содержимое которого будет проверяться:
vesbc(esbc-mod-table-sip-modification-condition)# name-pattern "To"

#Указать заголовок, содержимое которого будет проверяться (вторая цифра в номере должна быть равна 8):
vesbc(esbc-mod-table-sip-modification-condition)# value-pattern ".*sip:.(8).*"
vesbc(esbc-mod-table-sip-modification-condition)# exit

#Привязать таблицу модификаторов к исходящему транку TRUNK_OUT:
vesbc(config-esbc)# trunk sip TRUNK_OUT 
vesbc(config-esbc-trunk-sip)# mod-table sip out MODTABLE_OUT 
 
#Применить и подтвердить изменения:
vesbc(config-esbc-trunk-sip)# do commit 
Configuration has been successfully applied and saved to flash. Commit timer started, changes will be reverted in 600 seconds.
vesbc(config-esbc-trunk-sip)# do confirm 
Configuration has been confirmed. Commit timer canceled.

После внесения изменений в конфигурацию с TRUNK_IN приходит следующий INVIITE:

INVITE sip:18345@192.168.113.195 SIP/2.0
Via: SIP/2.0/UDP 192.168.113.190:5062;rport;branch=z9hG4bKxrnczyxm
Max-Forwards: 70
To: <sip:18345@192.168.113.195>
From: "23001" <sip:23001@192.168.113.195>;tag=bmxas
Call-ID: 977eea09afecfc44932d4d9c1b2eeb15
CSeq: 161 INVITE
Contact: <sip:23001@192.168.113.190:5062;transport=udp>
Content-Type: application/sdp
Allow: INVITE,ACK,BYE,CANCEL,OPTIONS,REFER,NOTIFY,SUBSCRIBE,INFO,MESSAGE
Supported: replaces,norefersub
User-Agent: Twinkle/1.10.2
Content-Length: 179

[SDP]...

Вторая цифра в номере из заголовка To равна 8, условие выполнено, модификация выполняется. На TRUNK_OUT отправляется уже модифицированный INVITE с заголовком X-Test-Header, который содержит последнюю цифру номера А (1):

INVITE sip:18345@192.168.113.190:5461 SIP/2.0
Via: SIP/2.0/UDP 192.168.113.195:5060;rport;branch=z9hG4bKPj5bfa1162-6ccf-41e1-9aff-4d3cf8fe9511
Max-Forwards: 70
From: "23001" <sip:23001@192.168.113.195>;tag=9b1f5ca8-001a-4165-98ba-c7603d2bc0b2
To: <sip:18345@192.168.113.190>
Contact: <sip:23001@192.168.113.195:5060;transport=udp>
Call-ID: 771e99b84559038bd9a784c3a7360db3
CSeq: 1753 INVITE
Allow: INVITE, ACK, BYE, CANCEL, OPTIONS, REFER, NOTIFY, SUBSCRIBE, INFO, MESSAGE
Supported: 100rel, replaces, ice, norefersub
X-Test-Header: 1
Content-Type: application/sdp
Content-Length:   181

[SDP]...

Пример работы условий по тегу приведен в разделе Общие модификаторы в примере Модификатор удаления тега.

Логика применения условий

По умолчанию все условия применяются с логикой "И", то есть модификация выполнится только при успешной проверке всех условий, если хотя бы одно условие не выполняется, то ESBC переходит к обработке следующего модификатора.

Есть возможность с помощью выражения задавать логику применения условий, доступные логические операторы:

Для обращения к условию необходимо использовать его индекс. В выражении можно использовать скобки для группировки условий.

Пример изменения логики применения условий

Схема: 

Есть таблица модификаций, которая добавляет заголовок X-Route: internal, если заголовок To содержит "sip.example.com" и заголовок From содержит "123", либо, если эти условия не выполняются, то для добавления заголовка X-Route: internal заголовок User-Agent не должен содержать "softphone".

Конфигурация будет выглядеть следующим образом:

vesbc# 
vesbc# configure 
vesbc(config)# esbc 

vesbc(config-esbc)# mod-table sip MOD_TABLE

#Добавление модификатора с условиями CONDITION_1, CONDITION_2, CONDITION_3, логическим выражением и действием добавить заголовок X-Route:
vesbc(esbc-mod-table-sip)# mod 0
vesbc(esbc-mod-table-sip-modification)# condition 1 header
vesbc(esbc-mod-table-sip-modification-condition)# name-pattern To
vesbc(esbc-mod-table-sip-modification-condition)# value-pattern ".*sip\\.example\\.com.*"
vesbc(esbc-mod-table-sip-modification-condition)# exit
vesbc(esbc-mod-table-sip-modification)# condition 2 header
vesbc(esbc-mod-table-sip-modification-condition)# name-pattern From
vesbc(esbc-mod-table-sip-modification-condition)# value-pattern ".*123.*"
vesbc(esbc-mod-table-sip-modification-condition)# exit
vesbc(esbc-mod-table-sip-modification)# condition 3 header
vesbc(esbc-mod-table-sip-modification-condition)# name-pattern User-Agent
vesbc(esbc-mod-table-sip-modification-condition)# value-pattern ".*softphone.*"
vesbc(esbc-mod-table-sip-modification-condition)# exit
vesbc(esbc-mod-table-sip-modification)# condition expression "(1&2)|!3"
vesbc(esbc-mod-table-sip-modification)# do commit
vesbc(esbc-mod-table-sip-modification)# do confirm

Благодаря настройке condition expression "(1&2)|!3" изменена логика применения условий для модификации.

Синтаксис для написания условий

Для написания условий используются регулярные выражения PCRE.

Регулярное выражение для условия по заголовку или тегу применяется с логикой полного совпадения(exact match). Например, необходимо написать шаблон, который будет соответствовать значению "20405". В данном случае шаблон "^20.*" будет корректным, а шаблон "20" - нет.

При вводе выражения в одинарных и двойных кавычках различается логика экранирования символа обратного слеша - «\». 

При вводе регулярного выражения в одинарных кавычках символы обратного слеша и двойные кавычки экранируются обратным слешем автоматически.

Пример ввода шаблона:

vesbc(config-esbc-mod-table-sip-modification)# response-pattern '\d'

Пример отображения шаблона в выводе конфигурации:

  mod-table sip MOD
    mod 0 add
      response-pattern "\\d"
    exit
  exit

В данном случае будет использоваться поиск совпадения по метасимволу «\d», то есть по совпадению с любой цифрой.

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

1. Пример ввода шаблона c одним обратным слешем:

vesbc(config-esbc-mod-table-sip-modification)# response-pattern "\d"

Пример отображения шаблона в выводе конфигурации:

  mod-table sip MOD
    mod 0 add
      response-pattern "d"
    exit
  exit

В данном случае будет использоваться поиск совпадения по букве «d».

2.  Пример ввода шаблона c двумя обратными слешами:

vesbc(config-esbc-mod-table-sip-modification)# response-pattern "\\d"

Пример отображения шаблона в выводе конфигурации:

  mod-table sip MOD
    mod 0 add
      response-pattern "\\d"
    exit
  exit

В данном случае будет использоваться поиск совпадения c использованием метасимвола «\d», то есть по совпадению с любой цифрой.

Настройка SIP-профилей

В SIP-профиле настраивается конфигурация общих параметров SIP. Профиль используется в транках, транк-группах и абонентских интерфейсах. 
В текущей версии ПО поддержаны следующие настройки:

Описание всех команд для настройки  SIP-профилей приведено в разделе Настройки SIP-профиля.

Контроль доступности направления

Используется для периодической отправки keep-alive сообщений для контроля состояния встречной стороны.

В текущей версии ПО в качестве keep-alive сообщений используется метод OPTIONS.

По умолчанию keep-alive не используется. Для включения необходимо использовать команду keepalive enable в SIP-профиле.

Контроль осуществляется путем отправки сообщений OPTIONS с заданными интервалами success-interval (по умолчанию 60 сек.) и failed-interval (по умолчанию 20 сек.). 

Описание всех команд для настройки контроля доступности направления приведено в разделе Настройки SIP-профиля Справочника команд CLI.

Алгоритм работы:

Сообщение OPTIONS отправляется только в случае, когда в транке отсутствует активность SIP после окончания периода success-interval. Т. е. в случае если через транк проходят вызовы с  большей частотой, чем указано в настройке success-interval, то сообщения OPTIONS не будут отправляться на встречную сторону, т. к. очевидно, что направление доступно. Если после последнего отправленного или полученного сообщения SIP прошел период равный success-interval, то отправляется OPTIONS. При получении ответа на него (с любым статус-кодом) направление считается доступным. Сообщения OPTIONS будут отправляться с периодом success-interval до того момента, пока либо не появится активность SIP, либо не будут получены ответы на отправленные OPTIONS. Если не будет ответов на OPTIONS, транк считается недоступным, и сообщения OPTIONS будут отправляться с интервалом failed-interval до тех пор, пока транк снова не станет доступным.  

Пример настройки:

vesbc# 
vesbc# configure 
vesbc(config)# esbc 

#Создать SIP-профиль NEW_SIP_PROFILE:
vesbc(config-esbc)# sip profile NEW_SIP_PROFILE 
vesbc(config-esbc-sip-profile)# 

#Включить контроль доступности:
vesbc(config-esbc-sip-profile)# keepalive enable 
vesbc(config-esbc-sip-profile)# 

#Настроить интервалы контроля:
vesbc(config-esbc-sip-profile)# keepalive success-interval 120
vesbc(config-esbc-sip-profile)# keepalive failed-interval 30
vesbc(config-esbc-sip-profile)#  
 
vesbc(config-esbc-sip-profile)# exit
vesbc(config-esbc)#

#Привязать SIP-профиль к транку TRUNK_OUT:
vesbc(config-esbc)# trunk sip TRUNK_OUT 
vesbc(config-esbc-trunk-sip)# sip profile NEW_SIP_PROFILE 
vesbc(config-esbc-trunk-sip)# 

#Применить и подтвердить изменения:
vesbc(config-esbc-trunk-sip)# do commit 
Configuration has been successfully applied and saved to flash. Commit timer started, changes will be reverted in 600 seconds.
vesbc(config-esbc-trunk-sip)# do confirm 
Configuration has been confirmed. Commit timer canceled.


При использовании SIP-профиля с включенным контролем доступности, для абонентских интерфейсов отправка OPTIONS осуществляться не будет. Данная настройка используется только для контроля транков.

Список причин отбоя для перехода на следующее направление 

Список причин отбоя для указания статус-кодов ответов SIP, по которым будет осуществляться перемаршрутизация вызовов и регистраций на альтернативное направление (следующий транк в транковой группе/следующее правило в таблице маршрутизации).

При создании маски для списка можно использовать регулярные выражения PCRE. 

Регулярное выражение для маски применяется с логикой полного совпадения(exact match). Например, необходимо написать шаблон, который будет соответствовать значению кода "200". В данном случае шаблон "^20.*" будет корректным, а шаблон "20" - нет.

Описание всех команд для настройки причин отбоя для перехода на следующее направление приведено в разделе Настройки SIP-профиля Справочника команд CLI.

Пример использования:

В таблице маршрутизации два правила, первое — направляет вызов в TRUNK_GROUP, второе — направляет вызов в TRUNK_3.

vesbc# 
vesbc# configure 
vesbc(config)# esbc 

#Создать список ответов:
vesbc(config-esbc)# cause-list sip LIST
vesbc(config-esbc-cause-list-sip)#

#Создать маску, по которой будут отбираться ответы для перемаршрутизации:
vesbc(config-esbc-cause-list-sip)# cause-mask 404
vesbc(config-esbc-cause-list-sip)# exit

#Создать SIP-профиль, привязать список к SIP-профилю:
vesbc(config-esbc)# sip profile SIP-PROFILE
vesbc(config-esbc-sip-profile)# cause-list LIST 
vesbc(config-esbc-sip-profile)# exit

#Привязать к транковой группе TRUNK-GROUP SIP-профиль:
vesbc(config-esbc)# trunk-group TRUNK-GROUP 
vesbc(config-esbc-trunk-group)# sip profile SIP-PROFILE 
vesbc(config-esbc-trunk-group)# 

#Применить и подтвердить изменения:
vesbc(config-esbc-trunk-group)# do commit 
Configuration has been successfully applied and saved to flash. Commit timer started, changes will be reverted in 600 seconds.
vesbc(config-esbc-trunk-group)# do confirm 
Configuration has been confirmed. Commit timer canceled.

Входящий вызов начинает маршрутизироваться по таблице маршрутизации (ROUTE_TABLE). В результате вызов маршрутизируется по правилу RULE_1 на TRUNK_GROUP и оттуда в TRUNK_1. TRUNK_1 недоступен, вызов отбивается по истечении Timer B, и происходит перемаршрутизация на TRUNK_2 (следующий транк в транковой группе). Из TRUNK_2 приходит ответ 404 Not Found, и т. к. код ответа совпадает с маской из списка, который используется в TRUNK-GROUP, то происходит маршрутизация на следующее направление. Поскольку в транковой группе больше нет транков, маршрутизация переходит к RULE_2, и вызов маршрутизируется в TRUNK_3.  

Без использования списка причин отбоя, перемаршрутизация происходит только по недоступности транка.

Для абонентских интерфейсов, использование списка причин отбоя не влияет на маршрутизацию. Перемаршрутизация осуществляться не будет.

Перемаршрутизация абонентов 

Вызов с зарегистрированного абонента будет направлен в тот транк, через который осуществлялась его регистрация. В случае неуспешного вызова перемаршрутизация осуществляться не будет.
При вызове с незарегистрированного абонента сначала идёт проверка, разрешены ли с этого абонентского интерфейса вызовы без регистрации (allow_unreg_call), если проверка успешна, то вызов смаршрутизируется по привязанной таблице маршрутизации и в случае недоступности транка/совпадении ответа с маской из списка произойдёт маршрутизация на следующее направление.

Поведение при перенаправлении 

Настройка поведения при перенаправлении позволяет использовать разные режимы обработки сообщений 3XX.

Описание всех команд для настройки поведения при перенаправлении приведено в разделе Настройки SIP-профиля Справочника команд CLI.

Пример локальной обработки 3xx ответа

Схема:

Из транка UAC c IP_A, приходит инициирующий INVITE на ESBC с номера number_a на номер number_b. Этот INVITE пересылается на сторону UAS, который может быть транком или абонентским интерфейсом, откуда приходит 302 ответ с номером number_c и адресом  IP_С в заголовке Contact.



1) IP_C соответствует IP_ESBC_2 и на ESBC зарегистрирован абонент с номером number_c. 

Если IP-адрес из заголовка Contact пришедшего 302 ответа соответствует IP-адресу транспорта ESBC, с которого был отправлен запрос, и на ESBC существует зарегистрированный абонент с номером, указанным в заголовке Contact, то ESBC отправит INVITE на тот транк, где этот абонент зарегистрирован и 181 в сторону инициатора вызова.

Пример работы:

1. Регистрация SIP-абонента с номером 300 на UAS C:

 2.  С UAC поступает вызов на UAS B, он отвечает 302, в Contact указывает 300@192.168.50.50:

3.  Так как существует зарегистрированный абонент с номером 300, то ESBC отправляет INVITE на тот транк, где этот абонент зарегистрирован, то есть на UAS C, а на UAC отправляет 181 ответ:  


2) IP_C соответствует IP_ESBC_2 и на ESBC не зарегистрирован абонент с номером number_c.

Если IP-адрес из заголовка Contact пришедшего 302 ответа соответствует IP-адресу транспорта ESBC, с которого был отправлен запрос, но на ESBC не существует зарегистрированного абонента с номером, указанным в заголовке Contact, то ESBC перешлёт ответ на другое плечо и заменит адрес в заголовке Contact на IP-адрес UAC.

Пример работы:


3) IP_C  не соответствует IP_ESBC_2 и UAS — доверенный транк.

Если IP-адрес из заголовка Contact пришедшего 302 ответа не соответствует IP-адресу транспорта ESBC, с которого был отправлен запрос, и транк UAS — доверенный транк, то ESBC отправит INVITE на указанный адрес и 181 в сторону UAC.

Пример работы:


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

В прочих случаях — вызов завершается.

Игнорирование OPTIONS

Данный режим используется для обработки входящих сообщений OPTIONS. 

Описание всех команд для настройки игнорирования OPTIONS приведено в разделе Настройки SIP-профиля Справочника команд CLI.

Игнорирование входящих запросов OPTIONS по умолчанию включено. 

Если к user-interface привязан sip profile с включенным игнорированием OPTIONS, то при получении OPTIONS от зарегистрированных абонентов ESBC будет обрабатывать эти запросы и отвечать 200 OK (только если в запросе указан заголовок Contact).

Прочие входящие запросы OPTIONS  будут игнорироваться.

Таймеры SIP-сессий (RFC 4028) 

Использование таймеров SIP-сессий (RFC 4028) предназначено для контроля состояния сеансов связи и предотвращения зависания разговорных сессий, в случае возникновения каких-либо проблем, например с сетью. 

Обновление сессии поддерживается путем передачи запросов re-INVITE или UPDATE в течение сеанса связи.

Запрашиваемый период контроля сессии (Session Expires) — это период времени в секундах, по истечении которого произойдет принудительное завершение сессии в случае, если сессия не будет вовремя обновлена. Принимает значения от 90 до 64800 с, значение по умолчанию — 1800 с.

Минимальный период контроля сессии (Min SE) — это минимальный интервал проверки работоспособности соединения. Принимает значения от 90 до 32000 с, значение по умолчанию — 90 с. Данное значение не должно превышать таймаут принудительного завершения сессии Sessions expires.

Сторона обновления сессии (Refresher) — определяет сторону, которая будет осуществлять обновление сессии (uac — сторона клиента (вызывающая), uas — сторона сервера (вызываемая)). Значение по умолчанию — uac.

Поведение по умолчанию — поддержка таймеров SIP-сессий отключена. Для включения используется команда session timer enable.

Описание всех команд для настройки таймеров SIP-сессий приведено в разделе Настройки SIP-профиля Справочника команд CLI. 


Пример настройки

Задача:

Включить поддержку таймеров SIP-сессий на транке TRUNK_2 с параметрами Session Expires – 120, Min SE – 120, Refresher – UAS. На транке TRUNK_1 таймеры не используются.

Решение:

Настроить SIP-профиль и привязать его к транку TRUNK_2:

vesbc# 
vesbc# configure 
vesbc(config)# esbc 

#Создать SIP-профиль NEW_SIP_PROFILE:
vesbc(config-esbc)# sip profile NEW_SIP_PROFILE 

#Включить поддержку таймеров SIP-сессий (RFC4028):
vesbc(config-esbc-sip-profile)# session timer enable
vesbc(config-esbc-sip-profile)# 

#Настроить минимальный период контроля сессии 120 секунд:
vesbc(config-esbc-sip-profile)# session timer min-se 120
vesbc(config-esbc-sip-profile)# 

#Настроить запрашиваемый период контроля сессии 150 секунд:
vesbc(config-esbc-sip-profile)# session timer session-expires 150
vesbc(config-esbc-sip-profile)# 

#Настроить сторону обновления сессии:
vesbc(config-esbc-sip-profile)# session timer refresher uas
vesbc(config-esbc-sip-profile)#  
 
vesbc(config-esbc-sip-profile)# exit
vesbc(config-esbc)#

#Привязать SIP-профиль к транку TRUNK_2:
vesbc(config-esbc)# trunk sip TRUNK_2 
vesbc(config-esbc-trunk-sip)# sip profile NEW_SIP_PROFILE 
vesbc(config-esbc-trunk-sip)# 

#Применить и подтвердить изменения:
vesbc(config-esbc-trunk-sip)# do commit 
Configuration has been successfully applied and saved to flash. Commit timer started, changes will be reverted in 600 seconds.
vesbc(config-esbc-trunk-sip)# do confirm 
Configuration has been confirmed. Commit timer canceled.

При исходящем вызове в транк TRUNK_2, в сообщение INVITE будут добавлены заголовки в соответствии с настройкой. Если сторона Б также поддерживает RFC 4028, то будет включен контроль сессии:

Т. к. refresher=uas, то в данном примере сторона Б будет отправлять сообщения UPDATE каждые 60 сек. Если по истечении 90 сек. от стороны Б не будет получено сообщение UPDATE, вызов будет разрушен (ESBC отправит BYE в обе стороны).

При использовании таймеров SIP-сессий на одном из плеч вызова, запросы re-INVITE или UPDATE, полученные от удаленной стороны, в рамках контроля сессии будут передаваться на второе плечо, независимо от настроек таймеров на этом плече.

Транзит сообщений ISUP для работы в режиме SIP-T/SIP-I 

SIP-I и SIP-T — это два расширения протокола SIP, которые позволяют передавать сообщения телефонной сигнализации ISUP поверх сетей с коммутацией пакетов. Основная функция этих протоколов — инкапсуляция и трансляция сообщений ISUP, что обеспечивает взаимодействие между сетями SIP и традиционными телефонными сетями.

По умолчанию транзит SDP c ISUP запрещен. Для включения используется команда:

isup transit

Для транзита SDP c ISUP требуется включение данной опции на обоих (входящем и исходящем) направлениях (транках/пользовательских интерфейсах), через которые будет осуществляться маршрутизация сигнализации SIP.

В случае когда на каком-либо из направлений не включена поддержка транзита, на сообщения SIP c вложенным ISUP будет отправлен ответ 415 Unsupported Media Type.

ESBC не обрабатывает ISUP в SDP, а только осуществляет транзит данного вложения.

Описание всех команд для настройки транзита сообщений ISUP приведено в разделе Настройки SIP-профиля Справочника команд CLI.

Опционирование обработки заголовка Contact в запросах и ответах SIP

По-умолчанию поведение ESBC реализовано в соответствии с п. 4 RFC 3261 (SIP session setup example with SIP trapezoid), поэтому при установлении диалога, запрос  ACK будет направлен не на IP-адрес и порт настроенный в транке (remote address, remote port), а на полученные из заголовка Contact встречной стороны.

Пример

Вызов из транка А в транк Б, между ESBC и транком Б находится SIP-прокси, ESBC отправляет INVITE на адрес SIP-прокси(10.0.1.30), в 180 и 200 ответе в заголовке Contact  SIP-прокси отправляет адрес транка Б(10.0.1.31). При отключенной опции (поведение по-умолчанию) ESBC будет отправлять последующие запросы на адрес и порт, указанные в ответах в заголовке Contact.

Если включить опцию contact follow disable в SIP-профиле, то изменение адреса и порта в заголовке Contact будет игнорироваться и запросы будут отправляться на адрес и порт, настроенные в конфигурации транка

Пример диаграммы обмена сообщениями с включенной опцией на плече ESBC--PROXY(TRUNK_B):

Если на абонентском интерфейсе включен NAT comedia mode, то вне зависимости от настроек в SIP-профиле, запросы будут отправляться на реальный адрес и порт удалённой стороны, значения в заголовке Contact игнорируются.

Настройка медиапрофилей

Использование медиапрофилей позволяет гибко управлять типом медиаданных путем фильтрации медиасекций в SDP, транскодированием аудио и видео, шифрованием RTP-потока, контролем сессии по наличию RTP и RTCP-пакетов.

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

Управление типом медиаданных и кодеками

Обработка медиапотоков осуществляется в двух режимах: проксирование и транскодирование. 

По умолчанию ESBC работает в режиме проксирования медиатрафика без использования транскодирования. Список шаблонов кодеков, доступных для проксирования через ESBC, задается командой:

codec allow {all | <CODEC_PATTERN> [<PT>]}

<CODEC_PATTERN> — название кодека/часть названия кодека;

<PT> — payload type (необязательный параметр). При указании будет проводиться дополнительная проверка шаблона на полное совпадение кодека с указанным payload type.

Описание всех команд приведено в разделе Настройки медиапрофиля справочника команд CLI. 

При создании медиапрофиля список шаблонов для наиболее известных кодеков IANA, доступных для проксирования, добавляется автоматически и выглядит следующим образом:

  media profile MEDIA_PROFILE
  	codec allow AMR
  	codec allow CLEARMODE
  	codec allow CN
  	codec allow G72
  	codec allow G722/ 9
  	codec allow G723 4
  	codec allow G728 15
  	codec allow G729/ 18
  	codec allow GSM 3
  	codec allow H26
  	codec allow H261 31
  	codec allow H263 34
  	codec allow ILBC
  	codec allow L16/44100 11
  	codec allow L16/44100/2 10
  	codec allow OPUS
  	codec allow PCMA 8
  	codec allow PCMU 0
  	codec allow SPEEX
  	codec allow T38 t38
  	codec allow VP
  	codec allow telephone-event
  exit

Т. к. использование шаблонов позволяет указывать не полное название кодека, а его часть, то запись вида "codec allow G72" означает, что кодеки G726-16, G726-24, G726-32, G726-40 будут доступны для проксирования.

Для кодеков со статическим payload type рекомендуется указывать номер payload type, иначе, если в SDP не будет указан атрибут rtpmap, вызов будет отбиваться кодом 488.

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

Для очистки списка используется команда no codec allow all. При использовании данной команды будут удалены шаблоны кодеков, добавленные автоматически при создании профиля, и шаблоны кодеков, добавленные/измененные пользователем.

Управление списком кодеков и типом медиаданных (audio, video, image) SDP осуществляется путем добавления/удаления/изменения шаблонов codec allow. Максимальное количество шаблонов в одном медиапрофиле — 64.

Для успешного согласования кодеков в режиме проксирования, необходимо, чтобы на входящем и исходящем направлении в медиапрофилях, привязанным к этим направлениям, содержались шаблоны, позволяющие пропускать одни и те же кодеки. В случае когда согласование невозможно, на запросы INVITE ESBC будет отвечать сообщением 488.

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

1. Запретить использование видео для транка TRUNK_2.


vesbc# configure 
vesbc(config)# esbc

#Создать медиапрофиль для транка TRUNK_2:  
vesbc(config-esbc)# media profile FOR_TRUNK_2

#Запретить использование всех видеокодеков:
vesbc(config-esbc-media-profile)# no codec allow H26
vesbc(config-esbc-media-profile)# no codec allow H261
vesbc(config-esbc-media-profile)# no codec allow H263
vesbc(config-esbc-media-profile)# no codec allow VP
vesbc(config-esbc-media-profile)# exit

#Привязать медиапрофиль к транку:
vesbc(config-esbc)# trunk sip TRUNK_2
vesbc(config-esbc-trunk-sip)# media profile FOR_TRUNK_2 
vesbc(config-esbc-trunk-sip)# do commit
vesbc(config-esbc-trunk-sip)# do confirm

В результате конфигурация медиапрофиля будет выглядеть следующим образом:

  media profile FOR_TRUNK_2
    codec allow AMR
    codec allow CLEARMODE
    codec allow CN
    codec allow G72
    codec allow G722/ 9
    codec allow G728 15
    codec allow G729/ 18
    codec allow GSM 3
    codec allow ILBC
    codec allow L16/44100 11
    codec allow L16/44100/2 10
    codec allow OPUS
    codec allow PCMA 8
    codec allow PCMU 0
    codec allow SPEEX
    codec allow T38 t38
    codec allow telephone-event
  exit

В данном примере для транка TRUNK_1 не требуется использование отдельного медиапрофиля, т. к. при вызовах, поступающих в TRUNK_1, и, маршрутизируемых в TRUNK_2, все видеокодеки из SDP будут удалены в соответствии с медиапрофилем, используемым для транка TRUNK_2. 

Для вызовов, поступающих в  TRUNK_2, все видеокодеки из SDP будут удалены вне зависимости от направления маршрутизации.

2. Запретить использование кодеков G729 и G726 для транка TRUNK_1. 

vesbc# configure 
vesbc(config)# esbc

#Создать медиапрофиль для транка TRUNK_1: 
vesbc(config-esbc)# media profile FOR_TRUNK_1

#Запретить использование кодеков G729 и G726: 
vesbc(config-esbc-media-profile)# no codec allow G729/
vesbc(config-esbc-media-profile)# no codec allow G72
vesbc(config-esbc-media-profile)# exit

#Привязать медиапрофиль к транку:
vesbc(config-esbc)# trunk sip TRUNK_1
vesbc(config-esbc-trunk-sip)# media profile FOR_TRUNK_1 
vesbc(config-esbc-trunk-sip)# do commit
vesbc(config-esbc-trunk-sip)# do confirm

В результате конфигурация медиапрофиля будет выглядеть следующим образом:

  media profile FOR_TRUNK_1
    codec allow AMR
    codec allow CLEARMODE
    codec allow CN
    codec allow G722/ 9
    codec allow G728 15
    codec allow GSM 3
    codec allow H26
    codec allow H261 31
    codec allow H263 34
    codec allow ILBC
    codec allow L16/44100 11
    codec allow L16/44100/2 10
    codec allow OPUS
    codec allow PCMA 8
    codec allow PCMU 0
    codec allow SPEEX
    codec allow T38 t38
    codec allow VP
    codec allow telephone-event
  exit

В данном примере в транк TRUNK_1 приходит INVITE c SDP Offer1, в котором наиболее приоритетным кодеком является G729, а также указан кодек G726, но т. к. настройками медиапрофиля FOR_TRUNK_1 данные кодеки запрещены, то в транк TRUNK_2 будет отправлен SDP Offer2 без данных кодеков. UA TRUNK_2 выбирает в качестве приоритетного кодек PCMA (SDP Answer2), и в результате ESBC отправляет в SDP Answer1 наиболее приоритетный кодек из SDP Offer1 (кроме G729) — PCMA.

3. Разрешить использование кодека QCELP для обоих транков (в дополнение к шаблонам по умолчанию).

vesbc# configure 
vesbc(config)# esbc

#Создать медиапрофиль для использования в обоих транках: 
vesbc(config-esbc)# media profile FOR_TRUNKS

#Добавить шаблон для кодека QCELP:
vesbc(config-esbc-media-profile)#codec allow QCELP
vesbc(config-esbc-media-profile)# exit

#Привязать медиапрофиль к обоим транкам:
vesbc(config-esbc)# trunk sip TRUNK_1
vesbc(config-esbc-trunk-sip)# media profile FOR_TRUNKS
vesbc(config-esbc-trunk-sip)# exit
vesbc(config-esbc)# trunk sip TRUNK_2
vesbc(config-esbc-trunk-sip)# media profile FOR_TRUNKS
vesbc(config-esbc-trunk-sip)# exit
vesbc(config-esbc)# do commit
vesbc(config-esbc)# do confirm

В результате конфигурация медиапрофиля будет выглядеть следующим образом:

 media profile FOR_TRUNKS
codec allow AMR
codec allow CLEARMODE
codec allow CN
codec allow G72
codec allow G722/ 9
codec allow G728 15
codec allow G729/ 18
codec allow GSM 3
codec allow H26
codec allow H261 31
codec allow H263 34
codec allow ILBC
codec allow L16/44100 11
codec allow L16/44100/2 10
codec allow OPUS
codec allow PCMA 8
codec allow PCMU 0
codec allow QCELP
codec allow SPEEX
codec allow T38 t38
codec allow VP
codec allow telephone-event
exit

В данном примере в транк TRUNK_1 приходит INVITE c SDP Offer1, в котором содержится кодек QCELP, и т. к. настройками медиапрофиля FOR_TRUNKS этот кодек разрешен, то он будет передаваться SDP Offer2, отправляемый в транк TRUNK_2. UA TRUNK_2 выбирает кодек QCELP, и в результате он будет согласован в SDP Answer1.

4. Разрешить использование только кодека PCMA для TRUNK_1.

vesbc# configure 
vesbc(config)# esbc

#Создать медиапрофиль для транка TRUNK_1:
vesbc(config-esbc)# media profile FOR_TRUNK_1

#Удалить все шаблоны:
vesbc(config-esbc-media-profile)# no codec allow all

#Добавить шаблон только для кодека PCMA:
vesbc(config-esbc-media-profile)# codec allow PCMA 8
vesbc(config-esbc-media-profile)# exit

#Привязать медиапрофиль к транку:
vesbc(config-esbc)# trunk sip TRUNK_1
vesbc(config-esbc-trunk-sip)# media profile FOR_TRUNK_1 
vesbc(config-esbc-trunk-sip)# do commit
vesbc(config-esbc-trunk-sip)# do confirm

В результате конфигурация медиапрофиля будет выглядеть следующим образом:

  media profile FOR_TRUNK_1
    codec allow PCMA 8
  exit

В данном примере в транк TRUNK_1 приходит INVITE c SDP Offer1 с набором кодеков. Т. к. настройками медиапрофиля FOR_TRUNK_1 запрещены все кодеки кроме PCMA, то в транк TRUNK_2 будет отправлен SDP Offer2, содержащий только кодек PCMA.

Транскодирование

Транскодирование — это реализация преобразования медиапотоков, основанных на разных кодеках. 

Эта реализация позволяет:

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

Список кодеков, поддерживаемых в режиме транскодирования:

Аудиокодеки

Видеокодеки

AMR                

AMR-WB          

G722              

G7221-24        

G7221-32

G7221C-24

G7221C-32          

G7221C-48        

G726-16            

G726-24          

G726-32            

G726-40          

G729               

GSM              

ILBC               

L16-MONO         

OPUS               

PCMA             

PCMU               

SPEEX-NB         

SPEEX-UWB          

SPEEX-WB 

H263-1998   

H264        

VP8         

VP9

Поддержка кодеков для транскодирования осуществляется командами: 

codec {audio | video | image} {all | <CODEC>}
no codec {audio | video | image} {all | <CODEC>}

<CODEC> — название кодека. Указывается из списка поддержанных для транскодирования кодеков.

all — включает транскодирование всех доступных кодеков заданного типа медиаданных.

Команда codec image в текущей версии ПО не поддерживается, данная команда аналогична команде codec allow T38 t38.

Описание всех команд приведено в разделе Настройки медиапрофиля справочника команд CLI.

Порядок обработки SDP для выбора режима работы:

  1. Offer SDP фильтруется согласно разрешённым кодекам на плече A.
  2. Offer SDP фильтруется согласно разрешённым кодекам на плече B.
  3. Если в медиапрофиле на плече А включен транскодинг, и во входящем SDP присутствуют кодеки из списка разрешенных, то в конец Offer SDP добавляются недостающие кодеки, транскодинг которых включен в media profile на плече B.
  4. Answer SDP фильтруется согласно разрешённым кодекам на плече B.
  5. В конец Answer SDP добавляются недостающие кодеки, транскодинг которых включен в media profile на плече A.
  6. Перед отправкой Answer SDP в плечо А производится согласование кодеков. 

В результате транскодирование включается, если самые приоритетные кодеки из Offer и Answer SDP на двух плечах не совпадают. В таком случае в Answer SDP будет выбран наиболее приоритетный кодек, который был получен в Offer SDP, и для которого включена поддержка транскодирования в медиапрофиле на плече А.

Иначе при совпадении приоритетных кодеков в Offer SDP и Answer SDP, будет использоваться проксирование медиаданных.

С целью снижения нагрузки на ESBC, транскодирование включается только в случае, когда использовать проксирование медиатрафика невозможно.

Для включения транскодирования необходимо использовать медиапрофили с включенным транскодированием (codec audio/video) на обоих направлениях.

Если на одном из направлений не используется медиапрофиль (т. е. используется медиапрофиль по умолчанию), или в профиле не настроено ни одно правило codec audio/video, то транскодирование осуществляться не будет.

Пример:

В транке TRUNK_1 используется медиапрофиль FOR_TRUNK_1, в котором разрешены кодеки PCMA и PCMU для проксирования, и не указаны кодеки, разрешенные для транскодирования. 

В транке TRUNK_2 используется медиапрофиль FOR_TRUNK_2, в котором также кодеки PCMA и PCMU разрешены для проксирования, и кодек G729 разрешен для транскодирования.

В SDP Offer1, полученном с транка TRUNK_1, указаны кодеки PCMA и PCMU, и т. к. в медиапрофиле FOR_TRUNK_1 отсутствуют кодеки, разрешенные для транскодирования, в SDP Offer2, который будет отправлен в TRUNK_2, кодек G729 не будет добавлен. Соответственно при вызовах из TRUNK_1 в TRUNK_2 (и в обратном направлении) возможно только проксирование медиаданных.

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

Т. о. включение поддержки транскодирования для кодеков командами codec {audio | video | image} {all | <CODEC>} не означает, что передаваемые через ESBC медиаданные всегда будут транскодироваться.

Пример:

Для транков TRUNK_1 и TRUNK_2 используется один и тот же медиапрофиль FOR_TRUNKS, в котором указан только кодек PCMA, разрешенный для транскодирования, и отсутствуют шаблоны кодеков для проксирования.

В SDP Offer1, полученном с транка TRUNK_1, указаны кодеки PCMA и PCMU, и т. к. в медиапрофиле FOR_TRUNKS не указан кодек PCMU (ни для проксирования, ни для транскодирования), то в SDP Offer2, который будет отправлен в TRUNK_2, кодек PCMU не будет добавлен. При получении SDP Answer2 происходит согласование кодека PCMA, и в TRUNK_1 будет отправлен SDP Answer1 с кодеком PCMA. При этом медиаданные будут передаваться в режиме проксирования, т. к. наиболее приоритетные кодеки в SDP Offer и SDP Answer совпадают.

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

1. Настроить только режим транскодирования кодеков PCMA <---> PCMU между направлениями. 

vesbc# configure 
vesbc(config)# esbc

#Создать медиапрофиль для транка TRUNK_1:
vesbc(config-esbc)# media profile FOR_TRUNK_1

#Запретить использование всех кодеков в режиме проксирования:
vesbc(config-esbc-media-profile)# no codec allow all

#Включить поддержку кодека PCMA в режиме транскодирования:
vesbc(config-esbc-media-profile)# codec audio PCMA 
vesbc(config-esbc-media-profile)# exit

#Привязать медиапрофиль к транку TRUNK_1:
vesbc(config-esbc)# trunk sip TRUNK_1
vesbc(config-esbc-trunk-sip)# media profile FOR_TRUNK_1
vesbc(config-esbc-trunk-sip)# exit

#Создать медиапрофиль для транка TRUNK_2:
vesbc(config-esbc)# media profile FOR_TRUNK_2

#Запретить использование всех кодеков в режиме проксирования:
vesbc(config-esbc-media-profile)# no codec allow all

#Включить поддержку кодека PCMU в режиме транскодирования:
vesbc(config-esbc-media-profile)# codec audio PCMU
vesbc(config-esbc-media-profile)# exit

#Привязать медиапрофиль к транку TRUNK_2:
vesbc(config-esbc)# trunk sip TRUNK_2
vesbc(config-esbc-trunk-sip)# media profile FOR_TRUNK_2
vesbc(config-esbc-trunk-sip)# do commit
vesbc(config-esbc-trunk-sip)# do confirm

В результате конфигурация медиапрофилей будет выглядеть следующим образом:

  media profile FOR_TRUNK_1
    codec audio PCMA
  exit
  media profile FOR_TRUNK_2
    codec audio PCMU
  exit

В SDP Offer1, полученном с транка TRUNK_1, указан кодек PCMA, и т. к. в медиапрофиле FOR_TRUNK_2 указан только кодек PCMU для транскодирования, в SDP Offer2, который будет отправлен в TRUNK_2, кодек PCMA будет заменен на PCMU. Соответственно при вызовах из TRUNK_1 в TRUNK_2 (и в обратном направлении) возможно только транскодирование медиаданных.

Если в SDP Offer1, полученном с транка TRUNK_1, будут указаны любые кодеки кроме PCMA, то вызов не будут установлен, ESBC отправит на INVITE ответ 488.

2. Использование медиапрофилей для проксирования и транскодирования аудиоданных.

Для транков TRUNK_1 и TRUNK_2 используются медиапрофили, позволяющие проксировать все кодеки и транскодировать аудио G722 <---> G729 и GSM <---> G729.

Настройка медиапрофилей:

vesbc# configure 
vesbc(config)# esbc

#Создать медиапрофиль для транка TRUNK_1:
vesbc(config-esbc)# media profile FOR_TRUNK_1

#Включить поддержку кодеков G722 и GSM в режиме транскодирования:
vesbc(config-esbc-media-profile)# codec audio G722
vesbc(config-esbc-media-profile)# codec audio GSM 
vesbc(config-esbc-media-profile)# exit

#Привязать медиапрофиль к транку TRUNK_1:
vesbc(config-esbc)# trunk sip TRUNK_1
vesbc(config-esbc-trunk-sip)# media profile FOR_TRUNK_1
vesbc(config-esbc-trunk-sip)# exit

#Создать медиапрофиль для транка TRUNK_2:
vesbc(config-esbc)# media profile FOR_TRUNK_2

#Включить поддержку кодека G729 в режиме транскодирования:
vesbc(config-esbc-media-profile)# codec audio G729
vesbc(config-esbc-media-profile)# exit

#Привязать медиапрофиль к транку TRUNK_2:
vesbc(config-esbc)# trunk sip TRUNK_2
vesbc(config-esbc-trunk-sip)# media profile FOR_TRUNK_2
vesbc(config-esbc-trunk-sip)# do commit
vesbc(config-esbc-trunk-sip)# do confirm

В результате конфигурация медиапрофилей будет выглядеть следующим образом:

  media profile FOR_TRUNK_1
    codec audio GSM
    codec audio G722
    codec allow AMR
    codec allow CLEARMODE
    codec allow CN
    codec allow G72
    codec allow G722/ 9
    codec allow G728 15
    codec allow G729/ 18
    codec allow GSM 3
    codec allow H26
    codec allow H261 31
    codec allow H263 34
    codec allow ILBC
    codec allow L16/44100 11
    codec allow L16/44100/2 10
    codec allow OPUS
    codec allow PCMA 8
    codec allow PCMU 0
    codec allow SPEEX
    codec allow T38 t38
    codec allow VP
    codec allow telephone-event
  exit

  media profile FOR_TRUNK_2
    codec audio G729
    codec allow AMR
    codec allow CLEARMODE
    codec allow CN
    codec allow G72
    codec allow G722/ 9
    codec allow G728 15
    codec allow G729/ 18
    codec allow GSM 3
    codec allow H26
    codec allow H261 31
    codec allow H263 34
    codec allow ILBC
    codec allow L16/44100 11
    codec allow L16/44100/2 10
    codec allow OPUS
    codec allow PCMA 8
    codec allow PCMU 0
    codec allow SPEEX
    codec allow T38 t38
    codec allow VP
    codec allow telephone-event
  exit

2.1 В SDP Offer1, полученном с транка TRUNK_1, указаны кодеки PCMA, PCMU, G726 и G722. Т. к. в медиапрофиле FOR_TRUNK_1 есть кодек G722, разрешенный для транскодирования, то в SDP Offer2, который будет отправлен в TRUNK_2, будет добавлен кодек G729. Остальные кодеки будут передаваться из SDP Offer1 в SDP Offer2, т. к. на обоих медиапрофилях настроены шаблоны, разрешающие проксирование этих кодеков. В SDP Answer2, полученном из TRUNK_2, указан кодек PCMU. Этот кодек будет согласован ESBC в SDP Answer1. Т. к. этот кодек был в SDP Offer1, то будет выбран режим проксирования медиаданных.

2.2 В SDP Offer1, полученном с транка TRUNK_1,  указаны кодеки PCMA, PCMU, G726 и G722. Т. к. в медиапрофиле FOR_TRUNK_1 есть кодек G722, разрешенный для транскодирования, то в SDP Offer2, который будет отправлен в TRUNK_2, будет добавлен кодек G729. Остальные кодеки будут передаваться из SDP Offer1 в SDP Offer2, т. к. на обоих медиапрофилях настроены шаблоны, разрешающие проксирование этих кодеков. В SDP Answer2, полученном из TRUNK_2, указан кодек G729. Т. к. этого кодека не было в SDP Offer1, то будет согласован единственный возможный кодек для TRUNK_1 — G722. Т. к. кодеки на плечах TRUNK_1 и TRUNK_2 отличаются, будет включено транскодирование медиаданных G722 <---> G729.


2.3 В SDP Offer1, полученном с транка TRUNK_1, указаны кодеки PCMA, PCMU, GSM, G726 и G722. Т. к. в медиапрофиле FOR_TRUNK_1 есть кодеки G722 и GSM, разрешенные для транскодирования, то в SDP Offer2, который будет отправлен в TRUNK_2, будет добавлен кодек G729. Остальные кодеки будут передаваться из SDP Offer1 в SDP Offer2, т. к. на обоих медиапрофилях настроены шаблоны, разрешающие проксирование этих кодеков. В SDP Answer2, полученном из TRUNK_2, указан кодек G729. Т. к. этого кодека не было в SDP Offer1, то будет согласован наиболее приоритетный кодек для TRUNK_1 — GSM. Т. к. кодеки на плечах TRUNK_1 и TRUNK_2 отличаются, будет включено транскодирование медиаданных GSM <---> G729.

 

Таймаут ожидания RTP-пакетов

Функция контроля состояния разговорного тракта по наличию RTP-трафика от встречного устройства. Данный механизм, а также описанные ниже механизмы могут использоваться для предотвращения зависания разговорных сессий в случае возникновения неисправностей на сети передачи данных. Они могут использоваться в дополнение или в качестве альтернативы таймерам SIP-сессий (RFC 4028).

Контроль осуществляется следующим образом: если в течение заданного времени от встречного устройства не поступает ни одного RTP-пакета, то вызов завершается.
По умолчанию контроль выключен. 

Пример настройки RTP-таймаута:

vesbc# 
vesbc# configure 
vesbc(config)# esbc 

#Создание медиапрофиля NEW_MEDIA_PROFILE:
vesbc(config-esbc)# media profile NEW_MEDIA_PROFILE 
vesbc(config-esbc-media-profile)# 

#Включение таймера 60 секунд в медиапрофиле:
vesbc(config-esbc-media-profile)# rtp timeout 60
vesbc(config-esbc-media-profile)# 
 
vesbc(config-esbc-media profile)# exit
vesbc(config-esbc)#

#Привязать медиапрофиль к транку NEW_TRUNK:
vesbc(config-esbc)# trunk sip NEW_TRUNK
vesbc(config-esbc-trunk-sip)# media profile NEW_MEDIA_PROFILE 
vesbc(config-esbc-trunk-sip)# 

#Применить и подтвердить изменения:
vesbc(config-esbc-trunk-sip)# do commit 
Configuration has been successfully applied and saved to flash. Commit timer started, changes will be reverted in 600 seconds.
vesbc(config-esbc-trunk-sip)# do confirm 
Configuration has been confirmed. Commit timer canceled.

Если в вызове, который был установлен через транк NEW_TRUNK, в течение 1 минуты в ESBC не будут приходить RTP-пакеты с любой из сторон, то вызов будет принудительно завершён.

Таймаут ожидания RTP-пакетов после получения Comfort Noise

Эта функция является дополнением к функции "Таймаут ожидания RTP-пакетов" с учетом контроля состояния разговора по наличию RTP-трафика при использовании пакетов Comfort Noise в RTP-потоке.

Данный таймаут является множителем для rtp timeout. Множитель — это коэффициент, который определяет, во сколько раз значение данного таймаута больше, чем таймаут ожидания RTP-пакетов. Принимает значения из диапазона 2–30.

Контроль осуществляется следующим образом: если в течение данного времени от встречного устройства не поступает ни одного RTP-пакета и последний пакет был пакетом CN (Comfort Noise), то вызов завершается. 

По умолчанию множитель не установлен.

CN-множитель будет использоваться, только если настроен таймаут ожидания RTP-пакетов. 

Пример настройки множителя:

vesbc# 
vesbc# configure 
vesbc(config)# esbc 

#Создание медиапрофиля NEW_MEDIA_PROFILE:
vesbc(config-esbc)# media profile NEW_MEDIA_PROFILE 
vesbc(config-esbc-media-profile)# 

#Включение таймаута ожидания RTP-пакетов в 60 секунд:
vesbc(config-esbc-media-profile)# rtp timeout 60
vesbc(config-esbc-media-profile)# 

#Установить множитель таймаута ожидания RTP-пакетов после получения Comfort Noise:
vesbc(config-esbc-media-profile)# rtp timeout cn 5
vesbc(config-esbc-media-profile)# 
 
vesbc(config-esbc-media profile)# exit
vesbc(config-esbc)#

#Привязать медиапрофиль к транку NEW_TRUNK:
vesbc(config-esbc)# trunk sip NEW_TRUNK
vesbc(config-esbc-trunk-sip)# media profile NEW_MEDIA_PROFILE 
vesbc(config-esbc-trunk-sip)# 

#Применить и подтвердить изменения:
vesbc(config-esbc-trunk-sip)# do commit 
Configuration has been successfully applied and saved to flash. Commit timer started, changes will be reverted in 600 seconds.
vesbc(config-esbc-trunk-sip)# do confirm 
Configuration has been confirmed. Commit timer canceled.

Если в вызове, который был установлен через транк NEW_TRUNK, в течение 1 минуты в ESBC не будут приходить RTP-пакеты с любой из сторон, а последний пакет был пакетом CN, то таймаут ожидания RTP-пакетов увеличится в 5 раз. Таким образом, если в течение 5 минут с момента получения CN-пакета не поступает ни одного RTP-пакета, то вызов будет принудительно завершён.

 

Таймаут ожидания RTCP-пакетов

Функция контроля состояния разговорного тракта по наличию RTCP-трафика от встречного устройства. Таймаут принимает значения из диапазона 10–300 c. Контроль осуществляется следующим образом: если в течение заданного времени от встречного устройства не поступает ни одного RTCP-пакета, то вызов завершается.

По умолчанию контроль выключен.

Пример настройки RTCP-таймаута:

vesbc# 
vesbc# configure 
vesbc(config)# esbc 

#Создание медиапрофиля NEW_MEDIA_PROFILE:
vesbc(config-esbc)# media profile NEW_MEDIA_PROFILE 
vesbc(config-esbc-media-profile)# 

#Включение таймаута ожидания RTCP-пакетов в 30 секунд:
vesbc(config-esbc-media-profile)# rtcp timeout 30
vesbc(config-esbc-media-profile)# 
 
vesbc(config-esbc-media profile)# exit
vesbc(config-esbc)#

#Привязать медиапрофиль к транку NEW_TRUNK:
vesbc(config-esbc)# trunk sip NEW_TRUNK
vesbc(config-esbc-trunk-sip)# media profile NEW_MEDIA_PROFILE 
vesbc(config-esbc-trunk-sip)# 

#Применить и подтвердить изменения:
vesbc(config-esbc-trunk-sip)# do commit 
Configuration has been successfully applied and saved to flash. Commit timer started, changes will be reverted in 600 seconds.
vesbc(config-esbc-trunk-sip)# do confirm 
Configuration has been confirmed. Commit timer canceled.

Если в вызове, который был установлен через транк NEW_TRUNK, в течение 30 секунд в ESBC не будут приходить RTСP-пакеты с любой из сторон, то вызов будет принудительно завершён.

Рекомендуется настраивать таймауты ожидания RTP и RTCP-пакетов совместно.

Отсутствие RTP-пакетов не является явным признаком неисправности на сети передачи данных, т. к. разговорный канал может быть деактивирован временно какой-либо из сторон, например, через согласование SDP a=inactive. При этом пакеты RTCP будут передаваться сторонами в этом состоянии. 

При использовании только RTCP-таймаута, ESBC не анализирует наличие RTP-пакетов, и в случае, когда стороны не используют RTCP, сессия завершится спустя время, равное таймауту ожидания RTCP-пакетов. Поэтому, если заранее неизвестно, поддерживает ли встречная сторона RTCP, необходимо настроить не только RTCP, но и RTP-таймаут. 

Логика совместной работы таймеров

Если время потери RTP-пакетов больше, чем RTP-таймаут, то проверяется RTCP-таймаут. Если RTCP-таймаут не настроен или время ожидания RTCP-пакетов истекло, то сессия завершается, иначе сессия останется активной, пока не истечёт RTCP-таймаут. Если в это время придёт RTP-пакет, то таймаут ожидания RTP перезапустится. Таким же образом происходит проверка RTP-таймаута, если истекает RTCP-таймаут.

Пример совместной настройки RTP и RTCP-таймаута:

vesbc# 
vesbc# configure 
vesbc(config)# esbc 

#Создание медиапрофиля NEW_MEDIA_PROFILE:
vesbc(config-esbc)# media profile NEW_MEDIA_PROFILE 
vesbc(config-esbc-media-profile)# 

#Включение таймаута ожидания RTP-пакетов в 60 секунд:
vesbc(config-esbc-media-profile)# rtp timeout 60
vesbc(config-esbc-media-profile)# 

#Включение таймаута ожидания RTCP-пакетов в 120 секунд:
vesbc(config-esbc-media-profile)# rtcp timeout 120
vesbc(config-esbc-media-profile)# 
 
vesbc(config-esbc-media profile)# exit
vesbc(config-esbc)#

#Привязать медиапрофиль к транку NEW_TRUNK:
vesbc(config-esbc)# trunk sip NEW_TRUNK
vesbc(config-esbc-trunk-sip)# media profile NEW_MEDIA_PROFILE 
vesbc(config-esbc-trunk-sip)# 

#Применить и подтвердить изменения:
vesbc(config-esbc-trunk-sip)# do commit 
Configuration has been successfully applied and saved to flash. Commit timer started, changes will be reverted in 600 seconds.
vesbc(config-esbc-trunk-sip)# do confirm 
Configuration has been confirmed. Commit timer canceled.

Если в вызове, который был установлен через транк NEW_TRUNK,  в течение 1 минуты не будут приходить RTP-пакеты, а таймаут ожидания RTCP-пакетов ещё не истёк, то сессия не завершится. Таким образом, соединение будет поддерживаться, пока встречная сторона отправляет RTCP-пакеты. Если за это время придёт RTP-пакет, таймаут ожидания RTP-пакетов перезапустится. Иначе, если RTCP-пакеты также перестанут приходить, и ни один RTP-пакет так и не поступит, сессия завершится через 120 секунд с момента последнего пришедшего RTCP-пакета.

Локальная обработка RTCP

Опция локальной обработки позволяет ESBC самостоятельно генерировать RTCP-пакеты в сессиях, где одно из плеч не поддерживает RTCP.

По умолчанию RTCP-пакеты не генерируются, а RTCP-пакеты, полученные на одном из плеч вызова, пересылаются на второе плечо. В режиме локальной обработки RTCP-пакеты генерируются и отправляются на оба плеча сессии, а полученные пакеты обрабатываются.

Локальная обработка RTCP включается, если хотя бы на одном плече привязан медиапрофиль с включенной опцией локальной обработки.

Интервал посылки RTCP-пакетов — это период времени в секундах, через который устройство отправляет контрольные пакеты по протоколу RTCP, принимает значения в диапазоне 1–255 секунд. По умолчанию — 5 сек. 

Пример настройки локальной обработки RTCP:

vesbc# 
vesbc# configure 
vesbc(config)# esbc 

#Создание медиапрофиля NEW_MEDIA_PROFILE:
vesbc(config-esbc)# media profile NEW_MEDIA_PROFILE 
vesbc(config-esbc-media-profile)# 

#Включение опции локальной обработки RTCP:
vesbc(config-esbc-media-profile)# rtcp local enable
vesbc(config-esbc-media-profile)# 

#Настройка интервала посылки RTCP-пакетов в 10 секунд:
vesbc(config-esbc-media-profile)# rtcp local interval 10
vesbc(config-esbc-media-profile)# 
 
vesbc(config-esbc-media profile)# exit
vesbc(config-esbc)#

#Привязать медиапрофиль к транку NEW_TRUNK:
vesbc(config-esbc)# trunk sip NEW_TRUNK
vesbc(config-esbc-trunk-sip)# media profile NEW_MEDIA_PROFILE 
vesbc(config-esbc-trunk-sip)# 

#Применить и подтвердить изменения:
vesbc(config-esbc-trunk-sip)# do commit 
Configuration has been successfully applied and saved to flash. Commit timer started, changes will be reverted in 600 seconds.
vesbc(config-esbc-trunk-sip)# do confirm 
Configuration has been confirmed. Commit timer canceled.

Во время вызова, который был установлен через NEW_TRUNK, каждые 10 секунд RTCP-пакеты будут генерироваться и отправляться в сторону транка NEW_TRUNK, интервал отправки RTCP-пакетов на другое плечо будет зависеть от настроек медиапрофиля у этого направления, если медиапрофиль не установлен, то будет использован интервал по умолчанию – 5 секунд.

SRTP

SRTP (Secure Real-time Transport Protocol) — это расширенная версия протокола RTP с набором защитных механизмов. Протокол был опубликован организацией IETF в стандарте RFC 3711. SRTP обеспечивает конфиденциальность за счет шифрования RTP-нагрузки. Для шифрования медиапотока SRTP стандартизирует использование только единственного шифра — AES, который может использоваться в двух режимах:

SRTP использует функцию формирования ключа для создания ключей на основе мастер-ключа. Протокол управления ключами создает все ключи в сессии с помощью мастер-ключа. За счет того, что у каждой сессии свой уникальный ключ, все сессии защищены. Поэтому, если одна сессия была скомпрометирована, то остальные по-прежнему под защитой. 

В конфигурации доступны 2 метода обмена ключами:

и 3 режима использования SRTP:

Если выбран режим mandatory и включены оба метода, то на втором плече будет выбран DTLS-SRTP, как более приоритетный.

По умолчанию поддержка SRTP выключена.

По умолчанию при использовании DTLS-SRTP используются сертификаты, сгенерированные автоматически. Для использования сертификатов, загруженных пользователем, необходимо в медиапрофиле указать криптопрофиль с необходимыми сертификатами командой crypto profile. Подробное описание криптопрофилей приведено в разделе Настройка криптопрофилей.


Пример использования SRTP

Схема:

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

vesbc# 
vesbc# configure 
vesbc(config)# esbc 

#Создание медиапрофиля NEW_MEDIA_PROFILE:
vesbc(config-esbc)# media profile NEW_MEDIA_PROFILE 
vesbc(config-esbc-media profile)# 

#Настройка SRTP (включили обязательный режим использования, метод обмена ключами — SDES):
vesbc(config-esbc-media-profile)# srtp keying 
  dtls-srtp  Enable DTLS-SRTP keying method
  sdes       Enable SDES keying method

vesbc(config-esbc-media-profile)# srtp keying sdes 
vesbc(config-esbc-media-profile)# srtp mode 
  disable    SRTP is disabled
  mandatory  SRTP is mandatory
  optional   SRTP is optional

vesbc(config-esbc-media-profile)# srtp mode mandatory 
vesbc(config-esbc-media-profile)# 

 
vesbc(config-esbc-media-profile)# exit
vesbc(config-esbc)#

#Привязать медиапрофиль к транку TRUNK_OUT:
vesbc(config-esbc)# trunk sip TRUNK_OUT
vesbc(config-esbc-trunk-sip)# media profile NEW_MEDIA_PROFILE 
vesbc(config-esbc-trunk-sip)# 

#Применить и подтвердить изменения:
vesbc(config-esbc-trunk-sip)# do commit 
Configuration has been successfully applied and saved to flash. Commit timer started, changes will be reverted in 600 seconds.
vesbc(config-esbc-trunk-sip)# do confirm 
Configuration has been confirmed. Commit timer canceled.

C TRUNK_IN приходит INVITE с SDP offer:

Session Description Protocol
    Session Description Protocol Version (v): 0
    Owner/Creator, Session Id (o): 100 61 74 IN IP4 10.25.72.54
    Session Name (s): Talk
    Connection Information (c): IN IP4 10.25.72.54
    Time Description, active time (t): 0 0
    Session Attribute (a): rtcp-xr:rcvr-rtt=all:10000 stat-summary=loss,dup,jitt,TTL voip-metrics
    Session Attribute (a): record:off
    Media Description, name and address (m): audio 7078 RTP/AVP 96 97 98 0 8 18 101 99 100
    Media Attribute (a): rtpmap:96 opus/48000/2
    Media Attribute (a): fmtp:96 useinbandfec=1
    Media Attribute (a): rtpmap:97 speex/16000
    Media Attribute (a): fmtp:97 vbr=on
    Media Attribute (a): rtpmap:98 speex/8000
    Media Attribute (a): fmtp:98 vbr=on
    Media Attribute (a): fmtp:18 annexb=yes
    Media Attribute (a): rtpmap:101 telephone-event/48000
    Media Attribute (a): rtpmap:99 telephone-event/16000
    Media Attribute (a): rtpmap:100 telephone-event/8000
    Media Attribute (a): rtcp-fb:* trr-int 5000
    Media Attribute (a): rtcp-fb:* ccm tmmbr
    [Generated Call-ID: l0XaoKkqav]

На второе плечо (TRUNK_OUT) пересылаем SDP offer c ключами: 

Session Description Protocol
    Session Description Protocol Version (v): 0
    Owner/Creator, Session Id (o): 100 3932018917 3932018917 IN IP4 192.168.23.199
    Session Name (s): Talk
    Connection Information (c): IN IP4 192.168.23.199
    Time Description, active time (t): 0 0
    Session Attribute (a): rtcp-xr:rcvr-rtt=all:10000 stat-summary=loss,dup,jitt,TTL voip-metrics
    Session Attribute (a): record:off
    Media Description, name and address (m): audio 8064 RTP/SAVP 96 97 98 0 8 18 101 99 100
    Media Attribute (a): rtpmap:96 opus/48000/2
    Media Attribute (a): fmtp:96 useinbandfec=1
    Media Attribute (a): rtpmap:97 speex/16000
    Media Attribute (a): fmtp:97 vbr=on
    Media Attribute (a): rtpmap:98 speex/8000
    Media Attribute (a): fmtp:98 vbr=on
    Media Attribute (a): fmtp:18 annexb=yes
    Media Attribute (a): rtpmap:101 telephone-event/48000
    Media Attribute (a): rtpmap:99 telephone-event/16000
    Media Attribute (a): rtpmap:100 telephone-event/8000
    Media Attribute (a): rtcp-fb:* trr-int 5000
    Media Attribute (a): rtcp-fb:* ccm tmmbr
    Media Attribute (a): crypto:1 AES_256_CM_HMAC_SHA1_80 inline:FGdOolKfBlrQzUIedHcIqs9uauWEnUbqxXpop9PaI1dPIHVnO/vdb7JJHRLBLw==
    Media Attribute (a): crypto:2 AES_256_CM_HMAC_SHA1_32 inline:Galc9UfOqBFNmr3ICc3Fiuc3HgEXlj+p1dRw85LavzjWR1sGZUr1nsLQjfaTQA==
    Media Attribute (a): crypto:3 AES_CM_128_HMAC_SHA1_80 inline:jEjWFKpqdf6d94g/ddSjj1i08dEWQA1tTI75Hqx3
    Media Attribute (a): crypto:4 AES_CM_128_HMAC_SHA1_32 inline:uFYI2UDA/+woJJY4fWljfoxRROffXNtEO81bBnHJ
    [Generated Call-ID: 503d40e930910767a2dd95f88b483189]

Контроль источника RTP

Контроль источника RTP позволяет принимать медиатрафик только с IP-адреса и порта, указанного в SDP встречной стороны, повышая безопасность взаимодействия при использовании публичной сети передачи данных.

Включение/выключение режима осуществляется командами rtp source-verification и no rtp source-verification соответственно. При отключенной проверке IP-адрес и порт источника RTP не проверяется.

По умолчанию опция включена.

При использовании опции "Контроль источника RTP" совместно с включенной опцией "nat comedia" в транке или абонентском интерфейсе, RTP-трафик будет передаваться на IP-адрес и порт из входящего потока.

Поддержка RFC5168 (PFU)

Picture Fast Update (PFU) — это механизм быстрого восстановления видеоизображения за счет обновления поврежденных кадров, обеспечивающий минимальные задержки и стабильное качество видео даже при потере пакетов.

Опция работает только для вызовов с транскодированием видео, при проксировании полученные сообщения INFO пересылаются на другое плечо.

Включение/выключение режима осуществляется командами rfc5168 enable и no rfc5168 enable соответственно.

По умолчанию опция выключена.

При выключенной поддержке и получении INFO с XML, в котором есть PFU, ESBC отправляет ответ 200 OK и INFO с SDP, в котором содержится "Unsupported picture fast update".

Примеры

1. При проксировании видео и получении сообщения INFO с XML, в котором есть PFU, ESBC передает сообщение INFO на второе плечо

Схема:

В конфигурации есть два транка, настроена маршрутизация. На обоих транках используется один видеокодек (например, VP8). Вызов, который приходит из TRUNK_IN, маршрутизируется через TRUNK_OUT.

C TRUNK_IN приходит сообщение INFO с XML:

eXtensible Markup Language
    <?xml
        version="1.0"
        encoding="utf-8"
        ?>
    <media_control>
        <vc_primitive>
            <to_encoder>
                <picture_fast_update/>
                </to_encoder>
            </vc_primitive>
        </media_control>

Т. к. используется проксирование видео, ESBC прокидывает сообщение INFO на второе плечо (в TRUNK_OUT):

eXtensible Markup Language
    <?xml
        version="1.0"
        encoding="utf-8"
        ?>
    <media_control>
        <vc_primitive>
            <to_encoder>
                <picture_fast_update/>
                </to_encoder>
            </vc_primitive>
        </media_control>

Встречная сторона (TRUNK_OUT) отвечает, поддерживает ли она INFO с XML PFU или нет.

2. Поддержка RFC5168 отключена. При транскодировании видео и получении сообщения INFO с XML, в котором есть PFU, ESBC ответит 200 OK и отправит INFO с "Unsupported picture fast update" в XML

Схема:

В конфигурации есть два транка, настроена маршрутизация. На транках используются разные видеокодеки, т. е. ESBC работает в режиме транскодирования видео (в примере TRUNK_IN использует VP8, а TRUNK_OUT H264). Вызов, который приходит из TRUNK_IN, маршрутизируется через TRUNK_OUT.  На обоих транках в настройках медиапрофиля поддержка использования RFC5168 отключена.

vesbc# 
vesbc# configure 
vesbc(config)# esbc 

#Создать медиапрофиль MEDIA_PROFILE_TRUNK_IN (по умолчанию поддержка rfc5168 отключена):
vesbc(config-esbc)# media profile MEDIA_PROFILE_TRUNK_IN
vesbc(config-esbc-media-profile)# codec video VP8
vesbc(config-esbc-media-profile)# no codec allow H26
vesbc(config-esbc-media-profile)# no codec allow H261
vesbc(config-esbc-media-profile)# no codec allow H263  
vesbc(config-esbc-media-profile)# exit
vesbc(config-esbc)#

#Создать медиапрофиль MEDIA_PROFILE_TRUNK_OUT (по умолчанию поддержка rfc5168 отключена):
vesbc(config-esbc)# media profile MEDIA_PROFILE_TRUNK_OUT
vesbc(config-esbc-media-profile)# codec video H264
vesbc(config-esbc-media-profile)# no codec allow VP
vesbc(config-esbc-media-profile)# exit
vesbc(config-esbc)#

#Привязать медиапрофиль MEDIA_PROFILE_TRUNK_IN к транку TRUNK_IN:
vesbc(config-esbc)# trunk sip TRUNK_OUT
vesbc(config-esbc-trunk-sip)# media profile MEDIA_PROFILE_TRUNK_IN
vesbc(config-esbc-trunk-sip)#  

#Привязать медиапрофиль MEDIA_PROFILE_TRUNK_OUT к транку TRUNK_OUT:
vesbc(config-esbc)# trunk sip TRUNK_OUT
vesbc(config-esbc-trunk-sip)# media profile MEDIA_PROFILE_TRUNK_OUT
vesbc(config-esbc-trunk-sip)# 

#Применить и подтвердить изменения:
vesbc(config-esbc-trunk-sip)# do commit 
Configuration has been successfully applied and saved to flash. Commit timer started, changes will be reverted in 600 seconds.
vesbc(config-esbc-trunk-sip)# do confirm 
Configuration has been confirmed. Commit timer canceled.

В TRUNK_IN приходит сообщение INFO с XML:

eXtensible Markup Language
    <?xml
        version="1.0"
        encoding="utf-8"
        ?>
    <media_control>
        <vc_primitive>
            <to_encoder>
                <picture_fast_update/>
                </to_encoder>
            </vc_primitive>
        </media_control>

Т. к. поддержка RFC5168 отключена, ESBC ответит 200 OK и отправит сообщение INFO с XML, в котором содержится "Unsupported picture fast update":

eXtensible Markup Language
    <?xml
        version="1.0"
        encoding="utf-8"
        ?>
    <media_control>
        <general_error>
            Unsupported picture fast update
            </general_error>
        </media_control>


3. Поддержка RFC5168 включена. При транскодировании видео и получении сообщения INFO с XML, в котором есть PFU, ESBC самостоятельно обрабатывает сообщение INFO

Схема:

В конфигурации есть два транка, настроена маршрутизация. На транках используются разные видеокодеки, т. е. ESBC работает в режиме транскодирования видео (в примере TRUNK_IN использует VP8, а TRUNK_OUT H264). Вызов, который приходит из TRUNK_IN, маршрутизируется через TRUNK_OUT.  На обоих транках в настройках медиапрофиля указываем, что поддержка использования RFC5168 включена.

vesbc# 
vesbc# configure 
vesbc(config)# esbc 

#Создание медиапрофиля MEDIA_PROFILE_TRUNK_IN с включенной поддержкой RFC5168:
vesbc(config-esbc)# media profile MEDIA_PROFILE_TRUNK_IN 
vesbc(config-esbc-media-profile)# codec video VP8
vesbc(config-esbc-media-profile)# no codec allow H26
vesbc(config-esbc-media-profile)# no codec allow H261 31
vesbc(config-esbc-media-profile)# no codec allow H263 34
vesbc(config-esbc-media-profile)# rfc5168 enable 
vesbc(config-esbc-media-profile)# exit
vesbc(config-esbc)#

#Создание медиапрофиля MEDIA_PROFILE_TRUNK_OUT с включенной поддержкой RFC5168:
vesbc(config-esbc)# media profile MEDIA_PROFILE_TRUNK_OUT
vesbc(config-esbc-media-profile)# codec video H264
vesbc(config-esbc-media-profile)# no codec allow VP
vesbc(config-esbc-media-profile)# rfc5168 enable
vesbc(config-esbc-media-profile)# exit
vesbc(config-esbc)#

#Привязать медиапрофиль к транку TRUNK_IN:
vesbc(config-esbc)# trunk sip TRUNK_IN
vesbc(config-esbc-trunk-sip)# media profile MEDIA_PROFILE_TRUNK_IN
vesbc(config-esbc-trunk-sip)#  

#Привязать медиапрофиль к транку TRUNK_OUT:
vesbc(config-esbc)# trunk sip TRUNK_OUT
vesbc(config-esbc-trunk-sip)# media profile MEDIA_PROFILE_TRUNK_OUT
vesbc(config-esbc-trunk-sip)#  

#Применить и подтвердить изменения:
vesbc(config-esbc-trunk-sip)# do commit 
Configuration has been successfully applied and saved to flash. Commit timer started, changes will be reverted in 600 seconds.
vesbc(config-esbc-trunk-sip)# do confirm 
Configuration has been confirmed. Commit timer canceled..

C TRUNK_IN приходит сообщение INFO с XML:

eXtensible Markup Language
    <?xml
        version="1.0"
        encoding="utf-8"
        ?>
    <media_control>
        <vc_primitive>
            <to_encoder>
                <picture_fast_update/>
                </to_encoder>
            </vc_primitive>
        </media_control>

Т. к. используется транскодирование, то ESBC самостоятельно обрабатывает INFO, отправляет 200 OK. 

Настройка Media Offroad

Media Offroad  (Внетрактовый медиапоток) — это архитектурный подход в IP-телефонии (VoIP), при котором сигнальный трафик (SIP) проходит через  пограничный контроллер сессий ESBC, а голосовой или видеопоток (медиатрафик RTP/SRTP) направляется напрямую между конечными точками (абонентами, IP АТС и т.д) в обход ESBC.

При использовании Media Offroad, ESBC не изменяет IP-адреса и порты в SDP при обработки вызовов. 

Если направления находятся в одной media offroad группе, то при вызове на эти направления,  будет работать только функция проксирование медиапрофиля.  Остальные настройки медиапрофиля не будут влиять на SDP.

Настройки public-ip и stun server на транках и абонентских интерфейсов, использующих медиапрофиль с одинаковой media offroad группой, также не будут использоваться при работе режима Media Offroad.

Режим Media Offroad возможне только в случае, когда на входящем и исходящем направлениии, используются медипрофили с одинаковой media offroad группой. Иначе вызов будет обрабатываться в режиме передачи медиапотоков через ESBC.

Пример использования Media Offroad

Нужно настроить передачу медии напрямую между клиентами. 

Схема:

В конфигурации есть два транка, настроена маршрутизация. Для того, чтобы медиапотоки ходили напрямую между UAC и UAS на транках, нужно настроить медиапрофили с одной media offroad группой.

vesbc# 
vesbc# configure 
vesbc(config)# esbc 

#Создание медиапрофиля MEDIA_PROFILE_UAC с media offroad группой OFFROAD:
vesbc(config-esbc)# media profile MEDIA_PROFILE_UAC
vesbc(config-esbc-media-profile)# media offroad group OFFROAD
vesbc(config-esbc-media-profile)# exit

#Создание медиапрофиля MEDIA_PROFILE_UAS с media offroad группой OFFROAD:
vesbc(config-esbc)# media profile MEDIA_PROFILE_UAS
vesbc(config-esbc-media-profile)# media offroad group OFFROAD
vesbc(config-esbc-media-profile)# exit

#Привязать медиапрофиль к транку UAC:
vesbc(config-esbc)# trunk sip UAC
vesbc(config-esbc-trunk-sip)# media profile MEDIA_PROFILE_UAC
vesbc(config-esbc-trunk-sip)#  

#Привязать медиапрофиль к транку UAS:
vesbc(config-esbc)# trunk sip UAS
vesbc(config-esbc-trunk-sip)# media profile MEDIA_PROFILE_UAS
vesbc(config-esbc-trunk-sip)#  

#Применить и подтвердить изменения:
vesbc(config-esbc-trunk-sip)# do commit 
Configuration has been successfully applied and saved to flash. Commit timer started, changes will be reverted in 600 seconds.
vesbc(config-esbc-trunk-sip)# do confirm 
Configuration has been confirmed. Commit timer canceled..

При согласовании SDP на второе плечо будут передаваться адрес и порт полученные во входящем плече. Поэтому медиапотоки будут передаваться напрямую между абонентами. 

Пример отправки SDP

1. С включенным Media Offroad.

C UAC приходит INVITE с SDP offer:

Session Description Protocol
    Session Description Protocol Version (v): 0
    Owner/Creator, Session Id (o): - 5000927421830469481 6519451137306200781 IN IP4 192.168.126.235
    Session Name (s): Session SDP
    Connection Information (c): IN IP4 192.168.126.235
    Time Description, active time (t): 0 0
    Media Description, name and address (m): audio 23236 RTP/AVP 8 18 0 96
    Media Attribute (a): rtpmap:8 PCMA/8000
    Media Attribute (a): rtpmap:18 G729/8000
    Media Attribute (a): fmtp:18 annexb=no
    Media Attribute (a): rtpmap:0 PCMU/8000
    Media Attribute (a): rtpmap:96 telephone-event/8000
    Media Attribute (a): fmtp:96 0-15
    Media Attribute (a): silenceSupp:off - - - -
    [Generated Call-ID: dc57f841-a743-1200-ca98-6813e20921bf]

 На UAS передается SDP без подмены адреса и порта:

Session Description Protocol
    Session Description Protocol Version (v): 0
    Owner/Creator, Session Id (o): - 5000927421830469481 6519451137306200781 IN IP4 192.168.126.235
    Session Name (s): Session SDP
    Connection Information (c): IN IP4 192.168.126.235
    Time Description, active time (t): 0 0
    Media Description, name and address (m): audio 23236 RTP/AVP 8 18 0 96
    Media Attribute (a): rtpmap:8 PCMA/8000
    Media Attribute (a): rtpmap:18 G729/8000
    Media Attribute (a): fmtp:18 annexb=no
    Media Attribute (a): rtpmap:0 PCMU/8000
    Media Attribute (a): rtpmap:96 telephone-event/8000
    Media Attribute (a): fmtp:96 0-15
    Media Attribute (a): silenceSupp:off - - - -
    [Generated Call-ID: a35f417e272093e280283749209df178]

2. С выключенным Media Offroad.

C UAC приходит INVITE с SDP offer:

Session Description Protocol
    Session Description Protocol Version (v): 0
    Owner/Creator, Session Id (o): - 8474717719612293321 8743226203380917861 IN IP4 192.168.126.235
    Session Name (s): Session SDP
    Connection Information (c): IN IP4 192.168.126.235
    Time Description, active time (t): 0 0
    Media Description, name and address (m): audio 23240 RTP/AVP 8 18 0 96
    Media Attribute (a): rtpmap:8 PCMA/8000
    Media Attribute (a): rtpmap:18 G729/8000
    Media Attribute (a): fmtp:18 annexb=no
    Media Attribute (a): rtpmap:0 PCMU/8000
    Media Attribute (a): rtpmap:96 telephone-event/8000
    Media Attribute (a): fmtp:96 0-15
    Media Attribute (a): silenceSupp:off - - - -
    [Generated Call-ID: 5290521b-a758-1200-ca98-6813e20921bf]

 На UAS передаём SDP c адресом и портом ESBC:

Session Description Protocol
    Session Description Protocol Version (v): 0
    Owner/Creator, Session Id (o): - 3996657384 3996657384 IN IP4 192.168.126.231
    Session Name (s): Session SDP
    Connection Information (c): IN IP4 192.168.126.231
    Time Description, active time (t): 0 0
    Media Description, name and address (m): audio 8010 RTP/AVP 8 18 0 96
    Media Attribute (a): rtpmap:8 PCMA/8000
    Media Attribute (a): rtpmap:18 G729/8000
    Media Attribute (a): fmtp:18 annexb=no
    Media Attribute (a): rtpmap:0 PCMU/8000
    Media Attribute (a): rtpmap:96 telephone-event/8000
    Media Attribute (a): fmtp:96 0-15
    Media Attribute (a): silenceSupp:off - - - -
    [Generated Call-ID: 45d577c847420f66e60a155b69c815e4]
При согласовании SDP для использования SRTP на второе плечо будут передаваться ключи шифрования клиента, а не ESBC.

Управление безопасностью системы

В данном разделе описаны методы защиты и примеры настройки ESBC для защиты от различных SIP-атак.

Для более надежной защиты рекомендуется использовать дополнительные механизмы защиты от прочих сетевых атак, описанные в разделе Рекомендации по безопасной настройке.

Настройка профилей безопасности

Профили безопасности используются для управления механизмом защиты от SIP-атак. Использование профилей безопасности позволяет гибко управлять уровнями защиты для каждого направления.

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

Профиль безопасности может использоваться в транках, транк-группах и абонентских интерфейсах. 

Для обеспечения единой политики безопасности может быть использован один профиль для всех транков и один профиль для всех абонентских интерфейсов. Это может быть как один и тот же профиль безопасности, так и разные. Эти профили указываются в общих настройках ESBC.

Если для транка и транковой группы, в которую входит этот транк, используются разные профили безопасности, то будет применяться профиль, указанный в настройках транка. Если для транка/абонентского интерфейса и в общих настройках (для всех транков/абонентских интерфейсов) используются разные профили безопасности, то будет применяться профиль, указанный в настройках транка/абонентского интерфейса.  

Описание всех команд для настройки профилей безопасности приведено в разделе Настройки профиля безопасности.  

Общий принцип работы модуля fail2ban

Модуль занимается анализом возникающих ошибок для дальнейшей блокировки источников "подозрительного SIP-трафика". При возникновении ошибки в модуль отправляется информация о типе ошибки и об источнике. При накоплении достаточного количества ошибок источник блокируется. 

Виды ошибок:

Лимит количества ошибок зависит от нескольких факторов:

При добавлении адреса в чёрный список указывается причина блокировки. Чёрный список можно просмотреть в CLI командой show esbc black-list или в WEB на странице Мониторинг → Списки доступа → Чёрный список.

Причины блокировки:

Фильтрация SIP-флуда

ESBC поддерживает создание флуд-фильтров для механизма конфигурируемой защиты от SIP-flood, а также для фильтрации клиентских приложений. Фильтр применяется ко всему SIP-сообщению (включая тело — SDP, XML и т. д.).

В настройках фильтра можно указать до 64 масок/шаблонов, по которым происходит поиск. В случае нахождения сообщение определяется как флуд и отбрасывается.

К профилю безопасности можно привязать до 8 флуд-фильтров.

При создании шаблона можно использовать регулярные выражения PCRE. 

Регулярное выражение для флуд-фильтра применяется с логикой частичного совпадения(match).

Пример настройки флуд-фильтров

#Создание абонентских интерфейсов:
vesbc# configure 
vesbc(config)# esbc 
vesbc(config-esbc)# user-interface sip UI_1
vesbc(config-esbc-user-interface-sip)# sip transport TRANSPORT_UI_1
vesbc(config-esbc-user-interface-sip)# media resource 0 MEDIA_UI_1
vesbc(config-esbc-user-interface-sip)# route-table TO_SSW
vesbc(config-esbc-user-interface-sip)# exit
vesbc(config-esbc)# user-interface sip UI_2
vesbc(config-esbc-user-interface-sip)# sip transport TRANSPORT_UI_2
vesbc(config-esbc-user-interface-sip)# media resource 0 MEDIA_UI_2
vesbc(config-esbc-user-interface-sip)# route-table TO_SSW
vesbc(config-esbc-user-interface-sip)# exit
vesbc(config-esbc)# user-interface sip UI_3
vesbc(config-esbc-user-interface-sip)# sip transport TRANSPORT_UI_3
vesbc(config-esbc-user-interface-sip)# media resource 0 MEDIA_UI_3
vesbc(config-esbc-user-interface-sip)# route-table TO_SSW
vesbc(config-esbc-user-interface-sip)# exit

#Создание флуд-фильтра:
vesbc# configure 
vesbc(config)# esbc 
vesbc(config-esbc)# flood filter FLOOD_FILTER
vesbc(config-esbc-flood-filter)# pattern 0 7543546
vesbc(config-esbc-flood-filter)# pattern 1 flood
vesbc(config-esbc-flood-filter)# exit

#Привязка флуд-фильтра к профилю безопасности:
vesbc(config-esbc)# security profile SECURITY_PROFILE
vesbc(config-esbc-security-profile)# flood filter 0 FLOOD_FILTER
vesbc(config-esbc-security-profile)# exit

#Привязка профиля безопасности с флуд-фильтром ко всем абонентским интерфейсам:
vesbc(config-esbc)# general
vesbc(config-esbc-general)# security profile user-interface SECURITY_PROFILE

#Применение и подтверждение изменений:
vesbc(config-esbc-general)# do commit 
Configuration has been successfully applied and saved to flash. Commit timer started, changes will be reverted in 600 seconds.
vesbc(config-esbc-general)# do confirm
Configuration has been confirmed. Commit timer canceled.

После применения изменений все входящие инициирующие запросы с абонентских интерфейсов UI_1, UI_2, UI_3 будут проверяться на наличие подстрок "7543546" и "flood". Если хотя бы одна подстрока будет найдена в сообщении, то оно отбросится, а в модуль fail2ban отправится уведомление о срабатывании флуд-фильтра. При накоплении достаточного количества ошибок источник блокируется.

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

Логика применения фильтров

По умолчанию все фильтры(шаблоны) применяются с логикой "ИЛИ", то есть сообщение отбросится, если будет найдено совпадение хотя бы по одному шаблону.

Есть возможность с помощью выражения задавать логику применения фильтров, доступные логические операторы:

Для обращения к фильтру необходимо использовать его индекс. В выражении можно использовать скобки для группировки фильтров.

Пример изменения логики применения фильтров

Конфигурация:

vesbc# 
vesbc# configure 
vesbc(config)# esbc 

vesbc(config-esbc)# flood filter FLOOD_FILTER

vesbc(config-esbc-flood-filter)# pattern 0 ".*scan.*"
vesbc(config-esbc-flood-filter)# pattern 1 ".*crack.*"
vesbc(config-esbc-flood-filter)# pattern 2 ".*trusted.*"
vesbc(config-esbc-flood-filter)# pattern expression "(0|1)&!2"
vesbc(config-esbc-flood-filter)# do commit
vesbc(config-esbc-flood-filter)# do confirm

Настройка pattern expression "(0|1)&!2" означает, что для срабатывания флуд-фильтра необходимо, чтобы SIP-сообщение содержало подстроку "scan" или "crack" и, при этом, не содержало подстроку "trusted".

Фильтрация клиентских приложений

При помощи флуд-фильтров можно реализовать фильтрацию клиентских приложений, реализуется это добавлением шаблона следующего вида:

User-Agent:.*потенциально вредоносное клиентское приложение.*

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

Соответствие запрещенных User-Agent и создаваемым дефолтным шаблоном представлено в таблице ниже.

Запрещенный User-AgentСоздаваемый дефолтный шаблон

scan

User-Agent:.*scan.*

crack

User-Agent:.*crack.*

flood

User-Agent:.*flood.*

kill

User-Agent:.*kill.*

sipcli

User-Agent:.*sipcli.*

sipv

sipvicious

User-Agent:.*sipv.*

sipsak

User-Agent:.*sipsak.*

sundayaddr

User-Agent:.*sundayaddr.*

iWar

User-Agent:.*iWar.*

SIVuS

User-Agent:.*SIVuS.*

Gulp

User-Agent:.*Gulp.*

smap

User-Agent:.*smap.*

friendly-request

User-Agent:.*friendly-request.*

VaxIPUserAgent

VaxSIPUserAgent

User-Agent:.*VaxS{0,1}IPUserAgent.*

siparmyknife

User-Agent:.*siparmyknife.*

Test Agent

User-Agent:.*Test Agent.*

SIPBomber

User-Agent:.*SIPBomber.*

Siprogue

User-Agent:.*Siprogue.*


Если в настройках фильтра недостаточно незаполненных шаблонов для создания всех default patterns, то они не создадутся.

Блокировка по AOR/User-Agent

По умолчанию при превышении лимита по ошибкам блокируется только адрес источника вредоносного трафика, в конфигурации профиля безопасности можно включить блокировку по AOR из заголовка From и блокировку по значению заголовка User-Agent.

При использовании одного и того же атрибута (AOR, User-Agent, IP-адрес) источником вредоносного трафика раньше всего сработает блокировка по AOR, потом по IP-адресу, потом по User-Agent. Из-за этого при ошибках с одинаковым AOR и IP-адресом может оказаться заблокированным только AOR, или при ошибках с одинаковым IP и User-Agent может оказаться заблокированным только IP-адрес.

Пример включения блокировки по AOR:

vesbc#
vesbc# configure 
vesbc(config)# esbc
vesbc(config-esbc)# security profile SECURITY_PROFILE

#Сбор ошибок по AOR:
vesbc(config-esbc-security-profile)# check aor 
vesbc(config-esbc-security-profile)# exit

#Привязка профиля безопасности к абонентскому интерфейсу:
vesbc(config-esbc)# user-interface sip ABONENTS
vesbc(config-esbc-user-interface-sip)# security profile SECURITY_PROFILE

#Применение и подтверждение изменений:
vesbc(config-esbc-user-interface-sip)# do commit 
Configuration has been successfully applied and saved to flash. Commit timer started, changes will be reverted in 600 seconds.
vesbc(config-esbc-user-interface-sip)# do confirm
Configuration has been confirmed. Commit timer canceled.

Пример блокировки:

С адреса 192.168.80.134 через абонентский интерфейс приходят сообщения INVITE с AOR 123@anonymous.invalid, вызовы без регистрации на интерфейсе запрещены, поэтому эти запросы отбиваются 403 Forbidden.

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

IP black-list:
--------------------------------------------------------------------------------
IP address        Ban reason         Address of Record (AOR)     Error       Blocking     Time of blocking       
                                     User-Agent (UA)             count       timeout                             
                                                                             in minutes                          
---------------   ----------------   -------------------------   ---------   ----------   --------------------   
192.168.80.134   IP RPS LIMIT         16          1440         2026-09-10 04:54:43  

Если к абонентскому интерфейсу привязан профиль безопасности с включенной блокировкой по AOR, то через какое-то время в чёрный список добавится AOR. 
Все запросы с любого адреса, в котором будет заблокированный AOR во From, обрабатываться не будут.

AOR black-list:
--------------------------------------------------------------------------------------------
AOR                         Ban reason         AOR         Forgive      Time of blocking       
                                               error       time in                             
                                               count       minutes                             
-------------------------   ----------------   ---------   ----------   --------------------   
123@anonymous.invalid       ACCOUNT HACKING    25          60           2026-09-10 05:08:57 

Блокировка по AOR срабатывает раньше, чем блокировка по адресу, поэтому адрес не успеет попасть в черный список. 

Пример включения блокировки по User-Agent:

vesbc#
vesbc# configure 
vesbc(config)# esbc
vesbc(config-esbc)# security profile SECURITY_PROFILE

#Сбор ошибок по User-Agent:
vesbc(config-esbc-security-profile)# check user-agent 
vesbc(config-esbc-security-profile)# exit

#Привязка профиля безопасности к абонентскому интерфейсу:
vesbc(config-esbc)# user-interface sip ABONENTS
vesbc(config-esbc-user-interface-sip)# security profile SECURITY_PROFILE

#Применение и подтверждение изменений:
vesbc(config-esbc-user-interface-sip)# do commit 
Configuration has been successfully applied and saved to flash. Commit timer started, changes will be reverted in 600 seconds.
vesbc(config-esbc-user-interface-sip)# do confirm
Configuration has been confirmed. Commit timer canceled.

Пример блокировки:

С нескольких адресов 192.168.80.13x через абонентский интерфейс приходят сообщения INVITE с User-Agent: sipflood, вызовы без регистрации на интерфейсе запрещены, поэтому эти запросы отбиваются 403 Forbidden.

Если в профиле безопасности, привязанному к абонентскому интерфейсу, отключена блокировка по User-Agent, то через определенное количество запросов заблокируются только IP-адреса, и запросы с них больше обрабатываться не будут:

IP black-list:
--------------------------------------------------------------------------------
IP address        Ban reason         Address of Record (AOR)     Error       Blocking     Time of blocking       
                                     User-Agent (UA)             count       timeout                             
                                                                             in minutes                          
---------------   ----------------   -------------------------   ---------   ----------   --------------------   
192.168.80.134   IP RPS LIMIT         16          1435         2026-09-10 04:49:48
192.168.80.135   IP RPS LIMIT         16          1436         2026-09-10 04:50:11
192.168.80.136   IP RPS LIMIT         16          1437         2026-09-10 04:51:49
192.168.80.137   IP RPS LIMIT         16          1438         2026-09-10 04:52:25
192.168.80.138   IP RPS LIMIT         16          1439         2026-09-10 04:53:23
192.168.80.139   IP RPS LIMIT         16          1440         2026-09-10 04:54:43

Если к абонентскому интерфейсу привязан профиль безопасности с включенной блокировкой по User-Agent, то через какое-то время в чёрный список помимо IP-адресов добавится ещё и User-Agent.
Все запросы с любого адреса, в котором будет заблокированный User-Agent, обрабатываться не будут: 

IP black-list:
--------------------------------------------------------------------------------
IP address        Ban reason         Address of Record (AOR)     Error       Blocking     Time of blocking       
                                     User-Agent (UA)             count       timeout                             
                                                                             in minutes                          
---------------   ----------------   -------------------------   ---------   ----------   --------------------   
192.168.80.134   IP RPS LIMIT       UA: sipflood                16          1435         2026-09-10 04:49:48
192.168.80.135   IP RPS LIMIT       UA: sipflood                16          1436         2026-09-10 04:50:11
192.168.80.136   IP RPS LIMIT       UA: sipflood                16          1437         2026-09-10 04:51:49
192.168.80.137   IP RPS LIMIT       UA: sipflood                16          1438         2026-09-10 04:52:25
192.168.80.138   IP RPS LIMIT       UA: sipflood                16          1439         2026-09-10 04:53:23
192.168.80.139   IP RPS LIMIT       UA: sipflood                16          1440         2026-09-10 04:54:43

User-agent black-list:
--------------------------------------------------------------------------------------------
UA                          Ban reason         UA error    Forgive      Time of blocking       
                                               count       time in                             
                                                           minutes                             
-------------------------   ----------------   ---------   ----------   --------------------   
sipflood                    ACCOUNT HACKING    61          60           2026-09-10 05:14:53  

Объединение ошибок по IP-адресу

Данная опция позволяет объединять ошибки по IP-адресу.

Поведение по умолчанию – опция выключена, ошибки для каждого AOR/User-Agent считаются отдельно, блокируются при большом количестве ошибок с отдельного AOR/User-Agent.

При включенной опции, если ошибки имеют разный AOR/User-Agent, но одинаковый IP-адрес, то при блокировке адреса заблокируются все связанные AOR/User-Agent.

Настройка обеспечивает лучшую защиту от распределенных атак, но если много разных AOR/UA используют одинаковый IP-адрес, то могут быть ложные срабатывания.

Объединение ошибок работает, только если в профиле безопасности включена блокировка по AOR или User-Agent. 

Пример включения объединения ошибок по IP-адресу: 

vesbc#
vesbc# configure 
vesbc(config)# esbc
vesbc(config-esbc)# security profile SECURITY_PROFILE

#Сбор ошибок по AOR:
vesbc(config-esbc-security-profile)# check user-agent 

#Объединение ошибок по адресу:
vesbc(config-esbc-security-profile)# errors aggregation  
vesbc(config-esbc-security-profile)# exit

#Привязка профиля безопасности к абонентскому интерфейсу:
vesbc(config-esbc)# user-interface sip ABONENTS
vesbc(config-esbc-user-interface-sip)# security profile SECURITY_PROFILE

#Применение и подтверждение изменений:
vesbc(config-esbc-user-interface-sip)# do commit 
Configuration has been successfully applied and saved to flash. Commit timer started, changes will be reverted in 600 seconds.
vesbc(config-esbc-user-interface-sip)# do confirm
Configuration has been confirmed. Commit timer canceled.

Пример блокировки:

С адреса 192.168.80.133 через абонентский интерфейс приходят сообщения INVITE с разными AOR, вызовы без регистрации на интерфейсе запрещены, поэтому эти запросы отбиваются 403 Forbidden.

Если в профиле безопасности, привязанному к абонентскому интерфейсу, отключено объединение ошибок по адресу, то через определенное количество запросов заблокируется только IP-адрес, и запросы с него больше обрабатываться не будут:

IP black-list:
 --------------------------------------------------------------------------------
IP address        Ban reason         Address of Record (AOR)     Error       Blocking     Time of blocking       
                                     User-Agent (UA)             count       timeout                             
                                                                             in minutes                          
---------------   ----------------   -------------------------   ---------   ----------   --------------------   
192.168.80.134    IP RPS LIMIT                                   16          1440         2026-09-10 04:54:43 

Если к абонентскому интерфейсу привязан профиль безопасности, в котором включено объединение ошибок по адресу, то через какое-то время в чёрный список помимо IP-адреса добавятся все связанные с этим адресом AOR.

Все запросы с любого адреса, в котором будут заблокированные AOR во From, обрабатываться не будут. 

Защита от SIP-spoofing атак

Опция проверки IP-адреса источника SIP-сообщения позволяет защититься от SIP-spoofing атак.

IP-адрес и порт, с которого поступает SIP-сообщение от абонента, сравнивается с IP-адресом и портом, с которого ранее регистрировался этот абонент. Если абонент неизвестен или запрос пришёл с неизвестного направления, то запрос игнорируется, а в модуль fail2ban отправляется оповещение. 

Если в настройках абонентского интерфейса разрешены вызовы без регистрации, то создание сессии для неизвестного абонента разрешено. Если абонент зарегистрирован, то при получении SIP-сообщения с IP-адреса или порта, отличного от адреса и порта при регистрации, такое сообщение не будет обрабатываться.

Проверка работает на все запросы вне созданных сессий, если запрос пришёл на абонентский интерфейс и если запрос не является запросом регистрации.

В рамках созданной сессии адрес и порт, с которого пришёл запрос/ответ, сравнивается с адресом и портом источника инициирующего запроса. Если они не совпадают, то запрос/ответ игнорируется, а в модуль fail2ban отправляется оповещение. Сессия при этом не завершается.

При накоплении достаточного количества ошибок источник блокируется. 

Поведение по умолчанию – опция выключена.

Пример включения проверки IP-адреса источника SIP-сообщения:

vesbc#
vesbc# configure 
vesbc(config)# esbc
vesbc(config-esbc)# security profile SECURITY_PROFILE

#Включение проверки адреса источника SIP-сообщения:
vesbc(config-esbc-security-profile)# check src-address
vesbc(config-esbc-security-profile)# exit

#Привязка профиля безопасности к абонентскому интерфейсу:
vesbc(config-esbc)# user-interface sip ABONENTS
vesbc(config-esbc-user-interface-sip)# security profile SECURITY_PROFILE

#Применение и подтверждение изменений:
vesbc(config-esbc-user-interface-sip)# do commit 
Configuration has been successfully applied and saved to flash. Commit timer started, changes will be reverted in 600 seconds.
vesbc(config-esbc-user-interface-sip)# do confirm
Configuration has been confirmed. Commit timer canceled.

Примеры блокировки

1. С IP-адреса 192.168.23.242 и порта 5060 через абонентский интерфейс регистрируется абонент с AOR 123@domain.local, вызовы без регистрации на интерфейсе запрещены. Если на абонентский интерфейс придёт сообщение INVITE с AOR 123@domain.local, но с другого адреса или порта, например, с 192.168.23.242:5075, то данный запрос будет игнорирован, а в модуль fail2ban отправится оповещение. 

2. С IP-адреса 192.168.23.242 и порта 5060 через абонентский интерфейс приходит сообщение INVITE с AOR 123@domain.local, вызов устанавливается. В профиле безопасности, привязанному к абонентскому интерфейсу, включена проверка адреса источника SIP-сообщения. Если в рамках сессии придёт запрос BYE с другого адреса или порта, например, с 192.168.80.35:5060, то данный запрос будет игнорирован, сессия не завершится, а IP-адрес 192.168.80.35 через определенное количество запросов будет заблокирован.

Настройка временных периодов

Временные периоды используются в случае блокировки объектов с целью гибкой настройки защиты от SIP-атак. Для этого в общих настройках реализованы конфигурации:

По умолчанию время блокировки составляет 1440 минут, время прощения — 60 минут, время хранения ошибок — 3600 секунд.

Описание всех команд выше приведено в разделе Общие настройки ESBC. 

При блокировки атрибута и поступлении нового запроса, содержащего заблокированный атрубут, время прощения (Forgive time in minutes) восстановится в начальное значение.

При блокировки нескольких атрибутов и поступлении нового запроса, содержащего несколько заблокированных атрибутов, время прощения (Forgive time in minutes) восстановится в начальное значение только для самого приоритетного атрибута.


Пример:

vesbc# 
vesbc# configure 
vesbc(config)# esbc 

#Переход в общие настройки:
vesbc(config-esbc)# general 
vesbc(config-esbc-general)#

#Изменение времени блокировки адресов на 2880 минут (2 дня):
vesbc(config-esbc-general)# security block-timeout 2880

#Изменение времени блокировки атрибутов на 600 минут (10 часов):
vesbc(config-esbc-general)# security forgive-time 600

#Изменение времени хранения ошибок на 7200 секунд (2 часа):
vesbc(config-esbc-general)# security errors-window 7200

#Применение и подтверждение изменений:
vesbc(config-esbc-general)# do commit 
Configuration has been successfully applied and saved to flash. Commit timer started, changes will be reverted in 600 seconds.
vesbc(config-esbc-general)# do confirm 
Configuration has been confirmed. Commit timer canceled.

Пример блокировки адреса:

При получении невалидных сообщений с адреса 192.168.80.26 эти запросы отбиваются на втором плече 403 Forbidden.

При достижении определенного количества неудачных запросов этот адрес добавится в черный список с временем блокировки, которое было настроено в общих настройках.

vesbc# 
vesbc# configure 
vesbc(config)# esbc 

#Переход в общие настройки:
vesbc(config-esbc)# general 
vesbc(config-esbc-general)#

#Изменение времени блокировки адресов на 2880 минут (2 дня):
vesbc(config-esbc-general)# security block-timeout 2880

#Применение и подтверждение изменений:
vesbc(config-esbc-general)# do commit 
Configuration has been successfully applied and saved to flash. Commit timer started, changes will be reverted in 600 seconds.
vesbc(config-esbc-general)# do confirm 
Configuration has been confirmed. Commit timer canceled.

Происходит блокировка адреса 192.168.80.134

vesbc# show esbc black-list ip
IP black-list:
---------------------------------------------------------------------------------
IP address        Ban reason         Address of Record (AOR)     Error       Blocking     Time of blocking       
                                     User-Agent (UA)             count       timeout                             
                                                                             in minutes                          
---------------   ----------------   -------------------------   ---------   ----------   --------------------   
192.168.80.134    IP RPS LIMIT                                   16          2880         2026-09-10 04:54:43 

Пример блокировки атрибута:

При получении невалидных сообщений с AOR 123@test.block эти запросы отбиваются на втором плече 403 Forbidden.

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

vesbc# 
vesbc# configure 
vesbc(config)# esbc 

#Переход в общие настройки:
vesbc(config-esbc)# general 
vesbc(config-esbc-general)#

#Изменение времени блокировки атрибутов на 600 минут (10 часов):
vesbc(config-esbc-general)# security forgive-time 600

#Применение и подтверждение изменений:
vesbc(config-esbc-general)# do commit 
Configuration has been successfully applied and saved to flash. Commit timer started, changes will be reverted in 600 seconds.
vesbc(config-esbc-general)# do confirm 
Configuration has been confirmed. Commit timer canceled.

Происходит блокировка AOR 22222@192.168.80.26

vesbc# show esbc black-list aor
AOR black-list:
--------------------------------------------------------------------------------------------
AOR                         Ban reason         AOR         Forgive      Time of blocking       
                                               error       time in                             
                                               count       minutes                             
-------------------------   ----------------   ---------   ----------   --------------------   
22222@192.168.80.26--------------------------------------------------------------------------------
AOR                    Ban reason       User        Forgive      Time of      
                                        error       time in      blocking     
                                        count       minutes                   
--------------------   --------------   ---------   ----------   ----------   
101@192.168.126.217    TOOMANY USER     5           60           2026-09-10   
                       REQUESTS                                  05:22:47        ACCOUNT HACKING    25          600          2026-09-10 05:08:57  

Настройка AAA

AAA (Authentication, Authorization, Accounting) — это базовая архитектура управления доступом, используемая в сетевых устройствах для идентификации клиентов, определения их прав и регистрации выполняемых действий. 

В контексте ESBC механизмы AAA применяются для контроля доступа к устройству, управления сессиями и взаимодействия с внешними серверами аутентификации. Реализация AAA включает три ключевых компонента:

В данном разделе приведены параметры настройки, примеры конфигурации и рекомендации по применению различных механизмов AAA, используемых в ESBC.

Настройка аутентификации абонентов через RADIUS

ESBC поддерживает аутентификацию регистрирующихся через него абонентов на RADIUS-сервере.

Режимы работы digest-аутентификации:

В текущей версии ПО аутентификация через RADIUS-сервер поддерживается только для метода REGISTER.

Порядок настройки аутентификации через RADIUS-сервер:

  1. Настроить RADIUS-сервер(ы).
  2. Настроить radius profile.
  3. Настроить aaa profile.
  4. Использовать aaa profile в настройках абонентского интерфейса.

Настройка RADIUS-сервера

В таблице ниже приведены минимальные необходимые настройки RADIUS-сервера. Описание всех доступных настроек приведено в разделе Настройка AAA справочника команд CLI.

Шаг

Описание

Команда

Ключи

1

Добавить RADIUS-сервер в список используемых серверов и перейти в режим его конфигурирования.

esbc(config)# radius-server host
{ <IP-ADDR> | <IPV6-ADDR> } [ vrf <VRF> ]

<IP-ADDR> – IP-адрес RADIUS-сервера, задаётся в виде AAA.BBB.CCC.DDD, где каждая часть принимает значения [0..255];

<IPV6-ADDR> – IPv6-адрес RADIUS-сервера, задаётся в виде X:X:X:X::X, где каждая часть принимает значения в шестнадцатеричном формате [0..FFFF]

<VRF> – имя экземпляра VRF, задается строкой до 31 символа.

2

Задать пароль для аутентификации на удаленном RADIUS-сервере.

esbc(config-radius-server)# key ascii-text
{ <TEXT> | encrypted <ENCRYPTED-TEXT> }

<TEXT> – строка [8..16] ASCII-символов;

<ENCRYPTED-TEXT> – зашифрованный пароль, размером [8..16] байт, задаётся строкой [16..32] символов.

3

Задать IPv4/IPv6-адрес, который будет использоваться в качестве IPv4/IPv6-адреса источника в отправляемых RADIUS-пакетах (можно не указывать при условии настройки п. 4).

esbc(config-radius-server)# source-address { <ADDR>  | object-group <NETWORK_OBJ_GROUP_NAME> }

<ADDR> – IP-адрес источника, задается в виде AAA.BBB.CCC.DDD, где каждая часть принимает значения [0..255];

<NETWORK_OBJ_GROUP_NAME> – список адресов, которые будут использоваться в качестве source address.

4Задать интерфейс или туннель маршрутизатора, IPv4/IPv6-адрес которого будет использоваться в качестве IPv4/IPv6-адреса источника в отправляемых RADIUS-пакетах. (можно не указывать при условии настройки п. 3).esbc(config-radius-server)# source-interface { <IF> | <TUN> }

<IF> – имя интерфейса устройства, задаётся в виде, описанном в разделе Типы и порядок именования интерфейсов маршрутизатора; 

<TUN> – имя туннеля устройства, задаётся в виде, описанном в разделе Типы и порядок именования туннелей маршрутизатора.

5Указать тип соединений, для аутентификации которых будет использоваться RADIUS-сервер.esbc(config-radius-server)# usage { all | aaa | auth | acct | pptp | l2tp | voip }

Для аутентификации регистраций абонентов ESBC необходимо использовать тип соединения usage voip.

Возможно настроить до восьми RADIUS-серверов. 


Настройка RADIUS-профиля

В таблице ниже приведены минимальные необходимые настройки RADIUS-профиля. Описание всех доступных настроек приведено в разделе Настройки RADIUS-профиля справочника команд CLI.

Шаг

Описание

Команда

Ключи

1

Перейти в раздел конфигурирования ESBC.

esbc(config)# esbc


2

Добавить в конфигурацию RADIUS-профиль и перейти в режим его конфигурирования.

esbc(config-esbc)# radius profile <NAME>

<NAME> – название RADIUS-профиля, строка [1..64] символов.

3

Выбрать RADIUS-сервер, настроенный на предыдущем этапе для аутентификации.

Допускается использование до восьми RADIUS-серверов в одном RADIUS-профиле.

esbc(config-radius-profile)# radius-server host  { <IP-ADDR> | <IPV6-ADDR> } [ vrf <VRF> ]

 

<IP-ADDR> – IP-адрес RADIUS-сервера, задаётся в виде AAA.BBB.CCC.DDD, где каждая часть принимает значения [0..255];

<IPV6-ADDR> – IPv6-адрес RADIUS-сервера, задаётся в виде X:X:X:X::X, где каждая часть принимает значения в шестнадцатеричном формате [0..FFFF]

<VRF> – имя экземпляра VRF, задается строкой до 31 символа.

Настройка AAA-профиля

Шаг

Описание

Команда

Ключи

1

Перейти в раздел конфигурирования ESBC.

esbc(config)# esbc


2

Добавить в конфигурацию AAA-профиль и перейти в режим его конфигурирования.

esbc(config-esbc)# aaa profile <NAME>

<NAME> – название AAA-профиля, строка [1..64] символов.

3

Выбрать RADIUS-профиль, настроенный на предыдущем этапе для аутентификации.

esbc(config-aaa-profile)# auth radius profile <NAME>

 

<NAME> – название RADIUS-профиля, строка [1..64] символов.

Для использования аутентификации абонентов через RADIUS-сервер необходимо указать AAA-профиль в конфигурации абонентского интерфейса (user-Interface), см. раздел Настройка абонентских интерфейсов. 

Пример настройки:

Задача:

Использовать RADIUS-серверы 192.168.113.200 (основной) и 192.168.113.201 (резервный) для аутентификации регистраций абонентов, поступающих на абонентский интерфейс USERS_VIA_RADIUS  в режиме RFC5090-no-challenge.

Решение:

 1. Настроить основной RADIUS-сервер 192.168.113.200:

vesbc# configure 
vesbc(config)# radius-server host 192.168.113.200
vesbc(config-radius-server)# key ascii-text password
vesbc(config-radius-server)# source-address 192.168.113.207
vesbc(config-radius-server)# usage voip 
vesbc(config-radius-server)# exit

2. Настроить резервный RADIUS-сервер 192.168.113.201:

vesbc(config)# radius-server host 192.168.113.201
vesbc(config-radius-server)# key ascii-text password
vesbc(config-radius-server)# source-address 192.168.113.207
vesbc(config-radius-server)# usage voip 
#Указываем более низкий приоритет, чем у основного сервера. По умолчанию приоритет 1. Чем меньше значение, тем приоритетнее сервер.
vesbc(config-radius-server)# priority 100
vesbc(config-radius-server)# exit

3. Настроить RADIUS-профиль RP_USERS:

vesbc(config)# esbc
vesbc(config-esbc)# radius profile RP_USERS 
#Указываем два RADIUS-сервера
vesbc(config-radius-profile)# radius-server host 192.168.113.200
vesbc(config-radius-profile)# radius-server host 192.168.113.201
#Указываем режим работы digest-аутентификации
vesbc(config-radius-profile)# auth digest rfc5090_no_chlng 
vesbc(config-radius-profile)# exit

4. Настроить AAA-профиль AAA_USERS:

vesbc(config-esbc)# aaa profile AAA_USERS 
#Указываем RADIUS-профиль
vesbc(config-aaa-profile)# auth radius profile RP_USERS
vesbc(config-aaa-profile)# exit

5. Использовать AAA-профиль AAA_USERS в настройках абонентского интерфейса USERS_VIA_RADIUS: 

vesbc(config-esbc)# user-interface sip USERS_VIA_RADIUS 
vesbc(config-esbc-user-interface-sip)# aaa profile AAA_USERS
vesbc(config-esbc-user-interface-sip)# exit
vesbc(config-esbc)# exit
vesbc(config)# exit
#Применяем и сохраняем все настройки 
vesbc# commit
vesbc# confirm

При получении сообщений REGISTER на абонентский интерфейс USERS_VIA_RADIUS, ESBC будет отправлять абоненту параметры для digest-аутентификации в сообщении 401 Unauthorized, далее эти параметры и digest response, полученный от абонента, будет передаваться на RADIUS-сервер 192.168.113.200 в сообщении Access-Request.

 При получении от сервера Access-Accept, сообщение REGISTER от абонента будет направлено на вышестоящий SIP-сервер:

При получении Access-Reject, будет отправлено сообщение 403 Forbidden:



При недоступности RADIUS-сервера 192.168.113.200, после таймаута будет отправлено сообщение Access-Request на резервный RADIUS-сервер 192.168.113.201:


Настройка локальной аутентификации запросов

Локальная аутентификация на ESBC используется для аутентификации клиентов, используя учётные данные, привязанные к транку ESBC. 

Алгоритм настройки транка для работы функции:

  1. Добавить аутентификационные данные в профиль учётных данных.
  2. Привязать профиль учётных данных к AAA-профилю.
  3. Добавить правило выбора SIP-метода запроса, при совпадении с которым будет использоваться локальная аутентификация. Поддержана обработка 401 и 407 ответов на запросы : INVITE, REGISTER, UPDATE, INFO, REFER. При создании шаблона можно использовать регулярные выражения PCRE.

    По умолчанию установлено правило выбора метода REGISTER. 

  4. Привязать AAA-профиль к транку.

Если на отправленный запрос придёт ответ с требованием аутентификации, то ESBC обработает его и самостоятельно переотправит изначальный запрос на сервер вместе с аутентификационными данными.

Если в профиле учётных данных не будет подходящего номера, то ESBC перешлёт 401/407 ответ на первое плечо.

Схема работы:

Пример настройки локальной аутентификации абонента:

Задача:

Настроить локальную аутентификацию абонента с номером 100, логином 100 и паролем PASSWORD. При этом Softswitch запрашивает аутентификацию на запросы REGISTER и INVITE.

Решение:

Порядок конфигурирования ESBC:

1. Настроить IP-адрес на интерфейсе в сторону SSW:

vesbc#
vesbc# configure
vesbc(config)# interface gigabitethernet 1/0/1
vesbc(config-if-gi)# description "SSW"
vesbc(config-if-gi)# ip address 192.168.16.113/24
vesbc(config-if-gi)# ip firewall disable

2. Настроить IP-адрес на внешнем интерфейсе в сторону абонентов:

vesbc# configure
vesbc(config)# interface gigabitethernet 1/0/2
vesbc(config-if-gi)# description "ABONENTS"
vesbc(config-if-gi)# ip address 192.168.20.120/24

3. Создать SIP-транспорт в сторону SSW: 

vesbc#
vesbc# configure
vesbc(config)# esbc
vesbc(config-esbc)# sip transport TRANSPORT_SSW
vesbc(config-esbc-sip-transport)# ip address 192.168.16.113
vesbc(config-esbc-sip-transport)# port 5061

4. Создать SIP-транспорт в сторону абонентов:

vesbc#
vesbc# configure
vesbc(config)# esbc
vesbc(config-esbc)# sip transport TRANSPORT_ABONENTS
vesbc(config-esbc-sip-transport)# ip address 192.168.20.120
vesbc(config-esbc-sip-transport)# port 5062

5. Создать медиаресурсы для согласования и передачи голоса на плече ESBC — SSW:

vesbc#
vesbc# configure
vesbc(config)# esbc
vesbc(config-esbc)# media resource MEDIA_SSW
vesbc(config-esbc-media-resource)# ip address 192.168.16.113

#Указать диапазон портов, который будет выделяться на ESBC для передачи голоса. Данная команда необязательная. Если ее не указывать, будет использоваться диапазон портов 8000–65535. 
vesbc(config-esbc-media-resource)# port-range 1024-65535

6. Создать медиаресурсы для согласования и передачи голоса на плече ESBC  —  Абонентский шлюз/SIP-абоненты:

vesbc#
vesbc# configure
vesbc(config)# esbc
vesbc(config-esbc)# media resource MEDIA_ABONENTS
vesbc(config-esbc-media-resource)# ip address 192.168.20.120

7. Создать профиль учётных данных с аутентификационными данными клиента:

vesbc#
vesbc# config
vesbc(config)# esbc
vesbc(config-esbc)# credential profile CREDENTIAL_PROFILE
vesbc(esbc-credential-profile)# number 100
vesbc(esbc-credential-profile-cred)# login 100
vesbc(esbc-credential-profile-cred)# password PASSWORD

8. Создать ААА профиль с созданным профилем учётных данных и шаблоном выбора обрабатываемых методов:

vesbc#
vesbc# config
vesbc(config)# esbc
vesbc(config-esbc)# aaa profile AAA_PROFILE
vesbc(config-aaa-profile)# credential local profile CREDENTIAL_PROFILE
vesbc(config-aaa-profile)# credential method-pattern INVITE|REGISTER
Регулярное выражение для credential method-pattern применяется с логикой полного совпадения(exact match). Например, необходимо написать шаблон, который будет соответствовать методу "INVITE". В данном случае шаблон "INV.*" будет корректным, а шаблон "INV" - нет.

9. Создать SIP-транк в сторону SSW и добавить в него настроенный ААА профиль:

vesbc#
vesbc# configure
vesbc(config)# esbc
vesbc(config-esbc)# trunk sip TRUNK_SSW
vesbc(config-esbc-trunk-sip)# sip transport TRANSPORT_SSW
vesbc(config-esbc-trunk-sip)# aaa profile AAA_PROFILE
vesbc(config-esbc-trunk-sip)# remote address 192.168.16.65
vesbc(config-esbc-trunk-sip)# remote port 5060
vesbc(config-esbc-trunk-sip)# media resource 0 MEDIA_SSW

10. Создать таблицу маршрутизации и добавить туда правила, по которым вызовы, приходящие с абонентов, будут маршрутизироваться на SSW: 

vesbc# 
vesbc# configure 
vesbc(config)# esbc 
vesbc(config-esbc)# route-table TO_SSW
vesbc(config-esbc-route-table)# rule 0
vesbc(config-esbc-route-table-rule)# action direct-to-trunk TRUNK_SSW

11. Создать абонентский интерфейс в сторону абонентов и привязать к нему созданную таблицу маршрутизации:

vesbc#
vesbc# configure
vesbc(config)# esbc
vesbc(config-esbc)# user-interface sip ABONENTS
vesbc(config-esbc-user-interface-sip)# sip transport TRANSPORT_ABONENTS
vesbc(config-esbc-user-interface-sip)# media resource 0 MEDIA_ABONENTS
vesbc(config-esbc-user-interface-sip)# route-table TO_SSW

#Если абоненты находятся за NAT, выполнить команду:
vesbc(config-esbc-user-interface-sip)# nat comedia-mode on

12. Применить конфигурацию и подтвердить изменения:

vesbc# commit
vesbc# confirm

Теперь при регистрации этого абонента, если с Softswitch придёт 401 ответ, то ESBC локально его обработает и отправит новый запрос регистрации с аутентификационными данными из профиля учётных данных. То же самое произойдет при вызове.

Пример работы:

Настройка клиентской регистрации транка

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

  1. Исходящие вызовы с зарегистрированных номеров на любые.
  2. Входящие вызовы с любых номеров на зарегистрированные.

При отсутствии регистраций направление будет считаться недоступным. 

Схема работы:

Алгоритм настройки транка для работы функции:

  1. Добавить аутентификационные данные в профиль учётных данных.
  2. Привязать профиль учётных данных к AAA-профилю.
  3. Привязать AAA-профиль к транку.
  4. Включить клиентский режим работы регистрации транка.

ESBC начнёт самостоятельно отправлять запросы регистрации, используя данные из привязаного профиля учётных данных.

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

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

Пример настройки клиентской регистрации транка:

Задача:

Настроить связь между Softswitch и IP-АТС провайдера через ESBC. При этом провайдер выдал аутентификационые данные: номер 100, логин 100, пароль PASSWORD, домен DOMAIN.loc. 

Для решения задачи на ESBC нужно настроить транк для Softswitch и транк с  клиентской регистрацией для IP-ATC провайдера.   

Решение:

Порядок конфигурирования ESBC:

1. Настроить IP-адрес на внешнем интерфейсе в сторону IP-ATC провайдера:

vesbc#
vesbc# configure
vesbc(config)# interface gigabitethernet 1/0/1
vesbc(config-if-gi)# description "IP"
vesbc(config-if-gi)# ip address 192.168.16.113/24

2. Настроить IP-адрес на интерфейсе в сторону SSW:

vesbc# configure
vesbc(config)# interface gigabitethernet 1/0/2
vesbc(config-if-gi)# description "SSW"
vesbc(config-if-gi)# ip address 192.168.20.120/24
vesbc(config-if-gi)# ip firewall disable

3. Создать SIP-транспорт в сторону сервера регистрации провайдера: 

vesbc#
vesbc# configure
vesbc(config)# esbc
vesbc(config-esbc)# sip transport TRANSPORT_IP
vesbc(config-esbc-sip-transport)# ip address 192.168.16.113
vesbc(config-esbc-sip-transport)# port 5061

4. Создать SIP-транспорт в сторону SSW:

vesbc#
vesbc# configure
vesbc(config)# esbc
vesbc(config-esbc)# sip transport TRANSPORT_SSW
vesbc(config-esbc-sip-transport)# ip address 192.168.20.120
vesbc(config-esbc-sip-transport)# port 5062

5. Создать медиаресурсы для согласования и передачи голоса на плече ESBC — IP-ATC:

vesbc#
vesbc# configure
vesbc(config)# esbc
vesbc(config-esbc)# media resource MEDIA_IP
vesbc(config-esbc-media-resource)# ip address 192.168.16.113

#Указать диапазон портов, который будет выделяться на ESBC для передачи голоса. Данная команда необязательная. Если ее не указывать, будет использоваться диапазон портов 8000–65535. 
vesbc(config-esbc-media-resource)# port-range 1024-65535

6. Создать медиаресурсы для согласования и передачи голоса на плече ESBC — SSW:

vesbc#
vesbc# configure
vesbc(config)# esbc
vesbc(config-esbc)# media resource MEDIA_SSW
vesbc(config-esbc-media-resource)# ip address 192.168.20.120

7. Создать профиль учётных данных с аутентификационными данными транка:

vesbc#
vesbc# config
vesbc(config)# esbc
vesbc(config-esbc)# credential profile CREDENTIAL_PROFILE
vesbc(esbc-credential-profile)# number 100
vesbc(esbc-credential-profile-cred)# login 100
vesbc(esbc-credential-profile-cred)# password PASSWORD

Подробное описание команд настройки профиля учётных данных на ESBC представлено в настройках профиля учетных данных в CLI.

В один профиль можно добавить до 2500 номеров.

8. Создать ААА профиль с созданным профилем учётных данных:

vesbc#
vesbc# config
vesbc(config)# esbc
vesbc(config-esbc)# aaa profile AAA_PROFILE
vesbc(config-aaa-profile)# credential local profile CREDENTIAL_PROFILE

9. Создать SIP-транк в сторону IP-ATC и привязать к нему настроенный ААА профиль, а также выданный провайдером домен: 

vesbc#
vesbc# configure
vesbc(config)# esbc
vesbc(config-esbc)# trunk sip TRUNK_IP
vesbc(config-esbc-trunk-sip)# sip transport TRANSPORT_IP
vesbc(config-esbc-trunk-sip)# aaa profile AAA_PROFILE
vesbc(config-esbc-trunk-sip)# remote address 192.168.16.65
vesbc(config-esbc-trunk-sip)# remote port 5060
vesbc(config-esbc-trunk-sip)# media resource 0 MEDIA_IP
vesbc(config-esbc-trunk-sip)# domain DOMAIN.loc

10. Создать SIP-транк в сторону SSW:

vesbc#
vesbc# configure
vesbc(config)# esbc
vesbc(config-esbc)# trunk sip TRUNK_SSW
vesbc(config-esbc-trunk-sip)# sip transport TRANSPORT_SSW
vesbc(config-esbc-trunk-sip)# remote address 192.168.20.50
vesbc(config-esbc-trunk-sip)# remote port 5060
vesbc(config-esbc-trunk-sip)# media resource 0 MEDIA_SSW

11. Создать таблицу маршрутизации и добавить в нее правила, по которым вызовы, приходящие с SSW, будут маршрутизироваться на IP-ATC: 

vesbc# 
vesbc# configure 
vesbc(config)# esbc 
vesbc(config-esbc)# route-table TO_IP
vesbc(config-esbc-route-table)# rule 0
vesbc(config-esbc-route-table-rule)# action direct-to-trunk TRUNK_IP

12. Привязать созданную таблицу маршрутизации к транку смотрящему в сторону SSW:

vesbc#
vesbc# configure
vesbc(config)# esbc
vesbc(config-esbc)# trunk sip TRUNK_SSW
vesbc(config-esbc-trunk-sip)# route-table TO_IP

13. Создать таблицу маршрутизации и добавить в нее правила, по которым вызовы, приходящие с IP-ATC, будут маршрутизироваться на SSW: 

vesbc# 
vesbc# configure 
vesbc(config)# esbc 
vesbc(config-esbc)# route-table TO_SSW
vesbc(config-esbc-route-table)# rule 0
vesbc(config-esbc-route-table-rule)# action direct-to-trunk TRUNK_SSW

14. Привязать созданную таблицу маршрутизации к транку, смотрящему в сторону IP-ATC:

vesbc#
vesbc# configure
vesbc(config)# esbc
vesbc(config-esbc)# trunk sip TRUNK_IP
vesbc(config-esbc-trunk-sip)# route-table TO_SSW

15. На транке, смотрящем на IP-ATC, задать параметры регистрации и включить клиентскую регистрацию: 

vesbc#
vesbc# configure
vesbc(config)# esbc 
vesbc(config-esbc)# trunk sip TRUNK_IP

#Выбираем время, на которое будет регистрироваться транк (по умолчанию 3600 секунд):
vesbc(config-esbc-trunk-sip)# registration expires 900

#Выбираем время, через которое начнётся повторная отправка регистрации после неудачной попытки (по умолчанию 60 секунд):
vesbc(config-esbc-trunk-sip)# registration retry-after 40

#Включаем режим клиентской регистрации на транке:
vesbc(config-esbc-trunk-sip)# registration mode client 

16. Применить конфигурацию и подтвердить изменения:

vesbc# commit
vesbc# confirm

17. Посмотреть активные регистрации транка можно командой show esbc trunks:

vesbc# show esbc trunks sip TRUNK_IP registration 

Registration type: Client
Total registrations: 1
Active registrations: 1
AOR              Contact                          Status           Expires    Expires in
--------------   ------------------------------   --------------   --------   ----------
100@DOMAIN.loc   sip:100@192.168.16.113:5061      Registered       900       867          

После применения конфигрурации с транка отправится запрос регистрации (REGISTER) на IP-ATC провайдера. Если придёт ответ, требующий аутентификацию (401,407), то ESBC использует локальную аутентификацию запросов и ответит на него, используя данные из профиля учётных данных. После успешной регистрации транка, исходящие вызовы с него возможны на любые номера только с зарегистрированного номера. Входящие вызовы будут обработаны с любого номера только на зарегистрированный номер. 

Пример работы:

Настройка NAT

NAT (Network Address Translation — «преобразование сетевых адресов») —  это технология, которая позволяет преобразовывать локальные IP-адреса внутренней сети в один или несколько глобальных IP-адресов и обратно. NAT обеспечивает механизм подключения областей с приватными адресами к внешним областям, в которых используются уникальные в глобальном масштабе зарегистрированные адреса. Кроме того, NAT осуществляет преобразование портов — то есть меняет номера портов в пакетах данных, что помогает однозначно сопоставлять исходящие и входящие соединения. 

В данном разделе будут описаны различные функции для работы с NAT, а также настройки ESBC для его обхода, такие как:

  1. Настройка NAT comedia-mode для прохождения медиатрафика через устройства NAT;
  2. Настройка Public-IP;
  3. Настройка внешнего STUN-сервера;
  4. Настройка локального STUN-сервера.

Настройка NAT comedia-mode

С целью преодоления соединений через устройства NAT, в ESBC реализована поддержка nat comedia-mode для транков и абонентских интерфейсов.

Механизм NAT comedia-mode используется в том случае, когда встречное устройство находится за NAT.

Настройка и принцип работы nat comedia-mode для транков (trunk)

Включение режима nat comedia-mode осуществляется в настройках транка:

vesbc# configure 
vesbc(config)# esbc 
vesbc(config-esbc)# trunk sip 
vesbc(config-esbc-trunk-sip)# nat comedia-mode 
    Select NAT comedia mode for trunk:
        off
        on
        flexible

vesbc(config-esbc-trunk-sip)# nat comedia-mode on

Реализована работа в двух режимах:

Принцип работы

При включении режима nat comedia-mode on/flexible отправка и получение сообщений сигнализации SIP осуществляется с/на IP-адрес и порт, указанные в настройках транка.

Оправка RTP будет осуществляться на IP-адрес и порт, с которого был получен первый RTP-пакет от встречной стороны. До получения RTP от встречной стороны, медиатрафик не будет передаваться от ESBC в эту сторону. 

Настройка и принцип работы nat comedia-mode для абонентов (user-interface)

Включение режима nat comedia-mode осуществляется в настройках абонентского интерфейса:

vesbc# 
vesbc# configure 
vesbc(config)# esbc 
vesbc(config-esbc)# user-interface sip USERS
vesbc(config-esbc-user-interface-sip)# nat comedia-mode 
    Select NAT comedia mode for user-interface:
        off
        on
        flexible
vesbc(config-esbc-user-interface-sip)# nat comedia-mode on

Реализована работа в двух режимах:

Принцип работы.

При включении режима nat comedia-mode on/flexible отправка сообщений сигнализации SIP осуществляется симметрично (на IP-адрес и порт, с которого был принят запрос) в случае, если клиент в инициирующем запросе не использовал параметр RPORT. 

Отправка сообщений сигнализации SIP на зарегистрированного абонента будет осуществляться на IP-адрес и порт, с которого был принят запрос REGISTER, а не на данные абонента, указанные в заголовке Contact.

Оправка RTP будет осуществляться на IP-адрес и порт, с которого был получен первый RTP-пакет от встречной стороны. До получения RTP от встречной стороны, медиатрафик не будет передаваться от ESBC в эту сторону.

Команда nat keep-alive-interval в настройках абонентского интерфейса используется для настройки интервала для поддержки соединения за NAT. При включении опции, абоненту с заданным интервалом будут отправляться пакеты с содержанием "0d0a" для предотвращения разрушения сессии на NAT-маршрутизаторе.

Подмена атрибутов direction в SDP

При включении опции nat comedia-mode атрибут direction sendonly в SDP при отправке offer/answer sdp заменяются на sendrecv.

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

Примеры:

1. Замена атрибутов direction в offer sdp:


2. Замена атрибутов direction в answer sdp:

Настройка Public IP

Public IP (рус. «публичный IP-адрес») — это внешний IP-адрес, который используется при отправке запросов пользователю или удаленному адресу из внешней сети.

Настройка используется в случае, когда ESBC не имеет публичного IP-адреса и выход в публичную сеть осуществляется через NAT. В таком случае в качестве Public IP указывается адрес WAN-интерфейса NAT для подстановки в сигнальные сообщения протокола SIP.

Public IP можно настроить для абонентского интерфейса, транка и транковой группы. 

Если Public IP настроен в транке и в транковой группе, в которую входит этот транк, то будет использоваться Public IP из настроек транка.

В качестве публичного адреса можно использовать как IPv4, так и IPv6 (не поддерживается в текущей версии ПО) адрес.

При наличии Public IP, адреса в SDP, заголовках Via и Contact будут заменены на значение public-ip из конфигурации объекта. Media будет работать в режиме NAT-comedia.

Если на направлении настроен Public IP и внешний STUN-сервер, то в качестве публичного будет использоваться адрес, полученный от STUN-сервера

Для корректной работы опции Public IP необходимо организовать проброс портов для сигнализации SIP и медиапортов RTP на вышестоящем устройстве NAT "один к одному".

Пример настройки Public IP для транка:

#Настройка SIP-транспорта для транка:
vesbc# configure 
vesbc(config)# esbc 
vesbc(config-esbc)# sip transport TRUNK_TRANSPORT
vesbc(config-esbc-sip-transport)# ip address 192.168.1.1
vesbc(config-esbc-sip-transport)# exit

#Настройка медиаресурсов для транка:
vesbc(config-esbc)# media resource TRUNK_MEDIA
vesbc(config-esbc-media-resource)# ip address 192.168.1.1
vesbc(config-esbc-media-resource)# exit

#Настройка параметров транка:
vesbc(config-esbc)# trunk sip TRUNK_PUBLIC_IP
vesbc(config-esbc-trunk-sip)# sip transport TRUNK_TRANSPORT
vesbc(config-esbc-trunk-sip)# media resource 0 TRUNK_MEDIA
vesbc(config-esbc-trunk-sip)# remote address 192.168.1.3
vesbc(config-esbc-trunk-sip)# remote port 5060
vesbc(config-esbc-trunk-sip)# public-ip 10.25.0.1

#Применение и подтверждение изменений:
vesbc(config-esbc-trunk-sip)# do commit 
Configuration has been successfully applied and saved to flash. Commit timer started, changes will be reverted in 600 seconds.
vesbc(config-esbc-trunk-sip)# do confirm
Configuration has been confirmed. Commit timer canceled.

Пример использования Public IP:

ESBC получает сообщение, которое должно быть смаршрутизировано в транк TRUNK_PUBLIC_IP: 

INVITE sip:23002@192.168.1.1:5060 SIP/2.0
Via: SIP/2.0/UDP 192.168.1.4:5061;rport;branch=z9hG4bK-1914230-1-1
From: "24001" <sip:24001@192.168.1.4:5061>;tag=1
To: "23002" <sip:23002@192.168.1.1:5060>
Call-ID: 1-1914230@192.168.1.4
Cseq: 1 INVITE
Contact: <sip:24001@192.168.1.4:5061>
Max-Forwards: 70
Allow: INVITE, ACK, BYE, CANCEL
Content-Type: application/sdp
Content-Length: 138

Session Description Protocol Version (v): 0
Owner/Creator, Session Id (o): user1 77755765 7773687637 IN IP4 192.168.1.4
Session Name (s): -
Time Description, active time (t): 0 0
Connection Information (c): IN IP4 192.168.1.4
Media Description, name and address (m): audio 10000 RTP/AVP 8
Media Attribute (a): rtpmap:8 PCMA/8000

ESBC пересылает INVITE через транк TRUNK_PUBLIC_IP на встречное устройство.
В SDP, Via и Contact вместо адреса используемого SIP-транспорта (192.168.1.1) указывается адрес Public IP транка (10.25.0.1): 

INVITE sip:23002@192.168.1.3:5060 SIP/2.0
Via: SIP/2.0/UDP 10.25.0.1:5060;rport;branch=z9hG4bKPj6e357f04-e13e-4ead-8386-2246d12450b4
Max-Forwards: 70
From: "24001" <sip:24001@192.168.1.1>;tag=76776c9a-022b-4ccf-9458-e83e2701f6c8
To: "23002" <sip:23002@192.168.1.3>
Contact: <sip:24001@10.25.0.1:5060;transport=udp>
Call-ID: 5fc229f6657d7706f2b6c81a44a5b10e
CSeq: 28491 INVITE
Allow: INVITE, ACK, BYE, CANCEL
Supported: 100rel, replaces, ice 
Content-Type: application/sdp
Content-Length:   135

Session Description Protocol Version (v): 0
Owner/Creator, Session Id (o): user1 77755765 7773687637 IN IP4 10.25.0.1
Session Name (s): -
Time Description, active time (t): 0 0
Connection Information (c): IN IP4 10.25.0.1
Media Description, name and address (m): audio 10000 RTP/AVP 8
Media Attribute (a): rtpmap:8 PCMA/8000

Настройка STUN

STUN – сетевой протокол, позволяющий клиенту, находящемуся за NAT, определить свой публичный (внешний) IP-адрес и порт для обеспечения установления и корректной передачи медиатрафика через NAT. Применяется в механизмах обхода NAT (например, ICE) для установления прямых медиасоединений.

ESBC поддерживает STUN в двух режимах работы:

Настройка внешнего STUN-сервера

ESBC поддерживает взаимодействие с внешними STUN-серверами для определения собственного публичного адреса (например, если ESBC находится в частной сети за NAT-устройством). ESBC отправляет STUN Binding Request на указанный сервер и использует полученный в ответе IP-адрес и порт в качестве публичного, подставляя его в сигнальные сообщения протокола SIP. Для получения портов для RTP/RTCP также будут отправляться STUN Binding Request в момент установления вызова.

По умолчанию ESBC взаимодействует с внешними STUN-серверами в режиме согласно RFC 3489 (Simple Traversal of UDP through NATs или "classic STUN") – использует в качестве публичного адреса и порта значения, полученные в атрибуте MAPPED-ADDRESS в Binding Response от STUN-сервера.
Доступна поддержка RFC 5389 (Session Traversal Utilities for NAT) – в этом случае ESBC в Binding Request на STUN-сервер будет отправлять Cookie, с помощью которого сервер зашифрует адрес и порт и передаст их в Binding Response в атрибуте XOR-MAPPED-ADDRESS, ESBC дешифрует полученные данные и использует в качестве публичного адреса и порта. 

Доступна настройка интервала отправки запросов на внешний STUN-сервер.

Внешний STUN-сервер можно использовать в настройках абонентского интерфейса, транка и транковой группы.

Если STUN-сервер настроен в транке и в транковой группе, в которую входит этот транк, то будет использоваться STUN-сервер из настроек транка.

Если на каком-либо направлении настроено получение публичного адреса через внешний STUN-сервер и этот сервер недоступен, то:

Подробное описание команд настройки внешних STUN-серверов на ESBC представлено в разделе Настройки STUN Cправочника команд CLI.

Пример настройки ESBC для взаимодействия со STUN-сервером:

Схема:

ESBC находится в частной сети за NAT устройством, настроены 2 транка — TRUNK_A (в той же сети, что и ESBC) и TRUNK_B (в публичной сети), настроена маршрутизация между ними, адрес WAN-интерфейса NAT-устройства неизвестен. В публичной сети находится STUN-сервер. Необходимо настроить получение публичного адреса через STUN-сервер для вызовов, направленных в TRUNK_B. 

#Настройка внешнего STUN-сервера:
vesbc# configure 
vesbc(config)# esbc 
vesbc(config-esbc)# stun server external EXTERNAL_STUN
vesbc(config-esbc-stun-server-ext)# remote address 203.0.113.10

#Интервал отправки запросов на STUN-сервер = 60 секунд:
vesbc(config-esbc-stun-server-ext)# keepalive interval 60
vesbc(config-esbc-stun-server-ext)# exit

#Добавление STUN-сервера в настройки транка:
vesbc(config-esbc)# trunk sip TRUNK_B
vesbc(config-esbc-trunk-sip)# stun server EXTERNAL_STUN

#Применение и подтверждение изменений:
vesbc(config-esbc-stun-trunk-sip)# do commit
Configuration has been successfully applied and saved to flash. Commit timer started, changes will be reverted in 600 seconds.
vesbc(config-esbc-stun-trunk-sip)# do confirm
Configuration has been confirmed. Commit timer canceled

После успешного применения конфигурации ESBC начнёт каждые 60 секунд отправлять Binding Request на STUN-сервер с порта, который указан в привязанном к транку TRUNK_B SIP-транспорте, полученный в ответе адрес и порт будет использоваться в SIP-сообщениях на плече ESBC–TRUNK_B.

При исходящем вызове в транк TRUNK_B ESBC отправит запросы на STUN-сервер с RTP и RTCP-порта для согласования обмена медиатрафиком.

При входящем вызове из транка TRUNK_B ESBC также отправит запросы на STUN-сервер с RTP и RTCP-порта для согласования обмена медиатрафиком перед отправкой SDP-Answer инициатору. 


Настройка локального STUN-сервера

ESBC может функционировать в качестве STUN-сервера для абонентов, находящихся за NAT. Для этого на ESBC настраиваются локальные STUN-серверы (до 64 шт.). 

При получении STUN Binding Request, ESBC формирует Binding Success Response, содержащий IP-адрес и порт, с которого данный запрос был получен. Этот адрес называется Reflexive Address и может использоваться клиентом для корректного формирования SIP-сообщений, SDP и обеспечения прохождения медиатрафика (RTP) через NAT. 

Поддерживается работа протокола STUN в режимах Classic STUN (RFC 3489) и cовременный STUN (RFC 5389+).

Подробное описание команд настройки локальных STUN-серверов на ESBC представлено в разделе Настройки STUN Cправочника команд CLI.

Пример настройки локального STUN-сервера в конфигурации:

vesbc# configure 
vesbc(config)# esbc 
vesbc(config-esbc)# stun server local LOCAL_STUN
vesbc(config-esbc-stun-server-loc)# ip address 30.30.30.1 
vesbc(config-esbc-stun-server-loc)# port 13478
vesbc(config-esbc-stun-server-loc)#

#Применение и подтверждение изменений:
vesbc(config-esbc-stun-server-loc)# do commit
Configuration has been successfully applied and saved to flash. Commit timer started, changes will be reverted in 600 seconds.
vesbc(config-esbc-stun-server-loc)# do confirm
Configuration has been confirmed. Commit timer canceled

После описанной выше настройки ESBC будет принимать сообщения STUN на IP-адрес 30.30.30.1 и порт UDP 13478. 

При использовании в конфигурации ESBC локального STUN-сервера не требуется дополнительной настройки firewall, необходимые правила для пропуска входящих STUN-запросов будут настроены автоматически.



Когда абонент, находящийся за NAT, отправит STUN-запрос, который будет получен ESBC с адреса 20.20.20.1:15060 на адрес ESBC и порт локального STUN-сервера (30.30.30.1:13478), в ответе ESBC укажет 20.20.20.1:15060 в качестве Reflexive Address. 

Настройка QoS

QoS (Quality of Service, рус. «качество обслуживания») — технология предоставления различным классам данных различных приоритетов в обслуживании.

Приоритет определяется значением DSCP (0-63) в поле IP-заголовка DS.

Установить необходимое значение DS можно отдельно для:

Параметры QoS настраиваются в конфигурации абонентского интерфейса, транка и транковой группы.

Если QoS настроен для транка и для транковой группы, в которую входит этот транк, то будет использоваться QoS из настроек транка.

Пример настройки QoS для аудиотрафика в конфигурации абонентского интерфейса:

vesbc# configure 
vesbc(config)# esbc  
vesbc(config-esbc)# user-interface sip ABONENT_QOS_50
vesbc(config-esbc-user-interface-sip)# sip transport ABONENT_TRANSPORT
vesbc(config-esbc-user-interface-sip)# media resource 0 ABONENT_MEDIA
vesbc(config-esbc-user-interface-sip)# route-table TO_SSW
vesbc(config-esbc-user-interface-sip)# dscp audio 50

#Применение и подтверждение изменений:
vesbc(config-esbc-user-interface-sip)# do commit 
Configuration has been successfully applied and saved to flash. Commit timer started, changes will be reverted in 600 seconds.
vesbc(config-esbc-user-interface-sip)# do confirm
Configuration has been confirmed. Commit timer canceled.

В исходящем аудиотрафике абонентам, зарегистрированным через интерфейс ABONENT_QOS_50, поле DS в IP-пакете будет выглядеть следующим образом:

Differentiated Services Field: 0xc8 (DSCP: Unknown, ECN: Not-ECT)
    1100 10.. = Differentiated Services Codepoint: Unknown (50)
    .... ..00 = Explicit Congestion Notification: Not ECN-Capable Transport (0)

Контроль трафика

Контроль входящего трафика

На ESBC реализован контроль интенсивности входящего трафика для:

Описание всех команд для контроля входящего трафика приведено в разделах для каждого объекта в CLI:

  1. general;

  2. trunk;
  3. trunk-group;
  4. user-interface.

Реализация ограничения входящего трафика поддерживается для следующих объектов:

max in ...

Для всей системы

(general)

Транков

(trunk)

Транк-групп

(trunk-group)

Абонентских интерфейсов

(user-interface)

calls

(отметить)

(отметить)

(отметить)(отметить)
cps(отметить)(отметить)(отметить)(отметить)
regps(отметить)(ошибка)(ошибка)(отметить)
rps(отметить)(отметить)(отметить)(отметить)
session pps(отметить)(отметить)(отметить)(отметить)
subps(отметить)(отметить)(отметить)(отметить)
subscriptions(отметить)(отметить)(отметить)(отметить)
user rpp(отметить)(ошибка)(ошибка)(отметить)
user contacts(ошибка)(ошибка)(ошибка)(отметить)


Ограничения max in user rpp и max in session pps - указанные в разделе general будут применяться для каждого объекта (зарегистрированного абонента, установленной сессии) системы независимо. Таким образом, например при настройке max in user rpp 100 60, ограничение в 100 запросов за 60 секунд будет применяться к каждому зарегистрированному абоненту.

Приоритет использования данных ограничений:
1) если в настройках абонентского интерфейса (UI) не указано ограничение max in user rpp/max in session pps, то будут использоваться значения указанные в настройке системы (General)
2) значения max in user rpp/max in session pps в настройках абонентского интерфейса (UI) могут быть больше чем значения указанные в настройке системы (General). В таком случае для всех абонентов, зарегистрированных через даннный абонентский интерфейс будут использоваться ограничения указанные в его настройках.

Все остальные ограничения - являются глобальными и устанавливают ограничения на всю систему. Поэтому ограничения для отделных объектов системы (транков, транковых групп, абонентских интерфейсов) не могут превышать общесистемные.

Приоритет использования ограничений:

  1. Ограничения для всей системы. Настройки ограничений general переопределяют настройки ограничений остальных объектов (trunk, trunk-group, user-interface) ESBC. 
  2. Ограничения для транк-группы. Настройки ограничений trunk-group переопределяют настройки ограничений транков, входящих в данную транк-группу, но переопределяются настройками general.
  3. Ограничения для транков и абонентских интерфейсов. Настройки ограничений trunk переопределяются настройками ограничений транк-группы (если транк входит в состав какой-либо транк-группы) или настройками general. Настройки ограничений user-interface переопределяются настройками general. 

Приоритет использования ограничений распространяется только для максимальных значений, т. е. например, при использовании max in cps 100 для всей системы (general), и использовании max in cps 10 для какого-либо транка, ограничение обработки CPS для этого транка будет 10, а не 100.

При одновременном использовании max in cps и max in rps в настройках транка, транковой группы или абонентского интерфейса, максимальным порогом для всех входящих запросов будет являться значение, настроенное в max in rps. При этом ограничение для входящих запросов INVITE можно уменьшить отдельно настройкой max in cps.

Пример:

  1. В конфигурации настроено max in cps 10 и max in rps 5. В таком случае максимальное ограничение на входящие вызовы (INVITE) будет 5.
  2. В конфигурации настроено max in cps 5 и max in rps 10. В таком случае максимальное ограничение на входящие вызовы будет 5, а на остальные запросы — 10.


Пример работы приоритета системных ограничений над абонентским интерфейсом:

vesbc#
vesbc# config 
vesbc(config)# esbc 

#Переход в общие настройки:
vesbc(config-esbc)# general 
vesbc(config-esbc-general)# 

#Установка ограничения входящего максимального количества CPS для всей системы — 5:
vesbc(config-esbc-general)# max in cps 5
vesbc(config-esbc-general)# exit

#Установка ограничения максимального входящего количества CPS для отдельного абонентского интерфейса (USER_IFACE) — 10:
vesbc(config-esbc)# user-interface sip USER_IFACE 
vesbc(config-esbc-user-interface-sip)# max in cps 10

#Применение и подтверждение изменений:
vesbc(config-esbc-user-interface-sip)# do commit 
vesbc(config-esbc-user-interface-sip)# do confirm 

В данном случае не будет обрабатываться более 5 вызовов в секунду, приходящих на абонентский интерфейс USER_IFACE, так как у общесистемных ограничений приоритет выше.

Пример работы приоритета ограничений транк-группы над ограничениями транка, входящего в эту транк-группу:

vesbc#
vesbc# config 
vesbc(config)# esbc 

#Переход в настройки транка:
vesbc(config-esbc)# trunk sip TRUNK
vesbc(config-esbc-trunk-sip)# 

#Установка ограничения входящего максимального количества CPS для транка — 50:
vesbc(config-esbc-trunk-sip)# max in cps 50
vesbc(config-esbc-trunk-sip)# exit

#Переход в настройки транк-группы:
vesbc(config-esbc)# trunk-group TRUNKGROUP

# Добавление транка TRUNK в состав транк-группы:
vesbc(config-esbc-trunk-group)# trunk 0 TRUNK

#Установка ограничения входящего максимального количества CPS для транк-группы — 10:
vesbc(config-esbc-trunk-group)# max in cps 10

#Применение и подтверждение изменений:
vesbc(config-esbc-trunk-group)# do commit 
vesbc(config-esbc-trunk-group)# do confirm 

Т. к. транк TRUNK входит в состав транк-группы TRUNKGROUP, то будет обрабатываться не более 10 входящих вызовов в секунду, поступающих в транк, так как приоритет ограничения у транк-группы выше. 

Пример работы ограничения количества одновременных вызовов на абонентском интерфейсе:

vesbc#
vesbc# config 
vesbc(config)# esbc 

#Переход в настройки абонентского интерфейса:
vesbc(config-esbc)# user-interface sip USER_IFACE
vesbc(config-esbc-user-interface)# 

#Установка ограничения максимального количества одновременных вызовов для абонентского-интерфейса — 10:
vesbc(config-esbc-user-interface-sip)# max in calls 10

#Применение и подтверждение изменений:
vesbc(config-esbc-user-interface)# do commit 
vesbc(config-esbc-user-interface)# do confirm 

После применения изменений количество одновременных вызовов, проходящих через абонентский интерфейс USER_IFACE, не может быть больше 10. Все запросы INVITE, поступающие после превышения лимита, будут проигнорированы.  

Пример работы ограничения количества вызовов в секунду на абонентском интерфейсе:

vesbc#
vesbc# config 
vesbc(config)# esbc 

#Переход в настройки абонентского интерфейса:
vesbc(config-esbc)# user-interface sip USER_IFACE
vesbc(config-esbc-user-interface)# 

#Установка ограничения входящего максимального количества CPS для абонентского-интерфейса — 10:
vesbc(config-esbc-user-interface-sip)# max in cps 10

#Применение и подтверждение изменений:
vesbc(config-esbc-user-interface)# do commit 
vesbc(config-esbc-user-interface)# do confirm 

После применения изменений количество вызовов, проходящих через абонентский интерфейс USER_IFACE в секунду, не может быть больше 10. Все запросы INVITE, поступающие после превышения лимита, будут проигнорированы.  

Пример работы ограничения количества регистраций в секунду на абонентском интерфейсе:

vesbc#
vesbc# config 
vesbc(config)# esbc 

#Переход в настройки абонентского интерфейса:
vesbc(config-esbc)# user-interface sip USER_IFACE
vesbc(config-esbc-user-interface)# 

#Ограничение максимального количества регистраций в секунду:
vesbc(config-esbc-user-interface-sip)# max in regps 15

#Применение и подтверждение изменений:
vesbc(config-esbc-user-interface)# do commit
vesbc(config-esbc-user-interface)# do confirm 

После применения изменений количество регистраций в секунду, проходящих через абонентский интерфейс USER_IFACE, не может быть больше 15. Все запросы REGISTER, поступающие после превышения лимита, будут проигнорированы.   

Пример работы ограничения количества запросов в секунду на абонентском интерфейсе:

vesbc#
vesbc# config 
vesbc(config)# esbc 

#Переход в настройки абонентского интерфейса:
vesbc(config-esbc)# user-interface sip USER_IFACE
vesbc(config-esbc-user-interface)# 

#Ограничение максимального количества запросов в секунду:
vesbc(config-esbc-user-interface-sip)# max in rps 250

#Применение и подтверждение изменений:
vesbc(config-esbc-user-interface)# do commit 
vesbc(config-esbc-user-interface)# do confirm 

После применения изменений количество запросов, проходящих через абонентский интерфейс USER_IFACE, не может быть больше 250. Все запросы (INVITE, REGISTER и прочие), поступающие после превышения лимита, будут проигнорированы.  

Пример работы ограничения количества SIP-сообщений в секунду в рамках одной сессии на абонентском интерфейсе: 

vesbc#
vesbc# config 
vesbc(config)# esbc 

#Переход в настройки абонентского интерфейса:
vesbc(config-esbc)# user-interface sip USER_IFACE
vesbc(config-esbc-user-interface)# 

#Ограничение максимального количества SIP-сообщений в секунду в рамках одной сессии в секунду:
vesbc(config-esbc-user-interface-sip)# max in session pps 30

#Применение и подтверждение изменений:
vesbc(config-esbc-user-interface)# do commit 
vesbc(config-esbc-user-interface)# do confirm 

После применения изменений количество SIP-сообщений, проходящих через абонентский интерфейс USER_IFACE в секунду, в рамках одной сессии, не может быть больше 30. При достижении лимита сессия будет завершена.

Пример работы ограничения количества подписок в секунду на абонентском интерфейсе:

vesbc#
vesbc# config 
vesbc(config)# esbc 

#Переход в настройки абонентского интерфейса:
vesbc(config-esbc)# user-interface sip USER_IFACE
vesbc(config-esbc-user-interface)# 

#Ограничение максимального количества подписок в секунду:
vesbc(config-esbc-user-interface-sip)# max in subps 50

#Применение и подтверждение изменений:
vesbc(config-esbc-user-interface)# do commit it
vesbc(config-esbc-user-interface)# do confirm 

После применения изменений количество запросов SUBSCRIBE, проходящих через абонентский интерфейс USER_IFACE, не может быть больше 50. Все запросы SUBSCRIBE, поступающие после превышения лимита, будут проигнорированы. 

Пример работы ограничения количества общего количества активных подписок на абонентском интерфейсе: 

vesbc#
vesbc# config 
vesbc(config)# esbc 

#Переход в настройки абонентского интерфейса:
vesbc(config-esbc)# user-interface sip USER_IFACE
vesbc(config-esbc-user-interface)# 

#Ограничение максимального количества активных подписок:
vesbc(config-esbc-user-interface-sip)# max in subscriptions 1000


#Применение и подтверждение изменений:
vesbc(config-esbc-user-interface)# do commit 
vesbc(config-esbc-user-interface)# do confirm 

После применения изменений количество активных подписок (у которых не истек Expires), подтвержденных через абонентский интерфейс USER_IFACE, не может превышать 1000. Все запросы SUBSCRIBE, поступающие после превышения лимита, будут проигнорированы, кроме запросов обновления подписки.

Пример работы ограничения количества запросов в интервал времени с зарегистрированного абонента на абонентском интерфейсе:

vesbc#
vesbc# config 
vesbc(config)# esbc 

#Переход в настройки абонентского интерфейса:
vesbc(config-esbc)# user-interface sip USER_IFACE
vesbc(config-esbc-user-interface)# 

#Ограничение максимального количества запросов 50:
vesbc(config-esbc-user-interface-sip)# max in user rpp 50 
  
#В интервал времени 240 секунд:
vesbc(config-esbc-user-interface-sip)# max in user rpp 50 240 
 
#С блокировкой при достижении лимитов:
vesbc(config-esbc-user-interface-sip)# max in user rpp 50 240 block

#Применение и подтверждение изменений:
vesbc(config-esbc-user-interface)# do commit 
vesbc(config-esbc-user-interface)# do confirm 

После применения изменений количество запросов с зарегистрированного пользователя, проходящих через абонентский интерфейс USER_IFACE за 240 секунд, не может превышать 50, в случае превышения лимита абонент будет заблокирован. При получении новых запросов до истечении времени прощения ("Forgive time in minutes") оно будет установлено в прежнее значение.

Просмотр списка заблокированных абонентов при превышении лимитов max in user rpp:

vesbc# show esbc black-list sip-user

SIP user black-list:
--------------------------------------------------------------------------------
AOR                    Ban reason       User        Forgive      Time of      
                                        error       time in      blocking     
                                        count       minutes                   
--------------------   --------------   ---------   ----------   ----------   
1142@192.168.113.177   TOOMANY USER     139         60           2025-11-07   
                       REQUESTS                                  04:38:05     

vesbc#

Пример работы ограничения на абонентском интерфейсе контактов на одном абоненте:

vesbc#
vesbc# config 
vesbc(config)# esbc 

#Переход в настройки абонентского интерфейса:
vesbc(config-esbc)# user-interface sip USER_IFACE
vesbc(config-esbc-user-interface)# 

#Ограничение максимального количества контактов для одного AOR:
vesbc(config-esbc-user-interface-sip)# max in user contacts 2

#Применение и подтверждение изменений:
vesbc(config-esbc-user-interface)# do commit 
vesbc(config-esbc-user-interface)# do confirm 

После применения изменений, абонентам, регистрируемым через абонентский интерфейс USER_IFACE,  будет возможно зарегистрировать только два разных контакта. При поступлении запроса REGISTER, содержащего дополнительный контакт, ESBC отклонит запрос кодом 403 Forbidden с "P-Eltex-Diagnostic: Too many registered contacts".

Контроль исходящего трафика

На ESBC реализован контроль исходящего трафика для:

Описание всех команд для контроля исходящего трафика приведено в разделах для каждого объекта в CLI:

  1. trunk;
  2. trunk-group;
  3. user-interface.

Реализация ограничения исходящего трафика поддержана на следующих объектах:

max out ...

Для всей системы

(general)

Транков

(trunk)

Транк-групп

(trunk-group)

Абонентских интерфейсов

(user-interface)

cps(ошибка)(отметить)(отметить)(отметить)
rps(ошибка)(отметить)(отметить)(отметить)
contacts(отметить)(отметить)(отметить)(ошибка)

При использовании  max out contacts будет ограничено возможное количество активных регистраций контактов на направлении. 

Ограничение max out contacts - является глобальным. Лимит ограничения из general действует на всю систему, а не используется в каждом объекте системы. Лимит этого ограничения использующий в general нельзя превысить.

При одновременном использовании max out cps и max out rps в настройках транка, транковой группы или абонентского интерфейса, максимальным порогом для всех исходящих запросов будет являться значение, настроенное в max out rps. При этом ограничение для исходящих запросов INVITE можно уменьшить отдельно настройкой max out cps.  

Пример:

  1. В конфигурации настроено max out cps 10 и max out rps 5. В таком случае максимальное ограничение на вызовы (INVITE) будет 5.
  2. В конфигурации настроено max out cps 5 и max out rps 10. В таком случае максимальное ограничение на вызовы будет 5, а на остальные запросы — 10.

При применении ограничений приоритет определяется уровнем: приоритет ограничений транк-групп выше, чем приоритет ограничений отдельных транков, входящих в эту транк-группу.

Пример приоритета ограничений транк-группы над ограничениями транков, входящих в транк-группу:

vesbc#
vesbc# config 
vesbc(config)# esbc 

#Переход в настройки транка TRUNK_1:
vesbc(config-esbc)# trunk sip TRUNK_1
vesbc(config-esbc-trunk-sip)# 

#Ограничение максимальных исходящих CPS:
vesbc(config-esbc-trunk-sip)# max out cps 100
vesbc(config-esbc-trunk-sip)# exit

#Переход в настройки транка TRUNK_2:
vesbc(config-esbc)# trunk sip TRUNK_2
vesbc(config-esbc-trunk-sip)# 

#Ограничение максимальных исходящих CPS:
vesbc(config-esbc-trunk-sip)# max out cps 100
vesbc(config-esbc-trunk-sip)# exit

#Переход в настройки транк-группы:
vesbc(config-esbc)# trunk-group TRUNKGROUP
vesbc(config-esbc-trunk-group)# trunk 0 TRUNK_1
vesbc(config-esbc-trunk-group)# trunk 1 TRUNK_2

#Ограничение максимальных исходящих CPS:
vesbc(config-esbc-trunk-group)# max out cps 50

#Применение и подтверждение изменений:
vesbc(config-esbc-trunk-group)# do commit 
vesbc(config-esbc-trunk-group)# do confirm 

Т. к. транки TRUNK_1 и TRUNK_2 входят в состав транк-группы TRUNKGROUP, то суммарное количество исходящих CPS c любого из этих транков не может превышать 50, так как приоритет ограничения у транк-группы выше.  

Пример работы приоритета системных ограничений над транком:

vesbc#
vesbc# config 
vesbc(config)# esbc 

#Переход в общие настройки:
vesbc(config-esbc)# general 
vesbc(config-esbc-general)# 

#Установка ограничения максимального количества контактов на направлении для всей системы — 50:
vesbc(config-esbc-general)# max out contacts 50
vesbc(config-esbc-general)# exit

#Переход в настройки транка TRUNK_1:
vesbc(config-esbc)# trunk sip TRUNK_1
vesbc(config-esbc-trunk-sip)# 

#Ограничение максимальных максимального количества контактов на транке — 100:
vesbc(config-esbc-trunk-sip)# max out contacts 100
vesbc(config-esbc-trunk-sip)# exit

#Применение и подтверждение изменений:
vesbc(config-esbc-trunk-group)# do commit 
vesbc(config-esbc-trunk-group)# do confirm  

В данном случае на системе будет не более 50 активных регистраций, так как у общесистемных ограничений приоритет выше чем у транка. 

Пример ограничения на транке исходящих вызовов в секунду:

vesbc#
vesbc# config 
vesbc(config)# esbc 

#Переход в настройки транка:
vesbc(config-esbc)# trunk sip TRUNK
vesbc(config-esbc-trunk-sip)# 

#Ограничение максимального исходящего количества CPS:
vesbc(config-esbc-trunk-sip)# max out cps 10

#Применение и подтверждение изменений:
vesbc(config-esbc-trunk-sip)# do commit 
vesbc(config-esbc-trunk-sip)# do confirm 

После применения изменений количество исходящих вызовов в секунду с транка TRUNK не может превышать 10. При достижении лимита ESBC будет отвечать кодом 480 на каждый новый INVITE, который будет маршрутизирован на данный транк.

Пример ограничения на транке исходящих запросов в секунду: 

vesbc#
vesbc# config 
vesbc(config)# esbc 

#Переход в настройки транка:
vesbc(config-esbc)# trunk sip TRUNK
vesbc(config-esbc-trunk-sip)# 

#Ограничение максимального исходящего RPS:
vesbc(config-esbc-trunk-sip)# max out rps 250

#Применение и подтверждение изменений:
vesbc(config-esbc-trunk-sip)# do commit 
vesbc(config-esbc-trunk-sip)# do confirm 

После применения изменений количество исходящих запросов в секунду с транка TRUNK не может превышать 250. На все запросы (INVITE, REGISTER и другие), поступающие после превышения лимита, ESBC будет отвечать кодом 480.

Пример ограничения количества контактов на транке:

vesbc#
vesbc# config 
vesbc(config)# esbc 

#Переход в настройки транка:
vesbc(config-esbc)# trunk sip TRUNK
vesbc(config-esbc-trunk-sip)# 

#Ограничение максимального количества контактов:
vesbc(config-esbc-trunk-sip)# max out contacts 100

#Применение и подтверждение изменений:
vesbc(config-esbc-trunk-sip)# do commit 
vesbc(config-esbc-trunk-sip)# do confirm 

После применения изменений количество активных регистраций контактов на транке TRUNK не будет превышать 100. При достижении лимита ESBC будет маршрутизировать новые регистрации на следующее направление, если оно есть в конфигурации. Если в конфигурации нет подходящего направления, то новые регистрации будут отклоняться кодом 503.

Лицензионное ограничение обработки вызовов

Максимальное количество одновременных вызовов и максимальное количество вызовов в секунду ограничиваются лицензиями ESBC-LIMIT-MAX-CALLS и ESBC-LIMIT-MAX-CPS соответственно.
При этом в конфигурации можно задать ограничение, которое превышает лицензионное значение, но ESBC не будет обрабатывать больше, чем позволяет лицензия, пример:

#Просмотр активных лицензий:
vesbc# show licence
Feature                         Source     State         Value         Valid from  Expiries               
----------------------------   --------   -----------   -------------  ---------   --------  
ESBC-LIMIT-MAX-CALLS               ELM      Active        5000            --         --                     
ESBC-LIMIT-MAX-CPS                 ELM      Active        100             --         --                     
ESBC-VIRTUAL-LIMIT-DEFAULT         ELM      Active        true            --         --                     
ESBC-VIRTUAL-LIMIT-NET             ELM      Active        10000000000     --         --                     
vesbc#
vesbc# config 
vesbc(config)# esbc 

#Переход в общие настройки:
vesbc(config-esbc)# general 
vesbc(config-esbc-general)# 

#Ограничение максимального CPS:
vesbc(config-esbc-general)# max cps 
  COUNT  Possible max cps: 1-1000   #конфигурационное ограничение

vesbc(config-esbc-general)# max cps 1000
2025-04-22T09:10:17+00:00 %SYS-W-EVENT: WARNING!!! Configured max cps 1000 exceed licence limit that is equal to 100   #предупреждение о том, что введённое значение превышает лицензионное

#Применение и подтверждение изменений:
vesbc(config-esbc-general)# do commit 
2025-04-22T08:44:46+00:00 snmpd restarted
Configuration has been successfully applied and saved to flash. Commit timer started, changes will be reverted in 600 seconds.
2025-04-22T08:44:46+00:00 %CLI-I-CRIT: user admin from console  input: do commit
vesbc(config-esbc-general)# do confirm 
Configuration has been confirmed. Commit timer canceled.
vesbc(config-esbc-general)# 

После применения изменений в конфигурации будет отображаться max cps 1000, но обрабатываться будет не более 100 вызовов в секунду.

Мониторинг

В ESBC доступен мониторинг следующих параметров:

Активные вызовы

Поддержана возможность активных вызовов командой show esbc active calls в CLI.

В выводе информации об активных сессиях присутствует:

Реализовано удаление активных сессий командой clear esbc active calls в CLI.   

Поддерживается вывод до 50000 активных звонков.

Расширенный мониторинг вызовов (call-flow)

Реализован просмотр подробной информации sip call-flow сессий в CLI.

Для включения данного функционала, необходимо запустить сбор статистики командой esbc call-flow sip start в CLI.

При повторном включении ведения статистики уже собранные данные статистики очищаются.

Реализована возможность использовать фильтрацию при сборе статистики:

  1. Фильтрация с соблюдением всех условий (esbc call-flow sip all);
  2. Фильтрация с соблюдением любого условия (esbc call-flow sip any).

Доступные условия фильтрации (возможно использование более одного условия):

  1. address — фильтрация по адресу;
  2. cdpn — фильтрация по номеру вызываемого абонента;
  3. cgpn — фильтрация по номеру вызывающего абонента;
  4. contact — фильтрация по заголовку Contact;
  5. transport — фильтрация по транспорту;
  6. trunk — фильтрация по транку;
  7. trunk-group — фильтрация по транк-группе;
  8. user-agent — фильтрация по заголовку User-Agent;
  9. user-interface — фильтрация по абонентскому интерфейсу.

Пример фильтрации с условиями:

#Сбор статистики с выполнением всех условий для вызываемого номера 114..., транспорта TRANSPORT_ABONENTS и транка TRUNK_SMG:
vesbc# esbc call-flow sip all cdpn 114.* transport TRANSPORT_ABONENTS trunk TRUNK_SMG
vesbc#  

Если не использовать фильтрацию или условия в ней, то будет происходить сбор статистики всех sip call-flow сессий.

Вывод краткой информации по всем sip call-flow сессиям возможен с помощью команды show esbc call-flow sip list в CLI.

В выводе присутствует:

  1. Общее количество call-flow сессий;
  2. Session id — идентификатор сессии;
  3. Start time — время начала установления соединения;
  4. CGPN unmodified — немодифицированный номер вызывающего абонента;
  5. CDPN unmodified — немодифицированный номер вызываемого абонента;
  6. Source — источник (транк или абонентский интерфейс);
  7. Destination — место назначения (транк или абонентский интерфейс);
  8. CGPN modified — модифицированный номер вызывающего абонента;
  9. CDPN modified — модифицированный номер вызываемого абонента.

Пример вывода статистики:

Подробную информацию об отфильтрованной сессии можно посмотреть с помощью команды show esbc call-flow sip info <SESSION_ID> [detailed] в CLI. 

При вводе show esbc call-flow sip info <SESSION_ID> будет доступна диаграмма отдельной сессии. 

Пример вывода статистики, см. ниже. 

#Просмотр диаграммы отфильтрованной call-flow сессий:
vesbc# show esbc call-flow sip info 50300000000000c
ESBC call flow 50300000000000c
Time              Leg A                                    Direction   Leg B                                      
---------------   --------------------------------------   ---------   ---------------------------------------   
2025-10-08        (UDP SDP) INVITE                            --->                                                 
09:50:25.976      sip:1142@192.168.113.177:5090 SIP/2.0                                                             
(+00:00:00.000)                                                                                                     

2025-10-08        (UDP) SIP/2.0 100 Trying                    <---                                                 
09:50:25.976                                                                                                        
(+00:00:00.000)                                                                                                     

2025-10-08                                                    --->      (UDP SDP) INVITE                           
09:50:25.992                                                             sip:1142@192.168.113.172:5070 SIP/2.0      
(+00:00:00.016)                                                                                                     

2025-10-08                                                    <---      (UDP) SIP/2.0 100 Trying                   
09:50:26.003                                                                                                        
(+00:00:00.027)                                                                                                     

2025-10-08                                                    <---      (UDP) SIP/2.0 180 Ringing                  
09:50:26.046                                                                                                        
(+00:00:00.070)                                                                                                     

2025-10-08        (UDP) SIP/2.0 180 Ringing                   <---                                                 
09:50:26.048                                                                                                        
(+00:00:00.072)                                                                                                     

2025-10-08                                                    <---      (UDP SDP) SIP/2.0 200 OK                   
09:50:27.544                                                                                                        
(+00:00:01.568)                                                                                                     

2025-10-08        (UDP SDP) SIP/2.0 200 OK                     <---                                                 
09:50:27.557                                                                                                        
(+00:00:01.581)                                                                                                     

2025-10-08        (UDP) ACK                                    --->                                                 
09:50:27.600      sip:1142@192.168.113.177:5090;transport=                                                          
(+00:00:01.624)   udp SIP/2.0                                                                                       

2025-10-08                                                     --->      (UDP) ACK sip:1142@192.168.113.172:5070    
09:50:27.603                                                             SIP/2.0                                    
(+00:00:01.627)                                                                                                     

2025-10-08                                                     <---      (UDP) BYE                                  
09:50:44.673                                                             sip:1140@192.168.113.177:5071;transport=   
(+00:00:18.697)                                                          udp;line=83b0f9ea4622375be3232f3c892b024   
                                                                         0 SIP/2.0                                  

2025-10-08        (UDP) BYE                                    <---                                                 
09:50:44.675      sip:1140@192.168.113.170;transport=udp                                                            
(+00:00:18.699)   SIP/2.0                                                                                           

2025-10-08        (UDP) SIP/2.0 200 Ok                         --->                                                 
09:50:44.700                                                                                                        
(+00:00:18.724)                                                                                                     

2025-10-08                                                     --->      (UDP) SIP/2.0 200 OK                       
09:50:44.703                                                                                                        
(+00:00:18.727) 
vesbc#

При вводе show esbc call-flow sip info <SESSION_ID> detailed будет доступна более подробная информация по выбранной сессии.

В зависимости от сценария вызова, в выводе статистики может присутствовать:

  1. Call state — статус сессии;
  2. Leg — плечо сессии;
  3. Transport — используемый транспорт;
  4. User interface — используемый абонентский интерфейс;
  5. Remote Contact — display name и URI в заголовке Contact;
  6. From — display name и URI в заголовке From;
  7. To — display name и URI в заголовке To;
  8. Remote User-Agent — полное содержимое заголовка User-Agent;
  9. Call id — уникальный идентификатор плеча;
  10. Local ip — локальный адрес;
  11. Remote ip — адрес удаленной стороны;
  12. Start time — время начала установления плеча сессии;
  13. End time — время окончания плеча сессии. 

Пример вывода статистики:

#Просмотр подробной информации отфильтрованной call-flow сессий:
vesbc# show esbc call-flow sip info 50300000000000c detailed 
ESBC call flow detailed 50300000000000c
Call state: Destroyed
-----------------------------------
Leg: A
Transport: TRANSPORT_ABONENTS
User interface: ABONENTS
Remote Contact: "1140" <sip:1140@192.168.113.170;transport=udp>
From: "1140" <sip:1140@192.168.113.177>
To: <sip:1142@192.168.113.177>
Remote User-Agent: VP-17P/1.5.6-b46 sofia-sip/1.28
Call id: cb612700-9916-1200-4783-6813e209aef3
Local ip: 192.168.113.177:5090
Remote ip: 192.168.113.170:5060
Start time: 2025-10-08 09:50:25.976
End time: 2025-10-08 09:50:44.700
-----------------------------------
Leg: B
Transport: TRANSPORT_SMG
Trunk: TRUNK_SMG
Remote Contact: <sip:1142@192.168.113.172:5070>
From: "1140" <sip:1140@192.168.113.172>
To: <sip:1142@192.168.113.172>
Remote User-Agent: smg pa_sip 3.408.2.100
Call id: 5153401c612eebba1d5691886dbcbb92
Local ip: 192.168.113.177:5071
Remote ip: 192.168.113.172:5070
Start time: 2025-10-08 09:50:25.992
End time: 2025-10-08 09:50:44.703
vesbc# 

Для сброса текущей статистики используется команда esbc call-flow sip clear в CLI. 

Для отключения сбора статистики используется команда esbc call-flow sip stop в CLI. Статистика для новых сессий собираться не будет, но для активных будет актуализироваться до их завершения.

Сбор статистики прекращается, и уже собранные данные сбрасываются, если осталось менее 20% начального объема оперативной памяти (RAM).

Черный список

Реализован просмотр черного списка командой show esbc black-list (IP-адреса, AOR, User-Agent, SIP user) в CLI и на странице Мониторинг → Списки доступа → Чёрный список (IP-адреса) в WEB.

В выводе черного списка может присутствовать до 4 таблиц (по блокируемым объектам):

  1. IP black-list:
  2. AOR:
  3. SIP user
  4. User-agent:

Причины блокировок описаны в разделе Общий принцип работы модуля fail2ban.

Реализована очистка черного списка командой clear esbc black-list в CLI или кнопкой «Удалить» в WEB.

Белый список

Поддержана возможность просматривать белый список IP-адресов, AOR и User-Agent командой show esbc white-list в CLI и, для IP-адресов, на странице Мониторинг → Списки доступа → Белый список в WEB. 

Реализовано добавление в белый список динамических адресов и доменов.

В белом списке также присутствуют два параметра:

Состояние транков

Реализован просмотр состояния транков командой show esbc trunks в CLI или на странице Мониторинг → Телефония → Транки в WEB.

В таблице выводится:

Список зарегистрированных абонентов

Реализован просмотр списка зарегистрированных абонентов командой show esbc users в CLI или на странице Мониторинг → Телефония → Абоненты в WEB.

Выводится общее количество AOR и Contact, а также базовый вывод информации о абонентах.

Количество AOR и Contact может не совпадать, если абоненты имеют несколько Contact.

Также реализован просмотр подробной информации по конкретному абоненту, используя дополнительный параметр после основной команды (sip <AOR> detailed).

Выводится подробная информация по определенному AOR:

Реализовано удаление активных регистраций командой clear esbc registration в CLI.

Регулярное выражение для clear esbc registration pattern-aor применяется с логикой полного совпадения(exact match). Например, необходимо написать шаблон, который будет соответствовать номеру "24005". В данном случае шаблон "^24.*" будет корректным, а шаблон "24" - нет.

Статистика SIP

Реализован просмотр статистики для всей системы, всех транков, всех абонентских интерфейсов или по конкретному объекту командой show esbc statistics (вызовы, регистрации, подписки, RPS) в CLI или на странице Мониторинг → Телефония → Статистика в WEB.

Ведение статистики по умолчанию включено.

При вызове команды для просмотра статистики отображаются таблицы с метриками, описание каждой метрики можно найти в разделе show esbc statistics справочника команд CLI.

В CLI отображаются счётчики за последнюю секунду. В WEB реализован просмотр истории за последнюю минуту, час, 3 дня.

Для отключения ведения статистики необходимо в меню general отключить ее командой statistics disable.

Пример:

Из TRUNK_IN в TRUNK_OUT через ESBC поступает 2 вызова каждую секунду длительностью 25 секунд.

#Просмотр полной статистики при активных вызовах:
vesbc# show esbc statistics all  

ESBC global call counters: 
-----------------------------------------------------------------------
Counter Name                Incoming               Outgoing               
-------------------------   --------------------   --------------------   
CALLS PER SECOND            2                      2                      
CALL LEGS                   52                     52                     
REQUESTS IN CALL            6                      6                      
RESPONSES IN CALL           8                      8                      
ANSWERED CALLS              2                      2                      
CALLS TO WRONG NUMBER       0                      0                      
BUSY CALLS                  0                      0                      
NO ANSWERED CALLS           0                      0                      
FORBIDDEN CALLS             0                      0                      
UNAUTHORIZED CALLS          0                      0                      
3XX CODES                   0                      0                      
4XX CODES                   0                      0                      
5XX CODES                   0                      0                      
6XX CODES                   0                      0                      
CALLS DURATION              743                    743                    
CALLS AVERAGE DURATION      13                     13                     
CALLS ACTIVE                50                     50                     

ESBC global register counters: 
-----------------------------------------------------------------------
Counter Name                Incoming               Outgoing               
-------------------------   --------------------   --------------------   
REGISTERS PER SECOND        0                      0                      
REGISTER TRANSACTIONS       0                      0                      
REQUESTS IN REGISTER        0                      0                      
RESPONSES                   0                      0                      
SUCCESS REGISTERS           0                      0                      
REQUEST TIMEOUT             0                      0                      
FORBIDDEN REGISTERS         0                      0                      
UNAUTHORIZED REGISTERS      0                      0                      
INTERVAL TOO BRIEF          0                      0                      
3XX CODES                   0                      0                      
4XX CODES                   0                      0                      
5XX CODES                   0                      0                      
6XX CODES                   0                      0                      
REGISTERED USERS            0                      0                      
REGISTERED CONTACTS         0                      0                      

ESBC global subscribe counters: 
-----------------------------------------------------------------------
Counter Name                Incoming               Outgoing               
-------------------------   --------------------   --------------------   
SUBSCRIBES PER SECOND       0                      0                      
ACTIVE SUBSCRIBES           0                      0                      
REQUESTS IN SUBSCRIBE       0                      0                      
RESPONSES IN SUBSCRIBE      0                      0                      
SUCCESS SUBSCRIBES          0                      0                      
REQUEST TIMEOUT             0                      0                      
FORBIDDEN SUBSCRIBES        0                      0                      
UNAUTHORIZED SUBSCRIBES     0                      0                      
INTERVAL TOO BRIEF          0                      0                      
3XX CODES                   0                      0                      
4XX CODES                   0                      0                      
5XX CODES                   0                      0                      
6XX CODES                   0                      0                      

ESBC global rps counters: 
-----------------------------------------------------------------------
Counter Name                Incoming               Outgoing               
-------------------------   --------------------   --------------------   
REQUESTS PER SECOND         6                      6                      
INVITE PER SECOND           2                      2                      
ACK PER SECOND              2                      2                      
BYE PER SECOND              2                      2                      
CANCEL PER SECOND           0                      0                      
REFER PER SECOND            0                      0                      
PRACK PER SECOND            0                      0                      
SUBSCRIBE PER SECOND        0                      0                      
NOTIFY PER SECOND           0                      0                      
UPDATE PER SECOND           0                      0                      
OPTIONS PER SECOND          0                      0                      
INFO PER SECOND             0                      0                      
REGISTER PER SECOND         0                      0                      
MESSAGE PER SECOND          0                      0                      

Мониторинг параметров трафика (KPI)

Реализован просмотр истории статистики параметров трафика для всей системы или по конкретному объекту (транспорту/транку/абонентскому интерфейсу) командой show esbc history (активные вызовы, средняя длительность вызова (ACD), входящие попытки вызова, исходящие попытки вызова, зарегистрированные контакты, зарегистрированные пользователи) в CLI или, для активных вызовов и попыток вызова, на странице Мониторинг → Телефония → Статистика→ Вызовы в WEB. Описание каждой метрики можно найти в разделе show esbc history справочника команд CLI.

Данные выводятся в виде гистограммы. При вызове команды отображается 3 графика – за последнюю минуту, час и 3 дня. Опция interval позволяет отобразить график для конкретного интервала времени. 

График отображает значения метрики от 10 и выше. Вертикальная ось графика автоматически подстраивается под диапазон отображаемых данных.

Пример 1.

Схема:

Из транка UAC в транк UAS через ESBC поступает 10 вызовов каждую секунду длительностью 25 секунд.

#Просмотр истории максимальной статистики активных вызовов:
vesbc# show esbc history active-calls max
CALLS ACTIVE
Active calls, quantity

300 |                                                            
270 |                                                            
240 |###########################                                 
210 |##############################                              
180 |#################################                           
150 |####################################                        
120 |#######################################                     
 90 |##########################################                  
 60 |#############################################               
 30 |################################################            
  0 |....|....|....|....|....|....|....|....|....|....|....|....|
    0    5   10   15   20   25   30   35   40   45   50   55   60
                                                        Time, seconds

CALLS ACTIVE
Active calls, quantity

100 |                                                            
 90 |                                                            
 80 |                                                            
 70 |                                                            
 60 |                                                            
 50 |                                                            
 40 |                                                            
 30 |                                                            
 20 |                                                            
 10 |                                                            
  0 |....|....|....|....|....|....|....|....|....|....|....|....|
    0    5   10   15   20   25   30   35   40   45   50   55   60
                                                        Time, minutes

CALLS ACTIVE
Active calls, quantity

100 |                                                                        
 90 |                                                                        
 80 |                                                                        
 70 |                                                                        
 60 |                                                                        
 50 |                                                                        
 40 |                                                                        
 30 |                                                                        
 20 |                                                                        
 10 |                                                                        
  0 |....|....|....|....|....|....|....|....|....|....|....|....|....|....|..
    0    5   10   15   20   25   30   35   40   45   50   55   60   65   70
                                                                    Time, hours

#Просмотр истории максимальной статистики входящих попыток вызова за последнюю минуту на транке UAC:
vesbc# show esbc history call-attempts-incoming max interval seconds trunk sip 
UAC
INCOMING CALL ATTEMPS
Call attemps, quantity

100 |                                                            
 90 |                                                            
 80 |                                                            
 70 |                                                            
 60 |                                                            
 50 |                                                            
 40 |                                                            
 30 |                                                            
 20 |                                                            
 10 |################################################               
  0 |....|....|....|....|....|....|....|....|....|....|....|....|
    0    5   10   15   20   25   30   35   40   45   50   55   60
                                                        Time, seconds

#Просмотр истории максимальной статистики исходящих попыток вызова за последнюю минуту на транке UAS:
vesbc# show esbc history call-attempts-outgoing max interval seconds trunk sip 
UAS
OUTGOING CALL ATTEMPS
Call attemps, quantity

100 |                                                            
 90 |                                                            
 80 |                                                            
 70 |                                                            
 60 |                                                            
 50 |                                                            
 40 |                                                            
 30 |                                                            
 20 |                                                            
 10 |################################################               
  0 |....|....|....|....|....|....|....|....|....|....|....|....|
    0    5   10   15   20   25   30   35   40   45   50   55   60
                                                        Time, seconds

#Просмотр истории максимальной статистики средней длительности вызова (ACD) за последний час:
vesbc# show esbc history average-call-duration max interval minutes 
AVERAGE CALLS AVERAGE DURATION
Avg duration, sec

100 |                                                            
 90 |                                                            
 80 |                                                            
 70 |                                                            
 60 |                                                            
 50 |                                                            
 40 |                                                            
 30 |                                                            
 20 |#####                                                       
 10 |######                                                      
  0 |....|....|....|....|....|....|....|....|....|....|....|....|
    0    5   10   15   20   25   30   35   40   45   50   55   60
                                                        Time, minutes

Пример 2.

Через абонентский интерфейс USERS_1 каждую секунду регистрируются 10 абонентов. Всего зарегистрировалось 500 абонентов.

#Просмотр истории статистики зарегистрированных контактов за последнюю минуту на абонентском интерфейсе:
vesbc# show esbc history contacts interval seconds user-interface sip USERS_1
REGISTERED CONTACTS
Contacts, quantity

500 |#####################                                       
450 |########################                                    
400 |##############################                              
350 |#################################                           
300 |#######################################                     
250 |##########################################                  
200 |################################################            
150 |######################################################      
100 |#########################################################   
 50 |############################################################
  0 |....|....|....|....|....|....|....|....|....|....|....|....|
    0    5   10   15   20   25   30   35   40   45   50   55   60
                                                        Time, seconds

#Просмотр истории статистики зарегистрированных пользователей:
vesbc# show esbc history registrations 
REGISTERED USERS
Users, quantity

500 |############################################################
450 |############################################################
400 |############################################################
350 |############################################################
300 |############################################################
250 |############################################################
200 |############################################################
150 |############################################################
100 |############################################################
 50 |############################################################
  0 |....|....|....|....|....|....|....|....|....|....|....|....|
    0    5   10   15   20   25   30   35   40   45   50   55   60
                                                        Time, seconds

REGISTERED USERS
Users, quantity

500 |#####################                                       
450 |#####################                                       
400 |#####################                                       
350 |######################                                      
300 |######################                                      
250 |#######################                                     
200 |#######################                                     
150 |#######################                                     
100 |#######################                                     
 50 |#######################                                     
  0 |....|....|....|....|....|....|....|....|....|....|....|....|
    0    5   10   15   20   25   30   35   40   45   50   55   60
                                                        Time, minutes

REGISTERED USERS
Users, quantity

100 |                                                                        
 90 |                                                                        
 80 |                                                                        
 70 |                                                                        
 60 |                                                                        
 50 |                                                                        
 40 |                                                                        
 30 |                                                                        
 20 |                                                                        
 10 |                                                                        
  0 |....|....|....|....|....|....|....|....|....|....|....|....|....|....|..
    0    5   10   15   20   25   30   35   40   45   50   55   60   65   70
                                                                    Time, hours

Утилита Sngrep

Утилита sngrep — инструмент интерактивного мониторинга SIP-сигнализации и медиапотоков RTP в реальном времени.

Возможности утилиты:

Варианты запуска утилиты sngrep:

Для выхода из утилиты используется комбинация клавиш <Ctrl> + <C> или клавиша <Esc>.

Не рекомендуется запускать утилиту  sngrep в сессии serial-подключения (последовательный порт). Это может приводить к искажению графического отображения.

Утилита Sngrep позволяет оперативно получить информацию о прохождении SIP-сигнализации. Для получения полной диагностической информации, анализа RTP-трафика, рекомендуется использовать запись дампа сетевого трафика в файл командой monitor.

Пример

Посмотреть прохождение вызова через ESBC

Запуск утилиты:

vesbc# sngrep

Выбор двух call-leg вызова для просмотра детальной информации (для выбора используется клавиша <Space>):

Просмотр детальной информации:

Аварии

Включение журналирования аварий происходит c помощью команды alarm enable journal в CLI. 

Данная команда без указания параметров включает весь набор аварий:

История аварийных событий выводится командой show alarms brief в CLI. Данная команда выводит историю аварий, включая уже нормализированные аварии.

Для отображения только активных аварий используется команда show alarms brief active. 

Пример:

Для удаления истории аварийных событий используется команда clear alarms в CLI.

Аварии сохраняются локально. Для отправки уведомлений об авариях на удаленный хост необходимо настроить отправку аварийных SNMP-трапов.

Текст аварий и причины их нормализации представлены в таблице ниже.

Авария

Текст аварии

Причины нормализации

cdr-send-error

CDR alarm: failed to send to <main | reserve> ftp server

успешная отправка CDR на FTP-сервер

cdr-write-error

CDR alarm: failed to write

успешная запись CDR

general-max-calls-limit

Host <host_name> max calls limit reached

через 10 секунд после последней аварии ИЛИ при снижении счетчика на 80 % от лимита

general-max-cps-limit

Host <host_name> max cps limit reachedчерез 10 секунд после последней аварии

general-max-rps-limit

Host <host_name> max rps limit reachedчерез 10 секунд после последней аварии

media-resources

Session<session_id>: <Trunk/User interface><trunk_name/ui_name> media resources out

через 15 секунд после последней аварии ИЛИ при освобождении портов для RTP

module-connection

Module <module_type> host <host_id> is down

при успешном добавлении модуля в диспетчер ESBC

trunk-group-max-calls-limit

Trunk-Group <trunk_group_name> max calls limit reached

через 10 секунд после последней аварии ИЛИ при снижении счетчика на 80 % от лимита

trunk-group-max-cps-limit

Trunk-Group <trunk_group_name> max cps limit reachedчерез 10 секунд после последней аварии

trunk-group-max-rps-limit

Trunk-Group <trunk_group_name> max rps limit reachedчерез 10 секунд после последней аварии

trunk-max-calls-limit

Trunk <trunk_name> max calls limit reached

через 10 секунд после последней аварии ИЛИ при снижении счетчика на 80 % от лимита

trunk-max-cps-limit

Trunk <trunk_name> max cps limit reachedчерез 10 секунд после последней аварии

trunk-max-rps-limit

Trunk <trunk_name> max rps limit reachedчерез 10 секунд после последней аварии

trunk-unavailable

Trunk <trunk_name> is unavailable

при обновлении статуса транка на "Available"

user-interface-max-calls-limit

User interface <ui_name> max calls limit reached

через 10 секунд после последней аварии ИЛИ при снижении счетчика на 80 % от лимита

user-interface-max-cps-limit

User interface <ui_name> max cps limit reached

через 10 секунд после последней аварии

user-interface-max-rps-limit

User interface <ui_name> max rps limit reachedчерез 10 секунд после последней аварии

Отправка аварийных SNMP-трапов

Отправка уведомлений об аварийных событиях на удаленный хост с помощью SNMP-трапов настраивается с помощью команды snmp-server enable traps esbc в CLI. 

Данная команда без указания параметров включает весь набор SNMP-трапов:

При включении отправки SNMP-трапов командой snmp-server enable traps esbc, трапы будут отправляться вне зависимости от включения журналирования аварий локально. 

Текст SNMP-трапов и причины их нормализации представлены в таблице ниже.

SNMP-трап

Текст SNMP-трапа

Причины нормализации

cdr-send-error

CDR alarm: failed to send to <main | reserve> ftp server

успешная отправка CDR на FTP-сервер

cdr-write-error

CDR alarm: failed to write

успешная запись CDR

general-max-calls-limit

Host <host_name> max calls limit reached

через 10 секунд после последней аварии ИЛИ при снижении счетчика на 80% от лимита

general-max-cps-limit

Host <host_name> max cps limit reachedчерез 10 секунд после последней аварии

general-max-rps-limit

Host <host_name> max rps limit reachedчерез 10 секунд после последней аварии

media-resources

Session<session_id>: <Trunk/User interface><trunk_name/ui_name> media resources out

через 15 секунд после последней аварии ИЛИ при освобождении портов для RTP

module-connection

Module <module_type> host <host_id> is down

при успешном добавлении модуля в диспетчер ESBC

trunk-group-max-calls-limit

Trunk-Group <trunk_group_name> max calls limit reached

через 10 секунд после последней аварии ИЛИ при снижении счетчика на 80 % от лимита

trunk-group-max-cps-limit

Trunk-Group <trunk_group_name> max cps limit reachedчерез 10 секунд после последней аварии

trunk-group-max-rps-limit

Trunk-Group <trunk_group_name> max rps limit reachedчерез 10 секунд после последней аварии

trunk-max-calls-limit

Trunk <trunk_name> max calls limit reached

через 10 секунд после последней аварии ИЛИ при снижении счетчика на 80 % от лимита

trunk-max-cps-limit

Trunk <trunk_name> max cps limit reachedчерез 10 секунд после последней аварии

trunk-max-rps-limit

Trunk <trunk_name> max rps limit reachedчерез 10 секунд после последней аварии

trunk-unavailable

Trunk <trunk_name> is unavailable

при обновлении статуса транка на "Available"

user-interface-max-calls-limit

User interface <ui_name> max calls limit reached

через 10 секунд после последней аварии ИЛИ при снижении счетчика на 80% от лимита

user-interface-max-cps-limit

User interface <ui_name> max rps limit reachedчерез 10 секунд после последней аварии

user-interface-max-rps-limit

User interface <ui_name> max cps limit reachedчерез 10 секунд после последней аварии

voip-block-aor

AOR <aor> has been bannedне нормализуются

voip-block-ip

IP address <ip> has been bannedне нормализуются
voip-block-user-agentUser-Agent <user-agent> has been bannedне нормализуются
voip-block-sip-userSIP user <aor> has been bannedне нормализуются


В отличие от аварий, SNMP-трапы передают уведомления о заблокированных объектах:

  • voip-block-aor;
  • voip-block-ip;
  • voip-block-user-agent;
  • voip-block-sip-user.

Для просмотра заблокированных объектов в CLI используется команда show esbc black-list.

Конфигурирование удаленного хоста для отправки SNMP-уведомлений выполняется с помощью команды snmp-server host в CLI.

Настройка CDR

CDR (Call Detail Record, рус. «запись сведений о звонках») — это запись, содержащая подробную информацию о совершённых вызовах.

В файл CDR записываются следующие данные:

Значения параметров в файле CDR записываются в указанном выше порядке и разделяются символом ";".

Запись "Номер вызываемого абонента при переадресации" создается только, при включенной локальной обработке 3xx ответа в настройках sip profile.

Хранение записей CDR осуществляется в локальном хранилище ESBC или на внешнем USB-накопителе.

Отправка на внешний сервер осуществляется по протоколу FTP, SFTP и SCP. Поддерживается отправка на два FTP-сервера, два SFTP-сервера и два SCP-сервера одновременно. 

Дополнительно поддерживается сохранение и отправка CDR в SYSLOG. Для отправки в SYSLOG требуется дополнительная конфигурация syslog.

Описание всех команд для настройки CDR приведено в разделе Настройки CDR.

Пример настройки записи CDR с опциональными полями, локальным хранением и отправкой на сервер FTP с резервированием в случае неудачной отправки приведен ниже. 

vesbc# 
vesbc# configure
vesbc(config)# esbc
vesbc(config-esbc)# cdr
vesbc(config-esbc-cdr)# enable

#Добавление заголовка в CDR-запись:
vesbc(config-esbc-cdr)# add-header 

#Запись неудачных вызовов:
vesbc(config-esbc-cdr)# collect unsuccess

#Запись пустых CDR:
vesbc(config-esbc-cdr)# collect empty-files

#Режим создания записей:
vesbc(config-esbc-cdr)# create-mode periodically
vesbc(config-esbc-cdr)# per days 1
vesbc(config-esbc-cdr)# period hours 12
vesbc(config-esbc-cdr)# per minutes 30

#Включение отправки логов:
vesbc(config-esbc-cdr)# syslog enable

#Добавление отличительного признака:
vesbc(config-esbc-cdr)# signature otlichitelnyi_priznak

#Настройка локального хранения:
vesbc(config-esbc-cdr)# local 
vesbc(config-esbc-cdr-local)# create-directories by-date
vesbc(config-esbc-cdr-local)# keep days 30
vesbc(config-esbc-cdr-local)# keep hours 12
vesbc(config-esbc-cdr-local)# keep minutes 30
vesbc(config-esbc-cdr-local)# path flash:cdr/cdr_record
vesbc(config-esbc-cdr-local)# save
vesbc(config-esbc-cdr-local)# exit

#Настройка основного FTP-сервера:
vesbc(config-esbc-cdr)# ftp 
vesbc(config-esbc-cdr-ftp)# login main_ftp_server
vesbc(config-esbc-cdr-ftp)# password password_m_ftp
vesbc(config-esbc-cdr-ftp)# path /main_ftp/cdr_record
vesbc(config-esbc-cdr-ftp)# remote address 192.168.23.100
vesbc(config-esbc-cdr-ftp)# save
vesbc(config-esbc-cdr-ftp)# exit

#Настройка резервного FTP-сервера:
vesbc(config-esbc-cdr)# reserved-ftp 
vesbc(config-esbc-cdr-res-ftp)# as-reserved 
vesbc(config-esbc-cdr-res-ftp)# login reserve_ftp_server
vesbc(config-esbc-cdr-res-ftp)# password password_r_ftp
vesbc(config-esbc-cdr-res-ftp)# path /reserve_ftp/cdr_record
vesbc(config-esbc-cdr-res-ftp)# remote address 192.168.23.200
vesbc(config-esbc-cdr-res-ftp)# save

#Применение и подтверждение изменений:
vesbc(config-esbc-cdr-res-ftp)# do commit
Configuration has been successfully applied and saved to flash. Commit timer started, changes will be reverted in 600 seconds.
vesbc(config-esbc-cdr-res-ftp)# do confirm
Configuration has been confirmed. Commit timer canceled.

Если отправка записи CDR на основной FTP-сервер (192.168.23.100) по какой-либо причине не произойдет, то она попытается отправиться на резервный FTP-сервер (192.168.23.200), в случае неудачи и на резервном, запись сохранится только локально.

Пример записи файла CDR

На ESBC настроена следующая конфигурация CDR:

  cdr
    enable
    add-header
    signature test_signature
    period minutes 1
    local
      save
      path flash:cdr/
      create-directories by-date
      keep days 1
    exit
  exit

После совершения успешного вызова длительностью 5 секунд, с номера 241 на номер 231 будет сформирован файл CDR (через 1 минуту) вида:

vesbc CDR. File started at "20260320050817"
test_signature
2026-03-20 05:07:45;2026-03-20 05:07:53;241;241;231;231;UAC;UAS;000005;016;1;1;974433e3-9ebd-123f-7cb4-ecb1e029e6ba;93a6cc0da4e18d8ad308b277e3434d53;;192.168.1.6;192.168.1.2;;192.168.1.6;192.168.1.6;192.168.12.2;

Работа с логами

Логирование ESBC осуществляется с помощью syslog. Более подробно настройки syslog описаны в разделе Управление SYSLOG справочника команд CLI.

По умолчанию логирование модулей ESBC выключено.

Включение логирования всех модулей при большой вызывной нагрузке может повлиять на производительность системы. Наибольшее влияние на производительность оказывает вывод логов в консоль (syslog console). 

Для получения наиболее подробной информации, при диагностики неисправностей, рекомендуется использовать уровень логирования debug. 

Пример настройки логирования на внешний syslog-сервер с уровнем debug:

vesbc# configure 
vesbc(config)# syslog host SYSLOG_SERVER
vesbc(config-syslog-host)# remote-address 192.168.1.1
vesbc(config-syslog-host)# severity debug 
vesbc(config-syslog-host)# do commit 
Configuration has been successfully applied and saved to flash. Commit timer started, changes will be reverted in 600 seconds.
vesbc(config-syslog-host)# do confirm 
Configuration has been confirmed. Commit timer canceled.


Модули, входящие в состав ESBC

Название

Описание

Назначение

esbc_core

модуль основной логики

обработка вызовов, отвечает за маршрутизацию вызовов, обеспечивает взаимодействие остальных модулей

esbc_sip_balancer

модуль управления подсистемой SIP

получение сообщений SIP (на открытый сокет) и передача их в модуль esbc_sip_worker

esbc_sip_worker

модуль расширения подсистемы SIP

адаптер протокола SIP, обрабатывает сообщения и передает данные модулю esbc_core

esbc_media_balancer

модуль управления подсистемой media

управление ресурсами в подсистеме media, выделяет RTP-порты и передает их в модуль esbc_media_worker

esbc_media_worker

модуль расширения подсистемы media

обработка медиапотоков (RTP)

esbc_config_manager

адаптер базы данных конфигурации

хранение конфигурации системы

esbc_access_mediator

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

обработка внешних взаимодействий с системой CLI

esbc_ipc

брокер сообщений

обеспечение связи всех модулей в системе

esbc_dispatcher

модуль контроля состояния модулей

контроль модулей, индикация об изменении состояний модулей

esbc_sm

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

добавление/удаление записей о регистрации абонентов, добавление/удаление/изменение контактов регистрации, хранение и восстановление записей из базы, предоставление информации о записях и контактах абонентов другим модулям системы

esbc_voip_guard

модуль fail2ban

отслеживает попытки обращения к сервису телефонии, при обнаружении постоянно повторяющихся неудачных попыток обращения с одного и того же IP-адреса или хоста, модуль блокирует попытки с этого IP-адреса/хоста

esbc_sysio

модуль взаимодействия с ОС

служит прослойкой между ESBC и ОС, на которой он разворачивается, предоставляет единый интерфейс взаимодействия с системой и реализует мониторинг различных системных событий

esbc_mon

модуль мониторинга

обеспечение функции мониторинга и сбора статистики

esbc_aaa

модуль aaa

аутентификация, хранение информации о вызовах

stun_server

модуль stun-server

обработка запросов STUN в режиме сервера

Включение логирования модулей ESBC производится в разделе debug:

vesbc#

#Переход в раздел debug:
vesbc# debug
vesbc(debug)#
 
#Включение логирования модуля esbc_dispatcher:
vesbc(debug)# debug esbc disp
 
#Включение логирования модуля esbc_config_manager:
vesbc(debug)# debug esbc cfgmgr
 
#Включение логирования модуля esbc_access_mediator:
vesbc(debug)# debug esbc accmed
 
#Включение логирования модуля esbc_mon:
vesbc(debug)# debug esbc mon

#Включение логирования модуля esbc_aaa:
vesbc(debug)# debug esbc aaa

#Включение логирования модуля esbc_core:
vesbc(debug)# debug esbc core
 
#Включение логирования модуля esbc_sip_balancer:
vesbc(debug)# debug esbc sipbl
 
#Включение логирования модуля esbc_sip_worker:
vesbc(debug)# debug esbc sipwrk
 
#Включение логирования модуля esbc_media_balancer:
vesbc(debug)# debug esbc mediabl
 
#Включение логирования модуля esbc_media_worker:
vesbc(debug)# debug esbc mediawrk
 
#Включение логирования модуля esbc_sysio:
vesbc(debug)# debug esbc sysio
 
#Включение логирования модуля esbc_sm:
vesbc(debug)# debug esbc submngr
 
#Включение логирования модуля esbc_voip_guard:
vesbc(debug)# debug esbc voip-guard

#Включение логирования модуля stun_server:
vesbc(debug)# debug esbc stun-server

Для отключения логирования модулей ESBC используется команда, аналогичная включению, с приставкой no:

#Выключение логирования модуля esbc_voip_guard:
vesbc(debug)# no debug esbc voip-guard

Для установки параметров логирования по умолчанию используется команда no debug all. Данная команда отключает логирование всех модулей ESBC.

С целью исключения повышенной нагрузки на устройство, рекомендуется отключать логирование модулей ESBC (no debug all) сразу после получения логов, необходимых для анализа неисправности. 

Изменение количества модулей

При обработке сигнального SIP-трафика и медиапотоков RTP, ресурсы CPU используются разными модулями ESBC. Соответственно для оптимизации нагрузки на CPU предусмотрена возможность управлять количеством модулей.

При высокой нагрузке сигнальным SIP-трафиком наибольшую нагрузку на ядро CPU производит модуль sip worker, а при большом количестве одновременных вызовов (особенно в режиме транскодирования медиа) — media worker.

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

По умолчанию в системе используется по одному экземпляру каждого модуля.

Список модулей, количество которых можно изменить:

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

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

Заданное в конфигурации количество модулей не изменяется при увеличении/уменьшении количества ядер CPU системы.

Описание всех команд для настройки количества модулей приведено в разделе Общие настройки ESBC.

Пример:

vesbc#
vesbc# config 
vesbc(config)# esbc 

#Переход в общие настройки:
vesbc(config-esbc)# general 
vesbc(config-esbc-general)# 

#Увеличение количества медиа-воркеров до 2:
vesbc(config-esbc-general)# count media worker 2
vesbc(config-esbc-general)#

#Применение и подтверждение изменений:
vesbc(config-esbc-general)# do commit
2024-09-09T05:26:55+00:00 %SYS-W-EVENT: WARNING!!! After changing ESBC modules count, the system may work unstable. Please restart software.
2024-09-09T05:26:57+00:00 snmpd restarted
Configuration has been successfully applied and saved to flash. Commit timer started, changes will be reverted in 600 seconds.
2024-09-09T05:26:58+00:00 %CLI-I-CRIT: user admin from console  input: do commit
vesbc(config-esbc-general)# do confirm
Configuration has been confirmed. Commit timer canceled.
2024-09-09T05:27:01+00:00 %CLI-I-CRIT: user admin from console  input: do confirm
vesbc(config-esbc-general)# 

#Перезапуск ПО ESBC для корректного перераспределения модулей:
vesbc(config-esbc-general)# do reload esbc force
Do you really want to reload esbc now? (y/N): y

Для вывода предупреждения о необходимости перезапуска нужно, чтобы уровень syslog severity был не ниже warning.

Настройка VPN (PPTP и L2TP over IPSec)

Для организации абонентских и транковых подключений, с целю передачи сигнального (SIP) и медиа (RTP) трафика через VPN-соединение, ESBC поддерживает работу в следующих режимах:

Подробное описание настройки каждого из режимов приведено в разделе Управление удаленным доступом документации ESR.

Описание всех команд приведено в разделе Управление VPN. Настройки удаленного доступа справочника команд CLI.

Общий порядок настройки VPN:

  1. Базовая настройка сети (конфигурация IP-адресов интерфейсов, настройка маршрутизации и т. д.).
  2. Настройка туннелирования (конфигурация PPTP/L2TP-сервера, и/или настройка PPTP/L2TP-туннелей).
  3. Настройка firewall для прохождения протоколов туннелирования (разрешить TCP-порт 1723, протокол GRE(47) для PPTP и UDP-порты 500, 1701, 4500 и протоколы ESP (50) и GRE (47) для L2TP). 
  4. Настройка транков и/или абонентских интерфейсов ESBC для работы через VPN.

Ниже приведены примеры настройки ESBC в качестве PPTP-сервера и в качестве PPTP-клиента. Настройки для L2TP-сервера и L2TP-клиента осуществляются аналогично.

Пример настройки PPTP-сервера для подключения SIP-транков

Задача 

Организовать подключение двух PPTP-клиентов к ESBC и использовать эти подключения в качестве SIP-транков.

IP-адрес сервера PPTP — 20.20.20.1. 

Учетная запись для подключения клиента 1 – логин: pptp_user, пароль: simplepass, IP-адрес: 20.20.20.5

Учетная запись для подключения клиента 2 – логин: pptp_user2, пароль: simplepass2, IP-адрес: 20.20.20.6

Схема

Решение

Выполнить настройку сетевых интерфейсов:

vesbc# configure 
vesbc(config)# interface gigabitethernet 1/0/1
vesbc(config-if-gi)# description LAN
vesbc(config-if-gi)# ip address 192.168.113.207/20
vesbc(config-if-gi)# exit
vesbc(config)# interface gigabitethernet 1/0/2
vesbc(config-if-gi)# description WAN
vesbc(config-if-gi)# ip address 10.30.101.150/24
vesbc(config-if-gi)# exit

Выполнить настройку firewall для разрешения прохождения протокола PPTP на интерфейс gigabitethernet 1/0/2:

vesbc(config)# security zone WAN
vesbc(config-security-zone)# exit
vesbc(config)# security zone-pair WAN self
vesbc(config-security-zone-pair)# rule 10
vesbc(config-security-zone-pair-rule)# action permit
vesbc(config-security-zone-pair-rule)# match protocol gre
vesbc(config-security-zone-pair-rule)# enable
vesbc(config-security-zone-pair-rule)# exit
vesbc(config-security-zone-pair)# rule 20
vesbc(config-security-zone-pair-rule)# action permit
vesbc(config-security-zone-pair-rule)# match protocol tcp
vesbc(config-security-zone-pair-rule)# match destination-port port-range 1723
vesbc(config-security-zone-pair-rule)# enable
vesbc(config-security-zone-pair-rule)# exit
vesbc(config-security-zone-pair)# exit
vesbc(config)#

Поместить интерфейс gigabitethernet 1/0/2 в зону безопасности WAN: 

vesbc(config)#   
vesbc(config)# interface gigabitethernet 1/0/2
vesbc(config-if-gi)# security-zone WAN 
vesbc(config-if-gi)# exit 
vesbc(config)#

Создать зону безопасности, к которой будут относиться сессии пользователей:

vesbc(config)# 
vesbc(config)# security zone VPN_USERS
vesbc(config-security-zone)# exit
vesbc(config)#

Выполнить настройку PPTP-сервера:

vesbc(config)# remote-access pptp PPTP_SERVER
vesbc(config-pptp-server)# authentication mode local

#IP-адрес PPTP-сервера:
vesbc(config-pptp-server)# local-address ip-address 20.20.20.1 

#Диапазон IP-адресов, которые будут выдаваться PPTP-клиентам:
vesbc(config-pptp-server)# remote-address address-range 20.20.20.5-20.20.20.6 

#IP-адрес ESBC для организации подключения по протоколу PPTP:
vesbc(config-pptp-server)# outside-address ip-address 10.30.101.150
vesbc(config-pptp-server)# security-zone VPN_USERS

#Создание и настройка учетной записи клиента pptp_user:
vesbc(config-pptp-server)# username pptp_user 
vesbc(config-ppp-user)# password ascii-text simplepass

#Указать, какой именно IP-адрес из диапазона будет выдан клиенту pptp_user:
vesbc(config-ppp-user)# remote address 20.20.20.5 
vesbc(config-ppp-user)# enable
vesbc(config-ppp-user)# exit

#Создание и настройка учетной записи клиента pptp_user2:
vesbc(config-pptp-server)# username pptp_user2 
vesbc(config-ppp-user)# password ascii-text simplepass2

#Указать, какой именно IP-адрес из диапазона будет выдан клиенту pptp_user2:
vesbc(config-ppp-user)# remote address 20.20.20.6
vesbc(config-ppp-user)# enable
vesbc(config-ppp-user)# exit
vesbc(config-pptp-server)# enable
vesbc(config-pptp-server)# exit
vesbc(config)#

Для использования подключенных PPTP-клиентов в качестве SIP-транков следует указывать IP-адрес, который будет выдаваться сервером PPTP каждому клиенту в явном виде (команда remote address в конфигурации ppp-user). Иначе IP-адреса, выдаваемые PPTP-клиентам, будут выдаваться в случайном порядке из диапазона, указанного в настройках PPTP-сервера. В таком случае невозможно будет настроить SIP-транк до конкретного клиента, т. к. для работы в режиме транка требуется указание адреса встречной стороны.

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

Выполнить настройку транков ESBC для работы с клиентами 1 и 2:

esbc(config)# esbc 
vesbc(config-esbc)# media resource MEDIA_PPTP

#Указать IP-адрес сервера PPTP:
vesbc(config-esbc-media-resource)# ip address 20.20.20.1
vesbc(config-esbc-media-resource)# exit
vesbc(config-esbc)# sip transport PPTP_1

#Указать IP-адрес сервера PPTP:
vesbc(config-esbc-sip-transport)# ip address 20.20.20.1
vesbc(config-esbc-sip-transport)# port 5070
vesbc(config-esbc-sip-transport)# exit
vesbc(config-esbc)# sip transport PPTP_2

#Указать IP-адрес сервера PPTP:
vesbc(config-esbc-sip-transport)# ip address 20.20.20.1
vesbc(config-esbc-sip-transport)# port 5071
vesbc(config-esbc-sip-transport)# exit
vesbc(config-esbc)# trunk sip PPTP_USER
vesbc(config-esbc-trunk-sip)# sip transport PPTP_1
vesbc(config-esbc-trunk-sip)# media resource 1 MEDIA_PPTP

#Указать IP-адрес PPTP-клиента pptp_user:
vesbc(config-esbc-trunk-sip)# remote address 20.20.20.5
vesbc(config-esbc-trunk-sip)# remote port 5080
vesbc(config-esbc-trunk-sip)# exit
vesbc(config-esbc)# trunk sip PPTP_USER2
vesbc(config-esbc-trunk-sip)# sip transport PPTP_2
vesbc(config-esbc-trunk-sip)# media resource 1 MEDIA_PPTP

#Указать IP-адрес PPTP-клиента pptp_user2:
vesbc(config-esbc-trunk-sip)# remote address 20.20.20.6
vesbc(config-esbc-trunk-sip)# remote port 5081
vesbc(config-esbc-trunk-sip)# exit

Выполнить настройку ESBC для транка TRUNK_1:

vesbc(config-esbc)# 
vesbc(config-esbc)# media resource MEDIA_TRUNK_1
vesbc(config-esbc-media-resource)# ip address 192.168.113.207
vesbc(config-esbc-media-resource)# exit
vesbc(config-esbc)# sip transport TRANSPORT_TRUNK_1
vesbc(config-esbc-sip-transport)# ip address 192.168.113.207
vesbc(config-esbc-sip-transport)# port 5090
vesbc(config-esbc-sip-transport)# exit
vesbc(config-esbc)# route-table TO_PPTP_USER
vesbc(config-esbc-route-table)# rule 1
vesbc(config-esbc-route-table-rule)# action direct-to-trunk PPTP_USER
vesbc(config-esbc-route-table-rule)# exit
vesbc(config-esbc-route-table)# exit
vesbc(config-esbc)# trunk sip TRUNK_1
vesbc(config-esbc-trunk-sip)# sip transport TRANSPORT_TRUNK_1
vesbc(config-esbc-trunk-sip)# route-table TO_PPTP_USER
vesbc(config-esbc-trunk-sip)# media resource 1 MEDIA_TRUNK_1
vesbc(config-esbc-trunk-sip)# remote address 192.168.113.200
vesbc(config-esbc-trunk-sip)# remote port 5091
vesbc(config-esbc-trunk-sip)# exit
vesbc(config-esbc)# exit
vesbc(config)# 

Настроить маршрутизацию вызовов из транка PPTP_USER в транк TRUNK_1:

vesbc(config)# esbc 
vesbc(config-esbc)# route-table TO_TRUNK_1
vesbc(config-esbc-route-table)# rule 1
vesbc(config-esbc-route-table-rule)# action direct-to-trunk TRUNK_1
vesbc(config-esbc-route-table-rule)# exit
vesbc(config-esbc-route-table)# exit
vesbc(config-esbc)# trunk sip PPTP_USER
vesbc(config-esbc-trunk-sip)# route-table TO_TRUNK_1
vesbc(config-esbc-trunk-sip)# exit
vesbc(config-esbc)# exit

Настройка маршрутизации для транка PPTP_USER2 выполняется аналогично. 

Пример настройки PPTP-клиента для подключения SIP-транков

Задача 

Организовать подключение в режиме PPTP-клиента к вышестоящему серверу и использовать это подключение в качестве SIP-транка. 

IP-адрес сервера PPTP — 10.30.101.150

Учетная запись для подключения клиента — логин: pptp_user, пароль: simplepass.

Схема

Решение

Выполнить настройку сетевых интерфейсов:

vesbc# configure 
vesbc(config)# interface gigabitethernet 1/0/1
vesbc(config-if-gi)# description LAN
vesbc(config-if-gi)# ip address 192.168.113.208/20
vesbc(config-if-gi)# exit
vesbc(config)# interface gigabitethernet 1/0/2
vesbc(config-if-gi)# description WAN
vesbc(config-if-gi)# ip address 10.30.101.151/24
vesbc(config-if-gi)# exit
vesbc(config)#

Создать зону безопасности для PPTP-туннеля:

vesbc(config)# security zone PPTP_TENNEL
vesbc(config-security-zone)# exit
vesbc(config)# 

Создать и настроить PPTP-туннель:

vesbc(config)# 
vesbc(config)# tunnel pptp 1
vesbc(config-pptp)# security-zone PPTP_TENNEL

#Указать учетные данные пользователя pptp_user:
vesbc(config-pptp)# username pptp_user password ascii-text simplepass

#Указать IP-адрес PPTP-сервера:
vesbc(config-pptp)# remote address 10.30.101.150
vesbc(config-pptp)# ignore default-route
vesbc(config-pptp)# enable
vesbc(config-pptp)# exit
vesbc(config)# 

Выполнить настройку транка ESBC для работы через PPTP-туннель:

vesbc# configure 
vesbc(config)# esbc
vesbc(config-esbc)# media resource MEDIA_PPTP

#Указать туннель pptp 1:
vesbc(config-esbc-media-resource)# ip address interface pptp 1
vesbc(config-esbc-media-resource)# exit
vesbc(config-esbc)# sip transport PPTP

#Указать туннель pptp 1:
vesbc(config-esbc-sip-transport)# ip address interface pptp 1
vesbc(config-esbc-sip-transport)# port 5080
vesbc(config-esbc-sip-transport)# exit
vesbc(config-esbc)# trunk sip PPTP
vesbc(config-esbc-trunk-sip)# sip transport PPTP
vesbc(config-esbc-trunk-sip)# media resource 0 MEDIA_PPTP

#Указать Remote IP PPTP-туннеля:
vesbc(config-esbc-trunk-sip)# remote address 20.20.20.1
vesbc(config-esbc-trunk-sip)# remote port 5070
vesbc(config-esbc-trunk-sip)# exit
vesbc(config-esbc)# 

IP-адреса (Local и Remote) PPTP-туннеля можно узнать командой show tunnels status.

vesbc# show tunnels status 
Tunnel      Admin   Link    MTU      Local IP     Remote IP     Last change 
            State   State                                       (d,h:m:s)    
---------   -----   -----   ------   -----------  -----------   -------------
pptp 1      Up      Up      1500     20.20.20.5   20.20.20.1    00,00:13:35 

Выполнить настройку ESBC для транка TRUNK_1:

vesbc(config)# esbc 
vesbc(config-esbc)# media resource MEDIA_TRUNK_1
vesbc(config-esbc-media-resource)# ip address 192.168.113.208
vesbc(config-esbc-media-resource)# exit
vesbc(config-esbc)# sip transport TRANSPORT_TRUNK_1
vesbc(config-esbc-sip-transport)# ip address 192.168.113.208
vesbc(config-esbc-sip-transport)# port 5091
vesbc(config-esbc-sip-transport)# exit
vesbc(config-esbc)# route-table TO_PPTP
vesbc(config-esbc-route-table)# rule 1
vesbc(config-esbc-route-table-rule)# action direct-to-trunk PPTP
vesbc(config-esbc-route-table-rule)# exit
vesbc(config-esbc-route-table)# exit
vesbc(config-esbc)# trunk sip TRUNK_1
vesbc(config-esbc-trunk-sip)# sip transport TRANSPORT_TRUNK_1
vesbc(config-esbc-trunk-sip)# route-table TO_PPTP
vesbc(config-esbc-trunk-sip)# media resource 1 MEDIA_TRUNK_1
vesbc(config-esbc-trunk-sip)# remote address 192.168.113.200
vesbc(config-esbc-trunk-sip)# remote port 5092
vesbc(config-esbc-trunk-sip)# exit
vesbc(config-esbc)# exit
vesbc(config)# 

Настроить маршрутизацию вызовов из транка PPTP в транк TRUNK_1:

vesbc(config)# esbc 
vesbc(config-esbc)# route-table TO_TRUNK_1
vesbc(config-esbc-route-table)# rule 1
vesbc(config-esbc-route-table-rule)# action direct-to-trunk TRUNK_1
vesbc(config-esbc-route-table-rule)# exit
vesbc(config-esbc-route-table)# exit
vesbc(config-esbc)# trunk sip PPTP
vesbc(config-esbc-trunk-sip)# route-table TO_TRUNK_1
vesbc(config-esbc-trunk-sip)# exit
vesbc(config-esbc)# exit

Примеры настройки ESBC  

Настройка для SIP-абонентов

Схема применения:

Описание:

SIP-абоненты (IP-телефон/VoIP шлюз/Мобильный SIP-клиент и т. д.) отправляют сообщение на IP-адрес 192.168.20.120 порт 5062, ESBC пересылает данный трафик с IP-адреса 192.168.16.113 порт 5061 на адрес Softswitch (IP АТС/SIP-proxy и т. д) 192.168.16.65 порт 5060.

Для реализации данной схемы общий алгоритм настройки следующий:

  1. Настроить сетевые интерфейсы на ESBC в сторону SSW и в сторону SIP-абонентов.
  2. Создать SIP-транспорт в сторону SSW и SIP-абонентов.
  3. Создать медиаресурсы для обоих направлений, назначить им диапазон портов для передачи голоса.
  4. Создать абонентский интерфейс и SIP-транк.
  5. Создать правила, по которым будут маршрутизироваться вызовы от абонентов до SSW.

Порядок конфигурирования ESBC:

1. Настроить IP-адрес на интерфейсе в сторону SSW:

vesbc# configure
vesbc(config)# interface gigabitethernet 1/0/1
vesbc(config-if-gi)# description "SSW"
vesbc(config-if-gi)# ip address 192.168.16.113/24
vesbc(config-if-gi)# ip firewall disable

2. Настроить IP-адрес на внешнем интерфейсе в сторону абонентов:

vesbc# configure
vesbc(config)# interface gigabitethernet 1/0/2
vesbc(config-if-gi)# description "ABONENTS"
vesbc(config-if-gi)# ip address 192.168.20.120/24

3. Создать SIP-транспорт в сторону SSW: 

vesbc#
vesbc# configure
vesbc(config)# esbc
vesbc(config-esbc)# sip transport TRANSPORT_SSW
vesbc(config-esbc-sip-transport)# ip address 192.168.16.113
vesbc(config-esbc-sip-transport)# port 5061

4. Создать SIP-транспорт в сторону абонентов:

vesbc#
vesbc# configure
vesbc(config)# esbc
vesbc(config-esbc)# sip transport TRANSPORT_ABONENTS
vesbc(config-esbc-sip-transport)# ip address 192.168.20.120
vesbc(config-esbc-sip-transport)# port 5062

5. Создать медиаресурсы для согласования и передачи голоса на плече SSW --- ESBC:

vesbc#
vesbc# configure
vesbc(config)# esbc
vesbc(config-esbc)# media resource MEDIA_SSW
vesbc(config-esbc-media-resource)# ip address 192.168.16.113

#Указать диапазон портов, который будет выделяться на ESBC для передачи голоса. Данная команда необязательная. Если ее не указывать, будет использоваться диапазон портов 8000–65535.
vesbc(config-esbc-media-resource)# port-range 1024-65535

6. Создать медиаресурсы для согласования и передачи голоса на плече ESBC --- Абонентский шлюз/SIP-абоненты:

vesbc#
vesbc# configure
vesbc(config)# esbc
vesbc(config-esbc)# media resource MEDIA_ABONENTS
vesbc(config-esbc-media-resource)# ip address 192.168.20.120

7. Создать SIP-транк в сторону SSW:

vesbc#
vesbc# configure
vesbc(config)# esbc
vesbc(config-esbc)# trunk sip TRUNK_SSW
vesbc(config-esbc-trunk-sip)# sip transport TRANSPORT_SSW
vesbc(config-esbc-trunk-sip)# remote address 192.168.16.65
vesbc(config-esbc-trunk-sip)# remote port 5060
vesbc(config-esbc-trunk-sip)# media resource 0 MEDIA_SSW

8. Создать абонентский интерфейс в сторону абонентов:

vesbc#
vesbc# configure
vesbc(config)# esbc
vesbc(config-esbc)# user-interface sip ABONENTS
vesbc(config-esbc-user-interface-sip)# sip transport TRANSPORT_ABONENTS
vesbc(config-esbc-user-interface-sip)# media resource 0 MEDIA_ABONENTS

#Если абоненты находятся за NAT выполнить команду:
vesbc(config-esbc-user-interface-sip)# nat comedia-mode on

9. Создать таблицу маршрутизации и добавить в нее правила, по которым вызовы, приходящие с абонентов будут маршрутизироваться на SSW:

vesbc# 
vesbc# configure 
vesbc(config)# esbc 
vesbc(config-esbc)# route-table TO_SSW
vesbc(config-esbc-route-table)# rule 0
vesbc(config-esbc-route-table-rule)# action direct-to-trunk TRUNK_SSW

10. Привязать созданную таблицу маршрутизации к абонентскому интерфейсу:

vesbc# 
vesbc# configure 
vesbc(config)# esbc 
vesbc(config-esbc)# user-interface sip ABONENTS 
vesbc(config-esbc-user-interface-sip)# route-table TO_SSW

11. Применить конфигурацию и подтвердить изменения:

vesbc# commit
vesbc# confirm

В приведённой схеме описаны базовые настройки.

Настройка для SIP-транков

Схема применения:

Описание:

Транковый шлюз (IP АТС/ SIP-proxy/Удаленный SSW и др.) отправляет сообщения с IP-адреса 192.168.20.99 порта 5060 на IP-адрес 192.168.20.120 порт 5067, ESBC пересылает данный трафик с IP-адреса 192.168.16.113 порта 5065 на адрес Softswitch 192.168.16.65 порт 5060. И в обратную сторону SSW отправляет сообщения с IP-адреса 192.168.16.65 порта 5060 на IP-адрес 192.168.16.113 порт 5065, ESBC пересылает данный трафик с IP-адреса 192.168.20.120 порта 5067 на адрес транкового шлюза 192.168.20.99 порт 5060.

Для реализации данной схемы общий алгоритм настройки следующий:

  1. Настроить сетевые интерфейсы на ESBC в сторону SSW и в сторону транкового шлюза.
  2. Создать SIP-транспорт в сторону SSW и транкового шлюза.
  3. Создать медиаресурсы для обоих направлений, назначить им диапазон портов для передачи голоса.
  4. Создать 2 SIP-транка в сторону SSW и в сторону транкового шлюза.
  5. Создать правила, по которым будут маршрутизироваться вызовы от транкового шлюза до SSW и наоборот от SSW до транкового шлюза.

Порядок конфигурирования ESBC:

1. Настроить IP-адрес на интерфейсе в сторону SSW:

vesbc# configure
vesbc(config)# interface gigabitethernet 1/0/1
vesbc(config-if-gi)# description "SSW"
vesbc(config-if-gi)# ip address 192.168.16.113/24

2. Настроить IP-адрес на интерфейсе в сторону транкового шлюза: 

vesbc# configure
vesbc(config)# interface gigabitethernet 1/0/2
vesbc(config-if-gi)# description "TRUNK_GATEWAY"
vesbc(config-if-gi)# ip address 192.168.20.120/24

3. Создать SIP-транспорт в сторону SSW:

vesbc#
vesbc# configure
vesbc(config)# esbc
vesbc(config-esbc)# sip transport TRANSPORT_SSW
vesbc(config-esbc-sip-transport)# ip address 192.168.16.113
vesbc(config-esbc-sip-transport)# port 5065

4. Создать SIP-транспорт в сторону транкового шлюза:

vesbc#
vesbc# configure
vesbc(config)# esbc
vesbc(config-esbc)# sip transport TRANSPORT_TRUNK_GATEWAY
vesbc(config-esbc-sip-transport)# ip address 192.168.20.120
vesbc(config-esbc-sip-transport)# port 5067

5. Создать медиаресурсы для согласования и передачи голоса на плече SSW --- ESBC:

vesbc#
vesbc# configure
vesbc(config)# esbc
vesbc(config-esbc)# media resource MEDIA_SSW
vesbc(config-esbc-media-resource)# ip address 192.168.16.113

#Указать диапазон портов, который будет выделяться на ESBC для передачи голоса. Данная команда необязательная. Если ее не указывать, будет использоваться диапазон портов 8000–65535.
vesbc(config-esbc-media-resource)# port-range 1024-65535

6. Создать медиаресурсы для согласования и передачи голоса на плече ESBC --- Транковый шлюз:

vesbc#
vesbc# configure
vesbc(config)# esbc
vesbc(config-esbc)# media resource MEDIA_TRUNK_GATEWAY
vesbc(config-esbc-media-resource)# ip address 192.168.20.120

7. Создать SIP-транк в сторону SSW: 

vesbc#
vesbc# configure
vesbc(config)# esbc
vesbc(config-esbc)# trunk sip TRUNK_SSW
vesbc(config-esbc-trunk-sip)# sip transport TRANSPORT_SSW
vesbc(config-esbc-trunk-sip)# remote address 192.168.16.65
vesbc(config-esbc-trunk-sip)# remote port 5060
vesbc(config-esbc-trunk-sip)# media resource 0 MEDIA_SSW

8. Создать SIP-транк в сторону транкового шлюза:

vesbc#
vesbc# configure
vesbc(config)# esbc
vesbc(config-esbc)# trunk sip TRUNK_GATEWAY
vesbc(config-esbc-trunk-sip)# sip transport TRANSPORT_TRUNK_GATEWAY
vesbc(config-esbc-trunk-sip)# remote address 192.168.20.99
vesbc(config-esbc-trunk-sip)# remote port 5060
vesbc(config-esbc-trunk-sip)# media resource 0 MEDIA_TRUNK_GATEWAY

9. Создать таблицу маршрутизации и добавить в нее правила, по которым вызовы, приходящие с транкового шлюза, будут маршрутизироваться на SSW:

vesbc# 
vesbc# configure 
vesbc(config)# esbc 
vesbc(config-esbc)# route-table TO_SSW
vesbc(config-esbc-route-table)# rule 0
vesbc(config-esbc-route-table-rule)# action direct-to-trunk TRUNK_SSW

10. Создать таблицу маршрутизации и добавить в нее правила, по которым вызовы, приходящие с SSW, будут маршрутизироваться на транковый шлюз:

vesbc# 
vesbc# configure 
vesbc(config)# esbc 
vesbc(config-esbc)# route-table TO_TRUNK_GATEWAY
vesbc(config-esbc-route-table)# rule 0
vesbc(config-esbc-route-table-rule)# action direct-to-trunk TRUNK_GATEWAY

11. Привязать созданные таблицы маршрутизации к транкам:

vesbc# 
vesbc# configure 
vesbc(config)# esbc 
vesbc(config-esbc)# trunk sip TRUNK_SSW
vesbc(config-esbc-trunk-sip)# route-table TO_TRUNK_GATEWAY
vesbc(config-esbc-trunk-sip)# exit
vesbc(config-esbc)# trunk sip TRUNK_GATEWAY
vesbc(config-esbc-trunk-sip)# route-table TO_SSW

12. Применить конфигурацию и подтвердить изменения: 

vesbc# commit
vesbc# confirm

В приведённой схеме описаны базовые настройки.

Настройка для SIP-абонентов, использующих WebRTC

Схема применения:


Описание:

SIP-абоненты (WEB, Desktop-клиенты) отправляют сообщения на IP-адрес 192.168.20.120 порт 5062 с помощью WebSocket Secure, ESBC отправляет по TCP данный трафик с IP-адреса 192.168.16.113 порт 5061 на адрес Softswitch (IP АТС/SIP-proxy и т. д) 192.168.16.65 порт 5060.

Для реализации данной схемы общий алгоритм настройки следующий:

  1. Настроить сетевые интерфейсы на ESBC в сторону SSW и в сторону SIP-абонентов.
  2. Создать SIP-транспорт в режиме TCP (only/prefer) в сторону SSW и SIP-транспорт в режиме WSS для SIP-абонентов. 
  3. Создать медиаресурсы для обоих направлений, назначить им диапазон портов для передачи голоса.
  4. Создать медиапрофиль для SIP-абонентов и включить на нём шифрование DTLS-SRTP.
  5. Создать абонентский интерфейс и SIP-транк.
  6. Создать правила, по которым будут маршрутизироваться вызовы от абонентов до SSW.

Порядок конфигурирования ESBC:

1. Настроить IP-адрес на интерфейсе в сторону SSW:

vesbc# configure
vesbc(config)# interface gigabitethernet 1/0/1
vesbc(config-if-gi)# description "SSW"
vesbc(config-if-gi)# ip address 192.168.16.113/24
vesbc(config-if-gi)# ip firewall disable

2. Настроить IP-адрес на внешнем интерфейсе в сторону абонентов:

vesbc# configure
vesbc(config)# interface gigabitethernet 1/0/2
vesbc(config-if-gi)# description "ABONENTS"
vesbc(config-if-gi)# ip address 192.168.20.120/24

3. Создать SIP-транспорт в сторону SSW: 

vesbc#
vesbc# configure
vesbc(config)# esbc
vesbc(config-esbc)# sip transport TRANSPORT_SSW
vesbc(config-esbc-sip-transport)# ip address 192.168.16.113
vesbc(config-esbc-sip-transport)# mode tcp-prefer
vesbc(config-esbc-sip-transport)# port 5061

4. Создать SIP-транспорт в сторону абонентов:

vesbc#
vesbc# configure
vesbc(config)# esbc
vesbc(config-esbc)# sip transport TRANSPORT_ABONENTS
vesbc(config-esbc-sip-transport)# ip address 192.168.20.120
vesbc(config-esbc-sip-transport)# mode wss
vesbc(config-esbc-sip-transport)# port 5062

Если абоненты используют WebSocket, а не WebSocket Secure, то необходимо выбрать mode ws в настройках SIP-транспорта для абонентов.

5. Создать медиаресурсы для согласования и передачи голоса на плече SSW --- ESBC:

vesbc#
vesbc# configure
vesbc(config)# esbc
vesbc(config-esbc)# media resource MEDIA_SSW
vesbc(config-esbc-media-resource)# ip address 192.168.16.113

#Указать диапазон портов, который будет выделяться на ESBC для передачи голоса. Данная команда необязательная. Если ее не указывать, будет использоваться диапазон портов 8000–65535.  
vesbc(config-esbc-media-resource)# port-range 1024-65535

6. Создать медиаресурсы для согласования и передачи голоса на плече ESBC --- Абонентский шлюз/SIP-абоненты:

vesbc#
vesbc# configure
vesbc(config)# esbc
vesbc(config-esbc)# media resource MEDIA_ABONENTS
vesbc(config-esbc-media-resource)# ip address 192.168.20.120

7. Создать медиапрофиль с шифрованием DTLS-SRTP для SIP-абонентов:

vesbc#
vesbc# configure
vesbc(config)# esbc
vesbc(config-esbc)# media profile MEDIA_PROFILE_ABONENTS
vesbc(config-esbc-media-profile)# srtp mode mandatory
vesbc(config-esbc-media-profile)# srtp keying dtls-srtp

8. Создать SIP-транк в сторону SSW:

vesbc#
vesbc# configure
vesbc(config)# esbc
vesbc(config-esbc)# trunk sip TRUNK_SSW
vesbc(config-esbc-trunk-sip)# sip transport TRANSPORT_SSW
vesbc(config-esbc-trunk-sip)# remote address 192.168.16.65
vesbc(config-esbc-trunk-sip)# remote port 5060
vesbc(config-esbc-trunk-sip)# media resource 0 MEDIA_SSW

9. Создать абонентский интерфейс в сторону абонентов:

vesbc#
vesbc# configure
vesbc(config)# esbc
vesbc(config-esbc)# user-interface sip ABONENTS
vesbc(config-esbc-user-interface-sip)# sip transport TRANSPORT_ABONENTS
vesbc(config-esbc-user-interface-sip)# media resource 0 MEDIA_ABONENTS
vesbc(config-esbc-user-interface-sip)# media profile MEDIA_PROFILE_ABONENTS

#Если абоненты находятся за NAT, выполнить команду:
vesbc(config-esbc-user-interface-sip)# nat comedia-mode on

10. Создать таблицу маршрутизации и добавить в нее правила, по которым вызовы, приходящие с абонентов, будут маршрутизироваться на SSW:  

vesbc# 
vesbc# configure 
vesbc(config)# esbc 
vesbc(config-esbc)# route-table TO_SSW
vesbc(config-esbc-route-table)# rule 0
vesbc(config-esbc-route-table-rule)# action direct-to-trunk TRUNK_SSW

11. Привязать созданную таблицу маршрутизации к абонентскому интерфейсу:

vesbc# 
vesbc# configure 
vesbc(config)# esbc 
vesbc(config-esbc)# user-interface sip ABONENTS 
vesbc(config-esbc-user-interface-sip)# route-table TO_SSW

12. Применить конфигурацию и подтвердить изменения:

vesbc# commit
vesbc# confirm

В приведённой схеме описаны базовые настройки.

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

Схема подключения:

Описание:

SIP-абоненты регистрируются на SSW через ESBC. Каждая ESBC должна направлять запросы регистрации на SSW, исходя из номеров абонентов: на SSW_1 должны регистрироваться абоненты с номерами, начинающимися с цифры «1», на SSW_2 - с номерами, начинающимися с цифры «2», на SSW_3 - с номерами, начинающимися с цифры «3». Если одно из направлений отказывает, то ESBC должна перенаправлять регистрации на оставшиеся SSW. При восстановлении доступа к отказавшему SSW на него нужно отправлять регистрации, которые были распределены по другим серверам. Доступность направлений будет контролироваться исходящими OPTIONS.

Для реализации данной схемы общий алгоритм настройки следующий:

  1. Настроить сетевые интерфейсы на каждом ESBC в сторону SSW и в сторону SIP-абонентов.
  2. Создать SIP-транспорт в сторону SSW и SIP-транспорт в режиме для SIP-абонентов. 
  3. Создать медиаресурсы для обоих направлений, назначить им диапазон портов для передачи голоса.
  4. Создать абонентский интерфейс и SIP-транки.
  5. Создать правила, по которым будут маршрутизироваться и балансироваться вызовы от абонентов до SSW.

Порядок конфигурирования ESBC:

1. Настроить IP-адрес на интерфейсе в сторону трёх SSW на каждом ESBC:

Для ESBC_1:

ESBC-1# configure
ESBC-1(config)# interface gigabitethernet 1/0/1
ESBC-1(config-if-gi)# description "SSW"
ESBC-1(config-if-gi)# ip address 192.168.1.10/24
ESBC-1(config-if-gi)# ip firewall disable

Для ESBC_2:

ESBC-2# configure
ESBC-2(config)# interface gigabitethernet 1/0/1
ESBC-2(config-if-gi)# description "SSW"
ESBC-2(config-if-gi)# ip address 192.168.2.10/24
ESBC-2(config-if-gi)# ip firewall disable

Для ESBC_3:

ESBC-3# configure
ESBC-3(config)# interface gigabitethernet 1/0/1
ESBC-3(config-if-gi)# description "SSW"
ESBC-3(config-if-gi)# ip address 192.168.3.10/24
ESBC-3(config-if-gi)# ip firewall disable

2. Настроить IP-адрес на внешнем интерфейсе в сторону абонентов на каждом ESBC:

Для ESBC_1: 

ESBC-1# configure
ESBC-1(config)# interface gigabitethernet 1/0/2
ESBC-1(config-if-gi)# description "ABONENTS"
ESBC-1(config-if-gi)# ip address 10.0.1.10/24

Для ESBC_2:

ESBC-2# configure
ESBC-2(config)# interface gigabitethernet 1/0/2
ESBC-2(config-if-gi)# description "ABONENTS"
ESBC-2(config-if-gi)# ip address 10.0.2.10/24

Для ESBC_3:

ESBC-3# configure
ESBC-3(config)# interface gigabitethernet 1/0/2
ESBC-3(config-if-gi)# description "ABONENTS"
ESBC-3(config-if-gi)# ip address 10.0.3.10/24

3. Создать SIP-транспорт в сторону SSW на каждом ESBC:

Для ESBC_1: 

ESBC-1#
ESBC-1# configure
ESBC-1(config)# esbc
ESBC-1(config-esbc)# sip transport TRANSPORT_SSW
ESBC-1(config-esbc-sip-transport)# ip address 192.168.1.10
ESBC-1(config-esbc-sip-transport)# port 5060

Для ESBC_2: 

ESBC-2#
ESBC-2# configure
ESBC-2(config)# esbc
ESBC-2(config-esbc)# sip transport TRANSPORT_SSW
ESBC-2(config-esbc-sip-transport)# ip address 192.168.2.10
ESBC-2(config-esbc-sip-transport)# port 5060

Для ESBC_3: 

ESBC-3#
ESBC-3# configure
ESBC-3(config)# esbc
ESBC-3(config-esbc)# sip transport TRANSPORT_SSW
ESBC-3(config-esbc-sip-transport)# ip address 192.168.3.10
ESBC-3(config-esbc-sip-transport)# port 5060

 4. Создать SIP-транспорт в сторону абонентов на каждом ESBC:

Для ESBC_1: 

ESBC-1#
ESBC-1# configure
ESBC-1(config)# esbc
ESBC-1(config-esbc)# sip transport TRANSPORT_ABONENTS
ESBC-1(config-esbc-sip-transport)# ip address 10.0.1.10
ESBC-1(config-esbc-sip-transport)# port 5060

Для ESBC_2:  

ESBC-2#
ESBC-2# configure
ESBC-2(config)# esbc
ESBC-2(config-esbc)# sip transport TRANSPORT_ABONENTS
ESBC-2(config-esbc-sip-transport)# ip address 10.0.2.10
ESBC-2(config-esbc-sip-transport)# port 5060

Для ESBC_3:

ESBC-3#
ESBC-3# configure
ESBC-3(config)# esbc
ESBC-3(config-esbc)# sip transport TRANSPORT_ABONENTS
ESBC-3(config-esbc-sip-transport)# ip address 10.0.3.10
ESBC-3(config-esbc-sip-transport)# port 5060

5. Создать медиаресурсы для согласования и передачи голоса на плече SSW --- ESBC  на каждом ESBC:

Для ESBC_1:

ESBC-1#
ESBC-1# configure
ESBC-1(config)# esbc
ESBC-1(config-esbc)# media resource MEDIA_SSW
ESBC-1(config-esbc-media-resource)# ip address 192.168.1.10

#Указать диапазон портов, который будет выделяться на ESBC для передачи голоса. Данная команда необязательная. Если ее не указывать, будет использоваться диапазон портов 8000–65535.  
ESBC-1(config-esbc-media-resource)# port-range 1024-65535

Для ESBC_2:

ESBC-2#
ESBC-2# configure
ESBC-2(config)# esbc
ESBC-2(config-esbc)# media resource MEDIA_SSW
ESBC-2(config-esbc-media-resource)# ip address 192.168.2.10

#Указать диапазон портов, который будет выделяться на ESBC для передачи голоса. Данная команда необязательная. Если ее не указывать, будет использоваться диапазон портов 8000–65535.  
ESBC-2(config-esbc-media-resource)# port-range 1024-65535

 Для ESBC_3:

ESBC-3#
ESBC-3# configure
ESBC-3(config)# esbc
ESBC-3(config-esbc)# media resource MEDIA_SSW
ESBC-3(config-esbc-media-resource)# ip address 192.168.3.10

#Указать диапазон портов, который будет выделяться на ESBC для передачи голоса. Данная команда необязательная. Если ее не указывать, будет использоваться диапазон портов 8000–65535.  
ESBC-3(config-esbc-media-resource)# port-range 1024-65535

6. Создать медиаресурсы для согласования и передачи голоса на плече ESBC --- Абонентский шлюз/SIP-абоненты на каждом ESBC:

Для ESBC_1:

ESBC-1#
ESBC-1# configure
ESBC-1(config)# esbc
ESBC-1(config-esbc)# media resource MEDIA_ABONENTS
ESBC-1(config-esbc-media-resource)# ip address 10.0.1.10

 Для ESBC_2:

ESBC-2#
ESBC-2# configure
ESBC-2(config)# esbc
ESBC-2(config-esbc)# media resource MEDIA_ABONENTS
ESBC-2(config-esbc-media-resource)# ip address 10.0.2.10

Для ESBC_3:

ESBC-3#
ESBC-3# configure
ESBC-3(config)# esbc
ESBC-3(config-esbc)# media resource MEDIA_ABONENTS
ESBC-3(config-esbc-media-resource)# ip address 10.0.3.10

7. Создать SIP-профиль для включения контроля направлений по OPTIONS на каждом ESBC:
Для ESBC_1:
ESBC-1#
ESBC-1# configure
ESBC-1(config)# esbc
ESBC-1(config-esbc)# sip profile SIP_PROFILE
ESBC-1(config-esbc-sip-profile)# keepalive enable 
ESBC-1(config-esbc-sip-profile)# keepalive success-interval 10
ESBC-1(config-esbc-sip-profile)# keepalive failed-interval 10
ESBC-1(config-esbc-sip-profile)# exit 
Для ESBC_2 и ESBC_3 аналогичные настройки.

8. Создать SIP-транки в сторону SSW_1, SSW_2 и SSW_3 на каждом ESBC и добавить в них настроенный SIP-профиль:
Для ESBC_1:
ESBC-1#
ESBC-1# configure
ESBC-1(config)# esbc

#Создаём транк до SSW_1:
ESBC-1(config-esbc)# trunk sip TRUNK_SSW_1
ESBC-1(config-esbc-trunk-sip)# sip transport TRANSPORT_SSW
ESBC-1(config-esbc-trunk-sip)# remote address 192.168.1.20
ESBC-1(config-esbc-trunk-sip)# remote port 5060
ESBC-1(config-esbc-trunk-sip)# sip profile SIP_PROFILE
ESBC-1(config-esbc-trunk-sip)# media resource 0 MEDIA_SSW
ESBC-1(config-esbc-trunk-sip)# exit

#Создаём транк до SSW_2:
ESBC-1(config-esbc)# trunk sip TRUNK_SSW_2
ESBC-1(config-esbc-trunk-sip)# sip transport TRANSPORT_SSW
ESBC-1(config-esbc-trunk-sip)# remote address 192.168.2.20
ESBC-1(config-esbc-trunk-sip)# remote port 5060
ESBC-1(config-esbc-trunk-sip)# sip profile SIP_PROFILE
ESBC-1(config-esbc-trunk-sip)# media resource 0 MEDIA_SSW
ESBC-1(config-esbc-trunk-sip)# exit

#Создаём транк до SSW_3:
ESBC-1(config-esbc)# trunk sip TRUNK_SSW_3
ESBC-1(config-esbc-trunk-sip)# sip transport TRANSPORT_SSW
ESBC-1(config-esbc-trunk-sip)# remote address 192.168.3.20
ESBC-1(config-esbc-trunk-sip)# remote port 5060
ESBC-1(config-esbc-trunk-sip)# sip profile SIP_PROFILE
ESBC-1(config-esbc-trunk-sip)# media resource 0 MEDIA_SSW
ESBC-1(config-esbc-trunk-sip)# exit

Для ESBC_2 и ESBC_3 аналогичные настройки.


9. На каждом ESBC создать транковые группы с балансировкой round robin и включить в неё все созданные транки:
Для ESBC_1:
ESBC-1#
ESBC-1# configure
ESBC-1(config)# esbc
ESBC-1(config-esbc)# trunk-group TRUNK_GROUP
ESBC-1(config-esbc-trunk-group)# balancing round-robin 
ESBC-1(config-esbc-trunk-group)# trunk 1 TRUNK_SSW_1
ESBC-1(config-esbc-trunk-group)# trunk 2 TRUNK_SSW_2
ESBC-1(config-esbc-trunk-group)# trunk 3 TRUNK_SSW_3
ESBC-1(config-esbc-trunk-group)# exit

Для ESBC_2 и ESBC_3 аналогичные настройки.


10. Создать абонентский интерфейс в сторону абонентов на каждом ESBC:

Для ESBC_1:

ESBC-1#
ESBC-1# configure
ESBC-1(config)# esbc
ESBC-1(config-esbc)# user-interface sip ABONENTS
ESBC-1(config-esbc-user-interface-sip)# sip transport TRANSPORT_ABONENTS
ESBC-1(config-esbc-user-interface-sip)# media resource 0 MEDIA_ABONENTS

#Если абоненты находятся за NAT, выполнить команду:
ESBC-1(config-esbc-user-interface-sip)# nat comedia-mode on
Для ESBC_2 и ESBC_3 аналогичные настройки.

11. Создать таблицу маршрутизации и добавить в нее правила, по которым вызовы, приходящие с абонентов, будут балансироваться между SSW_1, SSW_2 и SSW_3 на каждом ESBC:  

Для ESBC_1:

ESBC-1# 
ESBC-1# configure 
ESBC-1(config)# esbc 
ESBC-1(config-esbc)# route-table ROUTE_TABLE

#Создаём правило, направляющее запросы на транк TRUNK_SSW_1 для абонентов с номером который начинается с 1:
ESBC-1(config-esbc-route-table)# rule 0
ESBC-1(config-esbc-route-table-rule)# action direct-to-trunk TRUNK_SSW_1
ESBC-1(config-esbc-route-table-rule)# condition 0 cgpn pattern "1.*"
ESBC-1(config-esbc-route-table-rule)# exit

#Создаём правило, направляющее запросы на транк TRUNK_SSW_2 для абонентов с номером который начинается с 2:
ESBC-1(config-esbc-route-table)# rule 1
ESBC-1(config-esbc-route-table-rule)# action direct-to-trunk TRUNK_SSW_2
ESBC-1(config-esbc-route-table-rule)# condition 0 cgpn pattern "2.*"
ESBC-1(config-esbc-route-table-rule)# exit

#Создаём правило, направляющее запросы на транк TRUNK_SSW_3 для абонентов с номером который начинается с 3:
ESBC-1(config-esbc-route-table)# rule 2
ESBC-1(config-esbc-route-table-rule)# action direct-to-trunk TRUNK_SSW_3
ESBC-1(config-esbc-route-table-rule)# condition 0 cgpn pattern "3.*"
ESBC-1(config-esbc-route-table-rule)# exit  

#Создаём правило для закрепления регистраций на направлении. Правило нужно, чтобы при обновлении регистрации абонент не регистрировался на другом сервере, а обновлял регистрацию там, где она уже есть. В случае, если основной сервер станет недоступен и абонент зарегистрируется на другом SSW:
ESBC-1(config-esbc-route-table)# rule 3
ESBC-1(config-esbc-route-table-rule)# action refresh-registration 
ESBC-1(config-esbc-route-table-rule)# exit 

#Создаём правило, направляющее запросы на транковую группу TRUNK_GROUP для перераспределения абонентов в случае оказа основного SSW:
ESBC-1(config-esbc-route-table)# rule 4
ESBC-1(config-esbc-route-table-rule)# action direct-to-trunk-group TRUNK_GROUP
ESBC-1(config-esbc-route-table-rule)# exit 

Для ESBC_2 и ESBC_3 аналогичные настройки.

Схема таблицы маршрутизации:

12. Привязать созданную таблицу маршрутизации к абонентскому интерфейсу на каждом ESBC:

Для ESBC_1:

ESBC-1# 
ESBC-1# configure 
ESBC-1(config)# esbc 
ESBC-1(config-esbc)# user-interface sip ABONENTS 
ESBC-1(config-esbc-user-interface-sip)# route-table ROUTE_TABLE

Для ESBC_2 и ESBC_3 аналогичные настройки.

13. Применить конфигурацию и подтвердить изменения:

ESBC-1# commit
ESBC-1# confirm

В приведённой схеме описаны базовые настройки.

Теперь регистрации будут распределяться по серверам исходя из номера абонента. При выходе из строя одного из SSW абоненты с него будут регистрироваться на других серверах. В случае восстановления доступа к отказавшему SSW на него будут маршрутизироваться регистрации, которые были распределены по другим серверам. Также, если регистрация придёт на другой ESBC либо он выйдет из строя, другие ESBC смогут отправить регистрацию на нужный SSW.