【问题标题】:How would one connect two clients behind firewalls?如何在防火墙后面连接两个客户端?
【发布时间】:2010-11-21 00:23:08
【问题描述】:
使用 Live Messenger 等即时消息应用程序或 Google Talk 桌面客户端时,计算机可以在彼此之间传输文件。我不能肯定地说,但我相当肯定计算机之间传输的数据不会通过微软或谷歌的 IM 服务器,而是两台装有 IM 软件的计算机直接相互通信。我想知道客户端之间是否或如何建立这种直接连接,以及我将如何自己实现类似的东西。
我有一些使用个人网络的经验,但我只了解客户端-服务器关系,其中服务器始终在侦听(并且端口不会被防火墙阻止)并且客户端在需要数据时向服务器发出请求.
【问题讨论】:
标签:
networking
firewall
data-transfer
【解决方案1】:
如果我要实现这个,我会考虑几个选项。
让防火墙将给定端口转发到网络内的 PC。这将使您可以从外部世界连接到服务器。
让防火墙后的客户端连接到防火墙外的可见服务器。
简而言之,对话中的至少一方需要对另一方可见(服务器),以便他们可以连接到它。无论如何,一旦建立连接,客户端和服务器将能够毫无问题地来回通信。
【解决方案2】:
有一种被很多客户使用的方法叫做“针孔”:
我向你发送了一个 UDP 数据包,这在我的防火墙上戳了一个洞(允许 UDP 数据包,假设是我的防火墙的响应,由你发送并由我接收)。该数据包会被您的防火墙丢弃。
你向我发送了一个 UDP 数据包,在你的防火墙上戳了一个洞。该数据包应该会到达我,然后我可以发送另一个数据包到达您那里,我们可以通过我们的防火墙通过 UDP 进行通信。
【解决方案3】:
做大多数木马会做的事:
反向连接
编辑:
如果有两台机器位于防火墙后面,您将需要某种第三个“代理”
【解决方案4】:
我使用了一个名为Hamachi 的程序,它有点像点对点 vpn(虚拟网络到网络)。然后我按原样编写客户端服务器应用程序。这是一种快速获得通过 Internet 连接的功能的方法,而无需处理 NAT 路由器所需的技巧。
如果您需要“正确”执行此操作,常用方法之一是udp hole punching。当您发送 Web 请求时,您的防火墙知道期望返回数据作为响应。诀窍是客户端 A 和客户端 B 都联系 Internet 上的服务器。服务器将客户端 A 发出的请求的详细信息传递给客户端 B,反之亦然。一旦建立了初始连接,即使主服务器不再存在,它们也可以继续通信。
【解决方案5】:
如果两个客户端都位于没有被针孔的防火墙后面并且没有使用 VPN 软件,那么它们是通过第 3 方服务器进行通信的。期间。