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