了解 Windows 路由表和默认网关

Gun*_*und 11 networking windows internet routing gateway

注意:这是我的家庭计算机实验室,而不是商业/生产环境。我很高兴打破它并再次修复它,所以欢迎任何建议!

概括

我添加了这个快速摘要,因为这个问题越来越长。如果您想了解有关路由表、IP 配置等的更多详细信息,请查看以下内容。

我的电脑上有几个网卡。一个 NIC 是 172.16.200.1 / 24。当我尝试 ping 172.16.200.2(网络上存在的主机)时,我得到回复。到现在为止还挺好。

当我尝试连接到 172.16.200.5(或任何其他不存在的主机)时,计算机将回退到我的默认路由(通过我的默认网关 192.168.0.1 的 0.0.0.0) - 然后由我的家用路由器然后在我的 ISP 网络中的路由循环中丢失了。如果需要,下面会提供更多详细信息,但我猜那里有一位大师可以回答这个问题......

我的问题是:

当该网络上的主机没有响应时,如何阻止我的计算机回退到专用网络的默认网关。这些专用网络已经具有指标较低的显式路由。

我在几台机器(Server 2008 R2、Windows 7、Hyper-V Server 2012 R2、Windows Server 2012)上对此进行了测试,它们的行为方式都相同。我开始接受这是 Windows 机器的“正常行为”,但我很好奇它是否可以停止。

我创建了一个 Ubuntu VM,其配置与我的 Windows VM 相同 - Ubuntu VM 不会像 Windows VM 那样回退到默认路由。我在这篇文章的底部添加了 Ubuntu VM 和 Windows 8.1 VM 的路由表和结果。

更多细节

我已经对这个主题进行了广泛的搜索,我见过的最接近的问题是:Routing loop: TTL expired in transport,但不幸的是,它没有回答如何停止问题或改变计算机上的行为。答案建议修复路由。我可以更改我的路由器以丢弃所有发往私有 IP 地址的内容(或将其转发到我室友的 IP,呵呵),但这不会改变我计算机的行为。(我还阅读了原始答案中引用的很棒的子网划分指南,可以在https://serverfault.com/questions/49765/how-does-ipv4-subnetting-work找到)

我无法理解为什么我的计算机在尝试使用其内部适配器(短期)后会尝试通过 Internet 连接到私有 IP 地址然后失败 - 例如,在尝试 ping 我知道的主机时我的网络上不存在...

Pinging 172.16.200.32 with 32 bytes of data:
Reply from 172.16.200.1: Destination host unreachable.
Reply from 203.29.XXX.YY: TTL expired in transit.
Reply from 203.29.XXX.YY: TTL expired in transit.
Reply from 203.29.XXX.YY: TTL expired in transit.

Ping statistics for 172.16.200.32:
    Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
Run Code Online (Sandbox Code Playgroud)

但是ping一个确实存在的主机是有效的......

Pinging 172.16.200.2 with 32 bytes of data:
Reply from 172.16.200.2: bytes=32 time<1ms TTL=128
Reply from 172.16.200.2: bytes=32 time<1ms TTL=128
Reply from 172.16.200.2: bytes=32 time<1ms TTL=128
Reply from 172.16.200.2: bytes=32 time<1ms TTL=128

Ping statistics for 172.16.200.2:
    Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
    Minimum = 0ms, Maximum = 0ms, Average = 0ms
Run Code Online (Sandbox Code Playgroud)

好的,所以来自 172.16.200.1 的回复是我的电脑说没有收到任何回应……但是,为什么它甚至尝试通过我的互联网连接进行连接?我有 4 个 NIC,并且我在其中一个的 172.16.200.0 / 24 网络上......

Ethernet adapter HyperV External (built in):

   Connection-specific DNS Suffix  . :
   Link-local IPv6 Address . . . . . : fe80::582c:97
   IPv4 Address. . . . . . . . . . . : 172.16.1.1
   Subnet Mask . . . . . . . . . . . : 255.255.255.0
   Default Gateway . . . . . . . . . :

Ethernet adapter Expansion-2 (middle) HomeNetwork:

   Connection-specific DNS Suffix  . : Home
   IPv4 Address. . . . . . . . . . . : 192.168.0.117
   Subnet Mask . . . . . . . . . . . : 255.255.255.0
   Default Gateway . . . . . . . . . : 192.168.0.1

Ethernet adapter Expansion-3 (bottom) iSCSI-1 :

   Connection-specific DNS Suffix  . :
   IPv4 Address. . . . . . . . . . . : 172.16.100.1
   Subnet Mask . . . . . . . . . . . : 255.255.255.0
   Default Gateway . . . . . . . . . :

Ethernet adapter Expansion-1 (top) iSCSI-2:

   Connection-specific DNS Suffix  . :
   IPv4 Address. . . . . . . . . . . : 172.16.200.1
   Subnet Mask . . . . . . . . . . . : 255.255.255.0
   Default Gateway . . . . . . . . . :
Run Code Online (Sandbox Code Playgroud)

所以,在这一点上,查看路由表是有意义的......

===========================================================================
Interface List
 16...64 70 02 00 1f 03 ......Gigabit PCI Express Network Adapter #2
 15...64 70 02 00 40 48 ......Gigabit PCI Express Network Adapter
 23...00 24 1d 1d f8 35 ......TST Onboard
 17...64 70 02 00 32 c1 ......Gigabit PCI Express Network Adapter #3
  1...........................Software Loopback Interface 1
 28...00 00 00 00 00 00 00 e0 Microsoft ISATAP Adapter
 26...00 00 00 00 00 00 00 e0 Microsoft ISATAP Adapter #2
 13...00 00 00 00 00 00 00 e0 Teredo Tunneling Pseudo-Interface
 27...00 00 00 00 00 00 00 e0 Microsoft ISATAP Adapter #3
 29...00 00 00 00 00 00 00 e0 Microsoft ISATAP Adapter #4
===========================================================================

IPv4 Route Table
===========================================================================
Active Routes:
Network Destination        Netmask          Gateway       Interface  Metric
          0.0.0.0          0.0.0.0      192.168.0.1    192.168.0.117    410
        127.0.0.0        255.0.0.0         On-link         127.0.0.1    306
        127.0.0.1  255.255.255.255         On-link         127.0.0.1    306
  127.255.255.255  255.255.255.255         On-link         127.0.0.1    306
       172.16.1.0    255.255.255.0         On-link        172.16.1.1    266
       172.16.1.1  255.255.255.255         On-link        172.16.1.1    261
     172.16.1.255  255.255.255.255         On-link        172.16.1.1    261
     172.16.100.0    255.255.255.0         On-link      172.16.100.1    266
     172.16.100.1  255.255.255.255         On-link      172.16.100.1    266
   172.16.100.255  255.255.255.255         On-link      172.16.100.1    266
     172.16.200.0    255.255.255.0         On-link      172.16.200.1    266
     172.16.200.1  255.255.255.255         On-link      172.16.200.1    266
   172.16.200.255  255.255.255.255         On-link      172.16.200.1    266
      192.168.0.0    255.255.255.0         On-link     192.168.0.117    266
    192.168.0.117  255.255.255.255         On-link     192.168.0.117    266
    192.168.0.255  255.255.255.255         On-link     192.168.0.117    266
        224.0.0.0        240.0.0.0         On-link         127.0.0.1    306
        224.0.0.0        240.0.0.0         On-link     192.168.0.117    266
        224.0.0.0        240.0.0.0         On-link      172.16.100.1    266
        224.0.0.0        240.0.0.0         On-link      172.16.200.1    266
        224.0.0.0        240.0.0.0         On-link        172.16.1.1    261
  255.255.255.255  255.255.255.255         On-link         127.0.0.1    306
  255.255.255.255  255.255.255.255         On-link     192.168.0.117    266
  255.255.255.255  255.255.255.255         On-link      172.16.100.1    266
  255.255.255.255  255.255.255.255         On-link      172.16.200.1    266
  255.255.255.255  255.255.255.255         On-link        172.16.1.1    261
===========================================================================
Persistent Routes:
  None
Run Code Online (Sandbox Code Playgroud)

我首先认为 0.0.0.0 路由的度量标准是罪魁祸首 - 它最初是 6,所以我尝试将其更改为 410,这并没有改变行为。(顺便说一句,我以前从未弄乱过这台机器上的路由表)。然后,我将它与我在 3 个相同网络(172.16.1.0、172.16.100.0 和 172.16.200.0)上的 Hyper-V 2012 R2 机器进行了比较,我注意到 Hyper-V 机器的 0.0 指标也为 6 .0.0 路线,所以我猜这是正常和正确的......

然后我尝试将 172.16.200.0 更改为持久路由,如下所示,但它仍然不起作用。

===========================================================================
Persistent Routes:
  Network Address          Netmask  Gateway Address  Metric
       172.16.200.0  255.255.255.0       172.16.1.1       1
===========================================================================
Run Code Online (Sandbox Code Playgroud)

我还尝试增加指标(我知道更低更受欢迎,但以防万一,嗯?)……当然,没有运气。

在“网络连接”窗口的“高级设置”中,我确认 192.168.0.117 适配器​​在适配器和绑定顺序中是最低的……

所以,在我的头撞了一下之后,我被难住了。显然删除 0.0.0.0 路由会阻止它,但当然它也会阻止我的互联网......

当我的机器尝试访问 172.16.200.0 上的主机时,我到底该如何阻止它尝试通过我的默认网关 192.168.0.1...

http://technet.microsoft.com/en-us/library/cc779122%28v=ws.10%29.aspx(“IP路由表:TCP/IP”)似乎暗示“默认路由通常转发一个IP 数据报(没有匹配或明确的本地路由)到本地子网上路由器的默认网关地址。” 我可以通过这条路线获得多少更明确的信息!

此处的答案Windows 持久路由网关不可用,因此使用默认路由表明这是正常行为 - 添加持久路由时,如果可能,它将尝试使用该路由,但在失败时回退到默认路由。当然,这可能会带来一些非常严重的流量问题,更不用说安全问题(私人信息泄漏到互联网,或者至少是您的 ISP 私人网络……)

一些附加信息:此服务器通常运行 NPS/RRAS - 禁用它,甚至删除它也没有任何作用。另外,我创建了一个全新的 2008 R2 VM,给它两个网卡,一个直接在 192.168.0.0 网络上,另一个在 172.16.200.0 网络上,它做了同样的事情......我希望你能告诉我在这上面花了一些时间。

我已将我的家用路由器设置为将所有 172.16.XX 内容转发回我自己的计算机,但这是一种解决方法......

有什么我想念的吗?也许有些明显?我问的是不可能的吗?

[更新 #1 和 #2]

我已经研究了路由器上的每个配置位,它似乎没有处理任何代理 ARP 请求——它甚至没有任何我可以看到的设置。

我使用 MS Network Monitor 3.4 来测试路由器是否正在响应 ARP 请求,但它们没有。当我尝试 ping 一个不存在的主机并且我没有收到任何 ARP 响应时,我可以看到正在发送 ARP 请求。ping 一个确实存在的主机,自然会给我一个 ARP 响应。此时假设我的路由器没有处理代理 ARP 请求是否安全?

路由器WAS上的路由表如下:

 > route show
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
10.20.21.36     *               255.255.255.255 UH    0      0        0 ppp0
192.168.0.0     *               255.255.255.0   U     0      0        0 br0
default         *               0.0.0.0         U     0      0        0 ppp0
Run Code Online (Sandbox Code Playgroud)

我在下面添加了这些条目作为临时权宜之计 - 它阻止我可怜的“丢失”数据包进入我的 ISP:

172.16.1.0      192.168.0.117   255.255.255.0   UG    1      0        0 br0
172.16.100.0    192.168.0.117   255.255.255.0   UG    1      0        0 br0
172.16.200.0    192.168.0.117   255.255.255.0   UG    1      0        0 br0
Run Code Online (Sandbox Code Playgroud)

[更新 #3 - 添加了 Ubuntu 和 Win8.1 虚拟机路由表]

好的,所以我创建了一个全新的 Ubuntu VM 和一个全新的 Windows 8.1 VM。Ubuntu VM 不会尝试退回到它的 0.0.0.0 路线,但 Windows 8.1 会。我尝试了旧的 ping-a-non-existant-host 并观察了 172.16.1.1 路由器上的流量。它接收来自 Windows 8.1 VM 的 ICMP 请求并将它们传递出去,但它从未看到来自 Ubuntu VM 的任何 ICMP 流量。

Ubuntu VM 表如下:

Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface    MSS   Window irtt
0.0.0.0         172.16.1.1      0.0.0.0         UG    0      0        0 eth0     0     0      0
169.254.0.0     0.0.0.0         255.255.0.0     U     1000   0        0 eth1     0     0      0
172.16.1.0      0.0.0.0         255.255.255.0   U     1      0        0 eth0     0     0      0
172.16.200.0    0.0.0.0         255.255.255.0   U     1      0        0 eth1     0     0      0
Run Code Online (Sandbox Code Playgroud)

Windows 8.1 表如下:

===========================================================================
Interface List
  9...00 15 5d 01 4c 1c ......Microsoft Hyper-V Network Adapter #2
  3...00 15 5d 01 4c 08 ......Microsoft Hyper-V Network Adapter
  1...........................Software Loopback Interface 1
  4...00 00 00 00 00 00 00 e0 Microsoft ISATAP Adapter
 13...00 00 00 00 00 00 00 e0 Microsoft ISATAP Adapter #2
===========================================================================

IPv4 Route Table
===========================================================================
Active Routes:
Network Destination        Netmask          Gateway       Interface  Metric
          0.0.0.0          0.0.0.0       172.16.1.1     172.16.1.101      5
        127.0.0.0        255.0.0.0         On-link         127.0.0.1    306
        127.0.0.1  255.255.255.255         On-link         127.0.0.1    306
  127.255.255.255  255.255.255.255         On-link         127.0.0.1    306
       172.16.1.0    255.255.255.0         On-link      172.16.1.101    261
     172.16.1.101  255.255.255.255         On-link      172.16.1.101    261
     172.16.1.255  255.255.255.255         On-link      172.16.1.101    261
     172.16.200.0    255.255.255.0         On-link      172.16.200.1    261
     172.16.200.1  255.255.255.255         On-link      172.16.200.1    261
   172.16.200.255  255.255.255.255         On-link      172.16.200.1    261
        224.0.0.0        240.0.0.0         On-link         127.0.0.1    306
        224.0.0.0        240.0.0.0         On-link      172.16.1.101    261
        224.0.0.0        240.0.0.0         On-link      172.16.200.1    261
  255.255.255.255  255.255.255.255         On-link         127.0.0.1    306
  255.255.255.255  255.255.255.255         On-link      172.16.1.101    261
  255.255.255.255  255.255.255.255         On-link      172.16.200.1    261
===========================================================================
Persistent Routes:
  None
Run Code Online (Sandbox Code Playgroud)

小智 2

自 Vista 起,故障恢复到默认路由是正常行为,您可以在以下文章中了解这一点: 多宿主 Windows 计算机上的源 IP 地址选择

路由器配置错误导致的环路问题,它使用不同的子网将数据包发送回来,而不是丢弃它们。