我需要实现一个UDP协议。 PC必须在专用的UDP端口上监听传入的数据包。它也发送数据包(答案)。该应用程序在Windows XP上运行,7,8,...UDP冲孔超时
Windows防火墙阻止传入数据包。这可以通过UDP打孔来避开。所以我必须发送一些不应该伤害的东西。但我想尽可能少地打扰。
- 如何才能确定超时,直到防火墙关闭该洞?
- 我可以检测到防火墙已关闭防火墙,因此必须重新打开打开数据包吗?当防火墙关闭时,我当然不会收到任何东西,但这可能有其他原因。
我需要实现一个UDP协议。 PC必须在专用的UDP端口上监听传入的数据包。它也发送数据包(答案)。该应用程序在Windows XP上运行,7,8,...UDP冲孔超时
Windows防火墙阻止传入数据包。这可以通过UDP打孔来避开。所以我必须发送一些不应该伤害的东西。但我想尽可能少地打扰。
回答我自己的问题:没有办法确定超时。您需要测试Windows 7防火墙用于UDP连接的超时时间。目前的体验显示了4秒的超时时间,但这可能会有所不同。
为打孔的一般提示:
上打孔的一些技巧:
我的建议是实现客户端程序忽略的KEEP_ALIVE包,并让服务器定期向客户端发送KEEP_ALIVE包以保持防火墙的打开状态。这假定您知道客户端的IP,因此您可以发送KEEP_ALIVE数据包。如果您还不知道客户端的IP,那么您必须设置可公开访问的桥接计算机或为您的服务器程序禁用防火墙。 Windows防火墙有一个COM API或netsh命令,您可以使用它们来允许程序监听连接。对于硬件防火墙/ NAT,您可以尝试使用UPNP。如果这不起作用,那么您可以做的最好的事情是请求用户为您的程序打开一个特定的端口。
感谢您的文字。但不幸的是,你错过了如何知道洞何时打开或关闭的问题。 – harper 2013-02-23 19:27:58
这里是我如何衡量这一点,与netcat的:
在我的Unix主机(Mac OS X的达尔文),没有防火墙(或Windows计算机了Windows防火墙允许netcat的 “NC” 可执行对监听UDP端口),我跑与远程客户端提供可变延迟一个UDP服务器:
WINHOST=10.116.140.69
mkfifo f
nc -u -p 2222 $WINHOST 6666 < f | \
(while read secs; do for sec in $secs; do echo sleep $sec 1>&2; sleep $sec; echo SLEPT $sec; echo SLEPT $sec 1>&2; done; done) > f
在我的Windows主机(Windows 7专业版SP1 64位),Windows防火墙,安装Cygwin来提供外壳和netcat,我交互地运行一个UDP客户端:
UNIXHOST=192.168.181.1
nc -u -p 6666 $UNIXHOST 2222
您不必使用cygwin; Windows netcat应该可以正常工作,但命令行可能会有所不同。
然后进入该客户端,我键入一系列测试间隔,观察服务器休眠,然后响应,观察客户端是否获得响应。这些工作:1,2,10,60,120,180。然后这个失败:240继续用180和240
实施例1之间的二进制搜索:在客户端,I型:
10
60
120
180
240
并观察到多达180个作品的请求 - 响应延迟,240不。
实施例2:在客户端,I型:
180
181
182
182
,并观察到181件作品该请求 - 响应延迟,182没有。
实施例3:在客户端,I型(全部在同一行):
180 180 180 181 181 181 182 182 182 183 183 183
,其生成从客户端一个UDP请求,则一系列反应由180分离,181,182,或183秒的间隔。据观察,请求 - 响应延迟多达181次,此外,持续响应(没有新请求)的间隔时间长达181秒。
因此,防火墙漏洞具有不活动计时器,而不考虑不活动是否在初始响应中延迟或在随后的附加通信中。
结果在多台机器:
我很感兴趣在其他Windows机器上看到类似的测量在各种操作系统级别和防火墙配置。
“不需要发送到你想成为发送者的UDP端口” - 取决于NAT类型。对于受限制的Cone NAT来说是正确的,但对于受限制的Cone NAT来说却是如此。 – 2017-03-01 07:45:17