我正在尝试创建多个 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 提供。