我可以为每个想要访问的子网设置一个网关吗?

我可以为每个想要访问的子网设置一个网关吗?

我在这里和其他地方看到过多个关于此问题的文章。我知道一个子网只能有一个网关,我也知道为什么——设备不知道是使用第一个网关还是第二个网关来访问 LAN 子网外的地址。

但是,如果每个网关都通向不同的子网,是否可以有多个网关?

例如:如果我使用 192.168.1.xxx 作为我的 LAN,但在另一栋建筑物中还有第二个 LAN,但通过电缆或光纤连接,并且它使用 172.16.7.xxx 范围,我可以使用一个网关连接到该 LAN,使用另一个网关连接到互联网的其余部分吗?

答案1

是的,路由器的工作原理就是这样的。它们(实际上不仅仅是路由器,还有最多使用 IP 的系统(甚至包括 Windows PC)使用路由表来决定数据包应该发往哪里。

如果您ip route在 Linux 或netstat -rnmacOS 或Get-NetRouteWindows 中的 PowerShell(或 route printCmd)上运行,您将看到目标网络及其相应网关的表。

例如,如果您希望您的 PC 使用两个网关,192.168.1.1 提供 Internet 访问,192.168.1.172 提供对另一栋建筑物的访问,您可以使用:

  • 视窗:C:\> route add 172.16.7.0/24 192.168.1.172

  • Linux:# ip route add 172.16.7.0/24 via 192.168.1.172

(通常,处理此类互连是 LAN 路由器的工作。理想情况下,同一个路由器应该只充当所有三个网络之间的网关 - 它几乎就是一份工作路由器。但如果必须有两个单独的网关,则仍应在 LAN 的“默认网关”上配置 172.16.7.x 路由,而不是逐个在各个设备上配置。例如,您将无法向打印机或智能电视添加新路由 - 它们从 DHCP 获得“默认网关”,仅此而已。)

即使操作系统中的“默认网关”配置也只是为0.0.0.0/0::/0目标配置路由的快捷方式,该路由与所有可能的地址匹配。(并且,当您为本地子网配置“子网掩码”时,这也只是不同路由类型的快捷方式。)

路由表条目按“最长匹配优先”排序,而不是从上到下。例如,同一个地址将同时匹配您的172.16.7.0/24路由“默认网关”0.0.0.0/0路由。前者将具有优先权,因为它匹配更具体的前缀(24 位 vs 0 位)。


有些系统实际上允许在单个路由中指定多个网关——这在专用路由器中比在 PC 操作系统中更常见(Windows 或 macOS 上没有此功能),但 Linux 尤其允许您轻松创建多网关路由,并在所有指定的下一跳之间均衡传出流量。这称为“等价多路径”(ECMP)。

ip route add 172.16.0.0/16 nexthop via 192.168.1.7 nexthop via 192.168.1.8

更常见的是能够创建多个分离恰好与完全相同的目的地(包括相同的前缀长度)匹配的路由。在这种情况下,第二个参数“度量”(又称成本)用于决定在其他方面相同的路由之间的优先级。例如:

ip route add 172.16.0.0/16 via 192.168.1.7 metric 100
ip route add 172.16.0.0/16 via 192.168.1.8 metric 200

此处,所有路由均将使用“metric 100”路由,而忽略其他路由。(但是,在某些情况下(例如 IPv6,以及可能在具有 IPv4 的 Windows 上?),如果第一个网关最终无法访问,则操作系统可能会禁用该路由并回退到第二个网关。)

答案2

是的。

您的第二个例子不是一个很好的例子,因为网关(实际上)需要与接口位于同一网络中。

一个更好的例子可能是,如果您有 2 个连接到不同 ISP 的简单路由器。路由器 1 上的 LAN 接口是 192.168.1.254/24,路由器 2 上的 LAN 接口是 192.168.1.253/24。

您可以分割路由,以便一些流量通过一个路由器(一个 ISP)路由,一些通过另一个路由器路由。例如,您可以设置 0.0.0.0/1 通过 192.168.0.253 和 128.0.0.0/1 通过 192.168.0.254,以将流量分割到两个路由器的接口。

虽然在 SOHO 路由器上并不常见,但具有 2 个以上接口的大型路由器通常会这样做。

注意:当您获得更复杂的路由时,您可以为同一个子网设置多个网关,有几种方法可以做到这一点:

  • 更简单的是“度量”,它优先于 1 个网关(如果网关接口消失 - 例如 PPP 接口),它将使用更高度量的路由。
  • 也可以通过多个路由表来实现,并使用策略路由将不同的数据包发送到不同的路由表)。

相关内容