最近又遇到一个需求,抽象出来就是一台内网服务器需要通过公网ip访问另一台内网服务器的公网映射,实现特定的业务。网上查了下,这种需求被称为nat回流。
一般有两种方式
通过域名访问,可以加host或者dns将域名解析为内网ip
通过ip访问,华为防火墙多配置一条域内源snat策略,把源地址转换为网关地址或者其他局域网路由可达的地址;
H3C防火墙在内网接口再做一次nat server同时加域内源nat。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 握手没办法建立连接。