如何使TCP服务器在路由器(NAT)后面工作而无需任何重定向配置

12

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

我希望B能够监听任何给定的端口,以便A可以通过该特定TCP端口向B发送数据包并接收任何响应。如果两台机器都不在NAT后面,则过程非常简单明了。但是,如果B在路由器后面,又如何使其正常工作,而无需更改路由器配置以启用某些端口转发等操作?

例如,点对点程序如BT客户端如何在用户没有进行任何配置的情况下工作?


1
你可能在serverfault.com上会有更好的运气。 - NotMe
我认为这个问题是关于如何编写服务器以在NAT后面工作,而不是如何配置它。 - Douglas Leeder
4个回答

8
回答关于点对点程序的例子,以及一般情况下:有一项名为Universal Plug and Play的技术,NAT路由器可以使用它来允许位于其后面的客户端将端口暴露给外部。这就是比特流客户端可以使用的方式,使其他客户端可以直接连接到它们。

但是UPnP不仅仅是自动化端口转发的一种方式吗? - Roman Plášil
1
关键在于自动化 - 我假设问题中的“他”是用户。避免手动设置端口转发既是UPnP的优点,也是危险所在。 - Douglas Leeder

1

1

你需要执行以下操作之一:

  1. 从位于服务器前面的NAT网关设置端口转发到运行服务器软件的机器,并让客户端连接该网关的IP地址。

  2. 创建一个代理服务器,位于两个NAT网关之间,以便您的服务器和客户端都可以连接到该代理。您的服务器和客户端都必须建立与该代理的连接,该代理将在这两个连接之间进行数据中介。


嗨, 我已经设想了这个解决方案,唯一的问题是代理服务器将承载相当大的负载,这会很昂贵。 - Chetane

1

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

这被称为穿透NAT,通常必须由匹配服务器而不是对等方自己完成。一旦打通了洞,匹配服务器就可以告诉对等方彼此的信息,他们可以直接通信。


1
据我所知,这种孔洞穿透只适用于UDP - 而且仅在路由器上的UDP端口映射一致时才有效。 - Douglas Leeder
我了解过打洞技术,TCP打洞也能行吗?不过实现起来可能不太容易,但既然这似乎是我需要的,我会尝试一下的。谢谢。 - Chetane
你可以看看 STUNT。但是我不建议使用 TCP 穿透,因为它不能可靠地工作。 - tobias

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接