Ve vnitřní síti mám za routerem Raspberry Pi, na kterém jsem chtěl nastavit wifi Access point. Chtěl jsem se však vyhnout tomu, že wifi síť bude za NATem s jiným rozsahem IP adres. Ideální stav je ten, že na Raspberry Pi nepoběží dhcp server, ale IP adresu pro zařízení připojená k Wifi bude přidělovat již existující router. Na Raspberry Pi mám v tuto chvíli distribuci OSMC kvůli multimédiím. Hodně jsem se inspiroval v tomto návodu, nicméně kvůli distribuci OSMC jsem narazil na určité odlišnosti a problémy. Abych tyto problémy zdokumentoval, vzniknul tento příspěvek.
Vytvoření bridge
V základu se RPi připojuje k síti přes ethernet. Z DHCP serveru si načte IP adresu pro zařízení eth0. Abych dosáhnul svého cíle, potřebuji vytvořit bridge (nové zařízení br0), do kterého dám zařízení jako eth0, wlan0. Bridge si natáhne IP adresu z DHCP serveru a když se další zařízení připojí přes wlan0, tak si také budou natahovat IP adresy z DHCP serveru. Stačí tedy do bridge dát i wlan0 a o přidělování IP adres se mi už bude starat stávající router.
První krok bude nastavit systemd, aby všechno tohle udělal po restartu Raspberry a dalším krokem bude zařídit, aby se současná zařízení eth0 a wlan0 nesnažil obsluhovat jiné démon, starající se o síť.
Nyní tedy k nastavení sítě pomocí systemd a soubory, které musíme vytvořit.
vim /etc/systemd/network/bridge-br0.netdev
Do souboru /etc/systemd/network/bridge-br0.netdev zapíšu:
[NetDev] Name=br0 Kind=bridge
Dále soubor /etc/systemd/network/bridge-br0-slave.network s obsahem:
[Match] Name=eth0 [Network] Bridge=br0
A soubor /etc/systemd/network/bridge-br0.network s nastavením sítě (volím statickou IP adresu):
[Match] Name=br0 [Network] Address=192.168.0.100/24 Gateway=192.168.0.1 DNS=8.8.8.8
Závěrem restartovat systemd-networkd:
systemctl restart systemd-networkd
Tímto jsem dosáhnul toho, že bude vytvořený bridge a v něm bude ethernet. IP adresa se bude přiřazovat místo zařízení eth0 zařízení br0.
Network manager – vypnutí
Po restartu Raspberry jsem narazil na problém. Síť se buď nenačetla nebo se načetla a po nějakém časovém intervalu 12-24 hodin jsem neměl přiřazený DNS server nebo vůbec žádnou IP adresu. Pomohl restet sítě + ruční zadání DNS serveru, ale to není dlouhodobé řešení. Měl jsem podezření na službu, která se snažila obsluhovat síťová zařízení. Prostě mě na RPi běžely 2 služby na obsluhu síťových zařízení a jedna se snažila přiřadit IP adresu eth0 a druhá zase jenom br0.
Ve zdrojovém návodu jsem našel tip, k vypnutí původní služby obsluhující síť na zařízení eth0 a wlan0. Editovat soubor /etc/dhcpcd.conf a do něj přidat:
denyinterfaces eth0 denyinterfaces wlan0
Kupodivu to u mě nefungovalo. Později jsem zjistil, že může být několik různých damonů, které se starají o síť. Networkmanager, Netplan a určitě jiné. OSMC spadá do kategorie jiné. Konkrétně jsem vygooglil, že se jedná o connman. Takže jsem potřeboval editovat soubor /etc/connman.conf a do něj přidat:
NetworkInterfaceBlacklist=eth0,wlan0
Tím se můj problém se dvěma démony vyřešil. Connman bude ignorovat obsluhu zařízení eht0 a wlan0.
Konfigurace Wi-Fi
Posledním krokem bylo konfigurace wifi v režimu AP a rovnou zařadit do bridge. Obsah souboru /etc/hostapd.conf jsem přizpůsobil svojí konkrétní wifi. A hlavně nezapomenout na řádek: bridge=br0:
apt install hostapd vim /etc/hostapd/hostapd.conf
# SSID ssid=myPI-5g # PASSPHRASE wpa_passphrase=myPW1234 # Band: a = 5g (a/n/ac), g = 2g (b/g/n) hw_mode=a # Channel channel=36 # Channel width vht_oper_chwidth=1 # VHT center channel (chan + 6) vht_oper_centr_freq_seg0_idx=42 # Country code country_code=CZ # Bridge interface bridge=br0 # WiFi interface interface=wlan0 # nl80211 is used with all Linux mac80211 (in-kernel) and modern Realtek drivers driver=nl80211 #ctrl_interface=/var/run/hostapd #ctrl_interface_group=0 ieee80211d=1 # Enables support for 5GHz DFS channels #ieee80211h=1 beacon_int=100 dtim_period=2 max_num_sta=32 macaddr_acl=0 rts_threshold=2347 fragm_threshold=2346 #send_probe_response=1 # security # auth_algs=3 is required for WPA-3 SAE and WPA-3 SAE Transitional auth_algs=1 ignore_broadcast_ssid=0 # wpa=2 is required for WPA2 and WPA3 (read the docs) wpa=2 rsn_pairwise=CCMP # only one wpa_key_mgmt= line should be active. # wpa_key_mgmt=WPA-PSK is required for WPA2-AES wpa_key_mgmt=WPA-PSK # wpa_key_mgmt=SAE WPA-PSK is required for WPA3-AES Transitional #wpa_key_mgmt=SAE WPA-PSK # wpa_key_mgmt=SAE is required for WPA3-SAE #wpa_key_mgmt=SAE #wpa_group_rekey=1800 # ieee80211w=1 is required for WPA-3 SAE Transitional # ieee80211w=2 is required for WPA-3 SAE #ieee80211w=1 # if parameter is not set, 19 is the default value. #sae_groups=19 20 21 25 26 # sae_require_mfp=1 is required for WPA-3 SAE Transitional #sae_require_mfp=1 # if parameter is not 9 set, 5 is the default value. #sae_anti_clogging_threshold=10 # Note: Capabilities can vary even between adapters with the same chipset. # # Note: Only one ht_capab= line and one vht_capab= should be active. The # content of these lines is determined by the capabilities of your adapter. # # IEEE 802.11n ieee80211n=1 wmm_enabled=1 # # generic setting ht_capab=[HT40+][HT40-][SHORT-GI-20][SHORT-GI-40] # # mt7612u - mt7610u #ht_capab=[HT40+][HT40-][GF][SHORT-GI-20][SHORT-GI-40] # # rtl8812au - rtl8811au - rtl8811cu #ht_capab=[HT40+][HT40-][SHORT-GI-20][SHORT-GI-40][MAX-AMSDU-7935] # rtl8812bu #ht_capab=[LDPC][HT40+][HT40-][SHORT-GI-20][SHORT-GI-40][MAX-AMSDU-7935] # rtl8814au #ht_capab=[LDPC][HT40+][HT40-][SHORT-GI-20][SHORT-GI-40][MAX-AMSDU-7935][DSSS_CCK-40] # # IEEE 802.11ac ieee80211ac=1 # # generic setting vht_capab=[SHORT-GI-80] # # mt7610u #vht_capab=[SHORT-GI-80][MAX-A-MPDU-LEN-EXP3][RX-ANTENNA-PATTERN][TX-ANTENNA-PATTERN] # mt7612u #vht_capab=[RXLDPC][SHORT-GI-80][TX-STBC-2BY1][RX-STBC-1][MAX-A-MPDU-LEN-EXP3][RX-ANTENNA-PATTERN][TX-ANTENNA-PATTERN] # # rtl8812au - rtl8812bu #vht_capab=[MAX-MPDU-11454][SHORT-GI-80][TX-STBC-2BY1][RX-STBC-1][HTC-VHT][MAX-A-MPDU-LEN-EXP7] # rtl8814au #vht_capab=[MAX-MPDU-11454][RXLDPC][SHORT-GI-80][TX-STBC-2BY1][RX-STBC-1][HTC-VHT][MAX-A-MPDU-LEN-EXP7] # rtl8811au #vht_capab=[MAX-MPDU-11454][SHORT-GI-80][RX-STBC-1][HTC-VHT][MAX-A-MPDU-LEN-EXP7] # rtl8811cu #vht_capab=[MAX-MPDU-11454][SHORT-GI-80][HTC-VHT][MAX-A-MPDU-LEN-EXP7] # # Note: [TX-STBC-2BY1] may cause problems with some Realtek drivers # end of hostapd-5g.conf
Dalším krokem bylo zařídil, aby wifi nebyla blokovaná pomocí příkazu:
rfkill unblock wlan
Poslední krok už je spustit hostapd s konguračním souborem a otestovat, zda všechno funguje jak má.
hostpad -c /etc/hostapd.conf
Testování propustnosti sítě Iperf3
Jakmile se druhým zařízením připojím k Wifi AP, tak je fajn otestovat propustnost sítě. To lze otestovat pomocí iperf3. Nejprve nainstaluji na Raspberry a nastavím po spuštění. Pro úplnost iperf3 běží na portu 5201, takže je potřeba případně upravit firewall.
apt install iperf3 vim /etc/systemd/system/iperf3.service
Obsah souboru:
[Unit] Description=iPerf3 Service After=syslog.target network.target auditd.service [Service] Type=simple ExecStart=/usr/bin/iperf3 -s [Install] WantedBy=multi-user.target
Jako poslední zapnout iperf3:
systemctl enable iperf3 systemctl start iperf3
Na svém notebooku se pak připojít k Raspberry Pi skrz wifi a pomocí příkazu otestuju propustnost sítě:
iperf3 -t 60 -c 192.168.0.100
Užitečné zdroje
- https://charlieblog.eu/clanek-raspberry-pi-wifi-access-point
- https://github.com/morrownr/USB-WiFi/blob/main/home/AP_Mode/Bridged_Wireless_Access_Point.md
- https://github.com/morrownr/USB-WiFi
- https://discourse.osmc.tv/t/dhcp-client-connman-configuration-setup-issue/5669
- https://raspberrypi.stackexchange.com/questions/123717/how-to-disable-wi-fi-is-currently-blocked-by-rfkill-message