Windows 2008 Server 上的失效网关检测

Windows 2008 Server 上的失效网关检测

我们最近为 stackoverflow.com 实施了 HAProxy。我们决定使用 TProxy 来维护客户端连接的源地址,这样我们的日志和其他依赖于客户端 IP 地址的 IIS 模块就不需要修改了。因此,这些数据包被欺骗,好像它们是来自外部互联网 IP 地址,而实际上它们来自我们本地网络上的本地 192.168.xx HAProxy IP。

我们的两个 Web 服务器都有两个 NIC - 一个是公共互联网上的可路由 B 类地址,具有静态 IP、DNS 和默认网关;另一个是私有不可路由 C 类地址,配置了指向 HAProxy 私有 IP 的默认网关。HAProxy 有两个接口 - 一个是公共接口,一个是私有接口,负责在接口之间透明地路由数据包,并将流量引导到适当的 Web 服务器。

以太网适配器互联网:

   描述.................:网卡#1
   DHCP 已启用。。。。。。。。。。:否
   自动配置已启用。。。:是
   IPv4 地址。。。。。。。。。。。。:69.59.196.217(首选)
   子网掩码........................................................................................................: 255.255.255.240
   默认网关................: 69.59.196.209
   DNS 服务器...............: 208.67.222.222
                                       208.67.220.220
   Tcpip 上的 NetBIOS。。。。。。。。:已启用

以太网适配器私有本地:

   描述 . . . . . . . . . . . . : 网卡 #2
   DHCP 已启用。。。。。。。。。。:否
   自动配置已启用。。。:是
   IPv4 地址。。。。。。。。。。。。:192.168.0.2(首选)
   子网掩码.......................................................................................................................: 255.255.255.0
   默认网关................: 192.168.0.50
   Tcpip 上的 NetBIOS。。。。。。。。:已启用

我们已经禁用了每台 Web 服务器上的自动度量,并为可路由的公共类 B 分配了度量 10,为我们的私有接口分配了度量 20。

我们还设置了以下两个注册表项:

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters]
"DeadGWDetectDefault"=dword:00000000

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters]
"EnableDeadGWDetect"=dword:00000000

大约每天两次,我们会发现一个问题:某个 Web 服务器无法联系 DNS 或无法与公共互联网上的任何其他服务器建立连接。

我们怀疑死网关检测错误地检测到公共网关上的中断,并将所有流量切换到此时没有 DNS 访问权限的私有网关,但无法验证这一点。

  1. 有没有办法知道死网关检测是否正在运行,或者甚至是 Windows 2008 服务器中的一个选项?

  2. 如果是这样,有没有办法在 Windows 2008 服务器中禁用死网关检测?

  3. 如果不是,是否存在其他原因导致我们短时间内失去解析 DNS 或连接的能力?

答案1

这些“死网关检测”DWORD 在 Windows Server 2008 上毫无用处。它们存在的唯一原因是出于兼容性原因。TCP/IP 驱动程序和 Windows 路由器组件不再查找这些值。

我怀疑此功能已集成到 Windows Vista 中首次推出的自动调谐功能中。尝试在提升的命令提示符中执行以下操作(然后重新启动):

netsh int tcp 设置全局自动调整级别 = 已禁用


更新 (添加于 2009 年 9 月 13 日,美国东部时间晚上 7:58

如果这不起作用,我们将需要更多诊断输出。使用 NetConnection 或 LAN 方案启动(循环)跟踪,并让它继续运行,直到问题发生。

netsh 跟踪启动场景 = NetConnection maxSize = 512

(示例:启动 NetConnection 跟踪场景,最大跟踪日志大小为 512MB)

您可以在网络监视器 3.3,只需确保安装最新解析器

答案2

我们无法得出关于为什么我们无法控制死网关检测行为的确切结论。

我们不想花大量时间来解决此问题,而是选择让 HAProxy 实例将流量路由到出站网关,并将两个 Web 服务器的默认网关设置为 haproxy 的 IP,并删除内部网关地址。

  [ soweb1 ] 69.59.196.220, GW=69.59.196.211 [haproxy]
       |
       +---- [haproxy] 69.59.196.211, GW 69.59.196.209
       |
    [ gw ] 69.59.196.209

现在只有一个默认网关,这消除了我们的问题,因为不再使用死默认网关检测。

答案3

我会质疑你为什么需要将默认网关更改为 HAproxy。通常,你根本不应该更改默认网关,除非你将其指向高可用性 N+1 设置,在这种情况下,如果发生故障,网关 IP 可以故障转移到另一台路由器/机器。如果你的 HAproxy 机器发生故障,而你没有任何带外访问权限,那么 Web 服务器就会从互联网上掉下来。

我认为你这样做的原因可能是因为你在设置中使用了 Tproxy,使客户端 IP 地址出现在你的日志中,而不是代理服务器的 IP,我建议你改为这样做

  1. 将“option forwardfor ...”添加到您的 HAproxy 配置中
  2. 安装x-forwarded-for ISAPI 过滤器
  3. 从你的设置中删除 tproxy
  4. 将默认网关更改回之前直接连接互联网时使用的网关

我没有 Windows 机器来测试这个,但我相信它应该会产生预期的效果,而不会出现不必要的连接损失。

答案4

当涉及到互联网访问时(通常),默认网关永远只能用于表示通往互联网的路径。如果您定义了多个默认网关,则 OS 路由器无法决定使用哪一个,并且如果一个默认网关指向死胡同(例如您的多段 LAN),那么转发到那里的互联网数据包将无法成功。

相关内容