NAT以编程方式从已知的公共服务器遍历

时间:2012-08-27 01:32:18

标签: java proxy ssh nat tunnel

我已经对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中。是否有任何库可以做到这一点?

1 个答案:

答案 0 :(得分:0)

您的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继电器,它们有点次优)