Домашняя беспроводная сеть почти всегда настраивается один раз и больше не трогается, а потом годами работает на автовыборе канала рядом с десятком соседских точек. Результат предсказуем: скорость плавает, видеозвонок рассыпается, а файлы по сети копируются вдвое медленнее, чем могли бы. Конфигурационный файл wireless в OpenWrt даёт полный контроль над параметрами радио, и большая часть проблем лечится правкой пяти-шести строк. Разбираем, что именно менять и как проверить результат.

Устройство файла wireless и разделы wifi-device с wifi-iface

Конфигурация беспроводной сети в OpenWrt лежит в файле /etc/config/wireless и устроена по принципу системы UCI: файл состоит из разделов двух типов.

Раздел wifi-device описывает физическое радио. В нём задаются канал, ширина полосы, мощность передатчика, страна и параметры, общие для всех сетей на этом радио. Раздел wifi-iface описывает логическую сеть поверх радио: имя точки, пароль, шифрование и привязку к сетевому интерфейсу.

Типовая конфигурация выглядит так:

config wifi-device 'radio0'
    option type 'mac80211'
    option path 'platform/18000000.wmac'
    option band '2g'
    option channel '1'
    option htmode 'HT20'
    option country 'RU'
    option txpower '20'
    option cell_density '0'

config wifi-device 'radio1'
    option type 'mac80211'
    option path '1a143000.pcie/pci0000:00/0000:00:00.0'
    option band '5g'
    option channel '36'
    option htmode 'VHT80'
    option country 'RU'
    option txpower '23'

config wifi-iface 'wifinet0'
    option device 'radio1'
    option mode 'ap'
    option ssid 'home'
    option encryption 'psk2'
    option key 'пароль_сети'
    option network 'lan'

Отдельно стоит знать про устаревшую опцию hwmode. Она управляла диапазоном и набором стандартов одновременно, что приводило к путанице, и начиная с версии 21.02.2 вместо неё используется опция band со значениями 2g, 5g, 6g и 60g. В старых конфигурациях hwmode ещё встречается, и при переносе настроек на свежую версию её стоит заменить.

Править файл можно двумя способами: напрямую в текстовом редакторе или через утилиту uci, которая гарантирует корректный синтаксис.

uci show wireless
uci set wireless.radio1.channel='36'
uci commit wireless
wifi reload

Выбор канала по результатам сканирования вместо автоопределения

Значение auto у опции channel выглядит разумным, но на практике работает плохо. Алгоритм автоматического выбора канала учитывает загрузку в момент запуска радио и почти не пересматривает выбор в дальнейшем, а при каждой перезагрузке точка может оказаться на новом канале, из-за чего клиенты теряют связь на несколько секунд.

Разумнее выбрать канал один раз, по результатам осмотра эфира. Сканирование соседних сетей выполняется штатной утилитой:

iwinfo wlan0 scan | grep -E 'ESSID|Channel|Signal'

Более подробную картину по загрузке даёт опрос ядра:

iw dev wlan0 survey dump | grep -A4 'frequency'

В выводе интересуют три величины: время занятости канала, время приёма и время передачи. Канал с большим временем занятости при отсутствии собственных передач означает, что его занимает сосед.

Для диапазона 2,4 ГГц неперекрывающихся каналов всего три: 1, 6 и 11. Всё остальное создаёт помехи сразу нескольким соседям, поэтому выбор сводится к поиску наименее занятого из трёх. В диапазоне 5 ГГц каналов заметно больше, и выбор шире, но есть ограничение, связанное с динамическим выбором частот.

Каналы, пересекающиеся с радиолокационными диапазонами, помечены как DFS. Точка доступа обязана слушать эфир перед началом работы на таком канале и немедленно уходить с него при обнаружении радара. Внешне это выглядит как внезапное пропадание сети на минуту, и в жилом массиве с плотной застройкой такое поведение раздражает. Если стабильность важнее максимальной скорости, канал стоит брать вне DFS, из диапазона 36-48.

Ширина канала и компромисс между скоростью и устойчивостью связи

Опция htmode задаёт ширину полосы и одновременно определяет, какие стандарты разрешены. Доступные значения для 802.11n это HT20, HT40, HT40+ и HT40-, для 802.11ac это VHT20, VHT40, VHT80 и VHT160, для 802.11ax это HE20, HE40, HE80 и HE160. Значение NOHT отключает высокоскоростные режимы целиком.

Связь между шириной и скоростью почти линейная: удвоение полосы даёт удвоение теоретической скорости. Обратная сторона в том, что удваивается и занимаемый эфир, а значит, растёт вероятность пересечения с соседями и падает отношение сигнала к шуму.

Практическое правило для диапазона 2,4 ГГц в многоквартирном доме: только HT20. Широкий канал здесь почти не даёт выигрыша, поскольку весь диапазон забит, а помехоустойчивость падает заметно.

Для 5 ГГц разумный выбор это VHT80 или HE80. Такая ширина даёт заметный прирост скорости и при этом оставляет место для нескольких неперекрывающихся каналов. Переход на 160 МГц оправдан только при отсутствии соседей и готовности мириться с уходом канала из-за радара, поскольку все доступные полосы в 160 МГц затрагивают DFS.

Отдельный параметр chanbw задаёт узкую ширину в 5, 10 или 20 МГц и применяется для старых драйверов. В современных сборках им пользоваться не требуется.

Проверить, что ширина действительно применилась, можно одной командой:

iwinfo wlan1 info

В выводе будет указана текущая ширина канала и согласованная скорость, что сразу показывает расхождение между желаемым и действительным.

Мощность передатчика и асимметрия между передачей и приёмом

Опция txpower задаёт желаемую мощность в дБм, и первое желание при настройке состоит в том, чтобы выставить максимум. Это ошибка, которая ухудшает связь.

Причина в асимметрии. Мощность передатчика точки доступа и мощность передатчика телефона различаются на порядок. Точка может излучать 20-23 дБм, а клиентский модуль в смартфоне выдаёт около 15 дБм и имеет антенну меньшего размера. Если мощность точки задрана до предела, телефон уверенно видит сеть, но его ответный сигнал до точки не доходит. Симптом характерный: сеть видна с полным индикатором, а страницы не открываются.

Реальное ограничение задаётся не настройкой, а регуляторными требованиями для указанной страны. Значение опции country влияет на доступные каналы и на потолок мощности, поэтому страна должна быть указана верно. При указании страны включается также передача соответствующего информационного элемента в служебных кадрах, если выставлена опция country_ie.

Порядок подбора мощности короткий:

  1. Выставить начальное значение в 17-20 дБм для диапазона 2,4 ГГц и 20-23 дБм для 5 ГГц, не пытаясь сразу взять максимум;
  2. Обойти помещение и записать уровень сигнала в трёх-четырёх дальних точках, где сеть реально используется;
  3. Сравнить показания с порогом минус семьдесят дБм, ниже которого устойчивая скорость уже не достигается;
  4. Если в дальней точке уровень ниже порога, переместить точку доступа, поскольку добавление мощности проблему не решает;
  5. Перепроверить значение командой iw dev после применения, потому что драйвер молча округляет его до разрешённого регуляторными требованиями.

Проверить фактическую мощность можно через ядро:

iw dev wlan1 info
iw dev wlan1 station dump | grep -E 'signal|tx bitrate'

Вторая команда показывает уровень сигнала и скорость для каждого подключённого клиента, что полезнее общих цифр: видно, кто именно сидит на низкой скорости и тянет вниз общую производительность радио.

Виртуальные интерфейсы, гостевая сеть и цена лишних имён точек

Одно радио способно обслуживать несколько логических сетей. Добавляется это ещё одним разделом wifi-iface с тем же значением device:

config wifi-iface 'guest0'
    option device 'radio1'
    option mode 'ap'
    option ssid 'home-guest'
    option encryption 'psk2'
    option key 'гостевой_пароль'
    option network 'guest'
    option isolate '1'

Привязка к отдельному сетевому интерфейсу guest и опция isolate дают то, ради чего гостевую сеть обычно и заводят: клиенты видят только точку доступа и не могут обратиться ни к устройствам в основной сети, ни друг к другу.

Цена такого решения не нулевая. Каждое дополнительное имя точки требует отдельного пакета служебных кадров, которые передаются на самой низкой базовой скорости и занимают эфирное время. Одно лишнее имя на загруженном радио отнимает несколько процентов доступного времени, а три-четыре имени уже заметны по скорости.

Разумная практика: держать одно основное имя на радио, а гостевую сеть заводить только тогда, когда она действительно нужна. Если гостевая сеть включена постоянно, её служебные кадры расходуют эфир круглосуточно.

Отдельно стоит упомянуть параметр cell_density. Он управляет порогом, при котором клиенту рекомендуют отключиться от точки, и используется для ускорения перехода между точками в составе ячеистой сети. Значения от 1 до 3 соответствуют увеличивающейся плотности клиентов. Выставлять максимальное значение на одной точке смысла нет, поскольку клиенты начнут терять связь там, где сигнал ещё рабочий.

Ограничение устаревших стандартов и влияние медленных клиентов на общую скорость

Радио работает на скорости самого медленного подключённого клиента в том смысле, что кадры, адресованные ему, занимают эфир дольше. Устройство с поддержкой только 802.11b передаёт данные на скорости до 11 Мбит/с, и каждая такая передача блокирует радио на время, за которое современный клиент успел бы передать в десятки раз больше.

Отключить устаревшие режимы позволяет опция legacy_rates:

uci set wireless.radio0.legacy_rates='0'
uci commit wireless
wifi reload

Более жёсткий способ, опция require_mode, задаёт минимальный уровень поддержки, без которого клиент не будет принят. Значение n оставляет только устройства с поддержкой 802.11n и новее, значение ac требует 802.11ac.

Со значением ac стоит быть осторожнее. Часть устройств, включая некоторые модели известных производителей, при таком требовании ведёт себя нестабильно и подключается через раз, даже формально поддерживая нужный стандарт. Значение n безопаснее и закрывает почти все реальные проблемы.

Есть и более тонкие параметры. Опция distance указывает расстояние до самого дальнего клиента в метрах и влияет на тайминги ожидания ответа; завышенное значение снижает производительность, заниженное приводит к обрывам на большом удалении. Опция beacon_int задаёт интервал служебных кадров в единицах по 1,024 мс, стандартное значение 100, и менять его имеет смысл только при большом числе клиентов.

Применение настроек, диагностика и измерение реального результата

Правки в файле не вступают в силу сами по себе. После изменения конфигурации её применяют:

uci commit wireless
wifi reload

Команда wifi reload перезапускает радио, и на несколько секунд сеть пропадает. Полный перезапуск беспроводной подсистемы без перезагрузки роутера выполняется командой wifi, без аргументов.

Дальше стоит убедиться, что настройки действительно применились, поскольку часть значений ограничивается драйвером или регуляторными требованиями молча, без сообщений об ошибке.

iwinfo wlan0 info
iwinfo wlan1 info
uci show wireless | grep -E 'channel|htmode|txpower'
logread | grep -i hostapd | tail -30

Последняя команда самая полезная при диагностике. Журнал содержит сообщения точки доступа о запуске, о выбранном канале и о причинах отказа клиентам. Если радио не поднялось на желаемом канале, причина будет именно там.

Измерение результата проводится одинаково каждый раз, иначе сравнивать нечего. Нужен один и тот же клиент, одно и то же место в помещении и нагрузочный тест до канала:

iperf3 -s
iperf3 -c 192.168.1.1 -t 30 -P 4

Параллельные потоки, задаваемые ключом -P, показывают реальную пропускную способность лучше одного потока, поскольку один поток часто упирается в производительность одного ядра процессора клиента.

Порядок действий при настройке разумнее держать таким: сначала канал, затем ширина полосы, потом мощность, и в конце ограничение устаревших режимов. Менять всё одновременно бессмысленно, поскольку при ухудшении будет непонятно, какая именно правка его вызвала. Каждое изменение стоит проверять замером, и через час такой работы сеть обычно стабильнее и быстрее исходной автонастройки в несколько раз.