2013-02-13 90 views
5

我需要实现一个UDP协议。 PC必须在专用的UDP端口上监听传入的数据包。它也发送数据包(答案)。该应用程序在Windows XP上运行,7,8,...UDP冲孔超时

Windows防火墙阻止传入数据包。这可以通过UDP打孔来避开。所以我必须发送一些不应该伤害的东西。但我想尽可能少地打扰。

  • 如何才能确定超时,直到防火墙关闭该洞?
  • 我可以检测到防火墙已关闭防火墙,因此必须重新打开打开数据包吗?当防火墙关闭时,我当然不会收到任何东西,但这可能有其他原因。

回答

1

回答我自己的问题:没有办法确定超时。您需要测试Windows 7防火墙用于UDP连接的超时时间。目前的体验显示了4秒的超时时间,但这可能会有所不同。

为打孔的一般提示:

  1. 请勿打扰网络中的任何其他主机。发送包含不伤害内容的数据包。
  2. 没有必要发送给主机,你想成为你的回应的发件人。
  3. 没有必要发送到您希望成为发件人的UDP端口。发送到任何UDP端口。有一个丢弃端口(9),应该忽略你发送的任何东西。
  4. 确保你的包真的被发送。如果您尝试发送给上一次没有看到的主机,则IP堆栈将使用ARP协议来获取MAC地址。如果IP堆栈没有得到ARP响应,则它不能发送和IP包,并且没有打孔。这个问题可以通过发送到网络广播地址来规避。
  5. 请确保您使用正确的适配器的广播地址为需要的网络打孔。
+0

“不需要发送到你想成为发送者的UDP端口” - 取决于NAT类型。对于受限制的Cone NAT来说是正确的,但对于受限制的Cone NAT来说却是如此。 – 2017-03-01 07:45:17

2

上打孔的一些技巧:

  1. 在大多数防火墙(我假设Windows防火墙以及)打孔只允许特定的IP连接。打孔技巧会让防火墙/ NAT认为您正在与特定IP进行通信,因此它允许从该IP返回数据包。如果你想听任何IP,那么如果没有可以协调连接的桥接计算机,就不能使用打孔功能。
  2. 防火墙和/或NAT之间的时间可能会有所不同。您不仅需要担心软件防火墙(如Windows防火墙),而且如果有硬件防火墙和/或NAT设备,则不必担心该时间。除非你有非常特定的网络和软件设置,否则对一个值进行硬编码是行不通的。检测到防火墙已关闭该洞听起来像一个好主意,除了大多数防火墙/ NAT无法检测到他们已关闭该洞并且据我所知,对您而言没有好方法程序来检测它。
  3. 做孔打孔,你将不得不发送没有功能的数据包。它们通常是没有目的的NOP(无操作)或KEEP_ALIVE包,如果某个程序收到一个包,它只是丢弃它。

我的建议是实现客户端程序忽略的KEEP_ALIVE包,并让服务器定期向客户端发送KEEP_ALIVE包以保持防火墙的打开状态。这假定您知道客户端的IP,因此您可以发送KEEP_ALIVE数据包。如果您还不知道客户端的IP,那么您必须设置可公开访问的桥接计算机或为您的服务器程序禁用防火墙。 Windows防火墙有一个COM API或netsh命令,您可以使用它们来允许程序监听连接。对于硬件防火墙/ NAT,您可以尝试使用UPNP。如果这不起作用,那么您可以做的最好的事情是请求用户为您的程序打开一个特定的端口。

+0

感谢您的文字。但不幸的是,你错过了如何知道洞何时打开或关闭的问题。 – harper 2013-02-23 19:27:58

4

这里是我如何衡量这一点,与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 7专业SP1 64位桌面,UDP响应孔打开181秒。有可能我也在测量两个系统之间的网络防火墙,因为它们位于不同的网络上 - 但我认为它们没有防火墙。无论如何,该系统上的Windows防火墙漏洞至少需要181秒。
  • 另一台Windows 7 Professional SP1 64位笔记本电脑,同一网段(绝对没有插入防火墙),UDP响应孔打开了64秒。

我很感兴趣在其他Windows机器上看到类似的测量在各种操作系统级别和防火墙配置。

+0

这太棒了!像这样的回应是让SO如此令人难以置信的原因。我可以花费相当多的时间来开发和重新创建功能相当的东西,但现在我不必这样做。谢谢,Liudvikas – Cameron 2016-10-11 19:47:52

+0

新访问者,不要忘记禁用您的Linux/Unix防火墙,否则这将无法正常工作。 – Cameron 2016-10-11 20:04:40