往往我们在配置完路由器将内部成功访问到外部互联网以及外部互联网能访问成功所映射的服务器时,就认为已经配置完成。却忽略了仍然存在的一个重大问题:内部用户无法使用映射的公网IP来访问到内部服务器。每个厂家的路由器都会出现这个问题,可能是一种安全机制,或者是为了nat地址转换速度与稳定性吧!这只是猜测而已。
下面将通过实验来分析出现这种问题的原因。
实验拓扑:
实验配置:
实验各接口配置如上图,重点来看router1(简R1)配置,如下
R1#sh run
interface GigabitEthernet0/0
ip address 1.1.1.1 255.255.255.0
ip nat outside
duplex auto
speed auto
!
interface GigabitEthernet0/1
ip address 192.168.1.1 255.255.255.0
ip nat inside
duplex auto
speed auto
!
interface GigabitEthernet0/2
ip address 10.10.10.1 255.255.255.0
ip nat inside
duplex auto
speed auto
!
ip nat inside source list nat_list1 interface GigabitEthernet0/0 overload
ip nat inside source static tcp 10.10.10.10 80 1.1.1.1 8080
ip classless
ip route 0.0.0.0 0.0.0.0 1.1.1.254
!
ip access-list extended nat_list1
permit ip 192.168.1.0 0.0.0.255 any
permit ip 10.10.10.0 0.0.0.255 any
R1#
1)检测拓扑的连接
pc0:
server0:
以上两图说明内部成功访问外部公网。下面再测试服务器web的映射。
外部pc1访问1.1.1.1:8080就能实现访问服务器的内容,也表明映射成功。
内部pc0直接使用服务器IP:10.10.10.10:80访问服务器
表明访问成功。
内部pc0使用服务器所映射的公网1.1.1.1:8080访问服务器(问题要出现了!!!)
Server Reset Connection(服务器重置连接),表明此连接无法访问。再使用PC2访问1.1.1.1:8080也出现这种结果(图略)。为什么外部PC1都能访问1.1.1.1:8080成功,内部却无法访问呢???
2)全面分析内部无法使用服务器所映射的公网访问服务器的原因。
既然pc0无法访问服务器,先用Ping来测试链路
发现竟然是通的,擦,,,,在pc0上再反复用浏览器访问1.1.1.1:8080,但结果依然一样——无法访问。大多数人对此现况产生很大的疑惑。下面就来分析出现这种情况的原因。
2.1)我们知道外部要访问内部服务器在R1上必定会触发NAT映射机制。所以调出相关命令并结合模拟器抓包工具分析,在PC0上建立如下访问
得出结果:
R1#debug ip packet
Packet debugging is on
R1#debug ip nat
IP NAT debugging is on
R1#
R1#
IP: tableid=0, s=192.168.1.2 (GigabitEthernet0/1), d=1.1.1.1 (GigabitEthernet0/0), routed via RIB
IP: s=192.168.1.2 (GigabitEthernet0/1), d=1.1.1.1 (GigabitEthernet0/0), len 44, rcvd 3
IP: tableid=0, s=1.1.1.1 (local), d=192.168.1.2 (GigabitEthernet0/1), routed via RIB
IP: s=1.1.1.1 (local), d=192.168.1.2 (GigabitEthernet0/1), len 20, sending
R1#
根据路由器输出显示与PDU信息图,可以肯定的是路由器接收到的数据流没有触发NAT映射机制,数据流直接根据路由表做了转发。所以红圈中3个数据流完成了来回,也表明如果用ping测试的话会通的,即icmp成功来回。
那为什么明明已经成功将服务器web映射为1.1.1.1:8080了,内部pc0访问1.1.1.1:8080却无法触发nat映射机制来完成访问呢???经过对比R1接口g0/0与g0/1的配置,我们发现与nat相关的就是outside与inside的区别了,那么是不是路由器接收来自outside的数据流才会触发nat映射机制呢?我们暂且认为这种结论是正确的。下面再通过2个比较来判断得出的结论是否正确。
2.2)将R1的g0/1中ip nat inside去掉,R1(config-if)#no ip nat inside 。再使用2.1方法测试,得出的结果与2.1(接口配置inside)一样即无法触发nat完成访问。这里省略输出结果与图片。
2.3)在R1的g0/1上配置ip nat outside,R1(config-if)# ip nat outside 。再使用2.1方法测试,结果奇迹发生了,
R1#
%SYS-5-CONFIG_I: Configured from console by console
NAT: s=192.168.1.2, d=1.1.1.1->10.10.10.10 [36] \\表明当g0/0为outside口时,触发路由器中的nat映射机制。
IP: tableid=0, s=192.168.1.2 (GigabitEthernet0/1), d=10.10.10.10 (GigabitEthernet0/2), routed via RIB
IP: s=192.168.1.2 (GigabitEthernet0/1), d=10.10.10.10 (GigabitEthernet0/2), g=10.10.10.10, len 44, forward
IP: tableid=0, s=10.10.10.10 (GigabitEthernet0/2), d=192.168.1.2 (GigabitEthernet0/1), routed via RIB
IP: s=10.10.10.10 (GigabitEthernet0/2), d=192.168.1.2 (GigabitEthernet0/1), g=192.168.1.2, len 44, forward
NAT*: s=10.10.10.10->1.1.1.1, d=192.168.1.2 [13]
R1#
R1#sh ip nat tr
Pro Inside global Inside local Outside local Outside global
tcp 1.1.1.1:8080 10.10.10.10:80 --- ---
tcp 1.1.1.1:8080 10.10.10.10:80 192.168.1.2:22 192.168.1.2:22
R1#
路由器接收到g0/1的outside数据流,触发了nat机制,上图为地址转换过程
服务器接收到的数据流。
路由器收到服务器的回应包,由于是inside接收到数据流,路由器先根据路由表转发数据流到相应出口接口的缓存区,之后发现此出口上配置有outside(如果没有Outside,数据流将直接被转发出去),即数据包属于inside到outside的nat情况,所以查看nat转换列表,将地址做相关转换后,转发到pc0。到此pc0成功访问server0服务器web,如下图
2.4)通过2.1、2.2、2.3实验的比较与测试结果,最后可以得出这个正确的结论:路由器只对来自outside的数据流才会触发nat映射机制。明白了这个结论,再返回来看看g0/1为inside时数据流的来回过程,当路由器接收到inside数据流时,因没有触发nat映射机制,所以根据路由表将数据转发到相应接口(即g0/0)的缓存区中,但随后路由器发现目标地址就是自己,从而就不需要将数据流从outside口发送出去,也就不会再考虑做nat源地址转换了,最后路由器自己对pc0做了回应。
3)对于内部无法使用公网IP访问到服务器的解析各大论坛上也有不同的看法,他们认为:内部用户访问公网IP时,数据流到达出口时触发了nat映射机制然后做了NAT目标地址的转换,之后将转换后的数据流转发给内部服务器,服务器此时收到的数据流的源地址是内部地址,所以回应时,以内部地址作为目标地址直接发送给内部用户,而内部用户接收到此数据流时,因来回报文不一致所以直接丢弃。但是他们的这种解释是建立在H3C路由器上,由于本人没有对H3C做测试,是否真如他们所说,日后再做定论。也许每个厂家的设备的NAT机制都不一样,所以在遇到这类问题时,可以通过dubug类的命令自己眼见为实。
4)明白了内部无法使用映射的公网来访问内部服务器的原因,那么就找到解决这种问题的方法了。以下两种dns方法是在有域名的情况下才可以使用,如果没有域名直接访问1.1.1.1:8080还是不行的,所以这两种不是根本的解决方法。
4.1)方法一:
Router(config)#ip dns server (1)
Router(config)#ip domain-lookup (2)
Router(config)#ip name-server 8.8.8.8 114.114.114.114 (3)
Router(config)#ip host chiyuwei1766.cn 10.10.10.10 (4)
内部网络主机的DNS配置成192.168.1.1
(其实就是把思科路由器作为DNS服务器,作为转发器)
命令解释:
(1):启用路由器DNS服务功能
(2):启用DNS的外部查询功能,一般来说,该功能路由器缺省启用
(3):指定所查找的上级DNS服务器地址(根据本地情况确定,就是当本地无法解析此域名时,转交给外部dns解析。
(4):手工配置DNS本地条目,当访问chiyuwei1766时,dns将解析为10.10.10.10,从而内部主机的目标地址为10.10.10.10直接访问服务器了。
(5) :手工配置DNS本地条目,在(4)中是一个域名,而这里将地址当成域名使用。
注意:如果路由器负担较重,请另外建立一个内部DNS服务器。
由于思科2911不支持自身配置为dns服务器,所以另外建立一个dns服务器(方法二)
3.2)方法二:
添加一个dns服务器且地址为10.10.10.123,拓扑图就不画出来了,解析条目为chiyuwei1766 10.10.10.10。
之后将内部主机dns配置为10.10.10.123,并访问如下