![到达路由器后面的系统](https://linux22.com/image/661290/%E5%88%B0%E8%BE%BE%E8%B7%AF%E7%94%B1%E5%99%A8%E5%90%8E%E9%9D%A2%E7%9A%84%E7%B3%BB%E7%BB%9F.png)
我遇到过这种情况:我有一个小型服务器设备,我希望人们能够将其插入路由器,打开它并让它工作。当设备启动时,它会确定其局域网地址,例如:192.168.1.4 及其公共地址,例如 4.3.2.1。然后它会设置一个监听端口 3000 的守护进程。然后我将从母舰向该端口发送消息。
我的问题是:是否可以在不要求用户在路由器上配置端口转发的情况下完成此操作。他们可能在路由器后面有 N 台计算机,但设备是唯一会监听此端口的计算机。
答案1
理论上,你可以用一种叫做通用即插即用 (UPnP)。实际上,大多数设备(包括家用路由器)都默认关闭此功能,而且大多数有能力的网络管理员都会保持这种状态。
您可能需要让您的设备轮询您控制的网络上的命令和控制服务,或者在您控制的网络上设置代理服务,以便您的设备可以自动创建 vpn/代理连接,以便您可以在适当的端口上打开和转发流量。
答案2
首先,您的设备需要支持 IPv6。目前 IPv6 用户可能只占很小的比例。但如果您预计这些设备将在报废前使用五年,那么您可以预期它们在其使用寿命内处理的 IPv6 流量将多于 IPv4 流量。
任何真正能解决您面临的挑战的解决方案都涉及 IPv6。其他一切都只是权宜之计。
我能想到的两个解决方法是 UPnP(如回答由 Joel 编写)和 IPv6 隧道。
IPv6 隧道可以通过您托管的服务发送所有流量(如果您想控制可靠性)或使用 Teredo 协议和第三方中继(但 Teredo 中继的可用性非常差)。
如果您确实通过自己托管的服务运行流量,那么该服务可以执行除隧道之外的其他操作。例如,如果流量是 HTTP,则向托管服务添加基于名称的代理可能会带来巨大的优势。