1

我需要在 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

网络

‌</p>

4

2 回答 2

2

基本上,如果您可以移植,那么这更像是一个基础设施问题而不是编程问题。您只需将路由器配置为将流量从公共 IP / 端口引导到私有 IP / 端口,例如:

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

如果您想变得花哨并且您的路由器支持UPnP,只需求助于实现IGD 协议的库(例如MiniUPnP),以使您的应用程序控制端口映射。本文提供了一个很好的起点以及一些示例代码(尽管我真的会推荐一个健壮的库)。

于 2013-05-02T15:45:12.313 回答
2

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

所以有两个问题需要解决:

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

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

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

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

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

希望有帮助。

于 2013-05-02T15:34:21.053 回答