05

Архитектура системы

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

Общая схема

Enterprise-архитектура: 43 страны, carrier-grade, миграция на FreeSWITCH

Архитектура для крупной компании с присутствием в 43 странах. Гео-распределённая система с полной отказоустойчивостью, SBC на границе каждого региона, локальный breakout трафика (вызовы остаются в регионе), централизованное управление и мониторинг. Каждый регион автономен — при потере связи между регионами локальные вызовы продолжают работать.

═══════════════════════════════════════════════════════════════════════════════════════
                     ГЛОБАЛЬНАЯ АРХИТЕКТУРА — 43 СТРАНЫ, 4 РЕГИОНА
═══════════════════════════════════════════════════════════════════════════════════════

                              ┌─────────────────────────────┐
                              │      КЛИЕНТЫ (43 страны)    │
                              │  WebPhone   IP-телефоны     │
                              │  Мобильные  Софтфоны        │
                              │  Web UI     Contact Center  │
                              └──────────────┬──────────────┘GeoDNS / Anycast
                               (маршрутизация к ближайшему региону)
                                             │
              ┌──────────────────────────────┬┴┬──────────────────────────────┐
              ▼                              ▼                                ▼
┌──────────────────────┐  ┌──────────────────────┐  ┌──────────────────────┐
│  РЕГИОН: EUROPE      │  │  РЕГИОН: AMERICAS    │  │  РЕГИОН: ASIA-PAC    │  + MIDDLE EAST
│  Frankfurt (Primary) │  │  US-East (Primary)   │  │  Singapore (Primary) │    Dubai
│  Amsterdam (Standby) │  │  US-West (Standby)   │  │  Tokyo (Standby)     │
│  ~20 стран           │  │  ~10 стран           │  │  ~8 стран            │    ~5 стран
└──────────┬───────────┘  └──────────┬───────────┘  └──────────┬───────────┘
           │                           │                           │
           └───────────────────────────┼───────────────────────────┘
                                       │
                          Межрегиональная связь
                     (WireGuard VPN mesh / выделенные каналы)
                                       │
                              ┌────────┴────────┐
                              ▼                  ▼
                   ┌──────────────────┐  ┌──────────────────┐
                   │  CENTRAL MGMT    │  │  GLOBAL MONITOR  │
                   │  Go API Master   │  │  Homer + Grafana │
                   │  PostgreSQL (HA)  │  │  Prometheus      │
                   │  Admin Panel     │  │  Loki (logs)     │
                   └──────────────────┘  └──────────────────┘
Рис. 5a — Глобальная архитектура: 4 региона, GeoDNS-маршрутизация, централизованное управление
Детальная архитектура одного региона

Каждый регион — это полностью автономный кластер со всеми компонентами. Ниже — детальная схема одного региона (Europe / Frankfurt):

═══════════════════════════════════════════════════════════════════════════════════════
              РЕГИОН EUROPE (Frankfurt) — детальная архитектура
═══════════════════════════════════════════════════════════════════════════════════════

                 КЛИЕНТЫ РЕГИОНА
   ┌───────────┬────────────┬──────────────┬───────────────┐
   │ Web UIWebPhoneIP-телефоныМобильные     │
   │ (React)   │ (SIP.js)   │ Yealink,Snom │ iOS/Android   │
   └─────┬─────┴─────┬──────┴───────┬──────┴──────┬────────┘
         │HTTPSWSSSIP/TLSSIP/TLS
         ▼            ▼              ▼              ▼
   ┌─────────────────────────────────────────────────────────┐
   │  СЛОЙ 1: EDGE / LOAD BALANCER                          │
   │  ┌─────────────────┐  ┌─────────────────┐              │
   │  │ HAProxy / Nginx │  │ HAProxy / Nginx │  (Active/Active)│
   │  │  HTTPS, WSS     │  │  HTTPS, WSS     │              │
   │  │  TLS termination│  │  TLS termination│              │
   │  └────────┬────────┘  └────────┬────────┘              │
   │           └──────────┬─────────┘                        │
   └──────────────────────┼──────────────────────────────────┘
                          │
   ┌──────────────────────┼──────────────────────────────────┐
   │  СЛОЙ 2: SBC (Session Border Controller)                 │
   │                      │                                   │
   │  ┌───────────────────▼───────────────────┐              │
   │  │  Kamailio SBC Cluster (Active/Active)  │              │
   │  │                                        │              │
   │  │  ┌────────────┐    ┌────────────┐      │              │
   │  │  │ KAM-SBC-1  │    │ KAM-SBC-2  │      │   Keepalived  │
   │  │  │ Внешний    │    │ Внешний    │      │   Floating   │
   │  │  │ интерфейс  │    │ интерфейс  │      │   VIP        │
   │  │  └──────┬─────┘    └──────┬─────┘      │              │
   │  │         └────────┬────────┘             │              │
   │  │                  │                      │              │
   │  │  Функции SBC:                           │              │
   │  │  • Topology hiding (скрытие топологии) │              │
   │  │  • SIP normalization (нормализация)    │              │
   │  │  • Anti-fraud / rate limiting           │              │
   │  │  • TLS termination для SIP              │              │
   │  │  • Транк-аутентификация (IP ACL)        │              │
   │  │  • DDoS protection (pike + htable)      │              │
   │  │  • Протокол-конвертация (WSS↔UDP)       │              │
   │  └────────────────────┬──────────────────-┘              │
   │  ┌────────────────────▼───────────────────┐              │
   │  │  RTPEngine Cluster                      │              │
   │  │  ┌────────────┐    ┌────────────┐      │              │
   │  │  │ RTPE-1     │    │ RTPE-2     │      │              │
   │  │  │ NAT trav.  │    │ NAT trav.  │      │              │
   │  │  │ SRTP↔RTP   │    │ SRTP↔RTP   │      │              │
   │  │  │ WebRTC↔SIP │    │ WebRTC↔SIP │      │              │
   │  │  └────────────┘    └────────────┘      │              │
   │  └────────────────────────────────────────┘              │
   └──────────────────────┬──────────────────────────────────┘
                          │ SIP (внутренний, доверенный)
   ┌──────────────────────┼──────────────────────────────────┐
   │  СЛОЙ 3: CORE SIP PROXY                                   │
   │                      │                                   │
   │  ┌───────────────────▼───────────────────┐              │
   │  │  Kamailio Core Cluster (Active/Active) │              │
   │  │  ┌────────────┐    ┌────────────┐      │              │
   │  │  │ KAM-CORE-1 │    │ KAM-CORE-2 │      │  DMQ sync    │
   │  │  │ Регистрация│    │ Регистрация│      │  между       │
   │  │  │ Маршрутиз. │    │ Маршрутиз. │      │  нодами      │
   │  │  │ LB → FS    │    │ LB → FS    │      │              │
   │  │  └──────┬─────┘    └──────┬─────┘      │              │
   │  │         └────────┬────────┘             │              │
   │  └──────────────────┼─────────────────────┘              │
   │                     │                                     │
   │  Функции Core:      │                                     │
   │  • User registration (usrloc)                            │
   │  • Internal routing (диалплан, DID)                      │
   │  • Load balancing → FreeSWITCH (dispatcher)              │
   │  • Failover между FS-нодами                              │
   │  • Dialog tracking                                       │
   └─────────────────────┼────────────────────────────────────┘
                         │
   ┌─────────────────────┼────────────────────────────────────┐
   │  СЛОЙ 4: MEDIA SERVERS (FreeSWITCH Cluster)              │
   │                     │                                     │
   │  ┌──────────────────▼──────────────────────────────┐     │
   │  │                                                  │     │
   │  │  ┌──────────┐  ┌──────────┐  ┌──────────┐      │     │
   │  │  │ FS-1     │  │ FS-2     │  │ FS-N     │      │     │
   │  │  │ IVR      │  │ IVR      │  │ IVR      │      │     │
   │  │  │ Queues   │  │ Queues   │  │ Queues   │      │     │
   │  │  │ Conf     │  │ Conf     │  │ Conf     │      │     │
   │  │  │ Record   │  │ Record   │  │ Record   │      │     │
   │  │  │ Bridge   │  │ Bridge   │  │ Bridge   │      │     │
   │  │  └──────────┘  └──────────┘  └──────────┘      │     │
   │  │  (горизонтальное масштабирование по нагрузке)   │     │
   │  └─────────────────────────────────────────────────┘     │
   └──────────┬──────────────┬──────────────┬─────────────────┘
              │ESLCDRrecordings
              ▼              ▼              ▼
   ┌──────────────────────────────────────────────────────────┐
   │  СЛОЙ 5: APPLICATION & API                                │
   │                                                           │
   │  ┌─────────────┐  ┌─────────────┐  ┌──────────────┐     │
   │  │ Go API-1    │  │ Go API-2    │  │ Go API-N     │     │
   │  │ REST/WS     │  │ REST/WS     │  │ REST/WS      │     │
   │  │ ESL client  │  │ ESL client  │  │ ESL client   │     │
   │  │ CDR writer  │  │ Dialer      │  │ Webhooks     │     │
   │  └─────────────┘  └─────────────┘  └──────────────┘     │
   └──────────┬──────────────┬──────────────┬─────────────────┘
              │              │              │
   ┌──────────┼──────────────┼──────────────┼─────────────────┐
   │  СЛОЙ 6: DATA & EVENTS  │              │                  │
   │          │              │              │                  │
   │  ┌───────▼─────┐ ┌─────▼─────┐ ┌─────▼──────┐          │
   │  │PostgreSQL   │ │  Redis    │ │  NATS     │          │
   │  │Primary +    │ │ Sentinel  │ │ Cluster    │          │
   │  │Replica (HA) │ │ Cluster   │ │ (JetStream)│          │
   │  └─────────────┘ └───────────┘ └────────────┘          │
   │                                                          │
   │  ┌─────────────┐ ┌───────────────┐                      │
   │  │ MinIO (S3)  │ │ Homer + Grafana│                      │
   │  │ Recordings  │ │ SIP capture   │                      │
   │  │ Voicemail   │ │ Prometheus    │                      │
   │  │ IVR audio   │ │ Loki (logs)   │                      │
   │  └─────────────┘ └───────────────┘                      │
   └──────────────────────────────────────────────────────────┘
              │
              │ SIP (от Core к транкам)
              │
   ┌──────────┼───────────────────────────────────────────────┐
   │  СЛОЙ 7: TRUNK SBC (Session Border Controller — PSTN)    │
   │          │                                                │
   │  ┌───────▼──────────────────────────────────────┐        │
   │  │  Kamailio Trunk SBC (Active/Active)          │        │
   │  │                                               │        │
   │  │  ┌─────────────┐    ┌─────────────┐          │        │
   │  │  │ KAM-TRUNK-1 │    │ KAM-TRUNK-2 │          │Keepalived│
   │  │  │ SIP-facing  │    │ SIP-facing  │          │Floating │
   │  │  │ к провайдерам│    │ к провайдерам│          │VIP      │
   │  │  └──────┬──────┘    └──────┬──────┘          │        │
   │  │         └────────┬────────┘                   │        │
   │  │                  │                            │        │
   │  │  Функции Trunk SBC:                           │        │
   │  │  • SIP-нормализация (разные провайдеры = разный SIP) │
   │  │  • Транк-аутентификация (IP ACL + credentials)      │
   │  │  • E.164 нормализация номеров                       │
   │  │  • LCR (Least Cost Routing) между транками          │
   │  │  • Failover: primary → backup провайдер             │
   │  │  • Topology hiding от провайдеров                   │
   │  │  • Anti-fraud / toll fraud protection               │
   │  │  • Кодек-переговоры (Offer/Answer) с провайдерами   │
   │  │  • Caller ID manipulation / CNAM                    │
   │  └────────────────────┬─────────────────────────┘        │
   │                       │                                   │
   │  ┌────────────────────▼───────────────────┐              │
   │  │  RTPEngine Trunk (опционально)         │              │
   │  │  ┌────────────┐    ┌────────────┐      │              │
   │  │  │ RTPE-T1    │    │ RTPE-T2    │      │              │
   │  │  │ Кодек      │    │ Кодек      │      │              │
   │  │  │ транскод.  │    │ транскод.  │      │              │
   │  │  │ G.711↔G.729│    │ G.711↔G.729│      │              │
   │  │  └────────────┘    └────────────┘      │              │
   │  │  (для провайдеров с жёсткими кодек-    │              │
   │  │   требованиями или RTP-пиннингом)      │              │
   │  └────────────────────────────────────────┘              │
   └──────────────────────┬────────────────────────────────────┘
                          │
   ┌──────────────────────┼───────────────────────────────────┐
   │  СЛОЙ 8: PSTN / ВНЕШНИЙ МИР                                │
   │                      │                                    │
   │  ┌───────────────────▼───────────────────────────────┐   │
   │  │  SIP-транки (локальные для региона)                  │   │
   │  │                                                    │   │
   │  │  ┌──────────┐ ┌──────────┐ ┌──────────────┐      │   │
   │  │  │ Telnyx   │ │ Twilio   │ │ Локальный    │      │   │
   │  │  │ (backup) │ │ (primary)│ │ оператор     │      │   │
   │  │  └──────────┘ └──────────┘ │ (DE, FR, UK) │      │   │
   │  │                             └──────────────┘      │   │
   │  │  Маршрутизация: LCR + failover + geo-local       │   │
   │  └───────────────────────────────────────────────────┘   │
   └──────────────────────────────────────────────────────────┘
Рис. 5b — Детальная архитектура одного региона (Europe / Frankfurt): 8 слоёв, полная отказоустойчивость
Ключевые архитектурные решения

1. Тройной Kamailio — Access SBC (внешний, клиенты/интернет), Core (внутренний, маршрутизация), Trunk SBC (внешний, PSTN-провайдеры). Три зоны доверия: Access SBC принимает удар из интернета, Trunk SBC нормализует трафик от провайдеров, Core работает только с доверенным трафиком от обоих SBC.
2. Двусторонняя граница — SBC и на северной стороне (клиенты), и на южной (PSTN). Внутренняя сеть полностью изолирована от внешнего мира с обоих направлений.
3. Гео-распределение — каждый регион автономен. Звонки внутри региона не зависят от других регионов.
4. Локальный breakout — звонок из Германии на немецкий номер идёт через локальный транк в Frankfurt, не через US.
5. Все компоненты в HA — нет единой точки отказа. Каждый компонент задублирован минимум 2x.

Зачем SBC в enterprise-архитектуре

При работе в 43 странах с десятками SIP-провайдеров SBC обязателен. Это не дублирование Kamailio Core — это принципиально другая роль: граница доверия между внешним миром и вашей внутренней сетью.

Компонент Зона Задачи Почему отдельный
Kamailio Access SBC DMZ North / клиенты Topology hiding, anti-DDoS, SIP normalization, TLS termination, протокол-конвертация (WSS↔UDP), NAT traversal Принимает весь недоверенный трафик от клиентов из интернета. Северная граница
RTPEngine Access DMZ North / клиенты NAT traversal, SRTP↔RTP, WebRTC bridge, медиа-прокси для клиентского трафика Медиа-трафик из интернета не попадает напрямую к FreeSWITCH
Kamailio Core Внутренняя сеть Регистрация пользователей, внутренняя маршрутизация, LB между FreeSWITCH, dialog tracking Работает только с доверенным трафиком от обоих SBC. Оптимизирован под скорость, не под защиту
FreeSWITCH Внутренняя сеть IVR, очереди, конференции, запись, bridge, диалплан Никогда не виден из интернета. Занимается только медиа-логикой
Kamailio Trunk SBC DMZ South / PSTN SIP-нормализация для разных провайдеров, транк-аутентификация (IP ACL + credentials), E.164 нормализация, LCR, Caller ID, anti-fraud Изолирует внутреннюю сеть от PSTN-провайдеров. Южная граница. Каждый провайдер «видит» только Trunk SBC
RTPEngine Trunk DMZ South / PSTN Транскодирование кодеков (G.711↔G.729), RTP-пиннинг, медиа-прокси для PSTN-трафика Опциональный. Нужен если провайдеры требуют специфические кодеки или RTP-параметры
Двусторонний SBC = обязательный при масштабе 43 страны

На нашем масштабе оба SBC (Access + Trunk) необходимы:

Access SBC (северная граница — клиенты):
Защита от атак — публичные SIP-адреса постоянно сканируются ботами, без SBC внутренняя сеть уязвима
WebRTC-мост — конвертация WSS/DTLS-SRTP от браузеров в стандартный SIP/RTP
NAT traversal — клиенты за NAT, SBC решает проблемы доставки медиа

Trunk SBC (южная граница — PSTN-провайдеры):
Десятки SIP-транков в разных странах с разными особенностями SIP-стека (каждый оператор кодирует SIP по-своему)
Регуляторные требования — в ряде стран (ОАЭ, Сингапур, Германия) оператор требует сертифицированную точку подключения
Нормализация SIP — разные провайдеры отправляют CallerID, кодеки и заголовки в разных форматах, Trunk SBC приводит всё к единому виду
LCR + Failover — маршрутизация по стоимости между провайдерами, автоматическое переключение при отказе транка
Anti-fraud — защита от toll fraud (мошеннические звонки на premium-номера) на уровне транков

Compliance (оба SBC):
GDPR (Europe), CCPA (US), локальные законы о записи звонков требуют контроля на обеих границах

🌐 Межрегиональная маршрутизация и GeoDNS
                      ┌──────────────────┐
                      │     GeoDNS        │
                      │  sip.company.com  │
                      └────────┬─────────┘
                               │
            ┌──────────────────┼──────────────────┐
            ▼                  ▼                  ▼
  ┌────────────────┐  ┌────────────────┐  ┌────────────────┐
  │ EU SBC Cluster │  │ US SBC Cluster │  │ APAC SBC       │
  │ Frankfurt      │  │ Virginia       │  │ Singapore      │
  │ 2x Kamailio    │  │ 2x Kamailio    │  │ 2x Kamailio    │
  │ 2x RTPEngine   │  │ 2x RTPEngine   │  │ 2x RTPEngine   │
  └───────┬────────┘  └───────┬────────┘  └───────┬────────┘
          │                   │                   │
          └─────────┬─────────┴─────────┬─────────┘
                    │                   │
                    ▼                   ▼
          WireGuard VPN Mesh       SIP trunk routing:
          (между регионами)        EU user → EU trunk
                                        US user → US trunk
                                        Cross-region → nearest

  Правила межрегиональной маршрутизации:
  ┌─────────────────────────────────────────────────────────┐
  │ 1. Звонок внутри региона → локальный FreeSWITCH + транк│
  │ 2. Звонок между регионами → VPN → SBC другого региона  │
  │ 3. PSTN → ближайший к номеру регион (local breakout)   │
  │ 4. Failover: EU primary down → EU standby              │
  │    EU standby down → US cluster (geo-failover)         │
  └─────────────────────────────────────────────────────────┘
Рис. 5c — GeoDNS + межрегиональная маршрутизация с failover
Регион Primary ДЦ Standby ДЦ Страны Локальные транки
Europe Frankfurt, DE Amsterdam, NL ~20 (DE, FR, UK, ES, IT, PL, ...) Deutsche Telekom, BT, Orange, Telnyx EU
Americas Virginia, US Oregon, US ~10 (US, CA, MX, BR, AR, ...) Twilio, Bandwidth, Telnyx US
Asia-Pacific Singapore Tokyo, JP ~8 (SG, JP, AU, IN, KR, ...) SingTel, NTT, Telstra, Tata
Middle East Dubai, UAE Frankfurt (EU failover) ~5 (UAE, SA, QA, KW, BH) du, Etisalat, STC
🔒 Сетевые зоны безопасности (Network Zones)
  ИНТЕРНЕТ — КЛИЕНТЫ (недоверенная зона North)
  ─────────────────────────────────────────────────
  │ WebRTC-браузеры, SIP-телефоны за NAT, мобильные
  ─────────────────────────────────────────────────
                      │
                 FIREWALL L1 (North)DMZ NORTH — Access (полу-доверенная зона)
  ─────────────────────────────────────────────────
  │ Kamailio Access SBC — внешний SIP от клиентов
  │ RTPEngine Access   — медиа-прокси, SRTP↔RTP
  │ HAProxy/Nginx      — HTTPS/WSS, TLS termination
  │ TURN-сервер        — relay для WebRTC
  ─────────────────────────────────────────────────
                      │
                 FIREWALL L2CORE (доверенная зона)
  ─────────────────────────────────────────────────
  │ Kamailio Core  — внутренняя маршрутизация
  │ FreeSWITCH     — медиа-обработка (IVR, очереди)
  │ Go API         — бизнес-логика, ESL, WebSocket
  ─────────────────────────────────────────────────
                      │
                 FIREWALL L3DATA (защищённая зона)
  ─────────────────────────────────────────────────
  │ PostgreSQL     — данные (шифрование at rest)
  │ Redis          — кеш и сессии
  │ MinIO          — записи разговоров
  │ NATS           — шина событий
  ─────────────────────────────────────────────────
                      │
                 FIREWALL L4DMZ SOUTH — Trunk (полу-доверенная зона)
  ─────────────────────────────────────────────────
  │ Kamailio Trunk SBC — SIP к PSTN-провайдерам
  │ RTPEngine Trunk   — транскодирование кодеков
  │ Нормализация SIP, LCR, anti-fraud, Caller ID
  ─────────────────────────────────────────────────
                      │
                 FIREWALL L5 (South)PSTN / ВНЕШНИЕ ПРОВАЙДЕРЫ (недоверенная зона South)
  ─────────────────────────────────────────────────
  │ SIP-транки (Telnyx, Twilio, локальные операторы)
  │ SMS-шлюзы, внешние API
  ─────────────────────────────────────────────────
Рис. 5d — Пять сетевых зон с двусторонним DMZ: Internet(N) → DMZ North → Core → Data → DMZ South → PSTN
Принцип: внутренняя сеть изолирована с ОБОИХ направлений

Северная граница (клиенты): Любой SIP/RTP от клиентов из интернета сначала проходит через Access SBC (DMZ North), где нормализуется, фильтруется и проксируется. Только доверенный трафик от Access SBC попадает к Kamailio Core и FreeSWITCH.

Южная граница (PSTN): Исходящие вызовы к PSTN проходят через Trunk SBC (DMZ South), который нормализует SIP под требования каждого провайдера, применяет LCR-маршрутизацию и защищает от toll fraud. Провайдеры видят только Trunk SBC, а не внутреннюю архитектуру.

Данные (PostgreSQL, Redis) находятся в самой защищённой зоне и недоступны извне — ни с северной, ни с южной стороны.

Слои системы

Система разделена на шесть функциональных слоёв. Каждый слой изолирован и взаимодействует с соседними по чётко определённым протоколам.

Слой 1 Клиенты (Clients)

Точки входа пользователей в систему. Четыре типа клиентов:

React — веб-интерфейс администратора и оператора (управление, статистика, настройки).
SIP.js — веб-телефон в браузере через WebRTC (звонки без установки ПО).
IP-телефоны — аппаратные SIP-телефоны (Yealink, Grandstream, Snom).
Мобильные — SIP-клиенты на смартфонах (Ooh, Ooh, Ooh Ooh Ooh, Ooh Ooh Ooh Ooh, Ooh Ooh, Ooh Ooh, Ooh Ooh Ooh Ooh, и т.д.).

Слой 2 Балансировка и проксирование (Proxy Layer)

Входная точка для всего трафика. Два компонента:

Nginx — reverse proxy для HTTP/HTTPS и WebSocket. TLS-терминация, маршрутизация запросов к Go API и WebSocket-соединений к Kamailio.
Kamailio — SIP proxy/registrar. Регистрация устройств, аутентификация, маршрутизация SIP, балансировка нагрузки между FreeSWITCH-серверами, обработка NAT.

Слой 3 Бизнес-логика (Business Logic)

Центральный узел управления системой:

Go Backend API — REST API и WebSocket-сервер. Управление пользователями, правами, настройками. Логика автообзвона, аналитика, CDR-записи, интеграции с CRM. Взаимодействует с FreeSWITCH через ESL (Event Socket Library).

Слой 4 Медиа-обработка (Media Layer)

Обработка голоса и медиа-потоков:

FreeSWITCH — медиа-сервер (B2BUA). IVR, очереди, конференции, запись, диалплан. Кластер из N серверов для горизонтального масштабирования.
RTPEngine — медиа-прокси. Транскодирование (WebRTC ↔ RTP), управление NAT для медиа, проксирование голосового трафика.

Слой 5 Хранение данных (Data Layer)

Персистентное и оперативное хранение:

PostgreSQL — основная БД: пользователи, настройки, CDR, диалпланы, маршрутизация.
Redis — кеш и оперативные данные: сессии, статусы операторов, блокировки, очереди задач.
MinIO — S3-совместимое хранилище: записи разговоров, голосовые сообщения, файлы IVR.

Слой 7 Trunk SBC (южная граница)

Второй SBC — пограничный контроллер между внутренней сетью и PSTN-провайдерами:

Kamailio Trunk SBC — SIP-нормализация для разных провайдеров, транк-аутентификация, E.164 нормализация номеров, LCR-маршрутизация, Caller ID manipulation, anti-fraud.
RTPEngine Trunk — опциональный, для транскодирования кодеков (G.711↔G.729) если провайдеры требуют специфические форматы.
Topology hiding — провайдеры видят только Trunk SBC, а не внутреннюю архитектуру.

Слой 8 Внешний мир (External World)

Связь с внешними сетями и сервисами:

SIP-транки — подключение к PSTN через провайдеров (Telnyx, Twilio, локальные операторы). Входящие и исходящие вызовы на обычные телефоны.
SMS-шлюзы — отправка SMS-уведомлений (пропущенные, callback).
Внешние API — CRM, Helpdesk, системы аналитики.

Потоки данных

Три основных сценария звонков, показывающие как данные проходят через все слои системы.

Поток A Входящий звонок из PSTN к оператору

Клиент звонит на номер компании, проходит IVR-меню и попадает к свободному оператору.

1
SIP INVITE из PSTN — звонок приходит через SIP-транк на Kamailio (порт 5060).
2
Аутентификация транка — Kamailio проверяет IP-адрес транка (IP ACL) и анализирует DID (набранный номер).
3
Маршрутизация к FreeSWITCH — Kamailio определяет целевой FreeSWITCH-сервер и перенаправляет INVITE.
4
Обработка диалплана — FreeSWITCH проверяет диалплан по DID и направляет вызов на IVR.
5
IVR-меню — клиент слышит приветствие и нажимает 2 (DTMF) для перехода в очередь «Поддержка».
6
Выбор оператораmod_callcenter определяет свободного оператора с наибольшим временем ожидания (longest idle).
7
Bridge к оператору — FreeSWITCH отправляет INVITE на телефон оператора (через Kamailio) и соединяет звонок.
8
Проксирование медиа — RTPEngine проксирует голосовой трафик между SIP-транком и телефоном оператора.
9
Запись CDR — Go Backend получает событие от FreeSWITCH (ESL) и записывает CDR в PostgreSQL.
10
Обновление дашборда — NATS публикует событие о новом звонке, React-дашборд обновляется в реальном времени через WebSocket.
Поток B Исходящий звонок из веб-телефона

Оператор звонит клиенту через веб-телефон (SIP.js в браузере) на мобильный номер.

1
INVITE через WebSocket — SIP.js отправляет SIP INVITE через WSS-соединение на Kamailio.
2
Аутентификация и проверка прав — Kamailio аутентифицирует оператора и проверяет его право на исходящие вызовы.
3
Выбор транка по LCR — Kamailio определяет оптимальный SIP-транк по правилам наименьшей стоимости (Least Cost Routing) и направляет вызов к FreeSWITCH.
4
Установка Caller ID — FreeSWITCH подставляет Caller ID компании (номер, имя) согласно настройкам исходящей линии.
5
INVITE в PSTN — FreeSWITCH отправляет SIP INVITE через выбранный SIP-транк в телефонную сеть (PSTN).
6
Конвертация медиа — RTPEngine конвертирует WebRTC-поток (DTLS-SRTP, Opus) в обычный RTP (G.711) для PSTN.
7
Абонент отвечает — 200 OK приходит от PSTN, голосовой канал устанавливается в обоих направлениях.
8
Запись разговора — FreeSWITCH начинает запись, файл сохраняется в MinIO (S3-совместимое хранилище).
Поток C Внутренний звонок: WebRTC к IP-телефону

Сотрудник звонит коллеге из браузера на настольный IP-телефон внутри компании.

1
INVITE через WSS — браузер (SIP.js) отправляет SIP INVITE через WebSocket (WSS) на Kamailio.
2
Поиск регистрации — Kamailio находит регистрацию IP-телефона в таблице location (usrloc) и определяет его адрес.
3
INVITE к IP-телефону — Kamailio направляет SIP INVITE на IP-телефон по UDP/SIP (порт 5060).
4
Транскодирование медиа — RTPEngine конвертирует: WebRTC (DTLS-SRTP, Opus) на стороне браузера и RTP (G.711) на стороне IP-телефона.
5
Соединение установлено — IP-телефон звонит, сотрудник поднимает трубку, голос идёт в обе стороны через RTPEngine.

Сигнализация vs Медиа

Два полностью раздельных пути (Signaling vs Media)

Фундаментальный принцип VoIP-архитектуры: сигнализация и медиа идут по совершенно разным путям, через разные компоненты, по разным протоколам. Сигнализация (SIP) — это управляющий канал: «кто звонит, кому, принять или отклонить». Медиа (RTP) — это сам голос, реальные аудио-данные. Понимание этого разделения критически важно для диагностики и архитектуры.

═══ СИГНАЛИЗАЦИЯ (Control Plane) ═══                ═══ МЕДИА (Data Plane) ═══

  Протокол: SIP                                     Протокол: RTP / SRTP
  Транспорт: TCP / UDP / WSS                        Транспорт: UDP
  Нагрузка: Лёгкая (текстовые сообщения)            Нагрузка: Тяжёлая (50 пакетов/сек)
  Задача: Управление вызовами                        Задача: Передача голоса

  ┌──────────┐      ┌──────────┐      ┌──────────┐
  │ Телефон  │─SIP─▶│ Kamailio │─SIP─▶│FreeSWITCH│
  └──────────┘      └──────────┘      └──────────┘

  ┌──────────┐      ┌──────────┐      ┌──────────┐
  │ Телефон A│═RTP═▶│RTPEngine │═RTP═▶│ Телефон B│
  └──────────┘      └──────────┘      └──────────┘

  Сигнализация проходит:                             Медиа проходит:
  Телефон → Kamailio → FreeSWITCH                    Телефон A → RTPEngine → Телефон B
  (настройка, изменение, завершение)                  (голос, реальное время)
Рис. 6 — Сигнализация (SIP) и медиа (RTP) идут разными путями через разные компоненты
Сигнализация (SIP)

Путь: Телефон → Kamailio → FreeSWITCH
Протокол: SIP (TCP/UDP/WSS, порт 5060/5061)
Характер: Лёгкий трафик, текстовые сообщения
Задачи: Установка вызова, перевод, удержание, завершение, регистрация устройств
Компоненты: Kamailio (маршрутизация), FreeSWITCH (логика)

Медиа (RTP)

Путь: Телефон A → RTPEngine → Телефон B
Протокол: RTP/SRTP (UDP, порты 10000–20000)
Характер: Тяжёлый трафик, 50 пакетов/сек на поток
Задачи: Передача голоса, транскодирование, шифрование
Компоненты: RTPEngine (прокси, транскодирование)

Аналогия для понимания

Сигнализация — это SMS-сообщения, которыми вы договариваетесь о встрече: «Давай встретимся в кафе в 15:00». Медиа — это сама встреча: реальный разговор лицом к лицу. SMS идут через сотового оператора, а встреча происходит в кафе — совершенно разные каналы для совершенно разных задач.

Практическое значение

Если звонок устанавливается (телефон звонит), но нет голоса — проблема в медиа-пути (RTPEngine, NAT, файрволл для UDP-портов). Если звонок вообще не проходит — проблема в сигнализации (Kamailio, SIP-маршрутизация, аутентификация). Диагностика всегда начинается с определения: «Это проблема сигнализации или медиа?»