用于P2P连接的NAT-Traversal实现

时间:2013-05-02 14:51:26

标签: c++ linux networking nat

我需要在NAT后面实现一个简单的P2P应用程序。它应该通过可靠和安全的连接(TCP上的加密数据)发送数据。从理论背景我知道在几个RFC(5389,5769和5780)中描述了几种NAT遍历技术(例如NAT的会话遍历实用程序)。

虽然在实践中我找不到所需的工具/库来实现这样的系统(最好是用C ++编程语言)。我通过谷歌搜索盲目地找到了什么:ICETURNlibnicelibjingleSTUNTMAN

下图描述了它应该是什么样子。我有一个带有效IP地址的VPS,一个NAT后面的PC和另一个NAT后面的传感器。他们有私人IP。我希望我的传感器连接到服务器,找到监视器并向它发送连接请求。建立连接后,不应使用中继服务器来引导数据流量。我希望我的传感器和显示器使用此路径进行通信:

Sensor <--> AP0 <--> R3 <--> {THE INTERNET} <--> R2 <--> Monitor

目前所有数据都通过VPS传输:

Sensor <--> AP0 <--> R3 <--> {THE INTERNET} R1 <--> 
VPS <--> R1 <--> {THE INTERNET} <--> R2 <--> Monitor

Network

2 个答案:

答案 0 :(得分:2)

因为您最终希望完全删除中继服务器并希望监视器和端点直接通信 - 您实际上是在尝试解决NAT后面两台服务器之间直接通信的问题。

因此有两个问题需要解决:

1)允许传感器获取监控系统的公共IP地址。

2)允许TCP连接的SYN数据包通过Router-PT R2上的NAT中继到您的监视器。

中继可以提供帮助的第一个问题:您可以使用TURN通过服务器中继消息,以将监视器的公共IP地址传送给传感器。

然而,第二个问题是,我不知道任何通用的解决方案,因为它真的归结为路由器上的配置。路由器需要知道NAT后面的许多系统中的哪一个将SYN转发到。它无法将它转发给所有人:他们都会回应。

大多数启用NAT的路由器都具有配置设置,允许您配置要将传入数据包路由到哪个主机。查看将笔记本电脑监控系统设为DMZ,或将特定TCP端口的流量引导至所需系统。但是,每个路由器将以不同方式处理此配置;我不知道该配置的标准化。

希望有所帮助。

答案 1 :(得分:2)

基本上,如果你能port forward,那么这不仅仅是编程的基础设施问题。您只需配置路由器以将流量从公共IP /端口引导到专用IP /端口,例如:

R2: Port 500 - TCP -> Laptop-PT - Port 500
R3: Ports 16000/16500 - TCP/UDP -> PDA-PT - Port 16000/16500

如果你想获得幻想并且你的路由器支持UPnP,只需求助于实现IGD protocol的库(例如,MiniUPnP),以便让你的应用程序控制端口映射。 This article提供了一个很好的起点以及一些示例代码(尽管我真的建议使用强大的库)。