通过端口转发,任何人都可以将计算机变成服务器,并使用它来接受来自互联网上任何其他计算机的直接连接(当然,有一些服务器端代码正在运行)。这很好,但是如果有人无法使用物理路由器(公寓里许多人的情况就是如此),或者可能根本没有路由器(出现了许多新型互联网连接,例如手机数据,其操作方式不同),该怎么办?我想他们运气不好吧?
但是,有一种简单的情况我认为还是很有用的,可以采取一些措施:建立连接的双方彼此认识,并且已经交换了 IP 地址。当然,这些 IP 可能会偶尔发生变化,但我认为这不会造成太大的阻碍,如果需要,有许多免费的 DDNS 服务可用。他们还商定了端口号,或者说有一种遍历端口号直到找到一个可用的端口号的方法。双方都没有可用的端口转发。
但是,路由器或提供互联网服务的任何设备都必须能够将从连接地址发送的数据转发到建立该连接的任何本地计算机,就像在正常的互联网使用中一样。假设发生以下过程:
- 一个用户声称它已与另一个用户的地址建立了连接,指定要使用的本地和外部端口,因此路由器(或任何其他设备)会采取适当的措施将来自该用户的数据引导至该用户。但是,正如第一个用户(但路由器不知道)所知,它实际上并未建立连接,而是在等待和监听来自另一个用户的请求。
- 与此同时,另一个用户只是尝试连接到第一个用户,就像任何客户端连接到服务器一样,使用第一个用户选择的相同端口(尽管已交换)。
- 当第一个用户收到建立实际连接的请求时,它会发送适当的答复,以便第二个用户的连接请求被接受。
实际代码可能只是正常运行,第一个用户作为服务器,第二个用户作为客户端,但关键部分是第一个用户的路由器(或执行这些职责的任何设备)认为第一个用户是首先与另一个用户建立连接的客户端。
我没有看到任何使这成为不可能的事情,但我也不知道该怎么做。首先,必须以某种方式忽略初始连接尝试被拒绝的事实(至少由路由器忽略)。其次,必须允许再次尝试使用该端口来监听和接受真正的连接(以某种方式不通知路由器这些步骤正在发生)。
如果可以做到这一点,就意味着任何支持互联网的设备(而不仅仅是家用电脑)都可以直接连接到任何其他支持互联网的设备,而无需任何第三方服务器。例如,这些连接可用于直接传输任意大小的文件,同样不需要第三方服务器。而且该连接还可以执行普通连接可以执行的任何其他操作。
所以我来这里想问一下,有人知道该怎么做吗?
答案1
这很好,但是如果有人无法访问物理路由器怎么办?
一般来说,所有互联网流量都会经过多个 ISP 和运营商级路由器,而用户通常无法物理访问这些路由器。
你的第四段有点不清楚。我认为你不了解 NAT 的工作原理。
需要端口转发的原因是由于 NAT。NAT 将多个系统隐藏在 1 个 IP 地址后面。您只能与这个公开可见的 IP 地址进行通信。 如果你想获取该 IP 后面的任何内容,就必须通过该 IP。你没有选择。 如果没有端口转发,启用 NAT 的路由器就不知道将未经请求的传入流量发送到其后面的哪台机器,并且会假定您正在尝试与路由器本身对话。
如果您指的是代表其背后的客户端接受请求的程序,那么它的名称就是“代理”,您当然可以这样做。路由器是运行和访问该程序的合乎逻辑的地方,但不一定是最佳的地方。许多协议都有代理,HTTP、SIP 等。
当第一个收到建立实际连接的请求时,它接受
这绝不会发生。“第一个”位于 NAT 路由器后面,NAT 路由器首先接收请求,而不是路由器后面的任何人。
IPv6 通过提供足够大的地址空间解决了这个问题,从而无需使用 NAT 来保存地址。
NAT 不涉及任何特殊协议,都是 TCP/IP。
与标准非 NAT 路由器不同的是,从外部来看,节点只能看到并知道单个公共 IP。就他们从 TCP/IP 级别所知,该 IP 上只有一个系统发送许多请求。如果没有 JavaScript、代理或其他应用程序级流量泄露某人的私有 IP,那么外部就无法知道私有 IP。
NAT 设备必须跟踪谁发起了哪些连接(仅在其后面),以便它可以将发往自己的传入流量转发到适当的主机。(这是可能的,因为每个传出连接都有一个唯一的随机源端口,因此它可以简单地将源端口映射到 LAN 目标地址)。
我认为有一个程序试图按照您所说的方式工作,即向 NAT 路由器发送一个无序的 TCP 数据包(序列为 SYN、ACK、SYN-ACK),这可能会欺骗它。我还听说过 NAT 路由器错误地允许在发送 UDP 流量的端口上传入 TCP 连接。
但是,良好的 NAT 实现会检查其内部表中是否存在映射连接,如果数据包与内部看到的任何内容不匹配,则丢弃该数据包。您不能指望实现缺陷以您所要求的方式提供可靠的解决方案。
答案2
如果您无法访问路由器,则无法在其上运行程序来实现直接连接方案,即使您花时间创建了程序。如果您没有路由器,则:
A. 由于您有直接连接,因此无需进行端口转发。B
. 这不是您的网络(1/2/3/4G),因此您需要进行反向连接或与系统管理员交谈。
我并不是说您的想法不好,因为它绝对不是,但它是不切实际的,因为如果您可以访问运行 openwrt 的路由器,您可以在其中运行程序来执行此操作,那么您不妨直接转发端口。