我正在运行 Windows Server 2008 R2,我们有一个应用程序从服务器上的公共 IP 连接(绑定到)127.0.0.1:8334 [连接到侦听 0.0.0.0:8334 的服务]
在 Windows 2003 中,这没有问题。我们可以使用 TCP 从 1.2.3.4 [例如] 顺利连接到 127.0.0.1:8334。
在 Windows 2008 中,我们发现来自公共 IP(例如 1.2.3.4 到 127.0.0.1:8334)的 TCP 连接甚至会失败。但该服务可以接受从 127.0.0.1 到 127.0.0.1:8334 以及从 127.0.0.1 到 1.2.3.4:8334 的连接。
尝试关闭 Windows 防火墙、配置其日志记录等(未显示任何有用的日志条目),但无济于事。这是新网络堆栈的问题吗?
編輯
1.2.3.4 正在尝试连接同一台机器上的 localhost [127.0.0.1]
Hosts 文件是默认的 Windows 2008 主机文件。
环回检查信息,很有趣。试过了……没用。交叉检查以确认我做的一切都正确——我做到了。
我想知道是否有使用 NAT 或其他方式转发端口的解决方案 - 如果我将 127.0.0.1:port 转发到 1.2.3.4:port,这样可以吗?假设应用程序在 0.0.0.0:port 上监听,它将在 1.2.3.4:port 上获取连接
HOSTS 文件确实包含 localhost 127.0.0.1 - 但是,hosts 文件仅用于主机名查找。在这种情况下,我们的应用程序不会查找任何主机名,因为 127.0.0.1 IP 地址被硬编码到其中(而不是 localhost 主机名)。因此 HOSTS 文件在这里不起作用。
至于 1024 以上的端口 [您可能指的是 MaxUserPort 问题?] 我通过尝试简单连接到端口 445 进行了测试 - 从 127.0.0.1 开始工作,但从源 IP 1.2.3.4 连接时不起作用。445 是标准的 Windows 服务,所以应该可以工作!
目前机器上没有运行 NAT 或 RRAS...想知道是否有办法进行重新路由 - 我猜它不会起作用,因为 TCP/IP 堆栈会在数据包到达环回接口进行重新路由之前拒绝它。
我检查过的路由打印似乎没问题,公共 IP 首先路由,然后最后 127.0.0.0 网络掩码 255.255.255.0 和 127.0.0.1 网络掩码 255.255.255.255 都进行环回。
编辑 看来我已经找到问题原因的答案了。我使用了 eventvwr.msc,启用了 Winsock 日志记录,关闭了其他服务,刚刚尝试了这个连接测试。当我在 Google 上搜索时,出现了一个错误,该错误以十六进制形式映射到 STATUS_INVALID_ADDRESS_COMPONENT。
这让我想到: http://social.msdn.microsoft.com/Forums/en-US/wfp/thread/d7cb6138-3f67-4467-a068-8325f56739ba
这证实了这是 WFP 针对 Vista/7/Server 2008 [Windows 过滤平台] 的设计变更。
[查看 Anupama Vasanth 的回复]
看来我必须选择一条艰难的路线并重写代码 [很难,因为这意味着要与经理打交道!]
感谢您帮助我定位/确认问题!
答案1
别忘了,在 Windows 2008 中,防火墙默认处于打开状态。这可能会阻止任何和所有流量,即使是在环回接口上。此外,如果您绑定到 0.0.0.0,则您将接受所有接口上的连接。防火墙仍然会阻止这种情况。您可以尝试在测试时关闭防火墙……然后重新打开它。我在 127.0.0.1 上开发的各种程序连接时没有遇到任何问题。
答案2
尝试在 Vista/win2k8 及更高版本中连接到 127.0.0.2 - 听起来很奇怪,但确实有效。过去曾有过积极的结果
答案3
我非常确定它与环回检查安全功能有关,尽管我无法深入了解它是如何实现的,只能知道如何克服它:
http://chillicode.wordpress.com/tag/loopback-check/
对于“适用于”Windows 2008,请参阅http://support.microsoft.com/kb/896861
那么,您的 HOSTS 文件中到底是什么?我没有 W2008。您的意思是那里没有“127.0.0.1 localhost”吗?
我也确实在某处读到过,默认的 W2008 设置不允许与大于 1024 的端口进行通信。
您可以通过以下方式直接向 MS 团队提交有关 MS Windows Server 2008 的反馈
他们会回复
如果您尝试通过注册表编辑关闭“环回检查”,则需要重新启动。另一种方法 - 不需要。
NAT 内部机器?127.0.0.1 没有被转发或路由,我相信是的,它是内部的,你可以拔掉网卡,你的 1.2.3.4 将消失,但 127.0.0.1 将继续存在。
你的输出是什么(运行-->cmd-->路由打印)?
我还想着还有一个时刻,尽管我不知道该如何把它串联起来。
127.0.0.1 是本地主机(接口),它是单标签名称并被视为本地。1.2.3.4 是非单标签名称。
可能的问题在于,这样的名称可能被视为外部的
您能否分别尝试:
是否禁用(如果已启用,则启用)网络适配器上的 IPv6?
将 1.2.3.4 的一些单标签名称放入 HOSTS 文件中?
1.2.3.4 与 127.0.0.1:8334 通信失败时,eventvwr.msc 中对应的事件描述、EventID 等是什么?
“445 是标准的 Windows 服务”
它适用于 TCP/IP 上的 SMB-direct 吗?适用于文件共享吗?CIFS 吗?
不太可靠... 它不断受到 MS 修补程序的攻击。阅读:
(“升级到 Windows Server 2008 后,跨子网的 NetBIOS 浏览可能会失败”) -http://blogs.technet.com/b/networking/archive/2008/07/25/netbios-browsing-across-subnets-may-fail-after-upgrading-to-windows-server-2008.aspx?wa=wsignin1.0
然后,
- http://social.technet.microsoft.com/Forums/en-US/winserverfiles/thread/a0c533f5-100d-4a5f-91d3-bbcb5d47aaf0 (“Windows Server 2008 不使用 CIFS 连接到网络共享”)告诉:
“我们在 Vista SP2 计算机尝试访问 Windows Server 2008 SP1 或 SP2 文件共享时遇到了与前面所述的相同问题。文件共享服务受高级安全 Windows 防火墙的保护,使用预定义的文件共享 (SMB) 规则请求安全连接”