无法从内部网络 ping 静态 IP,只能从外部

Mik*_*ike 1 networking ping localhost

我正在运行 ubuntu 并且运行 apache,但是,我无法在内部 ping 到我的静态 IP,也无法http://207.40.XXX.XX使用我的静态 IP浏览Web 服务器。我只能 ping/browse localhost, 127.0.0.1, and 192.168.0.120 OR 207.40.XXX.XX只能从外部世界。

# cat /etc/hosts
127.0.0.1       localhost
127.0.1.1       my-server.myhost.com my-server

# hostname
my-server

# netstat -tapn
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      -                  
tcp        0      0 127.0.0.1:631           0.0.0.0:*               LISTEN      -               
tcp        0      0 127.0.0.1:29754         0.0.0.0:*               LISTEN      -               
tcp        0      0 0.0.0.0:443             0.0.0.0:*               LISTEN      -               
tcp        0      0 127.0.0.1:3306          0.0.0.0:*               LISTEN 
Run Code Online (Sandbox Code Playgroud)

任何想法为什么这不起作用?

sys*_*138 5

您的 NAT 网关未以允许它的方式运行。这可能是它的工作方式:

  1. 您从 192.168.0.5 向 207.40.123.45 发送 ICMP Echo 请求
  2. 这通过您的路由器路由。
  3. 路由器内的 NAT 网关将请求重写为来自 207.40.123.45(它是静态 IP 地址)
  4. 您的路由器回复 ICMP Echo 请求
  5. 由于您的路由器不支持 ICMP 状态,因此它永远不会将 ECHO 回复传回给您。

HTTP

  1. 您从 192.168.0.5 向 207.40.123.45 发送 TCP/80 连接请求
  2. 这通过您的路由器路由
  3. 您的 NAT 网关将数据包重写为207.40.123.45:41345 到 207.40.123.45:80
  4. 您的 NAT 网关注意到有一个端口转发,因此将数据包转发到 192.168.0.120:80
  5. 192.168.0.120服务器回复207.40.123.45:41345的连接尝试
  6. 您的 NAT 网关看到回复并将回复中的 To: 地址重写为 192.168.0.5:36311,但保持 From: 不变 (192.168.0.120:80)
  7. 您位于 192.168.0.5 的计算机从 192.168.0.120 收到一个它从未请求过的数据包,然后将其丢在地板上。
  8. 你的连接衰弱,永远不会打开。

请注意,ping 失败的原因可能与 HTTP 失败的原因相同。这称为“NAT 发夹”。

您需要的是一个足够智能的 NAT 网关,以便在第 6 步它还重写地址。


Ste*_*day 5

虽然1138的答案是正确的,但我只是想详细解释一下“发夹NAT”是什么,它是如何工作的,以及为什么在这种情况下有必要。如果您不关心 IP、NAT 和路由的具体细节,请随意忽略我的其余(相当冗长)答案。

如果没有发夹,以下是尝试从本地 LAN 客户端 (192.168.0.5) 通过外部 IP 地址 (207.40.123.45) 到 Web 服务器的 HTTP 连接期间发生的情况:

  1. 192.168.0.5 将其 SYN 数据包发送到 207.40.123.45,端口 80。由于 207.40.123.45 不在本地网络上,因此该数据包被发送到默认网关(即路由器)。

  2. 配置为将 207.40.123.45:80 转发到 192.168.0.120:80 的路由器将数据包的目标地址重写为 192.168.0.120,然后将数据包传送到 Web 服务器。

  3. 网络服务器接收 SYN 数据包,并将回复 SYN-ACK 数据包发送回发送者的地址,即192.168.0.5。由于 192.168.0.5 位于同一网络,因此网络服务器将数据包直接传送到 192.168.0.5。

  4. 来自192.168.0.120 的SYN-ACK 数据包到达 192.168.0.5,但那里的主机没有期待来自 192.168.0.120 的 SYN-ACK,因此它被丢弃/拒绝。192.168.0.5 的主机继续等待来自 207.40.123.45 的答复 SYN-ACK,但当然,该数据包永远不会到达。连接尝试最终会超时,可能在重试几次之后,最终客户端和 Web 服务器无法建立连接。

这个问题可以通过路由器在步骤 2 中应用“发夹 NAT”来解决。简而言之,解决方案是欺骗客户端和网络服务器通过路由器发送相互的流量。除了通常应用于端口转发的一阶段之外,还通过在步骤 2 中应用NAT 的第二阶段巧妙地实现了这一点。下面又是这个序列,这次添加了发夹 NAT:

  1. 与之前一样,192.168.0.5 将其发往 207.40.123.45(端口 80)的 SYN 数据包发送到路由器。

  2. 和以前一样,路由器收到 SYN 数据包,并根据其配置的端口转发规则,将目标地址重写为 192.168.0.120。然而,这一次,路由器注意到它将把数据包“发夹”回接收它的同一网络,因此它还将数据包的源地址重写为路由器自己的 LAN 地址(例如:192.168.0.1) )。然后路由器将数据包传送到位于 192.168.0.120 的网络服务器。

  3. Web 服务器接收 SYN 数据包,并将其回复 SYN-ACK 数据包发送回发送者的地址,这次是192.168.0.1。因此,答复返回到路由器。

  4. 路由器从网络服务器接收 SYN-ACK,并识别出这是对最近经过 NAT(两次)的数据包的回复。因此,路由器尽职尽责地反转两个 NAT,并且回复数据包现在具有源地址 207.40.123.45 和目标地址 192.168.0.5。因此,回复被发送到 192.168.0.5,TCP 连接握手继续,客户端和 Web 服务器能够成功通信。

因此,通过路由器中的发夹支持,192.168.0.5 上的主机认为它正在与 207.40.123.45 上的 Web 服务器通信,而 192.168.0.120 上的 Web 服务器认为它正在与路由器本身 (192.168.0.1) 上的客户端通信。当发夹时,两台主机之间的所有流量都会经过路由器,即使两台主机实际上位于同一网络上。这显然是网络资源的次优利用,也是为什么设置分割 DNS 通常优于依赖发夹的主要原因。