Wi-Fi access point z Raspberry Pi bez NATu

Autor: | 18. 6. 2022 | IT, Linux

Štítky: linux | raspberry pi | wifi | wifi AP

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

Další články