两台服务器之间的通信,坐在各自的NAT后面

我正在构build一个Web应用程序(服务器A),它与连接到Internet的远程服务器(服务器B)进行通信。

服务器B驻留在NAT后面,正在监听3个非标准端口上的通信。

在一个典型的情况下,为了让我在不同的networking上部署多个远程服务器,并与父Web应用程序(服务器A)进行通信,每台服务器都必须手动configuration路由器,以将各个端口转发给服务器Bconfiguration的静态IP。

我正在寻找一种方法来解决这个问题,必须单独configuration每个路由器,并为每个部署手动。 必须完成端口转发,因为服务器A必须与服务器B通信并且必须发起对话。

我问是否有一种方法让服务器B发起通信,而不是相反,这样就不需要发生端口转发。

服务器B只需要打电话回家,打开什么套接字/端口必然(这是我需要你的帮助信息),所有的通信将通过这些打开的端口完成没有服务器一直需要知道服务器B的IP ,并且必须与路由器通话来处理转发。

这种情况可能吗?

编辑:添加更多的细节:

基本上我创build了一个webapp(服务器A),与多个3D打印服务器通信,这些服务器具有REST API。 打印服务器API服务器都在8721的非标准端口上进行侦听。

现在,手动在我的web应用程序我手动configuration指向每个打印服务器通过他们的外部IP地址和端口转发的端口。 正如你可能会告诉这将会产生大量的问题,因为大多数这些外部IP地址将会改变,因为大多数家庭/消费者networking没有静态IP。

这意味着我必须找出每次IP地址被改变,并手动修改我的web应用程序的logging。

我想(和假设)解决这个问题的最好方法之一是不要让Web应用程序担心每个打印服务器的位置,而是让打印服务器自己告诉Web服务器。

我试图解决2个问题:

  1. 外部IP地址是dynamic的而不是静态的(如上所述)
  2. 端口转发/家庭networking强加的防火墙。 如果家庭networking中有多个打印服务器,则意味着为了单独到达每个服务器,家庭路由器需要知道如何路由每个需要在web应用和家庭路由器上configuration的唯一端口一边到右边的打印服务器(因为他们都在听8721)。

对不起,冗长的职位。 我',对于整个套接字编程来说还是比较新的东西,我希望有人能够指出我应该在哪里寻找更多关于如何做到这一点的信息。

是的,这是可能的。 如果在NAT主机/设备上启用,则可以使用UPnP端口转发轻松实现自动化,而不考虑安全性。 例如,如果您不想使用UPnP,因为安全性是一个考虑因素,您可以使用另一个API来访问您的NAT设备。 UPnP在家庭路由器中非常普遍。

您可能希望使用另一台服务器以静态IP地址或可在静态端口上直接访问的FQDN来传送服务器A和服务器B的IP地址和端口号。 例如,这可以通过将数据存储在文本文件中来完成。

正如@Evan所说的,没有关于你真正想要达到什么的具体情况,这就是我所能说的。

假设您控制打印服务器代码,那么您可以将打印服务器连接到您的服务器,从而避免在远程networking中担心NAT。 例如,“GoToMyPC”和“LogMeIn”是如何工作的 – 通过防火墙向服务器build立永久连接。

一些协议可以让你“穿越”NAT,但坦率地说,除非两个端点都在NAT后面,你无法控制,否则我会认为这些协议(STUN等)太多的工作,回报太less。

您将需要考虑您的打印服务器如何find中央服务器。 仅仅使用DNS名称是很有诱惑力的,但是您应该考虑一下您可能在服务器基础架构中进行的更改(例如缩放)。 我会把你指向SRVlogging,作为打印服务器find他们中央服务器的机制。 SRVlogging已经具有用于高可用性和优先权重的内置抽象。