如何从未知服务器连接到客户端计算机上的开放 tcp 端口?

Posted

技术标签:

【中文标题】如何从未知服务器连接到客户端计算机上的开放 tcp 端口?【英文标题】:How to connect to an open tcp port on client machine from an unknown server? 【发布时间】:2015-09-28 04:01:21 【问题描述】:

我已经阅读了很多关于不同 NAT 穿越技术的文章,但我仍然不太清楚它是如何工作的。

如果我在客户端计算机上打开一个 TCP 端口并向某个任意不存在的服务器(不会响应)发送一个请求,我的客户端 NAT 现在将有一个打开的通道,对吗?如果我知道客户端的公有 IP 和私有 IP 以及端口号,是否可以使用其他 IP 地址的另一台(未知)计算机访问该客户端端口?

或者我的 NAT 会检查我的服务器数据包来自哪里并阻止它,因为它与来自客户端计算机的原始请求来自不同的 IP 地址?

提前致谢!

【问题讨论】:

【参考方案1】:

要回答您的问题,您需要对 NAT 的映射和过滤行为有所了解。首先让我说明一下关于 NAT 的映射行为的信息,

如果您通过 NAT 的 IP:port 从您的内部 IP:port 向任何地址发送数据包,那么您的 NAT 会在您的内部 IP:port 和它的 IP:port 之间创建一个 MAP。否则,您的 NAT 之外的任何人都无法向您发送任何内容。

有 4 种类型的 NAT,

Full-cone NAT:如果您之前通过 NAT 的 IP:port 从内部 IP:port 发送数据包,那么任何外部主机都可以通过发送数据包到您的 NAT 的 IP:端口。

地址受限的锥形 NAT: 外部主机可以通过向您的 NAT 的 IP:port 发送数据包来向您的内部 IP:port 发送数据包,前提是至少从您的内部 IP:port 发送了一个数据包之前通过您的 NAT 的 IP:port 发送到该外部主机的 IP 地址。在这里,外部主机的端口无关紧要。只有 IP 地址必须相同。

端口限制锥形 NAT: 与地址限制相同,只是这次主机的端口很重要。至少一个先前通过您的 NAT 的 IP:Port 从您的内部 IP:Port 发送到该外部主机的 IP:Port 的数据包将允许该外部主机通过您的 NAT 的该 IP:port 从其 IP:port 向您发送数据包。

对称 NAT: 它的映射行为与其他的略有不同。对于前 3 种类型的 NAT,无论您将数据发送到何处,它都会从您的内部 IP:端口通过 NAT 的相同 IP:端口。但是对于不同目的地的对称 NAT,您的数据将通过 NAT 的相同 IP 但不同的端口。和端口限制锥一样,如果数据先前发送到外部主机的 IP:port,则允许传入的数据包通过 NAT。

因此,对于您的场景,只有当您的 NAT 是全锥 NAT 时,某个未知的知道您的 NAT 的公共 IP:您将数据包发送到未知服务器的端口,才能通过 UDP 传输向您发送数据。对于其他 NAT,它将被阻止,因为您没有向该外部主机发送任何数据。但是对于您的 TCP 连接,即使他们知道您的私有和公共 IP:端口,也没有人可以向您发送任何数据,因为它们位于不同的 NAT 后面。阅读此answer 的详细信息。

阅读wiki的详细信息。

【讨论】:

感谢塔希尔!这正是我所缺少的:)

以上是关于如何从未知服务器连接到客户端计算机上的开放 tcp 端口?的主要内容,如果未能解决你的问题,请参考以下文章

连接到在另一台计算机上作为 Windows 服务运行的 WCF

计算出有多少客户端可以连接到我正在使用的一些 tcp 服务器代码

计算机无法连接到远程计算机上的另一个控制台会话,您正在运行一个控制台会话

计算机无法连接到远程计算机上的另一个控制台会话,您正在运行一个控制台会话,怎么办?

如何将android设备连接到Spring websocket服务器

如何在 AsyncTask 中启动客户端并连接到服务器?