理論:帶WIFI父介面的TAP介面
我正在嘗試創建多個 Linux TAP 介面並允許它們通過單個 WIFI 適配器發送/接收數據包。出於所有意圖和目的,我希望 TAP 介面充當成熟的網路適配器。他們應該能夠請求自己的 DHCP 地址並在本地網路上進行互動,就像任何其他網路適配器一樣。
我已經設法使用乙太網適配器來實現這一點,但我聽說 WiFi 是另一種野獸。我不記得確切的原因,但它與“每個無線電廣播地址 1 個 IP 地址”有關。
是否有可能使用 TAP 介面通過 WiFi 連接進行橋接網路?我可以使用網路管理器進行任何配置嗎?有人可以連結一兩篇文章嗎?我很難在這方面找到任何東西。
這個 Network Engineering SE 連結802.11 幀頭中的四個第 2 層地址很好地解釋了乙太網和 Wifi 之間的區別。
Wifi 需要額外的 MAC 地址進行通信:除了與乙太網的源 MAC 和目標 MAC 相同的 Sender Address (SA) 和 Destination Address (DA) 之外,Wifi 還需要 Transmitter Address (TA) 和 Receiver Address (RA) 才能工作:這使得總共有 4 個 MAC 地址。由於常見的情況是當客戶端(STA)發送時,TA = SA,當接入點(AP)發送到 STA 時,DA = RA,通常只需要 3 個地址,這就是 AP 的配置方式:使用4 個可能的地址中只有 3 個。
橋接模式的客戶端意味著上面的 TA != SA 或 DA != RA 並且需要所有 4 個地址,而 AP 僅配置為 3 個。這就是為什麼在常見配置中無法橋接 Wifi。必須在 AP 和 STA 上啟用 4 地址模式才能使客戶端橋接工作。這通常稱為無線分佈系統 (WDS),但可能有多個不兼容的實現。AP 和所有 STA 必須使用兼容的實現。
所以:
- 如果系統橋接是 AP,那麼您可以毫無問題地橋接 wifi:這就是所有 AP 所做的,使用預設的 3 地址模式。
- 如果試圖橋接的系統是一個簡單的客戶端 (STA),它將無法工作。最近的驅動程序甚至會阻止將無線介面設置為具有此類錯誤的橋接埠:
# ip link set wlan0 master bridge0 Error: Device does not allow enslaving to a bridge.
- 如果您可以將 AP 和 STA 都配置為兼容的 WDS,例如,如果所有都執行 Linux 並使用與 mac80211 兼容的驅動程序,則可以在 STA 上啟用此功能:
# iw dev wlan0 set 4addr on
然後它可以被奴役:
# ip link set wlan0 master bridge0 # ip link show wlan0 3: wlan0: <BROADCAST,MULTICAST> mtu 1500 qdisc noqueue master bridge0 state DOWN mode DEFAULT group default qlen 1000 [...]
有關使用 iw 命令的 4 地址模式的一些文件可以在 linux 無線 wiki 上找到:Using 4-address for AP and client mode
配置 AP 不在此範圍內。使用hostapd時,需要啟用特定設置:
# WDS (4-address frame) mode with per-station virtual interfaces # (only supported with driver=nl80211) # This mode allows associated stations to use 4-address frames to allow layer 2 # bridging to be used. #wds_sta=1
仍然有一種解決方法允許通過單個 Wifi 預設模式(3 地址模式)連接同時使用多個容器或虛擬機和不同的 IP,但只使用一個MAC 地址(用作 STA 的那個):因此它通常與 DHCP 不兼容預設情況下依賴於 MAC 地址(除非 DHCP 伺服器接受dhcp-client-identifier選項)。它稱為IPVLAN(通常用於容器),其 TAP 對應物(通常用於 VM)稱為IPVTAP。在 L2 模式下使用時,它提供了看起來像標準乙太網介面的東西。
對於(簡單的ip netns網路)容器,在使用介面wlan0在主機上使用網關 192.0.2.1 在 IP LAN 192.0.2.0/24 中建立 Wifi 連接之後,可以像這樣使用它:
# ip netns add testwifi # ip link add link wlan0 name ipvl0 type ipvlan mode l2 # ip link set dev ipvl0 netns testwifi up # ip -n testwifi address add 192.0.2.99/24 dev ipvl0 # ip -n testwifi route add default via 192.0.2.1 # ip netns exec testwifi ping -q -c1 8.8.8.8 PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data. --- 8.8.8.8 ping statistics --- 1 packets transmitted, 1 received, 0% packet loss, time 0ms rtt min/avg/max/mdev = 5.372/5.372/5.372/0.000 ms
我嚴重懷疑 NetworkManager 是否有任何與 4 地址模式相關的選項。至於IPVLAN/IPVTAP,這必須由容器/虛擬化應用程序支持,例如LXC或 libvirt(它似乎本身並不支持 IPVTAP),而不是真正由 NetworkManager 支持。