我有一个基于 TcpClient
和 TcpListener
的 Windows 服务在我网络上的两台机器上运行。客户端和服务器节点都从相同的 Windows 服务运行。该服务作为 Local System
运行,PC01
是 Win7 x64,PC02
是 Win7 x86。
在从客户端到服务器的连接尝试期间,应用程序抛出 SocketException
10060(连接超时),我发现应用程序的自动防火墙配置代码生成的 Windows 防火墙异常不允许要通过的 TCP 流量。
退后一步,我在 PC01
上按顺序尝试了以下测试,并永久禁用了 PC02
上的防火墙以将其作为变量删除:
- 禁用
PC01
上的防火墙 - 这有效。 - 在
PC01
上启用防火墙并手动添加了一个异常(exception)以允许端口12345
上的所有入站TCP
流量- 这奏效了。 - 进一步限制异常(exception)以仅允许来自本地子网的远程流量 - 这行得通。
- 进一步限制异常(exception)以仅允许(所有)服务 - 这有效。
- 通过从服务列表中选择或输入服务短名称进一步限制允许特定服务的异常(exception) - 这失败。
- 尝试通过选择
myservice.exe
可执行文件来限制特定服务的异常 - 这失败了。
当异常仅限于特定服务时,我的 Windows 服务有什么问题会阻止它工作?是否有我应该注意的 Windows 服务警告?开放所有服务的端口是唯一的解决方案吗?
编辑:我使用 netstat -a -n -b
收集有关事件连接和监听端口的信息。以下摘录详细介绍了有关我的服务的信息:
Active Connections
Proto Local Address Foreign Address State
TCP 0.0.0.0:12345 0.0.0.0:0 LISTENING
[myservice.exe]
...
UDP 0.0.0.0:12344 *:*
[myservice.exe] (listening for UDP broadcast packets)
...
UDP 0.0.0.0:62794 *:*
[myservice.exe] (this is an outbound broadcast packet)
感谢大家提供的任何见解。
最佳答案
为了选择一个特定的可执行文件来工作,可执行文件的路径必须与防火墙期望的路径相匹配。显然,出于某种原因,防火墙 GUI 正在转换路径,因此它是相对于 %USERPROFILE%
的;我怀疑这是 Windows 中的错误。
(如果我没记错的话,防火墙通常可以处理使用环境变量的路径,例如 %SystemRoot%
,但显然每个用户的环境变量将不起作用,因为防火墙规则未在正确的用户上下文中进行评估。)
关于c# - Windows 服务(TCP 客户端/监听器)防火墙异常阻止流量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32596739/