关于 Raspberry Pi 4B 的 L3“伪桥接”实现的问题

关于 Raspberry Pi 4B 的 L3“伪桥接”实现的问题

我们在 Raspberry Pi 4B 上实现了一个 L3“伪桥”,在用户给出的静态配置指导下使用代理 ARP(parprouted)因戈成立这里为我们的现场系统提供与外界同步的本地数据库。我们的系统运行 Buster。该系统似乎运行良好,但我想通过描述我们似乎遇到的一些细微差别/问题来确保我们按照预期使用它。我将首先描述我们的拓扑:

                          ┌─proxy arp─┐     UPLINK
                wired     V           V      wifi            wan
a few hosts <─────────> (eth0)RPi(wlan0) <~.~.~.~.> hotspot <---> INTERNET
     \                           \
(STATIC IP for easy id'ing)   (STATIC IP for easy id'ing)

我还要提到的是,我们使用多个 RPi 来连接到该热点以进行外部连接。每个树莓派服务于一些需要连接的设备,但这些设备仅具有有线能力。这并不是我们这样做的唯一原因,每台设备都距离热点非常远,并且我们利用 6dBi 增益全向天线连接我们的外置天线 WiFi 转 USB 适配器。

我们遇到的问题特别是两个:

1.) 如果热点未启动,我们无法 ping 通 Raspberry Pi。

2.) 如果我们因为 WiFi 信号不好而将很长的电缆连接到 RPi 作为硬接线应急计划,那么 RPi 很少能顺利处理这种情况,这通常会导致通过 eth0 的流量很差,而它仍然会尝试通过 wlan0 进行连接,尽管连接很差。我意识到桥接 ARP 功能使它们变得相同,所以也许这可能会使 NIC 的“故障转移”行为变得复杂。

我怀疑问题之一可能是我们指定配置脚本的网关或 DNS 设置的配置方式,/etc/systemd/network/08-wlan0.network 如下所示:

cat > /etc/systemd/network/08-wlan0.network <<EOF
[Match]
Name=wlan0
[Network]
Address=192.168.100.200/16
Gateway=192.168.0.1
DNS=8.8.8.8
IPForward=yes
EOF

如果包含这样的网关(在本例中是我们的热点),当热点关闭时,这是否会导致 RPi 出现问题?

我还在某处读到,如果未启用混杂模式,则伪桥将无法正常工作。我们应该在 Buster 上添加以下内容吗?

ip link set wlan0 promisc on

感谢您的帮助。

答案1

我再次测试了设置以验证您的问题,但当然是使用当前的操作系统版本和硬件。这些是 Raspberry Pi 4B 上的 Raspbian Buster。参考的设置是Raspberry Pi 上带有代理 arp 的 wifi 桥的解决方法。为了常规设置我有经典的名称解析器和阿瓦希守护进程已卸载并且systemd 解决的启用是因为我相信它更适合systemd-networkd。你应该看看它。

1.) 如果热点未启动,我们无法 ping 通 Raspberry Pi。

这是有意为之。 RasPi 应该像真正的桥一样对其连接的设备是透明的。他们应该看到热点而不是 RasPi。其 IP 地址仅用于管理 OSI 第 3 层上的代理 arp,对于连接的设备没有意义。如果你看以太网0无线局域网0他们都有相同的IP地址。这无法在普通网络设备上工作。因此,如果热点关闭,那么 RasPis 接口也会关闭,因为它们的工作方式与接口相同。

2.) 如果我们将很长一段电缆连接到 RPi [..],RPi 很少能顺利处理此问题,通常会导致通过 eth0 的流量较差,而尽管连接较差,但它仍然尝试通过 wlan0 进行链接。

这是我无法真正验证的一点,因为我没有长距离以太网电缆,但长度在以太网规格范围内,应该没有问题。如果不是那么可能更多的是电缆本身、屏蔽、接触等问题。为了得到一个想法,我用旧的 RasPis 在性能不是很好的测试网上进行了带宽测试。在我运行的热点后面的有线连接设备上iperf --server。在连接到的设备上以太网0在 RasPi 上我运行:

rpi ~$ iperf --time 60 --client 192.168.50.174
------------------------------------------------------------
Client connecting to 192.168.50.174, TCP port 5001
TCP window size: 43.8 KByte (default)
------------------------------------------------------------
[  3] local 192.168.50.3 port 43434 connected with 192.168.50.174 port 5001
[ ID] Interval       Transfer     Bandwidth
[  3]  0.0-60.9 sec   286 MBytes  39.4 Mbits/sec

界面以太网0在 RasPi 上没有显示任何错误:

rpi ~$ ip -statistics link show eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP mode DEFAULT group default qlen 1000
    link/ether dc:a6:32:01:db:ec brd ff:ff:ff:ff:ff:ff
    RX: bytes  packets  errors  dropped overrun mcast
    510673218  338397   0       0       0       155
    TX: bytes  packets  errors  dropped carrier collsns
    2690947    35971    0       0       0       0

无线局域网0我发现类似的干净结果没有错误。

您的静态地址、网关和 DNS 设置/etc/systemd/network/08-wlan0.network正确。我已经使用类似的配置进行了测试,它与热点关闭时关闭 RPi 无关(请参见上面的第 1 点)。

需要混杂模式,它在 parprouted.service 单元文件中设置。在那里你会发现

ExecStartPre=/sbin/ip link set wlan0 promisc on
# and
ExecStopPost=/sbin/ip link set wlan0 promisc off

所以没有必要再做一次。

相关内容