comvir
comvir
2680 просмотров13 комментариев

Беспроводная точка доступа из репки

Самое время отвлечься от новогоднего салата, достать из коробки осеннюю репку и что-нибудь настроить... Скажем, беспроводную точку доступа.

Подготовительные мероприятия:

Скачиваем и записываем актуальную прошивку (1.0.17)

По-желанию переключаем репку в режим CLI.

systemctl set-default multi-user.target

Переключаем репозитории на mirror.yandex.ru.

Файл /etc/apt/sources.list:

###### Ubuntu Main Repos
deb http://mirror.yandex.ru/ubuntu-ports/ focal main restricted universe multiverse
deb-src http://mirror.yandex.ru/ubuntu-ports/ focal main restricted universe multiverse

###### Ubuntu Update Repos
deb http://mirror.yandex.ru/ubuntu-ports/ focal-security main restricted universe multiverse
deb http://mirror.yandex.ru/ubuntu-ports/ focal-updates main restricted universe multiverse
deb http://mirror.yandex.ru/ubuntu-ports/ focal-backports main restricted universe multiverse
deb-src http://mirror.yandex.ru/ubuntu-ports/ focal-security main restricted universe multiverse
deb-src http://mirror.yandex.ru/ubuntu-ports/ focal-updates main restricted universe multiverse
deb-src http://mirror.yandex.ru/ubuntu-ports/ focal-backports main restricted universe multiverse

Устанавливаем и настраиваем nftables.

apt install nftables

systemctl enable nftables

Файл /etc/nftables.conf:

#!/usr/sbin/nft -f

flush ruleset

table inet filter {
  chain input {
    type filter hook input priority filter; policy drop;
    ct state established,related accept
    ip protocol icmp accept
    meta l4proto ipv6-icmp accept
    iifname "eth0" tcp dport 22 accept
    iifname { "lo", "wlan0" } accept
  }
  chain forward {
    type filter hook forward priority filter; policy drop;
    tcp flags syn tcp option maxseg size set rt mtu
    ct state established,related accept
    ip protocol icmp accept
    meta l4proto ipv6-icmp accept
    ip6 saddr { ::1/128, fc00::/7 } accept
    ip saddr { 10.0.0.0/8, 100.64.0.0/10, 127.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16 } accept
  }
  chain output {
    type filter hook output priority filter; policy accept;
  }
}

table inet nat {
  chain prerouting {
    type nat hook prerouting priority dstnat; policy accept;
  }

  chain postrouting {
    type nat hook postrouting priority srcnat; policy accept;
    ip6 saddr { ::1/128, fc00::/7 } oifname "eth0" masquerade
    ip saddr { 10.0.0.0/8, 100.64.0.0/10, 127.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16 } oifname "eth0" masquerade
  }
}

systemctl start nftables

Переключаем сетевую часть на netplan.io:

apt remove ifupdown

rm -rf /etc/network/

apt install netplan.io

Файл /etc/netplan/repka-pi3.yaml.

network:
  version: 2
  renderer: NetworkManager
  ethernets:
    eth0:
      addresses:
        - 10.50.88.231/24
        - fd50:88::231/64
      gateway4: 10.50.88.253
      gateway6: fd50:88::110
      nameservers:
        addresses:
          - 10.50.88.110
          - fd50:88::110
    wlan0:
      renderer: networkd
      dhcp4: false
      dhcp6: false
      addresses:
        - 10.3.14.253/24
        - fc03:14::ff02/64
        - fe80::5241:1cff:fe84:df18/64

Возвращаем IPv6 и включаем маршрутизацию.

Файл /etc/sysctl.conf:

net.ipv4.ip_forward=1
net.ipv6.conf.all.forwarding=1

sysctl -p

Устанавливаем hostapd и dnsmasq, если их нет.

apt install hostapd dnsmasq-base

Редактируем системный файл для hostapd и создаём файл для dnsmasq. Нужно “расставить приоритеты” (см. Requires=), иначе при включении системы эти сервисы стартуют раньше, чем отработает netplan.io, и соответственно точка доступа не будет работать.

Файл /lib/systemd/system/hostapd@.service:

[Unit]
Description=Advanced IEEE 802.11 AP and IEEE 802.1X/WPA/WPA2/EAP Authenticator (%I)
After=network.target
Requires=network-manager.service
BindsTo=sys-subsystem-net-devices-%i.device

[Service]
Type=forking
PIDFile=/run/hostapd.%i.pid
Restart=on-failure
RestartSec=2
EnvironmentFile=-/etc/default/hostapd
ExecStart=/usr/sbin/hostapd -B -P /run/hostapd.%i.pid $DAEMON_OPTS /etc/hostapd/%i.conf

[Install]
WantedBy=multi-user.target sys-subsystem-net-devices-%i.device

Файл /etc/systemd/system/dnsmasq@.service:

[Unit]
Description=DNSMASQ at %i interface
After=network.target
Requires=hostapd@%i.service

[Service]
Type=forking
PIDFile=/run/dnsmasq.%i.pid
Restart=on-failure
RestartSec=2
ExecStart=/usr/sbin/dnsmasq --conf-file=/etc/dnsmasq/%i.conf

[Install]
WantedBy=multi-user.target

Cоздаём файлы конфигурации, активируем сервисы hostapd@wlan0 и dnsmasq@wlan0, затем перезагружаем репку.

Файл /etc/hostapd/wlan0.conf:

#### Interface configuration ####
interface=wlan0
driver=nl80211
##### IEEE 802.11 related configuration #####
ssid=comvir
hw_mode=g
channel=8
auth_algs=1
country_code=RU
ieee80211d=1
ieee80211h=0
##### IEEE 802.11n related configuration #####
wmm_enabled=1
ieee80211n=1
ht_capab=[HT20][SHORT-GI-20][DSSS_CK-40][MAX-AMSDU-3839]
##### WPA/IEEE 802.11i configuration #####
wpa=2
wpa_key_mgmt=WPA-PSK
rsn_pairwise=CCMP
wpa_passphrase=SecREtPaSsPhRAsE
##### controlling enabled #####
ctrl_interface=/var/run/hostapd.wlan0
ctrl_interface_group=0

Файл /etc/dnsmasq/wlan0.conf:

pid-file=/run/dnsmasq.wlan0.pid
dhcp-leasefile=/var/lib/misc/dnsmasq.wlan0.leases
interface=wlan0
except-interface=lo
bind-interfaces
dhcp-range=10.3.14.1,10.3.14.15,24h
enable-ra
ra-param=wlan0,120,1200
dhcp-range=::,constructor:wlan0,ra-stateless,24h

systemctl daemon-reload

systemctl enable hostapd@wlan0

systemctl enable dnsmasq@wlan0

reboot

После перезапуска репки проверяем, что всё корректно инициализировалось.

ip addr

systemctl status hostapd@wlan0

systemctl status dnsmasq@wlan0

Подключаемся к новой беспроводной сети и проверяем что сеть работает.

Дополнение по итогам нескольких дней эксперимента.

В условиях перегруженного диапазона 2.4GHz в многоквартирных домах передача данных через проводную точку доступа по 20Mhz каналу работает очень не очень. WiFi анализатор показывает порядка 17 точек доступа, в особо запущенных случаях 25+. При многопоточной/многопользовательской передаче данных RTT подскакивает до 3500 - 4900 ms, что вызывает грусть. Общая скорость передачи данных с трудом преодолевает значение в 2 мегабита. В основном держится в районе 1.7 мегабита. Звонки по WiFi периодически "булькали и шмулькали". Сайты открывались со скрипом, ощутимая часть элементов попросту не прогружалось. При загрузке данных наблюдалось давненько забытое состояние stalled. В однопоточном/однопользовательском режиме все немного бодрее, иногда скорости подрастали до 7-8.5 мегабит/с. В целом для WiFi-4 (802.11n) это скажем прямо маловато.

comvir@repka-pi3:~$ iperf3 -s -i 60
-----------------------------------------------------------
Server listening on 5201
-----------------------------------------------------------
Accepted connection from fc03:14::285a:7d8d:8a63:c4da, port 44510
[ ID] Interval           Transfer     Bitrate         Retr
[SUM]   0.00-60.00  sec  12.7 MBytes  1.78 Mbits/sec  446
[SUM]  60.00-120.00 sec  13.2 MBytes  1.85 Mbits/sec  778
[SUM] 120.00-180.00 sec  15.3 MBytes  2.14 Mbits/sec  596
- - - - - - - - - - - - - - - - - - - - - - - - - 
[SUM]   0.00-180.51 sec  41.5 MBytes  1.93 Mbits/sec  1837   sender

Попробуем как-то улучшить пользовательский опыт.

По умолчанию на репке txpower установлен в значение 30 dBm.

comvir@repka-pi3:~$ iw wlan0 info
Interface wlan0
        ifindex 4
        wdev 0x1
        addr 50:41:1c:84:df:18
        ssid comvir
        type AP
        wiphy 0
        channel 8 (2447 MHz), width: 20 MHz, center1: 2447 MHz
        txpower 30.00 dBm

Кажется это перебор. В ультрабуках к примеру выставляют 20 dBm, в перешитых домашних WiFi маршрутизаторах встречались значения в 16 dBm, в доступном для меня представителе платформы NUC 15dBm, в более-менее новых домашних маршрутизаторах WiFi работает гораздо стабильнее на средних или низких уровнях мощности передатчика. Попробую установить значение txpower в 18 dBm:

# cat /etc/systemd/system/wlan0-txlimit@.service
[Unit]
Description=Setting wlan0 txpower limit to %i dBm
Wants=sys-subsystem-net-devices-wlan0.device
After=network.target
Requires=sys-subsystem-net-devices-wlan0.device

[Service]
Type=simple
ExecStart=/usr/sbin/iw wlan0 set txpower limit %i

[Install]
WantedBy=multi-user.target

# systemctl enable wlan0-txlimit@1800
# systemctl start wlan0-txlimit@1800
# iw wlan0 info
Interface wlan0
        ifindex 5
        wdev 0x100000001
        addr 50:41:1c:84:df:18
        ssid comvir
        type AP
        wiphy 0
        channel 8 (2447 MHz), width: 20 MHz, center1: 2447 MHz
        txpower 18.00 dBm
Примечание от 20240111: Предположительно, центральная частота установленной антенны: 2.45GHz. Оптимальными каналами WiFi предположительно должны быть: 8, 9 или 7. Для txpower оптимальные значения предположительно должны быть от 17dBm до 20 dBm.

Смотрим что получилось:

comvir@repka-pi3:~$ iperf3 -s -i 60
-----------------------------------------------------------
Server listening on 5201
-----------------------------------------------------------
Accepted connection from fc03:14::914e:beea:2d36:b22a, port 41712
[ ID] Interval           Transfer     Bitrate         Retr
[SUM]   0.00-60.00  sec  50.5 MBytes  7.06 Mbits/sec  891
[SUM]  60.00-120.00 sec   137 MBytes  19.2 Mbits/sec  762
[SUM] 120.00-180.00 sec   113 MBytes  15.8 Mbits/sec  1175
- - - - - - - - - - - - - - - - - - - - - - - - - 
[SUM]   0.00-180.07 sec   301 MBytes  14.0 Mbits/sec  2828  sender

Выглядит обнадёживающее, повысим накал и переключимся на udp:

iperf3 -p 5201 -c fc03:14::ff02 -i 60 -t 180 --udp --bidir --parallel 7 --bitrate 2M

Смотрим результат:

[ ID][Role] Interval           Transfer     Bitrate         Jitter    Lost/Total Datagrams
[SUM][RX-S]   0.00-181.11 sec  67.9 MBytes  3.14 Mbits/sec  310.418 ms  217299/267123 (81%)  receiver

На стороне клиентской части jitter в пределах разумного (29ms, т.е. не выходит за границу в 50ms), но потерянных кадров 74%. Полнодуплексный трафик в 14 Мегабит/с встроенный модуль wifi не вытягивает. Нужно попробовать подключить хотя-бы полисер. Надеюсь обойтись малым.

После нескольких часов изысканий пришёл к такой настройке полисера (можно добавить в файл /etc/nftables.conf) для самого свободного, в моих радио-условиях, канала WiFi:

table inet mangle {
        chain prerouting {
                type filter hook prerouting priority mangle; policy accept;
                iifname "wlan0" jump policer_iif_wlan0
        }

        chain postrouting {
                type filter hook postrouting priority mangle; policy accept;
                oifname "wlan0" jump policer_oif_wlan0
        }

        chain policer_iif_wlan0 {
                limit rate over 625 kbytes/second burst 125 kbytes drop
        }

        chain policer_oif_wlan0 {
                limit rate over 625 kbytes/second burst 125 kbytes drop
        }
}

В зависимости загруженности радио-эфира для точки доступа на репке можно использовать значения rate/burst от 375/75 до 1000/200 (шаг 125/25).

Подводя черту. Jitter остаётся в рамках 50ms. RTT прекратил постоянные попытки постичь бесконечность. Сайты нормально открываются. Просмотр видео с нескольких подключенных устройств не "парализует" беспроводную сеть. Звонки через WiFi не вызывают гнев.

Дополнение 2. Добавление WiFi-5 (802.11ac) адаптера Mercusys MU6H

Адаптер представляет собой комбинированное устройство с несъёмной антенной (усиление 5dBi). При подключении предоставляет системе USB накопитель с драйверами для MS Windows, которые на репке не актуальны. Для автоматического переключения адаптера в режим WiFi карты, нужно создать файл /etc/udev/rules.d/21-usb-8821cu.rules:

ATTR{idVendor}=="0bda", ATTR{idProduct}=="1a2b", RUN+="usb_modeswitch '/%k'"
ACTION=="add", SUBSYSTEM=="usb", ATTRS{idVendor}=="0bda",  ATTRS{idProduct}=="1a2b", RUN+="/usr/sbin/usb_modeswitch --quiet -K -v 0bda -p 1a2b"

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

$ lsusb -d 0bda:
Bus 003 Device 002: ID 0bda:c811 Realtek Semiconductor Corp. 802.11ac NIC
$ iw wlxc0252fe9b0eb info
Interface wlxc0252fe9b0eb
        ifindex 4
        wdev 0x100000001
        addr c0:25:2f:e9:b0:eb
        ssid comvir
        type AP
        wiphy 1
        txpower 12.00 dBm

Пример конфигурации hostapd для Mercusys MU6H на wifi канал 36:

$ cat wlxc0252fe9b0eb.conf
#### Interface configuration ####
interface=wlxc0252fe9b0eb
bssid=c0:25:2f:e9:b0:eb
driver=nl80211
##### IEEE 802.11 related configuration #####
ssid=comvir
hw_mode=a
channel=36
auth_algs=1
dtim_period=1
country_code=RU
ieee80211d=1
ieee80211h=1
##### IEEE 802.11n related configuration #####
wmm_enabled=1
ieee80211n=1
# Note for HT40-/+ option to use
# freq     HT40-        HT40+
# 2.4 GHz  5-13         1-7 
# 5 GHz    40,48,56,64  36,44,52,60
ht_capab=[HT40+][SHORT-GI-20][SHORT-GI-40][DSSS_CK-40][MAX-AMSDU-7935]
##### IEEE 802.11ac related configuration #####
ieee80211ac=1
vht_capab=[MAX-MPDU-11454][HTC-VHT][MAX-A-MPDU-LEN-EXP7]
vht_oper_chwidth=0
##### WPA/IEEE 802.11i configuration #####
wpa=2
wpa_key_mgmt=WPA-PSK
rsn_pairwise=CCMP
# wpa-psk hash code was generated by: wpa_passphrase SSID PASSPHRASE
wpa_psk=9d057fac094d385fb2b15237cf032baf035a984a3ed9c8f618e3639feb420c33

##### controlling enabled #####
ctrl_interface=/var/run/hostapd.wlxc0252fe9b0eb
ctrl_interface_group=0

Далее возможно объединить встроенный и usb wifi адаптеры в один мост (bridge), и точка доступа будет вещать в двух диапазонах wifi.

Роуминг (802.11r) между диапазонами пока не работает. При попытке его включить начинает крашиться модуль ядра 8821cu, плюс перестаёт работать авторизация (802.11i).


Комментарии (13)

Для участия в обсуждении вы должны быть авторизованным пользователем
Команда Репки
Команда Репки  

Хороший материал!

Команда Репки
Команда Репки  

Спасибо за Ваши статьи!
Просьба в группе откликнуться, чтобы от лица команды Проекта Репки Вам смогли выслать Репку из лимитированной серии. Если с кем то в команде проекта уже был контакт, то можно просто связаться повторно, там разберёмся уже :-)

comvir
comvir  

Спасибо, ответил на сообщение в группе https://t.me/RepkaPitalk в телеграмме в 17:49, как @dmitry_comvir

Команда Репки
Команда Репки  

Да, Спасибо! Уже в работе.

comvir
comvir  

Провёл дополнительную мини-серию тестов со значениями txpower в диапазоне от 12 dBm до 24 dBm. В моих радио-условиях на 13-м канале WiFi оптимальной настройкой вышло значение в 18 dBm. Внёс правки в статью.

Владимир  

Спасибо за статью! Интересна и не понятна зависимость: понижения мощности передатчика - улучшение связи.

comvir
comvir  

Добавлен блок про подключение usb wifi-5 адаптера, на примере Mercusys MU6H. Информация полезна для случаев когда диапазон 2.4GHz настолько "засорён" что добиться нормальной работы в нём можно только пройдя путь по экранированию помещения от внешней электро-магнитной обстановки.

ejsanyo
ejsanyo  

Заработало, но как ни странно, БЕЗ netplan-а! А только под родным ifupdown. netplan упорно не хотел у меня создавать wlan0, как я конфиг файл только не ковырял. Репко-Ось arm64_ubuntu_20.04.6_desktop_13.06.24_ver-1.6, записана с образа на чистую. Не то чтобы это было проблемой, не знаю вообще, чем этот самый netplan был бы лучше для меня. Странно просто.

comvir
comvir  

Ubuntu с 18.04 LTS навязывает netplan.io вместо ifupdown. Да и в официальных облачных сборках Debian установлен netplan.io по умолчанию. Пришлось изучать netplan.

ejsanyo
ejsanyo  

Да, ещё такой момент: если у вас на Репе крутится какой-нибудь сервак, учитывайте, что приведённые в статье правила nftables.conf закрывают все входящие соединения, кроме SSH на локалке! Вот, например, что я изменил, чтобы заработал smbd:

chain input {
type filter hook input priority filter; policy drop;
ct state established,related accept
ip protocol icmp accept
meta l4proto ipv6-icmp accept
iifname "eth0" tcp dport 22 accept
iifname { "lo", "wlan0" } accept
udp dport netbios-ns accept comment "Accept NetBIOS Name Service (nmbd)"
udp dport netbios-dgm accept comment "Accept NetBIOS Datagram Service (nmbd)"
tcp dport netbios-ssn accept comment "Accept NetBIOS Session Service (smbd)"
tcp dport microsoft-ds accept comment "Accept Microsoft Directory Service (smbd)"
}
PS И ещё, чтобы SMB был доступен и через вайфай, может быть, надо в секцию chain forward добавить в конце:

udp dport { netbios-ns, netbios-dgm } drop;
tcp dport { netbios-ssn, microsoft-ds } drop;

Поправьте если не так, но у меня без этого шара не виделась.

ejsanyo
ejsanyo  

Заметил, что после перезагрузки (не каждый раз, но довольно часто) вылезает такой вот баг:
ieee80211 phy0: brcmf_fil_cmd_data: bus is down. we have nothing to do.
ieee80211 phy0: brcmf_cfg80211_get_tx_power: error (-5)
И после этого вайфай не работает, как минимум, пока не перезагрузишь Репу ещё раз. Если кто знает, как с этим бороться, отпишитесь пожалуйста.
PS Похоже этот глюк возникает на ядре 6.1.11 (опять драва недопилили?). Откатился на 5.19.16 - стало работать намного стабильнее.

ejsanyo
ejsanyo  

Если открыть даташит на антенну https://files.seeedstudio.com/wiki/Wifi_Bee_v2.0/res/Antenna_Datasheet.pdf (вроде же там такая впаяна?), то выходит, что центральная частота у неё 2,4475 ГГц, что соответствует 8 каналу.

Навигация

ВойтиРегистрацияТемы