...
Допускается использование следующей конструкции при составлении регулярных выражений PCRE для помещения значений в локальные переменные (от 0 до 9) с помощью цифр, экранированных обратной чертой ('\1-9'). '\0' - весь текст:
| Блок кода | ||
|---|---|---|
| ||
value-pattern '(some)-(value)' # значения some и value заносятся в локальные переменные pcre 1 и 2 соответственно replacement '\2-\1' # значения переменных меняются местами |
Результат замены: value-some
Данные переменные используются в рамках одной модификации. Для использования переменных в разных модификациях одной таблицы модификаций используется модификатор типа copy.
| Примечание |
|---|
При применении на транке/user-interface модификаторов обоих типов одновременно, используется следующий порядок их обработки, в зависимости от направления модификации:
|
mod-table common
Пример использования модификатора common.
...
Данный тип модификации позволяет изменять любые заголовки сообщений 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 может привести к нарушению обработки сообщений. Не рекомендуется модифицировать основные заголовки. |
Логика обработки сообщения SIP при использовании IN модификации.
...
- add — добавление заголовка.
- no-transit — удаление заголовка. Данная команда используется модификация применяется только при использовании в качестве out заголовках (таблицы in всегда вырезают все заголовки, полученные в сообщении из сети).
replace — замена заголовка.
transit — передача заголовка. Данная команда используется модификацияприменяется только при использовании в качестве in таблицах (таблицы out всегда передают все заголовки, полученные с другого плеча).
- copy - позволяет скопировать значение или часть значения заголовка в переменную для использования этого значения в модификаторах add или transit в рамках одной таблицы модификаций (на одном плече вызова).
...
Модификации в рамках одной таблицы применяются последовательно ко всем заголовкам в порядке добавленном в конфигурации, т.е. первая модификация применяется ко всем заголовкам, затем вторая модификация применится ко всем заголовкам и т.д.
В результате если какой-либо заголовок был добавлен модификацией add а затем этот же заголовок был указан в правиле no-transit, то в исходящем сообщении этот заголовок не будет передан.
Пример:
Таблица модификации SIP_MOD ипользуется в качестве OUT
| Блок кода | ||
|---|---|---|
| ||
mod-table sip SIP_MOD
mod 1 add
sip method pattern '.+'
sip response-pattern '.+'
header name Test_header
header value Test_value
exit
mod 2 no-transit
sip header-pattern 'Test_header'
sip method pattern '.+'
sip response-pattern '.+'
value-pattern 'Test_value'
exit |
...
| Блок кода | ||
|---|---|---|
| ||
vesr# vesr# configure vesr(config)# esbc #Создание таблицы модификаторов MODTABLE_IN: vesr(config-esbc)# mod-table sip MODTABLE_IN vesr(esbc-mod-table)# #Добавление в таблицу модификаторов правила на добавление заголовка: vesr(esbc-mod-table)# mod 0 add vesr(esbc-mod-table-modification)# #Выбор запроса, в котором будет добавлен заголовок(в данном случае INVITE): vesr(esbc-mod-table-modification)# sip- method type Invite #Указать название заголовка, который необходимо вставить (в данном случае Test_header): vesr(esbc-mod-table-modification)# header name Test_header #Указать содержимое заголовка, которое необходимо вставить (в данном случае example string): vesr(esbc-mod-table-modification)# header value "example string" vesr(esbc-mod-table-modification)# exit vesr(esbc-mod-table)# exit #Привязать таблицу модификаторов к входящему транку TRUNK_IN: vesr(config-esbc)# trunk sip TRUNK_IN vesr(config-esbc-trunk-sip)# mod-table sip in MODTABLE_IN #Применить и подтвердить изменения: vesr(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. vesr(config-esbc-trunk-sip)# do confirm Configuration has been confirmed. Commit timer canceled. |
...
| Блок кода | ||
|---|---|---|
| ||
vesr# vesr# configure vesr(config)# esbc #Создание таблицы модификаторов MODTABLE_OUT: vesr(config-esbc)# mod-table sip MODTABLE_OUT vesr(esbc-mod-table)# #Добавление в таблицу модификаторов правила на удаление заголовка: vesr(esbc-mod-table)# mod 0 no-transit vesr(esbc-mod-table-modification)# #Выбор запроса, в котором будет удален заголовок (в данном случае INVITE): vesr(esbc-mod-table-modification)# sip- method type Invite #Указать название заголовка, который необходимо удалить (в данном случае Test_header): vesr(esbc-mod-table-modification)# sip header-header pattern Test_header #Указать содержимое заголовка, при совпадении с которым заголовок будет удален (в данном случае example string): vesr(esbc-mod-table-modification)# value-pattern "example string" vesr(esbc-mod-table-modification)# exit vesr(esbc-mod-table)# exit #Привязать таблицу модификаторов к исходящему транку TRUNK_OUT: vesr(config-esbc)# trunk sip TRUNK_OUT vesr(config-esbc-trunk-sip)# mod-table sip out MODTABLE_OUT #Применить и подтвердить изменения: vesr(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. vesr(config-esbc-trunk-sip)# do confirm Configuration has been confirmed. Commit timer canceled. |
...
| Блок кода | ||
|---|---|---|
| ||
vesr# vesr# configure vesr(config)# esbc #Создание таблицы модификаторов MODTABLE_IN: vesr(config-esbc)# mod-table sip MODTABLE_IN vesr(esbc-mod-table)# #Добавление в таблицу модификаторов правила на транзитзамену заголовка: vesr(esbc-mod-table)# mod 01 transit vesr(esbc-mod-table-modification)# replace #Выбор запроса, в котором будетбудут транзититься заголовок (в данном случае INVITE)заменяться заголовки: vesr(esbc-mod-table-modification)# sip method-method type Invite #Указать название заголовка, содержимое которыйкоторого необходимо транзитить (в данном случае Test_header)заменить: vesr(esbc-mod-table-modification)# sip header-header pattern Test_header #Указать место в содержимом заголовка, которое необходимо заменить (конец строки исходного содержимого заголовка): vesr(esbc-mod-table-modification)# exitvalue-pattern $ #Добавление в таблицу модификаторов правила на замену заголовка#Добавить правило для подмены содержимого заголовка (к концу строки исходного содержимого заголовка добавляется 456): vesr(esbc-mod-table-modification)# modreplacement 1 replace456 #Выбор запроса, в котором будут заменяться заголовки: vesr(esbc-mod-table-modification)# sip-method type Invite #Указать название заголовка, содержимое которого необходимо заменитьexit vesr(esbc-mod-table)# exit #Привязать таблицу модификаторов к входящему транку TRUNK_IN: vesr(config-esbc-mod-table-modification)# trunk sip TRUNK_IN vesr(config-esbc-trunk-sip)# mod-table sip-header patternin TestMODTABLE_headerIN #Указать#Применить местои в содержимом заголовка, которое необходимо заменить (конец строки исходного содержимого заголовка)подтвердить изменения: vesr(config-esbc-modtrunk-table-modificationsip)# do value-patterncommit $ #Добавить правило для подмены содержимого заголовка (к концу строки исходного содержимого заголовка добавляется 456): vesr(esbc-mod-table-modification)# replacement 456 vesr(esbc-mod-table-modification)# exit vesr(esbc-mod-table)# exit #Привязать таблицу модификаторов к входящему транку TRUNK_IN: vesr(config-esbc)# trunk sip TRUNK_IN vesr(config-esbc-trunk-sip)# mod-table sip in MODTABLE_IN #Применить и подтвердить изменения: vesr(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. vesr(config-esbc-trunk-sip)# do confirm Configuration has been confirmed. Commit timer canceled. |
| Scroll Pagebreak |
|---|
Configuration has been successfully applied and saved to flash. Commit timer started, changes will be reverted in 600 seconds.
vesr(config-esbc-trunk-sip)# do confirm
Configuration has been confirmed. Commit timer canceled. |
| Scroll Pagebreak |
|---|
| Блок кода |
|---|
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.130129:54615460 SIP/2.0 Via: SIP/2.0/UDP 192.168.114.129130:54615460;rport;branch=z9hG4bK-375510-1-5z9hG4bKPjIbcILUaVB0cQTFaGLLb7ccpnbTQIRvV3 Max-Forwards: 70 From: "Simple UAC send bye" <sip:24001@192.168.114.130130>;cpc=priority>;tag=1375510toP8wIO79wo47ChSYy69MFOyd4vhGRNF To: "24000" <sip:24000@192.168.114.130> Call-ID: 1-375510@192.168.114.129 CSeq: 1 INVITE 129> Contact: <sip:24001@192.168.114.129:5461> Max-Forwards: 70 #Заголовок, который необходимо протранзитить и заменить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: 123123456 Content-Type: application/sdp Content-Length: 149157 v=0 o=tester 1234563927607871 6543213927607871 IN IP4 192.168.114.129130 s=A conversation c=IN IP4 192.168.114.129130 t=0 0 m=audio 76248090 RTP/AVP 8 a=rtpmap:8 PCMA/8000 |
...
| Scroll Pagebreak |
|---|
Пример использования локальных переменных pcre в модификации replace (схема та же):
| Блок кода | ||
|---|---|---|
| ||
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 |
| Scroll Pagebreak |
|---|
Пример (схема та же):
vesr#
vesr# configure
vesr(config)# esbc
#Создание таблицы модификаторов MODTABLE_IN:
vesr(config-esbc)# mod-table sip MODTABLE_IN
vesr(esbc-mod-table)#
#Добавление в таблицу модификаторов правила на замену заголовка:
vesr(esbc-mod-table)# mod 1 replace
#Выбор запроса, в котором будут заменяться заголовки:
vesr(esbc-mod-table-modification)# sip method-type Invite
#Указать название заголовка, содержимое которого необходимо заменить:
vesr(esbc-mod-table-modification)# sip header-pattern Date
#Указать место в содержимом заголовка, которое необходимо заменить (шаблон - дата в формате "год-месяц-число"):
vesr(esbc-mod-table-modification)# value-pattern "(\\d{4})-(\\d{2})-(\\d{2})"
#Добавить правило для подмены содержимого заголовка (меняем формат даты на "месяц/число/год"):
vesr(esbc-mod-table-modification)# replacement "\\2/\\3/\\1"
vesr(esbc-mod-table-modification)# exit
vesr(esbc-mod-table)# exit
#Привязать таблицу модификаторов к входящему транку TRUNK_IN:
vesr(config-esbc)# trunk sip TRUNK_IN
vesr(config-esbc-trunk-sip)# mod-table sip in MODTABLE_IN
#Применить и подтвердить изменения:
vesr(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.
vesr(config-esbc-trunk-sip)# do confirm
Configuration has been confirmed. Commit timer canceled. |
| Scroll Pagebreak |
|---|
| Блок кода |
|---|
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 |
Пример использования модификатора копирования (copy)
Схема:
В конфигурации есть два транка, настроена маршрутизация. Вызов, который приходит из TRUNK_IN уходит в TRUNK_OUT. В TRUNK_OUT отправляется запрос INVITE, в теле которого есть заголовок Diversion (предварительно следует настроить таблицу модификации на IN транка TRUNK_IN для транзита заголовка Dicersion на второе плечо). Требуется, чтобы в запросе INVITE, который отправляется в TRUNK_OUT, вырезался заголовок Diversion, а его значение из user part было добавлено в display name заголовка From.
| Блок кода | ||
|---|---|---|
| ||
vesr#
vesr# configure
vesr(config)# esbc
#Создание таблицы модификаторов MODTABLE_OUT:
vesr(config-esbc)# mod-table sip MODTABLE_OUT
vesr(esbc-mod-table)#
#Добавление в таблицу модификаторов правила copy для копирования значения user part в переменную u01:
vesr(esbc-mod-table)# mod 0 copy
vesr(esbc-mod-table-modification)#
#Выбор запроса, в котором будет использоваться модификатор cpoy (в данном случае INVITE):
vesr(esbc-mod-table-modification)# sip method type Invite
#Указать название заголовка, из которого необходимо копировать значение (в данном случае Diversion):
vesr(esbc-mod-table-modification)# sip header-pattern Diversion
#Указать содержимое заголовка, при совпадении с которым будет выполнено копирование в пременную. В переменную будет скопирована та часть отбора которая указана в скобках:
vesr(esbc-mod-table-modification)# value-pattern '<sip:(.+)@'
#Указать переменную в которую будет скопировано значение указанное в скобках, в примере - (.+):
vesr(esbc-mod-table-modification)# variable-str 'u01'
vesr(esbc-mod-table-modification)# exit | ||
| Блок кода | ||
| ||
vesr# vesr# configure vesr(config)# esbc #Создание таблицы модификаторов MODTABLE_IN: vesr(config-esbc)# mod-table sip MODTABLE_IN vesr(esbc-mod-table)# #Добавление в таблицу модификаторов правила наreplace для транзитзамены заголовка From: vesr(esbc-mod-table)# mod 0 transit 1 replace #Указать название заголовка, в котором будет осуществляться замена: vesr(esbc-mod-table-modification)# sip header-pattern 'From' #Выбор запроса, в котором будет использоваться транзититьсямодификатор заголовокreplace (в данном случае INVITE): vesr(esbc-mod-table-modification)# sip- method type Invite #Указать названиечасть содержимого заголовка, которыйкоторую необходимо транзититьзаменить: vesr(esbc-mod-table-modification)# sipvalue-headerpattern pattern Date vesr(esbc-mod-table-modification)# exit #Добавление в таблицу модификаторов правила на замену заголовка: vesr(esbc-mod-table)# mod 1 replace #Выбор запроса, в котором будут заменяться заголовки'.+ <sip:' # Указать переменную u01, которая содержит значение, полученное в модификации copy: vesr(esbc-mod-table-modification)# sip-method type Invite #Указать название заголовка, содержимое которого необходимо заменить:replacement '\u01 <sip:$' vesr(esbc-mod-table-modification)# sip-header pattern Dateexit #Указать место#Добавление в содержимомтаблицу заголовка,модификаторов которое необходимо заменить (шаблон - дата в формате "год-месяц-число")правила no-transit для удаления заголовка Diversion: vesr(esbc-mod-table-modification)# value-pattern "(\\d{4})-(\\d{2})-(\\d{2})" #Добавить правило для подмены содержимого заголовка (меняем формат даты на "месяц/число/год"):mod 2 no-transit vesr(esbc-mod-table-modification)# sip header-pattern 'Diversion' vesr(esbc-mod-table-modification)# sip method replacement "\\2/\\3/\\1" type Invite vesr(esbc-mod-table-modification)# exit vesr(esbc-mod-table)# exit #Привязать таблицу модификаторов к входящемуисходящему транку TRUNK_INOUT: vesr(config-esbc)# trunk sip TRUNK_INOUT vesr(config-esbc-trunk-sip)# mod-table sip inout MODTABLE_INOUT #Применить и подтвердить изменения: vesr(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. vesr(config-esbc-trunk-sip)# do confirm Configuration has been confirmed. Commit timer canceled. |
...
|
После внесения изменений в конфигурацию с TRUNK_IN приходит следующий INVIITE:
| Блок кода | ||
|---|---|---|
| ||
INVITE sip:135@1024001@192.25168.7280.151129:50605080 SIP/2.0 Via: SIP/2.0/UDP 10192.25168.7280.3526:50635070;rport;branch=z9hG4bK-1104631473191-1-01 From: test <sip:134@1024001@192.25168.7280.151:5060;user=phone>26:5070>;tag=1 To: sut <sip:135@1023002@192.25168.7280.151:5060;user=phone>129:5070> Call-ID: 1-1104631@10473191@192.25168.7280.3526 CSeqCseq: 1 INVITE Contact: <sip:24001@192.168.80.26:5070> Max-Forwards: 70 Supported: replaces, timer Contact: <sip:134@10.25.72.35:5063>#Заголовок, который необходимо протранзитить и изменить Date: 2024-09-10 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: 153118 [SDP]... |
На TRUNK_OUT отправляется уже модифицированный INVITE с измененным заголовком From и без заголовка Diversion:
| Блок кода | ||
|---|---|---|
| ||
INVITE sip:23002@192.168.80.26:5080 SIP/2.0 Via: SIP/2.0/UDP 10192.25168.7280.151129:50605080;rport;branch=z9hG4bKPjc5kLf-R0rh5Stla2eTvpoVAxOc0Jrz9hG4bKPjbURYAQZxa2m1zsT6x.kXs6RQ28ONE4EifS Max-Forwards: 70 From: "11111" <sip:134@1024001@192.25168.7280.151>129>;tag=lMWgbj2x66hzNDHhP8ef8tWvB2HT2DwHJfl7n8XBMrh6vjCcB036Ogz6QX4BTDCo To: "sut" <sip:135@19223002@192.168.2380.140>26> Contact: <sip:134@1024001@192.25168.7280.151:5060;transport=udp>129:5080> Call-ID: c09c3761560702267daaee76eb769a9cbbf5db1c228015eecddfe0d7079ce876 CSeq: 50218798 INVITE Allow: PRACK, SUBSCRIBE, NOTIFY, REFER, INVITE, ACK, BYE, CANCEL, UPDATE Supported: 100rel, replaces #Измененный заголовок: Date: 09/10/2024 Content-Type: application/sdp Content-Length: 163119 [SDP]... |
Scroll Pagebreak
Работа с логами
...
