Самое время отвлечься от новогоднего салата, достать из коробки осеннюю репку и что-нибудь настроить... Скажем, беспроводную точку доступа.
Подготовительные мероприятия:
Скачиваем и записываем актуальную прошивку (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).
Хороший материал!
Спасибо за Ваши статьи!
Просьба в группе откликнуться, чтобы от лица команды Проекта Репки Вам смогли выслать Репку из лимитированной серии. Если с кем то в команде проекта уже был контакт, то можно просто связаться повторно, там разберёмся уже :-)
Спасибо, ответил на сообщение в группе https://t.me/RepkaPitalk в телеграмме в 17:49, как @dmitry_comvir
Да, Спасибо! Уже в работе.
Провёл дополнительную мини-серию тестов со значениями txpower в диапазоне от 12 dBm до 24 dBm. В моих радио-условиях на 13-м канале WiFi оптимальной настройкой вышло значение в 18 dBm. Внёс правки в статью.
Супер!
Спасибо за статью! Интересна и не понятна зависимость: понижения мощности передатчика - улучшение связи.
Добавлен блок про подключение usb wifi-5 адаптера, на примере Mercusys MU6H. Информация полезна для случаев когда диапазон 2.4GHz настолько "засорён" что добиться нормальной работы в нём можно только пройдя путь по экранированию помещения от внешней электро-магнитной обстановки.
Заработало, но как ни странно, БЕЗ netplan-а! А только под родным ifupdown. netplan упорно не хотел у меня создавать wlan0, как я конфиг файл только не ковырял. Репко-Ось arm64_ubuntu_20.04.6_desktop_13.06.24_ver-1.6, записана с образа на чистую. Не то чтобы это было проблемой, не знаю вообще, чем этот самый netplan был бы лучше для меня. Странно просто.
Ubuntu с 18.04 LTS навязывает netplan.io вместо ifupdown. Да и в официальных облачных сборках Debian установлен netplan.io по умолчанию. Пришлось изучать netplan.
Да, ещё такой момент: если у вас на Репе крутится какой-нибудь сервак, учитывайте, что приведённые в статье правила 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;
Поправьте если не так, но у меня без этого шара не виделась.
Заметил, что после перезагрузки (не каждый раз, но довольно часто) вылезает такой вот баг:
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 - стало работать намного стабильнее.
Если открыть даташит на антенну https://files.seeedstudio.com/wiki/Wifi_Bee_v2.0/res/Antenna_Datasheet.pdf (вроде же там такая впаяна?), то выходит, что центральная частота у неё 2,4475 ГГц, что соответствует 8 каналу.