如何获取 NAT 后面但可通过特定 TCP 端口访问的计算机的内部 IP?

信息安全 路由 转发端口 纳特
2021-09-06 14:26:59

我想获取 NAT 后面的远程计算机的内部 IP,我可以通过使用某个端口(例如myhost.farfar.away端口)来访问它11122TCP

C:\>telnet myhost.farfar.away 11122
SSH-2.0-OpenSSH_6.6.1p1 Ubuntu-2ubuntu2

如您所见,上面有一个 SSH 服务器,但我没有连接用户数据。

如果我尝试跟踪路由(当然是假 IP):

C:\>tracert -d myhost.farfar.away

Trace route to address myhost.farfar.away [103.56.5.30]
maximum 30 hops:

  1    <1 ms    <1 ms    <1 ms  192.168.11.1
  2    <1 ms    <1 ms    <1 ms  192.168.10.1
  3    47 ms    47 ms    47 ms  80.58.67.85
  4    81 ms    86 ms    80 ms  103.56.5.30

Trace route complete.

我知道myhost.farfar.away有 IP 103.56.5.30,但是现在我知道端口被重定向到这台机器,是否有可能通过这个 NAT继续希望11122TCP,以获得它的内部 IP(绕过 NAT)?

注意:我知道它的内部 IP 是172.26.5.5,所以理论上我想达到类似:

  3    47 ms    47 ms    47 ms  80.58.67.85
  4    81 ms    86 ms    80 ms  103.56.5.30
  5   101 ms    106 ms  100 ms  172.26.5.5

netstat当然,同样的结果

我已经测试过tcpdump,但我认为它只能提供有关进入我的计算机的连接的信息,所以在远程机器上执行这一行就可以了:

tcpdump -i any port 11122

但是可以在本地“扫描”计算机上完成吗?我可以同时使用 Windows 或 Linux。

2个回答

我必须不同意@vahid。如果 NAT 和连接被端口转发到的主机之间有多个跃点,您实际上可能能够引出 ICMP TIMEX 消息。

您可能知道,每个 IPv4 数据包都有一个 1 字节的 TTL 字段。如果您确定到 NAT 的距离(例如 10 跳)并且实际隐藏的主机实际上是 12 跳(或更多),您可以将 SYN 发送到 NAT 上的端口转发端口,其 TTL 值为 11。如果它只是重写地址(而不是充当反向代理),然后 TTL 将不受影响。这意味着离开以 NAT 为首的入站时的 TTL 将为 1。下一个路由器将递减到零,从而导致 ICMP Time To Live Exceeded (TIMEX) 消息返回给发送者。

即使出站数据包将被 NAT,每个 ICMP 错误消息(这是其中之一)都将包含其中的嵌入式协议标头。这意味着原始的 de-NATted 目标主机现在将在 ICMP 有效负载中可见,作为在错误中返回的嵌入式 IP 标头。

虽然这种技术确实有一些非常具体的要求才能成功(ICMP 允许出站、实际端口转发的主机不在 NAT 的本地 LAN 上等),但它肯定会起作用,这意味着这不是- 无论如何不可能。

通过设计,您试图实现的目标是不可能的。实现这一点的唯一方法是访问网关或主机。NAT 设备具有与内部网络共享 Internet 连接和保护内部网络的双重目的,就像传统防火墙一样。

[编辑] 我的立场是正确的。鉴于上述 David 的回应中概述的假设,IETF 事实上确实使这成为可能。