====== Raspberry Pi jako Wi-Fi access point bez NATu ======
Bridged Wi-Fi access point bez NATu znamená, že zařízení připojená přes Wi-Fi dostávají IP adresu ze stejného routeru a ze stejného rozsahu jako zbytek sítě. Tento postup vychází hlavně z [[https://charlieblog.eu/clanek-raspberry-pi-wifi-access-point|návodu na Charlieblogu]] a z [[https://github.com/morrownr/USB-WiFi/blob/main/home/AP_Mode/Bridged_Wireless_Access_Point.md|návodu k bridged AP od morrownr]], ale doplňuje praktické poznámky z provozu na [[software:multimedia:osmc|OSMC]] a zkušenosti s konkrétními USB Wi-Fi adaptéry.
===== Princip zapojení =====
Cílem je, aby Raspberry Pi nevystupovalo jako další router s vlastním NATem a vlastním DHCP serverem. Místo toho se vytvoří bridge ''br0'', do kterého se zařadí ethernet a Wi-Fi rozhraní. Klienti připojení přes Wi-Fi pak komunikují přímo do stávající LAN a IP adresu jim přiděluje už existující router.
V mém případě Raspberry Pi původně používalo ethernet ''eth0'' a Wi-Fi rozhraní ''wlan0'' mělo sloužit jako access point. V článku níže je použité statické nastavení IP adresy pro ''br0'', ale princip bridge zůstává stejný i tehdy, pokud si IP bere z DHCP.
===== Vytvoření bridge =====
Pro vytvoření bridge jsem použil ''systemd-networkd''. Je potřeba založit zařízení ''br0'', přidat do něj ''eth0'' a síťovou konfiguraci přesunout z ethernetu na bridge.
Soubor ''/etc/systemd/network/bridge-br0.netdev'':
[NetDev]
Name=br0
Kind=bridge
Soubor ''/etc/systemd/network/bridge-br0-slave.network'':
[Match]
Name=eth0
[Network]
Bridge=br0
Soubor ''/etc/systemd/network/bridge-br0.network'':
[Match]
Name=br0
[Network]
Address=192.168.0.100/24
Gateway=192.168.0.1
DNS=8.8.8.8
Po změně konfigurace jsem restartoval ''systemd-networkd'':
systemctl restart systemd-networkd
Tím vznikl bridge ''br0'' a IP adresa se přiřazuje jemu místo samotného ''eth0''.
===== OSMC a Connman =====
V praxi jsem narazil na problém, že se síť po restartu buď nenačetla správně, nebo se po delší době rozbilo DNS či samotné přidělení IP adresy. Příčina byla v tom, že vedle ''systemd-networkd'' se síť snažil spravovat ještě další démon.
Ve zdrojových návodech se často doporučuje upravit ''/etc/dhcpcd.conf'' a přidat:
denyinterfaces eth0
denyinterfaces wlan0
Na OSMC mi ale tenhle postup nepomohl. Nakonec jsem dohledal, že OSMC používá [[https://discourse.osmc.tv/t/dhcp-client-connman-configuration-setup-issue/5669|Connman]], takže bylo potřeba blacklistovat rozhraní právě tam.
Soubor ''/etc/connman.conf'':
NetworkInterfaceBlacklist=eth0,wlan0
Tím se vyřešil konflikt mezi více službami, které se snažily obsluhovat stejná rozhraní.
===== Konfigurace hostapd =====
Poslední krok je nastavit Wi-Fi rozhraní do AP režimu a zařadit ho do bridge. K tomu slouží ''hostapd''. Prakticky důležitý je hlavně řádek ''bridge=br0''.
apt install hostapd
Příklad konfigurace ''/etc/hostapd/hostapd.conf'':
ssid=myPI-5g
wpa_passphrase=myPW1234
hw_mode=a
channel=36
vht_oper_chwidth=1
vht_oper_centr_freq_seg0_idx=42
country_code=CZ
bridge=br0
interface=wlan0
driver=nl80211
ieee80211d=1
beacon_int=100
dtim_period=2
max_num_sta=32
macaddr_acl=0
wpa=2
rsn_pairwise=CCMP
wpa_key_mgmt=WPA-PSK
ieee80211n=1
wmm_enabled=1
ht_capab=[HT40+][HT40-][SHORT-GI-20][SHORT-GI-40]
ieee80211ac=1
vht_capab=[SHORT-GI-80]
V některých případech je ještě potřeba odblokovat Wi-Fi přes [[https://raspberrypi.stackexchange.com/questions/123717/how-to-disable-wi-fi-is-currently-blocked-by-rfkill-message|''rfkill'']]:
rfkill unblock wlan
Potom už stačí ''hostapd'' spustit a otestovat, že se klient připojí do stejné sítě jako zbytek LAN:
hostapd -c /etc/hostapd/hostapd.conf
===== Testování propustnosti přes iperf3 =====
Po zprovoznění access pointu je praktické ověřit propustnost přes ''iperf3''.
Instalace:
apt install iperf3
Soubor ''/etc/systemd/system/iperf3.service'':
[Unit]
Description=iPerf3 Service
After=syslog.target network.target auditd.service
[Service]
Type=simple
ExecStart=/usr/bin/iperf3 -s
[Install]
WantedBy=multi-user.target
Zapnutí služby:
systemctl enable iperf3
systemctl start iperf3
Test z klientského zařízení:
iperf3 -t 60 -c 192.168.0.100
===== Zkušenosti s adaptéry =====
Vedle samotné bridge konfigurace se v praxi ukázalo, že hodně záleží i na konkrétním USB Wi-Fi adaptéru a na kvalitě jeho linuxové podpory.
==== Tenda W311MI ====
U adaptéru Tenda W311MI se zařízení po instalaci Raspberry automaticky nenačetlo. Přes ''lsusb'' se hlásilo takto:
lsusb
Bus 001 Device 005: ID 0bda:b711 Realtek Semiconductor Corp. RTL8188GU 802.11n WLAN Adapter (After Modeswitch)
Pomohla instalace nástrojů a kompilace ovladače podle [[https://askubuntu.com/questions/1421255/rtl8188gu-wireless-usb-adapter-doesnt-work-with-ubuntu-22-04|Ask Ubuntu]] a repozitáře [[https://github.com/McMCCRU/rtl8188gu|rtl8188gu]]:
sudo apt-get install build-essential git dkms bc
git clone https://github.com/McMCCRU/rtl8188gu.git
cd rtl8188gu
make
sudo make install
sudo reboot
Kvůli chybě při kompilaci jsem ještě musel ručně vytvořit symlink v hlavičkách jádra. Kompiloval jsem přímo na Raspberry Pi:
ln -s /usr/src/linux-headers-5.15.84+/arch/arm /usr/src/linux-headers-5.15.84+/arch/armv6l
Další relevantní diskuse byly v issue [[https://github.com/lwfinger/rtl8188gu/issues/4|rtl8188gu]], [[https://github.com/lwfinger/rtl8723au/issues/62|rtl8723au]] a na [[https://bbs.archlinux.org/viewtopic.php?id=259773|Arch Linux fóru]].
==== MediaTek MT7612U ====
Druhý použitý adaptér byl MediaTek MT7612U. Vybral jsem ho proto, že podle přehledů projektu [[https://github.com/morrownr/USB-WiFi|USB-WiFi od morrownr]] má mít podporu přímo v jádře.
lsusb
Bus 002 Device 003: ID 0e8d:7612 MediaTek Inc. MT7612U 802.11a/b/g/n/ac Wireless Adapter
Zařízení se mi podařilo rozběhat, ale pozoroval jsem výpadky připojení a zhoršenou rychlost přenosu. Příčinu jsem tehdy nedohledal.
Po zapojení se v ''dmesg'' objevovala chyba:
Direct firmware load for mt7662_rom_patch.bin failed with error -2
Pomohlo mi:
apt install firmware-misc-nonfree
echo "options mt76_usb disable_usb_sg=1" >> /etc/modprobe.d/mt76_usb.conf
apt install crda
A zároveň nastavit regulační doménu:
# /etc/default/crda
REGDOMAIN=CZ
Pro spouštění AP jsem pak používal jednoduchý skript:
#!/bin/bash
HOSTAPD=$(which hostapd)
RFKILL=$(which rfkill)
$RFKILL unblock wlan
systemctl restart systemd-networkd
$HOSTAPD /etc/hostapd/hostapd5-mediatek4.conf
Další poznámky a návody byly v [[https://github.com/morrownr/USB-WiFi/blob/main/home/How_to_Modeswitch.md|How to Modeswitch]], v přehledu [[https://github.com/morrownr/7612u|7612u]], na fóru [[https://forum.openwrt.org/t/mt76x02u-mcu-wait-resp-failed-with-110/57795/4|OpenWrt]] a znovu i v [[https://github.com/morrownr/USB-WiFi/blob/main/home/AP_Mode/Bridged_Wireless_Access_Point.md|návodu k bridged AP]].
===== Zdroje =====
* [[https://charlieblog.eu/clanek-raspberry-pi-wifi-access-point|Charlieblog – Raspberry Pi WiFi Access Point]]
* [[https://github.com/morrownr/USB-WiFi/blob/main/home/AP_Mode/Bridged_Wireless_Access_Point.md|morrownr – Bridged Wireless Access Point]]
* [[https://github.com/morrownr/USB-WiFi|morrownr – USB-WiFi]]
* [[https://discourse.osmc.tv/t/dhcp-client-connman-configuration-setup-issue/5669|OSMC forum – Connman configuration]]
* [[https://raspberrypi.stackexchange.com/questions/123717/how-to-disable-wi-fi-is-currently-blocked-by-rfkill-message|Raspberry Pi Stack Exchange – rfkill]]
* [[https://askubuntu.com/questions/1421255/rtl8188gu-wireless-usb-adapter-doesnt-work-with-ubuntu-22-04|Ask Ubuntu – rtl8188gu]]
* [[https://github.com/McMCCRU/rtl8188gu|GitHub – rtl8188gu]]
* [[https://github.com/lwfinger/rtl8188gu/issues/4|GitHub issue – rtl8188gu]]
* [[https://github.com/lwfinger/rtl8723au/issues/62|GitHub issue – rtl8723au]]
* [[https://bbs.archlinux.org/viewtopic.php?id=259773|Arch Linux fórum – Realtek build issue]]
* [[https://github.com/morrownr/USB-WiFi/blob/main/home/How_to_Modeswitch.md|morrownr – How to Modeswitch]]
* [[https://github.com/morrownr/7612u|GitHub – 7612u]]
* [[https://forum.openwrt.org/t/mt76x02u-mcu-wait-resp-failed-with-110/57795/4|OpenWrt forum – mt76x02u MCU wait resp failed]]