通过使用第 3 方建立连接绕过防火墙

Posted

技术标签:

【中文标题】通过使用第 3 方建立连接绕过防火墙【英文标题】:Bypassing a Firewall by using a 3rd party to establish the connection 【发布时间】:2011-08-09 05:08:13 【问题描述】:

我正在开发一个程序,该程序需要能够雄辩地处理防火墙,同时允许两个客户端之间直接通信。

我正在考虑类似于 Skype 的东西,其中第三方用于在两个用户之间建立连接,但一旦建立连接,就不会将任何实际数据发送到第三方。

我知道几乎所有防火墙都会阻止所有未经请求的传入流量,但是只要内部程序首先进行通信,就可以很容易地让程序建立连接。我不明白的是如何能够直接在两个客户端之间建立连接。

我怎样才能实现这样的东西?对于这种技术的名称,是否有任何适当的术语?一个客户端必须用 Java 编写,但服务器和其他客户端几乎可以使用任何我想要的语言。

如果这个问题已经被问过,我提前道歉,我试着环顾四周,但我觉得我可能没有使用正确的关键字来找到它。

【问题讨论】:

【参考方案1】:

我认为您要查找的术语是“NAT traversal”。它与防火墙无关,更多的是关于克服到达 NAT 设备另一(私有)端的特定节点的困难(例如,电缆调制解调器,其中 LAN 端通常被分配一些不可路由的地址范围,如 @ 987654323@)

一种可能适合您的技术是UDP hole punching。每个端点都可以建立到第三方服务器的传出连接,每个端点的 NAT 设备将打开端口以允许返回流量通过防火墙并将其路由到每一侧的适当 LAN 节点。端点通过第三方服务器交换端口信息,然后重新使用它们刚刚通过 NAT 设备“打孔”的“漏洞”,从那时起直接相互通信。

【讨论】:

UPD 遍历是最容易实现的技术。做的工作,但没有多余的装饰。 然而,如前所述,有几个 NAT 路由器和防火墙只支持对称 NAT,因此当两个客户端无法通过路由器/防火墙打孔时,您确实需要有一台服务器作为后备。在这种情况下,他们必须通过服务器进行通信。您也可以像 Skype 一样,将一些 NAT 路由器薄弱的倒霉客户端提升为超级节点,并使用它来中继流量。确保您在 EULA 中隐藏了小字,说明您有权这样做;)【参考方案2】:

就像 Jim 所说的那样,它是 Traversal NAT 或 STUN。有一个Java实现,项目不再维护,但你可以用它来学习。

http://nutss.gforge.cis.cornell.edu/stunt.php

【讨论】:

是的,这是 STUN。但请注意,康奈尔项目中的代码无法运行,需要大量返工(我从作者本人那里得到的信息)。您还可以在在线阅读的实用 JXTA II 中了解 NAT 遍历。【参考方案3】:

这取决于你想要什么!

如果你希望它只在大约 85% 的时间里工作,你可以使用 STUN 服务器! 这是一些免费的列表:

https://gist.github.com/zziuni/3741933

但是对于 100%,您还需要实现一个 TURN 服务器(中继服务器),这非常昂贵!因为你所有的流量都将通过你的服务器并被中继到客户端你可以看到https://www.twilio.com/stun-turn看看它有多贵,你也可以部署你自己的最适合我的是https://code.google.com/p/rfc5766-turn-server/

但这只是冰山一角!!!!!!!!!

现在您知道如何在客户端之间发送交换数据了! 但是您可以使用信令服务器来创建通信会话,因为当我想给您打电话时,您必须收到通知说,我正在尝试给您打电话。

那么如果我们接听电话,我们仍然需要交换我们将如何通话!为什么因为也许我可以 p2p 但你不能,所以我们必须使用中继服务器。下一步是说我们要发送什么,在所有这些之后我们开始正常通信......

阅读 webrtc 以更好地理解这一点

希望对你有帮助

【讨论】:

以上是关于通过使用第 3 方建立连接绕过防火墙的主要内容,如果未能解决你的问题,请参考以下文章

金蝶KIS专业版客户端“无法建立数据连接啥意思”?

建立vpn连接失败

[原创]SSH 隧道转发

如何建立sqlserver 外部数据库连接

如何关闭一个TCP连接

Delphi能通过SSH登录Linux,连接MYSQL取数么?像Navicat一样