引言
最近在自家机房的服务器上要加一个硬件防火墙,做一些安全组的检查过滤,结果导致本身的web service不可用了,一番排查发现是nat loopback现象导致,以前只觉得nat只是解决了ip地址不足的一个简单协议,这次通过配置发现其实nat能通过直接修改数据帧的信息做到很多事情,这里就好好记录一下这个问题的原因以及如何解决的
nat hairpin / nat loopback
nat回环问题发生在同一个内网的client,通过公网ip访问内网中的另一个server时可能发生。相关资料可以查看 nat loopback说明 英文。
这里简单先模拟一个网络结构,然后基于此进行说明,图中gateway左边是公网,右边是内网。
情况一 公网访问web server
我们先看最基础的情况,外部client想要访问web server,访问流程会如下
- client1的源地址为2.2.2.2,访问web server的公网ip地址1.1.1.1
- 当数据请求来到网关时,网关会通过nat将数据包的目的地址1.1.1.1修改为内部的服务器地址192.168.1.2,同时源地址2.2.2.2保持不变,源目的的协议也保持不变
- web server收到请求后会响应,返回的数据包源地址为192.168.1.2,目的地址为2.2.2.2
- 网关收到请求后会通过nat将数据包的源地址修改为1.1.1.1,目的地址不变
- client1 2.2.2.2 收到数据包符合预期请求,连接建立完成。
情况二 内网通过公网访问web server
如果client2 192.168.1.10想要通过公网ip去访问web server的时候就会出现以下的流程
- client2的源地址为192.168.1.10,访问web server的公网ip地址1.1.1.1
- 当数据请求来到网关时,网关会通过nat将数据包的目的地址1.1.1.1修改为内部的服务器地址192.168.1.2,同时源地址192.168.1.10保持不变,源目的的协议也保持不变
- web server收到请求后会响应,返回的数据包源地址为192.168.1.2,目的地址为192.168.1.10
- 因为源地址和目的地址都在同一子网,这个时候web server可以不通过router进行数据传递,而是直接将请求返还给192.168.1.10,或者说网关没有相关配置时,直接通过内网将数据传递
- client2收到的返回,但是因为期待的返回ip是1.1.1.1,得到的确是192.168.1.2,所以数据包会被丢弃。
通过上面的情况说明也可以看到,问题就出现在如果在同一子网,想要通过外网ip访问另一子网的服务时候,因为源ip数据包发送和收到的不一致,会导致数据被丢弃,在实际的应用场景中就是无响应超时。
如何解决
在网关处增加配置就好了,根据不同的设置可能配置命令或形式有所不同,但本质应该是一样的,将最后一次发送的源ip 192.168.1.2替换成web server的公网ip1.1.1.1就可以了。
original source | original destination | original service | translated source | translated destination | translated service |
---|---|---|---|---|---|
192.168.1.10 | 1.1.1.1 | http | 192.168.1.1 | 192.168.1.2 | =original |
192.168.1.2 | 192.168.1.10 | http | 1.1.1.1 | =original | =original |
后记
对于nat协议,以前的印象就是解决地址匮乏问题,将内网ip转换为公用的公网ip,不过对于其实际在网络结构中的应用,以及配置如何生效是没有深刻理解的,现在来看nat协议可以修改数据帧中的src dest ip,以及协议类型,其实能做到很多功能强大的转发功能的。
文档信息
- 本文作者:Mikatsuki
- 本文链接:https://akitozz.github.io/2025/03/22/nat-loopback/
- 版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)