【问题标题】:UDP hole PunchingUDP打孔
【发布时间】:2011-06-14 09:23:43
【问题描述】:

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

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

2) UDP 打洞:两个客户端首先连接到服务器,然后服务器将客户端端口/ip 提供给其他客户端,因此客户端在这些端口上相互发送数据包。这对吗?

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

提前致谢, 约翰

【问题讨论】:

    标签: c++ winapi networking udp firewall


    【解决方案1】:

    1) 是的,使用最合理的防火墙,除非您将其配置为极其偏执的模式。

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

    【讨论】:

    • 据我了解,用户发送数据时实际上使用了两个不同的端口;首先是他绑定的端口(客户端的“私有”端口)和他发送的实际端口(客户端的“公共”端口)。所以我需要告诉每个客户其他客户公共端口是什么,如果他们尝试与他们的私人端口通信,它不会起作用? (例如我将所有端口绑定()到12340,其他客户端不能只向其他客户端IP + 12340发送东西?)
    • @Kaiser,通常它不起作用。您必须弄清楚哪个公共端口映射到您的私有端口。据我了解,它是通过首先从这个私有端口向服务器发送一些东西来完成的,然后服务器将这个端口告诉双方。但仍然值得尝试使用私有 IP 与私有端口通信。如果两个客户端意外地位于同一个 NAT 之后,这样它们就可以通过 LAN 进行通信,这将起作用。
    【解决方案2】:

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

    2) 是的。

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

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

    【讨论】:

    • 所以私有端口(应用程序中的bind()端口)不同于公共端口(实际上是发送的)。当客户端连接到服务器时,服务器会看到公共端口还是私有端口?我是否需要将公共端口而不是私有端口中继到其他客户端以允许它们通信?
    • @KaiserJohaan 是的,私有端口与公共通信无关
    猜你喜欢
    • 2014-10-17
    • 2019-04-11
    • 2012-11-30
    • 2019-01-13
    • 2011-06-05
    • 2013-01-29
    • 2012-02-26
    • 2011-10-11
    • 2012-02-12
    相关资源
    最近更新 更多