pwnat仍然是一个可行的解决方案吗?

26
我需要一种NAT穿透解决方案来在互联网上传输RDP数据。我发现了以下工具,它非常棒 - pwnat
我已经尝试在两台不同路由器后面的机器上使用它,但是我无法像上面的链接中所解释的那样使其正常工作。那么pwnat是否仍然有效,如果是的话,我可能做错了什么?这对我会非常有帮助。
注意:我正在使用Windows机器进行测试,并从以下链接下载了Windows版本:http://www.sumitgupta.net/pwnat-windows-complied-version/

没有看到发送的流量,很难诊断问题。尝试使用Wireshark或类似工具捕获两台机器所见的流量,然后在此处发布。 - Malt
如果您的NAT路由器为出站数据包更改源端口,则此方法将失败。在本地网络上捕获数据包无法诊断此问题;您需要捕获NAT路由器与ISP之间的数据包或在具有公共IP地址的远程系统上进行捕获。 - o9000
这里分享的文章来自我的博客。因此,我想为将来的参考添加一点内容,即 pwNAT 对我来说从未可靠地工作过。我将我的应用程序更改为IPv6,因为它没有 NAT,因此即使在启用 NAT 的 IPv4 路由器后面,它也像往常一样工作。 - Sumit Gupta
1个回答

15
No.
我假设您知道这是如何工作的:enter image description here
服务器向固定地址(例如1.2.3.4)发送ICMP回显请求数据包,其中不会返回回显响应,客户端伪装成互联网上的一跳,向服务器发送一个ICMP超时消息,预期NAT将其转发到服务器。

以上图片来自pwnat的主页,前提是客户端不在NAT后面,并且通常不会检查超时消息中的原始负载。如果客户端和服务器都在类似这样的NAT后面,
=========================================================================================
| CLIENT  | <---> |  NAT-C  | <---> { internet } <---> |  NAT-S  | <---> | SERVER |
=========================================================================================

现在它很少起作用,主要有以下两个原因:

  1. 当服务器向固定地址发送ICMP回显请求数据包时,根据RFC 3022,ICMP回显请求标识符字段将被唯一映射到已注册IP地址的查询标识符中,以便可以将未来带有相同查询ID的ICMP回显答复路由到发件人,因此必须修改ICMP查询数据包中的ICMP头以替换查询ID和ICMP头校验和。RFC 3022 ICMP错误数据包修改部分

在NAPT设置中,如果嵌入在ICMP中的IP消息碰巧是TCP、UDP或ICMP查询数据包,则还需要修改TCP/UDP标头中的适当TU端口号或ICMP查询标识符字段。

但客户端不知道外部查询ID(pwnat代码使用0作为原始请求的标识符),即使数据包可以到达位于服务器前面的NAT-S,NAT-S也无法找到嵌入数据包的活动映射,大多数NAT实现将其丢弃。

  1. 此外,根据rfc 5508,当NAT-C从私有域接收到ICMP错误数据包时,NAT-C使用嵌入在ICMP错误消息中的数据包(即来自客户端到服务器的IP数据包)查找所属的NAT会话。如果NAT-C没有嵌入数据包的活动映射,则NAT-C应静默地丢弃ICMP错误数据包。这意味着来自客户端的ICMP超时数据包不会到达NAT-S。

因此,pwnat仅适用于具有简单地址转换的基本NAT设备(描述在RFC 1631中),无法与具有强大NAPT实现的任何NAPT设备一起工作。而这篇论文也提到了这个问题。


2
有人知道关于一个后继工具的情况吗?或者GitHub上samyk/pwnat源代码库中2016年的最后提交记录,或者timdiels/pwnat分支源代码库能提供帮助吗? - Achim
@Achim 可以使用第三方工具来帮助,例如 stun、turn 服务器。提交记录并不重要。 - jfly
1
@jfly,请详细说明一下。如何使用STUN服务器使NAT后面的服务器接受传入连接(UDP或TCP)? - Zibri
1
@Zibri,我认为这不是jfly的意思。相反,现在已经没有办法在没有第三方的情况下连接两个位于NAT后面的客户端了。据我所知,唯一的选择是使用一个不在NAT后面的“stun”或“turn”服务器。 - Duane J

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