我需要NAT遍历的解决方案来通过互联网传输RDP数据.我遇到了以下工具,它真的很棒 - pwnat
.
我已尝试使用不同路由器后面的两台不同的机器,但我无法使其工作,如上面链接中所述.所以pwnat
仍然有效,如果是的话,我做错了什么?这对我很有帮助.
注意:我正在使用Windows机器进行测试,并从以下链接下载了Windows版本.
http://www.sumitgupta.net/pwnat-windows-complied-version/
任何帮助请..
不,
我猜你知道它是如何工作的:
服务器将ICMP echo请求报文发送到固定地址(例如1.2.3.4),其中不会返回回应回复,客户端假装是Internet上的跳,发送ICMP Time Exceeded报文给服务器,期望服务器前面的NAT将ICMP超时消息转发给服务器.
上面的图片来自pwnat的主页,它的前提是客户端不在NAT之后,并且NAT实现通常不会检查超过时间的原始有效载荷.如果客户端和服务器都是这样的NAT,
========================================================================================= | CLIENT | <---> | NAT-C | <---> { internet } <---> | NAT-S | <---> | SERVER | =========================================================================================
它现在很少有用,主要有以下两个原因:
当服务器向固定地址发送ICMP echo请求报文时,根据RFC 3022,ICMP echo请求报头中的标识符字段将通过NAT-S唯一映射到已注册IP地址的查询标识符,以便它可以路由未来的ICMP Echo使用相同的查询ID回复发件人,因此必须修改ICMP查询数据包中的ICMP头以替换查询ID和ICMP头校验和.RFC 3022 ICMP错误包修改部分:
在NAPT设置中,如果ICMP中嵌入的IP消息恰好是TCP,UDP或ICMP查询数据包,您还需要修改TCP/UDP报头中的相应TU端口号或ICMP查询中的查询标识符字段头.
但是客户端不知道外部查询ID(pwnat中的代码使用0作为原始请求的标识符),它向服务器发送ICMP Time Exceeded数据包,即使数据包可以到达NAT-S前面.服务器,NAT-S找不到嵌入式数据包的主动映射,大多数NAT实现都会丢弃它.
此外,根据rfc 5508,当NAT-C从私有领域接收ICMP错误数据包时,NAT-C使用嵌入在ICMP错误消息中的数据包(即,从客户端到服务器的IP数据包)来查找嵌入数据包所属的NAT会话.如果NAT-C没有嵌入数据包的活动映射,则NAT-C应该静默地丢弃ICMP错误数据包.这意味着来自客户端的ICMP Time Exceeded数据包不会到达NAT-S.
因此pwnat仅适用于基本NAT设备(rfc 1631描述),它执行简单的地址转换,不适用于具有强大NAPT实现的任何NAPT设备.而本文确实提到了这个问题.