如何访问NAT后面的Web服务?

时间:2010-04-23 13:38:27

标签: web-services networking rest

我们正在为一些小型企业部署产品。它基本上是使用Tomcat的SSL上的RESTful API。它安装在小型企业的服务器上,可通过iPhone或其他便携式设备访问。因此,连接到服务器的设备可能来自任意数量的IP地址。

问题出在安装上。当我们安装这项服务时,在进行端口转发时似乎总是成为问题,因此外部世界可以访问tomcat。似乎大部分时间主人都不知道路由器密码等等。

我正在尝试研究其他方法来实现这一目标。我想出了以下内容,并希望听到有关该主题的其他想法。

  1. 设置从每个客户端办公室到中央服务器的SSH隧道。基本上,远程设备将连接到端口上的中央服务器,并且该流量将通过隧道传输回办公室中的Tomcat。看起来有点冗余,有SSH和SSL,但实际上没有其他办法可以实现它,因为端到端我需要SSL(从设备到办公室)。这里不确定性能影响,但我知道它会起作用。需要监控隧道并在完成后将其恢复,需要处理SSH密钥交换等。

  2. 设置uPNP尝试为我配置漏洞。可能大部分时间都有效,但不保证打开uPNP。可能是一个很好的下一步。

  3. 想出一些NAT横向方案。我只是不熟悉这些并且不确定它们是如何工作的。我们可以访问集中式服务器,如果这样可以更容易地进行身份验证。

  4. 我还应该注意什么来实现这一目标?

8 个答案:

答案 0 :(得分:9)

此服务是否无法通过您或托管服务提供商而非客户公开托管?

当我开发自助服务亭时,我遇到了类似的情况。我不知道在下次安装时我需要处理什么类型的网络环境。

我最终创建了一个PPTP VPN,允许所有信息亭连接到我公开托管的一台服务器。然后,我们创建了一个控制器Web服务,以公开对通过VPN连接的信息亭的访问。我不确定你对VPN的熟悉程度,但通过VPN连接,我可以通过VPN分配的IP访问自助服务终端,完全绕过每个自助服务终端前的防火墙。

一旦我安装了VPN服务器,每个自助服务终端节点都非常容易设置。它还带来了我最初没有想到的管理收益和许可收入。通过这种基础设施,我可以轻松地推出可通过手机访问的服务。

祝你好运!

答案 1 :(得分:2)

存在“动态”访问NAT后面的计算机上的软件的解决方案,但通常主要用于UDP通信。

UDP hole punching技术就是其中之一。但是,不保证在每个可能的情况下工作。如果通信的双方都在“Symmetric Cone NAT”后面,那么它就不会。

您可以通过使用UPnP作为备份(甚至主要)备选方案来降低客户端无法进行通信的可能性。

我不太了解Web服务,甚至不知道是否可以选择使用UDP作为web服务(或者甚至可能)。

直接使用相同的技术TCP可能会失败(TCP连接不是无状态的 - 这会导致很多问题)。

使用相同技术的替代方法是基于UDP设置一些VPN(就像OpenVPN),但正如您所说,您将必须管理密钥,证书等。这可以自动化(我做到了)但是,它仍然不是真正的微不足道。

<强> === EDIT ===

如果你真的想使用TCP,你可以在客户端盒子上创建一个简单的“代理”软件,用作中继。

您将拥有以下架构:

  1. NAT后面的客户端框上的Web服务
  2. 相同方框中的“代理”软件,建立与公司服务器的外向(因此无阻塞)TCP连接
  3. 您的公司服务器也托管WebService,这需要像“客户端标识符”这样的东西将请求重定向到适当的已建立的TCP连接。
  4. 代理程序询问本地WebService并将响应发送回公司服务器,公司服务器也将响应转发给源请求者。
  5. 另一种方法:您可能会要求代理软件直接连接到请求者以提高性能,但是您可能会遇到您试图避免的相同NAT问题。

答案 2 :(得分:2)

这就是人们现在通过http挖掘所有内容的原因,以及为什么某些硬件供应商为第7层数据包过滤收取一笔不小的费用。

当客户至少遇到三个问题时,这是解决一个问题的大量工作。除了你已经确定的那个,如果他们不知道自己的密码,那么谁呢?不在那里工作的管理员?那是个问题。

其次,如果他们不知道密码,这意味着他们几乎肯定远远落后于防火墙的固件更新。

我认为他们应该认真考虑在防火墙上重置PROM并从头开始重新配置(并在固件升级时升级固件)。

3只鸟,一石。

答案 3 :(得分:1)

过去我必须做类似的事情而且我相信 最好的选择是你提出的第一个选择。

您可以使用带有-R选项的ssh以简单的方式进行操作 发布密钥auth和几个要检查的脚本 连接。不要忘记各种保持活动和超时 ssh的特点。

不要担心表演。使用非特权用户和端口 如果你可以的话。不要费心设置CA,即每个遥控器的公钥 除非数以千计,否则服务器更容易维护。

监控非常简单。每个服务器都应该测试服务 中央服务器。如果它失败则隧道已关闭或没有连接。 在任何情况下重启隧道都不会有害。

或者您可以使用IPsec(strongswan)在网络级别执行此操作。 这可能比较难以设置,这是我使用的选项,但我会 下次使用SSH时,它会为我节省很多时间。

答案 4 :(得分:1)

+1用于SSH隧道。它是众所周知的,可广泛使用且不太难配置。

但是,正如您所指出的,您已经在运行SSL,因此SSH加密是多余的。您可以使用常规隧道代理而不是SSH,它可以在没有加密的情况下提供隧道。我过去曾使用this one,虽然我没有加载测试,但它运行良好 - 它只与少数几个用户一起使用。

Here's来自使用隧道代理从防火墙外部访问其网络摄像头的人的博客。

答案 5 :(得分:0)

在Tomcat前面设置Apache。这个Apache应该可以在互联网上看到,Tomcat不应该这样。

配置Apache以将所有流量转发到Tomcat。这可以使用mod_proxy轻松完成(查看ProxyPass和ProxyPassReverse指令)。

让您的SSL证书位于Apache中,以便所有客户端都可以与Apache服务器进行HTTPS通信,而Apache服务器则会与Tomcat进行简单的HTTP协商。

没有隧道或其他令人讨厌的情况+你会惊讶于配置Apache来做到这一点是多么容易。

答案 6 :(得分:0)

如果您希望与客户端服务器进行RESTful集成,那么通向中心服务器的隧道作为代理,似乎是最好的方法。

但如果这不是一项硬性要求,您可以让中央服务器处理RESTfull内容并集成中央服务器客户端服务器与其他中间件。好的候选人将是RMI或JMS。例如,客户端发起的RMI连接允许服务器对客户端进行RMI调用。

答案 7 :(得分:0)

您可以尝试连接到PC /服务器并通过hamachi(免费VPN软件)隧道传输所有数据,因为您可以安装此工具并创建反向连接(从nat内部到外部),这样您就可以连接它呢

网站:http://hamachi.cc/