Good

LTE Multi-Tower Mesh: Сценарій з 3+ вишками

💡 Чому це важливо для UMTC?
Це основна архітектура UMTC — mesh з Primary вишкою (Starlink + Open5GS Core) та Secondary/Tertiary вузлами. Кожна вишка автономна: при втраті зв'язку з Primary — локальний Core забезпечує роботу в офлайн. WireGuard mesh об'єднує всі вузли. Бригадний рівень — до 10 вишок, підтримка multi-hop.

Огляд

Цей документ описує розгортання mesh-мережі з трьома і більше LTE вишками, де кожна може бути як клієнтом так і точкою доступу одночасно.

flowchart TB
    subgraph INET["🌐 Internet"]
        ISP[Starlink / Fiber]
    end

    subgraph PRIMARY["Primary Hub"]
        A[ВИШКА A<br/>Open5GS Core<br/>WireGuard Hub<br/>srsENB]
    end

    subgraph SECONDARY["Secondary Layer"]
        B[ВИШКА B<br/>Local Core<br/>srsENB]
        C[ВИШКА C<br/>Local Core<br/>srsENB]
        D[ВИШКА D<br/>Local Core<br/>srsENB]
    end

    subgraph TERTIARY["Tertiary Layer"]
        E[ВИШКА E<br/>2 hops to inet]
        F[ВИШКА F<br/>2 hops to inet]
    end

    ISP --> A
    A -->|LTE| B
    A -->|LTE| C
    A -->|LTE| D
    B -->|LTE| E
    D -->|LTE| F
    B <-.->|backup| C


## Топологія

### Базова схема (3 вишки)
                     ┌─────────────────┐
                     │   🌐 INTERNET   │
                     └────────┬────────┘
                              │
                     ┌────────▼────────┐
                     │    ВИШКА A      │
                     │   (Primary)     │
                     │ ─────────────── │
                     │ • Starlink      │
                     │ • Open5GS Core  │
                     │ • srsENB        │
                     │ • WG Hub        │
                     └───┬─────────┬───┘
                LTE      │         │      LTE
             ┌───────────┘         └───────────┐
             │                                 │
    ┌────────▼────────┐               ┌────────▼────────┐
    │    ВИШКА B      │     LTE       │    ВИШКА C      │
    │  (Secondary)    │◄─────────────►│  (Secondary)    │
    │ ─────────────── │   backup      │ ─────────────── │
    │ • LTE Modem→A   │               │ • LTE Modem→A   │
    │ • srsENB        │               │ • srsENB        │
    │ • Local Core    │               │ • Local Core    │
    └────────┬────────┘               └────────┬────────┘
             │                                 │
        ┌────▼────┐                       ┌────▼────┐
        │Клієнти B│                       │Клієнти C│
        └─────────┘                       └─────────┘
### Розширена схема (5+ вишок)
                          INTERNET
                              │
                     ┌────────▼────────┐
                     │    ВИШКА A      │
                     │   HUB/Primary   │
                     └───┬───┬───┬─────┘
                         │   │   │
          ┌──────────────┘   │   └──────────────┐
          │                  │                  │
 ┌────────▼────────┐ ┌──────▼───────┐ ┌────────▼────────┐
 │    ВИШКА B      │ │   ВИШКА C    │ │    ВИШКА D      │
 │   Secondary     │ │  Secondary   │ │   Secondary     │
 └───────┬─────────┘ └──────────────┘ └────────┬────────┘
         │                                     │
┌────────▼────────┐                   ┌────────▼────────┐
│    ВИШКА E      │                   │    ВИШКА F      │
│   Tertiary      │                   │   Tertiary      │
└─────────────────┘                   └─────────────────┘
## Ролі вишок

### Primary (Hub)
- Має прямий інтернет (Starlink, оптика)
- Центральний Open5GS Core
- WireGuard Hub для всього mesh
- Обслуговує Secondary вишки як клієнтів

### Secondary
- Підключається до Primary через LTE
- Має власний srsENB для своїх клієнтів
- Локальний Core для офлайн-режиму
- Може бути relay для Tertiary вишок

### Tertiary
- Підключається до Secondary через LTE
- Два хопи до інтернету (Tertiary  Secondary  Primary)
- Максимальна автономність

## IP-адресація

### WireGuard Mesh

| Вишка | WG IP | Роль | Підмережа клієнтів |
|-------|-------|------|-------------------|
| A | 10.10.10.1 | Primary | 10.10.20.0/24 |
| B | 10.10.10.2 | Secondary | 10.10.21.0/24 |
| C | 10.10.10.3 | Secondary | 10.10.22.0/24 |
| D | 10.10.10.4 | Secondary | 10.10.23.0/24 |
| E | 10.10.10.5 | Tertiary | 10.10.24.0/24 |
| F | 10.10.10.6 | Tertiary | 10.10.25.0/24 |

### Open5GS Core

| Вишка | MME IP | SGW IP | PGW IP |
|-------|--------|--------|--------|
| A (Primary) | 10.10.10.1 | 10.10.10.1 | 10.10.10.1 |
| B (Local) | 10.10.10.2 | 10.10.10.2 | 10.10.10.2 |
| C (Local) | 10.10.10.3 | 10.10.10.3 | 10.10.10.3 |

## Конфігурація

### Вишка A: Primary Hub

#### WireGuard Hub

```ini
# /etc/wireguard/wg0.conf
[Interface]
Address = 10.10.10.1/24
PrivateKey = <PRIVATE_KEY_A>
ListenPort = 51820
PostUp = iptables -A FORWARD -i wg0 -j ACCEPT
PostUp = iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i wg0 -j ACCEPT
PostDown = iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE

# Вишка B
[Peer]
PublicKey = <PUBLIC_KEY_B>
AllowedIPs = 10.10.10.2/32, 10.10.21.0/24, 10.10.10.5/32, 10.10.24.0/24

# Вишка C
[Peer]
PublicKey = <PUBLIC_KEY_C>
AllowedIPs = 10.10.10.3/32, 10.10.22.0/24

# Вишка D
[Peer]
PublicKey = <PUBLIC_KEY_D>
AllowedIPs = 10.10.10.4/32, 10.10.23.0/24, 10.10.10.6/32, 10.10.25.0/24

Open5GS MME

# /etc/open5gs/mme.yaml
mme:
  freeDiameter: /etc/freeDiameter/mme.conf
  s1ap:
    - addr: 0.0.0.0
  gtpc:
    - addr: 10.10.10.1
  gummei:
    plmn_id:
      mcc: 001
      mnc: 01
    mme_gid: 1
    mme_code: 1
  tai:
    plmn_id:
      mcc: 001
      mnc: 01
    tac: 1
  security:
    integrity_order: [EIA2, EIA1, EIA0]
    ciphering_order: [EEA0, EEA1, EEA2]

srsENB

# /etc/srsran/enb.conf
[enb]
enb_id = 0x19B01
mcc = 001
mnc = 01
mme_addr = 127.0.0.1
gtp_bind_addr = 10.10.10.1
s1c_bind_addr = 10.10.10.1
n_prb = 50

[rf]
device_name = lime
device_args = auto
dl_earfcn = 3100
tx_gain = 60
rx_gain = 40

Вишка B: Secondary

WireGuard Client

# /etc/wireguard/wg0.conf
[Interface]
Address = 10.10.10.2/24
PrivateKey = <PRIVATE_KEY_B>
# Роутинг через LTE
Table = off
PostUp = ip route add 10.10.10.1/32 via $(ip route | grep wwan0 | grep default | awk '{print $3}') dev wwan0
PostUp = wg set %i fwmark 51820
PostUp = ip route add default dev %i table 51820
PostUp = ip rule add fwmark 51820 table 51820
PostUp = iptables -A FORWARD -i wg0 -j ACCEPT
PostUp = iptables -t nat -A POSTROUTING -o wg0 -j MASQUERADE

[Peer]
PublicKey = <PUBLIC_KEY_A>
Endpoint = <PRIMARY_PUBLIC_IP>:51820
AllowedIPs = 0.0.0.0/0
PersistentKeepalive = 25

# Вишка E (Tertiary через B)
[Peer]
PublicKey = <PUBLIC_KEY_E>
AllowedIPs = 10.10.10.5/32, 10.10.24.0/24

srsENB для своїх клієнтів

# /etc/srsran/enb.conf
[enb]
enb_id = 0x19B02
mcc = 001
mnc = 01
# Підключення до Primary Core через WG
mme_addr = 10.10.10.1
gtp_bind_addr = 10.10.10.2
s1c_bind_addr = 10.10.10.2
n_prb = 50

[rf]
device_name = lime
device_args = auto
# Інша частота!
dl_earfcn = 3350
tx_gain = 60
rx_gain = 40

Локальний Core (для офлайн)

# /etc/open5gs/mme-local.yaml
mme:
  freeDiameter: /etc/freeDiameter/mme.conf
  s1ap:
    - addr: 127.0.0.1
  gtpc:
    - addr: 10.10.10.2
  gummei:
    plmn_id:
      mcc: 001
      mnc: 01
    mme_gid: 2
    mme_code: 2
  tai:
    plmn_id:
      mcc: 001
      mnc: 01
    tac: 2

Вишка E: Tertiary

WireGuard через Вишку B

# /etc/wireguard/wg0.conf
[Interface]
Address = 10.10.10.5/24
PrivateKey = <PRIVATE_KEY_E>
Table = off
PostUp = ip route add 10.10.10.2/32 via $(ip route | grep wwan0 | grep default | awk '{print $3}') dev wwan0
PostUp = wg set %i fwmark 51820
PostUp = ip route add default dev %i table 51820
PostUp = ip rule add fwmark 51820 table 51820

[Peer]
PublicKey = <PUBLIC_KEY_B>
# Endpoint — WG IP Вишки B (через LTE від B)
Endpoint = 10.10.10.2:51820
AllowedIPs = 0.0.0.0/0
PersistentKeepalive = 25

Частотне планування

Band 7 (2600 MHz)

Вишка EARFCN Центральна частота DL Ширина
A 3100 2655 MHz 10 MHz
B 3200 2665 MHz 10 MHz
C 3300 2675 MHz 10 MHz
D 3400 2685 MHz 10 MHz

Band 3 (1800 MHz) — альтернатива

Вишка EARFCN Центральна частота DL Ширина
A 1575 1842.5 MHz 10 MHz
B 1675 1852.5 MHz 10 MHz
C 1775 1862.5 MHz 10 MHz

Правила

┌─────────────────────────────────────────────────────────────┐
│  ВАЖЛИВО: Сусідні вишки НЕ повинні використовувати          │
│  однакові частоти! Мінімальний рознос — 10 MHz              │
│                                                             │
│  Вишка A ────► 2655 MHz                                     │
│  Вишка B ────► 2665 MHz  (в зоні видимості A)              │
│  Вишка C ────► 2655 MHz  (НЕ в зоні видимості A — можна)   │
└─────────────────────────────────────────────────────────────┘

Автоматичний Failover

Сценарії відмов

Сценарій 1: Втрата інтернету на Primary
┌─────────┐         ┌─────────┐         ┌─────────┐
│ Вишка A │    X    │ Internet│         │         │
│         │─────────│         │         │         │
│ Primary │         └─────────┘         │         │
└────┬────┘                             │         │
     │ LTE                              │         │
┌────▼────┐                             │         │
│ Вишка B │ ◄─── перемикається на ────► │ Вишка C │
│         │      локальний Core         │         │
└─────────┘                             └─────────┘

Результат: B і C працюють автономно зі своїми клієнтами
Сценарій 2: Втрата Вишки B
┌─────────┐
│ Вишка A │
│ Primary │
└────┬────┘
     │
     │ LTE (B недоступна)
     │
┌────▼────┐         ┌─────────┐
│ Вишка E │ ◄────── │ Вишка B │ X
│Tertiary │  relay  │Secondary│
└─────────┘         └─────────┘

Результат: E перемикається на прямий зв'язок з A
          (якщо в зоні покриття) або офлайн режим

Скрипт multi-path failover

#!/bin/bash
# /usr/local/bin/mesh-failover.sh

PRIMARY="10.10.10.1"
SECONDARY_PEERS=("10.10.10.2" "10.10.10.3" "10.10.10.4")
CHECK_INTERVAL=15
FAIL_THRESHOLD=3

declare -A fail_counts

check_peer() {
    local peer=$1
    if ping -c 1 -W 3 $peer > /dev/null 2>&1; then
        return 0
    fi
    return 1
}

find_best_route() {
    # Спочатку пробуємо Primary
    if check_peer $PRIMARY; then
        echo $PRIMARY
        return
    fi

    # Шукаємо робочий Secondary
    for peer in "${SECONDARY_PEERS[@]}"; do
        if check_peer $peer; then
            echo $peer
            return
        fi
    done

    echo "none"
}

switch_route() {
    local new_gw=$1

    if [ "$new_gw" == "none" ]; then
        echo "$(date): No route available, switching to offline mode"
        systemctl start open5gs-local
        return
    fi

    echo "$(date): Switching default route to $new_gw"
    ip route replace default via $new_gw dev wg0
}

current_route=""

while true; do
    best=$(find_best_route)

    if [ "$best" != "$current_route" ]; then
        switch_route $best
        current_route=$best
    fi

    sleep $CHECK_INTERVAL
done

Моніторинг

Prometheus метрики

# /etc/prometheus/prometheus.yml
scrape_configs:
  - job_name: 'mesh-nodes'
    static_configs:
      - targets:
        - '10.10.10.1:9100'  # Вишка A
        - '10.10.10.2:9100'  # Вишка B
        - '10.10.10.3:9100'  # Вишка C
        - '10.10.10.4:9100'  # Вишка D
        - '10.10.10.5:9100'  # Вишка E

Grafana Dashboard

Ключові метрики:
- WireGuard handshake age (< 180s = OK)
- LTE signal strength (RSRP, RSRQ)
- Latency між вишками
- Кількість підключених UE
- Throughput на кожному лінку

Alerting

# /etc/prometheus/alerts.yml
groups:
  - name: mesh-alerts
    rules:
      - alert: NodeDown
        expr: up{job="mesh-nodes"} == 0
        for: 2m
        labels:
          severity: critical
        annotations:
          summary: "Mesh node {{ $labels.instance }} is down"

      - alert: HighLatency
        expr: probe_duration_seconds > 0.5
        for: 5m
        labels:
          severity: warning
        annotations:
          summary: "High latency to {{ $labels.instance }}"

      - alert: WireGuardHandshakeStale
        expr: wireguard_latest_handshake_seconds > 180
        for: 3m
        labels:
          severity: warning
        annotations:
          summary: "WireGuard handshake stale on {{ $labels.instance }}"

Масштабування

Додавання нової вишки

  1. Згенерувати WireGuard ключі
wg genkey | tee privatekey | wg pubkey > publickey
  1. Визначити роль (Secondary/Tertiary)

  2. Обрати частоту (уникати конфлікту з сусідами)

  3. Додати peer на Hub або parent вишку

  4. Налаштувати srsENB з унікальним enb_id

  5. Додати SIM-карти в HSS

Обмеження

Параметр Ліміт Примітка
Max вишок в mesh ~50 Обмеження WireGuard peers
Max хопів 3-4 Latency збільшується
Max UE на вишку ~100 Залежить від hardware
Max відстань LTE 5-10 км З направленими антенами до 30 км

Приклад реального розгортання

Сценарій: Бригадний рівень

                    ┌──────────────────┐
                    │   Штаб бригади   │
                    │   (Starlink)     │
                    │   ВИШКА-HQ       │
                    └────────┬─────────┘
                             │
            ┌────────────────┼────────────────┐
            │                │                │
    ┌───────▼───────┐ ┌──────▼──────┐ ┌───────▼───────┐
    │  1-й батальйон│ │ 2-й батальйон│ │ 3-й батальйон│
    │   ВИШКА-1     │ │   ВИШКА-2   │ │   ВИШКА-3    │
    └───────┬───────┘ └──────┬──────┘ └───────┬───────┘
            │                │                │
    ┌───────▼───────┐ ┌──────▼──────┐ ┌───────▼───────┐
    │  Роти 1-го    │ │  Роти 2-го  │ │  Роти 3-го   │
    │  ВИШКА-1A/1B  │ │  ВИШКА-2A   │ │  ВИШКА-3A/3B │
    └───────────────┘ └─────────────┘ └───────────────┘

IP схема для бригади

Підрозділ WG IP LTE TAC Підмережа
HQ 10.10.10.1 1 10.10.20.0/24
1-й бат 10.10.10.10 10 10.10.30.0/24
2-й бат 10.10.10.20 20 10.10.40.0/24
3-й бат 10.10.10.30 30 10.10.50.0/24
Рота 1A 10.10.10.11 11 10.10.31.0/24
Рота 1B 10.10.10.12 12 10.10.32.0/24

Див. також

Шлях: lte/multi-tower-mesh.md

UMTC Wiki © 2026 | Ukrainian Military Tactical Communications