【问题标题】:NAT traversal from known public server programmatically以编程方式从已知公共服务器进行 NAT 遍历
【发布时间】:2012-08-27 01:32:17
【问题描述】:

我已经做了一些关于 NAT 穿越的研究,并从网上得到了一些关于 P2P 应用的建议。但是我的情况和一个传统的P2P应用程序有些不同。我已经有一个公共服务器,我只需要从已知的公共服务器访问NAT后面的设备。

关于我的案例的详细信息如下:

1.PC-A have public IP
2.PC-B is behind NAT, does not have public IP. In my case PC-A and PC-B is under full control.
3.PC-C is also behind NAT, and could be reached from PC-B

问题是:

  1. 有什么方法可以在公共服务器 PC-A 和 PC-B 之间建立一条隧道,以便我可以使用 TCP 协议(​​甚至 UDP)从 PC-A 到达 PC-C?
  2. 值得注意的是,一切都应该以编程方式完成,尤其是在 Java 中。是否有任何库可以做到这一点?

【问题讨论】:

    标签: java proxy ssh nat tunnel


    【解决方案1】:

    您的 PC-A 在 P2P 谈话中通常被称为“中继”。

    基本原则是防火墙后面的所有对等方(在您的情况下为 PC-B 和 PC-C)建立到 PC-A 的出站连接。 PC-A 然后“链接/绑定”这些连接。 通常这些连接是通过对防火墙友好的 HTTP 进行的。所以 PC-B 与 PC-C 对话,一个简化的序列是:

    • PC-B 和 PC-C 都与 PC-A 建立 HTTP 连接
    • PC-B 向 PC-A 发出信号,表示它想向 PC-C 发送数据
    • PC-B 根据出站请求将其数据发送到 PC-A
    • PC-A 在同步响应中将数据转发给 PC-C。

    当你投入时,事情变得(非常)复杂

    • 身份验证
    • 安全
    • 冗余继电器
    • 连接超时、可靠性、恢复等...

    大多数 P2P 框架都实现了某种中继。 JXTA 和 XMPP 就是这种情况(检查 ICE)。

    我相信 Ian Mc Ginniss 还开发了一种称为 HTTP 隧道的东西,作为 Netty 项目的一部分(最初是作为 JXTA 中继的替代品,这种中继在某种程度上是次优的)

    【讨论】:

    • @BGR,很抱歉我错过了我无法控制PC-C的部分,因此PC-C不会与PC-A甚至PC-B建立HTTP连接.在我的情况下,中继功能应该在PC-B上。
    • @ BGR,需要解决的另一件事是我想通过通用 TCP 端口访问 PC-C,即。我可以从 PC-A SSH 或 Telent 等到 PC-C。
    • 好的。然后让 PC-B 充当“反向”中继并建立与 PC-A 和 PC-C 的出站连接。然后让 PC-A 使用响应通道通过 PC-B 向 PC-C 发送数据。
    • 我不确定您所说的“通用 TCP 端口”是什么意思。端口和协议是两个不同的问题,尽管 22 经常用于 ssh,80 用于 HTTP 等...您可以在 PC-A/PC-C 上运行 SSH 客户端/服务器(请参阅 SSH Mina 了解 Java 实现)如果您不想处理 HTTP 请求。
    • 中继只看到字节通过并绑定连接;它不关心两个端点之间使用的协议。通常,您使用 HTTP 将中继连接到端点,并在 HTTP 请求/响应中“包装”端点之间使用的协议
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-11
    • 2019-06-26
    • 1970-01-01
    相关资源
    最近更新 更多