我有以下两个问题。请帮我解决这些问题:
据我所知,在对称 NAT 中,本地隐藏节点(位于 NAT 后面)必须发起连接,以便在 NAT 中创建一个窗口,以允许远程主机的数据包返回本地网络。有人可以告诉我如何做到这一点吗?
应用程序如何得知源和目标之间的路径中存在 NAT?
答案1
我可以给你一个开始(2)的地方:Michal Zalewski 的 p0f 被动监控工具。它似乎支持某种猜测 TCP“SYN”源位于 NAT 之后的方式。
答案2
由于 UDP 是无连接的,NAT 实现无法知道 UDP 通信实际结束于何处,因此它只是在第一个传递的数据包上创建转换表条目。例如,IP 为 10.0.0.2 的隐藏主机通过地址为 1.1.1.1 的 NAT 路由器将数据包发送到主机 2.2.2.2,源端口为 10000,目标端口为 20000。数据包到达时 NAT 将创建如下条目:
10.0.0.2 10000 - 1.1.1.1 10000 - 2.2.2.2 20000
如果第二个字段中的端口号已被其他转换条目使用,则该端口号可能会有所不同。创建此条目后,所有从 2.2.2.2:20000 到 1.1.1.1:10000 的 UDP 数据包将被重定向到 10.0.0.2:10000。
关于第二个问题:如果源和目标之间存在 NAT,则远程端报告的远程地址getpeername(2)
和直接报告的远程地址(在 UDP 负载中)将会不同。
有关 NAT 打洞的更多信息和链接在维基百科上。