2011-01-24 76 views
6

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

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

2)UDP打孔:两个客户端首先conenct到服务器,然后服务器对上其它客户的客户端端口/ IP,所以客户端发送数据包到对方的端口。这是否合适?

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

由于提前, 约翰

回答

4

1)是的,用最合理的防火墙,除非你在极度偏执的方式进行配置。

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

2

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

2)是的。

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

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

+0

所以私有端口(在应用程序中的bind()的端口)是从公共端口(这是在实际发送)不同。当客户端连接到服务器时,服务器会看到公共端口还是私有端口?我需要将公共端口而不是私人端口转发给其他客户端以允许他们进行通信吗? – KaiserJohaan 2011-01-24 11:16:19

+0

@KaiserJohaan是的,私有端口与公共通信无关 – phihag 2011-01-24 12:17:10