解决一次nat回环问题记录

2025/03/22 nat network 共 1569 字,约 5 分钟
Mikatsuki

引言

最近在自家机房的服务器上要加一个硬件防火墙,做一些安全组的检查过滤,结果导致本身的web service不可用了,一番排查发现是nat loopback现象导致,以前只觉得nat只是解决了ip地址不足的一个简单协议,这次通过配置发现其实nat能通过直接修改数据帧的信息做到很多事情,这里就好好记录一下这个问题的原因以及如何解决的

nat hairpin / nat loopback

nat回环问题发生在同一个内网的client,通过公网ip访问内网中的另一个server时可能发生。相关资料可以查看 nat loopback说明 英文

这里简单先模拟一个网络结构,然后基于此进行说明,图中gateway左边是公网,右边是内网。

network

情况一 公网访问web server

我们先看最基础的情况,外部client想要访问web server,访问流程会如下

  1. client1的源地址为2.2.2.2,访问web server的公网ip地址1.1.1.1
  2. 当数据请求来到网关时,网关会通过nat将数据包的目的地址1.1.1.1修改为内部的服务器地址192.168.1.2,同时源地址2.2.2.2保持不变,源目的的协议也保持不变
  3. web server收到请求后会响应,返回的数据包源地址为192.168.1.2,目的地址为2.2.2.2
  4. 网关收到请求后会通过nat将数据包的源地址修改为1.1.1.1,目的地址不变
  5. client1 2.2.2.2 收到数据包符合预期请求,连接建立完成。

情况二 内网通过公网访问web server

如果client2 192.168.1.10想要通过公网ip去访问web server的时候就会出现以下的流程

  1. client2的源地址为192.168.1.10,访问web server的公网ip地址1.1.1.1
  2. 当数据请求来到网关时,网关会通过nat将数据包的目的地址1.1.1.1修改为内部的服务器地址192.168.1.2,同时源地址192.168.1.10保持不变,源目的的协议也保持不变
  3. web server收到请求后会响应,返回的数据包源地址为192.168.1.2,目的地址为192.168.1.10
  4. 因为源地址和目的地址都在同一子网,这个时候web server可以不通过router进行数据传递,而是直接将请求返还给192.168.1.10,或者说网关没有相关配置时,直接通过内网将数据传递
  5. client2收到的返回,但是因为期待的返回ip是1.1.1.1,得到的确是192.168.1.2,所以数据包会被丢弃。

通过上面的情况说明也可以看到,问题就出现在如果在同一子网,想要通过外网ip访问另一子网的服务时候,因为源ip数据包发送和收到的不一致,会导致数据被丢弃,在实际的应用场景中就是无响应超时。

如何解决

在网关处增加配置就好了,根据不同的设置可能配置命令或形式有所不同,但本质应该是一样的,将最后一次发送的源ip 192.168.1.2替换成web server的公网ip1.1.1.1就可以了。

original sourceoriginal destinationoriginal servicetranslated sourcetranslated destinationtranslated service
192.168.1.101.1.1.1http192.168.1.1192.168.1.2=original
192.168.1.2192.168.1.10http1.1.1.1=original=original

后记

对于nat协议,以前的印象就是解决地址匮乏问题,将内网ip转换为公用的公网ip,不过对于其实际在网络结构中的应用,以及配置如何生效是没有深刻理解的,现在来看nat协议可以修改数据帧中的src dest ip,以及协议类型,其实能做到很多功能强大的转发功能的。

文档信息

Search

    Table of Contents