内部使用 NAT 的设备-如何避免与互联网连接冲突?

内部使用 NAT 的设备-如何避免与互联网连接冲突?

我正在构建一个设备,该设备有两台 Linux 计算机(树莓派),通过有线以太网连接。其中一台,即“外部”树莓派,有 Wi-Fi 连接到外界。两台树莓派都需要连接到外部,因此“外部”树莓派被设置为 DHCP/NAT 主机,连接两台树莓派的电缆构成了私有的双机网络。即使没有公共 Wi-Fi,两台树莓派也需要能够通信 - 任何互联网操作都可以延迟到公共 Wi-Fi 恢复,但我迫不及待地等到公共 Wi-Fi 恢复后再配置私有网络并让两台树莓派互相通信。到目前为止,一切都运行良好。

我的问题是:例如,如果我将我的私有网络设置为具有 192.168.0.x 子网,那么如果我加入使用相同子网的公共 wifi 会发生什么?外部 pi 上的路由会变得棘手,因为它的两个网络都将具有相同的子网。我可以使用比 192.168.0.x 更不常见的子网,但不知道永远不会在公共 wifi 上使用的合法非路由地址块(我无法控制公共 wifi,无论客户的网络如何设置,我的设备都必须正常工作)。

我是否必须监听公共 wifi 的变化并根据需要重新配置我的专用网络?如果是这样,有什么最干净的方法可以让“内部” pi 知道它需要获取新的 IP 地址和路由表?或者有没有更好的方法可以让我建立一个无论公共 wifi 如何配置都能正常工作的网络。我考虑过做一些非常奇怪的事情,比如将两个设备放在 127.0.1.0 和 127.0.1.1,因为我知道 127.xxx 是为环回保留的,因此永远不会被公共 wifi 使用,但像这样的丑陋黑客似乎可能会导致问题,所以如果可能的话我宁愿避免它。

谢谢。如果这个问题不属于超级用户,请见谅 - 我已经从 stackoverflow(不是编码问题)和网络工程(不是关于企业网络的问题)中被弹出,希望这是它的正确归宿!

答案1

RFC 1918 定义了保留供私人使用(例如 NAT 后面)的 IPv4 地址范围。它定义了以下三个范围:

  • 10.0.0.0/8:10.0.0.0–10.255.255.255
  • 172.16.0.0/12:172.16.0.0–172。31.255.255
  • 192.168.0.0/16:192.168.0.0–192.168.255.255

您说得对,任何 RFC 1918 私有地址范围可以在某人的网络上正在使用,因此如果您将 RPi 设置硬编码到这些范围中的任何一部分,则可能会发生冲突。所以你说得对,你必须查看你的外部 RPi 分配了什么 IPv4 地址/子网,如果它恰好与你的 RPi 设置使用的默认私有子网冲突,你需要重新编号你的 RPi 设置的私有网络。

根据传闻经验,似乎很少有网络使用 172.16.0.0/12 范围,甚至更少有人意识到它是 /12,因此第二个八位字节不仅可以是 16,还可以是 16-31 之间的任何数字。因此,如果您希望冲突的可能性较低,请选择 172.17.0.0—172.31.255.255 范围内的某个数字。

DHCP 不提供服务器通知客户端其旧租约突然失效的方法。但是,如果客户端的链接断开并恢复,客户端将自动尝试续订租约,因此,如果两个 RPi 通过以太网电缆直接连接,中间没有集线器或交换机,您可以让“外部”RPi 暂时断开其以太网端口上的链接(关闭其以太网端口),以便“内部”RPi 看到其链接断开,这样内部 RPi 的 DHCP 客户端进程将在链接恢复后立即尝试续订租约,这将为外部 RPi 的 DHCP 服务器提供拒绝续订旧租约的机会,导致内部 RPi 请求新租约,从而允许外部 RPi 的 DHCP 服务器从新子网为其提供新租约。

如果您想避免这些 IPv4 DHCP 租约麻烦,您可以考虑在两个 RPi 之间的私有链路上使用 IPv6 链路本地寻址,而不是使用 IPv4。您可能希望在外部 RPi 上运行类似 NAT64 网关进程的东西,这样即使内部 RPi 没有自己的 IPv4 地址,内部 RPi 仍然可以访问更广泛互联网上的 IPv4 资源。

相关内容