我在一家使用 3 个子网的公司工作,即 10.0.0.0/16、10.1.0.0/16 和 10.2.0.0/16。这 3 个子网使用第 3 层交换机(10.0.100.200、10.1.100.200、10.2.100.200)连接,每个子网上的所有计算机都使用第 3 层交换机作为其默认网关,然后将流量定向到当前为 10.1.0.2 的实际网关
我最近在 10.0.0.1 上配置了一个新网关,并已开始测试这个新网关,对于 10.0.0.0/16 子网上的客户端机器来说,这不是问题,我只是将通过 DHCP 分配给这些机器的默认网关更改为新地址,并且流量通过新网关传出,而不是进入第 3 层交换机。
我也想在另一个站点上测试这一点,因为每栋楼都有不同的团队,他们需要访问不同的网站,而且我想确保在切换所有内容之前,每个团队都可以访问他们工作所需的内容。
因此,在 10.2.0.0/16 网络上的 Windows 工作站上,我尝试将机器的默认网关设置为 10.0.0.1,我检查了流量去往何处,它仍然通过旧网关出去(使用 tracert 到 8.8.8.8 到达那里,但通过旧网关,使用 tracert 10.0.0.1,它到达 10.0.0.1)。我相信默认网关设置被第 3 层交换机上的静态路由表覆盖。
我试图弄清楚是否可以在相关机器上设置静态路由,以便它们可以将其网关流量引导到 10.0.0.1 并避免它被第 3 层交换机覆盖。
我用了:
route add 0.0.0.0 mask 0.0.0.0 10.0.0.1 if 0x2
Windows 接受了这个,但重复我的 tracert 测试时,流量仍然通过旧网关出去。我希望我可以这样做:
route add 0.0.0.0 mask 0.0.0.0 10.0.0.1 if 0x2
route add 10.0.0.1 mask 0.0.0.0 10.0.100.200 if 0x2
route add 10.0.100.200 mask 0.0.0.0 10.2.100.200 if 0x2
但这也失败了,运行第二条和第三条命令Windows报告:
The route addition failed: The specified mask parameter is invalid. (Destination & Mask) != Destination.
所以我知道我正在运行的命令不起作用,但是是否可以强制 Windows 将其流量通过第 3 层交换机引导到我的新网关,还是我正在进行徒劳的搜索?
如果我需要更改第 3 层交换机上的静态路由,我不介意这样做,反正我周日有一个维护窗口,所以我可以做一些调整。出于显而易见的原因,我宁愿不在工作时间做这件事。
为了阐明站点之间的链接,每个第 3 层交换机都有以下连接:
gateway , fibre link 1, fibre link 2
10.0.100.200, , 192.168.10.1
10.1.100.200, 192.168.20.1, 192.168.10.2
10.2.100.200, 192.168.20.2,
因此,为了让我的流量从 10.2.249.28(我的测试机器)到达 10.0.0.1,它需要经过 10.2.100.200 > 192.168.20.1 > 192.168.10.1 > 10.0.0.1
有问题的第三层交换机是 Netgear FSM7326P 和 GSM7328FS。
如果我开始怀疑我无法通过在 Windows 中设置静态路由来做到这一点,那么是否可以在第 3 层交换机上为各个 IP 地址定义静态路由?由于我目前正在测试,所以我只希望我将配置用于测试的 3 或 4 台机器的流量暂时通过新的网关,我希望所有其他流量继续像以前一样流动。
答案1
系统上的默认网关定义了其本地广播域中的哪个地址,用于发送位于直接连接子网之外的地址的数据。由于 10.0.0.1 不在 10.2.0.0/16 范围内,因此 10.2.0.0 上的主机仍然需要知道将数据包发送到 10.2.0.0 内的哪个地址,以便转发数据包。一旦数据包到达 10.2.0.0 内的网关,就由该网关来决定如何处理它。
根据您的网络设备,可能可以基于访问控制列表创建静态路由。
我认为,最好的办法是将新的路由器/网关 (10.0.0.1) 连接到其他子网。根据您使用的硬件,您可以使用额外的物理链路或相互兼容的中继协议来实现这一点。将新网关连接到所有三个子网后,您将能够手动连接其他计算机进行测试。
话虽如此,我不明白你到底在测试什么,需要所有这三个 /16 才能选择多个网关。如果你只是想确保它能正常工作,你的初始子网测试似乎证实了这一点。
答案2
由于您使用的是 Windows,因此这会产生问题。在 FreeBSD 的 Linux 下则不会出现问题。
Windows Server 2012 R2 和 Windows 8.1 具有 powershell cmdlet 来启用子网外的直接访问,“Get-NetOffloadGlobalSetting”显示当前状态,“Set-NetOffloadGlobalSetting -NetworkDirectAcrossIPSubnets”允许您配置该值。
虽然 PowerShell 可以理解客户端操作系统上“NetworkDirectAcrossIPSubnets”的语法,但此功能仅适用于服务器,在客户端操作系统下设置它将出现错误。
如果您的服务器中有 Windows 虚拟机,需要访问其自身子网之外的网关,并且您无法使用 NetworkDirectAcrossIPSubnets - 您可以安装另一个在类 Unix 操作系统下运行路由器的虚拟机,例如 pfSense - 它可以拥有子网外的多个地址,只要至少一个地址与网关位于同一子网中,并且它可以为您的 Windows 虚拟机进行 1:1 NAT。