Table of Contents

802.11s Створення Mesh мережі

802.11s — це відкритий стандарт для з'єднання бездротових пристроїв без необхідності створення інфраструктури. Він працює на канальному рівні (Layer 2) і забезпечує, щоб усі вузли бачили одне одного в bridged мережі рівня 2 (нібито всі підключені до одного комутатора). Будь-яка інфраструктура мережевого рівня (Layer 3) працюватиме поверх цього.

Розроблені додаткові пакунки для розширення базового рівня 2 mesh 802.11, особливо у випадках, коли необхідна підтримка кількох шлюзів в Інтернет і частково дротового каналу зв’язку (backhaul).
Ці розширені пакунки більше орієнтовані на великі інфраструктурні сценарії, наприклад — локальні спільноти або навіть міські мережі, а не на типове домашнє використання mesh.

Дивіться:
batman
mesh11sd
olsr

На противагу цьому, базова mesh-мережа 802.11s може бути простим “one hop” ретранслятором Wi-Fi у домашньому середовищі без додаткових пакунків.

Що таке Mesh?

Mesh-мережа — це multi-point канал зв’язку на рівні 2 з маршрутизацією на основі MAC-адрес, який використовується для з’єднання mesh-вузлів.
Mesh-вузли, як правило, не є користувацькими пристроями, а представляють собою маршрутизатори, точки доступу, клієнтські пристрої (CPE) тощо.

Звичайний користувацький пристрій, такий як телефон, планшет або ноутбук, не може безпосередньо підключатися до mesh-мережі.
Натомість підключення здійснюється через шлюз mesh-мережі — спеціальний тип mesh-вузла.

Ви впевнені, що вам потрібна mesh-мережа?

Якщо ви шукаєте рішення для безшовного роумінгу користувацьких пристроїв між точками доступу у вашому домі, вам потрібен 802.11r (roaming), а не 802.11s.

На жаль, деякі виробники використовують слово “Mesh” у маркетингових цілях для позначення своїх нестандартних, закритих і пропрієтарних рішень для роумінгу, що створює велику плутанину для багатьох людей, коли вони стикаються зі світом міжнародних стандартів та відкритого ПЗ для мережевої інфраструктури.

  1. Визнаним стандартом для mesh-мереж є ieee802.11s.
  2. Визнаним стандартом для швидкого роумінгу користувацьких пристроїв є ieee802.11r.

Це два абсолютно не пов’язані між собою стандарти.

Mesh 802.11s

802.11s працює стабільно у всіх актуальних версіях OpenWrt, включаючи підтримку шифрування “over the air”, за умови підтримки відповідним обладнанням і драйверами. Для цього необхідний пакунок wpad-mesh-mbedtls (або аналогічний).

Інтерфейс 802.11s потребує налаштування низки робочих параметрів ПІСЛЯ підняття інтерфейсу та його входження до складу mesh-мережі.
Деякі комбінації SoC не створюють mesh-інтерфейс досить швидко, через що налаштування цих параметрів може не спрацювати.

Однак для використання у ролі “one hop” Wi-Fi розширювача встановлення додаткових параметрів не є необхідним — цього цілком достатньо для базового, але корисного режиму.

Історично нездатність встановити mesh-параметри через те, що інтерфейс ще не був створений, іноді інтерпретувалася як “помилка ARP relay”, оскільки мережа рівня 2 (mac-маршрутизація) ніколи не активувалася одночасно між усіма вузлами mesh.

Пакунок mesh11sd був розроблений для того, щоб дозволити коректно й динамічно задавати всі наявні mesh-параметри.

802.11s Швидке розгортання

Mesh-мережу 802.11s можна швидко розгорнути, використовуючи OpenWrt Firmware Selector (або Image Builder) та пакунок Mesh11sd.

Дивіться:

802.11s Швидке розгортання

Перевірка підтримки з боку бездротових драйверів

:!: Підтримка 802.11s (режим типу mesh) залежить від бездротового драйвера. Більшість сучасних відкритих драйверів підтримують цей режим. Зверніть увагу, що деякі драйвери можуть заявляти про підтримку mesh, але мати з нею проблеми.

Наприклад, станом на грудень 2023 року драйвер ath10k-ct, який використовується в NETGEAR R7800 та інших пристроях з чіпами Qualcomm Atheros QCA988x, має проблеми з mesh — з’являються помилки та випадкові втрати бездротових інтерфейсів (повідомлення про проблему). Рекомендується створити прошивку за допомогою Firmware Selector, яка видаляє модуль -ct (наприклад, kmod-ath10k-ct) та прошивку -ct (наприклад, ath10k-firmware-qca9984-ct) і замінює їх на non-ct версії (kmod-ath10k і ath10k-firmware-qca9984) для стабільної підтримки mesh.

Скористайтеся наступною командою, щоб перевірити, чи підтримує ваше обладнання mesh:

iw list | grep "Supported interface modes" -A 9

...
      Supported interface modes:
                 * IBSS
                 * managed
                 * AP
                 * AP/VLAN
                 * WDS
                 * monitor
                 * mesh point
                 * P2P-client
                 * P2P-GO
...

Приклад: ath9k у маршрутизаторі

iw list
...
valid interface combinations:
     * #{ managed, WDS } <= 2048, #{ AP, mesh point } <= 8, #{ P2P-client, P2P-GO } <= 1, #{ IBSS } <= 1,
       total <= 2048, #channels <= 1, STA/AP BI must match
     * #{ IBSS, AP, mesh point } <= 1,
       total <= 1, #channels <= 1, STA/AP BI must match, radar detect widths: { 20 MHz (no HT), 20 MHz }
...

Приклад: USB-стік ath9k_htc

iw list
...
valid interface combinations:
     * #{ managed, P2P-client } <= 2, #{ AP, mesh point, P2P-GO } <= 2,
       total <= 2, #channels <= 1
...

Встановлення та налаштування

Якщо ви хочете використовувати mesh-мережу з шифруванням, необхідно встановити версію wpad, яка підтримує шифрування для mesh.

На момент написання, потрібна або повна версія, або mesh-сумісна версія wpad.

Приклади:

Встановлення підтримки шифрування для Mesh:

Потрібно видалити версію wpad без підтримки mesh, яка зазвичай встановлюється за замовчуванням. Ви можете дізнатися, яка саме встановлена, у веб-інтерфейсі Luci через меню System→SoftwareUpdate Lists..., потім введіть у поле Filter: слово 'wpad'. Та, що відмічена як Installed, і є поточною. Видаліть її та встановіть відповідну -mesh версію.

Або за допомогою командного рядка:

opkg list-installed wpad*

Далі встановіть mesh-сумісну версію, що відповідає вашій попередній:

opkg update
opkg install ...

Примітки:

  1. З вересня 2019 року wpad-openssl або wpad-wolfssl отримали підтримку шифрування 802.11s. wpad-mbedtls додали пізніше.
  2. Версії wpad-basic-* підтримують тільки 802.11r та 802.11w.
  3. Версії wpad-mesh-* підтримують 802.11r/w та 802.11s.
  4. wpad-* — це повна версія з підтримкою 802.11k/v/r/w і 802.11s.
  5. Повна версія означає, що нічого не було видалено для зменшення розміру пакунка.

Приклад однієї команди для видалення базової версії wpad і встановлення mesh-версії:

УВАГА: потрібно перезавантажити пристрій або службу wpad, щоб нова версія почала працювати.

opkg update && opkg install wpad-mesh-mbedtls --download-only && opkg remove wpad-basic-mbedtls && opkg install wpad-mesh-mbedtls --cache . && rm *.ipk

Налаштування mesh у веб-інтерфейсі LuCI:

УВАГА: Не налаштовуйте mesh через LuCI, якщо ви також використовуєте mesh11sd у режимі auto_config
Оскільки LuCI створює статичну конфігурацію, а mesh11sd динамічно нею керує.

  1. Перейдіть у меню Network→Wireless
  2. Натисніть 'Add' у діапазоні 2.4GHz або 5GHz
  3. Interface Configuration→General Setup→Mode → виберіть '802.11s' і введіть значення 'Mesh ID', яке буде спільним для всіх вузлів у мережі
  4. У полі Network виберіть LAN
  5. У Interface Configuration→Wireless Security виберіть 'WPA3-SAE' і задайте пароль, спільний для всіх вузлів mesh
  6. Save
  7. Потім натисніть Save & Apply

УВАГА: STP не впливає на mesh-мережу, оскільки трафік рівня 2 вставляється у backhaul після обробки STP у bridge-інтерфейсі
Комутаційнійні петлі МОЖЛИВІ, якщо у вас є не-mesh сегменти у backhaul (наприклад, Ethernet-з’єднання) або ви використовуєте кілька mesh backhaul (наприклад, 2.4GHz І 5GHz).
Щоб уникнути цього, потрібно або використовувати mesh11sd, або створити власні правила nftables, щоб відсікати пакети, які сприяють створенню петлі.

Файл конфігурації Wireless UCI

УВАГА: Не редагуйте файл /etc/config/wireless вручну, якщо ви також використовуєте mesh11sd у режимі auto_config.
Оскільки це статична конфігурація, а mesh11sd керує нею динамічно.

Файл /etc/config/wireless має містити розділ mesh приблизно такого вигляду:

config wifi-iface 'mesh'
        option device 'radio0'
        option disabled '0'
        option mode 'mesh'
        option ifname 'mesh0'
        option network 'lan'
        option mesh_id 'my-mesh-id'
        option encryption 'sae' # або 'none', якщо не бажаєте використовувати шифрування
        option key 'your-secret-password'

Примітка: опція network 'lan' об’єднує mesh-інтерфейс із мережевим bridge 'lan'.

Цієї конфігурації має бути достатньо для підняття mesh-мережі. Після цього можна перезапустити Wi-Fi і перевірити:

wifi
iw dev mesh0 info

Вивід буде приблизно такий:

Interface mesh0
  ifindex 10
  wdev 0x3
  addr 12:34:56:78:9a:bc
  type mesh point
  wiphy 0
  channel 2 (2417 MHz), width: 20 MHz, center1: 2417 MHz
  txpower 28.00 dBm
  multicast TXQ:
    qsz-byt qsz-pkt flows drops marks overlmt hashcol tx-bytes  tx-packets
    0 0 129166  0 0 0 0 9107016   129167

Кожен пристрій, який має брати участь у mesh, повинен бути налаштований однаково: той самий mesh_id, той самий канал, той самий ключ.

Ця UCI-конфігурація підходить для побудови mesh з двох або максимум трьох вузлів, які розміщені близько один до одного.
Але для створення органічної, автономної, самокерованої mesh-мережі з багатьох вузлів потрібні додаткові налаштування.

Mesh11sd — Встановлення параметрів і опцій

Існує багато параметрів mesh, деякі з яких є критично важливими для надійної роботи mesh-мережі.

Більшість з них потребують, щоб інтерфейс mesh був уже активним перед застосуванням параметрів.

Якщо спробувати задати ці параметри у файлі конфігурації UCI (/etc/config/wireless), це не спрацює, адже конфігурація UCI використовується для запуску або перезапуску бездротової системи, і інтерфейс mesh буде створено після завершення роботи UCI.

Параметри можна задавати вручну за допомогою утиліти `iw`, але ці налаштування збережуться лише поки інтерфейс mesh активний. Після перезавантаження, перезапуску мережі або виконання команди `wifi` параметри буде скинуто до стандартних.

Щоб задати параметри постійно, слід встановити пакунок Mesh11sd:

opkg update
opkg install mesh11sd

Докладніше про Mesh11sd: mesh11sd

Автоматичне встановлення mesh-параметрів за допомогою Hotplug

Якщо ви хочете самостійно задавати параметри mesh без використання пакунка mesh11sd, АБО використовуєте інший mesh-протокол (наприклад, B.A.T.M.A.N або OLSR), і не можете скористатися перевагами автоматизації від mesh11sd, тоді можливо застосувати систему Hotplug в OpenWRT: hotplug

Приклад коду: /etc/hotplug.d/iface/99-my-mesh або /etc/hotplug.d/net/99-my-mesh

#!/bin/sh

# HOTPLUG_EVENT_PARAMETER
  # Ознайомтесь з Hotplug
  # Вибір між /etc/hotplug.d/iface та /etc/hotplug.d/net залежить від потреб
# MY-MESH-INTERFACE-OR-DEVICE
  # Ім’я інтерфейсу або пристрою (mesh0, radio0 тощо)
# HOTPLUG_ACTION
# SOME_ACTION
  # Наприклад, 'ifup'
# YOUR_MESH_DEVICE
  # Ваш mesh-інтерфейс (див. команду 'iwinfo')

if [ "${HOTPLUG_EVENT_PARAMETER}" = "MY-MESH-INTERFACE-OR-DEVICE" ]; then
    if [ "${HOTPLUG_ACTION}" = "SOME_ACTION" ]; then
      # Встановлення параметрів mesh:
      iw dev "${YOUR_MESH_DEVICE}" set mesh_param <ПАРАМЕТР> <ЗНАЧЕННЯ>
      # Запис у лог (див. через команду 'logread')
      logger -t 'mymesh' "Mesh parameters were updated"
    fi
fi

Приклад з реальними параметрами для інтерфейсу B.A.T.M.A.N: (файл: /etc/hotplug.d/iface/99-mymesh)

#!/bin/sh
if [ "${INTERFACE}" = "mesh_bat0" ]; then
    if [ "${ACTION}" = "ifup" ]; then
        # Зверніть увагу:
        # ${DEVICE} передається автоматично при використанні iface
        iw dev "${DEVICE}" set mesh_param mesh_max_peer_links 2
        iw dev "${DEVICE}" set mesh_param mesh_max_retries 5
        iw dev "${DEVICE}" set mesh_param mesh_rssi_threshold -80
        iw dev "${DEVICE}" set mesh_param mesh_fwding 0
        iw dev "${DEVICE}" set mesh_param mesh_nolearn 1 
        iw dev "${DEVICE}" set mesh_param mesh_hwmp_rootmode 2
        iw dev "${DEVICE}" set mesh_param mesh_gate_announcements 1
        iw dev "${DEVICE}" set mesh_param mesh_connected_to_gate 1
        iw dev "${DEVICE}" set mesh_param mesh_connected_to_as 0 
        logger -t 'mymesh' "Mesh parameters were updated"
    fi
fi

Щоб дізнатись більше про динамічні параметри mesh, перегляньте: Mesh11sd - опис параметрів

Перевірити поточні параметри можна за допомогою команди: iw dev &lt;ІНТЕРФЕЙС&gt; mesh_param dump (Інтерфейс можна знайти за допомогою iwinfo або iw list — переконайтесь, що це саме mesh-інтерфейс!)

Перевірка роботи mesh-мережі

Скористайтесь командою iw, щоб переглянути активні з’єднання або таблицю досяжності вузлів у mesh:

iw dev $MESH_IFACE station dump
iw dev $MESH_IFACE mpath dump

Приклад:

iw dev $MESH_IFACE station dump
    Station 00:15:6d:84:14:10 (on mesh)
         inactive time:  1320 ms
         rx bytes:   352
         rx packets: 4
         tx bytes:   174
         tx packets: 2
         signal:     -61 dBm
         tx bitrate: 1.0 MBit/s
         mesh llid:  32577
         mesh plid:  15969
         mesh plink: ESTAB
    Station 00:15:6d:84:14:09 (on mesh)
         inactive time:  3370 ms
         rx bytes:   1064
         rx packets: 12
         tx bytes:   545
         tx packets: 7
         signal:     -53 dBm
         tx bitrate: 1.0 MBit/s
         mesh llid:  41036
         mesh plid:  24435
         mesh plink: ESTAB

Додаткові матеріали