配置NAT回流导致外网解析到了内网IP

时间:2023-03-08 19:47:24
配置NAT回流导致外网解析到了内网IP

单位有3个域名,用量很大,2014年开始本人研究部署了Bind+DLZ +Mysql的三机智能多链路DNS,非常好用,优点是:

1、使用Mysql管理记录,配置、管理、查询方便。

2、自动判断运营商,返回指定IP,实现智能多链路。目前我们单位有电信、移动、教育网专线和固定IP,通过Bind的View,判断请求源IP自动返回对应运营商的服务IP。很好很强大也很实用。

3、根据配置自动为内网分配对应的运营商解析。。。我单位内网用户较多,有一个不少见的需求,内网部分用户要使用电信专线、部分用户要使用移动专线,然而走电信的就得用电信DNS解析、走移动就得用移动DNS解析,同样的,Bind的View也很好的解决了这个问题。

然而、、、、、今天突然让我崩溃了,有2、3个域名外网访问部分出错、打不开网页。我仔细研究,发现外网被解析成了内网IP。。。如下图:

配置NAT回流导致外网解析到了内网IP

这让我很头疼呀,仔细分析,把Bind从Dump缓存、Config文件、ACL文件全部翻了个遍,没发现问题。。。。。这个问题的状况是这样的:只有2、3个域名有这个问题,其它子域名(近几十个)都没问题。。。。

很奇葩,我都有点怀疑跟服务器有没有关系呀。。。。。

折腾2、3天没搞定,也没想通。。。今天晚上从路由器入手打算再走一遍,我手头有3个路由器,一行行看配置,终于找到点眉头,被解析错误的地址,我在其中一个路由器上做了NAT回流。。。

好吧,什么是NAT回流?这里简单讲讲,详细的大家上网搜吧,就是我做了nat server,比如: nat server protocol tcp global X.X.X.X any inside 192.168.200.57 any。这时外网用户通过X.X.X.X的公网IP、内网用户通过192.168.200.57的IP分别可以访问对应的服务,当然主要是用DNS了,但是如果我内网里有人用X.X.X.X的公网IP去访问呢?这时正常、默认的NAT配置是访问不了了,详细我也不说了,搜到这篇文章的兴许就是这个故障,这时就要做一个NAT回流,让路由器从内网过来的访问公网IP请求能够像在外网一样访问,这时配置NAT回流就可以,我是这样弄的(路由器是H3C的):

1、先搞个回流的ACL。。。我的故障就在这里了,一会说。

acl number 3010
 rule 5 permit ip source 172.16.0.0 0.0.255.255
 rule 6 permit ip source 172.17.0.0 0.0.255.255
 rule 7 permit ip source 172.21.0.0 0.0.255.255
 rule 8 permit ip source 172.22.0.0 0.0.255.255
 rule 15 permit ip source 192.168.0.0 0.0.255.255
 rule 100 deny ip

2、在内网接口上配置,注意是内网,而不是外网。

interface GigabitEthernet2/2/0
 port link-mode route
 nat outbound 3010
 nat server protocol icmp global X.X.X.X inside 192.168.200.57
 nat server protocol tcp global X.X.X.X any inside 192.168.200.57 any
 ip address 10.10.248.1 255.255.255.252

那为什么这个回流会导致外网解析到了内网IP呢???原因是我在做Acl的时候,当时只是为了测试一下这个200.57的业务内网用公网IP访问,就简单的内网IP都给Permit了,这个配置NAT回流是可以了,但由于没有匹配目标IP,导致所有包都能回流,导致内网的DNS回传给外网DNS服务器的响应包识别为是内网地址段来的,就丢了个内网IP给人家运营商服务器。。。把上面Acl改完善就OK了,完整的应该是这样:

rule 5 permit ip source 172.16.0.0 0.0.255.255 destination 192.168.200.57 0
 rule 6 permit ip source 172.17.0.0 0.0.255.255 destination 192.168.200.57 0
 rule 7 permit ip source 172.21.0.0 0.0.255.255 destination 192.168.200.57 0
 rule 8 permit ip source 172.22.0.0 0.0.255.255 destination 192.168.200.57 0
 rule 100 deny ip

也就是严格匹配内网地址段 to 内网需要NAT回流的服务器内网地址。。。这样对这台的NAT回流也正常(内网用它的公网IP也可以访问)、同时也不会出现BIND解析出错的问题。。。

当然如果你不提供像我的这个智能BIND解析服务,那你就像上面那个笼统的ACL也是可以的。。。我这是两个功能在一起就冲突了的。

2016-11-18补充:

后来发现,其实光ACL也没用,还是会这样呀。。。。。苦苦研究一个多月,最终在厂商工程师的帮助下解决了问题,原来是路由器的DNS-ALG在作怪,H3C路由器V5平台下ALG功能默认是开启的,而V7下默认是关闭了就没这问题。我的是V5,得手动关闭一下:系统视图下:undo alg dns

解决问题了。。。。OK,那么alg dns是什么鬼呢?来看看:

NAT ALG 功能,仅在要通过NAT 设备进行DNS、FTP、SIP 和RTSP 等应用(如DNS 服务器在公网中,需要在内网中使用域名访问位于内网的服务器时)时,需要配置NAT ALG 功能。使能ALG 功能可以使NAT 设备识别被封装在报文数据部分的IP 地址或端口信息,并根据动态形成的NAT 地址(或同时包括端口号)映射表项进行替换,使报文正常穿越NAT。

所以呢,nat server只在inbound生效,应该是报文从内网返回命中内敛口,出去了返回的是私网解析。。。

至此,该问题彻底解决。。。