2015-09-15 50 views
2

我有一个TcpClientTcpListener基于Windows服务在我的网络上的两台机器上运行。客户端和服务器节点都使用相同的Windows服务。服务运行为Local SystemPC01是Win7 x64,PC02是Win7 x86。Windows服务(TCP客户端/侦听器)防火墙例外块流量

从客户端到服务器的连接尝试期间,应用程序抛出了SocketException 10060(连接超时),并且我发现由应用程序的自动防火墙配置代码生成的Windows防火墙例外不允许TCP流量通过。

退一步,我想下面的测试顺序上PC01PC02防火墙永久禁用删除它作为一个变量:

  1. 禁用防火墙PC01 - 这个工作。
  2. 手动启用防火墙PC01手动添加了一个例外,以允许端口12345上的所有入站TCP流量 - 此工作。
  3. 进一步限制例外,只允许来自本地子网的远程流量 - 这有效。
  4. 进一步限制例外,只允许(所有)服务 - 这有效。
  5. 进一步限制例外情况,通过从服务列表中选择或输入服务短名称来允许特定服务 - 此失败。
  6. 试图改为通过选择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) 

感谢大家的任何见解,你可以提供。

+0

我已经发布了这个SO而不是SF,因为我认为它必须与我的特定服务有关。 – khargoosh

+0

您可以使用'netstat -a -n -b'来查看侦听端口和相关的可执行文件;它是在12345端口上侦听的可执行文件吗? –

+0

@HarryJohnston谢谢你 - 是的,我的可执行文件出现在活动连接列表中,既在预期的TCP端口上,也在UDP端口上,我也打开了。我会将这些信息添加到问题中。 – khargoosh

回答

1

为了选择一个特定的可执行文件来工作,可执行文件的路径必须匹配防火墙所期待的路径。显然,防火墙GUI出于某种原因正在转换路径,以便相对于%USERPROFILE%;我怀疑这构成了Windows中的一个错误。 (如果我没有记错的话,防火墙通常可以处理使用环境变量的路径,例如%SystemRoot%,但显然每个用户的环境变量将不起作用,因为防火墙规则不在正确的用户的上下文)。

+0

我以编程方式添加防火墙例外,所以我将在运行时简单地确定服务的路径,并使用它来代替服务短名称。谢谢哈利! – khargoosh

+0

经过进一步测试,结果证明对于以'Local System'运行的服务,'%USERPROFILE%'评估为'C:\ Windows \ ServiceProfiles \ LocalService'。 – khargoosh