我正在嘗試創建多個 Linux TAP 介面並允許它們透過單一 WIFI 適配器發送/接收封包。出於所有意圖和目的,我希望 TAP 介面充當成熟的網路介面卡。它們應該能夠像任何其他網路介面卡一樣請求自己的 DHCP 位址並在本地網路上進行互動。
我已經設法使用乙太網路適配器來實現這一點,但我聽說 WiFi 是一個不同的野獸。我不記得確切的原因,但它與「每個無線電廣播位址 1 個 IP 位址」有關。
是否有可能使用 TAP 介面透過 WiFi 連線進行橋接網路?我可以使用網路管理員進行任何設定嗎?有人可以連結一兩篇文章嗎?我很難找到這方面的任何東西。
答案1
此網絡工程 SE 鏈接802.11幀頭中的四個二層位址很好地解釋了乙太網路和 Wifi 之間的差異。
Wifi 需要額外的MAC 位址進行通訊:除了與乙太網路的來源MAC 和目標MAC 相同的發送者位址(SA) 和目標位址(DA) 之外,Wifi 還需要傳送器位址(TA) 和接收器位址( 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 wireless wiki 上找到:AP 和客戶端模式使用 4 位址
配置 AP 超出了此處的範圍。使用時主機,有一個特定的設定需要啟用:
# 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 客戶端標識符選項)。它被稱為IPVLAN(通常用於容器)及其 TAP 對應項(通常用於虛擬機器)稱為IPVTAP。當在 L2 模式下使用時,它提供看起來像標準乙太網路介面的東西。
對於一個(簡單的ip網路網路)容器,在主機上使用介面在 IP LAN 192.0.2.0/24 中與網關 192.0.2.1 建立 Wifi 連線後,可以像這樣使用無線區域網路0:
# 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 提供。