UDP打孔

时间:2011-01-24 09:02:56

标签: c++ winapi networking udp firewall

我有一些关于用UDP打孔的问题。基于wiki http://en.wikipedia.org/wiki/UDP_hole_punching

1)要在双方(NAT后面的客户端,非NAT的服务器)之间建立UDP会话,客户端只需要向服务器发送数据包,然后允许会话两种方式(发送和接收)通过防火墙?这意味着客户端也可以从服务器接收。

2)UDP Hole punching:两个客户端首先连接到服务器,然后服务器将客户端端口/ IP连接到其他客户端,因此客户端在这些端口上相互发送数据包。这是否正确?

3)如果#2为真,为什么防火墙允许从另一个IP接收数据而不是在该端口上建立连接时使用的IP?听起来像一个很容易被过滤的大安全漏洞?我知道源IP欺骗会欺骗它,但是这个?

提前致谢, 约翰

2 个答案:

答案 0 :(得分:4)

1)是的,使用最合理的防火墙,除非你以非常偏执的模式配置它。

2)不完全是。 This article更详细地解释了它,但其想法是其中一个客户端首先将数据报发送到另一个公共IP。然后丢弃此数据报,但另一个客户端知道它已被发送,因为第一个通过服务器告诉它。然后另一个客户端将数据报发送回第一个数据报到第一个数据报源自的同一个端口。由于第一个客户端的NAT记得有来自该端口的数据包,因此它认为传入的数据报是对第一个数据报的回复。这里的问题是弄清楚哪个公共端口NAT将选择发送第一个数据报,但是大多数NAT以可预测的方式进行,所以它几乎总是正常工作,有时候不是第一次尝试。

答案 1 :(得分:2)

1)是的。但是,如果您正在联系非NAT服务器,则不需要打孔。您的客户端应用程序只是正常运行。

2)是的。

3)有些NAT确实将公共端口限制为仅一个发送器 - 接收器对。如果您需要在这种情况下打孔,您唯一的机会是猜测NAT将为直接连接选择的公共端口。

但是,NAT不是安全功能。因此,接受任何数据包到公共端口不是安全漏洞,因为与客户端直接连接到互联网的简单情况没有区别。