我们最近在我们的路由器发生故障后发现了一个问题,那就是我们的Windows 2008 Boxes在故障恢复之后没有开始与主路由器通话。
当我们做了一些挖掘,他们仍然有从辅助路由器的ARP条目。 根据TechNet博客,这是通过devise:
首先,如果接收到ARP广播,Windows Vista或Windows Server 2008将不会更新邻居caching, 除非它是接收方的广播ARP请求的一部分 。 这意味着当在Windows Vista和Widows Server 2008的networking上发送免费ARP时,如果存在IP地址冲突,这些系统将不会使用不正确的信息更新caching。
其次,如果机器不能再与目前在caching中的机器进行通话,那么窗口邻居caching(arp-cache)似乎只会被更新。 它不发送偶尔的ARP请求,以确保caching不陈旧。 虽然在最初的故障切换期间这不是问题,但在两个盒子都存活的故障恢复过程中,这会导致窗口继续与辅助盒子通话。
有没有办法强制Windows 2008接受免费ARP请求?
经过testing,似乎Hotfix 2582281解决了这个问题。 您可以获得修补程序而不必通过使用其修补程序请求页面来支持支持。
我使用arping
和未打补丁的Windows 2008 R2运行了这个testing。 我添加了一个辅助IP,64.34.119.80,在同一个networkingL2段的机器。 然后我从networking的不同机器发出以下命令( sudo arping -U 64.34.119.80 -I bond0 -c1
)。 之后,我看到它在wireshark中收到arp后,从窗口框中ping了64.34.119.80。 然后我应用了修补程序并重复testing。
而且,arping命令似乎不需要使用单播MAC地址,而是使用广播MAC,因为这是我testing中忽略的唯一GARPtypes。
补丁之前:
在这个wireshark捕获中,GARP请求之后的ping 不会被发送到GARP来自的MAC目的地,所以你可以看到GARP被忽略。
补丁后:
在这个testing中,在修补程序之后,GARP请求似乎被认可,因为ping被发送到GARP来自的MAC地址。
所以从这些testing看来,修补程序2582281修复了被忽略的GARP广播问题。
当我刚刚研究自己的TCPIP问题时,偶然发现了这个非常有趣的修补程序:
http://support.microsoft.com/kb/2582281
原因:
出现此问题的原因应用程序服务器的TCP / IP堆栈错误地忽略免费地址parsing协议(ARP)请求。
这听起来很像你遇到的事情。 这也是一个全新的修补程序,2011年7月22日发布,所以当你第一次遇到它时不在身边。
试试netsh interface ipv4 set interface x basereachable=y
其中x是接口索引,y是所需的ARP超时(以毫秒为单位)。 请记住使用具有pipe理员权限的命令提示符执行此操作!
你使用什么第一跳冗余协议?
我知道这并不直接回答你的问题,然而VRRP(及其专有的前置服务器,HSRP)使用一个共享的MAC地址,当主路由器发生变化时,该地址被翻转到新的交换机端口。 这完全满足了免费ARP的需要。
Prereqs
1. WinPCAP 4.0.1(4.1.2版本不起作用)
– http://www.winpcap.org/archive/4.0.1-WinPcap.exe(Windows版本)
2. Wireshark 1.6.7
3.由于arping限制,IPv6networking接口上禁用了IPv6
4. arping
– http://mathieu.carbou.free.fr/pub/arping/2.06/arping.zip(Windows Binary)
执行
1.获取Inteface名称
– “E:\ Program Files \ Wireshark \ tshark.exe”-D
– 从Wireshark界面的详细信息
2.执行arping,发送ARP免费请求
– arping.exe -A -i \ Device \ NPF_ {4399F778-AF25-4B6D-AFFB-A1F2C7DFA667} 10.20.30.50 -c 3 -S 10.20.30.50
10.20.30.50是你想要通告给networking(路由器)的ipaddress,
我在http://blog.serverfault.com/post/windows-2008-and-broken-arp/的链接上遇到了这个问题。
如果你问在stackoverflow你可能有更快的修复。
嗅探GARP数据包并运行arp -s inet_addr eth_addr。
如果在您的局域网上有最危险的机器,请不要这样做。