UDP打孔超时

时间:2013-02-13 15:12:02

标签: windows-firewall hole-punching

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

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

  • 如何在防火墙关闭之前确定超时?
  • 我是否可以检测到防火墙已关闭防火墙,以便我必须重新发送到打开的数据包?当然,当防火墙关闭时我不会收到任何东西,但这可能有其他原因。

3 个答案:

答案 0 :(得分:4)

以下是我用netcat测量的方法:

在我的Unix主机(Mac OS X Darwin)上,没有防火墙(或Windows防火墙允许netcat“nc”可执行文件在UDP端口上侦听的Windows机器上),我运行一个由可变延迟提供的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 Professional SP1 64位),Windows防火墙上安装了cygwin以提供shell和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:在客户端,我输入:

10
60
120
180
240

并观察到请求 - 响应延迟最多180个工作,240不工作。

示例2:在客户端,我输入:

180
181
182
182

并观察到请求 - 响应延迟最多181个工作,182不工作。

示例3:在客户端,我输入(全部在同一行):

180 180 180 181 181 181 182 182 182 183 183 183

从客户端生成一个UDP请求,然后是由180,181,182或183秒间隔分隔的一系列响应。据观察,最多181个请求 - 响应延迟工作,此外,持续响应(没有新请求),间隔时间长达181秒。

因此防火墙漏洞具有不活动计时器,而不考虑初始响应中的不活动是否延迟,或后续的额外流量。

多台机器上的结果:

  • 在Windows 7 Professional SP1 64位桌面上,UDP响应孔打开181秒。我可能也在测量两个系统之间的网络防火墙,因为它们位于不同的网络上 - 但我认为它们的路由不是防火墙。无论如何,此系统上的Windows防火墙漏洞至少为181秒。
  • 另一台Windows 7 Professional SP1 64位笔记本电脑,同一网段(绝对没有中间防火墙),UDP响应孔打开64秒。

我有兴趣在不同操作系统级别和防火墙配置的其他Windows机器上看到类似的测量结果。

答案 1 :(得分:2)

关于打孔的一些提示:

  1. 在大多数防火墙上(我也假设是Windows防火墙),打孔只允许特定的IP连接。打孔欺骗防火墙/ NAT认为您正在与特定IP通信,因此它允许从该IP返回的数据包。如果你想听任何IP,那么你就不能在没有可以协调连接的桥接计算机的情况下使用打孔。
  2. 防火墙和/或NAT之间的时间可能不同。您不仅需要担心软件防火墙(如Windows防火墙),而且如果有硬件防火墙和/或NAT设备,您也不必担心时间安排。除非您拥有非常特定的网络和软件设置,否则硬编码值不会起作用。检测到防火墙已经关闭了这个洞听起来像个好主意,除了大多数防火墙/ NAT没有办法让你发现他们已经关闭了洞,据我所知,你没有好办法程序来检测它。
  3. 要进行打孔,你将不得不发送没有任何功能的数据包。它们通常是NOP(No OPeration)或KEEP_ALIVE数据包,没有任何目的,如果程序收到一个,它只是丢弃它。
  4. 我的建议是实现客户端程序忽略的KEEP_ALIVE数据包,并让服务器定期向客户端发送KEEP_ALIVE数据包以保持防火墙处于打开状态。这假设您知道客户端的IP,因此您可以向其发送KEEP_ALIVE数据包。如果您还不知道客户端的IP,则必须设置可公开访问的桥接计算机或为您的服务器程序禁用防火墙。 Windows防火墙具有COM API或netsh命令,可用于允许程序侦听连接。对于硬件防火墙/ NAT,您可以尝试使用UPNP。如果这不起作用,那么您可以做的最好的事情是请求用户打开程序的特定端口。

答案 2 :(得分:1)

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

打孔的一些一般提示:

  1. 请勿打扰网络中的任何其他主机。发送包含不会受到伤害的内容的数据包。
  2. 没有必要向主持人发送您希望成为回复发件人的内容。
  3. 没有必要发送到您希望成为发送方的UDP端口。发送到任何UDP端口。丢弃端口(9)应该忽略您发送的任何内容。
  4. 确保您的数据包真的已发送。如果您尝试发送到上次未见过的主机,IP堆栈将使用ARP协议获取MAC地址。如果IP堆栈没有得到ARP响应,它就无法发送和IP数据包,也没有打孔。通过发送到网络广播地址可以避免这个问题。
  5. 确保使用正确的适配器广播地址将洞打到所需的网络。