![在 Debian Buster 上桥接 Wifi 不起作用](https://linux22.com/image/15528/%E5%9C%A8%20Debian%20Buster%20%E4%B8%8A%E6%A1%A5%E6%8E%A5%20Wifi%20%E4%B8%8D%E8%B5%B7%E4%BD%9C%E7%94%A8.png)
我的 Linux 技能充其量只是初级的,但我正在努力学习。所以请考虑这个事实,考虑这个问题。我有一台笔记本电脑,上面安装了 Debian Buster。我需要将以太网和 WiFi 适配器桥接在一起。
我读过很多教程,它们都说了与这篇文章中描述的内容大致相同的内容。如何使用 Debian 配置从 WiFi 到以太网的网络接口桥?然而,这篇文章指出了这一点
“还必须配置 wlan0 接口以连接到远程 AP”,
所以我尝试即兴发挥,下面是我的配置,不用说 {ssid} 和 {password} 替换为真实值
auto enp0s31f6
allow-hotplug enp0s31f6
iface enp0s31f6 inet manual
auto wlp4s0
allow-hotplug wlp4s0
iface wlp4s0 inet manual
wpa-ssid {ssid}
wpa-psk {password}
auto br0
iface br0 inet static
bridge_ports enp0s31f6 wlp4s0
address 10.0.10.8
netmask 255.255.255.0
gateway 10.0.10.1
dns-domain prox
dns-nameservers 8.8.8.8
所以这种作品!在这种情况下,以太网端可以工作,但 Wifi 端不能工作,所以如果我失去了以太网,我就会失去与互联网的连接,从而违背了此活动的目的。我在这里做错了什么吗?我需要使用其他方法将无线接口连接到无线网络吗?
如果我使用此配置进行无线连接,我可以连接到无线网络,但这显然不适用于网桥。
allow-hotplug wlp4s0
iface wlp4s0 inet static
wpa-ssid {ssid}
wpa-psk {password}
address 10.0.10.8
netmask 255.255.255.0
gateway 10.0.10.1
dns-domain prox
dns-nameservers 8.8.8.8
非常感谢您的帮助;我花了一周的大部分时间试图让它发挥作用,我几乎要放弃了。
###更新###
感谢@dirkt的回复,这是有道理的,所以也许我可以更清楚地解释潜在的问题;我正在使用一个应用程序,它在网络适配器上强加了一个桥接器,然后才允许您使用它。
然后应用程序将使用网桥与网络进行通信。我实际上只需要一个网络适配器即可与网桥一起使用。我更喜欢它是 wifi 适配器,因为我家里没有太多以太网(我正在使用这个设置)。
因此,即使我尝试桥接 WiFi 适配器而不担心以太网端,它也无法工作。它尝试工作(即我没有收到任何错误),但它不会向网桥发出 IP 地址。
在您询问之前,该应用程序是专业音频行业的专有音频应用程序。我不知道为什么制造商认为这是最好的做事方式,但从我的阅读来看,这似乎并不罕见。我相信某些虚拟化平台会做同样的事情,因为该软件部分是虚拟化的。也许这就是原因。
因此,考虑到上述情况,如果我仅使用 WiFi 适配器作为单侧桥接器。这还不行吗?这是否可以解决无法桥接 Wifi 客户端和以太网问题?或者我误解了你的意思?
答案1
我需要将以太网和 WiFi 适配器桥接在一起。
这是一个常见问题解答:Wifi 默认情况下使用称为 3 地址模式的东西,其结果是您无法桥接 Wifi 客户端和以太网。
(好吧,从技术上讲,你可以,但它不会工作:来自 Wifi 网络的数据包不会到达以太网上的目的地,即使它们是桥接的并且位于同一子网中。如果你写“它有点工作”,你可能没有测试过这种情况)。
然而,你能桥aWifi 接入点(AP) 和以太网。
所以,这是一个XY问题:您的 Y 是“我需要在 Debian Buster 上桥接 Wifi 和 LAN”,但我们不知道您的 X 是什么(也许:我家里有 Wifi 和 LAN,我希望它们位于同一子网中? )。
根据您的 X 是什么,还有其他方法可以实现此目的,例如,您可以桥接 Wifi AP 和 LAN在你的路由器中。
答案2
初步说明
作为@dirkt 已经写了,桥接限制是为了强制网络堆栈不会尝试(并且失败)通过无线接口发送具有不同源 MAC 地址的帧。有关此限制的详细信息可以在此 NE SE Q/A 中找到:802.11帧头中的四个二层地址。尽管链接的标题是默认情况下仅使用 3 个 MAC,并且接入点(“AP”)使用第三个 MAC 作为桥接器,而不是被视为简单端点的站客户端(“STA”)。缺席4号。切换到允许桥接 STA 的 4 地址模式(“4A”)也需要重新配置 AP 以支持 4A。例如主机通过为每个此类 STA 创建一个 4A 模式的附加本地克隆无线接口(必须对其网桥进行充分配置),可以像往常一样支持为普通 STA 提供服务,也可以为 4A 模式 STA 提供不同的服务。大多数公共客户 AP 不支持此功能(除非运行可重新配置的主机在引擎盖下和足够的 Wifi 硬件/固件)。
在OP的具体情况下,存在一个附加条件:网桥使用单个网桥端口,因此可以可以说仅假设一源 MAC 地址将来自网桥。如果桥接器配置了无线卡的 MAC 地址,则协议固有的限制在这种情况下不适用,但在这种特定情况下,无法告诉网络堆栈允许将无线接口设置为桥接端口。如果一个人只是想要另一个人界面(不是桥港) 表现得像这样,那么IPVLAN将是最简单的选择。
所以使用交通管制功能,将使用功能相当于集线器的解决方法:
- 获取传入无线接口的所有帧并将它们移动以显示传入镜像接口
- 获取从此镜像接口传出的所有帧并将它们移动到无线接口上,准备好传出(作为无线电波)。
- 配置网络堆栈以使用镜像接口而不是无线接口,或者这里使用此镜像接口(的韦斯对等)作为桥接端口来重现将无线接口设置为桥接端口。
然后,该虚拟“集线器”的另一个端口将作为 OP 情况下的桥接端口连接到实际的桥接器。内核不必禁止这一点,因为从技术上讲,它不是被设置为桥接端口的无线接口,因此没有具体的限制。
注意:我用了一个韦斯一对接口。用一个假的界面也可以使用,但我选择了韦斯一对接口有两个原因和一个额外的原因:
较老的ip路由2/内核版本
tc ... action mirred
无法重定向到入口但仅限于出口。 A韦斯一对接口充当方向逆变器:出口一侧变成入口另一方面,所以这个答案也适用于旧系统。网络堆栈的工作方式(那里有示意图),这将使 AF_PACKET (
tcpdump
) 捕获不对称:如入口发生在 AF_PACKET 克隆之后,tcpdump
看不到入口流量重定向为入口在镜像接口上,同时在两个接口上都可以看到出口这发生在 AF_PACKET 之前。这个答案保留了通常的行为:在无线接口和其镜像接口(以及其镜像接口)上都可以看到两个方向。韦斯实际上不涉及的对等接口)。奖金原因:nftables只得到了出口内核 5.16/5.17 中的支持可能仍然不可用。同样它也不能自由选择方向移动的框架的。和韦斯作为方向逆变器满足所有条件:仅需要入口到出口使得也可以替换交通管制和nftables。
镜像接口(或者对于韦斯此处的实现(镜像接口的另一侧)可以直接接收 IP 地址(包括使用 DHCP),但它将用作桥接端口(希望)解决 OP 的问题:应用程序需要一个桥接器。
准备
我将放弃一些必须由OP解决的细节:
设置不应远程完成,因为网络连接会暂时丢失。
OP 必须重新配置 Wifi,使其仅连接到 SSID,而不请求任何 IP 地址(无 IPv4 或 IPv6)、DNS 或其他自定义设置:这部分现在用于桥接接口。配置应始终在无线接口上保留相同的 MAC 地址,无论是原始永久地址还是本答案中的 12:34:56:78:9a:bc 之类的其他地址(非随机模式)。
集成到系统配置中必须由 OP 完成:此处仅提供手动设置。只有在无线连接后,网桥才会具有实际连接,因此不应过早地无用地启动。现在,通常的配置是在网桥上设置的(包括例如运行 DHCP 客户端)而不是无线接口。
br_netfilter
不应加载内核模块。如果当前已加载,请避免任何副作用rmmod br_netfilter
(因为Docker 破坏了 libvirt 桥接网络和许多桥梁设置)。
因此,让我们在更改之前定义示例配置。唯一相关的信息是无线接口名称wlp3s0
及其 MAC 地址,在本例中为:12:34:56:78:9a:bc。
# ip link show dev wlp3s0
3: wlp3s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DORMANT group default qlen 1000
link/ether 12:34:56:78:9a:bc brd ff:ff:ff:ff:ff:ff
脚步
使用首选网络配置工具重新配置 Wifi 以进行连接,并且不请求 IPv4 或 IPv6 的任何地址。
由 OP 执行此操作
vmbr0
创建具有相同 MAC 地址的桥接接口wlp3s0
并禁用特殊功能(以避免生成意外流量)ip link add name vmbr0 address 12:34:56:78:9a:bc type bridge stp_state 0 forward_delay 0 mcast_snooping 0 mcast_router 0
或者如果它已经创建,请更改其设置:
ip link set dev vmbr0 down ip link set dev vmbr0 address 12:34:56:78:9a:bc type bridge stp_state 0 forward_delay 0 mcast_snooping 0 mcast_router 0
创建一个韦斯接口
vmbr0p1
设置为 的唯一桥接端口vmbr0
,并且与其指定的对等链路也具有相同的 MAC 地址wlp3s0mirred
(其 MAC 地址无关紧要)。ip link add name vmbr0p1 address 12:34:56:78:9a:bc master vmbr0 type veth peer name wlp3s0mirred
重新配置
wlp3s0
和vmbr0p1
/wlp3s0mirred
不生成自己的流量,如 IPv6 SLAAC:这 3 个接口现在是桥接端口(或功能上等同于桥接端口)。sysctl -w net.ipv6.conf.vmbr0p1.disable_ipv6=1 sysctl -w net.ipv6.conf.wlp3s0mirred.disable_ipv6=1 sysctl -w net.ipv6.conf.wlp3s0.disable_ipv6=1 #1st bullet should already have done this one
只是为了彻底(可选):
ip link set dev wlp3s0 arp off ip link set dev wlp3s0mirred arp off ip link set dev vmbr0p1 arp off # this one is probably already forced by being a bridge port.
在下一批命令之前,接口必须已经存在。
重定向流量
重定向
wlp3s0mirred
的入口到wlp3s0
的出口使用TC
tc qdisc add dev wlp3s0mirred ingress tc filter add dev wlp3s0mirred ingress matchall action mirred egress redirect dev wlp3s0
而不是上面,使用nftables
nft add table netdev hijack nft add chain netdev hijack towireless '{ type filter hook ingress device wlp3s0mirred priority 0; policy accept; }' nft add rule netdev hijack towireless fwd to wlp3s0
重定向
wlp3s0
的入口到wlp3s0mirred
的出口⚠️有一个问题:WPA 依赖于EAPOL以太网帧类型 0x888E。由于我们正在劫持帧,并且身份验证守护进程 (
wpa_supplicant
) 无法被告知在网桥上读取它们,因为它无法被告知成功使用网桥,因此它仍在寻找 上的 EAPOL 帧wlp3s0
。必须首先添加一个例外,以使这些帧继续wlp3s0
供wpa_supplicant
消耗。否则,即使初始关联成功,仅使用最后一个过滤器完成的下一次重新生成密钥(不出现以下异常)也会失败(并且进一步的重新关联将不会成功)。看起来无线接口不断地连接和断开。使用TC
tc qdisc add dev wlp3s0 ingress tc filter add dev wlp3s0 ingress pref 1 protocol 0x888e matchall action pass tc filter add dev wlp3s0 ingress pref 2 matchall action mirred egress redirect dev wlp3s0mirred
而不是上面,使用nftables
nft add table netdev hijack # already done but doesn't fail to write it again nft add chain netdev hijack fromwireless '{ type filter hook ingress device wlp3s0 priority 0; policy accept; }' nft add rule netdev hijack fromwireless ether type 0x888e accept nft add rule netdev hijack fromwireless fwd to wlp3s0mirred
设置所有接口
ip link set dev vmbr0p1 up ip link set dev wlp3s0mirred up ip link set dev vmbr0 up
这个答案允许一件事:桥可以是系统上的主接口,并且可以用于交换普通的通过 Wifi 连接传输的流量与通过以太网连接使用的方式相同。
它不能保证的是,它将创建一个需要桥接器才能工作的专有应用程序,以实际工作:这实际上取决于它为什么需要桥接器。如果生成任何异常流量(将使用不同的源 MAC 地址)是原因,但很可能这仍然不起作用。