Windows 2008 Server上的死网关检测

我们最近实现了HAProxy for stackoverflow.com。 我们决定使用TProxy来维护连接客户端的源地址,所以我们的日志和依赖于客户端IP地址的其他IIS模块不需要修改。 因此,数据包仿冒来自外部互联网IP地址,实际上它们来自本地networking上的本地192.168.xx HAProxy IP。

我们的两台networking服务器都有两个网卡 – 公共互联网上的一个具有静态IP,DNS和默认网关的可路由B类地址,以及一个configuration了默认网关的私有不可路由C类地址,指向HAProxy的专用IP。 HAProxy有两个接口 – 一个公共接口和一个私有接口,负责在接口之间透明地路由数据包,并将stream量引导至相应的Web服务器。

以太网适配器Internet:

   说明。  。  。  。  。  。  。  。  。  。  。  :网卡#1
    DHCP已启用。  。  。  。  。  。  。  。  。  。  。  :没有
   自动configuration已启用。  。  。  。  :是的
    IPv4地址。  。  。  。  。  。  。  。  。  。  。  :69.59.196.217(优选)
   子网掩码 。  。  。  。  。  。  。  。  。  。  。  :255.255.255.240
   默认网关 。  。  。  。  。  。  。  。  。  :69.59.196.209
    DNS服务器。  。  。  。  。  。  。  。  。  。  。  :208.67.222.222
                                        208.67.220.220
    NetBIOS over Tcpip。  。  。  。  。  。  。  。  :启用

以太网适配器专用本地

   说明。  。  。  。  。  。  。  。  。  。  。  :网卡#2
    DHCP已启用。  。  。  。  。  。  。  。  。  。  。  :没有
   自动configuration已启用。  。  。  。  :是的
    IPv4地址。  。  。  。  。  。  。  。  。  。  。  :192.168.0.2(首选)
   子网掩码 。  。  。  。  。  。  。  。  。  。  。  :255.255.255.0
   默认网关 。  。  。  。  。  。  。  。  。  :192.168.0.50
    NetBIOS over Tcpip。  。  。  。  。  。  。  。  :启用

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

我们还设置了这两个registry项:

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

大约每天两次,我们看到一个问题,其中一个networking服务器无法联系DNS或连接到公共互联网上的任何其他服务器。

我们怀疑死亡网关检测是错误地检测到公共网关中断,并将所有stream量切换到此时没有DNS访问的专用网关,但无法validation这一点。

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

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

  3. 如果没有,还有其他原因,我们失去了解决DNS或短时间连接的能力?

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

我怀疑这个function是在Windows Vista中推出的Auto-Tuning。 尝试在提升的命令提示符下执行以下操作(并重新启动):

 netsh int tcp set global autotuninglevel = disabled

更新( 2009年9月13日美国东部时间7:58PM增加

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

 netsh trace start scenario = NetConnection maxSize = 512

(例如:启动NetConnection跟踪scheme,最大跟踪日志大小为512MB)

您可以在networking监视器3.3中打开生成的跟踪,只要确保安装了最新的parsing器 。

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

我们没有花费大量的时间解决这个问题,而是select使HAProxy实例将stream量路由到出站网关,并将两个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 

现在只有一个默认网关可以消除我们的问题,因为不再使用缺省网关检测。

我会质疑为什么你甚至需要将默认网关改为HAproxy。 一般来说,除非您指向高度可用的N + 1设置,否则网关IP可能会在发生故障时将故障切换到另一台路由器/机器,因此一般不应该更改默认网关。 如果您的HAproxy机器发生了问题,并且您没有任何带外访问,那么Web服务器将会从互联网上下载。

因为我相信你可能会这样做的原因是因为你在你的设置中使用Tproxy来使客户IP地址出现在你的日志而不是代理服务器的IP,我build议你这样做

  1. 将“forwardfor …”选项添加到您的HAproxyconfiguration中
  2. 安装x-forwarded-for ISAPI筛选器
  3. 从您的设置中删除tproxy
  4. 将默认网关更改回与之前直接连接互联网的网关相同的网关

我没有一个Windows机器来testing这个,但我相信它应该会导致所需的效果,而不会造成不必要的连接性损失。

当涉及到互联网访问(通常)时,默认网关应该只被用来表示到INTERNET的path。 如果定义了多个默认网关,则OS路由器不能决定使用哪一个,如果一个默认网关指向一个通路(例如,您的多网段LAN),那么在那里转发到Internet的数据包是不打算做。