LTE Multi-Tower Mesh: Сценарій з 3+ вишками¶
Огляд¶
Цей документ описує розгортання mesh-мережі з трьома і більше LTE вишками, де кожна може бути як клієнтом так і точкою доступу одночасно.
Топологія¶
Базова схема (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¶
# /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 }}"
Масштабування¶
Додавання нової вишки¶
- Згенерувати WireGuard ключі
wg genkey | tee privatekey | wg pubkey > publickey
-
Визначити роль (Secondary/Tertiary)
-
Обрати частоту (уникати конфлікту з сусідами)
-
Додати peer на Hub або parent вишку
-
Налаштувати srsENB з унікальним enb_id
-
Додати 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 |
Останнє оновлення: Січень 2026
UMTC Project — Ukrainian Military Tactical Communications
Шлях: lte/multi-tower-mesh.md