我正在构建一个 Web 应用程序(服务器 A),它可以与连接到互联网的远程服务器(服务器 B)进行通信。
服务器 B 位于 NAT 后面,正在监听 3 个非标准端口上的通信。
在典型情况下,为了让我能够在不同的网络上部署多个远程服务器并使其与父 Web 应用程序(服务器 A)通信,每个服务器都必须手动配置路由器,以将相应的端口转发到配置了服务器 B 的静态 IP。
我正在寻找一种方法来解决必须为每个部署单独手动配置每个路由器的问题。必须进行端口转发,因为服务器 A 必须与服务器 B 通信并且必须发起对话。
我问的是是否有办法让服务器 B 发起通信而不是相反,这样就不需要进行端口转发。
服务器 B 只需要呼叫总部,打开必要的套接字/端口(这是我需要您提供信息帮助的地方),并且所有通信都将通过这些打开的端口完成,而服务器 A 不需要知道服务器 B 的 IP,也不必与路由器通信来处理转发。
这种情况可能吗?
编辑: 增加了一些细节:
基本上,我创建了一个 webapp(服务器 A),它可以与多个 3D 打印服务器通信,并且已公开 REST API。打印服务器 API 服务器都在非标准端口 8721 上进行监听。
现在,我正在手动配置我的 webapp,通过它们的外部 ip 地址和端口转发端口指向每个打印服务器。您可能已经知道,这将产生大量问题,因为大多数这些外部 ip 地址都将发生变化,因为大多数家庭/消费者网络没有静态 ip。
这意味着我必须在每次 IP 地址更改时找出它并手动修改我的 Web 应用程序上的记录。
我想象(并假设)解决这个问题的最佳方法之一是不要让 Web 应用程序担心每个打印服务器位于何处,而是让打印服务器自己告诉 Web 服务器它们在哪里。
我正在尝试解决两个问题:
- 外部 IP 地址是动态的而不是静态的(如上所述)
- 家庭网络施加的端口转发/防火墙。如果家庭网络中有多个打印服务器,这意味着为了单独访问每个服务器,家庭路由器需要知道如何将每个唯一端口(需要在 Web 应用程序和家庭路由器端都配置)路由到正确的打印服务器(因为它们都在监听 8721)。
抱歉,帖子太长了。我对整个套接字编程部分还比较陌生,我希望有人能告诉我应该去哪里查找有关如何执行上述操作的更多信息。
答案1
是的,这是可能的。这可以通过以下方式轻松实现自动化UPnP 端口转发,如果在 NAT 主机/设备上启用,并且不考虑安全性,则可以使用 UPnP。例如,如果您不想使用 UPnP,因为需要考虑安全性,则可以使用另一个 API 访问 NAT 设备。UPnP 在家用路由器中非常常见。
您可能希望使用另一台服务器,通过静态 IP 地址或 FQDN(可通过静态端口直接访问)来传达服务器 A 和服务器 B 的 IP 地址和端口号。例如,可以通过将数据存储在文本文件中来实现。
正如@Evan 所说,如果不清楚你真正想要实现什么,我只能说这些。
答案2
假设您控制打印服务器代码,那么当然,您可以让打印服务器连接到您的服务器,而无需担心远程网络中的 NAT。例如,“GoToMyPC”和“LogMeIn”就是这样工作的——通过防火墙与服务器建立持久连接。
那里是协议可以让您“突破”NAT,但坦率地说,除非两个端点都位于您无法控制的NAT之后,否则我认为这些协议(STUN等)工作量太大,回报太少。
您需要考虑打印服务器如何定位中央服务器。使用 DNS 名称很诱人,但您应该考虑以后可能对服务器基础架构进行的更改(例如,在扩展中)。我会向您指出SRV 记录作为打印服务器定位其中央服务器的机制。SRV 记录已经具有内置的高可用性和优先级权重抽象。