谨慎选择你的 IP 计划

谨慎选择你的 IP 计划

我有多个 Raspberry Pi 3 Model B 主板,并连接了外部 WiFi 适配器。我的目的是:

  1. 创建 RSP 设备的网状网络。
  2. 每个 RSP 板都应有自己的 AP,并且客户端(手机/笔记本电脑)可以连接到它。
  3. 这些 AP 的客户端可以在不同的 RSP 设备范围内移动,并且无论连接到哪个 AP,都应该能够相互通信(就像它们连接到单个网络一样)

修复 #1:我在 RSP3 的内部 wifi 接口(wlan0)上使用了 batman-adv,现在所有设备都可以通过它们的虚拟 bat0 接口相互 ping 通。

对于 #2:我使用了外部 wifi 适配器 (wlan1),在 hostapd 和 dnsmasq 的帮助下,我可以在每个 RSP 板上运行 AP(所有 AP 上的 ssid 和信道相同)。我现在还在不同的 AP 中连接了一些移动设备。

我的主要阻碍问题是目标#3:

为了解决这个问题,我尝试使用 bridge-utils 工具在 wlan0 和 wlan1 接口之间创建桥接。但在 RSP 中,这两个接口都不支持 WDS 模块。所以到目前为止,我无法为所有客户端创建单个网络。我还尝试在 wlan0 和 wlan1 之间使用 IP 转发,但我无法从其他 RSP 设备 ping 连接的客户端。

有没有其他方法(除了 WDS)可以为所有连接的客户端创建单一网络?

答案1

为了使这个功能正常工作,需要调整几件事。

  • 首先,您不应该让每个 RPI 的 wlan1 AP 位于同一频道上,因为这会导致它们之间产生严重的干扰。

  • 您也不需要使用 WDS。请参阅这个解释了解更多信息。只需确保每个 AP 具有相同的 SSID、WiFi 安全类型和相同的密码即可。

  • 您的想法是正确的,您需要在每个 RPI 上创建 wlan0 和 wlan1 之间的桥接。我不熟悉 bridge-utils,但最好按照 batman-adv 文档中关于创建桥接的说明进行操作这里

另外需要注意的是,您可能不需要为 DHCP 服务运行 dnsmasq。您的客户端只需使用自动分配的链路本地 IPv6 地址即可通过此无线 LAN 相互通信。

编辑:我错了。听起来好像不支持在 RPI3 上使用 wlan 建立真正的桥接。看来可以使用 NAT 来解决这个问题这里。如果您连接两个支持桥接连接的外部 WiFi 适配器,也有可能实现。

答案2

您没有提及任何有关 IP 配置的内容,而 IP 配置正是解决问题 #3 所需要的。

谨慎选择你的 IP 计划

您的整个网络将有一个“通用 IP 方案”。例如,许多网络使用192.168.*.*

您可以使用任何 IP 私有空间,包括 IPv4 和 IPv6. 确保它不会与用户的任何其他网络发生冲突或 RPis可能连接到。

例如,假设我们将使用全局网络。请注意,在网络及其所有子区域中,172.17.*.*“全零”(172.17.*.0)和“全一”( )地址是保留的(即不可用)。172.17.*.255

我们必须将这个大网络细分为更小的网络,每个 RPi 都可以独立使用。其中一个子网络将用于 RPi 之间的通信,我们将保留这个子网络172.17.0.*。我们可以使用其他数字,但使用 0 可以轻松使用脚本配置 Pi。

172.17.xxx.*网络的“公共”部分将使用每个 RPi 独有的IP xxx。同样,为了方便编写脚本,我们从 1 开始,然后递增。

RPi 需要一个 IP两个都网络。对于公共网络,最佳做法是使用.254,因此它将是172.17.xxx.254。但是中央网络呢?RPi 将被其他 RPi 用作网络网关172.17.xxx.*。将 IP 地址与中继网络匹配才是合乎逻辑的:我们将使用172.17.0.xxx

设置 Pis

  1. 配置你的 RPis wlan1民众接口)使用固定的IP在所有 RPi 中是唯一的,并且不为 0(见上文)。网络掩码172.17.xxx.254为。xxx255.255.255.0

  2. 配置你的 RPis wlan0私人的接口)使用固定的IP172.17.0.xxxxxx上文相同。网络掩码为255.255.255.0

  3. 在每个 RPi 上,运行以下脚本,并将其替换$END为您使用的 RPi 数量:

    echo 1 > /proc/sys/net/ipv4/ip_forward
    for i in $(seq 1 $END); do route add -net 172.17.$i.0 netmask 255.255.255.0 gw 172.17.0.$i; done
    iptables -A FORWARD -s 172.17.0.0/16 -d 172.17.0.0/16 -j ACCEPT
    

TL;DR,我们执行以下操作:我们选择一个大网络,这里172.17.0.0/16。我们将其细分为 255 个较小的网络:172.17.xxx.0/24。我们保留0这些数字,并将其他所有数字提供给用户。然后,我们告诉 RPi 将发往其他计算机的数据包传输到适当的“网关”RPi。

告诉用户的设备在正确的位置查找

我假设您使用 dnsmasq 作为公共网络的 DHCP 服务器。为了正确配置用户设备,您需要调整其设置。

  1. 设置 DHCP 以便它提供适合网络范围的地址,172.17.xxx.1172.17.xxx.253

  2. 在 dnsmasq 配置的 DHCP 部分添加静态路由(再次进行xxx适当替换):

    dhcp-option=121,16.172.17.0.0,172.17.xxx.254
    

使用静态路由可避免覆盖客户端的默认网关。这样,如果它们仍连接到另一个网络(即插入以太网的笔记本电脑),它们就不会遇到任何问题。

在进行设置之前,请确保使用 1 或 2 个 Pi 和 1 或 2 个客户端进行测试全部你的 RPi。

相关内容