В связи с повышенным вниманием к моим довольно старым статьям о практическом применении SS7 (
), пришлось обновить материал и написать новую статью.
Вкратце, о чём эта статья. Она о том, как запустить стек SS7 на персональном компьютере с минимумом затрат по времени и нулевыми затратами по деньгам. При этом Вы получите полноценный промышленный стек SS7 от известного вендора - Dialogic (входит в состав компании Intel) с поддержкой Sigtran (M2PA, M3UA, SUA), SCCP, TCAP, MAP, IS41 и INAP (затрудняюсь сказать какой именно).
Всем, кто так или иначе связан (или собирается себя связать) с сетями мобильной связи.
А это - студенты, аспиранты, начинающие и не очень инженеры, разработчики.
Немного о стеке SS7.
Раньше производитель назывался DataKinetics, потом его купила компания Dialogic, а сейчас это часть Intel (название так и оставили, потому что довольно раскрученное). Dialogic известен в мире голоса своими дорогими, но надёжными голосовыми (TDM) платами и не менее дорогим SDK. На них строят разные IVR-системы. Причём по своему опыту скажу, что треть предлагаемых решений IVR в мировом телеком рынке - это решения на базе Dialogic.
Что для этого понадобится:
Вариант 1. Два отдельных компьютера под управлением MS Windows (начиная с XP), Linux или Solaris.
Вариант 2. Один компьютер с установленным ПО для виртуализации. Я рекомендую
Oracle VirtualBox. Гостевая ОС может быть любой из перечисленных в варианте 1. Проще всего Windows XP. Маленький ньюанс - очень желательна поддержка аппаратной виртуализации процессором (Intel, начиная с какого-то из Pentium IV. AMD - не знаю). Иначе скорость работы будет утомлять.
Вариант 3. Один компьютер и 1 виртуальный сервер от Amazon. Amazon предлагает попробовать свои услуги бесплатно в течении года, инструкция по настройке есть на
Хабре. Важный момент - Sigtran будет работать только поверх VPN, потому что брендмауэр Амазона не понимает протокол SCTP.
Все дальнейшие инструкции будут относиться в равной степени к Вариантам 1 и 2. В случае Варианта 3 есть незначительные изменения, связанные с использованием адресации VPN-тоннеля.
В дальнейшем я предполагаю, что Вы используете Windows XP в качестве ОС. Отличия от Linux и Solaris незначительные и касаются только процесса установки.
Часть 1. Установка SS7 стека.
Все ссылки для скачивания находятся на этой странице:
http://www.dialogic.com/Products/signaling-and-ss7-components/download/dsi-interface-protocol-stacks.aspx
Надо скачать:
1.
DPK for Windows
2.
Software Environment Programmer's Manual (пригодится позже. Также содержит инструкцию по установке стека в Linux и Solaris)
3.
MAP Test Utility User Guide (это описания тестовых утилит, которые будут генерировать трафик. Интерес представляет как минимум раздел 5 Running the MTU and MTR application)
При установке DSI не надо отмечать драйвера (SS7HD, SPCI, etc) - мы будем работать только с Sigtran, который не требует специального оборудования.
После установки в папке C:\DSI\UPD\RUN будет 2 важные папки - MTU (генерирует сообщения протокола MAP) и MTR (отвечает на сообщения).
MAP это Mobile Application Part, протокол, который отвечает в сети GSM за многое, в т.ч. - регистрацию абонентов и передачу смс. Эти тестовые приложения генерируют несколкьо видов сообщений, но самое показательное - MAP-FORWARD-SHORT-MESSAGE. Простым языком - передача смс.
На этом этап установки закончен.
Часть 2. Описание SS7 стека
Стек работает следующим образом:
1. Во-первых используется модульная система. SS7 это набор протоколов. Так вот, каждый из них реализован в этом стеке отдельным модулем (читай приложением).
Поясню на примере. Если используется SS7 over TDM (через Е1 потоки), то сигнальная плата обрабатывает MTP1 (физика) и MTP2 (канальный уровень). На сервере запускается mtp3.exe (модуль MTP3 - частично сетевой уровень модели OSI), а дальше, в зависимости от назначения системы:
isup.exe (если платформа обрабатывает голосовой трафик);
sccp.exe+tcap.exe+map/inap.exe (для MAP/INAP трафика).
Есть возможность не использовать модули верхних уровней, а вместо этого написать собственное приложение для их обработки. Многие производители ПО для мобильных операторов так и поступают.
2. У каждого модуля есть идентификатор (module_id), который используется для маршрутизации сообщений внутри стека. Это номера от 0 до 254, обычно пишутся в 16-ричном формате.
Часть модулей имеют зарезервированные номера. Об этом можно почитать в Software Environment Manual. Документ сложный для понимания, потому что написан скорее для разработчиков и содержит много программистской специфики.
3. Запуск стека осуществляет утилита gctload. Она читает главный конфигурационный файл system.txt, создаёт в памяти очереди сообщений для всех модулей, запускает все эти модули (прописаны в system.txt) и что-то там ещё (всех деталей я, к сожалению, не знаю).
В файле system.txt прописаны все модули, которые инициализируются при запуске, все приложения (путь к приложению, параметры запуска).
4. Лицензирование. Самый интересный момент :)
Поскольку стек модульный, то лицензии идут к каждому модулю. Плюс, если используется сигнальная карта, то на ней есть место для установки специальной licence button для протокола MTP2 (выглядит как батарейка для материнской платы, но толще). Новые сигнальные карты уже используют программную лицензию.
Самое приятное в лицензировании от Dialogic это возможность использования пробного режима (trial mode). Для его использования нужно при запуске модуля (m3ua.exe, m2pa.exe, sccp.exe) указать ключ -t.
Ещё пару лет тому назад, trial mode разрешал работать 8 часов (чем как-то пришлось пользоваться даже в production системе). Сейчас только 1 час. Модули честно об этом признаются при запуске и по прошествии одного часа просто перестают обрабатывать трафик. Для продолжения работы стек должен быть перезапущен.
Часть 3. Запуск SS7 стека.
1. Если Вы используете Virtual Box, то в настройках надо выбрать Bridged network (Сетевой мост) и скорее всего настроить IP адреса вручную. У меня заработало ещё и через "Виртуальный адаптер хоста". Не уверен, что это единственные опции, но через NAT, который используется по-умолчанию, Sigtran скорее всего работать не будет. Ещё очень важный момент - надо выключить грёбаный защитник Виндовс. Я полчаса не мог понять почему пакеты только в одну сторону ходят :)
2. Перед запуском надо написать правильный system.txt. Благо Dialogic тут помог и в папке C:\DSI\UPD\RUN\MTU\M3UA_CONFIG\ уже есть готовый пример для "отправителя" сообщений (эмуляция SMSC).
Аналогично, в папке C:\DSI\UPD\RUN\MTR\M3UA_CONFIG\ есть пример для "получателя" сообщений.
Одна проблема - пример для Линукс, так что перемещаем system.txt в наш "корень" (C:\DSI\) и исправляем пути во всех FORK_PROCESS (системный вызов ОС, отвечает за создание процесса с новым process id). Дополнительно мне пришлось снять атрибут "Только чтение" с файла. У меня в итоге получилось что-то такое (привожу только окончание файла):
FORK_PROCESS tim.exe
FORK_PROCESS tick.exe
FORK_PROCESS s7_mgt -d
FORK_PROCESS s7_log -fss7.log -tt
*
* SCTP and SCTPD for non-native SCTP
FORK_PROCESS sctp.exe
FORK_PROCESS sctpd.exe
*
* SCTPn for native SCTP
*FORK_PROCESS ../../../../sctpn
*
FORK_PROCESS HSTBIN\m3ua -t
FORK_PROCESS HSTBIN\sccp -t
FORK_PROCESS HSTBIN\tcap -t
FORK_PROCESS HSTBIN\map -t
Важное замечание для тех, кто устанавливает стек на Linux/Solaris. Поскольку это нормальные сетевые ОС (в отличии от Windows), то в них уже есть поддержка SCTP на уровне ядра.
Dialogic настоятельно рекомендует использовать именно реализацию SCTP операционной системы. Для этого вместо sctp и sctpd, надо запустить только sctpn.
3. Проверяем, что конфигурация правильная.
Для этого можно попробовать запустить стек. В первый раз это лучше сделать через консоль (Пуск-выполнить-cmd). Дальше перейти в папку c:\DSI, а в ней выполнить gctload.exe
В моём случае Виндовс ругнулся на отсутствующую библиотеку, поэтому в консоли вызвал
PATH=
Получил текущее значение путей поиска, а дальше
PATH=скопировать текущие пути;C:\DSI\LIB32 (или LIB64, если у Вас 64-битная ОС)
4. gctload при запуске выдаст некоторые сообщения:
(3588)gctload: Verification started.
(3588)gctload: Verification complete.
(3588)gctload: Initialisation complete.
S7_log : mod ID=0xef, options=0xaf0d, max_param_len=320
S7_log : Writing log file ss7.log --- это лог файл. Туда будут писаться разные полезные сообщения. Читать их, правда, иногда трудно
Failed to open s7_mgt configuration file : config.txt --- config.txt мы ещё не написали, так что не обращаем внимания
Cannot open configuration file config.txt
SS7 TCAP started in trial mode.
This binary will terminate after 1 hour. --- а вот и лицензия на 1 час
SS7 MAP started in trial mode.
This binary will terminate after 1 hour.
SS7 SCCP started in trial mode.
This binary will terminate after 1 hour.
SS7 M3UA started in trial mode.
This binary will terminate after 1 hour.
5. Важная информация.
Остановить gctload можно и по Ctrl-C. Но я крайне не рекомендую этого делать. Раньше даже во всей документации этого не рекомендовали. Для правильного останова надо в другой консоли сделать: gctload.exe -x
Иначе есть шанс, что стек оставит в памяти свои служебные очереди сообщений и в следующий раз просто не запустится или будет работать неправильно. Может это уже давно исправили, но лучше не рисковать.
6. В system.txt указан запуск s7_mgt. Это приложения для конфигурации SS7 параметров стека. По-умолчанию использует файл config.txt, пример которого есть в C:\DSI\UPD\RUN\MTU\M3UA_CONFIG\
Этот файл требует более детального исправления.
* Local IP Address Configuration
CNSYS:IPADDR=192.168.0.1; - адрес интерфейса, который будет использоваться для отправки/получения сообщений.
Перед тем, как указывать адрес, убедитесь, что обе ОС находятся в одной сети. Лучше всего сперва проверить с помощью ping что системы "видят" друг-друга, а потом уже настраивать стек. И НЕ ЗАБУДЬТЕ ОТКЛЮЧИТЬ ЗАЩИТНИК ВИНДОВС.
* SCTP Association configuration to Remote IPSP
SNSLI:SNLINK=1,IPADDR=192.168.0.2,SNTYPE=M3UA,SNEND=C; - тут указывается адрес второй ОС. Я надеюсь, понятно, что на втором компьютере адреса меняются местами?
SNEND определяет, кто будет сервером (SNEND=S), а кто клиентом (SNEND=С). Поэтому на одной машине ставим C, на другой S.
Ещё в этой команде можно указать порты (HPORT и PPORT), но по-умолчанию используется 2905.
* Remote Application Server Configuration
SNRAI:RAS=1,DPC=2; - Указываем Destination Point Code удалённой системы. Это адресация уровня MTP3 (M3UA, который мы настраиваем, это реализация MTP3 поверх SCTP).
* Add Remote AS to Association
SNALI:SNAL=1,RAS=1,SNLINK=1; - этот момент надо в документации читать. Но похоже на привязку удалённого Application Server к конкретной ассоциации (ассоциация это аналог signaling link в MTP2).
* SCCP_CONFIG
SCCP_CONFIG 1 0x8 0x0102 0x01
Тут указываем локальный Point Code (одна система будет с 1, вторая с 2), SSF (указатель на протокол, который после MTP3. В данном случае это будет SCCP (0x08).
Опции (0x0102) описаны в документации и их вычисление задача нетривиальная. Надо перевести число в двоичную форму, выбрать нужные биты (сделать их равными 1), потом всё перевести в 16-ричную.
Send UIS - User In Service (0x01). Здесь мои знания расходятся с тем, что написано в документации, поэтому если Вам интересно - читайте Software Environment Manual.
Остальные параметры не трогаем. Сохраняем файл config.txt.
7. Теперь пробуем по-очереди запустить стек на обоих системах.
Если всё было правильно, то в консоли получим что-то такое:
S7_MGT Boot complete --- важная строка. Говорит, что стек запустился
S7L:00:08:48.131 I0000 M3UA Association Status : id=0 UP
S7L:00:08:48.131 I0000 M3UA Indication : ASP UP, Association=0
S7L:00:08:48.131 I0000 M3UA Notify : AS Inactive, Association=0 ASP=0
S7L:00:08:48.131 I0000 M3UA Indication : ASP ACTIVE, Association=0 AS=0
S7L:00:08:48.131 I0000 M3UA Indication : AS ACTIVE, AS=0
S7L:00:08:48.131 I0000 M3UA Notify : AS Active, Association=0 ASP=0 --- Ассоциация доступна
После того, как стек запущен, можно попробовать отправлять смс.
MTR.exe уже должно быть запущено на стороне получателя (приложение в system.txt для MTR прописано).
MTU надо запускать вручную в консоли.
Пример запуска пишется, если ввести параметры неправильно (или совсем без параметров).
Хотя указанные при этом параметры - неправильные. Как вариант, можно попробовать так:
mtu -d0 -p2 -a43020008 -g43010008 -i222331234567890 -s"Test message"
Я очень рекомендую запустить Wireshark в одной из ОС и следить за всеми сообщениями, которые будут передаваться между системами. Можете использовать фильтр "sctp" для начальной настройки, а потом "sccp".
Если есть вопросы - задавайте в коментариях. Постараюсь ответить.