NAT访问回流问题


最近又遇到一个需求,抽象出来就是一台内网服务器需要通过公网ip访问另一台内网服务器的公网映射,实现特定的业务。网上查了下,这种需求被称为nat回流。

一般有两种方式

  1. 通过域名访问,可以加host或者dns将域名解析为内网ip

  2. 通过ip访问,华为防火墙多配置一条域内源snat策略,把源地址转换为网关地址或者其他局域网路由可达的地址;H3C防火墙在内网接口再做一次nat server同时加域内源nat。

  3. H3C防火墙在内网接口配置nat hairpin enable就可以了

简单分析一下,假设一个简单的网络环境,内网用户ip:192.168.1.1 内网服务器ip:192.168.1.2,服务端口:https(443) 公网ip:100.1.1.1

内网用户通过snat将内网ip替换成100.1.1.1 来上外网,外面的用户通过nat server 100.1.1.1:443 —-> 192.168.1.2:443 来访问暴露在公网的内部服务。内部用户能上网了,外面人可以通过100.1.1.1 来访问内部服务了。那么问题来了,内网用户能通过100.1.1.1:443 来访问内部的服务吗?

结果很明显,不能。

那么为什么呢?

简单来说是因为TCP不能建立连接,内网用户192.168.1.1–> 100.1.1.1:443,在防火墙上nat server后,目的ip变成了192.168.1.2,由内部网络将tcp握手报文发给了192.168.1.2,1.2收到报文后回包,发现源ip是192.168.1.1,因为服务器和用户在同一网络,服务器之间走本地路由将报文发给了用户,这时候问题来了,用户是想和100.1.1.1来建立连接,但是结果是1.2给回的包,也就是来回路径不一致,TCP 握手没办法建立连接。