Jak oddělit a nezávisle adresovat jedno Wi-Fi rozhraní

Jose D

  • *****
  • 641
    • Zobrazit profil
Re:Jak oddělit a nezávisle adresovat jedno Wi-Fi rozhraní
« Odpověď #15 kdy: 10. 02. 2021, 14:13:42 »
Tohle je přímo ukázkový příklad pro network namespaces. ..
..  tohle vidím poprvé a nejspíš je to hotové řešení přesně mého problému  :D ..

jj, tak tak. tohle je dost zajímavé a taky jsem se s tím ještě přímo nesetkal.

.. man ip-rule ..

taky mě to napadlo, ale myslím, že tohle by nefungovalo při kolizi IP rozsahů na těch dvou interface, nebo se mýlím?
Triviální by samozřejmě bylo něco jako ip rule add uidrange 1010-1011 lookup 123456 - ale myslím, že pokud bychom měli dvě routy scope link do stejných IP rozsahů, ale fyzicky různých sítí, tak by to nefungovalo, minimálně pro lokální traffic v těch sítích..(?)


Re:Jak oddělit a nezávisle adresovat jedno Wi-Fi rozhraní
« Odpověď #16 kdy: 10. 02. 2021, 15:34:26 »
.. man ip-rule ..
taky mě to napadlo, ale myslím, že tohle by nefungovalo při kolizi IP rozsahů na těch dvou interface, nebo se mýlím?

Tak pochopil jsem to tak, že jedna routa bude
Kód: [Vybrat]
192.168.0.0/24 na eth0 a druhá
Kód: [Vybrat]
192.168.0.0/24 na wlan1 a prostě se dle pravidla použije jedna nebo druhá bez ohledu na metriky apod. Ale asi to není z hlediska tcp/ip úplně dobrá situace a může se to klidně někde vytelit - nevím co by se např. stalo, pokud by na obou rozhraní byly úplně totožné IP adresy  >:(

Ještě mě napadlo mě jak by si s tím poradil routovací démon (RIP)? Ale to se pro účel rychlého nastavení v duplicitní siti asi nehodí, minimálně by tam byla prodleva než si RIP démon osahá topologii. A byla by to asi celkově prasárna...

Re:Jak oddělit a nezávisle adresovat jedno Wi-Fi rozhraní
« Odpověď #17 kdy: 10. 02. 2021, 15:34:54 »
Koukám, že se tu dobře rozjela debata. Díky za všechny příspěvky a jdu si s tím pohrát. Je fakt, že jelikož budu v namespaces spouštět vícero démonů, tak to už bude možná snadnější to rovnou strčit celé do kontejneru.

Re:Jak oddělit a nezávisle adresovat jedno Wi-Fi rozhraní
« Odpověď #18 kdy: 10. 02. 2021, 15:44:03 »
taky mě to napadlo, ale myslím, že tohle by nefungovalo při kolizi IP rozsahů na těch dvou interface, nebo se mýlím?
Proč by nemělo? Konfliktní routy nejsou problém, pokud nejsou ve stejné tabulce. Pravidla vám pak říkají, ve které tabulce (nebo obecně ve kterých a v jakém pořadí) se má pro daný paket provést lookup.

Re:Jak oddělit a nezávisle adresovat jedno Wi-Fi rozhraní
« Odpověď #19 kdy: 10. 02. 2021, 15:46:09 »
taky mě to napadlo, ale myslím, že tohle by nefungovalo při kolizi IP rozsahů na těch dvou interface, nebo se mýlím?
Triviální by samozřejmě bylo něco jako ip rule add uidrange 1010-1011 lookup 123456 - ale myslím, že pokud bychom měli dvě routy scope link do stejných IP rozsahů, ale fyzicky různých sítí, tak by to nefungovalo, minimálně pro lokální traffic v těch sítích..(?)
ip rule umožňuje to, že máte v systému víc routovacích tabulek, a pomocí pravidel určíte, která routovací tabulka se má kdy použít. Tj. v tomto případě by se kolizní rozsahy nepotkávaly v jedné routovací tabulce, takže by nevznikala ta kolize. Samozřejmě pokud by se podařilo pakety správně pomocí pravidel rozházet mezi ty tabulky.

Každopádně Ondrovo řešení pomocí jmenných prostorů je daleko elegantnější, zaměřil bych se na to.


Jose D

  • *****
  • 641
    • Zobrazit profil
Re:Jak oddělit a nezávisle adresovat jedno Wi-Fi rozhraní
« Odpověď #20 kdy: 10. 02. 2021, 16:31:07 »
Proč by nemělo? Konfliktní routy nejsou problém, pokud nejsou ve stejné tabulce. ...

Teď jsem si to zkusil na nějakém boxu, a jsem schopný měnit i routy s proto kernel, což jsem nevěděl, že jde. Takže poslední okrajový případ který nevím, jak by se choval jsou úplně identické IP a procesy na nich poslouchající.

Ondrovo řešení pomocí jmenných prostorů je daleko elegantnější, zaměřil bych se na to.

souhlas.

Re:Jak oddělit a nezávisle adresovat jedno Wi-Fi rozhraní
« Odpověď #21 kdy: 13. 02. 2021, 00:44:26 »
Takže aby to fungovalo musí network namespaces podporovat explicitně příslušná wifina:

Kód: [Vybrat]
# iw phy phy1 info | grep set_wiphy_netns
* set_wiphy_netns

Což třeba rozšířené usb wifiny s rtl8188 neumí a nedaří se je přesunout do namespace :(

Kód: [Vybrat]
# iw phy phy0 set netns name iotgw-configuration
command failed: Operation not supported (-95)

Což to omezuje použití. Ani nevím, jak dohledat, které usb wifiny to umí?

Pokud to wifina umí  - jako třeba ta integrovaná v Raspberry PI - tak to funguje :)

V praxi budu muset konfigurovat IOT zařízení pomocí integrované wifiny (z namespacu) a pro běžný provoz používat externí usb wifinu.

To mne mimochodem nutí také vyřešit predikovatelné (reprodukovatelné) pojmenování síťových rozhraní protože wlan0 a wlan1 se inicializují náhodně takže nepoznám která je která.
« Poslední změna: 13. 02. 2021, 00:46:57 od Ondrej Nemecek »

Re:Jak oddělit a nezávisle adresovat jedno Wi-Fi rozhraní
« Odpověď #22 kdy: 13. 02. 2021, 00:49:53 »

Nevím zda to je vlastnost hardware nebo kernel modulu, zkoumám tyhle ovladače:

https://github.com/kimocoder/realtek_rtwifi
https://github.com/aircrack-ng/rtl8188eus/issues/104

Takže aby to fungovalo musí network namespaces podporovat explicitně příslušná wifina:

Kód: [Vybrat]
# iw phy phy1 info | grep set_wiphy_netns
* set_wiphy_netns

Což třeba rozšířené usb wifiny s rtl8188 neumí a nedaří se je přesunout do namespace :(

Kód: [Vybrat]
# iw phy phy0 set netns name iotgw-configuration
command failed: Operation not supported (-95)

Což omezuje použití. Ani nevím, jak dohledat, které usb wifiny to umí?

Pokud to wifina umí  - jako třeba ta integrovaná v Raspberry PI - tak to funguje :)

V praxi budu muset konfigurovat IOT zařízení pomocí integrované wifiny (z namespacu) a pro běžný provoz používat externí usb wifinu.

To mne mimochodem nutí také vyřešit predikovatelné (reprodukovatelné) pojmenování síťových rozhraní protože wlan0 a wlan1 se inicializují náhodně takže nepoznám která je která.
« Poslední změna: 13. 02. 2021, 00:52:52 od Ondrej Nemecek »

Re:Jak oddělit a nezávisle adresovat jedno Wi-Fi rozhraní
« Odpověď #23 kdy: 13. 02. 2021, 16:13:43 »
Takže realtek_rtwifi umí namespaces, ale neumí AP mód, což vylučuje použití dvou stejných wifi karet (jedna jako AP a druhá v namespace jako klient). Je možná kombinace interní wifi RPI v namespace a externí USB wifi pro běžný provoz.

Podpora namespaces v systemd vypadá docela dobře, jedna unit mi vyrobí namespace a druhá tam připojí wifinu a veth rozhraní. Na těchto unitech závisí pak ten IOT komunikační software, který běží ve dvou procesech z nichž jeden je v namespace a povídají si přes rmi. Systemd spustí proces v namespace sám díky direktivě JoinsNamespaceOf a PrivateNetwork.

Děkuji hlavně Ondřejovi Celetkovi a Michalovi Kubečkovi za nasměrování na namespaces. Pro úplně ideální řešení bych potřeboval ještě usb wifi, které umí AP mód (pomocí wpa_supplicant) i namespaces. Pokud by měl někdo tip kde hledat, uvítám to.

Re:Jak oddělit a nezávisle adresovat jedno Wi-Fi rozhraní
« Odpověď #24 kdy: 13. 02. 2021, 19:15:03 »
USBčkové wifiny dělával Atheros, ale konkrétně u řady ar6k tuším býval nějaký problém s provozem AP. Nevím jak u modernějšího AR9271. Ani nevím, kde takový dongle shánět - leda snad u Mousera. Netušíte někdo, co za čipset má takový "TP-LINK Archer T2U Plus" ?

Re:Jak oddělit a nezávisle adresovat jedno Wi-Fi rozhraní
« Odpověď #25 kdy: 13. 02. 2021, 22:56:04 »
USBčkové wifiny dělával Atheros, ale konkrétně u řady ar6k tuším býval nějaký problém s provozem AP. Nevím jak u modernějšího AR9271. Ani nevím, kde takový dongle shánět - leda snad u Mousera. Netušíte někdo, co za čipset má takový "TP-LINK Archer T2U Plus" ?

Je to asi rtl8812au.  Přijde mi divné, že nikde není databáze chipsetů, driverů a podporovaných funkcí. Nebo o ní jen nevím?

Re:Jak oddělit a nezávisle adresovat jedno Wi-Fi rozhraní
« Odpověď #26 kdy: 13. 02. 2021, 23:48:09 »
USBčkové wifiny dělával Atheros, ale konkrétně u řady ar6k tuším býval nějaký problém s provozem AP. Nevím jak u modernějšího AR9271. Ani nevím, kde takový dongle shánět - leda snad u Mousera. Netušíte někdo, co za čipset má takový "TP-LINK Archer T2U Plus" ?

Je to asi rtl8812au.  Přijde mi divné, že nikde není databáze chipsetů, driverů a podporovaných funkcí. Nebo o ní jen nevím?

O žádná tabulce nevím. OpenWRT má svou "table of hardware", ale to jsou kompletní routery. USB wifi je u nich nejspíš na okraji zájmu.

Nakonec asi nejjistější cesta k cíli je stáhnout si kernel na disk, vlézt do drivers/net/wireless a dál se už brodit grepem, pokud víte čeho se chytit - nějaké ty příkazy v rámci netlinku, structy používané pro definici USB ID's a PCI ID's v driverech apod. Komplikuje se to ještě víc - například Atheros míval shodná PCI ID's pro více modelů a rozlišoval je nějakými interními IDčky mimo PCI config space... nebo občas najdu HW IDčka deklarovaná mimo samotný adresář driveru, buď o patro výš, nebo někde v include/linux/ (v hlavičkových souborech) apod.

Ta malina je fakt pitomá, že nemá MiniPCI-e slot :-)

Re:Jak oddělit a nezávisle adresovat jedno Wi-Fi rozhraní
« Odpověď #27 kdy: 02. 04. 2021, 19:42:47 »
Pokud by se to někomu hodilo, tak USB wifiny s chipem Ralink RT5370 podporují set_wiphy_netns (přířazení network namespace) i AP mód (přístupový bod). Podpora wifi 802.11b/g/n. Jaderný modul rt2800usb je součástí DietPI pro Raspberry Pi 4 (32-bit image s jádrem 5.10.17-v7l+). Ke koupi třeba na Rpishop - Wifi modul do USB, s anténou, 150 Mb/s Tento konkrétní model má nevýhodu v mechanicmém provedení - pendrek lze otočit jen o 90 stupňů. Funkčnost jinak OK. Čerpal jsem z elinux.org - RPi USB Wi-Fi Adapters.

Kód: [Vybrat]
root@DietPi:~# iw phy 
Wiphy phyExt
max # scan SSIDs: 4
max scan IEs length: 2257 bytes
max # sched scan SSIDs: 0
max # match sets: 0
Retry short long limit: 2
Coverage class: 0 (up to 0m)
Device supports RSN-IBSS.
Supported Ciphers:
* WEP40 (00-0f-ac:1)
* WEP104 (00-0f-ac:5)
* TKIP (00-0f-ac:2)
* CCMP-128 (00-0f-ac:4)
* CCMP-256 (00-0f-ac:10)
* GCMP-128 (00-0f-ac:8)
* GCMP-256 (00-0f-ac:9)
* CMAC (00-0f-ac:6)
* CMAC-256 (00-0f-ac:13)
* GMAC-128 (00-0f-ac:11)
* GMAC-256 (00-0f-ac:12)
Available Antennas: TX 0 RX 0
Supported interface modes:
* IBSS
* managed
* AP
* AP/VLAN
* monitor
* mesh point
Band 1:
Capabilities: 0x17e
HT20/HT40
SM Power Save disabled
RX Greenfield
RX HT20 SGI
RX HT40 SGI
RX STBC 1-stream
Max AMSDU length: 3839 bytes
No DSSS/CCK HT40
Maximum RX AMPDU length 32767 bytes (exponent: 0x002)
Minimum RX AMPDU time spacing: 2 usec (0x04)
HT TX/RX MCS rate indexes supported: 0-7, 32
Bitrates (non-HT):
* 1.0 Mbps
* 2.0 Mbps (short preamble supported)
* 5.5 Mbps (short preamble supported)
* 11.0 Mbps (short preamble supported)
* 6.0 Mbps
* 9.0 Mbps
* 12.0 Mbps
* 18.0 Mbps
* 24.0 Mbps
* 36.0 Mbps
* 48.0 Mbps
* 54.0 Mbps
Frequencies:
* 2412 MHz [1] (20.0 dBm)
* 2417 MHz [2] (20.0 dBm)
* 2422 MHz [3] (20.0 dBm)
* 2427 MHz [4] (20.0 dBm)
* 2432 MHz [5] (20.0 dBm)
* 2437 MHz [6] (20.0 dBm)
* 2442 MHz [7] (20.0 dBm)
* 2447 MHz [8] (20.0 dBm)
* 2452 MHz [9] (20.0 dBm)
* 2457 MHz [10] (20.0 dBm)
* 2462 MHz [11] (20.0 dBm)
* 2467 MHz [12] (20.0 dBm)
* 2472 MHz [13] (20.0 dBm)
* 2484 MHz [14] (disabled)
Supported commands:
* new_interface
* set_interface
* new_key
* start_ap
* new_station
* new_mpath
* set_mesh_config
* set_bss
* authenticate
* associate
* deauthenticate
* disassociate
* join_ibss
* join_mesh
* remain_on_channel
* set_tx_bitrate_mask
* frame
* frame_wait_cancel
* set_wiphy_netns
* set_channel
* set_wds_peer
* probe_client
* set_noack_map
* register_beacons
* start_p2p_device
* set_mcast_rate
* connect
* disconnect
* set_qos_map
* set_multicast_to_unicast
software interface modes (can always be added):
* AP/VLAN
* monitor
valid interface combinations:
* #{ AP, mesh point } <= 8,
   total <= 8, #channels <= 1
HT Capability overrides:
* MCS: ff ff ff ff ff ff ff ff ff ff
* maximum A-MSDU length
* supported channel width
* short GI for 40 MHz
* max A-MPDU length exponent
* min MPDU start spacing
Device supports TX status socket option.
Device supports HT-IBSS.
Device supports SAE with AUTHENTICATE command
Device supports low priority scan.
Device supports scan flush.
Device supports AP scan.
Device supports per-vif TX power setting
Driver supports full state transitions for AP/GO clients
Driver supports a userspace MPM
Device supports configuring vdev MAC-addr on create.
max # scan plans: 1
max scan plan interval: -1
max scan plan iterations: 0
Supported TX frame types:
* IBSS: 0x00 0x10 0x20 0x30 0x40 0x50 0x60 0x70 0x80 0x90 0xa0 0xb0 0xc0 0xd0 0xe0 0xf0
* managed: 0x00 0x10 0x20 0x30 0x40 0x50 0x60 0x70 0x80 0x90 0xa0 0xb0 0xc0 0xd0 0xe0 0xf0
* AP: 0x00 0x10 0x20 0x30 0x40 0x50 0x60 0x70 0x80 0x90 0xa0 0xb0 0xc0 0xd0 0xe0 0xf0
* AP/VLAN: 0x00 0x10 0x20 0x30 0x40 0x50 0x60 0x70 0x80 0x90 0xa0 0xb0 0xc0 0xd0 0xe0 0xf0
* mesh point: 0x00 0x10 0x20 0x30 0x40 0x50 0x60 0x70 0x80 0x90 0xa0 0xb0 0xc0 0xd0 0xe0 0xf0
* P2P-client: 0x00 0x10 0x20 0x30 0x40 0x50 0x60 0x70 0x80 0x90 0xa0 0xb0 0xc0 0xd0 0xe0 0xf0
* P2P-GO: 0x00 0x10 0x20 0x30 0x40 0x50 0x60 0x70 0x80 0x90 0xa0 0xb0 0xc0 0xd0 0xe0 0xf0
* P2P-device: 0x00 0x10 0x20 0x30 0x40 0x50 0x60 0x70 0x80 0x90 0xa0 0xb0 0xc0 0xd0 0xe0 0xf0
Supported RX frame types:
* IBSS: 0x40 0xb0 0xc0 0xd0
* managed: 0x40 0xb0 0xd0
* AP: 0x00 0x20 0x40 0xa0 0xb0 0xc0 0xd0
* AP/VLAN: 0x00 0x20 0x40 0xa0 0xb0 0xc0 0xd0
* mesh point: 0xb0 0xc0 0xd0
* P2P-client: 0x40 0xd0
* P2P-GO: 0x00 0x20 0x40 0xa0 0xb0 0xc0 0xd0
* P2P-device: 0x40 0xd0
Supported extended features:
* [ RRM ]: RRM
* [ FILS_STA ]: STA FILS (Fast Initial Link Setup)
* [ CQM_RSSI_LIST ]: multiple CQM_RSSI_THOLD records
* [ CONTROL_PORT_OVER_NL80211 ]: control port over nl80211
root@DietPi:~#
root@DietPi:~# iw dev
phy#3
Interface wlan0
ifindex 8
wdev 0x300000001
addr 06:da:35:e1:b2:59
ssid IOTGW
type AP
channel 11 (2462 MHz), width: 20 MHz, center1: 2462 MHz
txpower 20.00 dBm
root@DietPi:~#