====== 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]]