我目前已将 Raspberry Pi 4B 设置为桥接器,以便为无法使用 wifi 的单独以太网设备提供 wifi 访问。我使用了此处指南中的选项 1:https://willhaley.com/blog/raspberry-pi-wifi-ethernet-bridge/这是基于之前的一个问题的答案:https://raspberrypi.stackexchange.com/questions/88954/workaround-for-a-wifi-bridge-on-a-raspberry-pi-with-proxy-arp/88955#88955
成功了!客户端设备通过桥接器顺利连接到网络,并从我网络的主 DHCP 服务器(位于正确的子网中)获取其自己的适当 IP 地址。但是,在 DHCP 列表中,客户端设备与充当桥接器的 Raspberry Pi 共享列表中的同一位置。因此,在我的 DHCP 的 GUI 中,客户端列表仅显示 Pi 的主机名(而不是桥接客户端的主机名),并且其 IP 地址每隔几分钟就会在 Pi 和客户端之间波动。
在现实生活中,我可以通过各自的 IP 地址或主机名访问任一设备,而不会出现任何问题。问题主要出现在 DHCP 的显示列表中。但是,这也使得很难找出客户端的 IP 地址,尤其是当我插入其他东西时,IP 地址会发生变化。有没有办法调整我所做的更改,以便通过网桥连接的设备在 DHCP 列表中有自己的项目,而不是网桥的项目?这是 MAC 地址转换问题吗?DHCP 列表中的项目有 Pi 的 wifi MAC 地址。
请注意,我无法访问 DHCP 服务器的原始文件或日志,它不是一个开放系统。
答案1
如果你读了一个剧本选项1,你不会在那里找到任何与 Linux 桥接相关的命令。不brctl
,不ip link set master
。但你可以看到它明确启用了 IP 路由:net.ipv4.ip_forward=1
。此外,如果你仔细阅读,你肯定会遇到一些奇怪的术语,代理 arp。所以你应该推断这不是一座桥。当然,仅 IPv4如果配置成这样,Raspberry Pi 就能正常工作。如果这是真正的桥接,那么任何协议都必须工作。因此,称其为“桥接”是不正确的。
以下基本上是关于proxy arp
其工作原理的描述。
确实,我们启用了 IP 路由,因此 Raspberry Pi 可以作为路由器。不寻常的是,这个路由器在两个不同的接口后面有“相同”的子网。因此出现了一些问题:
- 路由器如何知道哪些主机在哪个接口后面?
- 两个接口后面的其他主机如何知道有一些数据包通过 Raspberry Pi 路由,而不是像往常一样“直接发送”?
第一个很简单。两个接口后面没有相同的网络。WLAN 端通常有 192.168.1.x/24地址,但 LAN 的地址设置为 192.168.1.x/32通过脚本。因此,一般来说,Raspberry Pi 没有 LAN 后面的子网,并且它只在 WLAN 接口后面有足够宽的子网。但是,当某个主机出现在 LAN 后面时,会为其添加专用路由,表示该主机位于 LAN 后面。在这种情况下,adhcp-helper
负责安装此类路由。如果您想静态配置主机,您还需要在 Raspberry Pi 上手动添加此路由。
现在,第二个。LAN 后面的主机有一个 192.168.1.y/32地址、到 Raspberry Pi 的直接路由和通过 Raspberry Pi 的默认路由,因此它有一种通过它到达所有设备的常用方法。它不认为每个人都是它的邻居,只有 Raspberry Pi 是它的邻居(这是真的)。但 WLAN 后面的其他主机仍然根据网络掩码认为该主机是它们的直接邻居。不过,要到达该主机,我们需要它们通过 Raspberry Pi 发送数据包。怎么做呢?答案是:Raspberry Pi 使用自己的 MAC 地址回答有关 192.168.1.y IP 地址的 ARP 请求,尽管它没有分配该地址。这是某种 ARP 欺骗。因此,所有其他主机都乐意将主机 192.168.1.y 的数据包发送到 Raspberry Pi,它发现目标地址不是本地的,并通过 LAN 接口正确转发它们。此设置称为proxy arp
(猜猜为什么)。
现在,我们必须问另一个问题:
- DHCP 如何能够为代理 arp 后面的主机工作?
DHCP 使用不会被路由的广播数据包。那么 DHCP 服务器如何接收查询以及它如何发送回复?这又是一个dhcp-helper
有帮助的地方,它必须充当 LAN 端的 DHCP 服务器,但它不是在本地管理地址,而是从 WLAN 接口重新发出请求。因此它充当DHCP 代理这里。
但是,如果是这样,请求现在有 Raspberry Pi WLAN MAC 地址。我们对此无能为力。这正是我们无法将 WLAN 与 LAN 桥接的原因:接入点将仅接受来自经过身份验证的 MAC 地址(即 WLAN MAC)的数据包,因此移动站只能发送带有其 WLAN 卡 MAC 地址的数据包。DHCP 服务器看到来自 Raspberry Pi WLAN MAC 的请求;它是 MAC 地址,记录到租约中。
区分它们的唯一方法是附加的 DHCP 属性:客户端 ID;dhcp-helper 可能附加的电路 ID 等等;但所有这些属性仅对 DHCP 服务器可见,如果没有提供显示或使用它们,您就看不到它们。
所以,回顾一下。这不是桥接,而是路由。该proxy arp
功能使路由器能够“伪装”自己为后面的主机,以接收发往它的数据包,但这意味着 WLAN 中的每个主机都将在代理 arp 路由器后面的任何主机的 ARP 条目中拥有路由器的 WLAN MAC 地址。并且由于它始终在路由中,因此您只能看到最近网关的 MAC 地址,而无法知道其后面主机的 MAC 地址。