如何在不需要任何重定向配置的情况下使 TCP 服务器在路由器 (NAT) 后面工作

Posted

技术标签:

【中文标题】如何在不需要任何重定向配置的情况下使 TCP 服务器在路由器 (NAT) 后面工作【英文标题】:How do I make a TCP server work behind a router (NAT) without any redirection configuration needed 【发布时间】:2010-12-03 10:49:34 【问题描述】:

场景如下。我有两台机器A和B: A:客户端(在 NAT 之后) B:服务器(在 NAT 之后)

我希望 B 能够侦听任何给定端口,以便 A 可以通过该特定 TCP 端口向 B 发送数据包并接收任何响应。如果两台机器都不在 NAT 后面,那么这是非常直接的过程。但是,我如何使它工作,以便即使 B 在路由器后面也能工作,而无需他去更改路由器配置启用一些端口转发等...

例如,像 torrent 客户端这样的点对点程序如何在用户无需配置任何东西的情况下工作?

【问题讨论】:

您在 serverfault.com 上的运气可能会更好 我认为这个问题是如何编写服务器以在 NAT 后面工作,而不是如何配置它。 【参考方案1】:

回答点对点程序的示例,一般来说:有一种称为Universal Plug and Play 的技术,NAT 路由器可以使用该技术允许其后面的客户端向外部公开端口。这就是 bittorrent 客户端可以使用的功能,因此其他客户端可以直接连接到它们。

【讨论】:

但 UPnP 不只是一种自动化端口转发自动化的方法吗? 关键是 自动化 - 我假设问题中的“他”是用户。避免手动设置端口转发是 UPnP 的优点和危险。【参考方案2】:

代理服务器的替代方案是匹配服务器。匹配器不是代理所有流量,而是进行协商,直到对等方可以相互交谈。这涉及找到对等方的外部公共 IP 并与每个 IP 进行通信,以便防火墙/路由器知道对等方希望进行通信。

这称为hole punching,通常必须由媒人而不是同行自己来完成。但是,一旦打孔,媒人就可以告诉同伴彼此,他们可以直接交流。

【讨论】:

AFAIK 像这样的打孔只适用于 UDP - 并且只有在路由器上的 UDP 端口映射是一致的情况下。 我读到了关于打孔的文章,TCP 打孔也可以工作吗?然而,它可能并不容易实现,但我会尝试一下,因为这似乎是我正在寻找的。谢谢。 你可以看看STUNT。但我不推荐 TCP 打孔,因为它不能可靠地工作【参考方案3】:

您必须:

    从 nat 设置端口转发 将服务器前端的网关连接到您的服务器软件正在运行的机器中,并拥有客户端 连接到该 IP 地址 网关。

    创建代理服务器 在 2 个 nat gatewys 之间,所以两者 您的服务器和客户端可以连接 到那个。您的服务器和客户端 必须建立一个连接 将调解数据的代理 这两个连接之间。

【讨论】:

嗨,我已经设想过这个解决方案,这个解决方案的唯一问题是代理上的负载会相当大,成本很高。【参考方案4】:

对于 UDP 通信,打孔技术已被广泛理解,但它也可以可靠地用于设置对等 TCP 流。这是关于 TCP 和 UDP 的详细文章:

http://www.brynosaurus.com/pub/net/p2pnat/

【讨论】:

以上是关于如何在不需要任何重定向配置的情况下使 TCP 服务器在路由器 (NAT) 后面工作的主要内容,如果未能解决你的问题,请参考以下文章

如何在不保留路径的情况下进行htaccess重定向?

如何在不重定向原始 URL 的情况下获取短 URL 服务的信息或实际信息

如何在不更新整个固件的情况下使嵌入式系统可配置

Pygame:如何在不按任何键的情况下使精灵面对相同的方向

如何在不需要额外点击的情况下使 DataGridCheckBoxColumn 可编辑?

如何在不重定向的情况下从数据库实时更新赞成票和反对票数?