![如何从外部网络向具有本地IP的WLAN内部设备发送tcp数据包?](https://linux22.com/image/1465527/%E5%A6%82%E4%BD%95%E4%BB%8E%E5%A4%96%E9%83%A8%E7%BD%91%E7%BB%9C%E5%90%91%E5%85%B7%E6%9C%89%E6%9C%AC%E5%9C%B0IP%E7%9A%84WLAN%E5%86%85%E9%83%A8%E8%AE%BE%E5%A4%87%E5%8F%91%E9%80%81tcp%E6%95%B0%E6%8D%AE%E5%8C%85%EF%BC%9F.png)
我必须从互联网向 WLAN 中正在监听端口 9999 的设备发送命令。
设备本身仅分配了本地IP。
我还有 n(2-100+)个运行相同程序的设备(监听端口 9999)。
我知道所有设备的本地 IP,也知道要向哪个 IP 发送命令。
如何通过网关路由器将命令从外部网络(云/移动设备)发送到特定的本地 IP?
我知道这可以通过在 WLAN 内运行的服务器或专用网关设备来实现。但我感兴趣的是,这是否只通过无线路由器就可以实现。
答案1
除了路由器之外,它还需要其他东西
路由器,无论从定义还是常用用法来看,路线根据指示的目标地址和端口来捕获数据包,而不是其他因素。
无论您使用什么技术发送它,当单个 TCP/IP 数据包从外部连接到达路由器时,路由器必须决定如何处理该单个数据包,应该将其发送到数百个内部设备中的哪一个 - 并且它需要信息来做到这一点。
它不能使用 IP 地址信息,因为在您的设置中您只有一个外部 IP 地址,那就是路由器的地址 - 对于您想要以不同方式路由的所有数据包来说都是相同的。
它可以按照其他答案所建议的那样,使用 TCP 端口信息,但这显然是不可接受的。
它可以使用数据包有效负载,但它不会这样做。常用的消费者无线路由器不会检查每个数据包有效负载以决定其路由。您可以制作自定义设备或代码来处理这个问题,这实际上与“在 WLAN 内运行的服务器”相同,这显然也是不可接受的。
没有其他信息 - 路由器可能会根据其他字段做出一些决定IP 数据包头但这些字段要么根本不能满足您的需求,要么不切实际 - 例如,您可能根据以下条件设置路由来源IP 地址并发送具有欺骗源地址的数据包,但它会遇到与仅使用端口相同的配置问题。
答案2
进入n将端口映射(端口转发)放入无线路由器上的 NAT 网关设置中。为了方便起见,也许可以将公共端口与客户端的内部 IP 地址(主机号部分)加上前缀(例如 50000)相关联。
假设您的客户端计算机的私有地址为 10.0.0.2 至 10.0.0.202。输入端口映射如下:
[无线路由器公网IP]:50002 -> 10.0.0.2:9999 [无线路由器公网IP]:50003 -> 10.0.0.3:9999 … [无线路由器公网IP]:50202 -> 10.0.0.202:9999
现在,在您的客户端软件中,为了访问每个主机,您始终指定 NAT 网关(您的无线路由器)的公共 IP 地址,但您可以根据想要访问的客户端改变指定的端口。
大多数客户端软件都允许您指定端口,方法是将其编码到 URL 中(如)http://example.com:50001/
,或者将其指定为命令行参数(通常在-p
或-P
选项之后)。请查看工具的手册页。
答案3
答案4
您可以打开端口转发规则在路由器上,声明在公共接口和端口 9999 上接收的任何内容都必须转发到您的设备的 IP 和相同的端口。
路由器将发送外部需求到设备和端口指定,其他设备将不知道该流量。